From 3bc940063a4b8ebaaa2607ea0fa22f25c3e1a1be Mon Sep 17 00:00:00 2001 From: Thomas Bloor Date: Tue, 22 Jan 2019 21:00:20 +0000 Subject: [PATCH 001/122] Playing around with a seperate login page --- README.md | 4 ++ lib/login_page.dart | 125 ++++++++++++++++++++++++++++++++++++++++++++ lib/main.dart | 101 ++--------------------------------- 3 files changed, 133 insertions(+), 97 deletions(-) create mode 100644 lib/login_page.dart diff --git a/README.md b/README.md index 4ba1702..80f5397 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,7 @@ A few resources to get you started if this is your first Flutter project: For help getting started with Flutter, view our [online documentation](https://flutter.io/docs), which offers tutorials, samples, guidance on mobile development, and a full API reference. + +## Links and Things + +https://github.com/putraxor/flutter-login-ui \ No newline at end of file diff --git a/lib/login_page.dart b/lib/login_page.dart new file mode 100644 index 0000000..2518385 --- /dev/null +++ b/lib/login_page.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; + +class LoginPage extends StatefulWidget { + + @override + _LoginPageState createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + @override + Widget build(BuildContext context) { + + final email = TextFormField( + keyboardType: TextInputType.emailAddress, + autofocus: true, + decoration: InputDecoration( + hintText: 'Email', + ) + ); + + final password = TextFormField( + autofocus: false, + obscureText: true, + decoration: InputDecoration( + hintText: 'Password', + ) + ); + + return Scaffold( + body: Center( + child: ListView( + children: [ + email, + password + ] + ) + ) + ); + } +} + +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + // This call to setState tells the Flutter framework that something has + // changed in this State, which causes it to rerun the build method below + // so that the display can reflect the updated values. If we changed + // _counter without calling setState(), then the build method would not be + // called again, and so nothing would appear to happen. + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title + 'derpaderp'), + ), + body: Center( + // Center is a layout widget. It takes a single child and positions it + // in the middle of the parent. + child: Column( + // Column is also layout widget. It takes a list of children and + // arranges them vertically. By default, it sizes itself to fit its + // children horizontally, and tries to be as tall as its parent. + // + // Invoke "debug painting" (press "p" in the console, choose the + // "Toggle Debug Paint" action from the Flutter Inspector in Android + // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) + // to see the wireframe for each widget. + // + // Column has various properties to control how it sizes itself and + // how it positions its children. Here we use mainAxisAlignment to + // center the children vertically; the main axis here is the vertical + // axis because Columns are vertical (the cross axis would be + // horizontal). + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'You have pushed the button this many times:', + ), + Text( + '$_counter', + style: Theme.of(context).textTheme.display1, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: Icon(Icons.add), + ), // This trailing comma makes auto-formatting nicer for build methods. + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index bd5398b..2afc941 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:local_spend/login_page.dart'; void main() => runApp(MyApp()); @@ -7,105 +8,11 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Flutter Demo', + title: 'LocalSpend Tracker', theme: ThemeData( - // This is the theme of your application. - // - // Try running your application with "flutter run". You'll see the - // application has a blue toolbar. Then, without quitting the app, try - // changing the primarySwatch below to Colors.green and then invoke - // "hot reload" (press "r" in the console where you ran "flutter run", - // or simply save your changes to "hot reload" in a Flutter IDE). - // Notice that the counter didn't reset back to zero; the application - // is not restarted. - primarySwatch: Colors.grey, + primarySwatch: Colors.blueGrey, ), - home: MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Invoke "debug painting" (press "p" in the console, choose the - // "Toggle Debug Paint" action from the Flutter Inspector in Android - // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) - // to see the wireframe for each widget. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.display1, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. + home: LoginPage(), ); } } From 5c718fc14b9a5186136d3e1c1e884118df1fb9b2 Mon Sep 17 00:00:00 2001 From: Finn Date: Wed, 8 May 2019 19:54:14 +0100 Subject: [PATCH 002/122] Initial framework in place, non-functional POST & env vars atm --- .idea/codeStyles/Project.xml | 29 -- .idea/runConfigurations/main_dart.xml | 4 +- README.md | 8 +- .../apifunctions/request_login_api.dart | 50 +++ .../apifunctions/request_logout_api.dart | 31 ++ lib/common/functions/get_token.dart | 8 + lib/common/functions/save_current_login.dart | 30 ++ lib/common/functions/save_logout.dart | 10 + .../functions/show_dialog_single_button.dart | 25 ++ lib/common/platform/platform_scaffold.dart | 72 ++++ lib/common/widgets/basic_drawer.dart | 54 +++ lib/config.dart | 46 +++ lib/config.g.dart | 14 + lib/env/dev.dart | 6 + lib/env/dev.g.dart | 13 + lib/env/dev.json | 5 + lib/env/prod.dart | 6 + lib/env/prod.g.dart | 13 + lib/env/prod.json | 5 + lib/login_page.dart | 125 ------- lib/main.dart | 29 +- lib/main_dev.dart | 7 + lib/model/json/login_model.dart | 21 ++ lib/pages/home_page.dart | 49 +++ lib/pages/login_page.dart | 188 ++++++++++ lib/pages/receipt_page.dart | 187 ++++++++++ lib/pages/spash_screen.dart | 61 ++++ pubspec.lock | 331 +++++++++++++++++- pubspec.yaml | 6 + 29 files changed, 1263 insertions(+), 170 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml create mode 100644 lib/common/apifunctions/request_login_api.dart create mode 100644 lib/common/apifunctions/request_logout_api.dart create mode 100644 lib/common/functions/get_token.dart create mode 100644 lib/common/functions/save_current_login.dart create mode 100644 lib/common/functions/save_logout.dart create mode 100644 lib/common/functions/show_dialog_single_button.dart create mode 100644 lib/common/platform/platform_scaffold.dart create mode 100644 lib/common/widgets/basic_drawer.dart create mode 100644 lib/config.dart create mode 100644 lib/config.g.dart create mode 100644 lib/env/dev.dart create mode 100644 lib/env/dev.g.dart create mode 100644 lib/env/dev.json create mode 100644 lib/env/prod.dart create mode 100644 lib/env/prod.g.dart create mode 100644 lib/env/prod.json delete mode 100644 lib/login_page.dart create mode 100644 lib/main_dev.dart create mode 100644 lib/model/json/login_model.dart create mode 100644 lib/pages/home_page.dart create mode 100644 lib/pages/login_page.dart create mode 100644 lib/pages/receipt_page.dart create mode 100644 lib/pages/spash_screen.dart diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/main_dart.xml b/.idea/runConfigurations/main_dart.xml index aab7b5c..934fdfc 100644 --- a/.idea/runConfigurations/main_dart.xml +++ b/.idea/runConfigurations/main_dart.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/README.md b/README.md index 80f5397..f56480d 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,12 @@ For help getting started with Flutter, view our [online documentation](https://flutter.io/docs), which offers tutorials, samples, guidance on mobile development, and a full API reference. +## Environments + +To build an apk from dev, use: +flutter build apk -t lib/main_dev.dart + ## Links and Things -https://github.com/putraxor/flutter-login-ui \ No newline at end of file +https://github.com/putraxor/flutter-login-ui +https://github.com/pbirdsall/medium_splash_tokenauth \ No newline at end of file diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart new file mode 100644 index 0000000..2c3e566 --- /dev/null +++ b/lib/common/apifunctions/request_login_api.dart @@ -0,0 +1,50 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:local_spend/common/functions/save_current_login.dart'; +import 'package:local_spend/common/functions/show_dialog_single_button.dart'; +import 'package:local_spend/model/json/login_model.dart'; +import 'package:local_spend/config.dart'; +import 'package:flutter/foundation.dart'; + +Future requestLoginAPI( + BuildContext context, String email, String password) async { + //var apiUrl = ConfigWrapper.of(context).apiKey; + final url = "https://dev.peartrade.org/api/login"; + + Map body = { + 'email': email, + 'password': password, + }; + + debugPrint('$body'); + + final response = await http.post( + url, + body: body, + ); + + debugPrint(response.body); + + if (response.statusCode == 200) { + final responseJson = json.decode(response.body); + var user = new LoginModel.fromJson(responseJson); + + saveCurrentLogin(responseJson); + Navigator.of(context).pushReplacementNamed('/HomePage'); + + return LoginModel.fromJson(responseJson); + } else { + final responseJson = json.decode(response.body); + + saveCurrentLogin(responseJson); + showDialogSingleButton( + context, + "Unable to Login", + "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", + "OK"); + return null; + } +} diff --git a/lib/common/apifunctions/request_logout_api.dart b/lib/common/apifunctions/request_logout_api.dart new file mode 100644 index 0000000..2d5a141 --- /dev/null +++ b/lib/common/apifunctions/request_logout_api.dart @@ -0,0 +1,31 @@ +import 'dart:io'; +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:local_spend/common/functions/get_token.dart'; +import 'package:local_spend/common/functions/save_logout.dart'; +import 'package:local_spend/model/json/login_model.dart'; + +Future requestLogoutAPI(BuildContext context) async { + final url = "https://www.yoururl.com/logout"; + + var token; + + await getToken().then((result) { + token = result; + }); + + final response = await http.post( + url, + headers: {HttpHeaders.authorizationHeader: "Token $token"}, + ); + + if (response.statusCode == 200) { + saveLogout(); + return null; + } else { + saveLogout(); + return null; + } +} diff --git a/lib/common/functions/get_token.dart b/lib/common/functions/get_token.dart new file mode 100644 index 0000000..c502ade --- /dev/null +++ b/lib/common/functions/get_token.dart @@ -0,0 +1,8 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +getToken() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + + String getToken = await preferences.getString("LastToken"); + return getToken; +} diff --git a/lib/common/functions/save_current_login.dart b/lib/common/functions/save_current_login.dart new file mode 100644 index 0000000..91c6989 --- /dev/null +++ b/lib/common/functions/save_current_login.dart @@ -0,0 +1,30 @@ +import 'package:local_spend/model/json/login_model.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +saveCurrentLogin(Map responseJson) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + + var user; + if ((responseJson != null && responseJson.isNotEmpty)) { + user = LoginModel.fromJson(responseJson).userName; + } else { + user = ""; + } + var token = (responseJson != null && responseJson.isNotEmpty) + ? LoginModel.fromJson(responseJson).token + : ""; + var email = (responseJson != null && responseJson.isNotEmpty) + ? LoginModel.fromJson(responseJson).email + : ""; + var pk = (responseJson != null && responseJson.isNotEmpty) + ? LoginModel.fromJson(responseJson).userId + : 0; + + await preferences.setString( + 'LastUser', (user != null && user.length > 0) ? user : ""); + await preferences.setString( + 'LastToken', (token != null && token.length > 0) ? token : ""); + await preferences.setString( + 'LastEmail', (email != null && email.length > 0) ? email : ""); + await preferences.setInt('LastUserId', (pk != null && pk > 0) ? pk : 0); +} diff --git a/lib/common/functions/save_logout.dart b/lib/common/functions/save_logout.dart new file mode 100644 index 0000000..73779ea --- /dev/null +++ b/lib/common/functions/save_logout.dart @@ -0,0 +1,10 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +saveLogout() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + + await preferences.setString('LastUser', ""); + await preferences.setString('LastToken', ""); + await preferences.setString('LastEmail', ""); + await preferences.setInt('LastUserId', 0); +} diff --git a/lib/common/functions/show_dialog_single_button.dart b/lib/common/functions/show_dialog_single_button.dart new file mode 100644 index 0000000..b9d64e8 --- /dev/null +++ b/lib/common/functions/show_dialog_single_button.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +void showDialogSingleButton( + BuildContext context, String title, String message, String buttonLabel) { + // flutter defined function + showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text(title), + content: new Text(message), + actions: [ + // usually buttons at the bottom of the dialog + new FlatButton( + child: new Text(buttonLabel), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); +} diff --git a/lib/common/platform/platform_scaffold.dart b/lib/common/platform/platform_scaffold.dart new file mode 100644 index 0000000..0209aa6 --- /dev/null +++ b/lib/common/platform/platform_scaffold.dart @@ -0,0 +1,72 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class PlatformScaffold extends StatelessWidget { + final Key key; + final PreferredSizeWidget appBar; + final Widget body; + final Widget floatingActionButton; + final FloatingActionButtonLocation floatingActionButtonLocation; + final FloatingActionButtonAnimator floatingActionButtonAnimator; + final List persistentFooterButtons; + final Widget drawer; + final Widget endDrawer; + final Widget bottomNavigationBar; + final Color backgroundColor; + final bool resizeToAvoidBottomPadding; + final bool primary; + + PlatformScaffold( + {this.key, + this.appBar, + this.body, + this.floatingActionButton, + this.floatingActionButtonLocation, + this.floatingActionButtonAnimator, + this.persistentFooterButtons, + this.drawer, + this.endDrawer, + this.bottomNavigationBar, + this.backgroundColor, + this.resizeToAvoidBottomPadding: true, + this.primary: true}) + : assert(primary != null), + super(key: key); + + @override + Widget build(BuildContext context) { + return Platform.isIOS + ? Scaffold( + key: key, + appBar: appBar, + body: body, + floatingActionButton: floatingActionButton, + persistentFooterButtons: persistentFooterButtons, + floatingActionButtonLocation: floatingActionButtonLocation, + floatingActionButtonAnimator: floatingActionButtonAnimator, + drawer: endDrawer, + endDrawer: drawer, + bottomNavigationBar: bottomNavigationBar, + backgroundColor: backgroundColor, + resizeToAvoidBottomPadding: resizeToAvoidBottomPadding, + primary: primary, + ) + : Scaffold( + key: key, + appBar: appBar, + body: body, + floatingActionButton: floatingActionButton, + persistentFooterButtons: persistentFooterButtons, + floatingActionButtonLocation: floatingActionButtonLocation, + floatingActionButtonAnimator: floatingActionButtonAnimator, + drawer: drawer, + endDrawer: endDrawer, + bottomNavigationBar: bottomNavigationBar, + backgroundColor: backgroundColor, + resizeToAvoidBottomPadding: resizeToAvoidBottomPadding, + primary: primary, + ); + } +} diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart new file mode 100644 index 0000000..384f693 --- /dev/null +++ b/lib/common/widgets/basic_drawer.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_spend/common/apifunctions/request_logout_api.dart'; + +class BasicDrawer extends StatefulWidget { + @override + _BasicDrawerState createState() => _BasicDrawerState(); +} + +class _BasicDrawerState extends State { + @override + Widget build(BuildContext context) { + return Drawer( + child: Container( + padding: new EdgeInsets.all(32.0), + child: ListView( + children: [ + ListTile( + title: Text( + "Submit Receipt", + style: TextStyle(color: Colors.black, fontSize: 20.0), + ), + onTap: () { + requestLogoutAPI(context); + Navigator.of(context).pushNamed('/ReceiptPage'); + }, + ), + ListTile( + title: Text( + "About", + style: TextStyle(color: Colors.black, fontSize: 20.0), + ), + onTap: () { + SystemChannels.textInput.invokeMethod('TextInput.hide'); +// Here I have not implemented an actual about screen, but if you did you would navigate to it's route +// Navigator.of(context).pushReplacementNamed('/AboutScreen'); + }, + ), + ListTile( + title: Text( + "Logout", + style: TextStyle(color: Colors.black, fontSize: 20.0), + ), + onTap: () { + requestLogoutAPI(context); + Navigator.of(context).pushReplacementNamed('/LoginPage'); + }, + ), + ], + ), + ), + ); + } +} diff --git a/lib/config.dart b/lib/config.dart new file mode 100644 index 0000000..4e86245 --- /dev/null +++ b/lib/config.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'config.g.dart'; + +@JsonSerializable(createToJson: false) +class Config { + final String env; + final bool production; + final String apiKey; + + Config({this.env, this.production, this.apiKey}); + + factory Config.fromJson(Map json) => _$ConfigFromJson(json); +} + +class ConfigWrapper extends StatelessWidget { + ConfigWrapper({Key key, this.config, this.child}); + + @override + Widget build(BuildContext context) { + return new _InheritedConfig(config: this.config, child: this.child); + } + + static Config of(BuildContext context) { + final _InheritedConfig inheritedConfig = + context.inheritFromWidgetOfExactType(_InheritedConfig); + return inheritedConfig.config; + } + + final Config config; + final Widget child; +} + +class _InheritedConfig extends InheritedWidget { + const _InheritedConfig( + {Key key, @required this.config, @required Widget child}) + : assert(config != null), + assert(child != null), + super(key: key, child: child); + final Config config; + + @override + bool updateShouldNotify(_InheritedConfig oldWidget) => + config != oldWidget.config; +} \ No newline at end of file diff --git a/lib/config.g.dart b/lib/config.g.dart new file mode 100644 index 0000000..445b22e --- /dev/null +++ b/lib/config.g.dart @@ -0,0 +1,14 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'config.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Config _$ConfigFromJson(Map json) { + return Config( + env: json['env'] as String, + production: json['production'] as bool, + apiKey: json['apiKey'] as String); +} diff --git a/lib/env/dev.dart b/lib/env/dev.dart new file mode 100644 index 0000000..4a7ee00 --- /dev/null +++ b/lib/env/dev.dart @@ -0,0 +1,6 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'dev.g.dart'; + +@JsonLiteral('dev.json', asConst: true) +Map get config => _$configJsonLiteral; \ No newline at end of file diff --git a/lib/env/dev.g.dart b/lib/env/dev.g.dart new file mode 100644 index 0000000..ad6c7c4 --- /dev/null +++ b/lib/env/dev.g.dart @@ -0,0 +1,13 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'dev.dart'; + +// ************************************************************************** +// JsonLiteralGenerator +// ************************************************************************** + +const _$configJsonLiteral = { + 'env': 'DEV', + 'production': false, + 'apiUrl': 'https://dev.peartrade.org/api' +}; diff --git a/lib/env/dev.json b/lib/env/dev.json new file mode 100644 index 0000000..403630b --- /dev/null +++ b/lib/env/dev.json @@ -0,0 +1,5 @@ +{ + "env": "DEV", + "production": false, + "apiUrl": "https://dev.peartrade.org/api" +} \ No newline at end of file diff --git a/lib/env/prod.dart b/lib/env/prod.dart new file mode 100644 index 0000000..ac3dc8d --- /dev/null +++ b/lib/env/prod.dart @@ -0,0 +1,6 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'prod.g.dart'; + +@JsonLiteral('prod.json', asConst: true) +Map get config => _$configJsonLiteral; \ No newline at end of file diff --git a/lib/env/prod.g.dart b/lib/env/prod.g.dart new file mode 100644 index 0000000..46e18c7 --- /dev/null +++ b/lib/env/prod.g.dart @@ -0,0 +1,13 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'prod.dart'; + +// ************************************************************************** +// JsonLiteralGenerator +// ************************************************************************** + +const _$configJsonLiteral = { + 'env': 'PROD', + 'production': true, + 'apiUrl': 'https://www.peartrade.org/api' +}; diff --git a/lib/env/prod.json b/lib/env/prod.json new file mode 100644 index 0000000..ccdabad --- /dev/null +++ b/lib/env/prod.json @@ -0,0 +1,5 @@ +{ + "env": "PROD", + "production": true, + "apiUrl": "https://www.peartrade.org/api" +} \ No newline at end of file diff --git a/lib/login_page.dart b/lib/login_page.dart deleted file mode 100644 index 2518385..0000000 --- a/lib/login_page.dart +++ /dev/null @@ -1,125 +0,0 @@ -import 'package:flutter/material.dart'; - -class LoginPage extends StatefulWidget { - - @override - _LoginPageState createState() => _LoginPageState(); -} - -class _LoginPageState extends State { - @override - Widget build(BuildContext context) { - - final email = TextFormField( - keyboardType: TextInputType.emailAddress, - autofocus: true, - decoration: InputDecoration( - hintText: 'Email', - ) - ); - - final password = TextFormField( - autofocus: false, - obscureText: true, - decoration: InputDecoration( - hintText: 'Password', - ) - ); - - return Scaffold( - body: Center( - child: ListView( - children: [ - email, - password - ] - ) - ) - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title + 'derpaderp'), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Invoke "debug painting" (press "p" in the console, choose the - // "Toggle Debug Paint" action from the Flutter Inspector in Android - // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) - // to see the wireframe for each widget. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.display1, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 2afc941..1bf6840 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,18 +1,29 @@ import 'package:flutter/material.dart'; -import 'package:local_spend/login_page.dart'; +import 'package:local_spend/pages/home_page.dart'; +import 'package:local_spend/pages/login_page.dart'; +import 'package:local_spend/pages/receipt_page.dart'; +import 'package:local_spend/pages/spash_screen.dart'; +import 'package:local_spend/config.dart'; -void main() => runApp(MyApp()); +void main() { + runApp(MyApp()); +} class MyApp extends StatelessWidget { - // This widget is the root of your application. @override Widget build(BuildContext context) { - return MaterialApp( - title: 'LocalSpend Tracker', - theme: ThemeData( - primarySwatch: Colors.blueGrey, - ), - home: LoginPage(), + //var config = ConfigWrapper.of(context); + return new MaterialApp( + title: "Splash and Token Authentication", +// theme: new ThemeData( +// primarySwatch: config.production ? Colors.green : Colors.yellow, +// ), + routes: { + "/HomePage": (BuildContext context) => HomePage(), + "/LoginPage": (BuildContext context) => LoginPage(), + "/ReceiptPage": (BuildContext context) => ReceiptPage(), + }, + home: SplashScreen(), ); } } diff --git a/lib/main_dev.dart b/lib/main_dev.dart new file mode 100644 index 0000000..289940e --- /dev/null +++ b/lib/main_dev.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/config.dart'; +import 'package:local_spend/env/dev.dart'; +import 'package:local_spend/main.dart'; + +void main() => runApp( + new ConfigWrapper(config: Config.fromJson(config), child: new MyApp())); diff --git a/lib/model/json/login_model.dart b/lib/model/json/login_model.dart new file mode 100644 index 0000000..68ccc1f --- /dev/null +++ b/lib/model/json/login_model.dart @@ -0,0 +1,21 @@ +class LoginModel { + final String userName; + final String token; + final String email; + final int userId; + + LoginModel(this.userName, this.token, this.email, this.userId); + + LoginModel.fromJson(Map json) + : userName = json['name'], + token = json['token'], + email = json['email'], + userId = json['pk']; + + Map toJson() => { + 'name': userName, + 'token': token, + 'email': email, + 'pk': userId, + }; +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart new file mode 100644 index 0000000..a678e2a --- /dev/null +++ b/lib/pages/home_page.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:local_spend/common/widgets/basic_drawer.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class HomePage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + @override + void initState() { + super.initState(); + _saveCurrentRoute("/HomePage"); + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastScreenRoute', lastRoute); + } + + @override + Widget build(BuildContext context) { + return PlatformScaffold( + appBar: AppBar( + title: Text( + "Home Page", + style: TextStyle(color: Colors.black), + ), + backgroundColor: Colors.white, + iconTheme: IconThemeData(color: Colors.black), + elevation: Theme.of(context).platform == TargetPlatform.iOS ? 0.0 : 6.0, + ), + drawer: BasicDrawer(), + backgroundColor: Colors.white, + body: Container( + padding: EdgeInsets.all(32.0), + child: Center( + child: Column( + children: [ + Text('This is the Home page'), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart new file mode 100644 index 0000000..f3f848e --- /dev/null +++ b/lib/pages/login_page.dart @@ -0,0 +1,188 @@ +import 'dart:async'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_spend/common/apifunctions/request_login_api.dart'; +import 'package:local_spend/common/functions/show_dialog_single_button.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:local_spend/common/widgets/basic_drawer.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher.dart'; + +const URL = "https://flutter.io/"; + +class LoginPage extends StatefulWidget { + @override + State createState() { + return new LoginPageState(); + } +} + +class LoginPageState extends State { + final TextEditingController _emailController = TextEditingController(); + final TextEditingController _passwordController = TextEditingController(); + String _welcomeString = ""; + + Future launchURL(String url) async { + if (await canLaunch(url)) { + await launch(url, forceSafariVC: true, forceWebView: true); + } else { + showDialogSingleButton( + context, + "Unable to reach your website.", + "Currently unable to reach the website $URL. Please try again at a later time.", + "OK"); + } + } + + @override + void initState() { + super.initState(); + _saveCurrentRoute("/LoginPage"); + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastPageRoute', lastRoute); + } + + @override + Widget build(BuildContext context) { + var drawer = Drawer(); + return WillPopScope( + onWillPop: () { + if (Navigator.canPop(context)) { + Navigator.of(context).pushNamedAndRemoveUntil( + '/HomePage', (Route route) => false); + } else { + Navigator.of(context).pushReplacementNamed('/HomePage'); + } + }, + child: PlatformScaffold( + drawer: BasicDrawer(), + appBar: AppBar( + title: Text( + "LOGIN", + style: TextStyle( + fontSize: 30.0, + color: Colors.black, + ), + ), + centerTitle: true, + backgroundColor: Colors.white, + iconTheme: IconThemeData(color: Colors.black), + ), + backgroundColor: Colors.white, + body: Container( + child: Padding( + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: ListView( + children: [ + Container( + alignment: Alignment.topCenter, + child: Padding( + padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), + child: Text( + "Local Loop", + style: TextStyle(fontSize: 40.0, color: Colors.black), + ), + )), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 78.0), + child: RichText( + text: TextSpan( + children: [ + TextSpan( + text: + 'This is the logon page.', + style: new TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + TextSpan( + text: + ' It is currently in development.', + style: new TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + ], + ), + ), + ), + Text( + "Email", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _emailController, + decoration: InputDecoration( + hintText: "Use your login email", + ), + style: TextStyle( + fontSize: 18.0, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), + child: Text( + "Password", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _passwordController, + decoration: InputDecoration( + hintText: 'Your password, keep it secret, keep it safe.', + ), + obscureText: true, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + requestLoginAPI(context, _emailController.text, + _passwordController.text); + }, + child: Text("LOGIN", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.blue, + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart new file mode 100644 index 0000000..24df346 --- /dev/null +++ b/lib/pages/receipt_page.dart @@ -0,0 +1,187 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_spend/common/apifunctions/request_login_api.dart'; +import 'package:local_spend/common/functions/show_dialog_single_button.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:local_spend/common/widgets/basic_drawer.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher.dart'; + +const URL = "https://flutter.io/"; + +class ReceiptPage extends StatefulWidget { + @override + State createState() { + return new ReceiptPageState(); + } +} + +class ReceiptPageState extends State { + final TextEditingController _emailController = TextEditingController(); + final TextEditingController _passwordController = TextEditingController(); + String _welcomeString = ""; + + Future launchURL(String url) async { + if (await canLaunch(url)) { + await launch(url, forceSafariVC: true, forceWebView: true); + } else { + showDialogSingleButton( + context, + "Unable to reach your website.", + "Currently unable to reach the website $URL. Please try again at a later time.", + "OK"); + } + } + + @override + void initState() { + super.initState(); + _saveCurrentRoute("/LoginPage"); + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastPageRoute', lastRoute); + } + + @override + Widget build(BuildContext context) { + var drawer = Drawer(); + return WillPopScope( + onWillPop: () { + if (Navigator.canPop(context)) { + Navigator.of(context).pushNamedAndRemoveUntil( + '/HomePage', (Route route) => false); + } else { + Navigator.of(context).pushReplacementNamed('/HomePage'); + } + }, + child: PlatformScaffold( + drawer: BasicDrawer(), + appBar: AppBar( + title: Text( + "LOGIN", + style: TextStyle( + fontSize: 30.0, + color: Colors.black, + ), + ), + centerTitle: true, + backgroundColor: Colors.white, + iconTheme: IconThemeData(color: Colors.black), + ), + backgroundColor: Colors.white, + body: Container( + child: Padding( + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: ListView( + children: [ + Container( + alignment: Alignment.topCenter, + child: Padding( + padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), + child: Text( + "Local Loop", + style: TextStyle(fontSize: 40.0, color: Colors.black), + ), + )), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 78.0), + child: RichText( + text: TextSpan( + children: [ + TextSpan( + text: + 'This is the logon page.', + style: new TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + TextSpan( + text: + ' It is currently in development.', + style: new TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + ], + ), + ), + ), + Text( + "Email", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _emailController, + decoration: InputDecoration( + hintText: "Use your login email", + ), + style: TextStyle( + fontSize: 18.0, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), + child: Text( + "Password", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _passwordController, + decoration: InputDecoration( + hintText: 'Your password, keep it secret, keep it safe.', + ), + obscureText: true, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + requestLoginAPI(context, _emailController.text, + _passwordController.text); + }, + child: Text("LOGIN", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.blue, + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart new file mode 100644 index 0000000..8a27131 --- /dev/null +++ b/lib/pages/spash_screen.dart @@ -0,0 +1,61 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; + +class SplashScreen extends StatefulWidget { + @override + _SplashScreenState createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + final int splashDuration = 3; + + startTime() async { + return Timer(Duration(seconds: splashDuration), () { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + Navigator.of(context).pushReplacementNamed('/HomePage'); + }); + } + + @override + void initState() { + super.initState(); + startTime(); + } + + @override + Widget build(BuildContext context) { + var drawer = Drawer(); + + return PlatformScaffold( + drawer: drawer, + body: Container( + decoration: BoxDecoration(color: Colors.black), + child: Column( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration(color: Colors.black), + alignment: FractionalOffset(0.5, 0.3), + child: Text( + "Local Loop", + style: TextStyle(fontSize: 40.0, color: Colors.white), + ), + ), + ), + Container( + margin: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 30.0), + child: Text( + "© Copyright Statement 2018", + style: TextStyle( + fontSize: 16.0, + color: Colors.white, + ), + ), + ), + ], + ))); + } +} diff --git a/pubspec.lock b/pubspec.lock index 7eebb6b..ebf82ae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,20 @@ # Generated by pub # See https://www.dartlang.org/tools/pub/glossary#lockfile packages: + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "0.36.2" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.1" async: dependency: transitive description: @@ -15,6 +29,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.4" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.3" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.3" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.0" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "6.4.0" charcode: dependency: transitive description: @@ -22,6 +92,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.2" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" collection: dependency: transitive description: @@ -29,6 +106,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.14.11" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.0" cupertino_icons: dependency: "direct main" description: @@ -36,6 +134,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.2" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.7" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.9" flutter: dependency: "direct main" description: flutter @@ -46,6 +158,97 @@ packages: description: flutter source: sdk version: "0.0.0" + front_end: + dependency: transitive + description: + name: front_end + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.17" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.7" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.0+2" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.0+2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.3" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.1+1" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + kernel: + dependency: transitive + description: + name: kernel + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.17" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.3+2" matcher: dependency: transitive description: @@ -60,6 +263,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.6+2" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + package_resolver: + dependency: transitive + description: + name: package_resolver + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.10" path: dependency: transitive description: @@ -67,6 +291,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.2" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.2" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" quiver: dependency: transitive description: @@ -74,18 +326,46 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.3" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.5" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.4+2" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.4.1" + version: "1.5.4" stack_trace: dependency: transitive description: @@ -100,6 +380,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.8" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.16+1" string_scanner: dependency: transitive description: @@ -113,14 +400,21 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "0.2.2" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+1" typed_data: dependency: transitive description: @@ -128,6 +422,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.3" vector_math: dependency: transitive description: @@ -135,5 +436,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.8" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.7+10" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.12" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.15" sdks: - dart: ">=2.0.0 <3.0.0" + dart: ">=2.1.1 <3.0.0" + flutter: ">=0.1.4 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index f9339a5..eb5480f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,10 @@ environment: dependencies: flutter: sdk: flutter + shared_preferences: ^0.4.2 + url_launcher: ^3.0.3 + json_annotation : ^2.2.0 + http: ^0.12.0+2 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. @@ -23,6 +27,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + build_runner: ^1.1.3 + json_serializable: ^2.1.2 # For information on the generic Dart part of this file, see the From 3af4997c011ac63838e7087129c5a4cb8e129585 Mon Sep 17 00:00:00 2001 From: Finn Date: Thu, 9 May 2019 12:52:25 +0100 Subject: [PATCH 003/122] json encoded http submissions, login now works? --- lib/common/apifunctions/request_login_api.dart | 2 +- lib/pages/spash_screen.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 2c3e566..25c4926 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -23,7 +23,7 @@ Future requestLoginAPI( final response = await http.post( url, - body: body, + body: json.encode(body), ); debugPrint(response.body); diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index 8a27131..955e730 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -15,7 +15,7 @@ class _SplashScreenState extends State { startTime() async { return Timer(Duration(seconds: splashDuration), () { SystemChannels.textInput.invokeMethod('TextInput.hide'); - Navigator.of(context).pushReplacementNamed('/HomePage'); + Navigator.of(context).pushReplacementNamed('/LoginPage'); }); } From 075a57278f2538d46118a8407a23b07b72c3b0b1 Mon Sep 17 00:00:00 2001 From: Finn Date: Fri, 10 May 2019 12:43:45 +0100 Subject: [PATCH 004/122] added changes to login model and start of receipt --- README.md | 7 ++- .../apifunctions/request_login_api.dart | 5 +- .../apifunctions/submit_receipt_api.dart | 47 +++++++++++++++ lib/common/functions/save_current_login.dart | 10 +--- lib/common/functions/save_logout.dart | 1 - lib/common/widgets/basic_drawer.dart | 9 ++- lib/model/json/login_model.dart | 12 +--- lib/pages/receipt_page.dart | 57 ++++++------------- pubspec.lock | 52 ++++++++++------- pubspec.yaml | 1 + 10 files changed, 122 insertions(+), 79 deletions(-) create mode 100644 lib/common/apifunctions/submit_receipt_api.dart diff --git a/README.md b/README.md index f56480d..1076a1c 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,9 @@ flutter build apk -t lib/main_dev.dart ## Links and Things https://github.com/putraxor/flutter-login-ui -https://github.com/pbirdsall/medium_splash_tokenauth \ No newline at end of file +https://github.com/pbirdsall/medium_splash_tokenauth + +## How to debug code +// debug +import 'package:flutter/foundation.dart'; +debugPrint('$foo'); \ No newline at end of file diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 25c4926..36ae376 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -7,6 +7,7 @@ import 'package:local_spend/common/functions/save_current_login.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; import 'package:local_spend/config.dart'; +// debug import 'package:flutter/foundation.dart'; Future requestLoginAPI( @@ -32,14 +33,14 @@ Future requestLoginAPI( final responseJson = json.decode(response.body); var user = new LoginModel.fromJson(responseJson); - saveCurrentLogin(responseJson); + saveCurrentLogin(responseJson, body["email"]); Navigator.of(context).pushReplacementNamed('/HomePage'); return LoginModel.fromJson(responseJson); } else { final responseJson = json.decode(response.body); - saveCurrentLogin(responseJson); + saveCurrentLogin(responseJson, body["email"]); showDialogSingleButton( context, "Unable to Login", diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart new file mode 100644 index 0000000..92a13c8 --- /dev/null +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -0,0 +1,47 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:local_spend/common/functions/save_current_login.dart'; +import 'package:local_spend/common/functions/show_dialog_single_button.dart'; +import 'package:local_spend/model/json/login_model.dart'; +import 'package:local_spend/config.dart'; +// debug +import 'package:flutter/foundation.dart'; + +Future submitReceiptAPI( + BuildContext context, String amount, String time) async { + //var apiUrl = ConfigWrapper.of(context).apiKey; + final url = "https://dev.peartrade.org/api/login"; + + Map body = { + 'transaction_value': amount, + 'purchase_time': time, + }; + + debugPrint('$body'); + + final response = await http.post( + url, + body: json.encode(body), + ); + + debugPrint(response.body); + + if (response.statusCode == 200) { + final responseJson = json.decode(response.body); + + return LoginModel.fromJson(responseJson); + } else { + final responseJson = json.decode(response.body); + + + showDialogSingleButton( + context, + "Unable to Submit Receipt", + "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", + "OK"); + return null; + } +} diff --git a/lib/common/functions/save_current_login.dart b/lib/common/functions/save_current_login.dart index 91c6989..5800c10 100644 --- a/lib/common/functions/save_current_login.dart +++ b/lib/common/functions/save_current_login.dart @@ -1,7 +1,7 @@ import 'package:local_spend/model/json/login_model.dart'; import 'package:shared_preferences/shared_preferences.dart'; -saveCurrentLogin(Map responseJson) async { +saveCurrentLogin(Map responseJson, loginEmail) async { SharedPreferences preferences = await SharedPreferences.getInstance(); var user; @@ -13,12 +13,9 @@ saveCurrentLogin(Map responseJson) async { var token = (responseJson != null && responseJson.isNotEmpty) ? LoginModel.fromJson(responseJson).token : ""; - var email = (responseJson != null && responseJson.isNotEmpty) - ? LoginModel.fromJson(responseJson).email + var email = (loginEmail != null) + ? loginEmail : ""; - var pk = (responseJson != null && responseJson.isNotEmpty) - ? LoginModel.fromJson(responseJson).userId - : 0; await preferences.setString( 'LastUser', (user != null && user.length > 0) ? user : ""); @@ -26,5 +23,4 @@ saveCurrentLogin(Map responseJson) async { 'LastToken', (token != null && token.length > 0) ? token : ""); await preferences.setString( 'LastEmail', (email != null && email.length > 0) ? email : ""); - await preferences.setInt('LastUserId', (pk != null && pk > 0) ? pk : 0); } diff --git a/lib/common/functions/save_logout.dart b/lib/common/functions/save_logout.dart index 73779ea..ecd54fa 100644 --- a/lib/common/functions/save_logout.dart +++ b/lib/common/functions/save_logout.dart @@ -6,5 +6,4 @@ saveLogout() async { await preferences.setString('LastUser', ""); await preferences.setString('LastToken', ""); await preferences.setString('LastEmail', ""); - await preferences.setInt('LastUserId', 0); } diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart index 384f693..9852e7f 100644 --- a/lib/common/widgets/basic_drawer.dart +++ b/lib/common/widgets/basic_drawer.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; +import 'package:local_spend/common/functions/get_token.dart'; +// debug +import 'package:flutter/foundation.dart'; class BasicDrawer extends StatefulWidget { @override @@ -8,6 +11,9 @@ class BasicDrawer extends StatefulWidget { } class _BasicDrawerState extends State { + var token; + // TODO: add getter with getToken to check logged in + @override Widget build(BuildContext context) { return Drawer( @@ -21,9 +27,10 @@ class _BasicDrawerState extends State { style: TextStyle(color: Colors.black, fontSize: 20.0), ), onTap: () { - requestLogoutAPI(context); + debugPrint('$token'); Navigator.of(context).pushNamed('/ReceiptPage'); }, + // enabled: token != null && token.isNotEmpty, ), ListTile( title: Text( diff --git a/lib/model/json/login_model.dart b/lib/model/json/login_model.dart index 68ccc1f..f47a15d 100644 --- a/lib/model/json/login_model.dart +++ b/lib/model/json/login_model.dart @@ -1,21 +1,15 @@ class LoginModel { final String userName; final String token; - final String email; - final int userId; - LoginModel(this.userName, this.token, this.email, this.userId); + LoginModel(this.userName, this.token); LoginModel.fromJson(Map json) - : userName = json['name'], - token = json['token'], - email = json['email'], - userId = json['pk']; + : userName = json['display_name'], + token = json['session_key']; Map toJson() => { 'name': userName, 'token': token, - 'email': email, - 'pk': userId, }; } diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 24df346..cd9371e 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -2,12 +2,13 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:local_spend/common/apifunctions/request_login_api.dart'; +import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; const URL = "https://flutter.io/"; @@ -19,9 +20,12 @@ class ReceiptPage extends StatefulWidget { } class ReceiptPageState extends State { - final TextEditingController _emailController = TextEditingController(); - final TextEditingController _passwordController = TextEditingController(); - String _welcomeString = ""; + final TextEditingController _timeController = TextEditingController(); + final TextEditingController _amountController = TextEditingController(); + final TextEditingController _essentialController = TextEditingController(); + final TextEditingController _recurringController = TextEditingController(); + final TextEditingController _typeController = TextEditingController(); + final TextEditingController _orgController = TextEditingController(); Future launchURL(String url) async { if (await canLaunch(url)) { @@ -38,7 +42,7 @@ class ReceiptPageState extends State { @override void initState() { super.initState(); - _saveCurrentRoute("/LoginPage"); + _saveCurrentRoute("/ReceiptPageState"); } _saveCurrentRoute(String lastRoute) async { @@ -62,7 +66,7 @@ class ReceiptPageState extends State { drawer: BasicDrawer(), appBar: AppBar( title: Text( - "LOGIN", + "Submit Receipt", style: TextStyle( fontSize: 30.0, color: Colors.black, @@ -83,37 +87,12 @@ class ReceiptPageState extends State { child: Padding( padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), child: Text( - "Local Loop", - style: TextStyle(fontSize: 40.0, color: Colors.black), + "Required Fields in bold", + style: TextStyle(fontSize: 20.0, color: Colors.black), ), )), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 78.0), - child: RichText( - text: TextSpan( - children: [ - TextSpan( - text: - 'This is the logon page.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - TextSpan( - text: - ' It is currently in development.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - ], - ), - ), - ), Text( - "Email", + "Time of Transaction", style: TextStyle( fontSize: 18.0, color: Colors.black, @@ -123,7 +102,7 @@ class ReceiptPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), child: TextField( - controller: _emailController, + controller: _timeController, decoration: InputDecoration( hintText: "Use your login email", ), @@ -137,7 +116,7 @@ class ReceiptPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), child: Text( - "Password", + "Amount", style: TextStyle( fontSize: 18.0, color: Colors.black, @@ -148,7 +127,7 @@ class ReceiptPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), child: TextField( - controller: _passwordController, + controller: _amountController, decoration: InputDecoration( hintText: 'Your password, keep it secret, keep it safe.', ), @@ -167,8 +146,8 @@ class ReceiptPageState extends State { child: RaisedButton( onPressed: () { SystemChannels.textInput.invokeMethod('TextInput.hide'); - requestLoginAPI(context, _emailController.text, - _passwordController.text); + submitReceiptAPI(context, _amountController.text, + _timeController.text); }, child: Text("LOGIN", style: diff --git a/pubspec.lock b/pubspec.lock index ebf82ae..c04c54c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "0.36.2" + version: "0.36.3" args: dependency: transitive description: @@ -21,7 +21,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0" boolean_selector: dependency: transitive description: @@ -42,14 +42,14 @@ packages: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.4.0" build_daemon: dependency: transitive description: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "0.5.0" + version: "0.6.0" build_resolvers: dependency: transitive description: @@ -63,28 +63,28 @@ packages: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.3.3" + version: "1.4.0" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "3.0.3" + version: "3.0.5" built_collection: dependency: transitive description: name: built_collection url: "https://pub.dartlang.org" source: hosted - version: "4.2.0" + version: "4.2.1" built_value: dependency: transitive description: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "6.4.0" + version: "6.5.0" charcode: dependency: transitive description: @@ -141,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.7" + datetime_picker_formfield: + dependency: "direct main" + description: + name: datetime_picker_formfield + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.8" fixnum: dependency: transitive description: @@ -164,7 +171,7 @@ packages: name: front_end url: "https://pub.dartlang.org" source: hosted - version: "0.1.17" + version: "0.1.18" glob: dependency: transitive description: @@ -207,6 +214,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.3" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.8" io: dependency: transitive description: @@ -234,14 +248,14 @@ packages: name: json_serializable url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.2.2" kernel: dependency: transitive description: name: kernel url: "https://pub.dartlang.org" source: hosted - version: "0.3.17" + version: "0.3.18" logging: dependency: transitive description: @@ -255,7 +269,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.3+1" + version: "0.12.5" meta: dependency: transitive description: @@ -297,7 +311,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "1.5.0" pool: dependency: transitive description: @@ -325,7 +339,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.2" shared_preferences: dependency: "direct main" description: @@ -365,7 +379,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.4" + version: "1.5.5" stack_trace: dependency: transitive description: @@ -379,14 +393,14 @@ packages: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "1.6.8" + version: "2.0.0" stream_transform: dependency: transitive description: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "0.0.16+1" + version: "0.0.19" string_scanner: dependency: transitive description: @@ -407,7 +421,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.2" + version: "0.2.4" timing: dependency: transitive description: @@ -458,5 +472,5 @@ packages: source: hosted version: "2.1.15" sdks: - dart: ">=2.1.1 <3.0.0" + dart: ">=2.3.0-dev.0.1 <3.0.0" flutter: ">=0.1.4 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index eb5480f..e4f4376 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: url_launcher: ^3.0.3 json_annotation : ^2.2.0 http: ^0.12.0+2 + datetime_picker_formfield: ^0.1.8 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From fba0dd9ebc7ddf3ee897454e3a3ba1878a4c746f Mon Sep 17 00:00:00 2001 From: Finn Date: Fri, 10 May 2019 12:51:11 +0100 Subject: [PATCH 005/122] theme changes --- lib/common/apifunctions/submit_receipt_api.dart | 2 +- lib/main.dart | 6 +++--- lib/pages/home_page.dart | 2 -- lib/pages/login_page.dart | 2 -- lib/pages/receipt_page.dart | 2 -- 5 files changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 92a13c8..d3a67c0 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -36,7 +36,7 @@ Future submitReceiptAPI( } else { final responseJson = json.decode(response.body); - + showDialogSingleButton( context, "Unable to Submit Receipt", diff --git a/lib/main.dart b/lib/main.dart index 1bf6840..2ee7835 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,9 +15,9 @@ class MyApp extends StatelessWidget { //var config = ConfigWrapper.of(context); return new MaterialApp( title: "Splash and Token Authentication", -// theme: new ThemeData( -// primarySwatch: config.production ? Colors.green : Colors.yellow, -// ), + theme: new ThemeData( + primarySwatch: Colors.blueGrey, + ), routes: { "/HomePage": (BuildContext context) => HomePage(), "/LoginPage": (BuildContext context) => LoginPage(), diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index a678e2a..93ae53e 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -28,12 +28,10 @@ class _HomePageState extends State { "Home Page", style: TextStyle(color: Colors.black), ), - backgroundColor: Colors.white, iconTheme: IconThemeData(color: Colors.black), elevation: Theme.of(context).platform == TargetPlatform.iOS ? 0.0 : 6.0, ), drawer: BasicDrawer(), - backgroundColor: Colors.white, body: Container( padding: EdgeInsets.all(32.0), child: Center( diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index f3f848e..4a3abb2 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -70,10 +70,8 @@ class LoginPageState extends State { ), ), centerTitle: true, - backgroundColor: Colors.white, iconTheme: IconThemeData(color: Colors.black), ), - backgroundColor: Colors.white, body: Container( child: Padding( padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index cd9371e..c977d5b 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -73,10 +73,8 @@ class ReceiptPageState extends State { ), ), centerTitle: true, - backgroundColor: Colors.white, iconTheme: IconThemeData(color: Colors.black), ), - backgroundColor: Colors.white, body: Container( child: Padding( padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), From c15fdf1382e565c2cc205e93dcd5f4ec65998db3 Mon Sep 17 00:00:00 2001 From: Finn Date: Thu, 16 May 2019 17:04:08 +0100 Subject: [PATCH 006/122] added proper date and time picker --- lib/pages/login_page.dart | 4 ++-- lib/pages/receipt_page.dart | 27 ++++++++++++--------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 4a3abb2..0d0a249 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -128,7 +128,7 @@ class LoginPageState extends State { ), style: TextStyle( fontSize: 18.0, - color: Colors.grey, + color: Colors.grey[800], fontWeight: FontWeight.bold, ), ), @@ -154,7 +154,7 @@ class LoginPageState extends State { obscureText: true, style: TextStyle( fontSize: 18.0, - color: Colors.grey, + color: Colors.grey[800], fontWeight: FontWeight.bold, ), ), diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index c977d5b..8fd05ac 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -8,6 +8,7 @@ import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:intl/intl.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; const URL = "https://flutter.io/"; @@ -27,6 +28,8 @@ class ReceiptPageState extends State { final TextEditingController _typeController = TextEditingController(); final TextEditingController _orgController = TextEditingController(); + DateTime date; + Future launchURL(String url) async { if (await canLaunch(url)) { await launch(url, forceSafariVC: true, forceWebView: true); @@ -97,19 +100,13 @@ class ReceiptPageState extends State { fontWeight: FontWeight.bold, ), ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _timeController, - decoration: InputDecoration( - hintText: "Use your login email", - ), - style: TextStyle( - fontSize: 18.0, - color: Colors.grey, - fontWeight: FontWeight.bold, - ), - ), + DateTimePickerFormField( + inputType: InputType.both, + format: DateFormat("EEEE, MMMM d, yyyy 'at' h:mma"), + editable: true, + decoration: InputDecoration( + labelText: 'Date/Time of Transaction', hasFloatingPlaceholder: false), + onChanged: (dt) => setState(() => date = dt), ), Padding( padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), @@ -127,12 +124,12 @@ class ReceiptPageState extends State { child: TextField( controller: _amountController, decoration: InputDecoration( - hintText: 'Your password, keep it secret, keep it safe.', + hintText: 'Value in £', ), obscureText: true, style: TextStyle( fontSize: 18.0, - color: Colors.grey, + color: Colors.grey[800], fontWeight: FontWeight.bold, ), ), From a784e2da9cf3c3c0ffd0ed52f8ca377ea1f9d047 Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 21 May 2019 15:30:14 +0100 Subject: [PATCH 007/122] made changes to submit receipt --- lib/common/apifunctions/submit_receipt_api.dart | 7 +++++-- lib/pages/receipt_page.dart | 3 ++- pubspec.lock | 8 ++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index d3a67c0..70c56f1 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; -import 'package:local_spend/common/functions/save_current_login.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; import 'package:local_spend/config.dart'; @@ -13,11 +13,14 @@ import 'package:flutter/foundation.dart'; Future submitReceiptAPI( BuildContext context, String amount, String time) async { //var apiUrl = ConfigWrapper.of(context).apiKey; - final url = "https://dev.peartrade.org/api/login"; + final url = "https://dev.peartrade.org/api/upload"; + + SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { 'transaction_value': amount, 'purchase_time': time, + 'session_key': preferences.get('LastToken'), }; debugPrint('$body'); diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 8fd05ac..b316ca7 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -104,6 +104,7 @@ class ReceiptPageState extends State { inputType: InputType.both, format: DateFormat("EEEE, MMMM d, yyyy 'at' h:mma"), editable: true, + controller: _timeController, decoration: InputDecoration( labelText: 'Date/Time of Transaction', hasFloatingPlaceholder: false), onChanged: (dt) => setState(() => date = dt), @@ -144,7 +145,7 @@ class ReceiptPageState extends State { submitReceiptAPI(context, _amountController.text, _timeController.text); }, - child: Text("LOGIN", + child: Text("SUBMIT", style: TextStyle(color: Colors.white, fontSize: 22.0)), color: Colors.blue, diff --git a/pubspec.lock b/pubspec.lock index c04c54c..ea96797 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,7 +49,7 @@ packages: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "0.6.0" + version: "0.6.1" build_resolvers: dependency: transitive description: @@ -77,7 +77,7 @@ packages: name: built_collection url: "https://pub.dartlang.org" source: hosted - version: "4.2.1" + version: "4.2.2" built_value: dependency: transitive description: @@ -241,14 +241,14 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "2.3.0" json_serializable: dependency: "direct dev" description: name: json_serializable url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.3.0" kernel: dependency: transitive description: From eaa254e0e0cd7d257fe5651710c6f5c2fd60b1d9 Mon Sep 17 00:00:00 2001 From: Tom Slater Date: Fri, 24 May 2019 16:21:48 +0100 Subject: [PATCH 008/122] Updated the About page so it functions, formatted + information added --- lib/common/widgets/basic_drawer.dart | 3 +- lib/main.dart | 2 + lib/pages/about_screen.dart | 116 +++++++++++++++++++++++++++ pubspec.lock | 7 ++ pubspec.yaml | 1 + 5 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 lib/pages/about_screen.dart diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart index 9852e7f..7dba13c 100644 --- a/lib/common/widgets/basic_drawer.dart +++ b/lib/common/widgets/basic_drawer.dart @@ -39,8 +39,7 @@ class _BasicDrawerState extends State { ), onTap: () { SystemChannels.textInput.invokeMethod('TextInput.hide'); -// Here I have not implemented an actual about screen, but if you did you would navigate to it's route -// Navigator.of(context).pushReplacementNamed('/AboutScreen'); + Navigator.of(context).pushReplacementNamed('/AboutPage'); }, ), ListTile( diff --git a/lib/main.dart b/lib/main.dart index 2ee7835..e180def 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:local_spend/pages/home_page.dart'; import 'package:local_spend/pages/login_page.dart'; import 'package:local_spend/pages/receipt_page.dart'; import 'package:local_spend/pages/spash_screen.dart'; +import 'package:local_spend/pages/about_screen.dart'; import 'package:local_spend/config.dart'; void main() { @@ -22,6 +23,7 @@ class MyApp extends StatelessWidget { "/HomePage": (BuildContext context) => HomePage(), "/LoginPage": (BuildContext context) => LoginPage(), "/ReceiptPage": (BuildContext context) => ReceiptPage(), + "/AboutPage": (BuildContext context) => AboutPage(), }, home: SplashScreen(), ); diff --git a/lib/pages/about_screen.dart b/lib/pages/about_screen.dart new file mode 100644 index 0000000..443ee32 --- /dev/null +++ b/lib/pages/about_screen.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:local_spend/common/widgets/basic_drawer.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; + +class AboutPage extends StatefulWidget { + @override + _HomePageState createState() => _HomePageState(); +} + +class _HomePageState extends State { + @override + void initState() { + super.initState(); + _saveCurrentRoute("/AboutPage"); + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastScreenRoute', lastRoute); + } + + @override + Widget build(BuildContext context) { + return PlatformScaffold( + appBar: AppBar( + title: Text( + "About Page", + style: TextStyle( + fontSize: 30, + color: Colors.black), + ), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + elevation: Theme.of(context).platform == TargetPlatform.iOS ? 0.0 : 6.0, + ), + drawer: BasicDrawer(), + body: Container( + padding: EdgeInsets.all(32.0), + child: ListView( + children: [ + InkWell( + child: const Center(child: Text + ('Link to Pear trading website', + style: TextStyle( + fontSize: 20, + color: Colors.blue, + ), + ), + ), + onTap: () => launch('https://app.peartrade.org/#/login?returnUrl=%2Fdashboard') + ), + Padding( + padding: EdgeInsets.fromLTRB(0,20,0,0), + child: Text( + "Developed by Shadowcat Industries", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0,20,0,0), + child: Text( + "Pear tradings a commerce company designed to register andmonitor money circulating in the local economy.", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0,20,0,0), + child: Text( + "Email: Test@admin.com", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.0, + color: Colors.blue, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0,0,0,20), + child: Text( + "Phone: +44(0)1524 64544", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.0, + color: Colors.blue, + ), + ), + ), + + InkWell( + child: const Center(child: Text + ('Link to Shadowcat website', + style: TextStyle( + fontSize: 20, + color: Colors.blue, + ), + ), + ), + onTap: () => launch('https://shadow.cat/') + ), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index ea96797..7fae896 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -160,6 +160,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_linkify: + dependency: "direct main" + description: + name: flutter_linkify + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" flutter_test: dependency: "direct dev" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index e4f4376..056b22a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,6 +20,7 @@ dependencies: json_annotation : ^2.2.0 http: ^0.12.0+2 datetime_picker_formfield: ^0.1.8 + flutter_linkify: ^1.0.3 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From debf66ed1709e7464159fefb1a0c0f0b3f1db76c Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 3 Jul 2019 11:21:53 +0100 Subject: [PATCH 009/122] Login form made easier to use - instead of hiding the keyboard and then pressing the 'LOGIN' button a user can click 'done' on their keyboard in the password field and the login API function is called. --- .idea/codeStyles/Project.xml | 29 +++++++ ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Podfile | 69 ++++++++++++++++ ios/Podfile.lock | 28 +++++++ ios/Runner.xcodeproj/project.pbxproj | 80 +++++++++++++++++-- .../contents.xcworkspacedata | 3 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ .../xcshareddata/WorkspaceSettings.xcsettings | 8 ++ lib/pages/login_page.dart | 9 +++ 10 files changed, 230 insertions(+), 6 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..e8efba1 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..399e934 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..d077b08 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,69 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def parse_KV_file(file, separator='=') + file_abs_path = File.expand_path(file) + if !File.exists? file_abs_path + return []; + end + pods_ary = [] + skip_line_start_symbols = ["#", "/"] + File.foreach(file_abs_path) { |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + pods_ary.push({:name => podname, :path => podpath}); + else + puts "Invalid plugin specification: #{line}" + end + } + return pods_ary +end + +target 'Runner' do + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + + # Flutter Pods + generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') + if generated_xcode_build_settings.empty? + puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." + end + generated_xcode_build_settings.map { |p| + if p[:name] == 'FLUTTER_FRAMEWORK_DIR' + symlink = File.join('.symlinks', 'flutter') + File.symlink(File.dirname(p[:path]), symlink) + pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) + end + } + + # Plugin Pods + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.map { |p| + symlink = File.join('.symlinks', 'plugins', p[:name]) + File.symlink(p[:path], symlink) + pod p[:name], :path => File.join(symlink, 'ios') + } +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..f5bffe1 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,28 @@ +PODS: + - Flutter (1.0.0) + - shared_preferences (0.0.1): + - Flutter + - url_launcher (0.0.1): + - Flutter + +DEPENDENCIES: + - Flutter (from `.symlinks/flutter/ios`) + - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) + - url_launcher (from `.symlinks/plugins/url_launcher/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: ".symlinks/flutter/ios" + shared_preferences: + :path: ".symlinks/plugins/shared_preferences/ios" + url_launcher: + :path: ".symlinks/plugins/url_launcher/ios" + +SPEC CHECKSUMS: + Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a + shared_preferences: 1feebfa37bb57264736e16865e7ffae7fc99b523 + url_launcher: 0067ddb8f10d36786672aa0722a21717dba3a298 + +PODFILE CHECKSUM: aff02bfeed411c636180d6812254b2daeea14d09 + +COCOAPODS: 1.7.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 408648a..314c384 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,10 +8,10 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9548094CC0738B936AB604F6 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DB0D87E6339E9CE2E335662 /* libPods-Runner.a */; }; 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; @@ -38,11 +38,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0C47C2DEBD545D4054D9940A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 510C088F759CD31C97486879 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -55,6 +56,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9DB0D87E6339E9CE2E335662 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C40D35B4079C018C62D759E0 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -64,16 +67,35 @@ files = ( 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + 9548094CC0738B936AB604F6 /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 24EB461E21BAD0D319745BEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9DB0D87E6339E9CE2E335662 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 55C1C6FB63DDD235539F7C5D /* Pods */ = { + isa = PBXGroup; + children = ( + 510C088F759CD31C97486879 /* Pods-Runner.debug.xcconfig */, + 0C47C2DEBD545D4054D9940A /* Pods-Runner.release.xcconfig */, + C40D35B4079C018C62D759E0 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, @@ -90,7 +112,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + 55C1C6FB63DDD235539F7C5D /* Pods */, + 24EB461E21BAD0D319745BEA /* Frameworks */, ); sourceTree = ""; }; @@ -133,12 +156,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 8850D50C44B3BB3289D14523 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ACE3DC71CDB8FA5537935604 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -160,6 +185,7 @@ TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = G78D5X4L92; }; }; }; @@ -168,6 +194,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -190,7 +217,6 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -212,6 +238,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; + 8850D50C44B3BB3289D14523 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -226,6 +274,24 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + ACE3DC71CDB8FA5537935604 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -315,7 +381,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = S8QB4VV633; + DEVELOPMENT_TEAM = G78D5X4L92; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -441,6 +507,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = G78D5X4L92; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -464,6 +531,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = G78D5X4L92; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..949b678 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 0d0a249..628db37 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -157,6 +157,11 @@ class LoginPageState extends State { color: Colors.grey[800], fontWeight: FontWeight.bold, ), + onSubmitted: (_) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + requestLoginAPI(context, _emailController.text, + _passwordController.text); + }, ), ), Padding( @@ -168,6 +173,10 @@ class LoginPageState extends State { SystemChannels.textInput.invokeMethod('TextInput.hide'); requestLoginAPI(context, _emailController.text, _passwordController.text); +// showDialog( +// barrierDismissible: false, +// ); +// print("pressed"); }, child: Text("LOGIN", style: From 9071880b6cd53dd7f0f34555aeca8464197a6ebe Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 3 Jul 2019 12:41:51 +0100 Subject: [PATCH 010/122] Focus moves automatically to next field on login page --- lib/pages/login_page.dart | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 628db37..a357bf4 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -23,6 +23,7 @@ class LoginPageState extends State { final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); String _welcomeString = ""; + FocusNode focusNode; // added so focus can move automatically Future launchURL(String url) async { if (await canLaunch(url)) { @@ -40,6 +41,14 @@ class LoginPageState extends State { void initState() { super.initState(); _saveCurrentRoute("/LoginPage"); + + focusNode = FocusNode(); + } + + @override + void dispose() { + focusNode.dispose(); //disposes focus node when form disposed + super.dispose(); } _saveCurrentRoute(String lastRoute) async { @@ -131,6 +140,10 @@ class LoginPageState extends State { color: Colors.grey[800], fontWeight: FontWeight.bold, ), + onSubmitted: (_) { + //TODO: move focus to password field + FocusScope.of(context).requestFocus(focusNode); + }, ), ), Padding( @@ -148,6 +161,7 @@ class LoginPageState extends State { padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), child: TextField( controller: _passwordController, + focusNode: focusNode, decoration: InputDecoration( hintText: 'Your password, keep it secret, keep it safe.', ), From a6558a482d976e0ef21991ed44cd4bec8a88eb33 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 3 Jul 2019 12:45:56 +0100 Subject: [PATCH 011/122] Removed old TODO --- lib/pages/login_page.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index a357bf4..9518fdb 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -141,7 +141,6 @@ class LoginPageState extends State { fontWeight: FontWeight.bold, ), onSubmitted: (_) { - //TODO: move focus to password field FocusScope.of(context).requestFocus(focusNode); }, ), From cad91d5fd488ec6ead5496b78e5705dfbe964d62 Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 4 Jul 2019 16:57:29 +0100 Subject: [PATCH 012/122] Added launch icons, added 'home' button to side menu --- .idea/codeStyles/Project.xml | 29 --- .../main/res/drawable/launch_background.xml | 4 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 7032 bytes .../src/main/res/mipmap-ldpi/ic_launcher.png | Bin 0 -> 4377 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 5177 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 9052 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 13464 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 18319 bytes android/app/src/main/res/playstore-icon.png | Bin 0 -> 56130 bytes ios/Runner.xcodeproj/project.pbxproj | 11 +- .../AppIcon.appiconset/Contents.json | 244 +++++++++--------- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 3436 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 4645 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 6049 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 3954 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 5893 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 8223 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 4645 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 7631 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 11169 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 11169 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 17044 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 7347 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 14265 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 15709 bytes .../AppIcon.appiconset/ItunesArtwork@2x.png | Bin 0 -> 117327 bytes ios/Runner/Info.plist | 6 + lib/common/widgets/basic_drawer.dart | 9 + pubspec.lock | 26 +- 30 files changed, 165 insertions(+), 164 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml create mode 100644 android/app/src/main/res/mipmap-ldpi/ic_launcher.png create mode 100644 android/app/src/main/res/playstore-icon.png mode change 100644 => 100755 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 304732f..97f2d62 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -4,9 +4,9 @@ - + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..f9bbd0e808b08f05bf9d0b0d2179ede97be40fad 100644 GIT binary patch literal 7032 zcmV-;8;9hHP)4Tx0C=38mUmQC*A|D*y?1({%`g-xL+`x}AiX!K(nMjH8DJ;_4l^{dA)*2i zMMMM@L4qO%jD{kyB8r88V8I@cAfUux6j4!mGqP56<>kGXm){>}eQTe+_dRFteb%}F zki7l5ymVL!fHa~vAmcQ z7uoQ$&mudEnVrUCi&%W-40ak@%snFBnkD3j81WZzQ5KhzE#g}u)=U+qaYg)A9Gk{r zW&(gBiR}UoD@nwrA|~;}Lfk~W6aXA4@hgu1iUph;f%sBx=^43vZeo&vuFKM+o7vhj z=-!;{RE|Jk6vSkuF!^k{TY6dsla~v?;+;QBMqFFEsL0l4w$|20=Ei1U73#lk{!NK{ zyGXBsKlcox^?kAZm0x;20E}5tZFYRI#qR~6V>1Bq_rKUQ4+0=5>RbE3SNEZb=OsxX z$gndp$O~ z2}Gii1cZ;QLyD0~q#kKOx{zMvCNhFdBkxcc6a_^`8KLY^-l*j$7HTzW9jX*njXHvA zNA;j?qDE0Os847zS_y4{wnO`%BhiWIY;+O265WVyLtjGQMvtT4U@#aOMh9bq@y0}9 zk}+#ArI`JgR?K_yPPlex4vr&>=Vw!U)NPjf5&f z3*i#sA>kE~NK_}<5`&3c;s#Leh59VbXchJ<=;OnXFBA zCP$M6>atgt3H=1Y2UgM2$qd#E`@bNxY<%q>JP#$vnwQ$&-=;lG9Rn zDQzh?DW=pqsT!$MQo~ZS(iCYk=|Jf;=~C&V(pRM?Ww0{ZG9EH)nL?REG8bjWC@3{{8fLrtcZP`{)0Q)gslWG!XGWpiX}WY5Ts&=8t7&4-psE2EvD z-J!jgQfv(`8kfN|tp+n)3B1%zTF<3EM z@qpqb#pxx~CH6~LONy7ASaM$pR?=4rQCg#PNU2Y0R#`>aOF2V%ukuCZX%(7^vr4i` zh00l#DOHN9qbgUmLiL>LGrBC@g`P^UqW92e)Rfe`)r4wwYW-^S>N@Jn)eF>H)gNgP zG#DBQ8WkGd8Z(-zngN>mn$4Q`weVUDtt72ITD@9x+B(`1+FP_cv?q1sb$oR4beeS@ z>XLPxbXV)v>)z7C=rQzC^!DrB(1-P{^po^!^al)J18W1W!G425L$sl-Ayeeqo|%5^b{6q}Sw=sg-G}X@ltlGZ`~qvjVd&v)|42%~|F( z=C>@!7M>RCEjle;S{hh#EDu=TwW3%BSZ%TDw)$voW6ig2v7WNgw28CXXEV&8GJ+VT zj4QTiTUXolwx@01*;(5O>`vJIW^ZJlVt>?ra;eTz&eDdZV-D&LOouv$5l6aXoZ~^q z5hpb#rc=Gs6K4%)wsWKNgo~a_vdb}-7p|tReAhPDIX64EwQlF#5qB^5V)uRz8IR>2 z)gF&M)jbnEn>}Z|ti0BEo%cq2`+4v59`;f8Vfi%q%=p^)uJ!HlBl(5;Rr@{h*Z1f9 zcLl%!z5%-e9xl^b##`1A2m*ZqcLhEQ(g|7}^kXn4I4HO#_-Tk)NPb9fC?zyD^l0dt zFxRlMum{U^mkXD7hf9XXgg1rHMYu zc#Ks{QOuo{IxBNlUR|ZQDs|PFSjkvs?8!KETtwW_xDU)gW<7H@-Y0%v{0z&DwTJbb z?aZ!VPjMVL<(!EGhlKKk$wY_5U5QgkPDzzX(_A-hHTPw*cXDm=TuNZd;gp5ch}70J zTv}Y(DV_{3h1Zj=lAe=3m|>7nlrgf}ZuRcfGkiaOVz}3Y2Bx^Z`;1P{p|fi z2b>SI)GF7O)V@E+J$SdytFFCXyT0-e=1|t5rw!o^z27pvZE93(ENT3Bn0I*ONXU_% zCYz?Fqe@51n&D<)^VG4JV>iBY|E{yesHLuz)>?8L92Xvc_I=#J{_+2=_${t8_!le8-Jehe15v28 zmBOpTuPtA9&j!stev|fQey;ef!rLS781H)DN4%ey&;Ee@Q1wyoW7j9YPY)N;78d>m z1DNytxvX;;000pKNklRrNfJT`{zjk+fe;``AR!?zKFgAXB#mxN z>2HA`T?iyeVmJ{_W@X~u{cy8wj0M=KP^3lpE6lJ7c^8Qd%YW$5eCyRz=3D$b;@P zNlTUxQ?dWGu8r!(PQHD|!pllgN}2hHs?pXHz!#44{@L^FuJ53!%TGbNllyL(!40Ja zL{yDUhZ^yPqNut~Ow);}8oB_d&BBB%7qg3Vn4IIrRKq3-ifrhw6|;)jR@Xv%Ux4CF z*RYl?B_v41e}rNxPrgyZ8;6^?p{#(Lrx!6L*F#Z!5y5B-hs{Ec%Yn;o!D>;EfS9J^ z4@WuIALMjrKMme~G+nT0N8!6R8{{$!MM@9^21({( z|MRUH_BWj4$DdxpoC!Guqbg3TGOVr`il#0f+w0nB?H%COSrfQrMlo<Z~0t*fFEr- zK({~4x9_ZCK}kN4{f-lZ3iB3(ICxnwNgzx*=(f588ss=6vVLHrjdzxNG55EV6`EQBvEA4F}WuND}zN zQ8w(VV^4iMW%(Jbo?F7A(t=@i$feMDzMms4U96lv3Ae+RFcL$N@&uVkmZtttgm;df zWnV)Ffk=$P3>PztvY3{iNsilz$7#c9RZwI@q3gOp)pS%{AQ0Fr3U0fVzF>r7t=&{i z&c$;HlEw`|aIxYA!<%mE@^h@Uiw18W9)}HCl89+K4y%IAqL5~@lI?bopY9~f^arO*=|3fsEWg8;gOY< zl;oygQGzU@YS=AG;K?@7=#Ck1rG@5>qM7&)~C5W-&3_V+6RVMvxg~4kbm^ zbq<{F;N^p-scGz_Ak)SAMbo&wvJ|(&HfW6gV1(Cd8u-Mb>7>~$gQO@FRoQ;LgCqI2(u6!r3k#zu$A5Lrq@3|H-9%WX|NVB}iQK$Au5(SIJNRpz6cv&OY9$ zZD#Y4M$Y>~EGjGDGdIp+X*_fQ&~zP1lIZ9iAlvQ4X|vEh5JJ-h`RQqdV=66OerlRJ zX*%D}q?~ltR!$+u?F8UlUjS9tnV9VX;F}w^vA>~%pMCze4vb~q>$6N3PBiJko(~GjWb3qx3EK`53m#wwU^adk@qbl74Vb1%4RF>pnvnm85 zG4|HCk6wawgPCE|mYOcmbUpt2!rxIcRf)}kmf#aV8q z7GyFx$78qyKy#Om7j_=w?Zb^s&Q0fspILV01P#sQhN3DBoqe2a@8)!8A052|^aR2L zBQc_?o*+dRBI$ShJ6(VTc8fwrnw<&R9?FZeSx{QQyh(Xvq}d0NElC#>lT45#Np$oL z@YC0;=?_MTX*!uMJ5^H(xnp4&Ic_I0O}{9)W@Z~r(|)$gN2be8y3;;#f{Z~f=!o|k zJK21=kzFTSIoB63l2zGmCT4pm$Z(P6cHp+#uv-le>J)eN0AH0Vt(3?xV& z2|>vTr5$xGY}`}F-ugBaS!Q|pB-T}yQdyEuL56Dt%NS;X@dP`JzFcfBXK1v4xY^5h z{;-|9mz49sih0BONXf!5EJ4Yshcn(jp4oDU%}1JWSQXaIFXQf;W-)tW?nQ%-L?)%g zj|)|ZQI^k#ox5p7EV4{PXCGhq#q0d?;dRWJl>6bT8p&4amFiRc;_VtbdIwlBXEJ}c zdI57M<;AZP7rE!D2u;^fWSOr$w;7Ma#uN9g7*TEP1I>Kg`9ui8&t9+Q54(&Z(`<9nZ6 z%8EH9iGXo5of6j*62{96hNDDdDw?iiQRGXeIZO;9NN^!q{_%^u*i>ClL8gl*?pwja zvciOzUR`Z5_AqxuOw&2i>?PafNW^59Tgf1Yz)Vd(yX6qC9ympo%gzt)SqxEJ^(8okN^x>!u=}w$=2@Ta$zYndI!OYvK8Ahp{R$-~8x}+&H}$RnrGW z!Q%y{Ut^JFHts&o3-8vF<#Mogei<;bHW-UBka2NeAk0&*?I#?KanH@Oxoh$C#9ke5 zFnu=(cxH1A8@3-IrfRHPFqMju{1NNXI6;QFdv4odPM_;xW^oQ*yM1xO2O3XEu3~ig zgZ%qTd)RUOELKHkVoo~Wxbp@>AVxTzMURuy=4!fUOt(X6{Q#Dep4Oh%Z$V{ ze*RW9f7*Qvr_~BVrywJpC%?FgX@yxMZk#e<#y0J5a#CcNqqmFTgmY_N3|m?0Ph}crmfpY`J`Nyl^eY`SHkl3 zgt_Sbr`q`5@3%1!j*^~c!xs$m;Hvq2b=@K)NgDNzun1shT{Ehtv3OcBPMdYy=pJ*? zdr!9V=<{!*$TAjLMhJNP^D9|ZSr!jiM{jH_?LB@@wRPjPS*V&?eEB<41ZJmdv$v1$ zzVHr;B%$d#nJx!EePAu+6LS-u|A&Fx-tEH|jNr6cDUK(t$BSi`fSZs9MW~uu%*u*VG+kU(&tJ|+ zbAT}76{}*FUQ<_w^tklAytj_yXT3OW7Bp4x@an2DN!ZEx8EIG*8BNm?Nw8FfVU3KK z@i$v*NO#!ikNY||&YU?L$r1IuqsA} z#=~nD85fMfwB@`E7gLL}>GB0=@9`VYNkM*0>1guy@uwZNWV#&m4g^^>zl?cP3NT~J zs|^`o+3XSmp$PAv=>Xzw{i%ldlz#r&zPO|d((G2gyl(NB&Q=CkHGe8aSspgm)T8No z%B488c!0U%XcJow)f>{|53zp9Y)T8V5c=4qWn^6!6lA)&_tpybpJ-v%v1X*WSDFei zlX<~Nl&4qGJ?2PcECwkH5HEQd3X1$B91}W=3%?U%P8*Jg0nZ=5kT#*(7Og)eNRj$mLgW z9w4TwESWt8iLtM8m^HYK+Yj^0H}{k6b`VolbRqcH&#lDmw4v()=^8Qgff~*rNl;dp z%@YrUjP`}AjBl+)jh{}{Eu7lIBiIhM2|nn*FV0Ls_7F9KkXW3J1=Phl(^ys zC@adLKM*#$I>taBiFkXSMUi=NXD$Es+s!!bHY|!lSN{N?SUQIX)-Jv(8Nw^Yuun73 zc;;oecx~Ttj-2U0k*}_0GkOn=TGq3#@8huzZ{x68uqiU#{R7-oKAFevUvu3$N-q04 zB*1R9aPNxwJhtI&_SQ8gEZc`s+#=r0smK!kP=xRN`VF3X>0R7T8&-=%m(S1qX+=E! z$j5QmEQ6XXuO&v*qi7b}_Md3xD^I=1Ki|8OdsfT`NW^XNF(lYHTVBts!#C9(=W1q**v~=_iYsA7zf+*_)((^ zCjiX_UFZ``CbFa3$FJVp$4fhp0N_b;5C}(z#8f`FvWjot^ARkHeBGP1uBcDiBx&2B zdj9^u{tuVa#zVK?$S0P~qbNK5@&f>k9o@XVtCm-HAH~}@K$gde5YX!nG9fR6?|gP8 zs}~uEc!xWUe64WBjpQatCtJLH_kZ7D_pwGw3v*aeIhCbzOPMh-kGxDb4x1Gr1c6Y5 z_8uQc8#~x@w27M2t@r|AJWe~3EYTkbgDvIk~lBD)+Bh zL`B))bM2{u4|P_<)D67@AvPa8!PfUqalH8)-M%2vm>TaplCi`)>@A8yy34`T;#`)^ zD`Vxt8I%@g8{@@~8eH!!H54D}IF!+>G}w9b_WEf&*F%f9m;OK)E$$s>dD57emq|%s z7WtW;#PydtoRTWID(A&a(>+piZ?qDd=Ot2;7!z0hK%Gfe(!cXD9uz-&km?=zL-GHQ W(66I6SoBr^0000P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7c4b3d395d5b971c7b47a1fb4a8c89545e6aaada GIT binary patch literal 4377 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

Nd8$vf@zknC zfay-!1O=^(`t|eg@8;cIM@da|@bm*qS-ohMdHpiR16cNdVoNcXsW_VPgh*_ju&FVxwX2UeJ7epb30gj`@HL#Q%!R_Su%SH z8}`;lqkeoC#15n0-~g|Eyq|DH=kEE_nVFYqy45whuqq||_}+33)U|NZ(}kw0W~n#E zhzYb;Hh;nCwsYjBxq1AKTTJD79pR@+Dap%7=Bd>cJo9EHx*NRw<_a(__3fMq$vzLeSUuX?hXdR z5lRbkShH+yG;ps^G^zlas$vMqkM1dF!HgSub@LYlLgDM)g_w#Qi0J(4Ut8$#^^)kY z@ywcK@qB;1$$LmqAIs6F+t1PC4^dW>JES{tRmMl}GlbyDe{5!F&1noF`1P9QJh;3x z?pD`}Av44tSdg7gqSHpF&maHoYG4R~sw(t{BmDf;kJx$m6uNG3e?`fd8b6GHNy2oe zoU|m?Z~u~pj&o?Lif)L@x|AVgRF11Oo%QkfU*BVAO+67^XJuI-&posPAtm=MF5x$i+<`^YMto5> z<^*Dfs*1u_o-UqvaRVjOvia%iB}~am8*!qDVX&{Zk@efE*<0IyZU{1x5_#g=6+F1S z47f6VKV}5rLLmD3f;{ua$9!JfKxttf6(#xPPfEvT)$sN8Q`d5q{U;hZ*3dyH93eB= z#nQP2JaOL=3Ubm%{eOsYB>+QT5A8eN$lH}wRMj=p?GK{s2D%Waib|@>$+Vnw%4bjI z?(*5(G|eoK#xh{9i2w}mQU^j|nmW7j_5?5tL4w0ZR;ruajAX19^Y!USP2BOoRlVSd nX{6E41w#lFlxsRWt_A-G_bnH2zmfP+00000NkvXXu0mjfI35`8 literal 442 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 O0000)^*na literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..8331d35f9b5110e954fb98d658bf5a94cccb6eec 100644 GIT binary patch literal 13464 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 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..3f5340334c3bd3bec4c304b6b03052b4c9f763a6 100644 GIT binary patch literal 18319 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 P00000NkvXXu0mjfOm+0G literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/android/app/src/main/res/playstore-icon.png b/android/app/src/main/res/playstore-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0475aeaf72d43c7fae9df3d29ccbc354490e605 GIT binary patch literal 56130 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

d@cb{tDK#x?(8!|qj&Ci?iw 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 28c6bf03016f6c994b70f38d1b7346e5831b531f..5ee49dab13ad463d7d09792712fb5635a65d173b 100644 GIT binary patch delta 3434 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 M07*qoM6N<$f(sb4iU0rr delta 1004 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 bA?yGDB61#~4-zD^00000NkvXXu0mjfUQvY7 literal 1716 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 RBgp^&002ovPDHLkV1iov0BryO delta 1906 zcmV-&2aWijK!6XBBYy`+Nkl^fDmF(5(5$|?Cx}D zKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q?YG}tx;sY@GzV#^0C$Z`m}blr)&(OPMHT6T@%AxHOWYGG zm>@=0?<)?0r0XK9>leRXyD^j4O4bXT!@LESVI<~>`yB+S2b_f__vvyMHkwGyyXedq3usx&X*}E{O;}+nJ#G_xm zJbQX5 zuFrVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~ ztSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Yuz!}~S^-;|MX;9Py1im8!}VY-!u4P+ z!nLEvx?+Rogo+Kw9OBXy&lGIvJ51_7Hl6Q>*MAJa!lMDGGML530`Te&0ciU({DC7` z;RKg{uC>($*mdXnVQQBjiVyqYC7mf!Z%e-Q!?Oo{ufu`G3CAC=UjiTpU<94UTFz2KEDuNS@KKkg)K8!v1L8RUP$_! z({LG$Dy&JLEVpiNVe^G(HCbA*SpsX?292)#=JVQDUMp-cOJPl`+yTHTD!AOit-zAD zptXYa!q%OVLa^mo25b7^Z>kE`3rqgr-G4i;Lw<+P(8khESW8aaBmxfY`WS#6j<92Q z-++&Y z$gbH4#2sT0cU0SdFs=*W*4hKGpuR1QGacHFy;`# zR&NJkbTNp}Ee5f08HmLzK%D(q3@lH;Tzx$?VT;&xJq-KyHV__o3dD)?KrE<6*iXV0 z8;6<{IKw@dyDwJ90H5^3h;|9?twz{UGr|>1Pzhdn6W(r0ifeZd=JI+AAz<~yL(QJk zAWW))+=`8mGj|J!70oF@d4B;WxB=jBM1bWWRBb&1!ie3BUzOdm}yC-xA%SY``k$rbfk;CHqifhU*jfGM@DkYCec zD9&E@F9*za0?~OQZiDE|Cf;;0 z`uZ%H=IeGyG^H0ruev{yIVARgwZUG)j7>F#3~dh+8DOtPByR=(VDhz2enf#EjcXCI z=NUPYr4@S)GhX!?s(0Eh(nGe!y$#$r1B$||I~`wPhUuCQEo;#Xb$EXk=6HgBBRd#c ziK|jN$e~{zV~|;*E@Ij-Z(+tI^B8RW51ptE!nMnPyZ`_I07*qoM6N<$f^pW2Hvj+t diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..6f8b2f77536a3ba4dbe8d7e29890c3e5fd130f04 100644 GIT binary patch literal 4645 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

ezZaDQ~vGy zJ8AFsV$y5r^@UhoUc|zZf~04@*bvok>1#L4#bVU+`lnSyV)29&Ui8mDFGz`0Y|rsi zyuJMhcC&#%EHEH@mD@$Y}wh|3eepwkkL#7MUodF-yG$)NgD6#%;K@IK$iCw(*i3q4S;iL(^XQtT)m5y{L>Vn|aU&*o-t%+j5`#`zQSA!#!kL&C0_lJV9<>GLxS?xN^kG^XG%J zcBrOqpsBM5jYdOmrggvvJd89_pX>6%n_GEl<1RANOaS;p5vJrj_|x~lgvp>&&TuYM z`gzu`O=<2{0#}_@OI2N4vP1o1snuFeif_eB}m!5wkz3EyKr8IeFrh^;Ffjk&$Kw zWWv!nvMlq$w{K(Ftm4aR_fj#eIS~W_Zy?0#Cthay#Bn_T&0DaUje|bWYba30Ax2wFBryR)bq1%t>&5;MWcp180Mss>Y1B5d${w5f5d7s@YI7h zac%kJn8J3O;TT@9dLoqOh|1DYw2?H+DH4?w5OJ) zjvgY>SaKp$nSNAA&}uZw(}e_x#^OYxaSVDb(3>~=1w}@KKvo2`$3)EHR!aYrtHP5;y$$ll8-Lw`>6vzadIr;{{f}V@tE!?b delta 1881 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 delta 2655 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 N002ovPDHLkV1hi*8fE|h diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..2c3aa9f74ceef94d4dd6a26d052b78d20b3ebefd 100644 GIT binary patch literal 11169 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 delta 2655 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 N002ovPDHLkV1hi*8fE|h diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..ecda742dc76e7a78e603a5b8c3f83e93934e1d2a 100644 GIT binary patch literal 17044 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≻u=JIp;h7i(NxsPV7Fd9#zXI!jwFZQDd(S=}J zy(3N2X}SJHw0dnNgiund`*}8G;uq|hhvStrP{%7`lr@Q3B_*@3{uW|sirU=Gk#h=M zT0sM8ml}1$<;PF2KA*EpTV3U}>EY@u=iX6yYzUAQsG|dMqX;@cfQOksLpUDqF~YDC zN32?Wbkw`ccg0Z)X-{x0Ph1bZk29VLH+X<~CJv&ydh60vykO53|5HZg_2yA?a{lE$ z$fZqea6b>1o8Sc$3c%L_W}MWWv9sejYWGdqsMaCw#f&Y15?RZW|IXFS6~>IGifu}< zO+n^5!Sqgh#Qvks=d`Q}c<3LzAD8VW`LdV?$5h`>UY=-(`)Wx5(FX3}zn3z~)b%1W!kmxMzc=mUuniam8P&0c9HrA=h)ctLD+vdE= zPJT0|8e;=0W3==#U`V)*2e>L`)**~|MU>aP`q%;FD8pubH&AsU#`1mWU{DTGq>N=D z>m-RMPYKDVCB&POMiK}huHmHO3*sf%sRWiuuZF&SO&8$RxvIR>FHBJXm0avqipdI; z8I^w;VfsLqOX$74sj@^AmWt3FH+DXE%DKORR6)>*=5jOaF`{^;PEIg+6gB~QJ-h%o ziwI-^qGOR#k!Do( zW3v~O#)K2wiwJu&-o(Vl38;e?`0?8c09@Kehb?k+TWqW?0VaY5wL}q%po>baN(ap+ zb&mumc77F)0+2o`b923l^sUY4GlgU^95%Q-+Mv?gsrtGbRGP%~R^Al6B5(2Q4tFfd zv%5b0jGtwfx@*tipvhLBr(&^pV)V2UZ0}cg%eOWI1@Sr1iXJ`Zqn-q*uO$&JP=rcu_?2SkPW@68$oq z-<`*|Jta?5a^MxiEYdcyQULt2_}<`lXbR#w`421Waa^~@rI6>KnrKuPUdX2DTOTSy7scdMu@x2yhhfmFQa7zI0!*N& zgo1pN47MwITyDB~?d5GIurFr78KRJuDkO|_<|98$|L3&%PE(nqVG6Cn4#RHDZimX& z!iy<;U6k&AbK4E@d$>9KL*IEnS_`R}0NT09VE_p32)uvkoWKuDJ+x<}WQr)8BV_ua z5S9gpfGUJIFfywCp)MBR^LJ#dF~A*=?jP} zXem~$blEyWKxvMZM%KRLSJ=q3IvDfJD`f|)!N>kOeGT>A(jeB+Lm6zx3oxtQ!|n-Q zf73te(J&Sh zjPFHK{ zbj)}zRtE3y?agFBi=~*u#6G1cI&|K)-lTtLEo6_*7h<~znw<`BF4K0Sm;n}OzX<6G z+`%IGyo=8HS0~mb&sH_pWi+Xy)@e?4fMwyzWJ*m@n zlzjO>X)^DJ^}LgPg*Ex+k-0?Tt}I>=6HK>=i6+w(e$`P)7ZuOkjI>=ANES-1HPXj* zraIC(Do$P@zJ^YVqln*pp0MBAaq#6MOvg~3`MCA>`*O0=W?!Vdmm*y)L`tawP5g1O zsqV#6phK}~W)5R1_?sPU5HV`x_(+tDqXxpS|3|_>%3-ngbk9n=2;1v2T8zV0Kht$x z#i8S{_?Sy#>%>VMvA04~?TZ#9tYS;SAHbcAbDNPLPX#TNwrf0~eVrU3C$VDodqnM# z+PAmUHA|E*WsZ^ij?AR&DUh4eM%TZF_W6Gf2@?9hp`HkG0RX!h6X$z2gfGWUZvA(= z0eMnO%fRoF~o?%~`X?YRVt^5+%5ipo2%)fcbZb3q!?09NXj6n^}8?|YJN zb*|3Xe;YNiw?f{sXWV4`19c{#QjIA!RQvt-AXn|X8A}cM@*0lB9xKyjIc1hof>@xX zE+vlq3|7?K97f@41ZR5=I@U|3kMSmih8)wWdr@YIaUtVJf7%ZvY@9H&Ll7AVT7&v7|j^NMlnF0Da<*Iv}bSr;+DPr_Jc zxUv_1ezF<&wXjb~uG++}w72lL#am?1a|tW_9XNdQ_aH?n<_0aQR5@YyXlzW{CW9|j zdvJBhG0gZ8{+fEgFxCDD=6V6{8zZjC)N2U=4#E}c zDVY*_uGspGdq2M$LrWA1?xmH{$5ToW*3W#0OU~Uh^Rr_7HhxPpJx#oMCV~p(RphA9 z1ij)}pJ}U(r1A9UT#X4-#{fFKs-EoPjP&`N0*JQU9|p)8tq7{}ll>gKxoC54L=CWp z2OT6e)IfzvR)^?&#vP(Lv3pzH3-B?zs(c- zv9n4r?0Fn|0fL(N%Dl;KJ%OvrX=w!-j_?o!k?lHQ7VpdL6=xw3pnA)yrIj}PKF2?H z$NIYYd+7~N$uCu{ZINrclWM?zn`c1QTcPj|t%9_OhWZ|SC~S4sIMvc5kr1t zY>3~4ll}rqz1CG80IUdn7ObpD)IbP0jW?j-PkuR-lhO6XzjEEj;c+m zrZ?8nm!0|b|8js|OR}r8OgZ(47%K7LKI!HerO>9NetSH-z5kPOEs_;8Kr+BjopxqB z$v|pvUf9-KRvprR!z*MdkC~@j&`wXKx5;_DQvNc7qVYunhRlIG?{^8G7zoH7a=Sn= zZTT(a1W_DbVlPAO`AjxPsUIBo5_`k}qL?5_ zT_HSV`hd9q%G}8fgj7!2tWC8B4yLu&9zD!_>D^Jt6VUKtd&Rg77D=+rL-+--I>sHM z%D}7+Zr$yvx>5z}bqJS73AjP@G-jqqkUmcwDJ>?;Yqt%Mt&l;TGnEnac!Oa#GM&L!O3 z8b%=-X2~+nVfmkSj&#sbhWO~QLVC`L?7nuMS9Yd`{p833KOIQ>tU!Mvj1bQLhS51y zZ|1(ZQ_3xYt&xIPw>1c(y?Sf3;SzT#F?g2Kc`H&{t|aRY_@`n z1s3N+<0l1>pH4f=6zXeQq!7JqDyVcast7QGYChlNl5KgA(P7ih5^9qnZL7TbXY2r+ zjAO|5Zy@}iS=p3zb>>o+&&9XDEUc?Yw-kYKF;U6OpOVy=HrmWlF??SCL`HZhyp%|$&MfZc3gQt3}jUPE)i5E2yH65 z0mBjV1=TqQ_xtvf9Qf`{xG84q4-2V(+Ci1_8Bqfu^??m zSen4v6Y)$o17WhfL?VW49VT7N?^*7*>!Hml2TGK=Uy?PqX<<`@0Mjw`eV+&Hoak62tM zYPs?8Kliop*TaJY3E}&aPc=o{bgm=AMET#yBrNYlnHer+K^(3>t$(5MamPu)7&ZMY!xiju4uie*@ z*u+rJSTe`V>Ce|1wH6n&NV<(KCm4fP$I*y3!hRV`)od*2z^N_j9v^2Src1%VLMxCQ z@~gkt5>Q~7lcPq2cbMupjy0c=R3xfH!SQ)!f|sG3 zB0yS9*lg3$EtURvNVJLnc8yTM9ZKqvp%{>XW?`dm5GVl3zI#vk8=3j z)|Tw7Em)NRqJc$L0RJ_&6#I>4Yq2RKEjZh)a!{F0R&%jCeMKmqBsSM+hp8@(4z(9W z7^SbSJ+WP5U?`rGc5(`cI*nWsRWHQ)Md zmrv2&%)quH_2(a;mmxV$WODlD(f-+Yhxx+tp{pT@fr+7Q7`6d{F6M9f%9M+%ct%g< z-|e)Ns*lVN_bCWfM6x?JtJEKSjxuds9wbJuJE{}}0A6N8YufG4`YD-nWqvUQvpt-Q z1c&Mq*WOY$+$XV=GXW;C1RJ%#eO3(orQmWqU*7J#ho47f`B0$(FBdH0bP3m)zcvj9QN* zM$m9hP-6d~5fxsu*_?zmPpOU8QpcXKIi&PMQ6b4pphrTOh?*#30MXM8u>yazHz~in zF?qYoS&2z^fnCjnSCtsQsGd68e!D4bZlkeSf|4_nigZG^!;oEpI_((yVR0tRm!sQM ztrl4TfQE1OJ|?xYi#WCej|>zOz#%L+a|rFc2Rjgr|K2IY*1(AX)#IjW-d?A?ykGn z^qwTxuo_4(;}r{iK7z+_y6kYqWKvqD;PLSE=kmBHGlrjV;#dCKf19>DligkTOM(E^ z&+zW)T$y8(u?bn;9@Lrqwe4Tjn8qgh=I)AW?QWie(P z!dym_7=1sV&_CF>sp@%C0TfxNP{#0?dzETS(+rRjl!`~4A)Hr#LH_$bedZ0KsFi&3 z=;EM83yQ8lK1YL$P3{Y8kZ09;uu=DW_VTK0{pv_5`@ElP(>~-ltu&ijZK77=bQ=vj zHk`Kd%dYbkS|n8rpOPrLcu*qFc$wl}(b*x&OCvd+2{vVB1%U5)h-iCH?N@xAHJ!#= zwF7-`V;{X>tItrx5@ufZ42*RChFeB1RrbiWXXOET0kvtV$MY$y#?Nfg>?sVq!wpPn z%oUH?w6C`b4TxPF8p3&K4s<{aZ~ydGD^3puYRm*rUg`|6^oj1*IpXbE>{|@Ryy8zx zVjS7))F*~AZoWk~4o1j~WvzMk&$lLlck_Kg{G^cS3t<-0f!`ekxgfe*??y;R7cJ>? zAXpaqJwS4MMbd(~5LPLMYY{K9!OI+;iz&}snv;`~a>86ViF#%R?O(xBbKT2`l}Z;Q zR7f!{jn|l{BKOd(Rr2$KtEN_9TH?U(5KfMNA5B%A?JZfD@#DOX+Owee@wqIeXvbtb z@0G(V3jNnUvkYR&MMv9345*Zw%yy%C;1tTlII$p)3AW#ESVHiQZ}jq3`1Y|b{}wsQ z${1d4!!4G0DV5Tr(-J`AiQ8Pk^25jtF;%Q9;$=78{r28l(osgm-(UOhSS6x32Bzur zORwY-D4F9m{awQi;q=Yhq{?3Px^FD8h6~ca|Cy6J)Kzh$CH=uk`CX1wrtoiGmN}u9 z8{RO055xmzf9Lm9TD51R#SG9)$n6e)ZNrQ?%}c7^@CMINO8S3I{pcFb84ol*S1E$e z^wykaQ4!}DkR4lWV9_wDZmkF2W^+B=tdxF`W2U-@ZUW#0js%7pgXFruc3o5cmBzmU zH{)jxb6snzQ*DP`&ME<_F@=tq<$bk)AdfWeM3WgBx28S21e0+wiE^N@ylf*4s<4s&&4C1wqVyv6n-2Q zt0;N_$WIFXbhdqAB9G3X&ThAY(5JG2V4LuZd9<^lJ<|Tu2%}1Xq#{C_D3Mevc1pYm zOGT40iSHZ8@GYt$ED#jZMZF2+iAwAW zz~xDufYa)w#Co{4X$o8=JZOn=!r_u^VC9SsbT zG`W_Nu9S4#mXA+m4=!GCKlxpSx5D*I17&7iJ=NP#+eyd;g19!9J;HXUvu#gt;|*B& zi}{v-h9W)5SyNC}6m`T%{a6sq%My3f&26d8eQ)K$w$A)S&({e7s4o^ojFbJ@eMSQp zQ2O+{65T;=PB_l@`>VP#41$*9r?Mv5b72e z(YPlb31Ds}4giXf=k45aG3}FSPG4n{@Jwl#p%G)s&MaZ{kwi*}3Lt5#OFy(yk5A4J zad&T}BOxMbqk24pO6^9s-G-4$Z38cFMqiD8LVku=L~UN(d9?H~`9BIqQGeu@5Wq=- z&c0;vR9FG@TY@o7gj-{8pc_&L9)U1<+m12p`FNfQP-IYW!+Sn2OIRCi)@~}(mpAZe z#Hev-($o^^zFmt|h1SoTj6QZ{H#0Y{-1wyO*V z1S*acB7BqV3cSh4W02pnF8K@o&{_#{5tcEk$M-KD)rXpE9bvl@SQyB&2^MLFZDq-_ z`Iz`7T}6!<3wnO+!O!DML4ic72Wz|e7WA0!e}-!Fm2>Rv_eqVASuWtkUncRquem8? z^Ul7wk;=%gBhS9;bl*blG*}fBeS9hl_e9Tk!W2k;cG~EIsL#W8k8gl#)n;ofd)U9& z-{d0p7=dbTE@6yO@Vl#KTf&a2`*g-#9_!h>pz?m%E*BESzS}+HxVotY~CjD+HXtla= zF~>ZLDc3zL2!MN)<7p&c?t3Lt!&<`YQjfzoETY^B~4*Do!zfbpRS&PD)b+ zYDD3V1V_(tVzxPp`I91N93kjZ=xc8=cfeFMXz}$Fx~aIirG>uARK+c;ButK+8?0W1 zzm;6z4=GqsslWV)jt4|vJ7nRbHeb3t%JetO;vgt!2_mnLBix|hOfmoc6uz%eaoRy zr60L^N#WE{L(E=XrIjTW=~^PQ*|)Kmo@+Q@Y!NE+bA!p*D0^I{?cntd-MA@Og7tO< z9Jw|ScWqbZxq4ZWrQ5;u6-zdUOL?eO0$s0==MK9W!C>#Vi@6|LEWzmQ9}y(Xon@%6 z4Zh3(tS#<{M4Vlqi>{x`P|gu$XCy0>Oo1q%rULMR;fNKru*fj8?YpTh-YpAIxnwFR zpJ3#@b+gOw2R=kQ$avk{4U{$%IAx5_jAc@^yHFj=rdCp)S6C5VI5#GS{L?+k?|RO| zLc+JSpV*qBGnYFAwwdi$b6%^Eh~$SjADpwYs_>6Q5wf`OlDpyC6O+)r`ozxitKtdg zyZV{0qdlr|?L8g)-QdR0v+E*9#vAmAZ7Vk<($Fqcbc>%)8-|HkmKdg0>GS&%F0 zS{0DTZD(?C_`Rz6A;japDc4I>o`WX9III;qP?&qD>024Ay-aV242l3zWoav=roA4^ zIQ8J1P=*wLZ$(FZ{L;&+R1hxe%ggw>)hWWB6Jo+iqo5{B|J82MGGn(cVgq#aOyRCd zWtMthP7;6NEEEL5FFjfQO<@izMhjk!Q-aXEd#D-%iNECn&dR(yOrnQL8Wm1_Z==o{ z`2ac-gLA-_Q!C{Aj1YSn`AtCuc7l@nc)Z;);`RGu(W{A#U_AFktf8*P^G$<}YyPSO zM%7o$>#~+e0XJ9fTeUtjt?C~MypPxG>|m^Arkt_8C~1(?2p5!x{jqQu4ArMB)|*x= z2{@Fve#(BVdooQXB*xW>EPRM1@AlsmVO8zYAir_y!wsgGP`LPVxMR&Jj3~4OB~0rq zzL)J5WUY$=n;1m7whJ*6*d8Cx@I(MGS2>at0X1$&TT6cgR%4=>G%_7;inx*bG(=C0 zB@(4NOPm=~986_{@w3*7D3$=+WGYPlbT@2uQ$wBO^KSYIHEPHaN7nR<5zqJKEWg_m zm$A%Loj}hH$K^hLi%@1?m5af`TA6d#5~4-6kPYW>c-jWsrp1KZ&<^VBdC9Mtu$p3# z&qF)aG$y*$O&NOJB1Kn&byFBo!P12MNBegF@>ScIl*8oqyD7R)ir7r)6+4|RIHMeT`7S1*T^L>KRk%D(Pyk(-Gss0Q~58+*d2;X(=>%~St5 zPA}e3x$J$0?se|7iHj~iuWf49+4ZV{TEU=tVb!fTjYz0ra77GxZgFmi;s?R!x^*XG85T`vj-$Q^o@$o^FZt(3AQF8QeJL3#Dc|Ju)z(IT zJ{OS~`e1i28z&>KdAE~}V#L*_QBf)Zmjg7rUMz?vzG+MtYaf_;`xOU%131`NPnYX+ z34Q*Xq|a6su^^Vqnx1_6bSJyQ=MN>1v}hvdoI+s>)mB#Tet0%0x1WETD<4gL{%LTl z%+AP0LlvvIUB6c!1DA({&0n|fA~5Ge==VOF-Dd5_v)QGblQhu7{|JD!&T^Htr6Wp* zQddP24-C)uPnUoDCB+wBL4sp+J-yu?mBYSmhKt6J$7l`JC2id^JQy$N$mU+1DN7BY z!i>BrG3XRl7wup;(u2V4xA${=QzrB^gT?iW*AEneBUdh_!aNwFNZqI{o&&U)iw=vU z0bZTT2$Dv)1RLX+d>uFxqzl{FMl}6yNEhV^ILnzJ%$MIkIOKhfp6vHrbG!0?Q^O5l zu!^r*`P>9+Dja_T(xaj&*>M7~<*~nrRve&(J{KnC7{(5z^yu<^pP4`-pdLo-f*j}b zB%KK(9gAF|U&fg9i`&=&hADDcO2#l>2?~W3srv{jj_Ul3LNBaypo2J} zaNkCgW=lU7`R~hGtj^)CM=b2j1}jx`Q~+QN<9_rccQ2B87UR3B#dv;qhWSaM!&R_F z-LJ>vot^s`${GCJnUi9E0g^o)d=29Wl)A~c1p^6aYhv{rcE`uNb<1wbN$I_?8k4;i zh;lu;MoG9kc=26*Y}qJDnWy3!Q`KbAplR5r_i8u~b^+41MPI69exb<{O~A&dfsH+YLE z3w{|)-^@K0nHGB_V!76Gx-7w&Xlpo1p>Kb!#L7*{FH`VlPhy7{IrBh)t6}*NVjHyE za^$~{&T|uxw$SIB=~_C9EO*iXqsXHcn%wSE4Lbksu6^IM5FDm8qYNBGNBD0X`pOJb zg5jZ1Bdw$6$iho6T@HWR|5oUT$TQ87zn9?G;aTc<-@v?zt8B%Q`8g1HR1x1TCaakM z;>OxMZxevtj2sX=Kc}PUjX%iJ+Oirzgoz(Wg?T<#Z^1qJUBN4GxZjqnFW=tarR$Il zQ;s=h(QALcb1_6I&O?mT1UhU|=Y{bigt1KAxn9eNsht<^nL{tF^KF#iITVwij! zIEZ?z21B0tCBBh~SRQxm2)&J)f1bTmMFjm#bsl?pgj`O{&SSM>NV1NR!+_#eS?&u~ zd`}gi0!Tf1(?9LopvEewcY%bbc3TF2_kLDiU@EoT@yDQp@c>-awB0P<=YM8-c>8k% z5i5b*HW+2&Z(o%3N8gbN0l;_F2~4rGE<60I9`rtf1aR3`KT-u<9CY4CMEUu2^Q`sg zG?X(l91NtDGs7{!xjaccKcnRT6AR8Wr;UR6y8fhV^Y1qfV6m@C)(hH4x_Cb>Z&_)q z0rV`F$R>{w+eRk|nuU|2M-AP81eCK+B%9X4IXAX2I5HW_UN64HO zq%2%51d#TdtvuGV;m$B0(_Mqs=ou0!j`KT-{1g6=9IXEH&mIE`e$Va)P-0eeJ9@XzA4k6EZltHg^fY1sK zMtT~$i(kH&3%&m!#bc+v#Ah!pwG}_(#=4s%UYOg~~7ZqTo^$JP{Wyztv3QrmJ z+EZ7;ZpSsVx>(+KJyp4i)ffaGt)!H{s9U7Fikx zX645P;U&Z>KOZrG4ytM=)QH$*Z?$!KGNDzel=V~O?YzdsUy20^;L6s$xK-9CF83eK zYwU`-uU=}*!YO6c)k=M_?W15yIrzA`GNzkrZ3BK!d*_A=T zh4rD9(cu(Sm8B0of=%XvuX%gH52F7LT&LM}zON`O>^C5xZmn-b%`kHpMGSR-XrQ}Txx__0)iW->c^-+buuwRCj zLjl^arroMPX3RizdpAMsm(1mh$l_~at$F$YI_qqPoLhT7QZ!wg{Rb8(sk3bL4=5%Q zMB^lfz`SbjhZJ7FFNwZ?#_Hjh+k%64+F>IrACndQ(BJ$u3tvez!u|U<)wIqq7n~o7 z{r19d==)R>^z>Qw*tvJPY6I3}9S}3L@-twj)^2EKsmEyu;Y{o_9Y$xhKd+uk4c~u& zB4gPYI;>MPKWiAU=r`<9D9txa+Qu=WqC=<)i7EVJTKb$}z!G_uKCuIY#sX!Msyi_p zB2Q`zT$8*R2Xj(XP)ac0T2UY5gH>>7}Sy6CEBH3wvDogUYa&9?S&Ml|Buuoml%cE?IJXSC+2yMb7T(V*yD=NoMx3Iga zo_*B~oM>pLwJS((Bu2u>c+*{x!3k$-(Etun#N&35mFj15UM4e2@|Zt$60@fiP?VjX z^qju25jK&>7RD8!lVPe51A`RNc!K86Aa$)>G`987(9uI@AWS$GCoU^iuRTc=a7q$B zkBf{HFNN7@6lSMWoSRNTR+{BXn9y&g;fYY%7&?qwLYpuneS<~&{?_A~jJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..318214d36415f531b5a2636d147359446a9a1621 100644 GIT binary patch literal 7347 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index d0e1f58536026aebc4f1f70e481f6993c9ff088d..4348e413e886b4c6a6fbe20693a9046286c0acb4 100644 GIT binary patch literal 15709 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 literal 3612 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%0Dac`j;6QR%!VRg-yE6Y?5~eY# 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 Q{|$$x8bY;D#rDPj0j!JjD*ylh literal 0 HcmV?d00001 diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 72abeec..fd153b8 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion en + CFBundleDisplayName + Local Spend Tracker CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -26,6 +28,10 @@ LaunchScreen UIMainStoryboardFile Main + UIStatusBarHidden + + UIStatusBarStyle + UIStatusBarStyleDarkContent UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart index 7dba13c..65728e5 100644 --- a/lib/common/widgets/basic_drawer.dart +++ b/lib/common/widgets/basic_drawer.dart @@ -21,6 +21,15 @@ class _BasicDrawerState extends State { padding: new EdgeInsets.all(32.0), child: ListView( children: [ + ListTile( + title: Text ( + "Home", + style: TextStyle(color: Colors.black, fontSize: 20.0), + ), + onTap: () { + Navigator.of(context).pushNamed('/HomePage'); + } + ), ListTile( title: Text( "Submit Receipt", diff --git a/pubspec.lock b/pubspec.lock index 7fae896..331bd50 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,14 +7,14 @@ packages: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "0.36.3" + version: "0.36.4" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.1" + version: "1.5.2" async: dependency: transitive description: @@ -49,28 +49,28 @@ packages: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "0.6.1" + version: "1.1.0" build_resolvers: dependency: transitive description: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "1.6.1" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "3.0.5" + version: "3.0.6" built_collection: dependency: transitive description: @@ -84,7 +84,7 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "6.5.0" + version: "6.6.0" charcode: dependency: transitive description: @@ -178,7 +178,7 @@ packages: name: front_end url: "https://pub.dartlang.org" source: hosted - version: "0.1.18" + version: "0.1.19" glob: dependency: transitive description: @@ -213,7 +213,7 @@ packages: name: http_multi_server url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.1.0" http_parser: dependency: transitive description: @@ -262,7 +262,7 @@ packages: name: kernel url: "https://pub.dartlang.org" source: hosted - version: "0.3.18" + version: "0.3.19" logging: dependency: transitive description: @@ -290,7 +290,7 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "0.9.6+2" + version: "0.9.6+3" package_config: dependency: transitive description: @@ -470,14 +470,14 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "1.0.12" + version: "1.0.13" yaml: dependency: transitive description: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "2.1.15" + version: "2.1.16" sdks: dart: ">=2.3.0-dev.0.1 <3.0.0" flutter: ">=0.1.4 <2.0.0" From f065e3df6a6fdede01fbae4f59f31b69ce235248 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 5 Jul 2019 13:39:24 +0100 Subject: [PATCH 013/122] -turned off autocorrect on relevant textfields -money input field uses number keyboard - validation still required -added fadein animation to first menu -added splash screen (white) (logo looks better on white) -added (temporary?) navigation menu -removed access to navigator from login screen --- .../main/res/drawable/launch_background.xml | 4 +- .../app/src/main/res/mipmap/launch_image.png | Bin 0 -> 134507 bytes assets/images/launch_image.png | Bin 0 -> 134507 bytes lib/common/widgets/basic_drawer.dart | 16 ++--- lib/main.dart | 10 ++++ lib/pages/home_page.dart | 56 ++++++++++++++++-- lib/pages/login_page.dart | 4 +- lib/pages/receipt_page.dart | 36 ++++++++++- lib/pages/spash_screen.dart | 13 ++-- pubspec.lock | 12 ++++ pubspec.yaml | 8 ++- 11 files changed, 132 insertions(+), 27 deletions(-) create mode 100644 android/app/src/main/res/mipmap/launch_image.png create mode 100644 assets/images/launch_image.png diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 97f2d62..331d9ff 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -4,9 +4,9 @@ - + diff --git a/android/app/src/main/res/mipmap/launch_image.png b/android/app/src/main/res/mipmap/launch_image.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d5eb3a9d603cc707b6b0c4bb8663f6f4eea8f4 GIT binary patch literal 134507 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⁣_+-KhESi$BpXt!{Humi}(W*MV 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

5d(NLZJijC%9m_9b0w$xO$|(8 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%0AHbvw#qCgx7^b|sO)mqc@GF_b0 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≠19`vYE2e7>tUzF5?FmT+zs3bDDJS( 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

#a-O*K?ODDQyEKwd_ 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 literal 0 HcmV?d00001 diff --git a/assets/images/launch_image.png b/assets/images/launch_image.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d5eb3a9d603cc707b6b0c4bb8663f6f4eea8f4 GIT binary patch literal 134507 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⁣_+-KhESi$BpXt!{Humi}(W*MV zZ#<|zfi)YJteT@ehqffumbnSqD1V0fF$=WRD6Gi77W{VxN+$s9VwyqigUlGkVedV6 zb`2j^G9)%#tmi>lDcV4E3!GG7nX)IWGj;yDsSj6e+^Ghl?rc0xEP$xOt&0rYR1^B_ z-Jz;bZM40={IIC=)b@qmUXRBwcOC~X(iNga?+ieuHiQccyC#-(o{Ne+kHMA+OkBE< zm->oEoHnQ166}K)wsppIv29HpO9V(JNO?u;A7HOva!?6Q?*>hibUOW~L|RE$;a2r% zs(dUS>(>Jy3&0-d#QtTVOzTYUGHtkd(@i-$1L-N=hxh_k1p1)`{wmJAp_ttfg6#Be zeZXB4fhwdJC@Q*FzgRU4>kZ1}RhV7SS1yq}&g}~5b1l^w6^C{FvwW>;kU$ybiqb@t1KeteqT^Z@;J@BqgN6W@618dNYJkexBA8Fp-D z8Q8;!rrmGAg?v|L@_u6qz!lJ`n;t!!nPBrK^x~|@u;v|LZQL*Z#b*((dhUO_e131i z+miG6yMT2MW!sF_U|uyBP1pn#6<&J^UUbzT%QKfx@yt^3RMQwi^Rn^tyNDU#2^AV-Sdchb0+jo0)ID)}h`sk5lk2jGWDhNRD=VcG zIf0t$CHxi`qt9-rf>S9V47)uEC%U?PP-`Oo2oqAZqxKjQA?T&!3CiwlWk z20%@JY@4O zV?IQ(`q^!p`p*aEI}iOaM{oxfHq0$HzutUieJ7m?WC@;HkzMuDsioEE`t6V8`NZNS z$;yS}Rl{piT4E`hWqTEsh1gs@1Rg2b_tZkMZU#R$S7k9MStN13gESPf_l`6Ot+9IV zkbIM;c$Z{$#&WJJxqWv&QB+hYHfX##1kR+|e3C{atMqid?W$z%+WNEtKm=ej1A+Rl z_>{SSo14>?K?D@G4OPZGOhv^tm$Yjz)_XQZHKy%8NMK6=lp|3)Dx0|05?I8Vy>_hr z1kuiwHJ1^A$pWHxSHlATly#!#!1IwKAfc}2{*;-jV6kNX6?pnkJ(3Cz>{FOg&{Hg5@(RPP1*-P~X?H$If(lfy5!e*Sv z?oNMr=}AtTOKFK5L1O0Y!?PGQxrt@fDw}eUC{_-DY!BoJUOTfP;l%>7x6iW*-(5~1 zT#}|Z_-`BD@UL%54QTStO-%*OAvpc6SzDAbP8eK=U9e&d61KO>4KBU&fG;<`08#j7 zDQ2vIb5V(qAA`;<=|RcCr#X_)hLSMBtqkDh02xKxa?Vsw9h1o4BuWbfG#$Vqr-$h+ z85E9;l>!$?>knE<3nS$-{wK*M8hw!8TpS-)EtvH01y@vQ_NLrE`@@XN7dsUXFvHX> zX3o>yQ<|C8Qc#qq5HVofp2{{Ite3so$#}!xjKR8sIzvp+V z4$c-j<2=ypA;7EnEDRjm?#*MCwQ+9m*u4i{eOOvI=zU3e$zEd~^5QXjk704ebX9Ma zA2^s}(wD!)a%hr)GVDc6E4EhdC&+nWdv*|UU(1?JY1hf>{V#VH6B8I}zF zupatA2#NeWJ7S9unCtv>0nr!e**gZa`GZzhtUN|)P!`~!#Y0&Lqc{)jH5gmgg+4() z(ksd8s{Tw`I9qN*Yt}|p-w?PnSb{%OS}v?XUkuRU@=5OHIF*wToMaPY@sFyjF8q1H z)WG592m1n6vqTRFGA_D4p{KL!@;0@^F# zdGIY%F9#npe^kHHcZ#(&vA4nX;*HI1WNC)}SDH7Q*p(PN)0JJKeMSVF=w+Q?b;|l{ z;Fih4yfH2yjGr??Vv(vAglD#lHL+X?pzB&jKOi?(?Y5=)HcX#lGg+Un)^V?bzM<9o ztiNgQjPckykK5;^ou#WaF3|{(3gP&y8HmM29~?rm&&vWpE+%L}5ZElqnSYIZpOq>J z?R42+#Ry|%_uG{OF7F*638uh!RT#c?9(mKt!<7{rEz{r-)3=bazHJwd((2G!=;Q=& z`q{$=E8p7!xSyAd781pK3_H%>^s9KqRi<;Ms0dY7g8dT~a><35(Fpl}g8w@j@k8lo=6`)^xV{AimkzKkiMq#!b2QN4edFqvNpW&2qYg^a(AG;D%&`pPF zHbd3&O$6<{Rso$<1HWL6@yid>v3p=BFA~!V-q)D~iZ!ZD_-t+W9BXq?zx;;)zJ~&$ z&$jLkONe6K-q&gD(a5sBx0YtQ+K%cb)lZWAgH4};xQQaOkZ|P_k@q|j#pgHnb@^wN z%!e)#u;7fH1JMdlSg=~aHZU}n{2b6B!Ax{Uc22L$yFJE7mzrLWZGJjs_8yamVv~2N zuPB>YixN&LeJI=1@Uk$&I~pPE%|4+`5)~%laeaCU1yprH`S z1{upE?Cxx2s_@0`?>OCl-iBI+B%O*NZ?Z4UjGj^5ZM^78nLpM#_j0AmG*+SQeVN7Ylfg~3>7`Fo z0m-tax62Z+%IUrfJSGVmv_C5zLr{%Irc(x1k74Ps+$}!aNSkh#(xp=IW9I&tFl468 z*uw&1y-T07h~Hb=bzB9csJu`&?H-h%8h$#z1aljx7_eZXY!;~HGbCYU4A!a}MWqax zlTt6rR@Fe<%grA|vDlpaY#EEO|ftv$J#Nq+QV|=5a_|7DUehS<|d}S2QRM>i7BSP zMnYO7bA!x>DZ`{>KvD6+K43;5DeH;qhgGgA`}#T0^w(ce2qZJ>pCo*DOecDITj2{y z6}dij1bUZ8Pe?`|z#Kv0xo}hn>tOFRsSc<$7_FBnuYgyq#mRrH*`#Bb--c%X+Xk7y zK!5gy-hV^oi=6rIwP7?=&IO&UJ(s>=`S4;OntS(7{O&t;JulM>cPfscsa&MGz0GTv zcBX3qE}p7g(jZRUJ&5-VQu)h1f$u6y;4Z{n>=yH8!3I`Yt305ti}EKOY6FG3`i4Y)}T8pD0ZaR>;ak0z~3N>RW94J z^V&1s&K`q^G|6|{avuSDh76vGXF}i@fVTgxxjXzOv4wR|Va%F)%`X4e^@!%PF=+l;DwqFoMPYfU0+GG8Bk+YCBM&gr9$ zd@`un+a?+}pK&oJP(WayK@2HH`~odAAm%=__v*D}&8r4J>ZTqC6;+H^r`$zA>GO(% z5%)nb`kiaBzANzcHVVw0ntlN_Ygq6s0a1)Ymel)H*25IjbFISh$Ec6 z!t5mQtUok>dyVa^T+lKlcXT-yA3yw%N16Otejhscr<@Z-VhH%oIi)o-n-(v8j8nYi z*q@T5td*{4V1U4I0}Q0k4mU}Th~tGye`r5CpM}(fE<2V1Jib21EC;@~^n$ zdH9u7FT6Ajlb7TdOoI0BQYH$;qmoM<=V0SGHo{`xelbCd?p@MxK#kTAG-9%K_dYq{Q&9Z zX+%dC7h2Q^)w#W`$rzRBy{*E`anZ3n&-N*8@j&RX+zjO2fX)Tv;ZR~NA~% z^Xkl$Bnfl|J5lalOh4b3Nh?$z1i%1P%TNJr48MmANrIH;lJA*La;%~PiM_XTA}K5? z50C{CKnin7Wx|TJio5P;eayUZjk&l@BB78?(ghqoBf&D}>&xqi5yWJ%pHzY$BrByC zK zda_MynC0Q>E0TZ#0H_!NVS-vlVi(7EFuLzGSW?$ek}*ttOo-t!s@iiCfbgp|lIp3E!x}pP z4utQ{^y|*`bG|gy9rr}!0I`FwYA|&|0^}21=hneMCwe^bmD+oz}{^b0Y3_mgJ5NiJLCxSue z=^;^#@RRJZ4V=GiKHrwjb$%`Tw(wuP-_?R3RJ=dzC?fPzTq097^<&+}8w3^1DLj6) zNdAl0NWxH&ALA2BzGp^e&&3E;Mpc|15c#}xbhL`nzrL1D$vG2J%^Xiew6lP+TmNhS zPd4c4fk^{@mU>KDg=!~g{XyX2Ru`!m9g2=Xjn`p?N*Pk|kLRA^A6H)Z<$#;^OU?>D0UkHqU&IQ&ikk71G8VP!`;N~Yq)zaYHH`{X z#-?V~n%J9rU@Y|{>C|H+H=ab7yIgerz4iO#llB1Dm#b7uk@v{RCLCBO0ss*n`Gr-T zl=CmJm}P)dh9LGgfn#{#=r^iE;CcwlK6`ulCn+q*cU+3^St}E<*mv3AlF^yrht3|F zNM+!qGf4YF6|CQ~Ip?t)Eub+GaAqbC;f(+UQsvL*r>k?El0g^4z-eJar8#_g@( z*M5Nx96i@iMUeh=({SVH#I=jksT)ea+y4Aw$FYzONNlu1re^7w#p9=RL;=?cnwM`V z^`)rPYHtfyJY7y(rJuLhT0wz?#)U;+E+uN^^OF3R6`8s>fv(jhCyyyU(w_ujj=u%r zo!VQctK)28-Wlezve1Rq=6e_aY~;8zDgW89`W(8J_Y=XX4eBUEskDO6+gF(xmBoP1 z0LBHU&z4+1ngvc535eHg&^yxOib6YqlDviACebz-u~D&dbjfNMj@(ncif5O995)*@ z(fGIJ98s3QUpMugTVq{hPI1>wGLpzdoNj$;n^Y>hNk2bC#beUJ)nW4GoFC#0PAbvP zDt(1lHPF` z!51xdErQq^ap!_ZRAfd8sR#CX$OGTaGu=VIPw$5)>!c_z&vU?iZK?^Z-dVF-b&B5$ z^;k#So~_QWVPQUm=XGOq?%Ew(dCamzQEq-UV@!S}V%(2mORxsp!U2X1@==zb;B03) z?85Tm7H_7x4wX*8(pES=^MwHDopL~jAb2w=?}f|AB3oD&@d1X6J;H%Gjl9{fV<3iZ zKqhFx3bH8xDERBCt(y7zWoX}z(!aM018Y+s_gdD{sbO~u=ORPwJTtj){c)Tu*x*X# ztBaisO&a+HjqQ$LkfIc3&IJGSQ{97-q4Z8%@5a1ZC4>T|0G@E41;>C4W5l=3z$?A2 z63>fS(75II`0Cnm37rAMNm{zUX);-mUXprTQ{R%2{DGBaCc0*aBcaxE@-w}O{wip) zpV)lZRD8g2R*N9Ps0w7|<7|r^+t9Pz|KwfacBU|E=dAQgfH~gXLT|A9L{}*>#ky{4 zm6$-%62Vk>o))1qDfFvMT7g(c`G6!7-` zp7P~hyf@!J>411VDAft8_3;is6dO7WhfBAfhn6r9#X~k&>GdqmQ zFo+H;Ke65Q`)00_IECWo4yXLv`+zyrNb!=ZnmkF}5Uw5fRCJrJyPIwnAww)a+~DIJ zh&PlR4+zfc!c94+i}yR4JaD_@b`TBqyBS%BQLCInxO#mP7Wp6R-QZ+h+L2Lu%1q){5{Q#V+F;UzL4w zaPysmJw`jjKmQan$Z^xZKr4!JhpqwsN!-CACsgqz;}y+;$0>AO5;N9J)d*?4*&o4y zJG3|;FQMT`!z~j>_Vd4H=VM)H==@G5t^l2+`B6$x2)!K^2w=LXxt+kkp(c^9JLZpH zJW`*1QoosIem%Lpsy6t%a&=ti`5&zJk*6|mr?Kk|fsFYc=%UPDLR=FXvud8%SB3bp zdg-ib{@7{x7;#VvN39dtl?EgrH!{H+4BV;|-}dp)_KP9LVmkg7ENP!pG{-7+Vq(xE zQmKK@*3giORotJ2JBXKBWj!&^CLu_lnAt5srO=i)|7MAC)uMrCZDHr6;zUcCwszBV z7v|3GC1DMlvB$J@&_50HI}|L?(LpQ*GxAG!ZJNt@!Tii`)fy+@%o2$a#{_($B)fv2 z0#NF${zLqRe3I#I#eNW9B7V2wlO*-hj!@9VOGn2Pfc;Y0XIF%4zuPhwSlh(8noDvp|Q~+d?V(T1Vmw1cP73LPUmsm0*&&-fAE&{y+F6H-GG5S8t2^&BhG4#^e zJAu(MF##oFkJ0f89=oS>&3=TdkOsNPt|PPUMLEDB%nu{fUk0MIWc&wf%-i7hMv)g2 z2%`?c-%R@?NPDJm#v!~dqp!CACB`NBg09M693dfO#pOv3Sx_@6DM_LiSqj&yE`%#R z5~MTetA`IQNJPs9)(PLqNB9ihJ!dxpN~)WygOtUSSz^K?Ycn<}o09S39XGLflB)-Z z`A(;^=LzMX7pknL)e{r!GAX)U)`{kSHPY>bRn{2I*)x78BP<`&p92!Xwvt$j?=#$n ztSHToE`w{%kdjuW^OpPKJpwEu@K|_u#~gjoCE|8mfyI7j!oX{Nh)xCpE8`seRFfp} zgbK_%qqwm+VWa!&U1<@@7LeI=`XumTYx6qMf&}TVNees8x%YTJ1$+~99YpN4$o3_x%Pfw+VQ#Hj?;kLMOjl@K(5S+%e{%o4wECin3vZcR|jPYG(C5i z3`}3!8wRW6-nUEAq6<4hP#vM()~|dGuKy=H-MxYuc0n+QpUpwuFob^Ld=YwSyX|@7 z^EbG&BWG*5BR?%Y$k{AB_R@WfHEQFeRTbIDX)y>x#J-0YL|K{1q*48R9{%zwMuYuPZ z9zCf`7jE~Kecg%Ah>RY+hx$m~wG(z0Q3my*9{KTrgMK1Coz0j~e9h@RIQs~Jtzr}ape!Isp>6Or!_L8{~`mlyCcc|S(C_gV8xr)(IsX)r@ju87! zv~}Vv>Frp1tzanAw78qT^g|JEI5ATiL<;Prm;SKgFA#W(y;^MVwmNNv$oay z5uspOEEDw4QTZyDhSG$Eq#XQ&<8Hm{JRtX5(ZN0hCy)hw78CHyzz0C_Tha{_olPu#^O!xTnYyr9& z^z*tB+TkctBn6SZ_25JqOlX!~duI=|O}natbbTS<&khSm#|c2%3Tt^^xEp>4wwl9$0YH#P z*T3m3*H+8z((Nr+kYinvczmuuMTj59SNOGt}M)v@0HTocUSQ$vfn23xSac^A-_Lw41|An@O`WF zS%gkf>a5L%^6%fpg*Ci}LlEtt1nn0B^4YDIvY;6TKf&C&2=_NS zM67N-WXRQ_Wz12KiP4KpE&qW1)0b`848Bq&H@eZ$*7<*p)2ZGH!HC>05y%sK;$=uZ z&yHH5x@>3&?-LG^A*#fA2xyvM5j=i%c77^!ST`qnSE}LoTkJNfxVFOnB>r7r9GWbGZ1~qhW{}Sw4lmvh}44zC8IiZ<^U)%db(i-8r zbBreJo?4j{O%w2ztD4}Qqg^q&j>9#}pM_gH@$(3uDJZSxmQObsfpdBp=4=b&e`Z9); zdg}^7zn*M|@bw6~`(9+Q7r^!r<8{r#kU;YdV^cP8sz!PdG?y+*Ddnbn6`}vs;3+@= zHF@u1Rw}!dV$hryFD|CWPDo+|?pt_$)9EQ$j4H6en_5ifB-gb=xC@o8L&(G9{^XYA=eO4X-zc=Yc>piFLt#EQXOy z3`C~6^P|x_Vizy=;Q64c`XyDF+OmjHL9<5Ul}5ir)4 z%uAbLm4&_&$QU97hF=8LCb5`9*eQ0|-0S+v_vm&>sr)AMw!9VjZ&we(0Dg~+m5_&K zSt~~chP4u@^pd@df}YUKpYt2Ecr^0c^x3jky9DJTc~adZ1d`*lFAyUluC?y@kVLcJ!F)7ja2~pHH3lHIbfsjoe9yX&|Z$^g1}cd=k1&> zh~)XTaJMSE{@&R8C}{;4kY|dg3)Usw4U??tzzDQ&yOl}V9*=DAdjALusX<8p`Yw_0 zpI093E)6HIT%XSpNCG3R6Glgetn0-jArR0B2!4g`8~6}V`vgL^iyJG!niY)hhpx17 z>UJ$Xv+>h0tbD4aGw?Oan_ywIf7HE6m&$kd@xL^a^N3W`RkIjq5gY6G(tURIA%2f! zUtGXtZ=RNcH2%Tbw_Ix@L_F$eccaLiey1YWa&$HqLUJS1{82^(!qBZum*Aj<2)9bV z`s~g|9MshA4zamm=dsN9Q;B6Gv!;y1qhoei9o5vgm%%^=1^5bsjm;-m+J>f;uLjSx z5JO4X2nk`z&APKz>AW_OWYsURG*pN;Z|g)`(#*q=NUs@h$@l}1YzLM%A^bnh{w97w zb}g~;Avu(#5XQATqoD7c8A-vst^QZ!6TYvA7VI%r zR@7E1513TkN0;o3^Gw9b=ME&`%oC}N%s!o%`uWqRw6SEIW-rXB0HEWgM5)4FT;RLy zY!TR9^-7evKhHYFTHr}mUGZx{80nPKOKz$n#1q8hZ2^G1rV?hw1lLV~%`qVC!0p_v zl7Di0?wJw#nRYu@YN)t6WJSf#i;3QZ2aQ<2mzHK2e~eV+=-C2Gk6&K%F7fC5I=19& zn0=Y>$(nQPD2rpr>#4TBBbaZ!ds{H z2bFMN#jDH+p3*|hLn-0fladW$g5WW%kU8I>r9jA=uL|JX}A` zjLUGXnIlF=Q7c=2IoGR~`omAXhR~r1QflcKsXGev5wm-WrIQh6VF}pC{?@&6+h;kZ zZMt}FMg69&ySx{Fj}~NkJk;zpn$f25{|DO%wli8bmxG^TC|Pf>uV1Gf6=QaDU#kNqChp}L zG8WCSo?1oVC;&G1tTsGTqrtf9g`K*;H%TNWJo}ry0CNn)8p=!k*&2`q7JN0}EQ^IS z)qK}Oh$WCP71z2KT|Srav-N7ufKc%d>Zo=n0BnqQRG|L@-alvM`+Nb3_UzB|cR)<4 zSqwq&4rnEc*Fzx=6r8M$9L?BEIVCsM@Xda#5T+dns!vFa_hMHa+!Pmw4vKld*lk^f z1Ysvr=%aztW%N&r0D&;1rTUWT8G_oV{2HO-Cg3K+^boG{fRn5AU4$22v@|nEI%>b zfbG{X!e4*3-z;2ro`SuU-#7D|eY#f4YYa#TcfG=4F}&oV!9GM^iKl60`p_on)M8-;W;1JOv@IVKy#3~1gJ+P3YN;gFRv=Vk2~ z8COI(z*_XH8L+BmzvDxd=4HP3W8YG}bvWJpRgjV!wAK%-^gl@g-LjN7k9TASNE4Cb zfz^P#b8_UF{)R!_AR0eKGLi00IVnm-&>YsU9C}Rx@BKHtA~)qKbx8rGeo0{mA?E#i zRwlbQ;}TxU+z!%G#mw#QH~!|BtjGohUDwiW3YSYk+dX`L?ZPbTmvV_Bl;+#!e==ce zgIRjZiT={NA%4NgiX%nE<}!ib%$}<76X>*)z6% z@hMANLh^6Dt$n|aB$GxL+LhXEa$}#y?qU9OJtttVv-`3m-W{jeietc_lzV;Bt_D{J zb-pZSnJx}Q9vka(k8pMZEUn*~SHa-XMECZoDhCoARvH#Y7Qom9zeGGsM2nVw;glrvz^vcEw`= zfEEK3i7j$VYN!O?N^uT1q|Q^E;6&}e&lW;KLg7hyQcB-(#iLF4%P}BsSyYs|ZqFQ9 z>mUrt^n&2%ZIsecAmGXf^jBvi%-e8_nb{V7h7&SU5eEVPe_D#Ee}fD67~pQJ5;)X5 zuIq@Sp$z+LxCQFIZJn`AZ0l}FJ40>Q=157w`;vbsdrEojBFS`m!7-r6T2*xfDQk~) zI%-95eZWA9*CO_mWTL3t4EZ2=0-)ly_dWvJ>+^r8XcCF=hJ$QAe+Fi96GT5+LpPoCna_6?su1=325pWvu7;zZ;al|g}l}Gz&6pbR3&J}Ddmlpg$@6zr89dsT#s$yDENShge zhhd~iT8k{PxcNZfJo)uNnnV^KHh5scq+6n{z=aXtupve!H|y>?`<*iFz90-bseEFd#DV{Y5&=9mPn4di7Rdn+g4!-wB#dTAL^y}9NA zqL1>PYcK*r3J%~jc=RW?>StjQ=zoQ8WupItP7*4emL1a)Jg+epzdJtE(0q~kxY9QBO{(BSgF>=o~+fm3Fn+W;bI zODg5K2_lL1NUxo^&QJHTvbmDpl0`Upyto6zNw?BnV;$gGV+)5Datm6umJ2@^9}3kw zee8oN#1B#bL(V{&s!PBweeQ+oo454-@06cv=?}uSDKK>$H_w#MkK9u(Pl5&uoFCGi1S0UYmqHJNYx#GV%@=1cKO9JZRV>&vF4b9fc@uSPNh(W4e zTPMI9u{N&>a9KhGM8O>0r2lsZp6lq$}k7rBb$j?~EsVHF;)>#fby4KQ9lQ4x@TKHg^2~mtpE2hr{0sV%E}r z1ghmeawX6rR1FP4{w%lqX6d?7>jT$n?%iF;{lTBjXJf0^xFASFB6220PIvZZ^J>1`JFoFkE^`%hF*k_ zY3HW^(vn7g7ZED50f~{bGPgcOwrhbPk;A@ezQId`N+Tw^xHzZQ+Z-`Owa#NjZ}&+D z+F`gIqYXQ5x}gQNxgyjr3CNGcc~A_BE>sQtX4d=CeO`NiL+m<|Q~N?5rcEjPYo%DA z@=y*MIFXlr2_Yc}>EeEp=6p4JulN+X}s+AUcF1p_g*vD_gnx@ zAI$IL{^8t-TzZKkd`C-dNM+?_cRhbDcIAI{rVt~p=OA$p*3 zjUEDK>I8sszW_7Jx)sZHs;wNhs+XaQdc>bPOaCz`LFh~d?yznj#_aXH!{8h=qN7P- z@F!yy4IG|cinT}f5r*~vOH*FO-r@Q%HouctoBJQ*v4Wl3BZ9|PK-fl@Yq5)Y2zUB) z-b>2MD`uvo1eXm~TTzc|jdef-k}frcIo8-H$vV-%wsb9y5OoZb0h$BINJ0m&obTU! z7|@L5kndw4X`+AEly{~*e+AHLs{cN^uU`D^tNOq9U2HItpG|Q{Nv-Rm;Qr^!$Dg_RJ#=ZCU@47Sa zr&X+ah0CaW$LY4&AQdoR2_C4i_l`NUV0Jgbr$ObQndVwML=a;-3}|bUmjESYCz`kC z1cpU!3%B(E;xtQiI=ZKY1Cwf=H9xM}@0no>3KtFPB7j;RQa zW1;X@bAxdvCO+q-)t!Z}1adQ#uvdI{PODg?v_~)A2zhix#*N-G8j*aL$xgvcVv4gh zR`fz%R5bj5qRY(R2nwZIH?5NqaU30qsio|tzB9BwEzvpRF z(1zp76A@wO*k`?v58dKJU+%*!QHd(wFI|35_4k1vc1MbQr#uc%?KR~OK{m3f27R6g z+}zarFXt#^Bz+6*lh+K>5LuRU=hL=DhukA1<~P2ed4l>2$&{&m!gznS(oHqNqZaIx zj@Ly<`g|##rqndNjIcJ&ptxzIbj#VH6~)tfUYr#|2&rnHX+(zk6Q>`wy zG5+_NIuAw3O-}0wr961xHc81whC*LSv~FfPCF*iD1!sF%@F2BiHs$4Ry%^-~PW_+y z?%MK0NyYEwI?H1Hes?Qql*Ni2){HMMl}@**sbVnG-3{A2sC}7y%h;BUQYL5o>ynzBr~%oLK%TKZh<-?=fTQ{rqEB}KAkR& z$!(N0V1C165%%A1_7;q13`2FgQPL4|!UYrNuN9U*M5F!kwYn#SGSL`V(xE(U5|OKp zOw+z>ciHCKizwzpjzryaJ2t({p5M@tnR5)n;h8ioxU@ZJzYN=N334M26>Sngv&RUcyJ#3*luapyc4r}(9zLbOdCDJi0_Ov=l31{e_d|MnM z>n_d9LdOOv0~s8JYRXqN9*r8#zZIFoMTzphfF}GhsLIpnpEsSMQbnK-94OCIsL;bX zcSg@o!mqMPp0;M2`J&L!rF!4wF-)+@U}T@};l$x|seOL@YG(9AsPztsdTYzzhHS09 z5;WmCX^6r3WMc7Ns)j>Q)6=0U`Gx?v@dPZ=Yknl=|HE;KE{W-$AnGqTptnOTOM9D7hFQ4fDPiy?A- z4V+IJVgmWJHs($J2A^@)xKn+JS~`VW{*`& ze{kp0I8mHWYnjrdXG7^s#vi9MX8PaLTwdnVjJ*IAC916{W+&w&e)1%1x@dCV-m7Aa zZu2YEY~QpwDE6q}Sd+(hpe`Lgo}wSY(XE$^AS9jBIxX1^tETZ2Z7eHUN{_niO!4Jp zx+V8QjMJ~Ubrc%5oq#z~T`6kk$bU8I?d7|a@ffIrpIKx+v&%5bkqelIH`km&6+2yy znm)ht z^fop=*Xr_{zHfOVu40R`2o2mIbBwZ2-vYYYIiAfURlj%xKUBrQ2la`sQeu3it>vxN#p3G zU_^&LKwdVY^ADal^S@6PgeFC-l!kqT+#ePHphcZwJLROhQSK|T`xy`)zwz{Uu$Os$ zF~7CyuvE9e`@=CJEdm-M>sB9{z(U!=-$QLDyU45ujaK5BM;tCEx-S&iIrP~azZ@rX z@v-%h-ZzIvW-i}K)}v!m{FtIX8iq&XFitq8{gr*}(1jvq)sFBaMAoz$({zhM!>RKZ z>(X}M9f$I$a~`@{+mmup{(&83bhCQBgldG7Jrw&^OjLGG+)mB|M|X0^ZU#2@smbVww@ICbNPM^9JShAc^4QtafvzK zZqc)8%)QQ{we37x-zTaxYvYotPI0 z0>vENiK%pyG{(h6Vq?BOTkgv7|N6U7UvWua4R;H}$o@l*x~O|mP72RT++QCPIdQr; zk5;pXER0jPq;%%6>1pMbXt(J!bgW?Sd+*-&zZ+Uo?6904x-)Y-^{iiYe|MmdKdfx_ zr|f*U7ON21?s5z5pYKgH^-82&Q?lMFWw5*5$oQwN^z77i_SmTmX2p<|3lh}o`v)Vn z>w|-OJjbJX8V%@VaM8I|ldGSbUa?PEvrXAEO*JQote^R%8No3o16*G&Tx|m9c2cTw zTZ3GOdwKk7AbkV;2vkIUi)m#9_CcamLxrbt#v!en&o7#_a~_-CPEd^CpK0t1$Fz$W z9KpPr$uttr!dM-+oJRj^ZtzeB`gyVA?)DU8P)sXod3NRj>%Wfw@apem#F+cktPDuN z;SzcH?=4jsi}1AV)s$Ln7sL*8xitUv6M5{aBG8kn?qr_i({%A2y zv$F5A)|9YVRpmLtcBXklZ%{HtKic&a!!Py;_GuqsI~fyoIAtjBJ30Ou{C(_Csghr$ zQjo}%iGH|3vF*Qul;hF^8R5w`CODb};Arkp&1$lVG@-U)LK(N2u-FHlfk&5uX&6Gl zIndVECoUPwb_SZ9KGBcjk}`K+boL|QY3Ss#QiawCK^LQRR(N$qSa(&pS9f)$1FeXG zM|WF^apqlcRm_A!7W@LwurW@11JdL``nz=SCgRQoFQW-8R&ZHhDbxDM4hzDyx|LL+I7I7FfT7RPt;_Jjc;o%0|}4I0|(m0u6ufCz02b zG7%KLpG*@A+~?YL`b3qfQ`Hc7U)hO=^dUhaDrs{E4rtx{UId$SDYf=j*Ll;l8r~>r zp9A+s|1HjD)o0dSr~Omnb6#0iyK)O|-%aLkT;*?WWVJ+TunsugYImZGri59zsSl$Q>JGFMME{|D&}OEfac?Kw-in{ zt8$1&JmO}6iZVn8Em`R)TjLg{yyAux3%G62@j}wW+e)lfUE&>dK3$w`|HdO_Ga3gA zE)8)wbqk1$T^CxQCUnTP!WSd8iUsX4(MOr_coyeftZF{`drFCIWv8Sh3_oppur7R2 zC-Hhy%(r${FuBS`HX5-=Gue6iCzX{vk*BPfUc$a${ae5`wvOxKMbWs3SA3);8nW|6 z==XL7GS=+0tBW|#e@}?+23a8y*Zs!iA=Eq0oZdjz4`k2~XooSn8*&I4vk#L zruX3ZoM03DKJhLfJR~SMI^QO;uJ}%&Sa6k6YsgLu+3wsFqZOWKo*)>m_VQn8pQdm? zS7k=m~1( z7we@2nuZ=yPO_xo5kVY5p&I(E)0kafmP_QM&zLZ?hS|-)(lWhyC&u=omV`OqX(u+> z%1=Cz)mDxa^&?D|pPqyI6|%d^sFYLu*!En#Y?`v|F4IoxGo+P03+$^a{~djiL0E86;zxm?s*~}Kw+k1LVw6C<@sp+ z@|ayb59{G#`A}7A_QuTCGsKLTWXj?ofoDO6qm-07jSPe!I5<>Oo)=LBE0}X?dw@%u zoVOemyyq61X!W>g3Hw&JPv`Q#9f8;4mebhnmocC@{4JgNETuX0IvftS(05r+h}!Xs zx#v|vV|k%-QB5$^seVz_XuKo(w5H)*x`Gl$XpjJBK(+TZ*E}sL`kL-<8szN2PlY?b8m$E&szxm z1$lPqKNg0PX!I5R!3!6EvpQ@(VGI+H>=65ApybB*J5RUZ+?8(igKa(-(I77$@Yil&kQ%Um_NPGw6$s!kMPualgy}!V`n~u z9WIh-lIx-7VcO+UNlHc5xK}@Waq*S}VWM)$>SquEU#;Bb^>(OWZ`Ct6Pf}5zZs5mkh`A6~y4(iSBuG>nLTTEvq(3gU?)# zG!tDDo@k{o@?yf@`IaBSPp0et`8DHyar~2H$fdnOJHl(Pr)M>)5B&e+0o^pGXzSRy z>^-wr_6*55Hj$m3 zIAmvMWp5&6uS(`g6hbzKWY4l45z0t~NdNov{nhiouCA`HG! zghfhs3%-^im6f29ewtC+lA_+24~IgEDIbe^-VeT54{G9&p$|jbwp%)LuM6m&nP9xi zUU)Q%6&O$0i;)4G{fbw6w6Tx#XDRBR_OZEqEzX456} zOMf%!DEg3tlZpCR8`lY449{g*nNZ}+ri6HYA6e(LIKn86P)UDBK18ZxM5L=#PTr9j z-gGF$x<>RDq`+9!%{oBkqGf0IN(VSv(h}(mn=t>hTcn&OXVv*W!9@`oFjIKO&DT;L z+&|<$rZzIulW^7Bsu}T3s@2V6iu+DsFTS$rX&$n8Cm$nSN2)n8+b=Y9zKd#ArH|vg z10(~Ud02_LG8&Tp=Dh38-V@1)h>=TVDU6X#v)8J)U}S$wc2hgVxGBry+-)|Uycue@ zH{pY2+~3V2)AyRhPB+gb&*VNDbeRj(j!YENH=^Iy;EBk*5oqbv^B_CriM^TOMDNUV z%(4b1p|2kwTGjx;69nwdGD{IAzom^Sg@36&C_mIs=BQU(-he$J2BuLcH6d}ze7yF$ z%dfoeWC3G`83gdAEXR~vRUty5eh0nb9^WN}+a@k{d?$o(YIt#j_vB;-r#bih!6PKs z@=58Aalw~1;a-2GzvKY4{iH4$cG6J-O83HBD>TzzW@2g;6SP0#jWPtMwo_va5+9J4 zNG}6u{1_v$^-i6j#TvEov*%>4l1;$C8%anY|4YWR{-W3(+7eRhezKm zG@>4@%C!ziFi%-XCiKSfG`$yw7hlrohbPyGpV8v^;i#GgkC*AC=XcWVCgLs+Oi9Xz zhY&4H#t8fCv67o==Qz`~$e-#>*gevWxn0iRscXnB5{}xra?cFIb{$nzj9mYc^SGjl z4UztuUh~V!huMSDfq6Tk4K zS@)u{&Dr&ym%Vc@YD6Ea4?B03N=MQXcX|e6 zZ~1yRYu_SFRuLdH3`IH|{0{uZ&>A9+mOpW4@9D=sekAAvz^fde>n}OW60;e0TJh|I zqSMu4=k5}@i=#e^ z)Aysk=4%=W+v|yVj{<)=zSyT=NO(JWBTJUxlnm?`s

5d(NLZJijC%9m_9b0w$xO$|(8 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%0AHbvw#qCgx7^b|sO)mqc@GF_b0 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≠19`vYE2e7>tUzF5?FmT+zs3bDDJS( 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

#a-O*K?ODDQyEKwd_ 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 literal 0 HcmV?d00001 diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart index 65728e5..85ab80e 100644 --- a/lib/common/widgets/basic_drawer.dart +++ b/lib/common/widgets/basic_drawer.dart @@ -18,17 +18,17 @@ class _BasicDrawerState extends State { Widget build(BuildContext context) { return Drawer( child: Container( - padding: new EdgeInsets.all(32.0), + padding: new EdgeInsets.all(32), child: ListView( children: [ ListTile( - title: Text ( - "Home", - style: TextStyle(color: Colors.black, fontSize: 20.0), - ), - onTap: () { - Navigator.of(context).pushNamed('/HomePage'); - } + title: Text ( + "Home", + style: TextStyle(color: Colors.black, fontSize: 20.0), + ), + onTap: () { + Navigator.of(context).pushNamed('/HomePage'); + } ), ListTile( title: Text( diff --git a/lib/main.dart b/lib/main.dart index e180def..408b8b3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:local_spend/pages/receipt_page.dart'; import 'package:local_spend/pages/spash_screen.dart'; import 'package:local_spend/pages/about_screen.dart'; import 'package:local_spend/config.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; void main() { runApp(MyApp()); @@ -15,6 +16,15 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { //var config = ConfigWrapper.of(context); return new MaterialApp( + + localizationsDelegates: [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + supportedLocales: [ + Locale("en") + ], + title: "Splash and Token Authentication", theme: new ThemeData( primarySwatch: Colors.blueGrey, diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 93ae53e..0ab6210 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -2,6 +2,10 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter/services.dart'; +import 'package:local_spend/common/apifunctions/request_logout_api.dart'; +import 'package:local_spend/common/functions/get_token.dart'; +import 'package:flutter_fadein/flutter_fadein.dart'; class HomePage extends StatefulWidget { @override @@ -10,6 +14,7 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { @override + void initState() { super.initState(); _saveCurrentRoute("/HomePage"); @@ -25,7 +30,7 @@ class _HomePageState extends State { return PlatformScaffold( appBar: AppBar( title: Text( - "Home Page", + "Navigation", style: TextStyle(color: Colors.black), ), iconTheme: IconThemeData(color: Colors.black), @@ -33,11 +38,54 @@ class _HomePageState extends State { ), drawer: BasicDrawer(), body: Container( - padding: EdgeInsets.all(32.0), - child: Center( + child: FadeIn( + duration: Duration(milliseconds: 500), + curve: Curves.easeIn, + child: Column( children: [ - Text('This is the Home page'), + + ListTile( + contentPadding: EdgeInsets.fromLTRB(0, 15, 0, 0), + title: new Center( + child: new Text( + "Submit Receipt", + style: TextStyle(color: Colors.black, fontSize: 20.0), + textAlign: TextAlign.center, + ), + ), + onTap: () { + // debugPrint('$token'); + Navigator.of(context).pushNamed('/ReceiptPage'); + }, + ), + + ListTile( + title: new Center( + child: new Text( + "About", + style: TextStyle(color: Colors.black, fontSize: 20.0), + ), + ), + onTap: () { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + Navigator.of(context).pushReplacementNamed('/AboutPage'); + }, + ), + + ListTile( + title: new Center( + child: new Text( + "Logout", + style: TextStyle(color: Colors.black, fontSize: 20.0), + ), + ), + onTap: () { + requestLogoutAPI(context); + Navigator.of(context).pushReplacementNamed('/LoginPage'); + }, + + ), ], ), ), diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 9518fdb..8ebb064 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,5 +1,4 @@ import 'dart:async'; - import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -58,7 +57,6 @@ class LoginPageState extends State { @override Widget build(BuildContext context) { - var drawer = Drawer(); return WillPopScope( onWillPop: () { if (Navigator.canPop(context)) { @@ -69,7 +67,7 @@ class LoginPageState extends State { } }, child: PlatformScaffold( - drawer: BasicDrawer(), +// drawer: BasicDrawer(), appBar: AppBar( title: Text( "LOGIN", diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index b316ca7..5141df1 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -12,6 +12,7 @@ import 'package:intl/intl.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; const URL = "https://flutter.io/"; +const demonstration = true; class ReceiptPage extends StatefulWidget { @override @@ -127,12 +128,30 @@ class ReceiptPageState extends State { decoration: InputDecoration( hintText: 'Value in £', ), - obscureText: true, +// obscureText: true, + autocorrect: false, + keyboardType: TextInputType.number, style: TextStyle( fontSize: 18.0, color: Colors.grey[800], fontWeight: FontWeight.bold, ), + onSubmitted: (_) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + + if (demonstration) + { + showDialogSingleButton( + context, + "Success", + "Recepit successfully submitted.", + "OK"); + } + else { + submitReceiptAPI(context, _amountController.text, + _timeController.text); + } + }, ), ), Padding( @@ -142,8 +161,19 @@ class ReceiptPageState extends State { child: RaisedButton( onPressed: () { SystemChannels.textInput.invokeMethod('TextInput.hide'); - submitReceiptAPI(context, _amountController.text, - _timeController.text); + + if (demonstration) + { + showDialogSingleButton( + context, + "Success", + "Recepit successfully submitted.", + "OK"); + } + else { + submitReceiptAPI(context, _amountController.text, + _timeController.text); + } }, child: Text("SUBMIT", style: diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index 955e730..3b7c4c6 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -32,16 +32,17 @@ class _SplashScreenState extends State { return PlatformScaffold( drawer: drawer, body: Container( - decoration: BoxDecoration(color: Colors.black), + decoration: BoxDecoration(color: Colors.white), child: Column( children: [ Expanded( child: Container( - decoration: BoxDecoration(color: Colors.black), + margin: EdgeInsets.all(15), alignment: FractionalOffset(0.5, 0.3), - child: Text( - "Local Loop", - style: TextStyle(fontSize: 40.0, color: Colors.white), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/launch_image.png') + ), ), ), ), @@ -51,7 +52,7 @@ class _SplashScreenState extends State { "© Copyright Statement 2018", style: TextStyle( fontSize: 16.0, - color: Colors.white, + color: Colors.black, ), ), ), diff --git a/pubspec.lock b/pubspec.lock index 331bd50..a1721f3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -160,6 +160,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_fadein: + dependency: "direct main" + description: + name: flutter_fadein + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" flutter_linkify: dependency: "direct main" description: @@ -167,6 +174,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_test: dependency: "direct dev" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 056b22a..a5d9364 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,12 +15,15 @@ environment: dependencies: flutter: sdk: flutter + flutter_localizations: + sdk: flutter shared_preferences: ^0.4.2 url_launcher: ^3.0.3 json_annotation : ^2.2.0 http: ^0.12.0+2 datetime_picker_formfield: ^0.1.8 flutter_linkify: ^1.0.3 + flutter_fadein: ^1.1.1 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. @@ -48,7 +51,10 @@ flutter: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg - + assets: + - assets/ + - assets/images/ + - assets/images/launch_image.png # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.io/assets-and-images/#resolution-aware. From f31a2ae44b21168feffc0a42c23367f0704aca39 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 5 Jul 2019 13:49:36 +0100 Subject: [PATCH 014/122] Who doesn't like a to-do list --- To Do List.rtf | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 To Do List.rtf diff --git a/To Do List.rtf b/To Do List.rtf new file mode 100644 index 0000000..a8c4945 --- /dev/null +++ b/To Do List.rtf @@ -0,0 +1,54 @@ +{\rtf1\ansi\ansicpg1252\cocoartf2476 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid1\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} +{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid102\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid2} +{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid201\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid202\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid3} +{\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid301\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid302\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid4} +{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid401\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid402\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid5}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh9800\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\b\fs38 \cf0 \ul \ulc0 TODO\ +\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 +\ls1\ilvl0\cf0 \ulnone {\listtext \uc0\u8259 } +\f1\b0 Show username\ +\ls1\ilvl0 +\f0\b \ + \ul \ulc0 Splash Screen\ +\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls2\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\f1\b0 Splash screen transition - fade\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ + +\f0\b \ul Login\ +\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls3\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\f1\b0 Full page/ popover\ +\ls3\ilvl1 +\f0\b {\listtext \uc0\u8259 } +\f1\b0 Colours\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ + +\f0\b \ul Navigation\ +\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls4\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\f1\b0 Make it look good\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ + +\f0\b \ul Submit Receipt\ +\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls5\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\f1\b0 Categories\ +{\listtext +\f0\b \uc0\u8259 +\f1\b0 }Recurring\ +{\listtext +\f0\b \uc0\u8259 +\f1\b0 }Essential/non-essential\ +} \ No newline at end of file From 1b98ed6ca0acf6c4b85b902c2a293beb4a733d26 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 5 Jul 2019 15:34:39 +0100 Subject: [PATCH 015/122] Added 'essential purchase' option, its Y position relative to the text still needs sorting out though --- To Do List.rtf | 8 +- .../apifunctions/submit_receipt_api.dart | 27 +++- lib/pages/login_page.dart | 12 +- lib/pages/receipt_page.dart | 120 ++++++++++++++---- 4 files changed, 126 insertions(+), 41 deletions(-) diff --git a/To Do List.rtf b/To Do List.rtf index a8c4945..5e0608e 100644 --- a/To Do List.rtf +++ b/To Do List.rtf @@ -45,10 +45,6 @@ \pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 \ls5\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } \f1\b0 Categories\ -{\listtext -\f0\b \uc0\u8259 -\f1\b0 }Recurring\ -{\listtext -\f0\b \uc0\u8259 -\f1\b0 }Essential/non-essential\ +{\listtext \uc0\u8259 }Recurring\ +{\listtext \uc0\u8259 }Sort out \'91essential purchase\'92 checkbox\'92s Y position\ } \ No newline at end of file diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 70c56f1..c25c5a6 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -10,16 +10,37 @@ import 'package:local_spend/config.dart'; // debug import 'package:flutter/foundation.dart'; +class Receipt { + var amount = ""; + var time = ""; + var street = ""; + var category = ""; + var organisationName = ""; + var postcode = ""; + var recurring = ""; + var town = ""; + + var essential = "false"; +} + Future submitReceiptAPI( - BuildContext context, String amount, String time) async { + BuildContext context, Receipt receipt) async { //var apiUrl = ConfigWrapper.of(context).apiKey; final url = "https://dev.peartrade.org/api/upload"; SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { - 'transaction_value': amount, - 'purchase_time': time, + 'transaction_value': receipt.amount, + 'purchase_time': receipt.time, + 'category': receipt.category, + 'essential': receipt.essential, + 'organisation_name': receipt.organisationName, + 'recurring': receipt.recurring, + 'street_name': receipt.street, + 'town': receipt.town, + 'postcode': receipt.postcode, + 'session_key': preferences.get('LastToken'), }; diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 8ebb064..07d925a 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -55,6 +55,12 @@ class LoginPageState extends State { await preferences.setString('LastPageRoute', lastRoute); } + void login(String username, String password) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + requestLoginAPI(context, username, + password); + } + @override Widget build(BuildContext context) { return WillPopScope( @@ -169,8 +175,7 @@ class LoginPageState extends State { fontWeight: FontWeight.bold, ), onSubmitted: (_) { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - requestLoginAPI(context, _emailController.text, + login( _emailController.text, _passwordController.text); }, ), @@ -181,8 +186,7 @@ class LoginPageState extends State { height: 65.0, child: RaisedButton( onPressed: () { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - requestLoginAPI(context, _emailController.text, + login( _emailController.text, _passwordController.text); // showDialog( // barrierDismissible: false, diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 5141df1..c24f47d 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -54,6 +54,49 @@ class ReceiptPageState extends State { await preferences.setString('LastPageRoute', lastRoute); } + void submitReceipt(String amount, String time) async { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + + if (demonstration) + { + await showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Success"), + content: new Text("Recepit successfully submitted."), + actions: [ + // usually buttons at the bottom of the dialog + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ).then((_) { + Navigator.of(context).pushNamed('/HomePage'); + }); + } + else { + Receipt receipt = new Receipt(); + + // setting up 'receipt' + receipt.amount = amount; + receipt.time = time; + + //TODO: initialise receipt with correct values from form + +// receipt.category = category; +// receipt.etc = etc; + + submitReceiptAPI(context, receipt); + } + } + @override Widget build(BuildContext context) { var drawer = Drawer(); @@ -137,43 +180,64 @@ class ReceiptPageState extends State { fontWeight: FontWeight.bold, ), onSubmitted: (_) { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - - if (demonstration) - { - showDialogSingleButton( - context, - "Success", - "Recepit successfully submitted.", - "OK"); - } - else { - submitReceiptAPI(context, _amountController.text, - _timeController.text); - } + submitReceipt(_amountController.text, _timeController.text); }, ), ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), + + child : Container ( + height: 18, + + child : ListView( + scrollDirection: Axis.horizontal, + + children: [ + Container( + child: Text( + "Essential Purchase", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + child : Padding( + padding: EdgeInsets.fromLTRB(20.0, 0.0, 0, 0), + + child: Checkbox(value: _essentialController.text.toLowerCase() == 'true', onChanged: (bool newValue) { + setState(() { + var newValueString = "false"; + + if (newValue) + { + newValueString = "true"; + } + + _essentialController.text = newValueString; + }); + }), + ), + ), + + ], + ), + ), + ), + + Padding( padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0), child: Container( height: 65.0, child: RaisedButton( onPressed: () { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - - if (demonstration) - { - showDialogSingleButton( - context, - "Success", - "Recepit successfully submitted.", - "OK"); - } - else { - submitReceiptAPI(context, _amountController.text, - _timeController.text); - } + submitReceipt(_amountController.text, _timeController.text); }, child: Text("SUBMIT", style: From ac4b122d074256beb507fac928070da40b7a2da6 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 5 Jul 2019 16:15:09 +0100 Subject: [PATCH 016/122] About screen slightly updated, all transaction options can now be implemented (interface with API is now more complete) --- To Do List.rtf | 43 +++++++++++++++++-------- lib/common/functions/logout.dart | 7 ++++ lib/common/widgets/basic_drawer.dart | 4 +-- lib/pages/about_screen.dart | 48 +++++++++++++++------------- lib/pages/home_page.dart | 4 +-- lib/pages/receipt_page.dart | 1 - 6 files changed, 65 insertions(+), 42 deletions(-) create mode 100644 lib/common/functions/logout.dart diff --git a/To Do List.rtf b/To Do List.rtf index 5e0608e..a7ad29b 100644 --- a/To Do List.rtf +++ b/To Do List.rtf @@ -3,12 +3,14 @@ {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} {\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid1\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} -{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid102\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid2} -{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid201\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid202\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid3} +{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid101\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} +{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid202\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid3} {\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid301\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid302\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid4} -{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid401\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid402\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid5}} -{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}} -\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh9800\viewkind0 +{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid401\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid402\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid5} +{\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid501\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid502\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid6} +{\list\listtemplateid7\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid601\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid7}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh14260\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f0\b\fs38 \cf0 \ul \ulc0 TODO\ @@ -16,35 +18,48 @@ \ls1\ilvl0\cf0 \ulnone {\listtext \uc0\u8259 } \f1\b0 Show username\ \ls1\ilvl0 -\f0\b \ - \ul \ulc0 Splash Screen\ +\f0\b {\listtext \uc0\u8259 }add \'91confirm logout\'92\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 +\ls2\ilvl0\cf0 \ul Splash Screen\ \pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls2\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\ls3\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } \f1\b0 Splash screen transition - fade\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f0\b \ul Login\ +\f0\b \cf0 \ul Login\ \pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls3\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\ls4\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } \f1\b0 Full page/ popover\ -\ls3\ilvl1 +\ls4\ilvl1 \f0\b {\listtext \uc0\u8259 } \f1\b0 Colours\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f0\b \ul Navigation\ +\f0\b \cf0 \ul Navigation\ \pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls4\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\ls5\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } \f1\b0 Make it look good\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ \f0\b \ul Submit Receipt\ \pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls5\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } +\ls6\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } \f1\b0 Categories\ {\listtext \uc0\u8259 }Recurring\ {\listtext \uc0\u8259 }Sort out \'91essential purchase\'92 checkbox\'92s Y position\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\b \cf0 \ul Done\ +\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 +\ls7\ilvl0 +\f1\b0 \cf0 \ulnone {\listtext \uc0\u8259 }submit receipt API implemented more fully so now all transaction options can be submitted\ } \ No newline at end of file diff --git a/lib/common/functions/logout.dart b/lib/common/functions/logout.dart new file mode 100644 index 0000000..8f9ba29 --- /dev/null +++ b/lib/common/functions/logout.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/apifunctions/request_logout_api.dart'; + +logout(context) { + requestLogoutAPI(context); + Navigator.of(context).pushReplacementNamed('/LoginPage'); +} \ No newline at end of file diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart index 85ab80e..f19c835 100644 --- a/lib/common/widgets/basic_drawer.dart +++ b/lib/common/widgets/basic_drawer.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; import 'package:local_spend/common/functions/get_token.dart'; +import 'package:local_spend/common/functions/logout.dart'; // debug import 'package:flutter/foundation.dart'; @@ -57,8 +58,7 @@ class _BasicDrawerState extends State { style: TextStyle(color: Colors.black, fontSize: 20.0), ), onTap: () { - requestLogoutAPI(context); - Navigator.of(context).pushReplacementNamed('/LoginPage'); + logout(context); }, ), ], diff --git a/lib/pages/about_screen.dart b/lib/pages/about_screen.dart index 443ee32..a9b8f27 100644 --- a/lib/pages/about_screen.dart +++ b/lib/pages/about_screen.dart @@ -43,7 +43,7 @@ class _HomePageState extends State { children: [ InkWell( child: const Center(child: Text - ('Link to Pear trading website', + ('Pear Trading', style: TextStyle( fontSize: 20, color: Colors.blue, @@ -55,18 +55,7 @@ class _HomePageState extends State { Padding( padding: EdgeInsets.fromLTRB(0,20,0,0), child: Text( - "Developed by Shadowcat Industries", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0,20,0,0), - child: Text( - "Pear tradings a commerce company designed to register andmonitor money circulating in the local economy.", + "Pear Trading is a commerce company designed to register and monitor money circulating in the local economy.", textAlign: TextAlign.center, style: TextStyle( fontSize: 20.0, @@ -86,7 +75,7 @@ class _HomePageState extends State { ), ), Padding( - padding: EdgeInsets.fromLTRB(0,0,0,20), + padding: EdgeInsets.fromLTRB(0,20,0,0), child: Text( "Phone: +44(0)1524 64544", textAlign: TextAlign.center, @@ -96,17 +85,30 @@ class _HomePageState extends State { ), ), ), - - InkWell( - child: const Center(child: Text - ('Link to Shadowcat website', - style: TextStyle( - fontSize: 20, - color: Colors.blue, + Padding( + padding: EdgeInsets.fromLTRB(0,40,0,0), + child: Text( + "Developed by Shadowcat Industries", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0,20,0,0), + child: InkWell( + child: const Center(child: Text + ('Shadowcat', + style: TextStyle( + fontSize: 20, + color: Colors.blue, + ), ), ), - ), - onTap: () => launch('https://shadow.cat/') + onTap: () => launch('https://shadow.cat/') + ), ), ], ), diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 0ab6210..6b9ae64 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; import 'package:local_spend/common/functions/get_token.dart'; import 'package:flutter_fadein/flutter_fadein.dart'; +import 'package:local_spend/common/functions/logout.dart'; class HomePage extends StatefulWidget { @override @@ -81,8 +82,7 @@ class _HomePageState extends State { ), ), onTap: () { - requestLogoutAPI(context); - Navigator.of(context).pushReplacementNamed('/LoginPage'); + logout(context); }, ), diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index c24f47d..497ef99 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -201,7 +201,6 @@ class ReceiptPageState extends State { style: TextStyle( fontSize: 18.0, color: Colors.black, - fontWeight: FontWeight.bold, ), ), ), From 0c1cacde1ef5bd011972aa299f474d1b1b720ce1 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 5 Jul 2019 22:56:15 +0100 Subject: [PATCH 017/122] Submit Recepit nearly working properly with API, corresponding view has relevant sections, still slightly more to do before working properly --- To Do List.rtf | 1 - .../apifunctions/submit_receipt_api.dart | 8 +- lib/pages/login_page.dart | 2 +- lib/pages/receipt_page.dart | 181 ++++++++++++++---- 4 files changed, 156 insertions(+), 36 deletions(-) diff --git a/To Do List.rtf b/To Do List.rtf index a7ad29b..c11d494 100644 --- a/To Do List.rtf +++ b/To Do List.rtf @@ -53,7 +53,6 @@ \ls6\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } \f1\b0 Categories\ {\listtext \uc0\u8259 }Recurring\ -{\listtext \uc0\u8259 }Sort out \'91essential purchase\'92 checkbox\'92s Y position\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index c25c5a6..b317542 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -31,6 +31,7 @@ Future submitReceiptAPI( SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { + 'transaction_type' : "3", 'transaction_value': receipt.amount, 'purchase_time': receipt.time, 'category': receipt.category, @@ -38,13 +39,15 @@ Future submitReceiptAPI( 'organisation_name': receipt.organisationName, 'recurring': receipt.recurring, 'street_name': receipt.street, - 'town': receipt.town, 'postcode': receipt.postcode, + 'town': receipt.town, + 'session_key': preferences.get('LastToken'), }; debugPrint('$body'); + debugPrint(json.encode(body)); final response = await http.post( url, @@ -64,7 +67,8 @@ Future submitReceiptAPI( showDialogSingleButton( context, "Unable to Submit Receipt", - "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", +// "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", + responseJson.toString(), "OK"); return null; } diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 07d925a..fb2dc19 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -21,7 +21,7 @@ class LoginPage extends StatefulWidget { class LoginPageState extends State { final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); - String _welcomeString = ""; + FocusNode focusNode; // added so focus can move automatically Future launchURL(String url) async { diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 497ef99..5ca39da 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -12,7 +12,7 @@ import 'package:intl/intl.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; const URL = "https://flutter.io/"; -const demonstration = true; +const demonstration = false; class ReceiptPage extends StatefulWidget { @override @@ -29,6 +29,8 @@ class ReceiptPageState extends State { final TextEditingController _typeController = TextEditingController(); final TextEditingController _orgController = TextEditingController(); + FocusNode focusNode; // added so focus can move automatically + DateTime date; Future launchURL(String url) async { @@ -47,6 +49,15 @@ class ReceiptPageState extends State { void initState() { super.initState(); _saveCurrentRoute("/ReceiptPageState"); + + focusNode = FocusNode(); + } + + @override + void dispose() { + super.dispose(); + + focusNode.dispose(); //disposes focus node when form disposed } _saveCurrentRoute(String lastRoute) async { @@ -54,7 +65,7 @@ class ReceiptPageState extends State { await preferences.setString('LastPageRoute', lastRoute); } - void submitReceipt(String amount, String time) async { + void submitReceipt(String amount, String time, String orgName) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); if (demonstration) @@ -86,7 +97,10 @@ class ReceiptPageState extends State { // setting up 'receipt' receipt.amount = amount; - receipt.time = time; + receipt.time = formatDate(time); + receipt.organisationName = orgName; + +// receipt.essential = convertBoolToString(toConvert) //TODO: initialise receipt with correct values from form @@ -97,6 +111,40 @@ class ReceiptPageState extends State { } } + String convertBoolToString(bool toConvert) { + if (toConvert) + { + return "true"; + } + + return "false"; + } + + String formatDate(String date) { +// return ""; + // should be in format: + // yyyy-MM-ddThh:mm:00.000+01:00 + // eg 2019-07-05T10:24:00.000+01.00 (real life example, works) + + // current format = "dd/MM/yyyy 'at' hh:mm" + + var components = new List(5); + + components[0] = (date.substring(0,2)); // dd + components[1] = (date.substring(3,5)); // MM + components[2] = (date.substring(6,10)); // yyyy + components[3] = (date.substring(14,16)); // hh + components[4] = (date.substring(17,19)); // mm + + //print(components); + + return (components[2] + "-" + components[1] + "-" + components[0] + + "T" + components[3] + ":" + components[4] + ":00.000+01:00"); + + // Yes, there is probably a function to convert dates, but I didn't + // know that before writing this and it's done now so I'm keeping it. + } + @override Widget build(BuildContext context) { var drawer = Drawer(); @@ -127,26 +175,29 @@ class ReceiptPageState extends State { padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), child: ListView( children: [ - Container( - alignment: Alignment.topCenter, - child: Padding( - padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), - child: Text( - "Required Fields in bold", - style: TextStyle(fontSize: 20.0, color: Colors.black), - ), - )), - Text( - "Time of Transaction", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, +// Container( +// alignment: Alignment.topCenter, +// child: Padding( +// padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), +// child: Text( +// "Required fields are in bold", +// style: TextStyle(fontSize: 20.0, color: Colors.black), +// ), +// )), + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + child : Text( + "Time of Transaction", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), ), DateTimePickerFormField( inputType: InputType.both, - format: DateFormat("EEEE, MMMM d, yyyy 'at' h:mma"), + format: DateFormat("dd/MM/yyyy 'at' hh:mm"), editable: true, controller: _timeController, decoration: InputDecoration( @@ -154,7 +205,7 @@ class ReceiptPageState extends State { onChanged: (dt) => setState(() => date = dt), ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), child: Text( "Amount", style: TextStyle( @@ -180,13 +231,83 @@ class ReceiptPageState extends State { fontWeight: FontWeight.bold, ), onSubmitted: (_) { - submitReceipt(_amountController.text, _timeController.text); + FocusScope.of(context).requestFocus(focusNode); +// submitReceipt(_amountController.text, _timeController.text); }, ), ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + + child : Container ( + height: 22, // this should be the same height as text + + child : ListView( + scrollDirection: Axis.horizontal, + children: [ + + Container( + child: Text( + "Organization Name", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + child : Padding( + padding: EdgeInsets.fromLTRB(5,0,0,4), + child: FlatButton( + onPressed: () { + debugPrint("TODO: 'find organisation' dialog"); + // Writing this before I forget tomorrow morning: + // Steps to fetch list of organisations with similar name: + // 1) record network activity (requests) of FoodLoop-Web webapp on Firefox + // 2) look at JSON files returned by server when 'organisation name' field's text updates/changes + // 3) look at requests sent to server when web textfield updates and send those from app + // 4) I'm tired + }, + child: Text("Find", + style: + TextStyle(color: Colors.blue, fontSize: 18.0)), + ), + ), + ) + + ], + ), + ), + ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _orgController, + focusNode: focusNode, + decoration: InputDecoration( + hintText: 'Eg. Pear Trading', + ), +// obscureText: true, + autocorrect: true, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + submitReceipt(_amountController.text, + _timeController.text, _orgController.text); + // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry + }, + ), + ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), child : Container ( height: 18, @@ -209,16 +330,12 @@ class ReceiptPageState extends State { child : Padding( padding: EdgeInsets.fromLTRB(20.0, 0.0, 0, 0), - child: Checkbox(value: _essentialController.text.toLowerCase() == 'true', onChanged: (bool newValue) { + child: Checkbox(value: + _essentialController.text.toLowerCase() == 'true', + onChanged: (bool newValue) { setState(() { - var newValueString = "false"; - - if (newValue) - { - newValueString = "true"; - } - - _essentialController.text = newValueString; + _essentialController.text = + convertBoolToString(newValue); }); }), ), @@ -236,7 +353,7 @@ class ReceiptPageState extends State { height: 65.0, child: RaisedButton( onPressed: () { - submitReceipt(_amountController.text, _timeController.text); + submitReceipt(_amountController.text, _timeController.text, _orgController.text); }, child: Text("SUBMIT", style: From b1938df909efe23174defe24571d6365eae136f3 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 5 Jul 2019 22:59:47 +0100 Subject: [PATCH 018/122] to-do file updated --- To Do List.rtf | 64 -------------------------------------------------- To Do List.txt | 22 +++++++++++++++++ 2 files changed, 22 insertions(+), 64 deletions(-) delete mode 100644 To Do List.rtf create mode 100644 To Do List.txt diff --git a/To Do List.rtf b/To Do List.rtf deleted file mode 100644 index c11d494..0000000 --- a/To Do List.rtf +++ /dev/null @@ -1,64 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2476 -\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -{\*\expandedcolortbl;;} -{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid1\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} -{\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid101\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} -{\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid202\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid3} -{\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid301\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid302\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid4} -{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid401\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid402\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid5} -{\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid501\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid502\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid6} -{\list\listtemplateid7\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid601\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid7}} -{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}} -\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh14260\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b\fs38 \cf0 \ul \ulc0 TODO\ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls1\ilvl0\cf0 \ulnone {\listtext \uc0\u8259 } -\f1\b0 Show username\ -\ls1\ilvl0 -\f0\b {\listtext \uc0\u8259 }add \'91confirm logout\'92\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls2\ilvl0\cf0 \ul Splash Screen\ -\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls3\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } -\f1\b0 Splash screen transition - fade\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b \cf0 \ul Login\ -\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls4\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } -\f1\b0 Full page/ popover\ -\ls4\ilvl1 -\f0\b {\listtext \uc0\u8259 } -\f1\b0 Colours\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b \cf0 \ul Navigation\ -\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls5\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } -\f1\b0 Make it look good\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ - -\f0\b \ul Submit Receipt\ -\pard\tx940\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li1440\fi-1440\pardirnatural\partightenfactor0 -\ls6\ilvl1\cf0 \ulnone {\listtext \uc0\u8259 } -\f1\b0 Categories\ -{\listtext \uc0\u8259 }Recurring\ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\cf0 \ -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 - -\f0\b \cf0 \ul Done\ -\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls7\ilvl0 -\f1\b0 \cf0 \ulnone {\listtext \uc0\u8259 }submit receipt API implemented more fully so now all transaction options can be submitted\ -} \ No newline at end of file diff --git a/To Do List.txt b/To Do List.txt new file mode 100644 index 0000000..8f1560f --- /dev/null +++ b/To Do List.txt @@ -0,0 +1,22 @@ +TODO + ⁃ Show username + ⁃ add ‘confirm logout’ + + Splash Screen + ⁃ Splash screen transition - fade + + Login + ⁃ Full page/ popover + ⁃ Colours + ⁃ save login details option (checkbox or something) + + Navigation + ⁃ Make it look good + + Submit Receipt + ⁃ Categories + ⁃ Recurring + ⁃ ‘find’ button displays relevant dialog + +Done + ⁃ submit receipt API implemented more fully so now all transaction options can be submitted From b986b3e574dba23cb96b8e5980d69cdee7f5fe4c Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 8 Jul 2019 11:17:45 +0100 Subject: [PATCH 019/122] Organisations' names request implemented --- lib/pages/login_page.dart | 1 - lib/pages/receipt_page.dart | 47 +++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index fb2dc19..1e01460 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -5,7 +5,6 @@ import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/request_login_api.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; -import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 5ca39da..7e76e01 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -9,6 +10,8 @@ import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:intl/intl.dart'; +import 'package:http/http.dart' as http; +import 'package:local_spend/common/functions/get_token.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; const URL = "https://flutter.io/"; @@ -120,6 +123,39 @@ class ReceiptPageState extends State { return "false"; } + Future findOrganisations(String search) async { + final url = "https://dev.peartrade.org/api/search"; + var token; + + await getToken().then((result) { + token = result; + }); + + Map body = { + "search_name":search, + "session_key":token, + }; + + debugPrint(token.toString() + " " + json.encode(body).toString()); + + final response = await http.post ( + url, + //{"search_name":"bo","session_key":"1C2AB5F0-A163-11E9-BE68-241789E69626"} + body: json.encode(body), + ); + + debugPrint(response.body); + debugPrint(response.statusCode.toString()); + + if (response.statusCode == 200) { + //request successful + return response.body; + } else { + return null; + } + + } + String formatDate(String date) { // return ""; // should be in format: @@ -260,16 +296,13 @@ class ReceiptPageState extends State { Container( child : Padding( - padding: EdgeInsets.fromLTRB(5,0,0,4), + padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints child: FlatButton( onPressed: () { debugPrint("TODO: 'find organisation' dialog"); - // Writing this before I forget tomorrow morning: - // Steps to fetch list of organisations with similar name: - // 1) record network activity (requests) of FoodLoop-Web webapp on Firefox - // 2) look at JSON files returned by server when 'organisation name' field's text updates/changes - // 3) look at requests sent to server when web textfield updates and send those from app - // 4) I'm tired + + findOrganisations(_orgController.text); + }, child: Text("Find", style: From 6c9eb1c115263a9bc35ea5b89b1aa99c1b68dde2 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 8 Jul 2019 11:53:10 +0100 Subject: [PATCH 020/122] Improved api usage, organised my code a bit --- .../apifunctions/find_organisations.dart | 56 +++++++++++++++++++ lib/pages/receipt_page.dart | 40 +------------ 2 files changed, 59 insertions(+), 37 deletions(-) create mode 100644 lib/common/apifunctions/find_organisations.dart diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart new file mode 100644 index 0000000..c39afd7 --- /dev/null +++ b/lib/common/apifunctions/find_organisations.dart @@ -0,0 +1,56 @@ +import 'dart:convert'; +import 'dart:async'; +import 'package:http/http.dart' as http; +import 'package:local_spend/common/functions/get_token.dart'; + +class Organisation { + var id = 0; + var name = ""; + var postcode = ""; + var street_name = ""; + var town = ""; +} + +List jsonToOrganisations(String json) { + Map decoded = jsonDecode(json); + print(decoded); + + List validated = decoded['validated']; +// Map organisation = validated[0]; + + List organisations = new List(); + + validated.forEach((element) => organisations.add(element)); + +// print(organisations); +} + +Future> findOrganisations(String search) async { + final url = "https://dev.peartrade.org/api/search"; + var token; + + await getToken().then((result) { + token = result; + }); + + Map body = { + "search_name":search, + "session_key":token, + }; + + final response = await http.post ( + url, + body: json.encode(body), + ); + + print(response.body); + + if (response.statusCode == 200) { + //request successful + return jsonToOrganisations(response.body); + } else { + // not successful + return null; + } + +} \ No newline at end of file diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 7e76e01..53f126e 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -10,9 +9,8 @@ import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:intl/intl.dart'; -import 'package:http/http.dart' as http; -import 'package:local_spend/common/functions/get_token.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; +import 'package:local_spend/common/apifunctions/find_organisations.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -123,39 +121,6 @@ class ReceiptPageState extends State { return "false"; } - Future findOrganisations(String search) async { - final url = "https://dev.peartrade.org/api/search"; - var token; - - await getToken().then((result) { - token = result; - }); - - Map body = { - "search_name":search, - "session_key":token, - }; - - debugPrint(token.toString() + " " + json.encode(body).toString()); - - final response = await http.post ( - url, - //{"search_name":"bo","session_key":"1C2AB5F0-A163-11E9-BE68-241789E69626"} - body: json.encode(body), - ); - - debugPrint(response.body); - debugPrint(response.statusCode.toString()); - - if (response.statusCode == 200) { - //request successful - return response.body; - } else { - return null; - } - - } - String formatDate(String date) { // return ""; // should be in format: @@ -302,7 +267,7 @@ class ReceiptPageState extends State { debugPrint("TODO: 'find organisation' dialog"); findOrganisations(_orgController.text); - + }, child: Text("Find", style: @@ -334,6 +299,7 @@ class ReceiptPageState extends State { onSubmitted: (_) { submitReceipt(_amountController.text, _timeController.text, _orgController.text); + // TODO: make sure organisation is valid // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry }, ), From d4ca4a0534518e12ef6384e34ffa90e1822d1353 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 8 Jul 2019 15:03:11 +0100 Subject: [PATCH 021/122] 'find organisations' nearly works... --- .../apifunctions/find_organisations.dart | 62 ++++++++++++++++--- lib/common/widgets/popupListView.dart | 52 ++++++++++++++++ lib/pages/login_page.dart | 4 +- lib/pages/receipt_page.dart | 35 ++++++++++- 4 files changed, 141 insertions(+), 12 deletions(-) create mode 100644 lib/common/widgets/popupListView.dart diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index c39afd7..4c6346a 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -7,22 +7,70 @@ class Organisation { var id = 0; var name = ""; var postcode = ""; - var street_name = ""; + var streetName = ""; //street_name var town = ""; + + Organisation(int id, String name, String postcode, String streetName, String town) { + this.id = id; + this.name = name; + this.postcode = postcode; + this.streetName = streetName; //street_name + this.town = town; + } + } List jsonToOrganisations(String json) { Map decoded = jsonDecode(json); - print(decoded); +// print(decoded); - List validated = decoded['validated']; + List validated = decoded['unvalidated']; // Map organisation = validated[0]; - List organisations = new List(); + print(""); + print("Response:"); + for (var i = 0; i < validated.length; i++) { + print(validated[i]); + } - validated.forEach((element) => organisations.add(element)); + List organisationsMaps = new List(); -// print(organisations); + validated.forEach((element) => organisationsMaps.add(element)); + +// print(""); +// print("organisationsMaps:"); +// print(organisationsMaps); + + List organisations = new List(); + +// organisationsMaps[0].forEach((k,v) => print('${k}: ${v}')); + + for (var i = 0; i < organisationsMaps.length; i++) { + final params = organisationsMaps[i].values.toList(); + + var newOrganisation = new Organisation( + params[0].toInt(), + params[1].toString(), + params[2].toString(), // oof + params[3].toString(), // this could be improved... + params[4].toString(), + ); + + organisations.add(newOrganisation); + } + + // the reason some organizations do not show up is because they are not all validated + // option to 'show unvalidated' should be added along with maybe a settings section + + print(""); + print("Local:"); + for (var i = 0; i < organisations.length; i++) + { + print(organisations[i].name); + } + print(""); + + return organisations; } Future> findOrganisations(String search) async { @@ -43,7 +91,7 @@ Future> findOrganisations(String search) async { body: json.encode(body), ); - print(response.body); +// print(response.body); if (response.statusCode == 200) { //request successful diff --git a/lib/common/widgets/popupListView.dart b/lib/common/widgets/popupListView.dart new file mode 100644 index 0000000..2ef18bc --- /dev/null +++ b/lib/common/widgets/popupListView.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +class PopupListView { + List options = new List(); + var context; + String listTitle; + List simpleDialogOptions = new List(); + String result; + + PopupListView(context, List options, String title) { + this.context = context; + this.options = options; + this.listTitle = title; + } + + + List getDialogOptions() { + var dialogOptionsList = new List(); + + for (var i = 0; i < options.length; i++) { + dialogOptionsList.add( + new SimpleDialogOption( + child: Text(options[i]), + onPressed: () { + Navigator.of(this.context).pop(); +// print("Chosen organisation is " + options[i]); + optionChosen(options[i]); + }, + ), + ); + } + + return dialogOptionsList; + } + + Widget dialog() { + return new SimpleDialog( + title: Text(listTitle), + children : getDialogOptions(), + ); + } + + void optionChosen(String option) { + // this works at least... + + + } +} + + + + diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 1e01460..d102639 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -18,8 +18,8 @@ class LoginPage extends StatefulWidget { } class LoginPageState extends State { - final TextEditingController _emailController = TextEditingController(); - final TextEditingController _passwordController = TextEditingController(); + final TextEditingController _emailController = TextEditingController(text: 'test@example.com'); // remove + final TextEditingController _passwordController = TextEditingController(text: 'abc123'); // remove FocusNode focusNode; // added so focus can move automatically diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 53f126e..fa145d1 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -11,6 +11,7 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:intl/intl.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; +import 'package:local_spend/common/widgets/popupListView.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -146,6 +147,32 @@ class ReceiptPageState extends State { // know that before writing this and it's done now so I'm keeping it. } + String listOrganisations(List organisations, context) { + var optionsList = new List(); + + for (var i = 0; i < organisations.length; i++) { + optionsList.add(organisations[i].name); + } + + var popupListView = new PopupListView(context, optionsList, "Choose Organization"); + + popupListView.options = optionsList; + + var dialog = popupListView.dialog(); + +// print(dialog); + + showDialog( + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + + print(popupListView.result); + return popupListView.result; + } + @override Widget build(BuildContext context) { var drawer = Drawer(); @@ -264,10 +291,12 @@ class ReceiptPageState extends State { padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints child: FlatButton( onPressed: () { - debugPrint("TODO: 'find organisation' dialog"); - - findOrganisations(_orgController.text); + var organisations = findOrganisations(_orgController.text); + // some tasty async stuff here yum yum + // and a pretty little dialog too yay + var choice = organisations.then((data) => listOrganisations(data, context)); + // choice is a Future }, child: Text("Find", style: From ad5140e2e690485770142f29760df990974216a4 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 8 Jul 2019 15:34:02 +0100 Subject: [PATCH 022/122] just code trimming, going to read more about ListViews before continuing with 'organization name' section --- lib/common/widgets/popupListView.dart | 6 +++--- lib/pages/about_screen.dart | 2 ++ lib/pages/receipt_page.dart | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/common/widgets/popupListView.dart b/lib/common/widgets/popupListView.dart index 2ef18bc..e4f0128 100644 --- a/lib/common/widgets/popupListView.dart +++ b/lib/common/widgets/popupListView.dart @@ -33,6 +33,8 @@ class PopupListView { return dialogOptionsList; } + + Widget dialog() { return new SimpleDialog( title: Text(listTitle), @@ -41,9 +43,7 @@ class PopupListView { } void optionChosen(String option) { - // this works at least... - - + // now pass `option` to } } diff --git a/lib/pages/about_screen.dart b/lib/pages/about_screen.dart index a9b8f27..2c20bcd 100644 --- a/lib/pages/about_screen.dart +++ b/lib/pages/about_screen.dart @@ -67,6 +67,7 @@ class _HomePageState extends State { padding: EdgeInsets.fromLTRB(0,20,0,0), child: Text( "Email: Test@admin.com", + // TODO: Make this an @email link textAlign: TextAlign.center, style: TextStyle( fontSize: 18.0, @@ -78,6 +79,7 @@ class _HomePageState extends State { padding: EdgeInsets.fromLTRB(0,20,0,0), child: Text( "Phone: +44(0)1524 64544", + // TODO: Make this a @phone link textAlign: TextAlign.center, style: TextStyle( fontSize: 18.0, diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index fa145d1..7b13c4c 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -129,6 +129,7 @@ class ReceiptPageState extends State { // eg 2019-07-05T10:24:00.000+01.00 (real life example, works) // current format = "dd/MM/yyyy 'at' hh:mm" + // 0123456789ABCDEFGHIJK var components = new List(5); @@ -156,8 +157,6 @@ class ReceiptPageState extends State { var popupListView = new PopupListView(context, optionsList, "Choose Organization"); - popupListView.options = optionsList; - var dialog = popupListView.dialog(); // print(dialog); From bd5ac307d365f99628e41cb7355cee570e8dd16d Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 9 Jul 2019 10:26:33 +0100 Subject: [PATCH 023/122] Login screen now looks very sexy --- To Do List.txt | 7 +- lib/pages/home_page.dart | 2 +- lib/pages/login_page.dart | 165 ++++++++++++--------------- lib/pages/login_page_new.dart | 209 ++++++++++++++++++++++++++++++++++ lib/pages/spash_screen.dart | 6 +- 5 files changed, 289 insertions(+), 100 deletions(-) create mode 100644 lib/pages/login_page_new.dart diff --git a/To Do List.txt b/To Do List.txt index 8f1560f..6617c34 100644 --- a/To Do List.txt +++ b/To Do List.txt @@ -6,8 +6,6 @@ TODO ⁃ Splash screen transition - fade Login - ⁃ Full page/ popover - ⁃ Colours ⁃ save login details option (checkbox or something) Navigation @@ -16,7 +14,4 @@ TODO Submit Receipt ⁃ Categories ⁃ Recurring - ⁃ ‘find’ button displays relevant dialog - -Done - ⁃ submit receipt API implemented more fully so now all transaction options can be submitted + ⁃ 'organisation name' dialog works diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 6b9ae64..35dc251 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -39,6 +39,7 @@ class _HomePageState extends State { ), drawer: BasicDrawer(), body: Container( + padding: EdgeInsets.fromLTRB(0, 15, 0, 0), child: FadeIn( duration: Duration(milliseconds: 500), curve: Curves.easeIn, @@ -47,7 +48,6 @@ class _HomePageState extends State { children: [ ListTile( - contentPadding: EdgeInsets.fromLTRB(0, 15, 0, 0), title: new Center( child: new Text( "Submit Receipt", diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index d102639..351ed25 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -18,8 +18,8 @@ class LoginPage extends StatefulWidget { } class LoginPageState extends State { - final TextEditingController _emailController = TextEditingController(text: 'test@example.com'); // remove - final TextEditingController _passwordController = TextEditingController(text: 'abc123'); // remove + final TextEditingController _emailController = TextEditingController(/*text: 'test@example.com'*/); // remove + final TextEditingController _passwordController = TextEditingController(/*text: 'abc123'*/); // remove FocusNode focusNode; // added so focus can move automatically @@ -73,70 +73,39 @@ class LoginPageState extends State { }, child: PlatformScaffold( // drawer: BasicDrawer(), - appBar: AppBar( - title: Text( - "LOGIN", - style: TextStyle( - fontSize: 30.0, - color: Colors.black, - ), - ), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), - ), +// body: Container( +// decoration: BoxDecoration(color: Colors.white), +// margin: const EdgeInsets.all(20), +// child: Padding( +// padding: EdgeInsets.fromLTRB(30.0, 170.0, 30.0, 0.0), +// child: ListView( +// children: [ body: Container( - child: Padding( - padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), - child: ListView( + decoration: BoxDecoration(color: Colors.white), + child: Container( + margin: EdgeInsets.fromLTRB(60,0,60,0), + child: Column( children: [ - Container( - alignment: Alignment.topCenter, - child: Padding( - padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), - child: Text( - "Local Loop", - style: TextStyle(fontSize: 40.0, color: Colors.black), + Expanded( + child: Container( + margin: EdgeInsets.fromLTRB(15,0,15,0), +// alignment: FractionalOffset(0.5, 0.3), // not sure what this does ngl :/ + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/launch_image.png') ), - )), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 78.0), - child: RichText( - text: TextSpan( - children: [ - TextSpan( - text: - 'This is the logon page.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - TextSpan( - text: - ' It is currently in development.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - ], ), ), ), - Text( - "Email", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), child: TextField( + autocorrect: false, + textAlign: TextAlign.center, controller: _emailController, decoration: InputDecoration( - hintText: "Use your login email", + hintText: "EMAIL", + hintStyle: TextStyle(fontSize: 15), ), style: TextStyle( fontSize: 18.0, @@ -149,23 +118,15 @@ class LoginPageState extends State { ), ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), - child: Text( - "Password", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + padding: EdgeInsets.fromLTRB(0.0, 15.0, 0.0, 0.0), child: TextField( + autocorrect: false, + textAlign: TextAlign.center, controller: _passwordController, focusNode: focusNode, decoration: InputDecoration( - hintText: 'Your password, keep it secret, keep it safe.', + hintText: 'PASSWORD', + hintStyle: TextStyle(fontSize: 15), ), obscureText: true, style: TextStyle( @@ -173,30 +134,54 @@ class LoginPageState extends State { color: Colors.grey[800], fontWeight: FontWeight.bold, ), - onSubmitted: (_) { - login( _emailController.text, - _passwordController.text); - }, + onSubmitted: (_) { + login( _emailController.text, + _passwordController.text); + }, ), ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0), - child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - login( _emailController.text, - _passwordController.text); -// showDialog( -// barrierDismissible: false, -// ); -// print("pressed"); - }, - child: Text("LOGIN", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), - color: Colors.blue, +// Padding( +// padding: EdgeInsets.fromLTRB(0.0, 25.0, 0.0, 100.0), +// child: Container( +// height: 45.0, +// child: RaisedButton( +// +// onPressed: () { +// login( _emailController.text, +// _passwordController.text); +// // showDialog( +// // barrierDismissible: false, +// // ); +// // print("pressed"); +// }, +// child: Text("GO", +// style: +// TextStyle(color: Colors.white, fontSize: 20.0)), +// color: Colors.blue, +// ), +// ), +// ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 100.0), + + child : Material( + child : InkWell( + onTap: () => login( _emailController.text, _passwordController.text), + child: new Container( + width: 100, + height: 50, + decoration: new BoxDecoration( +// color: Colors.lightBlueAccent, + borderRadius: new BorderRadius.circular(0.0), + ), + child: new Center( + child: new Text( + 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), + ), + ), + splashColor: Colors.lightBlueAccent, ), + color: Colors.blueAccent, ), ), ], diff --git a/lib/pages/login_page_new.dart b/lib/pages/login_page_new.dart new file mode 100644 index 0000000..612fe72 --- /dev/null +++ b/lib/pages/login_page_new.dart @@ -0,0 +1,209 @@ +import 'dart:async'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_spend/common/apifunctions/request_login_api.dart'; +import 'package:local_spend/common/functions/show_dialog_single_button.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher.dart'; + +const URL = "https://flutter.io/"; + +class LoginPage extends StatefulWidget { + @override + State createState() { + return new LoginPageState(); + } +} + +class LoginPageState extends State { + final TextEditingController _emailController = TextEditingController(text: 'test@example.com'); // remove + final TextEditingController _passwordController = TextEditingController(text: 'abc123'); // remove + + FocusNode focusNode; // added so focus can move automatically + + Future launchURL(String url) async { + if (await canLaunch(url)) { + await launch(url, forceSafariVC: true, forceWebView: true); + } else { + showDialogSingleButton( + context, + "Unable to reach your website.", + "Currently unable to reach the website $URL. Please try again at a later time.", + "OK"); + } + } + + @override + void initState() { + super.initState(); + _saveCurrentRoute("/LoginPage"); + + focusNode = FocusNode(); + } + + @override + void dispose() { + focusNode.dispose(); //disposes focus node when form disposed + super.dispose(); + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastPageRoute', lastRoute); + } + + void login(String username, String password) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + requestLoginAPI(context, username, + password); + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () { + if (Navigator.canPop(context)) { + Navigator.of(context).pushNamedAndRemoveUntil( + '/HomePage', (Route route) => false); + } else { + Navigator.of(context).pushReplacementNamed('/HomePage'); + } + }, + child: PlatformScaffold( +// drawer: BasicDrawer(), + appBar: AppBar( + title: Text( + "LOGIN", + style: TextStyle( + fontSize: 30.0, + color: Colors.black, + ), + ), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), + body: Container( + child: Padding( + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: ListView( + children: [ + Container( + alignment: Alignment.topCenter, + child: Padding( + padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), + child: Text( + "Local Loop", + style: TextStyle(fontSize: 40.0, color: Colors.black), + ), + )), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 78.0), + child: RichText( + text: TextSpan( + children: [ + TextSpan( + text: + 'This is the logon page.', + style: new TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + TextSpan( + text: + ' It is currently in development.', + style: new TextStyle( + fontSize: 20.0, + color: Colors.black, + ), + ), + ], + ), + ), + ), + Text( + "EMAIL", + style: TextStyle( + fontSize: 16.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _emailController, + decoration: InputDecoration( + hintText: "Use your login email", + ), + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + FocusScope.of(context).requestFocus(focusNode); + }, + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), + child: Text( + "PASSWORD", + style: TextStyle( + fontSize: 16.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _passwordController, + focusNode: focusNode, + decoration: InputDecoration( + hintText: 'Your password, keep it secret, keep it safe.', + ), + obscureText: true, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + login( _emailController.text, + _passwordController.text); + }, + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + login( _emailController.text, + _passwordController.text); +// showDialog( +// barrierDismissible: false, +// ); +// print("pressed"); + }, + child: Text("LOGIN", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.blue, + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index 3b7c4c6..f3944f2 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -40,9 +40,9 @@ class _SplashScreenState extends State { margin: EdgeInsets.all(15), alignment: FractionalOffset(0.5, 0.3), decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/launch_image.png') - ), + image: DecorationImage( + image: AssetImage('assets/images/launch_image.png') + ), ), ), ), From c9ce563564fa449b1c626f9ef1e8fa2ebc915392 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 9 Jul 2019 10:28:53 +0100 Subject: [PATCH 024/122] renamed old login screen appropriately --- lib/pages/{login_page_new.dart => login_page_old.dart} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/pages/{login_page_new.dart => login_page_old.dart} (100%) diff --git a/lib/pages/login_page_new.dart b/lib/pages/login_page_old.dart similarity index 100% rename from lib/pages/login_page_new.dart rename to lib/pages/login_page_old.dart From c389e2e005f33a731f7490b4a6a5df3ece139981 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 9 Jul 2019 11:52:25 +0100 Subject: [PATCH 025/122] login form has 'save login' option (doesn't function yet) and layout looks peng --- lib/common/widgets/custom_checkbox.dart | 395 +++++++++++++++++++++++ lib/common/widgets/labeled_checkbox.dart | 132 ++++++++ lib/pages/login_page.dart | 25 +- 3 files changed, 551 insertions(+), 1 deletion(-) create mode 100644 lib/common/widgets/custom_checkbox.dart create mode 100644 lib/common/widgets/labeled_checkbox.dart diff --git a/lib/common/widgets/custom_checkbox.dart b/lib/common/widgets/custom_checkbox.dart new file mode 100644 index 0000000..f11be2d --- /dev/null +++ b/lib/common/widgets/custom_checkbox.dart @@ -0,0 +1,395 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:math' as math; + +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; + +import 'package:flutter/material.dart'; + +/// A material design checkbox. +/// +/// The checkbox itself does not maintain any state. Instead, when the state of +/// the checkbox changes, the widget calls the [onChanged] callback. Most +/// widgets that use a checkbox will listen for the [onChanged] callback and +/// rebuild the checkbox with a new [value] to update the visual appearance of +/// the checkbox. +/// +/// The checkbox can optionally display three values - true, false, and null - +/// if [tristate] is true. When [value] is null a dash is displayed. By default +/// [tristate] is false and the checkbox's [value] must be true or false. +/// +/// Requires one of its ancestors to be a [Material] widget. +/// +/// See also: +/// +/// * [CheckboxListTile], which combines this widget with a [ListTile] so that +/// you can give the checkbox a label. +/// * [Switch], a widget with semantics similar to [CustomCheckbox]. +/// * [Radio], for selecting among a set of explicit values. +/// * [Slider], for selecting a value in a range. +/// * +/// * +class CustomCheckbox extends StatefulWidget { + /// Creates a material design checkbox. + /// + /// The checkbox itself does not maintain any state. Instead, when the state of + /// the checkbox changes, the widget calls the [onChanged] callback. Most + /// widgets that use a checkbox will listen for the [onChanged] callback and + /// rebuild the checkbox with a new [value] to update the visual appearance of + /// the checkbox. + /// + /// The following arguments are required: + /// + /// * [value], which determines whether the checkbox is checked. The [value] + /// can only be null if [tristate] is true. + /// * [onChanged], which is called when the value of the checkbox should + /// change. It can be set to null to disable the checkbox. + /// + /// The value of [tristate] must not be null. + const CustomCheckbox({ + Key key, + @required this.value, + this.tristate = false, + @required this.onChanged, + this.activeColor, + this.checkColor, + this.materialTapTargetSize, + this.useTapTarget = true, + }) : assert(tristate != null), + assert(tristate || value != null), + super(key: key); + + + + final bool useTapTarget; + + /// Whether this checkbox is checked. + /// + /// This property must not be null. + final bool value; + + /// Called when the value of the checkbox should change. + /// + /// The checkbox passes the new value to the callback but does not actually + /// change state until the parent widget rebuilds the checkbox with the new + /// value. + /// + /// If this callback is null, the checkbox will be displayed as disabled + /// and will not respond to input gestures. + /// + /// When the checkbox is tapped, if [tristate] is false (the default) then + /// the [onChanged] callback will be applied to `!value`. If [tristate] is + /// true this callback cycle from false to true to null. + /// + /// The callback provided to [onChanged] should update the state of the parent + /// [StatefulWidget] using the [State.setState] method, so that the parent + /// gets rebuilt; for example: + /// + /// ```dart + /// Checkbox( + /// value: _throwShotAway, + /// onChanged: (bool newValue) { + /// setState(() { + /// _throwShotAway = newValue; + /// }); + /// }, + /// ) + /// ``` + final ValueChanged onChanged; + + /// The color to use when this checkbox is checked. + /// + /// Defaults to [ThemeData.toggleableActiveColor]. + final Color activeColor; + + /// The color to use for the check icon when this checkbox is checked + /// + /// Defaults to Color(0xFFFFFFFF) + final Color checkColor; + + /// If true the checkbox's [value] can be true, false, or null. + /// + /// Checkbox displays a dash when its value is null. + /// + /// When a tri-state checkbox is tapped its [onChanged] callback will be + /// applied to true if the current value is null or false, false otherwise. + /// Typically tri-state checkboxes are disabled (the onChanged callback is + /// null) so they don't respond to taps. + /// + /// If tristate is false (the default), [value] must not be null. + final bool tristate; + + /// Configures the minimum size of the tap target. + /// + /// Defaults to [ThemeData.materialTapTargetSize]. + /// + /// See also: + /// + /// * [MaterialTapTargetSize], for a description of how this affects tap targets. + final MaterialTapTargetSize materialTapTargetSize; + + /// The width of a checkbox widget. + static const double width = 18.0; + + @override + _CustomCheckboxState createState() => _CustomCheckboxState(); +} + +class _CustomCheckboxState extends State with TickerProviderStateMixin { + @override + Widget build(BuildContext context) { + assert(debugCheckHasMaterial(context)); + final ThemeData themeData = Theme.of(context); + + Size size; + switch (widget.materialTapTargetSize ?? themeData.materialTapTargetSize) { + case MaterialTapTargetSize.padded: + size = const Size(2 * kRadialReactionRadius + 8.0, 2 * kRadialReactionRadius + 8.0); + break; + case MaterialTapTargetSize.shrinkWrap: + size = const Size(2 * kRadialReactionRadius, 2 * kRadialReactionRadius); + break; + } + + Size noTapTargetSize = Size(CustomCheckbox.width, + CustomCheckbox.width); + final BoxConstraints additionalConstraints = + BoxConstraints.tight(widget + .useTapTarget? size : noTapTargetSize); + + return _CheckboxRenderObjectWidget( + value: widget.value, + tristate: widget.tristate, + activeColor: widget.activeColor ?? themeData.toggleableActiveColor, + checkColor: widget.checkColor ?? const Color(0xFFFFFFFF), + inactiveColor: widget.onChanged != null ? themeData.unselectedWidgetColor : themeData.disabledColor, + onChanged: widget.onChanged, + additionalConstraints: additionalConstraints, + vsync: this, + ); + } +} + +class _CheckboxRenderObjectWidget extends LeafRenderObjectWidget { + const _CheckboxRenderObjectWidget({ + Key key, + @required this.value, + @required this.tristate, + @required this.activeColor, + @required this.checkColor, + @required this.inactiveColor, + @required this.onChanged, + @required this.vsync, + @required this.additionalConstraints, + this.useTapTarget = true + + }) : assert(tristate != null), + assert(tristate || value != null), + assert(activeColor != null), + assert(inactiveColor != null), + assert(vsync != null), + super(key: key); + + final bool value; + final bool tristate; + final Color activeColor; + final Color checkColor; + final Color inactiveColor; + final ValueChanged onChanged; + final TickerProvider vsync; + final BoxConstraints additionalConstraints; + final bool useTapTarget; + + @override + _RenderCheckbox createRenderObject(BuildContext context) => _RenderCheckbox( + value: value, + tristate: tristate, + activeColor: activeColor, + checkColor: checkColor, + inactiveColor: inactiveColor, + onChanged: onChanged, + vsync: vsync, + additionalConstraints: additionalConstraints, + ); + + @override + void updateRenderObject(BuildContext context, _RenderCheckbox renderObject) { + renderObject + ..value = value + ..tristate = tristate + ..activeColor = activeColor + ..checkColor = checkColor + ..inactiveColor = inactiveColor + ..onChanged = onChanged + ..additionalConstraints = additionalConstraints + ..vsync = vsync; + } +} + +const double _kEdgeSize = CustomCheckbox.width; +const Radius _kEdgeRadius = Radius.circular(1.0); +const double _kStrokeWidth = 2.0; + +class _RenderCheckbox extends RenderToggleable { + _RenderCheckbox({ + bool value, + bool tristate, + Color activeColor, + this.checkColor, + Color inactiveColor, + BoxConstraints additionalConstraints, + ValueChanged onChanged, + @required TickerProvider vsync, + }) : _oldValue = value, + super( + value: value, + tristate: tristate, + activeColor: activeColor, + inactiveColor: inactiveColor, + onChanged: onChanged, + additionalConstraints: additionalConstraints, + vsync: vsync, + ); + + bool _oldValue; + Color checkColor; + + @override + set value(bool newValue) { + if (newValue == value) + return; + _oldValue = value; + super.value = newValue; + } + + @override + void describeSemanticsConfiguration(SemanticsConfiguration config) { + super.describeSemanticsConfiguration(config); + config.isChecked = value == true; + } + + // The square outer bounds of the checkbox at t, with the specified origin. + // At t == 0.0, the outer rect's size is _kEdgeSize (Checkbox.width) + // At t == 0.5, .. is _kEdgeSize - _kStrokeWidth + // At t == 1.0, .. is _kEdgeSize + RRect _outerRectAt(Offset origin, double t) { + final double inset = 1.0 - (t - 0.5).abs() * 2.0; + final double size = _kEdgeSize - inset * _kStrokeWidth; + final Rect rect = Rect.fromLTWH(origin.dx + inset, origin.dy + inset, size, size); + return RRect.fromRectAndRadius(rect, _kEdgeRadius); + } + + // The checkbox's border color if value == false, or its fill color when + // value == true or null. + Color _colorAt(double t) { + // As t goes from 0.0 to 0.25, animate from the inactiveColor to activeColor. + return onChanged == null + ? inactiveColor + : (t >= 0.25 ? activeColor : Color.lerp(inactiveColor, activeColor, t * 4.0)); + } + + // White stroke used to paint the check and dash. + void _initStrokePaint(Paint paint) { + paint + ..color = checkColor + ..style = PaintingStyle.stroke + ..strokeWidth = _kStrokeWidth; + } + + void _drawBorder(Canvas canvas, RRect outer, double t, Paint paint) { + assert(t >= 0.0 && t <= 0.5); + final double size = outer.width; + // As t goes from 0.0 to 1.0, gradually fill the outer RRect. + final RRect inner = outer.deflate(math.min(size / 2.0, _kStrokeWidth + size * t)); + canvas.drawDRRect(outer, inner, paint); + } + + void _drawCheck(Canvas canvas, Offset origin, double t, Paint paint) { + assert(t >= 0.0 && t <= 1.0); + // As t goes from 0.0 to 1.0, animate the two check mark strokes from the + // short side to the long side. + final Path path = Path(); + const Offset start = Offset(_kEdgeSize * 0.15, _kEdgeSize * 0.45); + const Offset mid = Offset(_kEdgeSize * 0.4, _kEdgeSize * 0.7); + const Offset end = Offset(_kEdgeSize * 0.85, _kEdgeSize * 0.25); + if (t < 0.5) { + final double strokeT = t * 2.0; + final Offset drawMid = Offset.lerp(start, mid, strokeT); + path.moveTo(origin.dx + start.dx, origin.dy + start.dy); + path.lineTo(origin.dx + drawMid.dx, origin.dy + drawMid.dy); + } else { + final double strokeT = (t - 0.5) * 2.0; + final Offset drawEnd = Offset.lerp(mid, end, strokeT); + path.moveTo(origin.dx + start.dx, origin.dy + start.dy); + path.lineTo(origin.dx + mid.dx, origin.dy + mid.dy); + path.lineTo(origin.dx + drawEnd.dx, origin.dy + drawEnd.dy); + } + canvas.drawPath(path, paint); + } + + void _drawDash(Canvas canvas, Offset origin, double t, Paint paint) { + assert(t >= 0.0 && t <= 1.0); + // As t goes from 0.0 to 1.0, animate the horizontal line from the + // mid point outwards. + const Offset start = Offset(_kEdgeSize * 0.2, _kEdgeSize * 0.5); + const Offset mid = Offset(_kEdgeSize * 0.5, _kEdgeSize * 0.5); + const Offset end = Offset(_kEdgeSize * 0.8, _kEdgeSize * 0.5); + final Offset drawStart = Offset.lerp(start, mid, 1.0 - t); + final Offset drawEnd = Offset.lerp(mid, end, t); + canvas.drawLine(origin + drawStart, origin + drawEnd, paint); + } + + @override + void paint(PaintingContext context, Offset offset) { + final Canvas canvas = context.canvas; + paintRadialReaction(canvas, offset, size.center(Offset.zero)); + + final Offset origin = offset + (size / 2.0 - const Size.square(_kEdgeSize) / 2.0); + final AnimationStatus status = position.status; + final double tNormalized = status == AnimationStatus.forward || status == AnimationStatus.completed + ? position.value + : 1.0 - position.value; + + // Four cases: false to null, false to true, null to false, true to false + if (_oldValue == false || value == false) { + final double t = value == false ? 1.0 - tNormalized : tNormalized; + final RRect outer = _outerRectAt(origin, t); + final Paint paint = Paint()..color = _colorAt(t); + + if (t <= 0.5) { + _drawBorder(canvas, outer, t, paint); + } else { + canvas.drawRRect(outer, paint); + + _initStrokePaint(paint); + final double tShrink = (t - 0.5) * 2.0; + if (_oldValue == null || value == null) + _drawDash(canvas, origin, tShrink, paint); + else + _drawCheck(canvas, origin, tShrink, paint); + } + } else { // Two cases: null to true, true to null + final RRect outer = _outerRectAt(origin, 1.0); + final Paint paint = Paint() ..color = _colorAt(1.0); + canvas.drawRRect(outer, paint); + + _initStrokePaint(paint); + if (tNormalized <= 0.5) { + final double tShrink = 1.0 - tNormalized * 2.0; + if (_oldValue == true) + _drawCheck(canvas, origin, tShrink, paint); + else + _drawDash(canvas, origin, tShrink, paint); + } else { + final double tExpand = (tNormalized - 0.5) * 2.0; + if (value == true) + _drawCheck(canvas, origin, tExpand, paint); + else + _drawDash(canvas, origin, tExpand, paint); + } + } + } +} diff --git a/lib/common/widgets/labeled_checkbox.dart b/lib/common/widgets/labeled_checkbox.dart new file mode 100644 index 0000000..ad39d8c --- /dev/null +++ b/lib/common/widgets/labeled_checkbox.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/widgets/custom_checkbox.dart'; + +class LabeledCheckboxWithIcon extends StatelessWidget { + const LabeledCheckboxWithIcon({ + this.label, + this.textStyle, + this.icon, +// this.iconSize, + this.iconColor, + this.padding, + this.value, + this.onChanged, + }); + + final String label; + final TextStyle textStyle; + final IconData icon; +// final double iconSize; + final Color iconColor; + final EdgeInsets padding; + final bool value; + final Function onChanged; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + onChanged(!value); + }, + + + child: Padding( + padding: padding, + + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + + children: [ + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 0), + child : Icon( + icon, +// size: iconSize, + color: iconColor, + ), + ), + + Expanded(child: Text(label, style: textStyle, textAlign: TextAlign.center,)), + + CustomCheckbox( + //custom checkbox removes padding so the form looks nice + + value: value, + useTapTarget: false, + onChanged: (bool newValue) { + onChanged(newValue); + }, + ), + ], + ), + ), + ); + } +} + +class LabeledCheckbox extends StatelessWidget { + const LabeledCheckbox({ + this.label, + this.textStyle, + this.padding, + this.value, + this.onChanged, + }); + + final String label; + final TextStyle textStyle; + final EdgeInsets padding; + final bool value; + final Function onChanged; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + onChanged(!value); + }, + child: Padding( + padding: padding, + + child: Row( + children: [ + Expanded(child: Text(label, style: textStyle)), + + Checkbox( + value: value, + onChanged: (bool newValue) { + onChanged(newValue); + }, + ), + ], + ), + ), + ); + } +} + + +/* +//USAGE: + +bool _isSelected = false; + +@override +Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: LabeledCheckbox( + label: 'Label Text Here', + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + value: _isSelected, + + onChanged: (bool newValue) { + setState(() { + _isSelected = newValue; + }); + }, + ), + ), + ); +} +*/ \ No newline at end of file diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 351ed25..4f478ad 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -7,6 +7,7 @@ import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:local_spend/common/widgets/labeled_checkbox.dart'; const URL = "https://flutter.io/"; @@ -20,6 +21,8 @@ class LoginPage extends StatefulWidget { class LoginPageState extends State { final TextEditingController _emailController = TextEditingController(/*text: 'test@example.com'*/); // remove final TextEditingController _passwordController = TextEditingController(/*text: 'abc123'*/); // remove + bool _saveLoginDetails = true; // I am extremely sorry for the placement of this variable + // it will be fixed soon I promise FocusNode focusNode; // added so focus can move automatically @@ -162,7 +165,7 @@ class LoginPageState extends State { // ), // ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 100.0), + padding: EdgeInsets.fromLTRB(0.0, 25.0, 0.0, 15.0), child : Material( child : InkWell( @@ -184,6 +187,26 @@ class LoginPageState extends State { color: Colors.blueAccent, ), ), + + Padding( + padding: EdgeInsets.fromLTRB(0, 10, 0, 50), + + child: LabeledCheckboxWithIcon( + label : "SAVE LOGIN", + textStyle: TextStyle(fontSize: 18, color: Colors.black54, fontWeight: FontWeight.bold), + icon: Icons.account_box, +// iconSize: 18, + iconColor: Colors.black54, + padding: const EdgeInsets.fromLTRB(0,0,0,0), + value : _saveLoginDetails, + + onChanged: (bool newValue) { + setState(() { + _saveLoginDetails = newValue; + }); + }, + ), + ), ], ), ), From 2d0b6230ae0ac9e3669fcb65c90363bb1bf1c0fe Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 9 Jul 2019 12:44:05 +0100 Subject: [PATCH 026/122] slightly nicer login page (no icon although it can be easily added back) --- ios/Podfile.lock | 4 ++-- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/widgets/labeled_checkbox.dart | 19 +++++++++++------- lib/pages/login_page.dart | 25 ++++++++++++++++++------ 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f5bffe1..81f2036 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a83a4d3..dff0209 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/widgets/labeled_checkbox.dart b/lib/common/widgets/labeled_checkbox.dart index ad39d8c..a97d9c9 100644 --- a/lib/common/widgets/labeled_checkbox.dart +++ b/lib/common/widgets/labeled_checkbox.dart @@ -6,7 +6,7 @@ class LabeledCheckboxWithIcon extends StatelessWidget { this.label, this.textStyle, this.icon, -// this.iconSize, + this.iconSize, this.iconColor, this.padding, this.value, @@ -16,7 +16,7 @@ class LabeledCheckboxWithIcon extends StatelessWidget { final String label; final TextStyle textStyle; final IconData icon; -// final double iconSize; + final double iconSize; final Color iconColor; final EdgeInsets padding; final bool value; @@ -34,14 +34,16 @@ class LabeledCheckboxWithIcon extends StatelessWidget { padding: padding, child: Row( - crossAxisAlignment: CrossAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, //doesn't do anything children: [ - Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, 0), + Container( + padding: EdgeInsets.all(0), + width: iconSize, + child : Icon( icon, -// size: iconSize, + // size: iconSize, color: iconColor, ), ), @@ -92,8 +94,11 @@ class LabeledCheckbox extends StatelessWidget { children: [ Expanded(child: Text(label, style: textStyle)), - Checkbox( + CustomCheckbox( + //custom checkbox removes padding so the form looks nice + value: value, + useTapTarget: false, onChanged: (bool newValue) { onChanged(newValue); }, diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 4f478ad..e50c9f8 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -86,7 +86,7 @@ class LoginPageState extends State { body: Container( decoration: BoxDecoration(color: Colors.white), child: Container( - margin: EdgeInsets.fromLTRB(60,0,60,0), + margin: EdgeInsets.fromLTRB(60,30,60,0), child: Column( children: [ Expanded( @@ -165,7 +165,7 @@ class LoginPageState extends State { // ), // ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 25.0, 0.0, 15.0), + padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0), child : Material( child : InkWell( @@ -191,12 +191,9 @@ class LoginPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0, 10, 0, 50), - child: LabeledCheckboxWithIcon( + child: LabeledCheckbox( label : "SAVE LOGIN", textStyle: TextStyle(fontSize: 18, color: Colors.black54, fontWeight: FontWeight.bold), - icon: Icons.account_box, -// iconSize: 18, - iconColor: Colors.black54, padding: const EdgeInsets.fromLTRB(0,0,0,0), value : _saveLoginDetails, @@ -206,6 +203,22 @@ class LoginPageState extends State { }); }, ), + + /*child: LabeledCheckboxWithIcon( + label : "SAVE LOGIN", + textStyle: TextStyle(fontSize: 18, color: Colors.black54, fontWeight: FontWeight.bold), + icon: Icons.account_box, // need to remove icon padding!! + iconSize: 18, + iconColor: Colors.black54, + padding: const EdgeInsets.fromLTRB(0,0,0,0), + value : _saveLoginDetails, + + onChanged: (bool newValue) { + setState(() { + _saveLoginDetails = newValue; + }); + }, + ),*/ ), ], ), From 60873a07efaea48616daba3493cbba1ac4d9d5d3 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 15 Jul 2019 12:09:10 +0100 Subject: [PATCH 027/122] Lots! New navigation system, new 'about/settings/logout' page, some more types of dialog boxes added, some more minor things --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- .../apifunctions/request_login_api.dart | 3 + lib/common/functions/customAbout.dart | 509 ++++++++++++++++++ lib/common/functions/feedback.dart | 61 +++ .../functions/showDialogTwoButtons.dart | 34 ++ lib/common/widgets/popupListView.dart | 3 +- lib/main.dart | 4 +- lib/pages/about_screen.dart | 52 +- lib/pages/home_page.dart | 125 ++--- lib/pages/login_page.dart | 4 +- lib/pages/receipt_page.dart | 440 +++++++++------ lib/pages/settings.dart | 180 +++++++ 13 files changed, 1142 insertions(+), 279 deletions(-) create mode 100644 lib/common/functions/customAbout.dart create mode 100644 lib/common/functions/feedback.dart create mode 100644 lib/common/functions/showDialogTwoButtons.dart create mode 100644 lib/pages/settings.dart diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 81f2036..f5bffe1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index dff0209..a83a4d3 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 36ae376..2e31f8e 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -38,6 +38,9 @@ Future requestLoginAPI( return LoginModel.fromJson(responseJson); } else { + debugPrint("Invalid, either creds are wrong or server is down"); + Navigator.of(context).pushReplacementNamed('/HomePage'); // just here temporarily while server is down + final responseJson = json.decode(response.body); saveCurrentLogin(responseJson, body["email"]); diff --git a/lib/common/functions/customAbout.dart b/lib/common/functions/customAbout.dart new file mode 100644 index 0000000..28f8732 --- /dev/null +++ b/lib/common/functions/customAbout.dart @@ -0,0 +1,509 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; +//import 'dart:developer' show Timeline, Flow; +import 'dart:developer' as dev; +import 'dart:io' show Platform; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/widgets.dart' hide Flow; +import 'package:flutter/material.dart'; + +/// A [ListTile] that shows an about box. +/// +/// This widget is often added to an app's [Drawer]. When tapped it shows +/// an about box dialog with [showAboutDialog]. +/// +/// The about box will include a button that shows licenses for software used by +/// the application. The licenses shown are those returned by the +/// [LicenseRegistry] API, which can be used to add more licenses to the list. +/// +/// If your application does not have a [Drawer], you should provide an +/// affordance to call [showAboutDialog] or (at least) [showLicensePage]. +class AboutListTile extends StatelessWidget { + /// Creates a list tile for showing an about box. + /// + /// The arguments are all optional. The application name, if omitted, will be + /// derived from the nearest [Title] widget. The version, icon, and legalese + /// values default to the empty string. + const AboutListTile({ + Key key, + this.icon = const Icon(null), + this.child, + this.applicationName, + this.applicationVersion, + this.applicationIcon, + this.applicationLegalese, + this.aboutBoxChildren, + }) : super(key: key); + + /// The icon to show for this drawer item. + /// + /// By default no icon is shown. + /// + /// This is not necessarily the same as the image shown in the dialog box + /// itself; which is controlled by the [applicationIcon] property. + final Widget icon; + + /// The label to show on this drawer item. + /// + /// Defaults to a text widget that says "About Foo" where "Foo" is the + /// application name specified by [applicationName]. + final Widget child; + + /// The name of the application. + /// + /// This string is used in the default label for this drawer item (see + /// [child]) and as the caption of the [AboutDialog] that is shown. + /// + /// Defaults to the value of [Title.title], if a [Title] widget can be found. + /// Otherwise, defaults to [Platform.resolvedExecutable]. + final String applicationName; + + /// The version of this build of the application. + /// + /// This string is shown under the application name in the [AboutDialog]. + /// + /// Defaults to the empty string. + final String applicationVersion; + + /// The icon to show next to the application name in the [AboutDialog]. + /// + /// By default no icon is shown. + /// + /// Typically this will be an [ImageIcon] widget. It should honor the + /// [IconTheme]'s [IconThemeData.size]. + /// + /// This is not necessarily the same as the icon shown on the drawer item + /// itself, which is controlled by the [icon] property. + final Widget applicationIcon; + + /// A string to show in small print in the [AboutDialog]. + /// + /// Typically this is a copyright notice. + /// + /// Defaults to the empty string. + final String applicationLegalese; + + /// Widgets to add to the [AboutDialog] after the name, version, and legalese. + /// + /// This could include a link to a Web site, some descriptive text, credits, + /// or other information to show in the about box. + /// + /// Defaults to nothing. + final List aboutBoxChildren; + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMaterial(context)); + assert(debugCheckHasMaterialLocalizations(context)); + return ListTile( + leading: icon, + title: child ?? + Text(MaterialLocalizations.of(context).aboutListTileTitle(applicationName ?? _defaultApplicationName(context))), + onTap: () { + showAboutDialog( + context: context, + applicationName: applicationName, + applicationVersion: applicationVersion, + applicationIcon: applicationIcon, + applicationLegalese: applicationLegalese, + children: aboutBoxChildren, + ); + }, + ); + } +} + +/// Displays an [AboutDialog], which describes the application and provides a +/// button to show licenses for software used by the application. +/// +/// The arguments correspond to the properties on [AboutDialog]. +/// +/// If the application has a [Drawer], consider using [AboutListTile] instead +/// of calling this directly. +/// +/// If you do not need an about box in your application, you should at least +/// provide an affordance to call [showLicensePage]. +/// +/// The licenses shown on the [LicensePage] are those returned by the +/// [LicenseRegistry] API, which can be used to add more licenses to the list. +/// +/// The `context` argument is passed to [showDialog], the documentation for +/// which discusses how it is used. +void showAboutDialog({ + @required BuildContext context, + String applicationName, + String applicationVersion, + Widget applicationIcon, + String applicationLegalese, + List children, +}) { + assert(context != null); + showDialog( + context: context, + builder: (BuildContext context) { + return AboutDialog( + applicationName: applicationName, + applicationVersion: applicationVersion, + applicationIcon: applicationIcon, + applicationLegalese: applicationLegalese, + children: children, + ); + }, + ); +} + +/// Displays a [LicensePage], which shows licenses for software used by the +/// application. +/// +/// The arguments correspond to the properties on [LicensePage]. +/// +/// If the application has a [Drawer], consider using [AboutListTile] instead +/// of calling this directly. +/// +/// The [AboutDialog] shown by [showAboutDialog] includes a button that calls +/// [showLicensePage]. +/// +/// The licenses shown on the [LicensePage] are those returned by the +/// [LicenseRegistry] API, which can be used to add more licenses to the list. +void showLicensePage({ + @required BuildContext context, + String applicationName, + String applicationVersion, + Widget applicationIcon, + String applicationLegalese, +}) { + assert(context != null); + Navigator.push(context, MaterialPageRoute( + builder: (BuildContext context) => LicensePage( + applicationName: applicationName, + applicationVersion: applicationVersion, + applicationLegalese: applicationLegalese, + ) + )); +} + +/// An about box. This is a dialog box with the application's icon, name, +/// version number, and copyright, plus a button to show licenses for software +/// used by the application. +/// +/// To show an [AboutDialog], use [showAboutDialog]. +/// +/// If the application has a [Drawer], the [AboutListTile] widget can make the +/// process of showing an about dialog simpler. +/// +/// The [AboutDialog] shown by [showAboutDialog] includes a button that calls +/// [showLicensePage]. +/// +/// The licenses shown on the [LicensePage] are those returned by the +/// [LicenseRegistry] API, which can be used to add more licenses to the list. +class AboutDialog extends StatelessWidget { + /// Creates an about box. + /// + /// The arguments are all optional. The application name, if omitted, will be + /// derived from the nearest [Title] widget. The version, icon, and legalese + /// values default to the empty string. + const AboutDialog({ + Key key, + this.applicationName, + this.applicationVersion, + this.applicationIcon, + this.applicationLegalese, + this.children, + }) : super(key: key); + + /// The name of the application. + /// + /// Defaults to the value of [Title.title], if a [Title] widget can be found. + /// Otherwise, defaults to [Platform.resolvedExecutable]. + final String applicationName; + + /// The version of this build of the application. + /// + /// This string is shown under the application name. + /// + /// Defaults to the empty string. + final String applicationVersion; + + /// The icon to show next to the application name. + /// + /// By default no icon is shown. + /// + /// Typically this will be an [ImageIcon] widget. It should honor the + /// [IconTheme]'s [IconThemeData.size]. + final Widget applicationIcon; + + /// A string to show in small print. + /// + /// Typically this is a copyright notice. + /// + /// Defaults to the empty string. + final String applicationLegalese; + + /// Widgets to add to the dialog box after the name, version, and legalese. + /// + /// This could include a link to a Web site, some descriptive text, credits, + /// or other information to show in the about box. + /// + /// Defaults to nothing. + final List children; + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMaterialLocalizations(context)); + final String name = applicationName ?? _defaultApplicationName(context); + final String version = applicationVersion ?? _defaultApplicationVersion(context); + final Widget icon = applicationIcon ?? _defaultApplicationIcon(context); + List body = []; + if (icon != null) + body.add(IconTheme(data: const IconThemeData(size: 45.0), child: icon)); + body.add(Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: ListBody( + children: [ + Text(name, style: Theme.of(context).textTheme.title), + Text(version, style: Theme.of(context).textTheme.body1), + Text(applicationLegalese ?? '', style: Theme.of(context).textTheme.caption), + ], + ), + ), + )); + body = [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: body, + ), + ]; + if (children != null) + body.addAll(children); + return AlertDialog( + content: SingleChildScrollView( + child: ListBody(children: body), + ), + actions: [ + FlatButton( + child: Text(MaterialLocalizations.of(context).viewLicensesButtonLabel), + onPressed: () { + showLicensePage( + context: context, + applicationName: applicationName, + applicationVersion: applicationVersion, + applicationIcon: applicationIcon, + applicationLegalese: applicationLegalese, + ); + }, + ), + FlatButton( + child: Text(MaterialLocalizations.of(context).closeButtonLabel), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ); + } +} + +/// A page that shows licenses for software used by the application. +/// +/// To show a [LicensePage], use [showLicensePage]. +/// +/// The [AboutDialog] shown by [showAboutDialog] and [AboutListTile] includes +/// a button that calls [showLicensePage]. +/// +/// The licenses shown on the [LicensePage] are those returned by the +/// [LicenseRegistry] API, which can be used to add more licenses to the list. +class LicensePage extends StatefulWidget { + /// Creates a page that shows licenses for software used by the application. + /// + /// The arguments are all optional. The application name, if omitted, will be + /// derived from the nearest [Title] widget. The version and legalese values + /// default to the empty string. + /// + /// The licenses shown on the [LicensePage] are those returned by the + /// [LicenseRegistry] API, which can be used to add more licenses to the list. + const LicensePage({ + Key key, + this.applicationName, + this.applicationVersion, + this.applicationLegalese, + }) : super(key: key); + + /// The name of the application. + /// + /// Defaults to the value of [Title.title], if a [Title] widget can be found. + /// Otherwise, defaults to [Platform.resolvedExecutable]. + final String applicationName; + + /// The version of this build of the application. + /// + /// This string is shown under the application name. + /// + /// Defaults to the empty string. + final String applicationVersion; + + /// A string to show in small print. + /// + /// Typically this is a copyright notice. + /// + /// Defaults to the empty string. + final String applicationLegalese; + + @override + _LicensePageState createState() => _LicensePageState(); +} + +class _LicensePageState extends State { + @override + void initState() { + super.initState(); + _initLicenses(); + } + + final List _licenses = []; + bool _loaded = false; + + Future _initLicenses() async { + int debugFlowId = -1; + assert(() { + final dev.Flow flow = dev.Flow.begin(); + dev.Timeline.timeSync('_initLicenses()', () { }, flow: flow); + debugFlowId = flow.id; + return true; + }()); + await for (LicenseEntry license in LicenseRegistry.licenses) { + if (!mounted) { + return; + } + assert(() { + dev.Timeline.timeSync('_initLicenses()', () { }, flow: dev.Flow.step(debugFlowId)); + return true; + }()); + final List paragraphs = + await SchedulerBinding.instance.scheduleTask>( + license.paragraphs.toList, + Priority.animation, + debugLabel: 'License', + ); + setState(() { + _licenses.add(const Padding( + padding: EdgeInsets.symmetric(vertical: 18.0), + child: Text( + '🍀‬', // That's U+1F340. Could also use U+2766 (❦) if U+1F340 doesn't work everywhere. + textAlign: TextAlign.center, + ), + )); + _licenses.add(Container( + decoration: const BoxDecoration( + border: Border(bottom: BorderSide(width: 0.0)) + ), + child: Text( + license.packages.join(', '), + style: const TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + )); + for (LicenseParagraph paragraph in paragraphs) { + if (paragraph.indent == LicenseParagraph.centeredIndent) { + _licenses.add(Padding( + padding: const EdgeInsets.only(top: 16.0), + child: Text( + paragraph.text, + style: const TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + )); + } else { + assert(paragraph.indent >= 0); + _licenses.add(Padding( + padding: EdgeInsetsDirectional.only(top: 8.0, start: 16.0 * paragraph.indent), + child: Text(paragraph.text), + )); + } + } + }); + } + setState(() { + _loaded = true; + }); + assert(() { + dev.Timeline.timeSync('Build scheduled', () { }, flow: dev.Flow.end(debugFlowId)); + return true; + }()); + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMaterialLocalizations(context)); + final String name = widget.applicationName ?? _defaultApplicationName(context); + final String version = widget.applicationVersion ?? _defaultApplicationVersion(context); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final List contents = [ + Text(name, style: Theme.of(context).textTheme.headline, textAlign: TextAlign.center), + Text(version, style: Theme.of(context).textTheme.body1, textAlign: TextAlign.center), + Container(height: 18.0), + Text(widget.applicationLegalese ?? '', style: Theme.of(context).textTheme.caption, textAlign: TextAlign.center), + Container(height: 18.0), + Text('Powered by Flutter', style: Theme.of(context).textTheme.body1, textAlign: TextAlign.center), + Container(height: 24.0), + ]; + contents.addAll(_licenses); + if (!_loaded) { + contents.add(const Padding( + padding: EdgeInsets.symmetric(vertical: 24.0), + child: Center( + child: CircularProgressIndicator(), + ), + )); + } + return Scaffold( + appBar: AppBar( + title: Text(localizations.licensesPageTitle), + ), + // All of the licenses page text is English. We don't want localized text + // or text direction. + body: Localizations.override( + locale: const Locale('en', 'US'), + context: context, + child: DefaultTextStyle( + style: Theme.of(context).textTheme.caption, + child: SafeArea( + bottom: false, + child: Scrollbar( + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 12.0), + children: contents, + ), + ), + ), + ), + ), + ); + } +} + +String _defaultApplicationName(BuildContext context) { + // This doesn't handle the case of the application's title dynamically + // changing. In theory, we should make Title expose the current application + // title using an InheritedWidget, and so forth. However, in practice, if + // someone really wants their application title to change dynamically, they + // can provide an explicit applicationName to the widgets defined in this + // file, instead of relying on the default. + final Title ancestorTitle = context.ancestorWidgetOfExactType(Title); + return ancestorTitle?.title ?? Platform.resolvedExecutable.split(Platform.pathSeparator).last; +} + +String _defaultApplicationVersion(BuildContext context) { + // TODO(ianh): Get this from the embedder somehow. + return ''; +} + +Widget _defaultApplicationIcon(BuildContext context) { + // TODO(ianh): Get this from the embedder somehow. + return null; +} diff --git a/lib/common/functions/feedback.dart b/lib/common/functions/feedback.dart new file mode 100644 index 0000000..9156358 --- /dev/null +++ b/lib/common/functions/feedback.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; + +final TextEditingController _feedbackController = TextEditingController(); + +void feedback( + BuildContext context) { + // flutter defined function + showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Feedback"), + content: Column( + children: [ + Text("We would love to hear your thoughts."), + Text("\nThis section needs to be fixed."), + + Container( + margin: const EdgeInsets.fromLTRB(0, 20, 0, 0), + width: 200, + height: 70, + + child : new TextField( + controller: _feedbackController, + decoration: InputDecoration( + hintText: 'Enter your feedback here', + ), + // obscureText: true, + autocorrect: true, + maxLines: 20, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + submit(_feedbackController.text); + }, + ), + ), + new Container( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 0), + child : new FlatButton( + child: new Text("Submit"), + onPressed: () { + submit(_feedbackController.text); + Navigator.of(context).pop(); + }, + ), + ), + ], + ), + ); + }, + ); +} + +void submit(String feedback) { + debugPrint(feedback); +} \ No newline at end of file diff --git a/lib/common/functions/showDialogTwoButtons.dart b/lib/common/functions/showDialogTwoButtons.dart new file mode 100644 index 0000000..03ab0d7 --- /dev/null +++ b/lib/common/functions/showDialogTwoButtons.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +void showDialogTwoButtons( + BuildContext context, String title, String message, String buttonLabel1, String buttonLabel2, Function action) { + // flutter defined function + showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text(title), + content: new Text(message), + actions: [ + // usually buttons at the bottom of the dialog + + new FlatButton( + child: new Text(buttonLabel1), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + + new FlatButton( + child: new Text(buttonLabel2), + onPressed: () { + action(context); + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); +} diff --git a/lib/common/widgets/popupListView.dart b/lib/common/widgets/popupListView.dart index e4f0128..c0784c0 100644 --- a/lib/common/widgets/popupListView.dart +++ b/lib/common/widgets/popupListView.dart @@ -20,6 +20,7 @@ class PopupListView { for (var i = 0; i < options.length; i++) { dialogOptionsList.add( new SimpleDialogOption( + // print each iteration to see if any are null child: Text(options[i]), onPressed: () { Navigator.of(this.context).pop(); @@ -33,8 +34,6 @@ class PopupListView { return dialogOptionsList; } - - Widget dialog() { return new SimpleDialog( title: Text(listTitle), diff --git a/lib/main.dart b/lib/main.dart index 408b8b3..d98746d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:local_spend/pages/login_page.dart'; import 'package:local_spend/pages/receipt_page.dart'; import 'package:local_spend/pages/spash_screen.dart'; import 'package:local_spend/pages/about_screen.dart'; +import 'package:local_spend/pages/settings.dart'; import 'package:local_spend/config.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; @@ -25,7 +26,7 @@ class MyApp extends StatelessWidget { Locale("en") ], - title: "Splash and Token Authentication", + title: "Local Spend Tracker", theme: new ThemeData( primarySwatch: Colors.blueGrey, ), @@ -34,6 +35,7 @@ class MyApp extends StatelessWidget { "/LoginPage": (BuildContext context) => LoginPage(), "/ReceiptPage": (BuildContext context) => ReceiptPage(), "/AboutPage": (BuildContext context) => AboutPage(), + "/SettingsPage": (BuildContext context) => SettingsPage(), }, home: SplashScreen(), ); diff --git a/lib/pages/about_screen.dart b/lib/pages/about_screen.dart index 2c20bcd..ad64060 100644 --- a/lib/pages/about_screen.dart +++ b/lib/pages/about_screen.dart @@ -7,7 +7,10 @@ import 'package:flutter_linkify/flutter_linkify.dart'; class AboutPage extends StatefulWidget { @override - _HomePageState createState() => _HomePageState(); +// _HomePageState createState() => _HomePageState(); + State createState() { + return new _HomePageState(); + } } class _HomePageState extends State { @@ -17,6 +20,11 @@ class _HomePageState extends State { _saveCurrentRoute("/AboutPage"); } + @override + void dispose() { + super.dispose(); + } + _saveCurrentRoute(String lastRoute) async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('LastScreenRoute', lastRoute); @@ -24,27 +32,36 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: AppBar( - title: Text( - "About Page", - style: TextStyle( - fontSize: 30, - color: Colors.black), + return WillPopScope( + onWillPop: () { + if (Navigator.canPop(context)) { + Navigator.of(context).pushNamedAndRemoveUntil( + '/HomePage', (Route route) => true); + } else { + Navigator.of(context).pushReplacementNamed('/HomePage'); + } + }, + child: PlatformScaffold( + appBar: AppBar( + title: Text( + "About Page", + style: TextStyle( + fontSize: 20, + color: Colors.black, + ), + ), + leading: BackButton(), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), ), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), - elevation: Theme.of(context).platform == TargetPlatform.iOS ? 0.0 : 6.0, - ), - drawer: BasicDrawer(), - body: Container( - padding: EdgeInsets.all(32.0), - child: ListView( + body: Container( + padding: EdgeInsets.all(32.0), + child: ListView( children: [ InkWell( child: const Center(child: Text ('Pear Trading', - style: TextStyle( + style: TextStyle( fontSize: 20, color: Colors.blue, ), @@ -113,6 +130,7 @@ class _HomePageState extends State { ), ), ], + ), ), ), ); diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 35dc251..18faacf 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,95 +1,62 @@ import 'package:flutter/material.dart'; -import 'package:local_spend/common/platform/platform_scaffold.dart'; -import 'package:local_spend/common/widgets/basic_drawer.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:flutter/services.dart'; -import 'package:local_spend/common/apifunctions/request_logout_api.dart'; -import 'package:local_spend/common/functions/get_token.dart'; -import 'package:flutter_fadein/flutter_fadein.dart'; -import 'package:local_spend/common/functions/logout.dart'; +import 'package:local_spend/pages/receipt_page.dart'; +import 'package:local_spend/pages/settings.dart'; + +class HomePage extends StatelessWidget { + static String _title = 'Text here'; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: _title, + home: HomePageWidget(), + ); + } +} + +class HomePageWidget extends StatefulWidget { + HomePageWidget({Key key}) : super(key: key); -class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } -class _HomePageState extends State { - @override +class _HomePageState extends State { + int _selectedIndex = 0; + static const TextStyle optionStyle = + TextStyle(fontSize: 30, fontWeight: FontWeight.bold); + static List _widgetOptions = [ + ReceiptPage(), + SettingsPage() + ]; - void initState() { - super.initState(); - _saveCurrentRoute("/HomePage"); - } - - _saveCurrentRoute(String lastRoute) async { - SharedPreferences preferences = await SharedPreferences.getInstance(); - await preferences.setString('LastScreenRoute', lastRoute); + void _onItemTapped(int index) { + setState(() { + _selectedIndex = index; + }); } @override Widget build(BuildContext context) { - return PlatformScaffold( - appBar: AppBar( - title: Text( - "Navigation", - style: TextStyle(color: Colors.black), - ), - iconTheme: IconThemeData(color: Colors.black), - elevation: Theme.of(context).platform == TargetPlatform.iOS ? 0.0 : 6.0, + return Scaffold( + body: Center( + child: _widgetOptions.elementAt(_selectedIndex), ), - drawer: BasicDrawer(), - body: Container( - padding: EdgeInsets.fromLTRB(0, 15, 0, 0), - child: FadeIn( - duration: Duration(milliseconds: 500), - curve: Curves.easeIn, - - child: Column( - children: [ - - ListTile( - title: new Center( - child: new Text( - "Submit Receipt", - style: TextStyle(color: Colors.black, fontSize: 20.0), - textAlign: TextAlign.center, - ), - ), - onTap: () { - // debugPrint('$token'); - Navigator.of(context).pushNamed('/ReceiptPage'); - }, - ), - - ListTile( - title: new Center( - child: new Text( - "About", - style: TextStyle(color: Colors.black, fontSize: 20.0), - ), - ), - onTap: () { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - Navigator.of(context).pushReplacementNamed('/AboutPage'); - }, - ), - - ListTile( - title: new Center( - child: new Text( - "Logout", - style: TextStyle(color: Colors.black, fontSize: 20.0), - ), - ), - onTap: () { - logout(context); - }, - - ), - ], + bottomNavigationBar: BottomNavigationBar( + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.receipt), + title: Text('Submit Receipt'), ), - ), + BottomNavigationBarItem( + icon: Icon(Icons.settings), + title: Text('Settings'), + ), + ], + currentIndex: _selectedIndex, + selectedItemColor: Colors.blue[400], + onTap: _onItemTapped, ), ); } -} +} \ No newline at end of file diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index e50c9f8..f0bfc48 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -19,8 +19,8 @@ class LoginPage extends StatefulWidget { } class LoginPageState extends State { - final TextEditingController _emailController = TextEditingController(/*text: 'test@example.com'*/); // remove - final TextEditingController _passwordController = TextEditingController(/*text: 'abc123'*/); // remove + final TextEditingController _emailController = TextEditingController(text: 'test@example.com'); // remove + final TextEditingController _passwordController = TextEditingController(text: 'abc123'); // remove bool _saveLoginDetails = true; // I am extremely sorry for the placement of this variable // it will be fixed soon I promise diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 7b13c4c..3715904 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -9,9 +9,11 @@ import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:intl/intl.dart'; +import 'package:local_spend/pages/settings.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; import 'package:local_spend/common/widgets/popupListView.dart'; +import 'package:local_spend/common/widgets/labeled_checkbox.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -30,6 +32,7 @@ class ReceiptPageState extends State { final TextEditingController _recurringController = TextEditingController(); final TextEditingController _typeController = TextEditingController(); final TextEditingController _orgController = TextEditingController(); + bool _recurringCheckbox = false; // have mercy, this will be removed. sorry for this variable's placement... FocusNode focusNode; // added so focus can move automatically @@ -174,223 +177,310 @@ class ReceiptPageState extends State { @override Widget build(BuildContext context) { - var drawer = Drawer(); return WillPopScope( onWillPop: () { if (Navigator.canPop(context)) { Navigator.of(context).pushNamedAndRemoveUntil( - '/HomePage', (Route route) => false); + '/LoginPage', (Route route) => false); } else { - Navigator.of(context).pushReplacementNamed('/HomePage'); + Navigator.of(context).pushReplacementNamed('/LoginPage'); } }, child: PlatformScaffold( - drawer: BasicDrawer(), + appBar: AppBar( + backgroundColor: Colors.blue[400], title: Text( "Submit Receipt", style: TextStyle( - fontSize: 30.0, + fontSize: 20, color: Colors.black, ), ), +// leading: BackButton(), centerTitle: true, iconTheme: IconThemeData(color: Colors.black), ), + body: Container( - child: Padding( - padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), - child: ListView( - children: [ -// Container( -// alignment: Alignment.topCenter, -// child: Padding( -// padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), -// child: Text( -// "Required fields are in bold", -// style: TextStyle(fontSize: 20.0, color: Colors.black), -// ), -// )), - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child : Text( - "Time of Transaction", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: ListView( + children: [ + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + child : Text( + "Time of Transaction", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, ), ), - DateTimePickerFormField( - inputType: InputType.both, - format: DateFormat("dd/MM/yyyy 'at' hh:mm"), - editable: true, - controller: _timeController, + ), + DateTimePickerFormField( + inputType: InputType.both, + format: DateFormat("dd/MM/yyyy 'at' hh:mm"), + editable: true, + controller: _timeController, + decoration: InputDecoration( + labelText: 'Date/Time of Transaction', hasFloatingPlaceholder: false), + onChanged: (dt) => setState(() => date = dt), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + child: Text( + "Amount", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _amountController, decoration: InputDecoration( - labelText: 'Date/Time of Transaction', hasFloatingPlaceholder: false), - onChanged: (dt) => setState(() => date = dt), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child: Text( - "Amount", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), + hintText: 'Value in £', ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _amountController, - decoration: InputDecoration( - hintText: 'Value in £', - ), // obscureText: true, - autocorrect: false, - keyboardType: TextInputType.number, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - FocusScope.of(context).requestFocus(focusNode); + autocorrect: false, + keyboardType: TextInputType.number, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + FocusScope.of(context).requestFocus(focusNode); // submitReceipt(_amountController.text, _timeController.text); - }, - ), + }, ), + ), - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child : Container ( - height: 22, // this should be the same height as text + child : Container ( + height: 22, // this should be the same height as text - child : ListView( - scrollDirection: Axis.horizontal, - children: [ + child : ListView( + scrollDirection: Axis.horizontal, + children: [ - Container( - child: Text( - "Organization Name", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), + Container( + child: Text( + "Organization Name", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, ), ), + ), - Container( - child : Padding( - padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints - child: FlatButton( - onPressed: () { - var organisations = findOrganisations(_orgController.text); - // some tasty async stuff here yum yum - // and a pretty little dialog too yay - var choice = organisations.then((data) => listOrganisations(data, context)); + Container( + child : Padding( + padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints + child: FlatButton( + onPressed: () { + var organisations = findOrganisations(_orgController.text); + // some tasty async stuff here yum yum + // and a pretty little dialog too yay (doesn't work) + var choice = organisations.then((data) => listOrganisations(data, context)); - // choice is a Future - }, - child: Text("Find", - style: - TextStyle(color: Colors.blue, fontSize: 18.0)), - ), - ), - ) + // choice is a Future + }, + child: Text("Find", + style: + TextStyle(color: Colors.blue, fontSize: 18.0)), + ), + ), + ) - ], - ), + ], ), ), + ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _orgController, - focusNode: focusNode, - decoration: InputDecoration( - hintText: 'Eg. Pear Trading', - ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _orgController, + focusNode: focusNode, + decoration: InputDecoration( + hintText: 'Eg. Pear Trading', + ), // obscureText: true, - autocorrect: true, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - submitReceipt(_amountController.text, - _timeController.text, _orgController.text); - // TODO: make sure organisation is valid - // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry + autocorrect: true, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + submitReceipt(_amountController.text, + _timeController.text, _orgController.text); + // TODO: make sure organisation is valid + // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry + }, + ), + ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + + child : Container ( + height: 18, + + child : ListView( + scrollDirection: Axis.horizontal, + + children: [ + Container( + child: Text( + "Essential", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + ), + ), + ), + + Container( + child : Padding( + padding: EdgeInsets.fromLTRB(20.0, 0.0, 0, 0), + + child: Checkbox(value: + _essentialController.text.toLowerCase() == 'true', + onChanged: (bool newValue) { + setState(() { + _essentialController.text = + convertBoolToString(newValue); + }); + }), + ), + ), + + ], + ), + ), + ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + + child : Container ( + height: 27, +// width: 400, + + child : ListView( + scrollDirection: Axis.horizontal, + + children: [ + Container( + child: Text( + "Recurring", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + ), + ), + ), + + Container( + child : Padding( + padding: EdgeInsets.fromLTRB(15.0, 0.0, 0, 4), + + child: Checkbox(value: + _essentialController.text.toLowerCase() != "none" || + _essentialController.text.toLowerCase() != 'false', + onChanged: (bool newValue) { + setState(() { + var options = new List(7); + options[0] = "Daily"; + options[1] = "Weekly"; + options[2] = "Fortnightly"; + options[3] = "Monthly"; + options[5] = "Quarterly"; + options[6] = "Yearly"; + + var popupListView = new PopupListView( + context, options, "Recurring..."); + + var dialog = popupListView.dialog(); + + showDialog( + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + + print(popupListView.result); +// _recurringController.text = +// popupListView.result; + }); + }), + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(10, 2, 0, 0), + child: Text( + convertBoolToString(_essentialController.text.toLowerCase() != "none" || + _essentialController.text.toLowerCase() != 'false'), + style: TextStyle( + fontSize: 16.0, + color: Colors.grey, + ), + ), + ), + ], + ), + ), + ), + + +// var options = new List(1); +// options[0] = "Weekly"; +// +// var popupListView = new PopupListView(context, options, "Recurring..."); +// +// var dialog = popupListView.dialog(); +// +// showDialog( +// context: context, +// builder: (BuildContext context) { +// return dialog; +// }, +// ); +// +// print(popupListView.result); +// _recurringController.text = popupListView.result; +// +// setState(() { +// _recurringController.text = +// convertBoolToString(newValue); + + + Padding( + padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + submitReceipt(_amountController.text, _timeController.text, _orgController.text); }, + child: Text("SUBMIT", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.blue, ), ), - - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - - child : Container ( - height: 18, - - child : ListView( - scrollDirection: Axis.horizontal, - - children: [ - Container( - child: Text( - "Essential Purchase", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - ), - ), - ), - - Container( - child : Padding( - padding: EdgeInsets.fromLTRB(20.0, 0.0, 0, 0), - - child: Checkbox(value: - _essentialController.text.toLowerCase() == 'true', - onChanged: (bool newValue) { - setState(() { - _essentialController.text = - convertBoolToString(newValue); - }); - }), - ), - ), - - ], - ), - ), - ), - - - Padding( - padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0), - child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - submitReceipt(_amountController.text, _timeController.text, _orgController.text); - }, - child: Text("SUBMIT", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), - color: Colors.blue, - ), - ), - ), - ], - ), + ), + ], ), ), ), diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart new file mode 100644 index 0000000..ebde997 --- /dev/null +++ b/lib/pages/settings.dart @@ -0,0 +1,180 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:local_spend/common/functions/logout.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:local_spend/common/functions/customAbout.dart' as custom; +import 'package:local_spend/common/functions/showDialogTwoButtons.dart'; +import 'package:local_spend/common/functions/feedback.dart'; + +const URL = "https://flutter.io/"; +const demonstration = false; + +class SettingsPage extends StatefulWidget { + @override + State createState() { + return new SettingsPageState(); + } +} + +class SettingsPageState extends State { + FocusNode focusNode; // added so focus can move automatically + + DateTime date; + + @override + void initState() { + super.initState(); + _saveCurrentRoute("/SettingsPageState"); + + focusNode = FocusNode(); + } + + @override + void dispose() { + super.dispose(); + + focusNode.dispose(); //disposes focus node when form disposed + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastPageRoute', lastRoute); + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () { + if (Navigator.canPop(context)) { + Navigator.of(context).pushNamedAndRemoveUntil( + '/LoginPage', (Route route) => false); + } else { + Navigator.of(context).pushReplacementNamed('/LoginPage'); + } + }, + child: PlatformScaffold( + + appBar: AppBar( + backgroundColor: Colors.blue[400], + title: Text( + "Settings", + style: TextStyle( + fontSize: 20, + color: Colors.black, + ), + ), +// leading: BackButton(), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), + + body: Container( + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: ListView( + children: [ + + Container( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + child : Text( + "Local Spend Tracker", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), +// +// Padding( +// padding: EdgeInsets.fromLTRB(10, 15, 0, 0), +// child: Text("helloooo"), +// ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0, 25.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + + custom.showAboutDialog( + context: context, + applicationIcon: new Icon(Icons.receipt), + applicationName: "Local Spend Tracker", + children: [ + Text("Pear Trading is a commerce company designed to register and monitor money circulating in the local economy."), + Text("\nContact at test@example.com or +44(0)1524 64544"), + + Padding( + padding: EdgeInsets.fromLTRB(0,20,0,0), + child: InkWell( + child: Text + ('Developed by Shadowcat Systems', + style: TextStyle( + color: Colors.blue, + ), + ), + onTap: () => launch('https://shadow.cat/') + ), + ), + ], + ); + + }, + child: Text("ABOUT", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.blue, + ), + ), + ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + showDialogTwoButtons( + context, + "Logout", + "Are you sure you want to log out?", + "Cancel", + "Logout", + logout + ); + }, + child: Text("LOGOUT", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.red, + ), + ), + ), + + Padding( + padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + feedback(context); + }, + child: Text("FEEDBACK", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.green, + ), + ), + ), + ], + ), + ), + ), + ); + } +} From a3a52ebe4a2d932836a2a558cff3d66d8de0d6cd Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 15 Jul 2019 14:48:41 +0100 Subject: [PATCH 028/122] Submit Receipt fixed 'find' works, recurring options work, only thing that needs doing is adding organisation's address to api request --- .../apifunctions/find_organisations.dart | 28 ++-- lib/common/widgets/popupListView.dart | 45 ++--- lib/pages/receipt_page.dart | 155 +++++++----------- 3 files changed, 92 insertions(+), 136 deletions(-) diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index 4c6346a..69187e8 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -26,12 +26,12 @@ List jsonToOrganisations(String json) { List validated = decoded['unvalidated']; // Map organisation = validated[0]; - - print(""); - print("Response:"); - for (var i = 0; i < validated.length; i++) { - print(validated[i]); - } +// +// print(""); +// print("Response:"); +// for (var i = 0; i < validated.length; i++) { +// print(validated[i]); +// } List organisationsMaps = new List(); @@ -61,14 +61,14 @@ List jsonToOrganisations(String json) { // the reason some organizations do not show up is because they are not all validated // option to 'show unvalidated' should be added along with maybe a settings section - - print(""); - print("Local:"); - for (var i = 0; i < organisations.length; i++) - { - print(organisations[i].name); - } - print(""); +// +// print(""); +// print("Local:"); +// for (var i = 0; i < organisations.length; i++) +// { +// print(organisations[i].name); +// } +// print(""); return organisations; } diff --git a/lib/common/widgets/popupListView.dart b/lib/common/widgets/popupListView.dart index c0784c0..ceea50a 100644 --- a/lib/common/widgets/popupListView.dart +++ b/lib/common/widgets/popupListView.dart @@ -1,20 +1,22 @@ import 'package:flutter/material.dart'; +import 'dart:async'; class PopupListView { - List options = new List(); - var context; - String listTitle; - List simpleDialogOptions = new List(); - String result; + Future dialog(context, List options, String title) { + return showDialog( + context: context, + barrierDismissible: false, - PopupListView(context, List options, String title) { - this.context = context; - this.options = options; - this.listTitle = title; + builder: (BuildContext context) { + return SimpleDialog( + title: Text(title), + children: getDialogOptions(context, options), + ); + }, + ); } - - List getDialogOptions() { + List getDialogOptions(context, List options /*, Function onPressed*/) { var dialogOptionsList = new List(); for (var i = 0; i < options.length; i++) { @@ -23,9 +25,7 @@ class PopupListView { // print each iteration to see if any are null child: Text(options[i]), onPressed: () { - Navigator.of(this.context).pop(); -// print("Chosen organisation is " + options[i]); - optionChosen(options[i]); + Navigator.of(context).pop(options[i]); }, ), ); @@ -33,19 +33,4 @@ class PopupListView { return dialogOptionsList; } - - Widget dialog() { - return new SimpleDialog( - title: Text(listTitle), - children : getDialogOptions(), - ); - } - - void optionChosen(String option) { - // now pass `option` to - } -} - - - - +} \ No newline at end of file diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 3715904..1c24bf3 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -29,10 +29,9 @@ class ReceiptPageState extends State { final TextEditingController _timeController = TextEditingController(); final TextEditingController _amountController = TextEditingController(); final TextEditingController _essentialController = TextEditingController(); - final TextEditingController _recurringController = TextEditingController(); + final TextEditingController _recurringController = TextEditingController(text: "None"); final TextEditingController _typeController = TextEditingController(); final TextEditingController _orgController = TextEditingController(); - bool _recurringCheckbox = false; // have mercy, this will be removed. sorry for this variable's placement... FocusNode focusNode; // added so focus can move automatically @@ -70,6 +69,8 @@ class ReceiptPageState extends State { await preferences.setString('LastPageRoute', lastRoute); } + // this file is getting really messy sorry everyone + void submitReceipt(String amount, String time, String orgName) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); @@ -125,6 +126,19 @@ class ReceiptPageState extends State { return "false"; } + List getOptions() { + var options = new List(7); + options[0] = "None"; + options[1] = "Daily"; + options[2] = "Weekly"; + options[3] = "Fortnightly"; + options[4] = "Monthly"; + options[5] = "Quarterly"; + options[6] = "Yearly"; + + return options; + } + String formatDate(String date) { // return ""; // should be in format: @@ -158,21 +172,15 @@ class ReceiptPageState extends State { optionsList.add(organisations[i].name); } - var popupListView = new PopupListView(context, optionsList, "Choose Organization"); +// var popupListView = new PopupListView(context, optionsList, "Choose Organization"); - var dialog = popupListView.dialog(); + var popupListView = new PopupListView(); + var dialog = popupListView.dialog(context, optionsList, "Choose Organization"); -// print(dialog); +// dialog.then((value) => debugPrint(value)); - showDialog( - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - - print(popupListView.result); - return popupListView.result; + dialog.then((value) => _orgController.text = value); + //can't return value as it is and thus would block } @override @@ -285,16 +293,31 @@ class ReceiptPageState extends State { padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints child: FlatButton( onPressed: () { - var organisations = findOrganisations(_orgController.text); - // some tasty async stuff here yum yum - // and a pretty little dialog too yay (doesn't work) - var choice = organisations.then((data) => listOrganisations(data, context)); + if (_orgController.text != "") { + var organisations = findOrganisations( + _orgController.text); - // choice is a Future + var choice = organisations.then((data) => + listOrganisations(data, context)); + + choice.then((value) => _orgController.text = value); + setState(() { + + }); + } else { + // no data entered + + showDialogSingleButton( + context, + "No data", + "We were unable to service your request because no data was entered.", + "OK" + ); + } }, child: Text("Find", - style: - TextStyle(color: Colors.blue, fontSize: 18.0)), + style: TextStyle(color: Colors.blue, fontSize: 18.0) + ), ), ), ) @@ -369,10 +392,10 @@ class ReceiptPageState extends State { ), Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + padding: EdgeInsets.fromLTRB(0.0,18,0.0,0.0), child : Container ( - height: 27, + height: 35, // width: 400, child : ListView( @@ -380,6 +403,7 @@ class ReceiptPageState extends State { children: [ Container( + padding: const EdgeInsets.fromLTRB(0, 7, 0, 8), child: Text( "Recurring", style: TextStyle( @@ -390,81 +414,28 @@ class ReceiptPageState extends State { ), Container( - child : Padding( - padding: EdgeInsets.fromLTRB(15.0, 0.0, 0, 4), - - child: Checkbox(value: - _essentialController.text.toLowerCase() != "none" || - _essentialController.text.toLowerCase() != 'false', - onChanged: (bool newValue) { - setState(() { - var options = new List(7); - options[0] = "Daily"; - options[1] = "Weekly"; - options[2] = "Fortnightly"; - options[3] = "Monthly"; - options[5] = "Quarterly"; - options[6] = "Yearly"; - - var popupListView = new PopupListView( - context, options, "Recurring..."); - - var dialog = popupListView.dialog(); - - showDialog( - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - - print(popupListView.result); -// _recurringController.text = -// popupListView.result; - }); - }), - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(10, 2, 0, 0), - child: Text( - convertBoolToString(_essentialController.text.toLowerCase() != "none" || - _essentialController.text.toLowerCase() != 'false'), - style: TextStyle( - fontSize: 16.0, - color: Colors.grey, - ), - ), + padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), + child: DropdownButton( + value: _recurringController.text, + onChanged: (String newValue) { + setState(() { + _recurringController.text = newValue; + }); + }, + items: getOptions().map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }) + .toList(), + ) ), ], ), ), ), - -// var options = new List(1); -// options[0] = "Weekly"; -// -// var popupListView = new PopupListView(context, options, "Recurring..."); -// -// var dialog = popupListView.dialog(); -// -// showDialog( -// context: context, -// builder: (BuildContext context) { -// return dialog; -// }, -// ); -// -// print(popupListView.result); -// _recurringController.text = popupListView.result; -// -// setState(() { -// _recurringController.text = -// convertBoolToString(newValue); - - Padding( padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 0.0), child: Container( From 5af5955f09696fd80cf2bf116bf6367a8bfb0a9f Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 15 Jul 2019 14:55:10 +0100 Subject: [PATCH 029/122] submit receipt ui updated --- lib/pages/receipt_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 1c24bf3..d230682 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -202,7 +202,7 @@ class ReceiptPageState extends State { "Submit Receipt", style: TextStyle( fontSize: 20, - color: Colors.black, + color: Colors.white, ), ), // leading: BackButton(), @@ -444,7 +444,7 @@ class ReceiptPageState extends State { onPressed: () { submitReceipt(_amountController.text, _timeController.text, _orgController.text); }, - child: Text("SUBMIT", + child: Text("GO", style: TextStyle(color: Colors.white, fontSize: 22.0)), color: Colors.blue, From 2eead2296739bfb06e0fde7979e17ecc93afae15 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 15 Jul 2019 14:59:09 +0100 Subject: [PATCH 030/122] general ui stuff that's about it really --- lib/pages/home_page.dart | 4 ++-- lib/pages/settings.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 18faacf..d3547f4 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -49,8 +49,8 @@ class _HomePageState extends State { title: Text('Submit Receipt'), ), BottomNavigationBarItem( - icon: Icon(Icons.settings), - title: Text('Settings'), + icon: Icon(Icons.more_horiz), + title: Text('More'), ), ], currentIndex: _selectedIndex, diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index ebde997..a77d3b4 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -60,10 +60,10 @@ class SettingsPageState extends State { appBar: AppBar( backgroundColor: Colors.blue[400], title: Text( - "Settings", + "More", style: TextStyle( fontSize: 20, - color: Colors.black, + color: Colors.white, ), ), // leading: BackButton(), From 3af4908d5fe7173c4cdb81770a4be95135d5489e Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 15 Jul 2019 15:16:21 +0100 Subject: [PATCH 031/122] debugging logout --- lib/common/apifunctions/request_logout_api.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/common/apifunctions/request_logout_api.dart b/lib/common/apifunctions/request_logout_api.dart index 2d5a141..324660f 100644 --- a/lib/common/apifunctions/request_logout_api.dart +++ b/lib/common/apifunctions/request_logout_api.dart @@ -8,7 +8,7 @@ import 'package:local_spend/common/functions/save_logout.dart'; import 'package:local_spend/model/json/login_model.dart'; Future requestLogoutAPI(BuildContext context) async { - final url = "https://www.yoururl.com/logout"; + final url = "https://dev.peartrade.org/api/logout"; var token; @@ -25,6 +25,8 @@ Future requestLogoutAPI(BuildContext context) async { saveLogout(); return null; } else { + debugPrint("Logout unsuccessful: " + response.body); + saveLogout(); return null; } From 7dd00349a8a7ca81d4cb1481f8a92fa2c34085e2 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 15 Jul 2019 16:17:41 +0100 Subject: [PATCH 032/122] General minor fixes --- lib/pages/receipt_page.dart | 16 +++++++++++++--- lib/pages/spash_screen.dart | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index d230682..3c34a72 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -16,7 +16,7 @@ import 'package:local_spend/common/widgets/popupListView.dart'; import 'package:local_spend/common/widgets/labeled_checkbox.dart'; const URL = "https://flutter.io/"; -const demonstration = false; +const demonstration = true; class ReceiptPage extends StatefulWidget { @override @@ -82,20 +82,21 @@ class ReceiptPageState extends State { // return object of type Dialog return AlertDialog( title: new Text("Success"), - content: new Text("Recepit successfully submitted."), + content: new Text("Receipt successfully submitted."), actions: [ // usually buttons at the bottom of the dialog new FlatButton( child: new Text("OK"), onPressed: () { Navigator.of(context).pop(); + //TODO: Reset form after dialog exit }, ), ], ); }, ).then((_) { - Navigator.of(context).pushNamed('/HomePage'); + Navigator.of(context).pushReplacementNamed('/HomePage'); }); } else { @@ -166,6 +167,15 @@ class ReceiptPageState extends State { } String listOrganisations(List organisations, context) { + if (organisations.length == 0) { + showDialogSingleButton( + context, + "No matching organizations", + "We were unable to find any organizations matching this text.", + "OK" + ); + return null; + } var optionsList = new List(); for (var i = 0; i < organisations.length; i++) { diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index f3944f2..4aa22ab 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -49,7 +49,7 @@ class _SplashScreenState extends State { Container( margin: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 30.0), child: Text( - "© Copyright Statement 2018", + "© Copyright Statement 2019", style: TextStyle( fontSize: 16.0, color: Colors.black, From e3ca987aa8508cb3ebd94ba3745fc994ac8f3f3c Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 11:28:36 +0100 Subject: [PATCH 033/122] WORKS!!!!!!!! We did it boys, we uploaded a transaction --- assets/images/launch_image.png | Bin 134507 -> 134462 bytes ...lat_sport_air_horn_2x_blasts_002_21151.mp3 | Bin 0 -> 46104 bytes ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- .../apifunctions/find_organisations.dart | 7 +- .../apifunctions/submit_receipt_api.dart | 10 +- .../functions/showDialogTwoButtons.dart | 2 +- lib/common/widgets/popupListView.dart | 2 +- lib/pages/login_page.dart | 57 +++-- lib/pages/login_page_old.dart | 209 ------------------ lib/pages/receipt_page.dart | 37 ++-- lib/pages/settings.dart | 31 +-- 12 files changed, 87 insertions(+), 274 deletions(-) create mode 100644 assets/zapsplat_sport_air_horn_2x_blasts_002_21151.mp3 delete mode 100644 lib/pages/login_page_old.dart diff --git a/assets/images/launch_image.png b/assets/images/launch_image.png index e8d5eb3a9d603cc707b6b0c4bb8663f6f4eea8f4..0a4042b13ce1ad2e3f416b8bc0a83d45c1581914 100644 GIT binary patch literal 134462 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 literal 134507 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⁣_+-KhESi$BpXt!{Humi}(W*MV zZ#<|zfi)YJteT@ehqffumbnSqD1V0fF$=WRD6Gi77W{VxN+$s9VwyqigUlGkVedV6 zb`2j^G9)%#tmi>lDcV4E3!GG7nX)IWGj;yDsSj6e+^Ghl?rc0xEP$xOt&0rYR1^B_ z-Jz;bZM40={IIC=)b@qmUXRBwcOC~X(iNga?+ieuHiQccyC#-(o{Ne+kHMA+OkBE< zm->oEoHnQ166}K)wsppIv29HpO9V(JNO?u;A7HOva!?6Q?*>hibUOW~L|RE$;a2r% zs(dUS>(>Jy3&0-d#QtTVOzTYUGHtkd(@i-$1L-N=hxh_k1p1)`{wmJAp_ttfg6#Be zeZXB4fhwdJC@Q*FzgRU4>kZ1}RhV7SS1yq}&g}~5b1l^w6^C{FvwW>;kU$ybiqb@t1KeteqT^Z@;J@BqgN6W@618dNYJkexBA8Fp-D z8Q8;!rrmGAg?v|L@_u6qz!lJ`n;t!!nPBrK^x~|@u;v|LZQL*Z#b*((dhUO_e131i z+miG6yMT2MW!sF_U|uyBP1pn#6<&J^UUbzT%QKfx@yt^3RMQwi^Rn^tyNDU#2^AV-Sdchb0+jo0)ID)}h`sk5lk2jGWDhNRD=VcG zIf0t$CHxi`qt9-rf>S9V47)uEC%U?PP-`Oo2oqAZqxKjQA?T&!3CiwlWk z20%@JY@4O zV?IQ(`q^!p`p*aEI}iOaM{oxfHq0$HzutUieJ7m?WC@;HkzMuDsioEE`t6V8`NZNS z$;yS}Rl{piT4E`hWqTEsh1gs@1Rg2b_tZkMZU#R$S7k9MStN13gESPf_l`6Ot+9IV zkbIM;c$Z{$#&WJJxqWv&QB+hYHfX##1kR+|e3C{atMqid?W$z%+WNEtKm=ej1A+Rl z_>{SSo14>?K?D@G4OPZGOhv^tm$Yjz)_XQZHKy%8NMK6=lp|3)Dx0|05?I8Vy>_hr z1kuiwHJ1^A$pWHxSHlATly#!#!1IwKAfc}2{*;-jV6kNX6?pnkJ(3Cz>{FOg&{Hg5@(RPP1*-P~X?H$If(lfy5!e*Sv z?oNMr=}AtTOKFK5L1O0Y!?PGQxrt@fDw}eUC{_-DY!BoJUOTfP;l%>7x6iW*-(5~1 zT#}|Z_-`BD@UL%54QTStO-%*OAvpc6SzDAbP8eK=U9e&d61KO>4KBU&fG;<`08#j7 zDQ2vIb5V(qAA`;<=|RcCr#X_)hLSMBtqkDh02xKxa?Vsw9h1o4BuWbfG#$Vqr-$h+ z85E9;l>!$?>knE<3nS$-{wK*M8hw!8TpS-)EtvH01y@vQ_NLrE`@@XN7dsUXFvHX> zX3o>yQ<|C8Qc#qq5HVofp2{{Ite3so$#}!xjKR8sIzvp+V z4$c-j<2=ypA;7EnEDRjm?#*MCwQ+9m*u4i{eOOvI=zU3e$zEd~^5QXjk704ebX9Ma zA2^s}(wD!)a%hr)GVDc6E4EhdC&+nWdv*|UU(1?JY1hf>{V#VH6B8I}zF zupatA2#NeWJ7S9unCtv>0nr!e**gZa`GZzhtUN|)P!`~!#Y0&Lqc{)jH5gmgg+4() z(ksd8s{Tw`I9qN*Yt}|p-w?PnSb{%OS}v?XUkuRU@=5OHIF*wToMaPY@sFyjF8q1H z)WG592m1n6vqTRFGA_D4p{KL!@;0@^F# zdGIY%F9#npe^kHHcZ#(&vA4nX;*HI1WNC)}SDH7Q*p(PN)0JJKeMSVF=w+Q?b;|l{ z;Fih4yfH2yjGr??Vv(vAglD#lHL+X?pzB&jKOi?(?Y5=)HcX#lGg+Un)^V?bzM<9o ztiNgQjPckykK5;^ou#WaF3|{(3gP&y8HmM29~?rm&&vWpE+%L}5ZElqnSYIZpOq>J z?R42+#Ry|%_uG{OF7F*638uh!RT#c?9(mKt!<7{rEz{r-)3=bazHJwd((2G!=;Q=& z`q{$=E8p7!xSyAd781pK3_H%>^s9KqRi<;Ms0dY7g8dT~a><35(Fpl}g8w@j@k8lo=6`)^xV{AimkzKkiMq#!b2QN4edFqvNpW&2qYg^a(AG;D%&`pPF zHbd3&O$6<{Rso$<1HWL6@yid>v3p=BFA~!V-q)D~iZ!ZD_-t+W9BXq?zx;;)zJ~&$ z&$jLkONe6K-q&gD(a5sBx0YtQ+K%cb)lZWAgH4};xQQaOkZ|P_k@q|j#pgHnb@^wN z%!e)#u;7fH1JMdlSg=~aHZU}n{2b6B!Ax{Uc22L$yFJE7mzrLWZGJjs_8yamVv~2N zuPB>YixN&LeJI=1@Uk$&I~pPE%|4+`5)~%laeaCU1yprH`S z1{upE?Cxx2s_@0`?>OCl-iBI+B%O*NZ?Z4UjGj^5ZM^78nLpM#_j0AmG*+SQeVN7Ylfg~3>7`Fo z0m-tax62Z+%IUrfJSGVmv_C5zLr{%Irc(x1k74Ps+$}!aNSkh#(xp=IW9I&tFl468 z*uw&1y-T07h~Hb=bzB9csJu`&?H-h%8h$#z1aljx7_eZXY!;~HGbCYU4A!a}MWqax zlTt6rR@Fe<%grA|vDlpaY#EEO|ftv$J#Nq+QV|=5a_|7DUehS<|d}S2QRM>i7BSP zMnYO7bA!x>DZ`{>KvD6+K43;5DeH;qhgGgA`}#T0^w(ce2qZJ>pCo*DOecDITj2{y z6}dij1bUZ8Pe?`|z#Kv0xo}hn>tOFRsSc<$7_FBnuYgyq#mRrH*`#Bb--c%X+Xk7y zK!5gy-hV^oi=6rIwP7?=&IO&UJ(s>=`S4;OntS(7{O&t;JulM>cPfscsa&MGz0GTv zcBX3qE}p7g(jZRUJ&5-VQu)h1f$u6y;4Z{n>=yH8!3I`Yt305ti}EKOY6FG3`i4Y)}T8pD0ZaR>;ak0z~3N>RW94J z^V&1s&K`q^G|6|{avuSDh76vGXF}i@fVTgxxjXzOv4wR|Va%F)%`X4e^@!%PF=+l;DwqFoMPYfU0+GG8Bk+YCBM&gr9$ zd@`un+a?+}pK&oJP(WayK@2HH`~odAAm%=__v*D}&8r4J>ZTqC6;+H^r`$zA>GO(% z5%)nb`kiaBzANzcHVVw0ntlN_Ygq6s0a1)Ymel)H*25IjbFISh$Ec6 z!t5mQtUok>dyVa^T+lKlcXT-yA3yw%N16Otejhscr<@Z-VhH%oIi)o-n-(v8j8nYi z*q@T5td*{4V1U4I0}Q0k4mU}Th~tGye`r5CpM}(fE<2V1Jib21EC;@~^n$ zdH9u7FT6Ajlb7TdOoI0BQYH$;qmoM<=V0SGHo{`xelbCd?p@MxK#kTAG-9%K_dYq{Q&9Z zX+%dC7h2Q^)w#W`$rzRBy{*E`anZ3n&-N*8@j&RX+zjO2fX)Tv;ZR~NA~% z^Xkl$Bnfl|J5lalOh4b3Nh?$z1i%1P%TNJr48MmANrIH;lJA*La;%~PiM_XTA}K5? z50C{CKnin7Wx|TJio5P;eayUZjk&l@BB78?(ghqoBf&D}>&xqi5yWJ%pHzY$BrByC zK zda_MynC0Q>E0TZ#0H_!NVS-vlVi(7EFuLzGSW?$ek}*ttOo-t!s@iiCfbgp|lIp3E!x}pP z4utQ{^y|*`bG|gy9rr}!0I`FwYA|&|0^}21=hneMCwe^bmD+oz}{^b0Y3_mgJ5NiJLCxSue z=^;^#@RRJZ4V=GiKHrwjb$%`Tw(wuP-_?R3RJ=dzC?fPzTq097^<&+}8w3^1DLj6) zNdAl0NWxH&ALA2BzGp^e&&3E;Mpc|15c#}xbhL`nzrL1D$vG2J%^Xiew6lP+TmNhS zPd4c4fk^{@mU>KDg=!~g{XyX2Ru`!m9g2=Xjn`p?N*Pk|kLRA^A6H)Z<$#;^OU?>D0UkHqU&IQ&ikk71G8VP!`;N~Yq)zaYHH`{X z#-?V~n%J9rU@Y|{>C|H+H=ab7yIgerz4iO#llB1Dm#b7uk@v{RCLCBO0ss*n`Gr-T zl=CmJm}P)dh9LGgfn#{#=r^iE;CcwlK6`ulCn+q*cU+3^St}E<*mv3AlF^yrht3|F zNM+!qGf4YF6|CQ~Ip?t)Eub+GaAqbC;f(+UQsvL*r>k?El0g^4z-eJar8#_g@( z*M5Nx96i@iMUeh=({SVH#I=jksT)ea+y4Aw$FYzONNlu1re^7w#p9=RL;=?cnwM`V z^`)rPYHtfyJY7y(rJuLhT0wz?#)U;+E+uN^^OF3R6`8s>fv(jhCyyyU(w_ujj=u%r zo!VQctK)28-Wlezve1Rq=6e_aY~;8zDgW89`W(8J_Y=XX4eBUEskDO6+gF(xmBoP1 z0LBHU&z4+1ngvc535eHg&^yxOib6YqlDviACebz-u~D&dbjfNMj@(ncif5O995)*@ z(fGIJ98s3QUpMugTVq{hPI1>wGLpzdoNj$;n^Y>hNk2bC#beUJ)nW4GoFC#0PAbvP zDt(1lHPF` z!51xdErQq^ap!_ZRAfd8sR#CX$OGTaGu=VIPw$5)>!c_z&vU?iZK?^Z-dVF-b&B5$ z^;k#So~_QWVPQUm=XGOq?%Ew(dCamzQEq-UV@!S}V%(2mORxsp!U2X1@==zb;B03) z?85Tm7H_7x4wX*8(pES=^MwHDopL~jAb2w=?}f|AB3oD&@d1X6J;H%Gjl9{fV<3iZ zKqhFx3bH8xDERBCt(y7zWoX}z(!aM018Y+s_gdD{sbO~u=ORPwJTtj){c)Tu*x*X# ztBaisO&a+HjqQ$LkfIc3&IJGSQ{97-q4Z8%@5a1ZC4>T|0G@E41;>C4W5l=3z$?A2 z63>fS(75II`0Cnm37rAMNm{zUX);-mUXprTQ{R%2{DGBaCc0*aBcaxE@-w}O{wip) zpV)lZRD8g2R*N9Ps0w7|<7|r^+t9Pz|KwfacBU|E=dAQgfH~gXLT|A9L{}*>#ky{4 zm6$-%62Vk>o))1qDfFvMT7g(c`G6!7-` zp7P~hyf@!J>411VDAft8_3;is6dO7WhfBAfhn6r9#X~k&>GdqmQ zFo+H;Ke65Q`)00_IECWo4yXLv`+zyrNb!=ZnmkF}5Uw5fRCJrJyPIwnAww)a+~DIJ zh&PlR4+zfc!c94+i}yR4JaD_@b`TBqyBS%BQLCInxO#mP7Wp6R-QZ+h+L2Lu%1q){5{Q#V+F;UzL4w zaPysmJw`jjKmQan$Z^xZKr4!JhpqwsN!-CACsgqz;}y+;$0>AO5;N9J)d*?4*&o4y zJG3|;FQMT`!z~j>_Vd4H=VM)H==@G5t^l2+`B6$x2)!K^2w=LXxt+kkp(c^9JLZpH zJW`*1QoosIem%Lpsy6t%a&=ti`5&zJk*6|mr?Kk|fsFYc=%UPDLR=FXvud8%SB3bp zdg-ib{@7{x7;#VvN39dtl?EgrH!{H+4BV;|-}dp)_KP9LVmkg7ENP!pG{-7+Vq(xE zQmKK@*3giORotJ2JBXKBWj!&^CLu_lnAt5srO=i)|7MAC)uMrCZDHr6;zUcCwszBV z7v|3GC1DMlvB$J@&_50HI}|L?(LpQ*GxAG!ZJNt@!Tii`)fy+@%o2$a#{_($B)fv2 z0#NF${zLqRe3I#I#eNW9B7V2wlO*-hj!@9VOGn2Pfc;Y0XIF%4zuPhwSlh(8noDvp|Q~+d?V(T1Vmw1cP73LPUmsm0*&&-fAE&{y+F6H-GG5S8t2^&BhG4#^e zJAu(MF##oFkJ0f89=oS>&3=TdkOsNPt|PPUMLEDB%nu{fUk0MIWc&wf%-i7hMv)g2 z2%`?c-%R@?NPDJm#v!~dqp!CACB`NBg09M693dfO#pOv3Sx_@6DM_LiSqj&yE`%#R z5~MTetA`IQNJPs9)(PLqNB9ihJ!dxpN~)WygOtUSSz^K?Ycn<}o09S39XGLflB)-Z z`A(;^=LzMX7pknL)e{r!GAX)U)`{kSHPY>bRn{2I*)x78BP<`&p92!Xwvt$j?=#$n ztSHToE`w{%kdjuW^OpPKJpwEu@K|_u#~gjoCE|8mfyI7j!oX{Nh)xCpE8`seRFfp} zgbK_%qqwm+VWa!&U1<@@7LeI=`XumTYx6qMf&}TVNees8x%YTJ1$+~99YpN4$o3_x%Pfw+VQ#Hj?;kLMOjl@K(5S+%e{%o4wECin3vZcR|jPYG(C5i z3`}3!8wRW6-nUEAq6<4hP#vM()~|dGuKy=H-MxYuc0n+QpUpwuFob^Ld=YwSyX|@7 z^EbG&BWG*5BR?%Y$k{AB_R@WfHEQFeRTbIDX)y>x#J-0YL|K{1q*48R9{%zwMuYuPZ z9zCf`7jE~Kecg%Ah>RY+hx$m~wG(z0Q3my*9{KTrgMK1Coz0j~e9h@RIQs~Jtzr}ape!Isp>6Or!_L8{~`mlyCcc|S(C_gV8xr)(IsX)r@ju87! zv~}Vv>Frp1tzanAw78qT^g|JEI5ATiL<;Prm;SKgFA#W(y;^MVwmNNv$oay z5uspOEEDw4QTZyDhSG$Eq#XQ&<8Hm{JRtX5(ZN0hCy)hw78CHyzz0C_Tha{_olPu#^O!xTnYyr9& z^z*tB+TkctBn6SZ_25JqOlX!~duI=|O}natbbTS<&khSm#|c2%3Tt^^xEp>4wwl9$0YH#P z*T3m3*H+8z((Nr+kYinvczmuuMTj59SNOGt}M)v@0HTocUSQ$vfn23xSac^A-_Lw41|An@O`WF zS%gkf>a5L%^6%fpg*Ci}LlEtt1nn0B^4YDIvY;6TKf&C&2=_NS zM67N-WXRQ_Wz12KiP4KpE&qW1)0b`848Bq&H@eZ$*7<*p)2ZGH!HC>05y%sK;$=uZ z&yHH5x@>3&?-LG^A*#fA2xyvM5j=i%c77^!ST`qnSE}LoTkJNfxVFOnB>r7r9GWbGZ1~qhW{}Sw4lmvh}44zC8IiZ<^U)%db(i-8r zbBreJo?4j{O%w2ztD4}Qqg^q&j>9#}pM_gH@$(3uDJZSxmQObsfpdBp=4=b&e`Z9); zdg}^7zn*M|@bw6~`(9+Q7r^!r<8{r#kU;YdV^cP8sz!PdG?y+*Ddnbn6`}vs;3+@= zHF@u1Rw}!dV$hryFD|CWPDo+|?pt_$)9EQ$j4H6en_5ifB-gb=xC@o8L&(G9{^XYA=eO4X-zc=Yc>piFLt#EQXOy z3`C~6^P|x_Vizy=;Q64c`XyDF+OmjHL9<5Ul}5ir)4 z%uAbLm4&_&$QU97hF=8LCb5`9*eQ0|-0S+v_vm&>sr)AMw!9VjZ&we(0Dg~+m5_&K zSt~~chP4u@^pd@df}YUKpYt2Ecr^0c^x3jky9DJTc~adZ1d`*lFAyUluC?y@kVLcJ!F)7ja2~pHH3lHIbfsjoe9yX&|Z$^g1}cd=k1&> zh~)XTaJMSE{@&R8C}{;4kY|dg3)Usw4U??tzzDQ&yOl}V9*=DAdjALusX<8p`Yw_0 zpI093E)6HIT%XSpNCG3R6Glgetn0-jArR0B2!4g`8~6}V`vgL^iyJG!niY)hhpx17 z>UJ$Xv+>h0tbD4aGw?Oan_ywIf7HE6m&$kd@xL^a^N3W`RkIjq5gY6G(tURIA%2f! zUtGXtZ=RNcH2%Tbw_Ix@L_F$eccaLiey1YWa&$HqLUJS1{82^(!qBZum*Aj<2)9bV z`s~g|9MshA4zamm=dsN9Q;B6Gv!;y1qhoei9o5vgm%%^=1^5bsjm;-m+J>f;uLjSx z5JO4X2nk`z&APKz>AW_OWYsURG*pN;Z|g)`(#*q=NUs@h$@l}1YzLM%A^bnh{w97w zb}g~;Avu(#5XQATqoD7c8A-vst^QZ!6TYvA7VI%r zR@7E1513TkN0;o3^Gw9b=ME&`%oC}N%s!o%`uWqRw6SEIW-rXB0HEWgM5)4FT;RLy zY!TR9^-7evKhHYFTHr}mUGZx{80nPKOKz$n#1q8hZ2^G1rV?hw1lLV~%`qVC!0p_v zl7Di0?wJw#nRYu@YN)t6WJSf#i;3QZ2aQ<2mzHK2e~eV+=-C2Gk6&K%F7fC5I=19& zn0=Y>$(nQPD2rpr>#4TBBbaZ!ds{H z2bFMN#jDH+p3*|hLn-0fladW$g5WW%kU8I>r9jA=uL|JX}A` zjLUGXnIlF=Q7c=2IoGR~`omAXhR~r1QflcKsXGev5wm-WrIQh6VF}pC{?@&6+h;kZ zZMt}FMg69&ySx{Fj}~NkJk;zpn$f25{|DO%wli8bmxG^TC|Pf>uV1Gf6=QaDU#kNqChp}L zG8WCSo?1oVC;&G1tTsGTqrtf9g`K*;H%TNWJo}ry0CNn)8p=!k*&2`q7JN0}EQ^IS z)qK}Oh$WCP71z2KT|Srav-N7ufKc%d>Zo=n0BnqQRG|L@-alvM`+Nb3_UzB|cR)<4 zSqwq&4rnEc*Fzx=6r8M$9L?BEIVCsM@Xda#5T+dns!vFa_hMHa+!Pmw4vKld*lk^f z1Ysvr=%aztW%N&r0D&;1rTUWT8G_oV{2HO-Cg3K+^boG{fRn5AU4$22v@|nEI%>b zfbG{X!e4*3-z;2ro`SuU-#7D|eY#f4YYa#TcfG=4F}&oV!9GM^iKl60`p_on)M8-;W;1JOv@IVKy#3~1gJ+P3YN;gFRv=Vk2~ z8COI(z*_XH8L+BmzvDxd=4HP3W8YG}bvWJpRgjV!wAK%-^gl@g-LjN7k9TASNE4Cb zfz^P#b8_UF{)R!_AR0eKGLi00IVnm-&>YsU9C}Rx@BKHtA~)qKbx8rGeo0{mA?E#i zRwlbQ;}TxU+z!%G#mw#QH~!|BtjGohUDwiW3YSYk+dX`L?ZPbTmvV_Bl;+#!e==ce zgIRjZiT={NA%4NgiX%nE<}!ib%$}<76X>*)z6% z@hMANLh^6Dt$n|aB$GxL+LhXEa$}#y?qU9OJtttVv-`3m-W{jeietc_lzV;Bt_D{J zb-pZSnJx}Q9vka(k8pMZEUn*~SHa-XMECZoDhCoARvH#Y7Qom9zeGGsM2nVw;glrvz^vcEw`= zfEEK3i7j$VYN!O?N^uT1q|Q^E;6&}e&lW;KLg7hyQcB-(#iLF4%P}BsSyYs|ZqFQ9 z>mUrt^n&2%ZIsecAmGXf^jBvi%-e8_nb{V7h7&SU5eEVPe_D#Ee}fD67~pQJ5;)X5 zuIq@Sp$z+LxCQFIZJn`AZ0l}FJ40>Q=157w`;vbsdrEojBFS`m!7-r6T2*xfDQk~) zI%-95eZWA9*CO_mWTL3t4EZ2=0-)ly_dWvJ>+^r8XcCF=hJ$QAe+Fi96GT5+LpPoCna_6?su1=325pWvu7;zZ;al|g}l}Gz&6pbR3&J}Ddmlpg$@6zr89dsT#s$yDENShge zhhd~iT8k{PxcNZfJo)uNnnV^KHh5scq+6n{z=aXtupve!H|y>?`<*iFz90-bseEFd#DV{Y5&=9mPn4di7Rdn+g4!-wB#dTAL^y}9NA zqL1>PYcK*r3J%~jc=RW?>StjQ=zoQ8WupItP7*4emL1a)Jg+epzdJtE(0q~kxY9QBO{(BSgF>=o~+fm3Fn+W;bI zODg5K2_lL1NUxo^&QJHTvbmDpl0`Upyto6zNw?BnV;$gGV+)5Datm6umJ2@^9}3kw zee8oN#1B#bL(V{&s!PBweeQ+oo454-@06cv=?}uSDKK>$H_w#MkK9u(Pl5&uoFCGi1S0UYmqHJNYx#GV%@=1cKO9JZRV>&vF4b9fc@uSPNh(W4e zTPMI9u{N&>a9KhGM8O>0r2lsZp6lq$}k7rBb$j?~EsVHF;)>#fby4KQ9lQ4x@TKHg^2~mtpE2hr{0sV%E}r z1ghmeawX6rR1FP4{w%lqX6d?7>jT$n?%iF;{lTBjXJf0^xFASFB6220PIvZZ^J>1`JFoFkE^`%hF*k_ zY3HW^(vn7g7ZED50f~{bGPgcOwrhbPk;A@ezQId`N+Tw^xHzZQ+Z-`Owa#NjZ}&+D z+F`gIqYXQ5x}gQNxgyjr3CNGcc~A_BE>sQtX4d=CeO`NiL+m<|Q~N?5rcEjPYo%DA z@=y*MIFXlr2_Yc}>EeEp=6p4JulN+X}s+AUcF1p_g*vD_gnx@ zAI$IL{^8t-TzZKkd`C-dNM+?_cRhbDcIAI{rVt~p=OA$p*3 zjUEDK>I8sszW_7Jx)sZHs;wNhs+XaQdc>bPOaCz`LFh~d?yznj#_aXH!{8h=qN7P- z@F!yy4IG|cinT}f5r*~vOH*FO-r@Q%HouctoBJQ*v4Wl3BZ9|PK-fl@Yq5)Y2zUB) z-b>2MD`uvo1eXm~TTzc|jdef-k}frcIo8-H$vV-%wsb9y5OoZb0h$BINJ0m&obTU! z7|@L5kndw4X`+AEly{~*e+AHLs{cN^uU`D^tNOq9U2HItpG|Q{Nv-Rm;Qr^!$Dg_RJ#=ZCU@47Sa zr&X+ah0CaW$LY4&AQdoR2_C4i_l`NUV0Jgbr$ObQndVwML=a;-3}|bUmjESYCz`kC z1cpU!3%B(E;xtQiI=ZKY1Cwf=H9xM}@0no>3KtFPB7j;RQa zW1;X@bAxdvCO+q-)t!Z}1adQ#uvdI{PODg?v_~)A2zhix#*N-G8j*aL$xgvcVv4gh zR`fz%R5bj5qRY(R2nwZIH?5NqaU30qsio|tzB9BwEzvpRF z(1zp76A@wO*k`?v58dKJU+%*!QHd(wFI|35_4k1vc1MbQr#uc%?KR~OK{m3f27R6g z+}zarFXt#^Bz+6*lh+K>5LuRU=hL=DhukA1<~P2ed4l>2$&{&m!gznS(oHqNqZaIx zj@Ly<`g|##rqndNjIcJ&ptxzIbj#VH6~)tfUYr#|2&rnHX+(zk6Q>`wy zG5+_NIuAw3O-}0wr961xHc81whC*LSv~FfPCF*iD1!sF%@F2BiHs$4Ry%^-~PW_+y z?%MK0NyYEwI?H1Hes?Qql*Ni2){HMMl}@**sbVnG-3{A2sC}7y%h;BUQYL5o>ynzBr~%oLK%TKZh<-?=fTQ{rqEB}KAkR& z$!(N0V1C165%%A1_7;q13`2FgQPL4|!UYrNuN9U*M5F!kwYn#SGSL`V(xE(U5|OKp zOw+z>ciHCKizwzpjzryaJ2t({p5M@tnR5)n;h8ioxU@ZJzYN=N334M26>Sngv&RUcyJ#3*luapyc4r}(9zLbOdCDJi0_Ov=l31{e_d|MnM z>n_d9LdOOv0~s8JYRXqN9*r8#zZIFoMTzphfF}GhsLIpnpEsSMQbnK-94OCIsL;bX zcSg@o!mqMPp0;M2`J&L!rF!4wF-)+@U}T@};l$x|seOL@YG(9AsPztsdTYzzhHS09 z5;WmCX^6r3WMc7Ns)j>Q)6=0U`Gx?v@dPZ=Yknl=|HE;KE{W-$AnGqTptnOTOM9D7hFQ4fDPiy?A- z4V+IJVgmWJHs($J2A^@)xKn+JS~`VW{*`& ze{kp0I8mHWYnjrdXG7^s#vi9MX8PaLTwdnVjJ*IAC916{W+&w&e)1%1x@dCV-m7Aa zZu2YEY~QpwDE6q}Sd+(hpe`Lgo}wSY(XE$^AS9jBIxX1^tETZ2Z7eHUN{_niO!4Jp zx+V8QjMJ~Ubrc%5oq#z~T`6kk$bU8I?d7|a@ffIrpIKx+v&%5bkqelIH`km&6+2yy znm)ht z^fop=*Xr_{zHfOVu40R`2o2mIbBwZ2-vYYYIiAfURlj%xKUBrQ2la`sQeu3it>vxN#p3G zU_^&LKwdVY^ADal^S@6PgeFC-l!kqT+#ePHphcZwJLROhQSK|T`xy`)zwz{Uu$Os$ zF~7CyuvE9e`@=CJEdm-M>sB9{z(U!=-$QLDyU45ujaK5BM;tCEx-S&iIrP~azZ@rX z@v-%h-ZzIvW-i}K)}v!m{FtIX8iq&XFitq8{gr*}(1jvq)sFBaMAoz$({zhM!>RKZ z>(X}M9f$I$a~`@{+mmup{(&83bhCQBgldG7Jrw&^OjLGG+)mB|M|X0^ZU#2@smbVww@ICbNPM^9JShAc^4QtafvzK zZqc)8%)QQ{we37x-zTaxYvYotPI0 z0>vENiK%pyG{(h6Vq?BOTkgv7|N6U7UvWua4R;H}$o@l*x~O|mP72RT++QCPIdQr; zk5;pXER0jPq;%%6>1pMbXt(J!bgW?Sd+*-&zZ+Uo?6904x-)Y-^{iiYe|MmdKdfx_ zr|f*U7ON21?s5z5pYKgH^-82&Q?lMFWw5*5$oQwN^z77i_SmTmX2p<|3lh}o`v)Vn z>w|-OJjbJX8V%@VaM8I|ldGSbUa?PEvrXAEO*JQote^R%8No3o16*G&Tx|m9c2cTw zTZ3GOdwKk7AbkV;2vkIUi)m#9_CcamLxrbt#v!en&o7#_a~_-CPEd^CpK0t1$Fz$W z9KpPr$uttr!dM-+oJRj^ZtzeB`gyVA?)DU8P)sXod3NRj>%Wfw@apem#F+cktPDuN z;SzcH?=4jsi}1AV)s$Ln7sL*8xitUv6M5{aBG8kn?qr_i({%A2y zv$F5A)|9YVRpmLtcBXklZ%{HtKic&a!!Py;_GuqsI~fyoIAtjBJ30Ou{C(_Csghr$ zQjo}%iGH|3vF*Qul;hF^8R5w`CODb};Arkp&1$lVG@-U)LK(N2u-FHlfk&5uX&6Gl zIndVECoUPwb_SZ9KGBcjk}`K+boL|QY3Ss#QiawCK^LQRR(N$qSa(&pS9f)$1FeXG zM|WF^apqlcRm_A!7W@LwurW@11JdL``nz=SCgRQoFQW-8R&ZHhDbxDM4hzDyx|LL+I7I7FfT7RPt;_Jjc;o%0|}4I0|(m0u6ufCz02b zG7%KLpG*@A+~?YL`b3qfQ`Hc7U)hO=^dUhaDrs{E4rtx{UId$SDYf=j*Ll;l8r~>r zp9A+s|1HjD)o0dSr~Omnb6#0iyK)O|-%aLkT;*?WWVJ+TunsugYImZGri59zsSl$Q>JGFMME{|D&}OEfac?Kw-in{ zt8$1&JmO}6iZVn8Em`R)TjLg{yyAux3%G62@j}wW+e)lfUE&>dK3$w`|HdO_Ga3gA zE)8)wbqk1$T^CxQCUnTP!WSd8iUsX4(MOr_coyeftZF{`drFCIWv8Sh3_oppur7R2 zC-Hhy%(r${FuBS`HX5-=Gue6iCzX{vk*BPfUc$a${ae5`wvOxKMbWs3SA3);8nW|6 z==XL7GS=+0tBW|#e@}?+23a8y*Zs!iA=Eq0oZdjz4`k2~XooSn8*&I4vk#L zruX3ZoM03DKJhLfJR~SMI^QO;uJ}%&Sa6k6YsgLu+3wsFqZOWKo*)>m_VQn8pQdm? zS7k=m~1( z7we@2nuZ=yPO_xo5kVY5p&I(E)0kafmP_QM&zLZ?hS|-)(lWhyC&u=omV`OqX(u+> z%1=Cz)mDxa^&?D|pPqyI6|%d^sFYLu*!En#Y?`v|F4IoxGo+P03+$^a{~djiL0E86;zxm?s*~}Kw+k1LVw6C<@sp+ z@|ayb59{G#`A}7A_QuTCGsKLTWXj?ofoDO6qm-07jSPe!I5<>Oo)=LBE0}X?dw@%u zoVOemyyq61X!W>g3Hw&JPv`Q#9f8;4mebhnmocC@{4JgNETuX0IvftS(05r+h}!Xs zx#v|vV|k%-QB5$^seVz_XuKo(w5H)*x`Gl$XpjJBK(+TZ*E}sL`kL-<8szN2PlY?b8m$E&szxm z1$lPqKNg0PX!I5R!3!6EvpQ@(VGI+H>=65ApybB*J5RUZ+?8(igKa(-(I77$@Yil&kQ%Um_NPGw6$s!kMPualgy}!V`n~u z9WIh-lIx-7VcO+UNlHc5xK}@Waq*S}VWM)$>SquEU#;Bb^>(OWZ`Ct6Pf}5zZs5mkh`A6~y4(iSBuG>nLTTEvq(3gU?)# zG!tDDo@k{o@?yf@`IaBSPp0et`8DHyar~2H$fdnOJHl(Pr)M>)5B&e+0o^pGXzSRy z>^-wr_6*55Hj$m3 zIAmvMWp5&6uS(`g6hbzKWY4l45z0t~NdNov{nhiouCA`HG! zghfhs3%-^im6f29ewtC+lA_+24~IgEDIbe^-VeT54{G9&p$|jbwp%)LuM6m&nP9xi zUU)Q%6&O$0i;)4G{fbw6w6Tx#XDRBR_OZEqEzX456} zOMf%!DEg3tlZpCR8`lY449{g*nNZ}+ri6HYA6e(LIKn86P)UDBK18ZxM5L=#PTr9j z-gGF$x<>RDq`+9!%{oBkqGf0IN(VSv(h}(mn=t>hTcn&OXVv*W!9@`oFjIKO&DT;L z+&|<$rZzIulW^7Bsu}T3s@2V6iu+DsFTS$rX&$n8Cm$nSN2)n8+b=Y9zKd#ArH|vg z10(~Ud02_LG8&Tp=Dh38-V@1)h>=TVDU6X#v)8J)U}S$wc2hgVxGBry+-)|Uycue@ zH{pY2+~3V2)AyRhPB+gb&*VNDbeRj(j!YENH=^Iy;EBk*5oqbv^B_CriM^TOMDNUV z%(4b1p|2kwTGjx;69nwdGD{IAzom^Sg@36&C_mIs=BQU(-he$J2BuLcH6d}ze7yF$ z%dfoeWC3G`83gdAEXR~vRUty5eh0nb9^WN}+a@k{d?$o(YIt#j_vB;-r#bih!6PKs z@=58Aalw~1;a-2GzvKY4{iH4$cG6J-O83HBD>TzzW@2g;6SP0#jWPtMwo_va5+9J4 zNG}6u{1_v$^-i6j#TvEov*%>4l1;$C8%anY|4YWR{-W3(+7eRhezKm zG@>4@%C!ziFi%-XCiKSfG`$yw7hlrohbPyGpV8v^;i#GgkC*AC=XcWVCgLs+Oi9Xz zhY&4H#t8fCv67o==Qz`~$e-#>*gevWxn0iRscXnB5{}xra?cFIb{$nzj9mYc^SGjl z4UztuUh~V!huMSDfq6Tk4K zS@)u{&Dr&ym%Vc@YD6Ea4?B03N=MQXcX|e6 zZ~1yRYu_SFRuLdH3`IH|{0{uZ&>A9+mOpW4@9D=sekAAvz^fde>n}OW60;e0TJh|I zqSMu4=k5}@i=#e^ z)Aysk=4%=W+v|yVj{<)=zSyT=NO(JWBTJUxlnm?`s

5d(NLZJijC%9m_9b0w$xO$|(8 z3XglE=Zxzc}tz$qfS~D29uEQ?0`~?N%d*P?av%f-Y2XV5*e3m_qog-=h+3|1kPG5 zBt!-|3~C2$Z3^Bb@tfM7{XErRMz{9Po*{9nJ|~;Rkx<|*0EzrQ)f{uBNLvTS^NE3+ znlTrq$YU?c541__ShY+?R_&42VEY=(x1}3&ar{fIfiJ@I%iin-bD%E%tNUSoE=6-! zJSk{V+<8382wx+E7{o=LRO*=8Vj^kRuO6uhk|$z=4Dy2yD2n?un#FA;=SXu@oJ-eT z{n)m(w*8}zp0=!@waMrEl~t}k#2FV0EW>B^tns?Ke0$S8=7kq!39qM(it&d+YXCM5 z$DaC_FFL*)0jpPbwTN10nL~wfwNrM6t|#we*71L@NeZ4ChZp1d2ze2bwY%c|>%(Vv zgX7PWPT$$QwlF#Ll2Dv-VBo-jUpbHEqd*=@A4v%^GM`=WX0*y4z3 z&76wOh*FlNwK0E}k&~$7NA}K|DNpOtH8&G@Xv_KU+8YS;I^dgIgtN_xqKfK>bV^7Z z3{0<#m3Gg6t&P3@*lisPP|T&qD2_47=!4EBhEu+azq&D({W5gwkF=$JjQ*R^y3qU^ zGkW;Ay{UwTDK?u}cv@VZLS3A$VIYI#@SSx>50<>)?IU0}jg`XqOM6(pJfmZ2)Eie^ z6)T`Dqi2~Wd;4{zUeSz~fwyv`cGKvg%N&qUK4U+Erlzp7@^BJs-;J?04h8)uMuj6e zk|{D{F@nuiu>@zdx3u(Mq2jG=s`Oh?JR*tG7C7asm|FGcRn@=I%*ngoydr;ZhqPSN zn>^SYst5I>vFP7ajJJ%6k+x0{>^Ys8J(?uvohQo5MGX@$DyL+r{Fixy+YQpd=DrV0 zY$hJhP_j-c)#dp9BeypVWUW*K11+0NoeG1M7~UP4C-+Q@9lKNwhwWJ%HKNyCzNk^Z z-p+bQcXHl2xPEZq?$w3{my4;>Ss@QOCa)mr6rOqvi@g>pDXGI~*A32zmGtJl5WBiO z9wY5SmB{`|^5)Fq_#vZu_3M_kN&xHK^CXQ9^FLc#0wUoh6m7TkAMPTP>lSHv=S-&X z{=dHcHmsVI*raLc^H=k94wLNB)!7x+y%G}2aqaJZBk%JmDMc>LvL}i@TL~kgc9oF6 zg5Y3~@sDjT*OhQ(OnLs0lB3*nV%*L!md<&Ed&0=X*u~aJ-_fG})wKD6gL3{xDx+j` zR(TnoD*eICxS6K*CdH;JhAf$1{fh(nP`-_jL1YusU@KyT@+qVDr~z#hi5uaiu1q>= zH?I`a#~L?eRGz)f*pg^7p^Zp(B_mS_=gH?``ADT?| zTL0K*lCB^#F%ewEYJ7lUij|YXoxQk7?Pp~*0^JS&z972ROr93m`L;s|FJ;7^prHLk?8u|j15NdJ)T(N z&Pa^HU9$^=ZjxE*E+o}m!}y#v>BRE?bFIO(}czIg&+5l-R4wCp*6@N z5X&x|bUjDwGbo4iAbgeTF^>pSvfPQ^Fy-+t=8HSgozgT70b9mLY;T)iqcFEErqX5* zf8l-AQ`2FCwQh<_-weL1bd_BxzOI+S9nssFCqC;j_Ia#@`iP?Vu)Lf%jZ$~Y5J^}m z6ZMMJnXdh*$2SAytQftG1{tg7k=t@mtxGNQ%_SA8t?Uw9Gy6(PclJvtHO0!5>i0b~ zPPO(1k&;(=iVxK@a<*q8aP+%>1O;AYe6Dz$yq&xg60(o4FW=Ld694-n^5_6w9S68| zPR*E5`u}Kn5Pv7cio^JYo8NCnib$32xWz#o^B(i~ z3B$?r&qM+Fo~W3ikPSCimBJ4R4omkP_idy^%ew|w7Tos-4;dK3tWVViNSr(>_|j=$ z_vb1(H%4*xL%VC8roUxP@1Az~{AxQQ3dC&>@q0Cv2g#tk~bemOh9nLB2S+S++ zIcPocizzPOrM_Ngz0ND=gu?r;nm63dZhquSrG2RfNc?p zd02y=N>XU+;VtS6)N(!?X5kSERA|!(RrlT0LwKeX@dBfc6~M%&8}XIWXDX>x6fY{6;{|D= z3$~JrG{{=yZd%ip93)fg8yF_azhA@Xe+z6f=g!UiKh`UTpva?NY%2@q?Ptw(GM6>j z{bRWYKrt##av(>ZTW-FVx_fV1G2*wxt3_F@sI^z6HT)6uK(4ooiZ?_>VMY2)8WUXH zq|-ygg}}Pphf_Q%5+|sG?Lq&)5f;{}cIHVu*_`{BXI7 zLeT4TD`$heo}|yuc2XB7a@H}5rSC3!E zl4%*Xw@vO^e_D>OV!FDpVO#H}Wc;zVsQIiyAVpot;z%!!EurArRiG00vWR1ax!I^o zRI(%={ZmBFDl|(X3@`C%Jn@fg<_A5nm>(_j7U+IpnG{mnuiriJi1SXpq(Pu;I)BAE zd-oZE)od@BrN9{me)y#r_-YItUKE~Ud*cDGLLh5`uvAnWmo0G}YVmM9y5P1+1P{M< zckel^^qvxdk9E)Vc>d=y2xAG3>#>1XH6OEgYQ%^Ir`phBZ4n^0gVHXmMq-E9e8TgV z&d#C;C27<3=+!Bk1mvPaO+@}v3=qYF`>F>M;iOE7vSe;}%dAP~#fM6>e+t_xgh}yP z-@&g7po#*utBABaKI$K}tI!M_V9bqtIr69eeAB>F)w1-!U&JmA%x>mR$o@kHgz1v@ zRMgDnN3wO}304UISa0Bjo`N_K+#=J3c@aI=LZtuLjzl4lKSB6YdDs`G5P^a4Cqb}( z{+y{;3n{f<&cpw1X%uMqs~pEtKx)TVYzXTF?baocu*+IERPCT7-it}PgqHD;nJaa| z&jkXw!;ML2=g^2aN@JNwArK!+ODXf2UpO^vI4^=g<-|uO8U4?ba@Hf6r-Dx1vMpJ( za(Up>7%&?(NkH8nc;L$S-E1!@zcU+E(duo%HlX>$KS5~VMcfUoUuS`_yv`}-96~XQW0u*Kb)1|&A(N2FD#QgDxx`}G?`X213i>VW z*TVU5yZev!PDS^hif2&(da9p}vY~ocf68aO!*D^0Z^yZ@hj-Au8K0D$7R!1?vpuST z>vM)>Wc60jW3vBQQWRz{y)9SCTvdxF1HyIv3Sf5Uy*sNmVPLzVdHrk0Z{ z`xX%wTCQ?GSmA*G2y{mxymAT*2XYUfkPH8J9qKd7QF^gH&%^|U3H&UHd><-HndADs z!V@AQJF6ab46h~$Y87EZo@Qv+n+@>-M9H~vILqYGgTr2pSfdO&wAo7x0H zYb5Lzb_GleHzTDiRe@48684<{DXzHKp}$_wfb!y_OXctlc4qb@iMgh~^7oR(g4|&) z_^;A;T`sD;lV%uMT)v2w)|n!;ynKeCN-?+6KWJZ8O^Enbm+9$3QMz%D_g;DI-rs-z zkaRhk4qEu}UBuQpK_S)eD1l#CP3w&9u`TWv=d!lAR-ifPPzK(=1{XGif}^(KJ+~Twd?)-v>rZETcru`hgf&R~8%bm6)eNVAWrDIe zh_CgFW(axJ@?Bta=5sK|yofslwqkcSTP43i@71g~k!eQZAA*y&A2d+%skUC>k$P{? zxq~#Log9S3&NZ^uyJoTrl9Wi>DLiSJb{XVbzXS?f>`~Yv>qcmnj}-rb^;sdXN`hY2{f@f516%mA znB$E~3Dqr|sl;Xla_2o~?6&()O-Dt&aJt1hPnTl9NaOCcRVOTdE~@;RKD)3;cUu?P z^U6a%gVX@LF@{Yka<}FW$5{2PJEt~7FRbQdXJKD^Ca$KV_Weyfq%{0($cIc?i5a?G zb7916!8C>zkGT)0?e)H<^faRM;^6nId$ZQ{Q;2LHW@{&=+&N^?0C0+UZ zgyK-?sP{OPb&7SCxlbLt*L1~aC7V8IyIv!)@U(pXGwQV~%_(gx1L}5io8=T_G;ky;Ua>=_5m$R_-PS1(SIBjI}R%y*F`EL z9_$6y^}suXWeW~X5bH7_`vt6m8qGHk4t@ujvGx%N2?f5G3x8Vnt&nr8%cHE4_lbWj zOP`r>PQgw+%hG#Opl#pcUjjj$jN0MAx9kp{LKcC<8lz;wX)=k>6*A0>T@TziEyK{K z6<9T-N8ZPaQclwi&26C{{*=$n`%_?o=cl^=<}>q@=@EW`)Jg|x74)rlYv?gbP!mAL zy)+mnYFz2Id@ETPSLvg_IL-{nlhre|FXX*;+&|q4`P3n9(3?8mct;>mm`$B^)}+(N zrKr;H>cGRuXtXV{d~W5=-7VVc>$HAGoZ(9lzaa}vYM&IxQXQRx~PrWJ0Zxi?b zZ%o`8E-vHedxD6y%fy-p-g`wtixFI#r6hwG%n&LqmGxUAF?3v`mf$;7IX6{(=y9t zp1%Nk6f_L*OJOZ9#+N{M%?VaS!5OrOL~dmIaYog}f@vhyX}Nv4`(!w@szUO|RnW;H z9k+zmzpCghL|mOfcA$Qu$L2t+DsZw@AqTQez`@;s9fikMXFW`l_nIr=J%t_LKKG9C zYCttT^6y2^U&T#l)7YcGOx4P1eF}JBx%lY(WCn7j==1s4%?Zedlov*qva<1HTj@J^ z|DkP<(_*h0>?~ko42;=X%osn$}kH(F)Fkk0yUI$4xKKnYufnRSf(BrI&1*wwx+hxd%$j5|s<_g70)!YCD8VhfkR_O`I@O|A@Zmb99jt72D#{HkxL} zQoqDdu%SAU5~|NC4y6n99=u})tTcTQ+oA2c9L>&9bnaRZ;peygYjZ~HM44S z?=iKuHlM-J=m`0HahV|cBb@W(Lmj=s!n^P2b1Xddz%K*#8R%mjlF#iAPW)oWz8{^Z zaf(Y=kj-8U`8}a@{9}YFDoNow+493=;n(gHSV)y^OIebME1YCp{AfrWmj zu}ruR#XC?_*7|uYFDt@UoxyV+MrrUhPNQ`Z;)fA;I%0`~86*a?E4fo{pMwi)Ou%&O zss-Ad;vzXfgV^4RCGG3pe7X<3_IkpZCOzU<`gU$@VP+nm%TJICd?nKc3bQPoKX^99 z5G^B@F#jF!>kl4LhD9_vfw@e_2&;WVt+5YI0JufVxh-eu>B4oAdUk3>q0@|sIr;;$ z6d-3ffw*HvgK%GJ*#bc$*a(u*<{8 zz~|$fkN@Lx4fIIJ`f2_o3+#N4F2QtQwKAdX7;KAJ%FzJ5%&Aa$4p&;$F$pM{y|QF3 za^mZpZzQ~amBgX`eQf1@W#*io49-(8T_Uql9zw)I#N;rt*Q^-#xh-d&!C_G+tYL2- zrTFH86M%!ADrIQ{z+^~sg;PsAidFsi&Ys*La%qd65y+OWaW*setDFvgxF?k{x7LdI zlVXVpQ9?%Yj1p_#MIgOm>flmXG#0h567&`2ryn?Y zUaEfsnoNy2)a(3w)Xs#?ec0u@yZ7dj&yfVb_G=GQ!+#$?0z6ND)YN4!#`^eDC@TQL z>@uwxks#Yw5@2vq!$jKc!xBQfe#1L0eluI9pUfa}5E*zrEJ`qL)n}N379N2{-p*Pt zt$Um&zYZzn^HISf`<#55vN_MO-lE}pFQ8tA#6uIQ-UH~;-JA={E_BsnIFMu#6ceCry6aQQ zG9YZBigjaIsQSHL9MI*eD1GzQ!e>@o(uJrS%#<}w&}m;dE&l0A?GM$7|9JHj)9uvA z9*ZwtXVD~NL*K8u4g;lBBd%fU4)D?30}EHKq(3=#;@5C(Xc&gC;1S<=~a=YH2I+{x@M8e11kF4odBKRxce zePiN#R&IWxW~qwB-b^9twROh=rl)~ovvIY`+$N6A<1_IxVQZjJM;)?#e1d-W_+JHT zsE0d)Xv2{&xPHjGVZ8*t?;Y~_>D1MaiN9qGOqaJvrktIceSb>8ZI#tm9U8SR_1gHY z5PvfzXwUC6c%`ux6#sIp&Fx+IN|jZ8oGAG53}TQ}=1Pz0_wrLIIbc3sztXcL(pF&? z(}}o0=AB^pE?F=**TUabdyM2{@YXD##!dBAQT#p-#<#2B1OXA!A|y=3e? zEEh=6U*j7TOaF)fjI9ClPjRKL0p-^k#nf~)7`^mZsgJr$J=nIm1W*&1hr%aHvq-QP zg0S5IbwJB}??axa*Ei1pxplVA0mES`v~tc!FA7F>sP;fKKq&=l7t~a{?mTfxalNq9 zy0>BM?i3cAzbNhwL*sILZ+Cc6e9O~L3R9w$g9ASU(~iy*0<`XHTlJKkfeKpiEyb1J z8{;K;rV#O4DiizX+m^gHyM9Ucz~^P@b8lF|NG3L|`cc}@b@hJznh>yElSEqM5cQB_ zD^-vE0+bY>@?c8RFM4}}e$Zu|7v^A8?*lu5Pc&GoOvGlC!d8Q8Hrs8!`55Qwm)t3o z9C76;mT6$mvB_rBx*Oq`#Entt2ckekV@9IoM&K`R+&6+4iuOyyf>*z@!Hgh3!)RUa z*4d)6&+vDS>3UvWKL7!0JnsaFP{+bcr<`9zmRNn-ShU*mZ(bmn79 zV$qPRW>`DAhz2Pq?Q*jepN9G9!*N|olg2aPJ$B+X*N0$5wHT$GzS7X-673bRfQUtv zx9L)Tf-jz+vipLY)Lo#9&c`*kT&`tuz$1e|D)H2qEcIKB@!T~ISdGM*MB)knH?sGl zQ&J}wk00Eg@{y-9jKp}yyySLYR+TcrJ^0=URGMhlurTVQZ}H>v|07sDxca)%=lKPN ziOHLD5B(&}FzN2oVqw~n?mtT67|CqGznsnb7`g5z`*r8N5i#^ecnG3^WF7YxrSNbB zq}}Q-1$Rl8CcGnQ_byYRpAyD^#O`4ABO%*NTZYrpQt#8FwWJXPe=h$}u;m|mB_hYf z^M@v-%;C~}OYqz-W60OT*u2rMQtnxWD<3uL?P@UC2@omnzkmai9Lju=D5Zrk|#{6lUM5n zzJ8Z!Xu%i4>W`+zmh?J*5xmDUhYic*j9Eh{j_xlBJsJqz`NN{XzGv6a1m-K%avR|+r>iXlzccd?dEAX@KG_W1LWOKX55#ZE2+^Y8GJ?`9B^$TuP zu}nv9_19DaTd@;u>?zCO4?sW(U6@fOqiB={sSCKy%|WiDbzgM*xe>X$_S~HL@3-%v zLV9;`Pf@6cA@9&M;=-ICYHRI44_D$|#(bl*d3e0|J=G^E96m0|ohlKNhP0?6XtOS> z+Nsngs!w; z<0u`S{}Nc=!9^q{NcvQoO7AV2qHAIsfV_Vui<-!a1yUI~_q9$eN75x^!KI+)Ihahv zUcI?@a(lEBNlu)MmUH&!l+}z5?lumD$p65QPxJ$h*yO}&x}lQIAG@#mPEK9SxD>p< zOu;s_Ld!~bx!rZogL5!WqILDXS0dIHdutT~SXFDUc96u!15KcvQWRTlt&}c&SL^dP z7w3I|O~)=PnZ?pNcjm-KiKy^t!O(r3&x&*aUgs z{h|REe}P=KdF;caB)b2NvRzeX$_U3$ss0y9q70Xnz=IAdapJRQd|)DFKWuWcUzq&# zwdBjA*KYa)n>2K|8A)%7!nqzYwM=he_SA`S&Sgo1^+r^Eu%^H%SBK_^H%{==&|1hgfV3#|>Pph%|`ZDDw=ZpK79e^e)=+ zy*Dx(Hz_!0r1%sjKKfwpV#ci z&yI+F6o1N!`5g>2Fl45Ad*UPu&IPdZX@JT7c=vWJxGfHrZpVTvnDMDv9GQ51SKv#& zWE%{fbDcPwQd1DY^&Yvvx{1#DHie;a1Yg=2r3m~5v}$r0kDu5NpZ2W7CKLY#LLiuA za}NEa_dJC5N!g{XlqZ_wGV)C0V##-Z9+Q0;n7JCfP;l~d%jfFPLhDa7aQ&GsTFBA` zz!6SXwWY2@)y1E^`C;KAg=q&UB&~;m)Ot4;tqSrM{V4PO`EyZh*xUO!B|f$vZ1w}8 zp-ns>B)z--L1TM6`O(1-htT&|R7|IirN;bkwQLJ79@nkvTVyQJl)F#TWcpEoe^r*I z5wJK=wWZnzQnvdinT7FM3`66?wPGM(wUl9!RS7KLFmdL%?`vM|dEQB}(42b)$lhBA zwP^Cs-#%-S+Nu9dgrTeorMYfEPz?@q+zq$|unc?m*Dl$R&Xh^~Y&N^#14`EGPlEd; zy8~Q*j|VM${a(3O(MJZr@w2OOHOz@%pH+z(c#ERE@E0n#36LAXMsU+gx zf>U1^E~(#K{P+%?%*7WdvEDw}=k1w?rjN1JAu8nOQ#K8KXb3Mc&w$4;6o9`;M65$m z|4eQr1R<(LSr?-FxnaOORimhk9-$i3iI`}!8PF6DvL!Oayb; zGvvo@0^+Ex$fVc*Xbkh$nIpRRzKZ-cP9TE-D9zXQ|Ft=uoPv+kCO_-{&{%vR-8vSu zzXT9_pSwZ8q?^sdFlgCSsEhKu&)KjB(T0*F@a=o5nwT!h6WhnshDjDuazG0@@vG_D zY6~s%Uny-Uw$<50l{L`cp+o|00mUJ{ZHW>Xd;jFS7cb8AvSi)IQw) zI0dUbqK6M&EM62-w4f%l1q*%fYx$002}qY8FD$(2*yrMla6Fk@T#9FZclY?jA?YQ5 z3I)f>s;9NDwUr4I>Az7kJ)T}Wqf0~s*p}Q%MTRO?D3l;@0P2McYcNsubA|%4WDY7d3@pyM6PAuHYg`2e$5f=H8Cg0eG>Uv%>>e`5C1Yx=2x(3 zu{*%I3k?VplQHlIGVmW1ulrF#niV|l6db-w2HyvmV{V3VYOVya}ldD zL2-rjW;Ux*2K!y(*~f^LuG*bP*Xu~_&K2{c_sWJUKG&WB@dpd7Z!hl(-D&I-h~#wR z)*t}>Y|EG#I%yvI?p90(f z3a)BDXt5;deyntAmkC1~BiVf6C>(CcP8rAM2aQw#E_IfA83 zPhZ>Y&GlPVJwNi_F~mc>D!T^c6MPq7vN}23qO;EluPOj1=GskTKn?Cr)8+T#K{@qG zL=2yQxP1P>NXWn_rys3o)7d4>pwv0EA0-<&le|+P2y_fS+-+IpPuV=4gvZ|;Fz^kWV$L{!n+gZ?4kt2dwg;~@?j$j5YCu@gP0$R2SR zpb9wLoTN>$0k~p*Ri0dN!knl_IqynHRicm^z+eBsy$CFuY`)+0rVLaiFGE~%n>6hJ zA_XrGA|k-L(5`PWvBMYuQyx@d_m_0ggu<0N2BH}QHt6h3+0;a#{6KvlLORLHSzur+ zwaa83^p`O(3_2buag5Wa+=6`tL`vvIS|eL(7+at&`6)J}_gZ>lfb~AuAOM3|sy zOEy2fwG2sZZmW+b;I28VosM-TjnrNZjL7&GyzQjYJ_S;E+AiO0JPYLjzicgLJQ)BQ z|Kqa?sjaK1*Sldve!ZoTQJT3@7f^@Cu$o25Hl;i?ZvCc+G%CZnYX%}4yHi%5VPLl< z{kqn(mz4~7M=zsOxYXuTP?B7!Q-tG1`92{Fw9D{b1!CCV-XfynIjJ+DHUys_OA0Oi zGx6(Ac#}b)+d9oOu2;H9oT~_#EkJwhH-WEl!qacnFV(08(~RVKPtY4R^&AV}pvYi6aVIWt-#RRKPS^QyvNy4ceGni-z-Y{1A`UGAEdk zV-jhUtlssT?c8dMdRpd%$UFGdjlrZuFI>%EgzNs?3L7H1NPP*Iq9R+}vEiH~xl9=z`8KJW*l$A3&O$tk_p!2tACzD(YT3PFAh}xiRlI><;i{* zsn{tBY_k(KaNc*3rQHWvXxHJh%`+riR9!n-GMsaXWYmzsZ?_6=2@glypYVMS`A4kY z;4`E$G`{uAw#sAQ4iU@E=iZpK>)hDU?|&adNqj}#LKU3T-qYg;4Qmc#giqg!I9s&) zEUb#p<3NhJi81k|*tyiM5Bz+~KE-P0g}*l6ma4ph7 ztzFm@M*Jf!qCoV#&1l2aB?W$y4gL%`3*3AU@O%ecx`hp(sC_1K{!Dye`2AN=c#$pi z2|bLarr7dw3P%()Tx>mPdMy3FK&oH*x9LdK>~?dSck0sZ?mRUp0?WTCyDN9`7l%N6tvOcerVm5-wVg+|dQN@Pj_U;9ieocnUY{yFzgfM#>nD#uH z2|C_bIxt#m7enR92gtUIfLOLF-VGi>;qd_S8_h}jOk&N;r`NbPX<%j_^L}XYkgb&k zX*Dzor>I(TF%)x5V{QA125d6rcwAgt5`_1wDyA8w;6_1XJKHzWr20#$lR23RyNAaN z*TD2=pO47Dn|A?dXEo0*$0VW4Ld3Sv23@At#*>%0{AF;xPd0q!NZlHZn-^aGV%-O~ zdaI+A_EHwOL2W+K95`1b57omY`?Y$m)_Rk7+|#C0ymau0Q*TNfs%-KzO)PB&xap$$ zt-$6>f;*ehiIgiq z&AdprOJnWRTtUSC#7R2s_MrsS^1SE^$qYD6IOmhmSYQWa5~0gHA%ZPsU$@zY5LS5f zeb@0;b{wqzfchj(w5aU}(_M(4IC{PX@9u%9dt{_#Qm6B>`3`o(s1u8`=?arUpGc(5AyiLBdPH#hxac7?&i?pGq$-Z$OX zu$CgxFm1Ve9Npf57E^;ADa$Y0ShcDXZXC}I{ivStb^W-&rAY`9IkgN9JK}<2D(uvW za6D}`#j=oc9_-U#fP?A`324ttRLqxgVCxSIy=hb~qT|ovn#eH4(B%h!L z3!&LyDtMj&HiYB1Kl(oR$;?}_`8rNpbKqCCkW0D zS>~c$b|zP8iqjALbvLfLvQUle!Jk5O~oop{m2p)n=muLEEZty6PK)kA! za|K<9@#fAIm;D?_%lQRw^;sM@s1D-dfDFL%9G(*YrX?KxkjdvB6>gG;ThGwdkKT{D z`QUEXz={U(xEe)MLvBQiuJ=|Ek2-9QV9^YGr)5tF_4P$<&gZBxig_XNU9G?n)&f#j z)K>}Mh=F?^9xn(E{EIt1&g(Q(l&hE;!mt^fy5#p~1|J)v%+Es!6M*|Jw6gNSM~<&G zftz9L5($LDr)o;Sewo3AV-@&Hv~9@eyr0yv@suGVtY~z7%VP1kQ%sOAFr-=8VhU#B z-!spdY(8h#Z*8Y?T(F&rK)p3lrG48Ng?ihdZU5jV|JS`5#Xly1J(eC=Wd`H8oah+mg2u$%})rRd5sInsxqG8Eq~3aoTTmV z(l(rYU^hAqYj&Q@hW06Kz9#1tq~FCYZAUP~f<^`*n?JeQP}JLD!*dxW-~fXC1xkhy zZJqnA7hY`;-Y>^)SNfUZQ5Cufw#V^g$XEP@uD;(_WcW1TV%VkKqUwT&GV|PplB>^m zubQ6)Mtj^lXtHJC3bHzH+kf@lk7HPJTi=uzTk#qK{C{j#Rkf?Yew+XVAK}@`BXO!G zT{AF@Vi%t0XFrjHU?Hjao)R=U+yNZ9?w#y~Dybj=Zq(rbJEhrc~8t zwv33zR^^3M!V2zgu^3@kN)moHp1XbgI&={r+Xu&eMSD*DU_wWFqVKQnf)Uv{#p2b+ z?B>BHbY~PZ;hY)IqDA*6!qCN1Fwmo*sw*?Q;C2i)i^%rYZ_qU3QSVzaST9$~YhZX; z<^92aT7-K^FPRu3jI)23;>6wo!pQZl(oy*Oc+!7N=O*BD{~TbU9URBLyP#yu!Z*4q zz8h!tJFc;VRbvVF-|nya@3(WjuYc_dE92%1{>q31(?LmaM7Z=&67aLOq#SC9Hh0qr z>*dzQa=q{n0q+{NM$bdS1S>tt@1@8elvW{GM;cmWA=~y=>Zyf7E%$wih;UTVNDLFx z^?L_*k@vCegl^GWk#mXj!XH)A4;3x!2)!*%8wRaSIIE6xita>_D`tt(U+5>6ZyvRCtB=tL*B%6ZFYm5 z1GbsfT=b}kb7%eV4jYh8=Y9)7yJ(A>JfiB!(*4`fp7xcsD#jOGAS=`U+!eDKqlf-+31o0s+f zh|uLal-Ug5Q^!G3r^)4&Baj+5RN<&%^Scjr9`0}>eob<`U+wy)WqoU{#wVaAwmyQ- z@@vbS3mJ_8!ZoJ|R6Qu-U-Bd0goei=Vf(}wcUNA}u_!BhHn-btZV`H62r6H{!lYmt8NYu%%=oAOHj>Yez6JB5lP)u?i5 z`DB;3gFog49(g4z6aE+UtfPL&!SyRjrWtOtqG}>qBQK9V_7nMTj={PFG9pGCHgwmt z=!mE{5SmJmxO@9F>C4^o)V@T04^UseC!dDtSTFT2c=q7aX*`#X7slU3x#gV(a1owo zu(OO@eAQDnp36lxxJA5cXGVIIvB_s3}Xgr&p@VM$I-A!K>-wdd5RF zk{*{P8>qRx3=Z`(wi7wjF^)+KtvB1my-&44VxZb9J&6xFK`zwO(4Q3Yp-##W7VTB0 zJPJ(Xq)4Iz_xv+l-~H~)^MMS!8w>#&!YX^0I`ofnshLH4^62N*PJobmHiRx@N-_r+ zqNVK^?zWxNxpn-@bRwrY`{m-H{U&$!jTlGZ(sp_8;H*F9ciXNgrNAG5E!f+we%bw*y6hq4R) zWtkg@IuJxGR0Jh|TrwcAV;4tEk%B?&Rp}5|&uf~MgH%sW=))!k{upkZS+1z)@g?0(%;wvsuLE&eBuS^LzQiNUf!tD_WDyip&^8; zI=O6)1m-&J5I`yLP&zS+LsWY095IcK=k4xi%mH-KF|0tQos-j4h5bcd+FG*YV7UOg zp~$w-jdq8hsImP1$gfzsYuq)CfxFp%R@y1A5O(iG?$jmeS3V|mv^3w`L|9Bo2{v(> zVpcTV8}L35<`%hFH!ZyW?Sc~&-{g@NPi7LaXn0|Fw{d1RwfQf+TJE_(nRkB(qAD>S z5#aiRZ(-0Z58LE!Mw+Pd5ZhO6*5$u4o%Lx&`i>mcL4Scm=qy{MD^-5Y@Gs0rEn;#07S{N9YN$zrOWHhi7Mr-kB(fM z%7Yk{5DUv(YfVA)0ZQi~*F>J&e9vZaKoFu=!xD?1cvlq?YJ!h!D@%E0 zWh|BoLRO^dz#SiiVAJ=us3+LSDkv=Foo3BUum7U9Gnn_~lX_SNT=oEMbyQ!%`^; zgROE8LRgjuz`pC1kk6rC!c4@(jYP>1*?8+E?{{dswGO?pmv}nAXq-j}DUtpG%q`oP z?iDwlM~sZyNrf9;PD45#`4#FR9VnYuk+=I9RCN_R9$Md z%OBiwYRdmooDBkWNbOqdxbF1NU^Z}|1&^@x#vb`j2?wuWzo_w-?YB}CwuITN?V|?Y zF6SYQ@m{O~$FH*he40yeqVg8q8NhH~8oG9`+;ckR8eXt+uxi~?D=JH1wMAHHsW77p zA*Qi2g7#NW_C8XG%7;4L-R&Kw_*8sil0FnCNvI_|@3AVp!02}8?rjYZt;H~Ho}OHZ zFio~)v5PrsF`}k@d6JQMjIOQE90gqz3# z3(~4`d^m+#o?26+`PZj_Pi32O-drfqlEq>mM)D}$PTkjwXi=}=pTcw{(x4nmWgf;X z2$y(qJWt*}@cj$;1Tar(D<4qVna#)%`)`hUF?z@Zw3(S0>D{yU@SgMh@hB4Y_EVN@ z#8(huAVdk>@`Y0o(h+u>mZ&@{>7u9N$A-mhtv%0AHbvw#qCgx7^b|sO)mqc@GF_b0 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≠19`vYE2e7>tUzF5?FmT+zs3bDDJS( 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

#a-O*K?ODDQyEKwd_ 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 diff --git a/assets/zapsplat_sport_air_horn_2x_blasts_002_21151.mp3 b/assets/zapsplat_sport_air_horn_2x_blasts_002_21151.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a8349465c9d02f36c088d3f55b372d620a799d45 GIT binary patch literal 46104 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�=KfJW#poaS%)s#*Vz6ZkF#Cw4jTc)DLTj{J52vF%SC6s(9QjRdaus~??YV#;Fo{S zjJvVRZUeuJ1Y7E$9wk@3h3kAzlCz4OUh>A`GcF7~I7-K7h?qZqNG=OBThgkxXkMJq zefWCkQGx-vrxP>i!-O9_HIIUwRXB}Ds(q^_Hz}64MZa~&>ho6x{sb_LF#5>5ViIr= zmEXnDbfJ*=$GC(g8}z$bvGwyKZJ<>R+*PVnRm+Q{2fGIA zgXb?KG{+OSPFUg+?7sw;gi-5Xho{6{b=@>UZK9-$01E)1kJfOTy@ejFpZ2J$egirRMaDO4rr$^kfWX z&8GB-QKcb_P90oLo@Qy;}^p2`aKm9IA&zxo)!DvSE_`6H}P+ z1@(kqG3Z>|^7G2MI2~h8R@=p#3cD`yc3b#~zv~%m{)@pHXy&cg7s9%62FlGyW0+-Y zOI|tF2`p#_g~weEt+ECEJ)df46{?kFs-)P{bi9{7Omk%6oe|IwX(idsl%;B0VFVY_ zpil&0z2EWqj?K{fxXlMIa}ggPxl_R%B$lzCw;QOqHk;*P-@iVOPXf&lnLH14SNnJJ zstfSBjFie@CM(>j<$I1D$5F?|DBZ99tgVNU?VZa%N!3dIewv3>Mbmj~ROC{j(CS@d zc>0D)(i3|GU|RdSvQ)(`lcmbR^{xY_cl&#W{#RvOEa%~wohu)Ej#97!*s(JYd}-L3 zD<-J-_71(si})uGhsCz5bs7!0DL(Y;*3D@F(9Aj1Z(Gk1+L=EW>@5vV|DYqDytc{w zMrumaqIs&BF=eEcobFTfy%f{sX|&*R2K-rBjAZ5{DI2jbdc@@8$Nc*L^~VI$5_xXS zT(OewaBni|zgFKs?{!Tf@S08hr7F=As)9f66{qA zJM}eZwQaJnq4;KlOz)X*SlR_ctk>OmUPLqrI!e5Gh>}}TpNOjgl?SqMvUHS4icjq$ zdkU=QzecXYzSqppiP3rO-b;LY@Fs9O>C1uNETdP-&VAfqID8-zBvgp|yeZmJ-Ny}7 zrNj-ryOj#39PeQbb;y7K6g7yrlUwdDldJhhWMJ;@rMQKSJA*2xS1P#vIKy5s8cQez zt4Q4Os;hj=&M!jVe+l#DL?_HD7+BE#Wow2MP*X?M76wENr}iZ30|*RT9&&g9nyd)06}^Iz*8c^=us{2wHU$C zaZT&2aMlU^!^)wP;#l{=ZM%#lYOv)>30A{Qh+N{un%LJ_;>BD*AEI-S8Ua0e=T4HP^I*_g>dbz>5n)D&EdP_it*6*%my6M-r20VA z-++rY{Xe=*RV#ST`Gv2qC?`Ty2FlFIJ6UE33Z!x~z*wvw_Rl_)01Kbcy@nC}~iTE-gR`Aiu9Wxkj|gTVr(%gy`=VJHPdzYE7L$Iv>CjX>^%_Zr>d ziD66D2DG+!@+f9M>m2Zf`}Qmr&9Wb2AXW_!#xsENJ$FN--`|?|?RUyKzSaZkd!yd5 zunre)Lh1`42>X#y%0dlh`5hgR^$-rA?eR`_NPZph%Pj0~sXj?mc3r9K_!j&`@j3hF zoJw!$)8xJYp$2|bv39^O>3d27Kd+u(Povd6K!ChDILCgt6$;>{uUW&Vdmr<$DH({I60yMZmS|1KNsG*h!IUO z#43odO_GahzZnbw5VGX_U6mK9$HT+}4-GlW^EyNyI~mdq_Ey;XQT_*>+ZeLaFh?N_ zd}Z$#ihDLnE1PLjMBEd@i0C5zW2{!@7#_|3isViX%3t0B0Cd%qAGz_U<6tfANHN!| z+HuAdhH+bgC9LJyJMt!V@6yce9JKtoXVeWu$$Zc<(UgE_yJ}_6(PbUO6N4;o`yY}u z(iZUNw+Noldv|q1>0)g)VcSv5=2MXS?VbiLQJS@-P}uFZ9nKVGUa2onV#5KbWRVMb zke<}tjyd@ohk$suT5eq>4G5`xn{NJz%&#+Kiq9c&8Tm3;s)jU zphmI%vs*o{JqO{`ls#^2k_T1%j|gBQ>ss|$00h9ebU;!FQtCLA>)`B&1Ry8Q>I?ut zRra*b+jSDse26ZNg&mNSVhwB{&&y`W7!U7YH}GY+tj3<;$N;GlgSy%CVW?{{$mAL& z2z4nCytJKKc-B6Mg}9i1^u|D;kozBDK?zJ}*%;05b!S?i5af>n=K)vpN1wAlw&{?m zi3or!9YWsG6*h#$=j4;+BPG>X)?P9If&x%y$BSh7tMVD^$3VLC8OKQLpAujE$RLao z`ZWarXovt-^EaNve^7#?rlRP%$&BUsOR$fr!csFWjOXz7TDGt3;GCR=NVQ~pa_pl4 zND!uCGz!6SLu!RJdWzf+__r>48h9hS-Zu2IFY6#@KOhK!iW@Oi0;X<;fM*y$4Z9$k z0|389uYGc2<1LdSmaw5iZ&DDc@Qm2_pf{lcPm^cRoN&4qi+=ZoelNHSJ>_k6>1qPx zI4Q^z{#zGCJW#;$+84np&Vr!+3KLX^(%Z9=P5dsYM z1R?=Oo$`gRxt+ZIs2Tu`X1EU_WuKLqovkEXI3~|U)3zuFh@DkTmdWa^U9zddc)T-x zARB5PN1heI8i)n}(*I-6j=cZP%gN$KJwr{N7iQ0lLAPKO08coO1~WgvZW0)^z3>1z zJeC6hAXFoJXUmsjPxZGUITcx*DTpMQ^IaGr;MSdZ*_~hS>xX5~aV>a1@+{E*kwES7 z52x(sm^ya|-)hKj+K?AyekPkCLuO7R%P858;w%YUc+sOq%oa#BP&3mNvV5JpvxXDj%5^5L8AdEG_iU7t6KHX&U}Ur z0CM9A-SO4$!|o!&&ro2J6{-TY_W8=p?VzR-=dM40Mw0Z>SVp1)MzdM2Z;}al>U3oo zc+pKxgeyoGMqKBxp6jqkL(dsrQJ%j&CU-mW_Z6^z90eZ4cox-pw}W8oTxS6Q6{57U z^P$RLnH(KNP*eQvBI8DvFAbW~_tq3i9|M%gJ;@%N2k5xs?FpaI5VKwhRK^@2HC^I% zInNLigrACWvHoOxsdGy|rnTpZk zjux7Nj~e;&Zrz|Ez16BOi@2kuf-?mL4KSSUrq=7sPFaose#*21}|0x_sqc@mY3JD^JKmr2xgN}06^MM`=sz2 zClAV5P=F+8g6d7QFXXC&l4QwI}bP*QiBfM(2b=8o?4sVe|;Kd_qM^v^L5Hf8?$Eb-4nA z76JJ_aMOAeIQ1K>;r~NRnHjt5cft6dKL3uhRXvr?dk_sE3}yC_oXC6wJ#r#6)?o|^ zX7S%dMM43T*@>uw;NT+0`F64`nPgM#wu?5@kuc;Zw@yx;aZ8RQ{nrhipiabuCXU9I zLDGWV%k;25L*ae0@Y~MCR{SO#lf0%@&# zvCsfv%FjCrM!bDnh~nbypex_zzTM1`6mJF}wY#u!?nc-379IG0n!=Tu zG=kM(bQH<$vf*4=t5m%g5aN}y+$96ujWGWnlMifg_)Ru;?K1gJsy#ER=W;$@28MV4 z@(W9Gi{tWTPgJe$hMqjr;4W58!{2&%#jiF0);Ndxp6`FWqF4}YKjb7c4hJDW$$mt@ zw3vqIgyLw?mj-p)qaL!l?k}t?dN3pgHRE%Y>RqM7_hbM@3)i}p`IY8(6;xitZc^=e z9xX~&mrOqb4={fhD^7#9V_Df5C_Zb40v4wx8YkQg-*I>i02Lap%!Sv-u*f;qe_B#| z9@kWS-deD{u?^2rb+}(pcspI`^J2+m!?tfGLf(d>(ptZZ8(m9-7LE-JLsDM+KK;A^ zo+tTA02F|m-I>%Ai(3r%cEC)Eb|T($wNp1pSGc2)RV2X7=$Z+kGnLdV3052h46U*=(hz!7;9UR@9_PR?B$o6zJf&MRJ=Ynh{n?UW#+q zx@u#mHCGl5;3zWNn`nTBL;w)98>L9X$UE?+YfB7%@UsG*(c75+w&hRo13syMggv6N zjn#i;>2Sk!H|Ug9;R1;9>}Uqw>2JNs&{?QRDNA-LVaI2Qlz{~myyzgQ2pzy7cPwmL zp78PZ>{Isc^i>UO9c|NZ|MGcQ4t=rz)`_3Pe`x;vvz^9b9tO_gN8!tRs9jL?9QdL0BMhZTG|~Jj7%UxRFMspqo}}2*KHBg)ubQZ5 zw^_To`>|v`*L&4Pa5|S{TneQJMghU9pT)(8;yJOhO6~rxj9;4~`Pyg3ZbgrsXZ;aK zx?lEN0X-y|9i@X_J|nF0*} z7fc)D)ip8gTZw;^@imZ~YqGQD*H@IToxDUX@V>6_A+;}v@T@wwZ;n3Hlt*DQ_=+DS zIl2mG(f?hquxbm9iVvDt*&}isv*YWJ#-^Sh8W#cN9xA!YVD|T0{=RyN<4Sy~@fR)( zv%ufrlECUYJM}0Jy9fm4S=-({sG8c)zwZTbq`;zG7b5WmfL{RqEnj_`BiBQ-8L#|_ zZ_oGCYKuOm8P-239M2PX3H^?cZ*LWhpm9*RAbwxHDoNa&Z93v@U5NR1!Rwn$r6M|K zdVj51QuNIilQPb+YM&ZV?tiZt7**q>-c+4JWi=+qM}s^D|(UD@n*)5 zpjqFPwfPZcRK98APWE?+yZBkU*NQ&77Iz;sq^X(pQJaWmycyH9@<{ve&LGZhb!<`+ zU#?be0U$Y^YfiEWR$vNq3MjwLkSotN1QY zkH7P5_4b!}8CQcZ+^;RYyt2#NryaeNGVixyaoF;=Oa&wFkd%)ZJO6VM;d&lz#R6n? zWPXS)cA0wbJzJ6<(cEZKEpENl27T)^u~$|s-aT;NBkIYOa6&j%QK9d7@C6819*m(u z0B}Q?O9g_CVp#Y<$_A&URMy9Y6y<*9$2u`Kko>xG*zDaHW)Y>&oImf>(<2KO&@#Q9 zN`uEIZbh3GsFS|=5XY#M%jQMxoHzoisU@8rDjyg09U1GMlN4Z^U*9lmV7WtdalGH| zUx^tj*jBsol;X{?Ex8>1-y!5-_O0ed4ZA~x+#(J9;c!#8)+)0cXGwe<)x++tNj@4m z*U0+)s>|Br3jK_Qp_aC3*SrO41dD}@e%?xXqWyULZ)8w2>%k<&MDM5jtmD^5Rxg=I z<@gxZQ+WrfT&8|p;JGlJ0j*s97oTcSDtkAZb6Iah(yre(Y0*BX0u*^)es9=N+CSpB z-5|WOV$^$pGjXI{fSNGs9&LXpg@xH#g@bS#n+Q|Dt+qyPRk{gA}!x*K|gb(aWR?+ zR?-{(4z0$9vZ#$a-jCqFH;(%C7(fF^nDTU;LcPAtcA5@j)>ltm8%C-sc)CX8Acp>l z_Hy5Sp33s1t0E*ArB5()M^4ltj%CvBMBnL(w%g)i6p6BPr_Ip!?0wyh`&MgB!PfjW zfyo7hr!Kr1uQYrz1#|Z#Dfd(A-&?# zQMQA5a%0t7A_8Y8U%;TPw(q~#BL2>+u2Xc`^C69htZr~5nX@78FfFvQDRIdl`r}BRtEF6oS0WO0sSd8+Uu5T9IWz(h59_rkGqxbomdK7sSvv~!rXU& zoEhqEYUHl7uDKEZ17#dIeE468?DmFAxO0w!)y%Q{mC!W0@ZO(eTH|8 zs1@Re*P7Im#M^F3Tx0n9?d_ZUqI>CB<3VzOlfGHKrbXt!e%qNY!ca$BGhwi6 zJR(s@MUtb=JcRT{O>VWXTXFd0nE`NXXzB2WCmL2w^UMCQ%djrPq{=kvrKn|FO(N#2 zWAmu`R8{1~zQ*?wom+UT6B|>-W7>*D0&>0S2V6+ zWN}$`vFOLu9+9spqG)O)H2~x=aN?{+uS#ZYncloU;t|#dX$s40c%b~3zL($HOJnn$ z$@8TZ87nDL~)WHM&#fMw~|^aPF~eXfM8eUmLd zcN&v9%da+EcgEbG%*PmB-wKU;AhqBBiH^Lhl9##sQsvzR=V{*bk)m#Pb*5wrMrtz) z{T=muFS#xwJniw;--u=nHG(S$ODV8_0%UXDnEzvhp9=(yvMUc_ED(?D={}ftbk=#$o zbV{TnI-L@+V!h-l6$wFCGgNext_90d>D0 zpa0c24eE$(Kf=^jEUG{JrA@j%@XV|HL+@naZX=|KQ+C~@bwUR<5j2+FlF~ErmY9b^b0(?h5`7K5`Y>7GmZ(izho_^lWb-J&1ewr#oc zI4*#i;}3?Bzl_=ZSkvT41?Tz`1#Xd^o0qYUot4J5PiMyz2cF~(Xg(nnD>yBhkU~g4 z3*&pk15#krsXS_+Z3N%#2oRl-mRoN?? zVy!)4-wATR!l?}<=wj9}60Y(W2f~)OXk6dC9oss4zaoh$MU`GVtol7C5a)%HS&>7% z-19TE!m4TGuE~}fydn*BKq$~Tc@q;4Mc)WeL=N!~oWP?&LHWQ;zcp@uf>=uX>gv|( z)#f71Vu{t*8R}I?$DRu(-=Pss%if7uS|ljp_|>2V_tA*;OADes$KZ^ zc$am4kxe+sXzo#WQ&irKEHhS^Wr)#@>RBtz; zV=#o&?VrbFa3VjEAop*q=Ulv8^+>eR9L}XFm9<7RBn(nmm`4sSO5V(H=gZxVM!*}c zFukRIk{_jgZZpN7Pt@ppV@kL;U@ zZE<+>ZV@KhpV3Fpeq_mi5_H`ruRv2|G3F~oq%3gn1V`nXZ@40szBD<;val%U8p30R zr$`^j{cZWu`z%Qy#+mQB5?6Ce45Po3#x;$LX+DdybjkDoxn;-PuV~I>oF%FQjO6b- z104}0Z?>k?jL5XKAd3ScsiXKQL2Rpkbi*}BBzfznV&3+?JWtlI#(WZ3q^U$?nvDw| z(3Qf$dv=4SG*t+N1ZP5iP%+lK{rA+uGXM^Q1Jov=PiK1`kG};7Ys)Ds4ZmO?T*o$J zvXsvV+Jwh^r@MmJ!s(}M-$?KyG#_93Qu8x4&K%22UNeOHs-c`?6!*-|7{l+&(Bafl z?wH*irpor=WggAoBX;~O>|pePu3W@ByB8cD-`bss-d~M9wEn}WOYez-nq&yqe=b@^fQ6s8?>-h zU$TADmU9l4^UoBbTAppS+NQsXnfd7BbQp|*{fl^jd(43(Tyv?vb*Vd3-|9{{OSSa3 zN-t~!ZPfLldt>F3GHCfU|4PeZ_%lt+Pw(MmhQQsR<&ELD4Te~ZQXG;Hfo<>*Y4lCZ ziZ~hN)QfrI>Tu?C1bsA{3wNLI*ZtFt`073i3Tz)?>z22#f1Vkz!;nc|Siwqd_-=ADzWMF}Bme~e+nGM}-lZ>V8nghxsuS|sw`W8P`Y?t(TaSOtIxjIMT z@1cEJ2vSI!#;agQB=QYaYvIb`uEA`JNW|Z$yyCvs(V$Ee@=9<2mYBx9FrKv=CiEIDi zTrZXf4E|GhTw70GZI^aKu{p}UmFQXDIk93&WBFzadC45_#v{5v9nZ^Ca&ruj71|gv zI8mL<$2sDr7Ep>NvVt#O_yw%A3Z!_>{@s<2j>y2oxpT>`MV9MMjR9Q z7l@<>|GWYG%8#&5fu0P;l;NDJzP-}&5gW`GA$>5`GrT?(SEK&98v?1%yt~*LkaFu( ze0OEj(>Rm3^x9K@jXtVyamPbnaiZ-1kaQi6P(N6DOl zhpcRwB{O?ODP$covNuUNo6cUjJ2!qG-`_vr&gc2O@B6&Z`@HXY$}KHJ@a;*@G#&|r zu~7NTe`Ep2K-zJ#c!NTSFOExKMnIw6Q3g-e11*NTesoz~Sv-!#Ghk_n88AD9BqQ*u z@_`ug=>uZi&&LzHD^6m;5MUHVmr3A2s*}9EAHn8Mb`}eID^{niC&7L5kIq_HW%Jfu ztrrzQdH38XOo9&3g^iySzQ_F)Snu}E$z^sLqw~P*g}=R11OhhdfLLH%mAid*pPK&x z39s&pqa4NS^yE|#8KA{s74wHyU*Znv{NKzeN^yiK%--&&X>}hz`R9p9B~C8UFYJ~t zIh88>xW{>!A4H?cQyYsNp)}*9AcIp)kd#z>5s)K zyveE||HiwzoW96)xAUQN*x#HDLUr%p*@ILROEgSq{s?_O!gSWqC|l*g3>XImFlkF~ z_DuX?p*8u_exNQORw9AjMn~>ATK9XSzB~g_U|DRe%N(l+Q#@TrcV}uXyVseKtL&}k z=Pjaf#9x~`q6!a8IL@avb4IH#n?IAEbJ9dgz*NIT8ygZSu z9gAbei5;SYPA@VMxv~?+P3J;s9QKG4R+3tUOaKew%y4?(e&6GQPw@vs;7LLmq3mn3 z^tgu`1n^}6f;WiLa@O1|!M^j+!27pUug1r63LnWN14ba0sS9s=k)=Tp6;pj4h@0+F z<9pB;?ccsOF_QOLs@hqG=Rcz1Kaf{gF}<)CZ?FTgO|`}aog75h=C%5B*;z=0&x))2 z%Lv3!V*N&E1p&GVQz`ESK>#WMD*om&@59$@|Lo|cphJ~Dhebw|6DJQQhu|Y9wBQ*G zn<00;m!h&wh}K0B z$qi$hM-V~QyEAfzt?7;FI?le9ZY79;)#gDfyZwv?1V4P0 zWXZkp(D8-sZyFj=(no{3r*D0J(x4=UmmR%Zv^{KR&qmg##cmM%`7SIc{_Z{}-27wB z$}qB1c~5ulP9mX*CdK-v(12Oosdw0l*}9IwmI0ToY~f1h$H^OkN4;ae(_v-tEEV6> zkK3y{-JPELHKM?0WoL3b%0nPOau6xxM@esPkpmACo#F!rncVd;l`FU(at9l(_nc~Z z%??e#wUkn@h7v~ifI5gJb4uMEdxZ)V2ggZFp*Ulq19T{{^K0_2SwnTCjW!u14lusKe=<3h2Y>ymc!{>g! z?s1k$mToq|I2?BUmfTxX!yHTP!9-)!nmX?=d*9i_6p<==yl88PO3NBCL_-wf- z783Ix<|`~@3t2f=(~6kA>1kY~7X`;3gU1Tt;&E)49-rXuwUek&bO&6ZaQz?p2s|(C zi2YG_?B;uKg?9^FFc*3kLP{AEXeLHtJ$Yx~@IKt3`KO^;Io&laKIq}_S(GV~M>yk_ zE&t>hl>xez53W64q_p9(73GqSb3z-Vx3&n-852T;8~pVTg3AWjY~$LUmOj!H4|+9v{fH%LnRhcEFJC)Km?wDI@1m49x6s@DhbO@8IHXNb{$+90FBsT}V? zEny_~?v9?r!{(A}4?K*Y+)srw8NlSA+I)H2yjXVLzm;4(_r(cvxbdFmby0#2ktJg* zC9GoG$?3~5uxJR(WGq21{;sr8O+6#KHp8R-ISKdIBDBnWa=A(ffs}3ZkWxw84CW7t&!xS$L!g#Vj~XbnTGxPIms$qZw@*k z`AjyyfBSIw_x%JBNuT6r#@B{DpBr!KrO*9}(8tMQ;07eV3LKy)HApd%gL#@GDbPFc z&N?ZH{LN<$X@?UDFE`c<-;12WK4s!Pw4qKXf*CcdbM>sUM{3;cZ$&Hl^m~~@DHp>$ zUB;T%p;-kO_Tsa&!u95=2Q)5kVTC)mwwgqxp{9G_V{v0C&6+ekZ6nD1vKYh|eJ~$u zt}eYn1KV(uPB(eee(&r0;fO~fPXBiza5v)%a5sqz?P?b)t7Yy(k3v%H3A5Ja+w9$K zii9`#;3lQJ%zO*Tva&tvTlxn~s&3_=9yVr&LatTsfFwU0X-du|yRNBNHgmHgQzj9c zWcB^eky+`T?s96WC4Q;-;FDLx2?~M`&KvLAbCO3hEDl^<2y=hn&N=%d$g3Hcj{rQS zPM`dtKZBQad`;j}4`3)9581psT27_uTehWTsYOUkUqL0QvTJHG-4rK`x=W$r(l%y3Z;%q)@ufP zG>`YxHIe|@9ckOpAz^T6(q6rA#Tj@k^fM2H73fX5`N~&~ zEsxBd-rRjTAui!m_GgUIrJ?reuMto>G|{YQ2FceGNu>A^`)=kd#R`ELUPHKX{GkwX z@q5x>hH%nt6&h245m+Ze+I(k8qLE^<_mzA?HQU!)xV?04osi?3 z2T5mw(S{+Lax%@fpKr!O(srKH&|c4Fo;}03?~!{Z-2Sw0p+w2LsFF>#bz_p`{c)>q zwj-?A+pf|hH6+H3DOnd9Re#2f&Q0y@y}Vuo_)g`c$v(Qy`I~FWThP-IRrG%{^W@tk zql~&M)TA}33L_YCM!29OWDg=nU=uOmvQ~!Scd1?{0k%D8Ny!smc&&0PWtTT6Mz^{^ zOZlK%r2od3aYSAs2-y=>%#vaIGE?i?(L`S6AwX7+__DVk5NpI?n3QtV^|m4yTWm zaIy1*830}!(Dk4DJj0}`4<1fv)RinmQMtdfpzCyi%|45O)XIzPJ7>0(tn)1fRc+E1 znXpR6b4mZ~B{6e<-AeNwL<2eSGoV_SY2vTIKgeGCRH*WgZ>6I{$J!d*rqOZiw049T z(uY^hZ_yFoz#TL(p}SgOx#lsLIj)O1Lsb9u?TX)Jw1MbZ7=Hak(QbShYaN(?LQyKa zy_FksmE{uGcx%m)k6fE$uVaOyEo^7Mu+Ta5E47sVZXQSs2eVVb_z%sIuX7qD8B-*v zKH{l}(im_*Y`N#G@ihfOBG5^2dwd8yq&7>4LG}FqU3Sfo{C%09DI#?Ly4r@C+cH1A zJM_`0qMd;z(s|^|zwTr;DPOU|sN|J=!RjLwbKFOgw4qpz$Z9c}zTeevqABRg3Hrzq zbKMdzsRP=8<;UcRKw|JOPP5yyt=%o}H+MPm)+)y;qNxAac!Q=0MNfQ=?6uJD5?ER- z5n7lZ{M4n=5o%#|WUz*8vB2vyoe;&I?sKcbbWZ`7Kkz7GK?{pQD~`e*CoMZvO4tOv ze|PZJQ!>S;zlI{tVef#~C_)>n4Hj&B95Yk?b%&Y*2iH7ZT-QZfc>ahZ_*Gzd|57)d zu_Ab3*I+!rl(d36Z*9@<10a&}qFj#Ag8yxQB%H`o?F3LiW5uf7w-WnOR~n|mqiME& zFHcHC>AN|GdkPkWVW5jOSKV+WjSiKdxq_p&Lle>XGde0XiyVq2DeT3qZG|Iw_)r{P zVBlaz#oSk2fjG4R{Bq8+ zc(@KR>mXIF?1rHt;j{VE;C^(B5ij+Lpj->Zg=TQo?vhuTHiV7=xMI#P*{I0i8`)L}59|6-X|SB2aY=z1w!@ zqoza_b%VLbr{9$@lZx7{QLBJd#|G}_F5aPidjOF@h+kj~aLq$p*c`0DiEd{s0lo!u z+NM%z(ZIWGIBht8usZz#;s!4KfM}+M5Kiv|-*F#Xd0SAYW^r?=Bq_I)?cBL??O6AI znda9bo_CBCc?$swK!3fbZ?A3LSdHfTk}F;^DC6-;YRP5b=dIvj`<QaH~V*|Y4y5@x$Lzj3&1G};# zs2|GS?8#<4ov8b+Fk^pO9#jOt$wSJjU?{2c{JKJIs)u)np4MLm$bs?Tav*s(+}(A6(0&8PRxnqEKZbk4r07@a4F=chILQ;T9-+&`1xV}OMH1F z$W>i!FYJBHpUBW6s2IeUF_CtA9#!3yjn#P0DztV9sf|y8IYsN8jxI9fGc^@UPII1U zr3z;eW?qkib(Xo0V!cesjP>H_oi75=6S6SCJ;LiUebwa+A_vS34x%ggsNpgrljSsb zyr;r{4qW&9noFU zf4YAdIL>U7ny6|`qSWf{rp6S?L(>h+D(x^4e@~K8dX8YnxWYMqlrkoyqhPjoyi z&FJm%^e^Pw*@qwq(7Z86d7J9u#%Z6il7!Zky0sav$C&DL0e3w=wMLglB{ZL=2dgg| z9M%s6!#UQ;Oz(1TR=K_cT`_n;XA5E%u>)Ph$C2KTFiU3EwSQ80M!jCW`OvqTQx}FF z11O&11#N6~czhW`oGAdImx*gWCa${vDS38q75U~#&BiqLLZ!{*2N^IP0_nXL8|%ls z;E9Wh9Qi4yc2b_7&RRP_QmH^0NId$O1nCe$09eS<*A?`3bQ*-ty%_zN^isgjeQyD zXT!!NzEtF7pFC|u?0uOZjr{7=L;Yh&w)rnV+sN%|0Qos~gRD22wtM%=le4{1dI~DT zgt-pk$2}|q^m(RbTV(oKMv!2SQu68X=lh3|j=(YVSl zP-=i43*C4KPmLqk5*-9kD)`RELX&3%E4;uYZfhI%?Ca?;P<10f6+%k|vLu$K+8 z<-v@@DZEOq((`8oNu8#t2G_S8mT_z2gt+j$b<-a{i#nGro5}}b$K5nT#!#70S6&@_ z?s*|6s(Ry5JLUT^RQr1L3(02C&d>d-)u`!*z_px|X!`u!7ZTZ>MGO*QFA+UIvkH0w zLswA*!$Ndz#>*JO2QV`i#%1UYmJJV!LgtEu-+uqksc`oDuj8)E_E7H@M7>MnRNCRH zG|x!JnaKV_ap(>&KZms~XCMA1&JBEZ1S?6Rtop*)n@qCP4wHz71B>{G8`xnua0n2N zJKq3X_S1mhfO7*!+f)c&f!k^nBp?{IkRAq0jjyC-y9R9 z;+R!fr$r|(@dfS*8o11(7asfh)_T`p#&0^1pS4@G9aVSKCk48gyXbaQs~$q8>Qdj6 zi)JmGBd#KocqJWsei0=E(C8eX<9`fYho{rQY?0EsCq%>y6k~uAfE%133ijr&gSvpU zTeL=E5~o;{_2kBb>wlA~$-{ocEyU!qZXFB0DaYlqvR@th?4Hz4hiI|3+vW4jtaJV6 zvkw6~qPSzES_p9iQ{Yl%x`)7UC_xSf=k0t3C-}9Uki3R<^EB0(AoxNsBA9}%rB2ft zK?M*?vi|L?P|D_!?Wa0o%}cbLRdMf zyQ5DGoesCC^Q~3Y>Ip}8b%eftg;QI}Lm>^&xd&0nN7V3M(fJ`RA{sGqD1Ax=-R6NN zgRkNdX46M~jUWh6Z&@PBfDZ4|ti?R(@}DQmE!L$TAdlxq3Y^+#iI(3LXSSTvF*SHb8SF#ZFuvKemnCS;~6#9Ga8GEL6<>Ghx-n?TX*t2-uO>L z%>KN%9d~fX27aTdL1^`(1qp&cc`OXZmOCW&>ir5jN3K+C<3m%x1p&6YjR&89Z})^6 zLu;1>Z1&k)iYTUNwK)W7Eue0)P1XY0X573-JX-WT+dMS+_C}0N zbDmxNL?gHXM(5v? ztJygg^hQ3qc*~G~G+O@t)G668CZel(qIfLYX_v2l0J;`KNW|3<9ukd!p=w6__(%7f zIM2|4Y{2#yH$uL%do$b-k}a_Ol1!(058hDizk#V?2)1n?_+A3y71>^?>Hb>=J}ew8uW51UX&Y&B`In?xw{ z?C!6v6}hW6IFQ0hN6IZf9e!xtE?gyazu!Q9WFV5n52B1hQG8!jR+mqVfy4@M zV{JU9yA8`apGz&fFAV2_iNdUoEC@=tXy^;4wo+YvRySfwj;b?m@_}K7qYlCWVrVY=JlbVk@DZ zwf{;Iqhd@gf&%g+AoTY$1j$i(hP4cdx-ChcTeU5!_8TOCH4FUfz3R2-57n!8oOW1< z_CbPW$H;WEuqtS#?-41MqU&RV-))isj5f4#StoCZ0%N*I76}1?D5Lh0T|H#WgRXRU zBeH2blJ$RX$W3$Koq3Uo!_Ka(!rh+1IIxk#cw%DS>J*s87{>rNAIVvT9P~b$J(If# zi|{#0^Iz9SW{RBYfCq`t5hBL15hM?|N?GbeLS^=OmKDRomCmK3yvh?YOCo;AL|$B! zX}@V^Dt)!I($D1PHgdRR((8DMFHaJ=5D>o(-iOf9))X^_H0F&+dtZ;5ZZkO)hT>|` zoyXANrfqK7r1KbzrO`$~x`jNMaVU)imXD)!+na;~5LYLEP@!f-GJtaHBEi{gZ=Ojo z0Us5f)SVl-U`~l|oVd;|A~d04m4isGto$lXnek z?wf)r;0>tO0eudJa<_?byxbGTHs&ZfkWel*xBt7KlY<3DJqk{aznwKC#^Fb~wl^co zbLYO8R9iJwjdU&hKeOI%89@!sBlQhKGA`z@`WAnRz^}dHzwOiJx8UkXVNRT<5U%$H z_6MOPI5e#H<%@q_)c@sen#gT;oHWo2KZ6O4|7Gs@?M>OU)IFZb0?)=k1kB8BiOjbS zb1?8;fru~Yg-$BF9unY*LsO^-E-0r}cO=^@E%93@V^q*a+cEOvXOJKn(C@t#+;nBw z@h7WU88^dy6vjBRkfhs6FSMFn;>!#ow|g`j`qEe4+2mI(1hvlGk!QE3?HFlN>kZ`R z_|JHbtm&UwQxn21ElL6<<4hK=3sd9%O`Hx-s?IJNEd-zV=db^8m)SsI_cRujyr8!h z{Ai$+CLG}`Wg&0f-F0`RUJOM_1g$g3|^O$~&1u-j~5Xrk`iM_^nO5-wt zn=hPFX9ifN{nc0=bz8aefK1_1?op&ns`F@ci^1Pu$cGb!QbOs!k?)&k6I^6rw{hgK zYXp|&@A23uM1~BWWKBytC4@p7Sq#sTJ>mv#!{i;koJM)hWNbtCFwkN92tj}e&?wu# z$yGXQC3OE~8{zqHGR)3)+YgZmR_Gb0=Nu_aYnKX96TNL_-(MWICo9 zc(+gcZ{hq1qQp1OFAw3bkBB(}Ynu1N8rQ&Uik;5@b-+4w?Iz)~+SXV8=|4I9L$lrg z%_XlqV_wNg1pc$KFMe;34gaiCt}$NX3+NjPF0&VAzC|`tt?hvR%o31iGwSw5ySxb% zELL4qQkLBQfj36mhbHK)ZW6o1!+la;Uz=eH3wj}%0a&T4)_TY0^IJW4gVH)!TxmZ{ z6L76nkDqIOWb=7xpEu*CcVoA#!wqUBUTKsX79#NU6O{^v>sSO2J-Z5ET$y@Y0UTKJ zLvG!1#^h9@WPG%CLOdMG43m(ACVJr@kwg@F^LRA-`$A7R-fPT0O#I~@KOBeEc zl2SpMc~rT0H&5!Op|wu2W!Mit>KU3ve-wZpJS$<}org}o*haPs{ zL?e#4{U=yb5Q(o2GVxTf-sDqU^E}3*^s-1_&KF1{$nsrgPt1G;U5BwB^-zaQf8b7g z8tBMk0AIG|2~e_jS=NK>9YzCQl3UNIGn|FY`TjWH*?`Zb=~MbQU44P&e50< z73oJiSzGPT3~^sR{*j~7c(N!?dfWF%F!*c~L1(u%f3%0r5jbNqI7>MV*JUOS7M24e z#(ZeH07?Y6hIgqYZnb^ln;?$>g4mS7_=dTDqMKsEI~B4>s3^_VjI^#`P2gze!O%nF z9qF(x2I~cgd zBX=tMCqDG^De&hbKxEFD9nl|td7doF{zO<+L>k+V)5dk7Ge=M`fT3pI*k~tXXXJHNl zbNzeX;1}avFTGciULCQJ!7#+z$@+O=oXonhbgOSu7HLuy3G08xX@FJ0u1KO8SN z=!*sCKD+tztoshmZ?PfIxv8@KmMi|L2l(T8*1+>_=KUgQ;QbH_$|^21=M$2 zpuSTUG}PZ@f7Duig?K%?ehQjZh+%Hrd?;r>LX;B0C4?H$SeRKIJ;iglvI4RY(^T+T z47xlfigh;mVJJA}y(d-Y=68)NSMEPj&KqM9aOl~QePiey^WL#0!|iX`5g5@Ygnosk zAj48{trGjGLZVbA&Bby&Rvo5mB_F(@zaXPcKP~<-(r!>;-{{SkH_g2R@5J zKGRbC;F)TSAqPFx#_~-b9%Ie*03ye!9v%nnMMs`S-2d`4qaHYwzcu^j3qH-GmfAI9$DOl?>iiSM!v_J zoi%S^L%&3W0Lw6-g1q>2mzKgxRM{$qU(SJUu2+L!;P~^#x3ql3FwBHlTdn5mqm}a}z-+=W$ z)-T}7EPgL$yrai6WKz+h`sZn_6G4h_E$|^p6xU_`mx~~m0`T>vanv_AY2JIK*y3FDS5Rf zh>m*kjb5)%;iQB`(JbMO3RQd}*-S?c2KT^FAaD+|-*xPGE%aZX-!v%Lc%XlY^q((r zky@u*wNAvI>GfmQwkjiZ9ok~?`wMh2K@l5;fok7tt{m-rfOAHtAX$hkiI0mG%WoXL z-0w7K^IA3sk#%~}_mog6qRk5jjw>KDhT4WIFfAshV=sHPBJIgBJ&trc7l+4Ed$&;F#w%V-(w(*}EtqrW7Hfpcha+TtG zmGYFPOxR4D*5lTj*9e_Dc7ra%g((NMHOKYS(0pJ-IHCEcu}!@07aU?p4q^tm@@wdj z0)b>J(!Wl)y&q=H=-vL8ZbNr`M>6ck9pvwa&EMg1YL#R!y5MW@`F}V8wMxCE$VceH z6JuP(axsw-X@KuU)WEUe8E-)M03a0f`rvbSC!|$d-rE?%o@I!wE_<34>wQ^&86(KK zF8S3{kndh=J;j~`6V0XmT+?0iQ3_94(2^0J#!=Mq>u{v#I=zd3zJBd<&kw!Q4*T1z z;T(;TB%_n>NWYxT#VcO56CihOee-7oa_FI20$&qts7F^^H- zR0!k8!kt9!1WZ1~6zezQ1vRYcbC;;ve#kdxF^6~v zhLG_~RZCxYvdAqxvwiW+%JNG0P1t7%5zobZ*3qvNqu2@Zn5Ld$IA0<8suTJ-3cB)LsT{+iE8}p%< zzgCeU68w;a$tqOpP->L_^yCWfw?Dou3?e?@O_Nh^W6k}B_?lsrHobVUzc1)kTD@?& z{J-G#|8S{G#bqwMSx4t5E(4@45{SY26DrI&P;kIQ^MDt1al3H6?G#lBiU9f<+GnCZ z6>-#%Qb=Wmc?UN&#&y0<_)tmf56kqrWqpzMq5^4&mLZKIGM8euKA%nh;?;SOy4c?^ ze}W6H?Tkj)`N<6?oZH>Gl!#{quiTeP0@1f={Mn^=@2pl-u%*i~$0@pG%)S9Z03O5r zkWJbKkNRtyk)z=LTk0=~+hdu*UC(z5=I+^qVBOcp!XZz{bd_hH_c`!sB5~JiBUY7D z4~(WsKK%8SFNaGrd5DE1bqkxmdMGdu=l$R{bj_OphTX?SBgJ7R@VA%os~Dl%@&EVd z$zE%re)UJj1-SE`iVcZx6Y6x9u1IYfIMT8YpR*-8g&n*&!6OkSUF4U`q3L?@WmN&u zt|e)@dIc)F5e9?0u-D5wQLn*b^f@QYKbEXLJKUG;N?T{{lLmCS^%5d_@b1rkefop$ zfw^IB9c2g0Qh!&gw6@IZ3p`_8+;EvuGM!=C4pGn>@h;=5Gc{`_*5Hc6AXK0<5UCp9 z{V(GO|7`5_`2Y2^{~LP6wh^KEl(Q*w$V_J6T;Jl$6TRq#&wd<}M*b}Hv`(LmO@c^O zx9gsrvXcAM22v~T)!ITW5EHzZ?Fb8{pG@p%CG@}@3D&lARwC!S_nsJ+A1UynbiDt8wzeO9Jl!ioG!2 zb2AgvYNbwL60{P8A!cFYbI_sxSUftV5Cdfdh|7w#|8M3CSHv6?-&t6{eRCG%3P7tg zc;owJeWV~KyKVFH<+sOv9(%0_6@yhqeL$b=_!1c`i|U}bTG=J*ZDarTM&SOh1#1K6 zZyE}6i@k~AOYAcbB54xUQI$S)Cn`5``YM9M{i{Nix3PyzA`M&Y5-0zoJpjd#5XiBCO@ z&VOk^V86BcKuekP;B^YdY`VtkA{=asYX@eq3hp(S2WY}IIhHuivDi>ni?|$%ire(W zh#}U4;M=3|u8?oFi|U%j)7l>E17xYooK7bx8`pWPRA7(yY<^x(Lw=gqB>DMX9jkU6hsdgf~<8vwu?~*YwWx% zXJF?VOY0El>2ij$4E*?=#00LKY%fx+cu(sz!__pQTT#T=6s}FtNlJtd;vxTTbss?? zf-b8iNDj3z*&`BYJTGt_IkS9hH#JZ!3nWhi0x1tJ9uFMh49&%#hTf2^wY5<7^^HN| z#j)B@+Rx3ox6Lo{WsCUU2k4V>zVgG zn}YTuo$Qq_Hd59BpcfkW(acT*u z7ZD_)>mM)<2jFNy_HmJVQN)1B2l3W25s zgApGKT(mf>3PPhKI%H7f{$o;_$^h%qUzY+-jRNF^z9i%-%l8oNx@)T{y~Y< zu#Z0lH;H@HqqE!4W9Vi6lmd~H1Nqa!24W*ai&UmPWFmQHv#0q*`$4@oo-+SsubpG8 zEJ~_=2wQ|}?x(=(HJvft1!$m@)9T9TCWV`(M$v(hc6+~#MI$UCjS83_FlH+hHi1bc zy?sWa69IwzkwAAaZsji2`aSQ#mLBS$vi?M%ckP6c*68s#F7;$_bqn2x?-wq#xYpU) z-0P0rpgH>yyIbY{s=8kw0p6yU3j*E;kg??GBLDX$ireW^iStj?K5|&)7{&Ff6*`kj zsLIYI$(t9S{3LnTsE?KEy_o^EWEcMSF0-#IT-nJ|nlvKyJzXRU?GsXe4XlDo$C+^* zmxXs&8XWtFy(4^5kws&PVg+d2?aA67sUJpx9ra8a2cjY5a%xMV!!W$)_sGs<-;93z zX!=v7+ZC?O2mW>$J?q<2{elhNe0Oj;%K}&;9zijF0#}<7#*_AH_P>&zke~^R9}oK) zK$g*3H0Jw2dd`S@vY#TajS%wz#0&^IY_b2{MJJCSw|2F;Fn4x!^T7iC)h=chxYeHW zLgcIZ9gSHL`IAzdQsvF0u$j(wHhueupXt$iFA8D1Y0M4xlrr^;j+mEuIS>C({P4QY zdu6V7S?ZnG*E`xfrKPD?QX`tmspsWhw+|LVZX~<#!}G%RugBgRt$xyplvIPi;c7O1 zpPqw!?i@a6spuKbo;DJ0Tje<{3E7&r)D5~nXNLPMd&KN`7(oeuN=5FN@j~GvhaTqb zZ=b~HF#D?k5;HHNCQgnAnFBw@m#FTb;u-FWzWRPJ45MK91{^X*nm-&T-a4i_73V{L z!;^G3eFN?ADoi~7ET1H!R&Wbdic}ul8CLsyFij2;1PTi2EC2oS!!g%KFW-6nc}dA) zB4Kim6yJP(k4B%?-tjM3le@CT}Ycy8DM=Z_8cW^V3mbbgVWd1OH>nV2Is{Hza6!TkZL~};$ z_%>307~Z9?+gEp3c-kPrV30!WW%G&G#gkE>(=PL~bOhOjt4-)#TR~4cEJ8*9A2Uy+ z#U9|lx>t`nov-c+s-kP0q)WNFYD|eYjDO z72qL6fH-Wnu78n#K<&1FX_)d#eJ^yb%IsQGwnY;dI8C*sO;H(6zI@!;FTOEeOI}jm zK7UMn%|8yIW31P?HdkJ-6zqF=Mlf&g`2;NvbnF`iexV~bUL=$<^ut@`IP>$Jt>Z(` z<-#L~S`Y8YG`CILX&iPjymfETz65euSIQ(aKr&HcQF3b8tYDtfaZ~*Lx7!yMzS-D* zuKforoZ9+7D>+Wz%snJCSqNBt{7G~u!{3zp&1E@(r;qq7 zz++rOgZI6Uv!OrGx>Q)VZ!VR=b(j$ z`o}yA^he4V5|jE}jadOf=H|-6Z7W9xow9${>`C>RLC2B6TaH@O`W{)9JEFl>4tToS zSlna3ZIME+U&^Z_3RnHDzgm;r=*BHgxq9gSC~baVVSRo0t7)fV6K9CpU7ZKhoutOgi8_745s(#Qk?m4R)vB9xbMg$}}e3V3=zEahJuT zG*8e;r|SERjlcf($%Ep*PyE^h+F~m)V@(gGt}n9DuscfJ{q)wiAo|>YC_bK*#FZ9A zGPQMa=KdFw4zsp^-h904F3US(0XMXQ#XwwcxL1^He>Ml7TJCP|OQe1N8xJ|W$1J_yf6O@=9*d5cr z{U4G2c;d9qI2dcneRMcA<(L$SskTwjlldOpeWP@-R%iH>DtUKRBSfR%5?_%BvMg7d z9dk`cfC=rma?K%gRiw?HGFIDEZU;A=qeQmNjW`o!P)&OhM@E_z6z;RW*&iyah+1$E9QV+|M28-}120u-}k;WbzF$@z3YG7pD9T9tIHygy@3v&d8T>I=VDkV+Hl!WN|W<3 zB_uV(>xJEMt2OmEzdxZ$cTJuGG!8M6Cw1I&?q3#_Y3Fc2XC*BXx_5^>hRJ?-uB_q4 zWOZ3GI9{uphku)VP|d;u`g(zTKwglt>2uMdf2^5x<@-IE3hqSpE>x#D)qzP-S;em# zn+D$QX>OJ=5$Yr$(2E-Z7oy3+pEjhWgb?pl&c*4Q&+?S))VVlA@?Afh;vQoVuYf~w zFiE&yjavN<+T8QE$<M7J=EJN>Og4cND%Zn$jf;DP>7vM_2 zOMHcZkaM*O$&Ea;9s&Ft23<@Wkrs7d(2@2H(i#B1-XU)Ng%0xp^qU=|*MoQR`QCJR znI`>JKX**lgz(bCyWkQ<{%)TFV95*3A>+xd%COQurtI9zpduhkHOyoL z4MxO!MSXtR1b;UFS!6p`WQ&Fic9*(DGm|3-$_|4rJ5l-SBXV!xiyIgPtXKfrhxVhzGnez~wQRaInNO^RwesAHDIWaL zDRRfMMYPTz_Z~`%Q5OWx`Uz@IBlnf8GARk4qBua{PyD%7?PJDHh0;^zI_5Ph#B#*_PZ z5pkpQgYii(ycaPLSo&D?wHToN(}GCN*P*9JuFU1}(!!hD;LcYOJ z?ph$0lSQZ>pu@Ywz{GB?=o0a8R)I4H%y-y#0V}PF@E(_3mgfGfj}kJjM+540r4V|M zC?M&nUCbbbcFVg^2QufWF)|!(UDm|e9emdv@;e^ zQ{PB@E?r7Td8bDRlREm4PI`Pyn>6dL(n#{ml0!GGdtT+jHPGr(L#r(CQ?6w7_vFMb zY$^CY-8Ovir&AglADqcdd0|lavkF$0!nBZE*$7zj)hqFz!gu`4_DR|f;eVwUG83c* z->Lg8`*DMAvQO@}D>EC%-;Zxcii9f|;q_{EYSmcgUQZZhpbJlN26#9dVpMLQOY{_P zeC8I}QT)((O`9c5Z5uw0X1mWe@3u5)8s{d5e-5;KMSv`M8?Rh(UiIcmWY)?@y`{%* zY#=4O-CixTAKygFhRy!UcAi2-EXghG!s&o zFaE89^Sj?-{{75%VCxeP=t)yFstdTUTk6FG((MQQGqReHyF2fY${WATf!|fUe zvVC_IVy?01dn@}!FWre*p#tLB-IoO@3f268sMU^`C}T&)2FX!}g`e5bw`xO$22piw zgyWCl>|RuHsbea=J0r(-%YBi>%2H ziGpL6j>jdu*dNZnVSMm3tMHXONY29dcp?wcWwpP=Ep}R%{>2W)?taW|+dT<`ecr#? z=dd_rO9#H^YD<-tCg#q;RVcRl4M2i`N-<`%X92$zJTI9Hc0R&Hu@%$jyq|md+h}4n zZ7j%*NmAlON{3fFSebUSUZySX@vO7ki6u-b=oq*cn&~A7(meq9t+}SF^`-t$vB}60 z>9YIfTu1}JcUHv9Mhj;|^J3(MUi~p^qwK4SL*W-kM+fg6Cwu3hl*#>UM z;$DR@tG4sWI+5V>DRwtM8qR6N7y-3p8Q5pO*P9VI*fr<)?lk87q#En?7q8d)=gAg{ zZT482)Kqv;e{B0JG&PZcs9zyL66y~d<~O++p;xXp`^|5K-!6Xwv)rr%~QVvb??aDcpg#kgC64~iQF~jTxc-afk%Ao2rsTg$7!hlHei>gBAhHw( zn+qu|VRPvOq>6qQQ(vU9Y`49IFYx>Uej0FsI543jvuyZRti(`J)E<{*mb@tiW^Eh z>3N$^# zncS50UEE7LWG~UB2TbI_B6La`O`7$oGks zBz&K&hu7tuhZudNZJ2JFR7k4b#9G*F#@m?epN^lB>laG-iRs3qF~d2O7n zYGWn<%Xs~#GC@^WPC41f7;RW8^dBlMC~Ej%JfIb#Y5+#Txf^VhhU6nFhO2Fpt*E~J zK6`5sDp?%zY+n+P0tTS(rzs85$7=5qEStvj2r@oux<*i|Jm>`QX$p*`*L8h|nrsTY z%uI&(NY?9GU7sMqXh$I*|~U*PprJlX4s_4oEFNNAeNzbFimq8B#+8no%7{{!1!P-=w+}xq18&ib44L zV8Mhz`)sAVoXGepG-pmtt9MhVON~hRwgv#7l|cVYrEi~p$Y~_o$wI|B@LT6i7s;p3 zRl_;lbp4QAyJ4}BH&|62#Yjo!;^qL%p&h`5ImHyaA=u8!eM!HKYyk=uH_o|3mQW4k zOF((so#)NN`<^*~bCtcT4Ts%)!3$gU`V`&t-xRC9bYc81T>ip+r?Vqtoy_Lj^7REp z>J|u?7^9Gks%wrll;TSf-7$at$>NZHuEj(iLGS%>0kwLsBKuUk99~ZxV@~c7^L@{e?oXUI%m>3;k0VV zs}-ajOi})$u~%$e3Q2In?9D$1OzhI0i5aRi;xu9X`43%3Z@q4|W=e_fC}EAzMehUW;-A>$c~zhe&4O z66;ajPs;+nF!k-nDz$ZAb7>F<4Ec1)eiN?K?1ySY$3h^Mr>9fm8bf9pt*nHp8Jmq_ed_1ueUN^ zRh=ji6PpVEkNJSDAjiacZi?sLYd=bAwgw8N z)plOi+QzHuStg*OL`{|XZcUk7q?X5DQ#>k&T=MZV;%RqMIrtgg(a!lJS`AP;8s9?G ze=r6ZKJ`?#dM7{JqOo*bp6-#qZu8fEd^EelA__=X1+D(<>Pwu-rDN(%bb;NKJY;MQ2o4VyrKwm_qObu^5&uL?-dG` zpY{w<^zmF*t!H6|fm*YnoKmSnWGQ98fS(8LaH|o$ges?R8-Q<6y6VZB z-U_R?3jk}V1#S1qy?G!(xtAzcqZ$Yfynk~aG6KbULoV`mVw?BEYcn|{w7L%|>iX{w z`uX|u26c}KuADLwgO0`gO%A5-D3rCDq6nGiVb@%W#A zWPzNTRJk!^2hdZ$QYx9#Qn^?iw^mOQqgm(u16(RleyU9j788`!rX9?00P~>z*71vVX>VzZ zZ)H$6SnXd~3>s}+-2v!D%0rw;p9k0&bSg|Dp{fhQYho{L!g(WjR#Vk7b(BPXbMF(U zx1`UrDDTVEG$dpvnj3#Y98y*t*m=KMF-1aoU4`)f{P%2MHjsj=r2){t#n(H+gahZ7 zz!s=qB(G(acsU-*KKDNc{VBH9FFY3wCU+uj^F;J8WCeb`9!n(r$>`~w} zTpsT_`Sx!&IJ@|@c^28|Dpso1f=9gyGBCl=q`1*si23fw8X>OZZc3}0S6(ekpqQ?~ zXb~;+9Delg+)6+7MXl(WJt_r+^}sU3R|}2RLSHcjAGb&x68mGM-3};xS+ocvbDZJ5 z1)LTzoU6P34UDr57{4H*4c4dkPU{uQ?KC?1Nw*K-3UECXPZ>N?6NtDBr{zBuJH!mv zsszF>zDV3npnOETUnLarn7MUFeu>`Cayy+#?thT-j$WwlV(E*>`>05Y>qyj7|6wNU z6PouY(ChuL@nhv4$9@VukOmy=Ps@H9wzNuydn#U^@&pqg$Vh#UuOHu9P9uq9%22_g z)*$4uzUC}6;#wLyX8VLfs-Nx43Q_=ec&I7O zt5=PM$5z%r(D!WLzX<8|j^50(MP+ zp%*I5;+=;hI-WZ}oc6=(Hb~ujejrIP(M}m&i~7-U7BylxF5!OCwh0paSzc!rYPL-A z!kwgbWM&Fx(24(Cr=b2`aMx7-{XRwMt?R?*js^PqRO{{3II5mpr8Leg;ceS2;2tHL~ zVPcU29mHZ}R6y9Io9G@Uo7XPS%fkBKJLp;HGySRKdPaKS zq8jRZ7Q1(!f)@^HZo-WwCW!qh#A-Jp%nR%)H(1Aw*&mArs0?PU2Q0MTm;3>mbjY-6 z7OAJZ?)>jQPklU2Z|Iw2_Cn%$Pk;Y4LPrPpjX9e__Ku4}-HQoRsHbI1`oe$sJkR!} zges_68aQi9L3GEk@B}yZ32XyZYdUZG1lcRS5%a+CTmFWpA{)qxK#U*FsU;*Vn-s~M zs&&N^**+6#{E!IS^yDqSJyCS7rVX#N{!g$avnSsy@e@M;k%MP_O#Cl;r*rZ|vm8D1 zW<&EU?nVBxZe_(?>$F8Wn z3wYY91~1EdzCFe#O4l<|uM?iV2Cf=q$~2`dnxAW*G4&G~qw}9*7#3UAGWojJ6M~Vf zr=~P>qxr%w&Qce|s8OL6t}06}=MDiO>QDK5Sc#@KuUkt8#Hm&VZe$?2wVrSs&8i%w zIKmfF_T*J1U4Blo1+n%sEiZ1_?;WT*`*H8|sJ`1Si9|>8I03=kx+n;k!J&;0wi_xa5cZCA9>z8YmtnT@eGFuj#b>}kM;@(vFs+B?iN}cSR z)xY}JIlU(Zr%Hz-Z(gkE<-I7r`eJOL>Npn2_-^ZjoTkM+wguT%`+b+Yyi6d;1KnIR zpx?9fY+u??1shg#)DXm*1mox$d5~p z<8c)Vnx(=BssSfn*e{7!B;r%+TtQLtrr34@;Ypv$kV;K+iFGr#^ET2OE|KT!yh`vl zN2pUd@eu&L2WEwo))k)}8}2*U1u)5u4Jb&yLhSFc$(0p(NOwKonT5HY*L0V33sYcc z3XvnZXJs*yI#%EqrnK*UjBs;iO}s+eSNh7cNFBb+pP%`t6t*ZxV{^55Rl%N7ati{< zy;D7ybT_sR?SOnQdB0J!rJ<0&fnXfJ>iUjTS8DfLr&SRLN`UuW`e_Mj!SK=PY1Da0 zWBuaC#TdwU#p->GdvS{IuxlO0Pt+@C-C-}MF&9ZaOK>=QzjWD^7e>fxmL%VI{gAyklecOU{#m1c8%X9VR*sEECSuq2n zC0p$AFJv;<= zX@Bux<=8z&E873~9hArlAD-(Yb9_S$OgLL*AD(}ZVRh5BEJHo#Ls7IKGmQnl+lTW6 z6uB(!;!Q+(Y2)7%p)>PFDExw+#jH55N-aOhEznr`>@YEWF+RwWceP^%*CzXQ`glKy z!=mia=O_=bSWftGTi3F=d?}fQWcEE429JGp`M>^i-T!@TbJQT`wbPz-zGjBScN>u6 z+8bL6)L>IAx)1ee58z$HP^lXU;i8@wYwSLbn=Y5<5=ZPcSmdZMCI%eQ>%aM9%`U|} z_tH&*Ga6Zj7YLw~R;VMH!Q1OngIP?lrw%@!{YUO7U9+&)JF;%Qj`(}#n za~<{*zJtdkj#ozk^FATo71m+@>6LpyWds8WsVmgd-5qwSW_8|YbCS1wK3=JVP`OL3 zgZm(GTX(rUNe}*9cMcky?b)Q&o=Y}Oa63yr^FQe2b1bjhL6;%!S^PWK9YQ^pU&B20 zsCJL=hL5iYr~WSc&HHMOxAgh^GC~z7fb$FZXY(ppo{;?+fp?I84bVS)3FKGPdD#E8 zQw+?Euf32_^6K57SkW>aPW8PE_uX6&SLhwlmknq~H{^kMS8ZrZ2kX10y}!WAuFGY$ z8k{g9L<9kBM-ap!PBZCyIa=5!ebsMkdpKPyIZSYqTpGDgj);U2BNj=NR~DQ1{_5v$ z-q}JAQWj>@Z7@zE(aVo&&FD!rykZRK;ZIQ1^HN~f_oVg@2G_50I#JeXnINP) zNHy;lW4NMN_qXWt*~lNPHsggc%?z#+$s!SXSpCOfSDuqz7#_!`!5!(fUSIRgTX5Hw zQsT>NTC#~_wCXXduZvvYsx%c%zvLHnw|6C`WflOq9u)odwvN3|KafePTY)-(#=<0r z+Wu83<V+~Ho0-(%H}*0r@( zkl4RTi)PVvTDkQDJoK?xx#m?&@x2@6`3Djo3-ImG(2Oj3{g+mUHoL#Dzzp zMX7c6?pz_3*;`Vt5ooUw5N$~4b@=O@ByM2G#C)j#2k{n8JN4P!Mv5e#Tf5NKgQ9i& zhH{-dpV#d^@jk7+Xq|d8Xq|gZoYBW)esJ8!j~hBfeN5f%p$!1$wKX@I7XrGJ9Q6Mt zrX{UCE7^|+E+No!+myr#sb&}2?YO0!hqR%$q=Dr7+oXbh>GY+LEPQl6O|AegIB+{#P^(-l=z(y`CUK4oD% z%nA}O?&NT=7*QszeX6@?x(XaNIW%wr8lxE^3oJ6&hy<4XKQ^^fCALv4tn!;|wUv=h z&rdf`#{**{2*k{cP5jwdW~E6>YYkdQ%Bq(P=1AG?EC=_Ps!SbJ%$B4jHY9xU0OhQi z^ZzhK9Gap3fG&s&tA`rT0(KcKn<>d>l?44D+q$Bin>X1|$+Vw7oVl;;42aFpN>xD8 z*=-w*njzlJRv6xu^=nf0L*Kk(NaqkdN(N>JQJ(D!==-TY`)4!W*U$O$K?6Z1fNufv z=U+hn%#s%=!#Y&i#jsr39^LbsH&;!w{%Ad*mrE z8s42wM_kk#nWv!Z>sR42Af@)+6Sb;P;rPR+so2oFSK^V$Q^I6I6ou%6)4GTEPJDV{ znRpD+fM-AlNw?~&0ZInc`2@9w=OS73{23@xBjJwS2i#1rE7SKKU!p5UYTQsZIAr9^ zuhPEb2;8K~glFiy=d+*1^2;6-(X!@`I#}_$ed+pYR{UqufntB{emb#lyy$-MQQRP! z4|srYAe|H=wCR-rzB3cDq2!h!2I+$?|813)X2*!nji$1yn${atm)?9v>8SR@YL;*5 zoZ!ss=spVAP~Z1Of(tfezds@4+PQ3$tkObGYP9U7RN+qh?Z5dF800S;J}vFG;16tslw;uf5!jgLlq<~4Gw|xYvh83 zM}t-Za9Ff!n#uZp^0GBE6-7R@rc$-Bg(94|-;P^u`HgZ@Pf}2%>4jlgIcvTXB z_n|d$?n;b$r~MH;Qw4Ka5x%C;bjI?0oldUY=|DbVDnvddZ!ErzrnBH2I?&ed&o$6r=oZ4f!Q3gtTA;T`~?9KcYF zF0b8N-z_5+D9@-L_KB2ZM(Fg7yAcH@d(-f7!oP6o>W!%R)*Q4G$fTB*9%>eZ<1`5i z(U(&aS|b}0Z3NwLSI;urH5>Az2{)r}1beUAb}sS8-~W2^>>qeQq2|x{C?#IQG0aoJ z5k5l0|M`a$UJj}`%9Yd38_rLap_mI-DrJ9r1JUD-5IsnIEUUfFCUFiwojn!RjCCLU zch{viSE`Efnh~JFf^bSdZXbVjrgbha1NhIT58{$y@UHYGB=DBq!Iq z@ayQcZOXmwbLEVpL$WJU?S{%frn4KBwSKBT5>bIMoXwa2DcTFmIeq}(6ucmGuImnQ z?eAics`{I0*cmpp20b&OuG*W!&T$bW+*Mf0-$f|921cOiNO?k-XV_Aa2nvs?9Z{iiP6TN#oCPPPyCu(nIwl%G&{g0Z{)WlPO9hargcn-Y9hf$DRF>F_VI|EI zI5ql{e$I{6mV;H4Bs6yv&91hd&DTYwl_Tnq2*ZSbS@~Fp`oUO0E3X7Gzdl@>EmS`e ziWQ|cv{Gbjs3I!GBI5MA9#VWdFR}C1Y8kqHU%WaEH@;OBF`fCRF9!xG@c)}%@ETOX z;M8Sb2o(R}8-tANIRs~-1@V*cJ`)5d1_fvQagd+nPTP|}7hU$6)R}bm`7BMzc&bxB zZm+0_tzgBB4FmU_{iq79sQlsbnP)$8yp*H%o_&fW=a3{i7y=M-5RTqAOk}WQ;QZWH z@qe)=aiD{sdN}pgPJ4x9yZ!d>-f!sFMjt9za9PnwSabjWMeLPA@l;_0 zQ-_3Q1E)Nap5Z46__czT6zE@^k4R0Q%X)NEF=@#n?C{cN)bP+vL!6~+&l}WmO#W-N z(wO>ktQ^BkyCYNsOx#$)q%K|i-ytSkz)~|S*Svv(lGEu6q&aFt$yh-yfX?ik|NW3Zz7+adJ4me;!%c;a z{l+2Z;JeBNPnk1r>;cz-#x_V7@jV$3oU2=+jpE?4_%-`1jL99J8Ck*hSE zj$kSU%HgC|+fW@{Ss~VuX3NFMZilL05=F%R5>8{HYf0?mX3{52k= zs%sTc7_x4Y_G0$%uGXDzuoXtRB+1B+lx4=G+_rQ4wr`}?{H>xugjTHXPw@}nWjYs zb@BcAaq#WkRe(TaAk0DgcK>aUDg&b%SR+lTaB$d6oN-8g+SQy-MMwBk!iIsbkwc{1z?9G2EqM5_MiMp=-~%U(wNRoqly zpzM{X(%gB~MmzJ8S7cuFca-=?H5D)dNC$+$697*GDlb-azazaQ%(8q&;n%3B>#~5% z3J%uXX&0C7EYNRTJHbHeIv96466kuH+|1~KzPGv=ny#|$weLltN#YcG{_0ib4v*I+GP`v|$#o@tv*^BK{kl1RSaZy5@$~Bn{$yF;`Kqlk zA`~i0OWdNlreMShuCd{%kf|=YU6hEez|?WIXaWT?-Q`8rT|J^NSNOlHxei?Y%bVag zLs7JH?x9LD6UG)*%-wVl{G!OD^Phub5t)zGk?^~X8B=N zk3h2C)9qjUWdR{`KhGb5^IHwzSCtn4|Ezf|rPW+V(d}`8u9n$PFTCG~0bD#F(W5XjYj&bt9lG5C8<|)oKKYhdA%H$G zPE9aZV-UD_cG<^(L*`-G1Gr}sO8kTFZ^Id<*8MgSvxz*djU`yRnl)<&3fEmm(O}hI z$J@b4P82a)C_gVq@AQU?sDu*f(V z4SHX!E(k!DAbhB|oxgV|Hs-KsP~vSDq58!zq5m{3!a>zo|B)hAR8|(N)V3dw^XBor zu4ykCXM{@RAV73_VV1oeFe2vA0MX;Bn??WP*avFPzswgyBP$vzCQ7ws+e9==4?$If zJIlb~gqmzVFZmZuw@{Hlm?aB`sTRM>RjmZ>jCsD*CJ~}wh|EYk$j?>Cp-8*W_LbL(#m3Zh+)Kl20P1TgjP)m8w(H~?B8S!J7Py%^)Oz@^$9QTclqMioxtbc2r@W4!q}l)_yA{!xb8RE0|JV--qIu+$=VKpdf;CDJ&KI zyX|@f(#H3TYzT4s&fg_ZntKH8)J1m)FC#4e6MksIZxhVY)bi-L{kgNrKX0E7Lr8j7 zdv{ubxUR~g$Z)rux{F!aWNVyF@E>7&{U$c+CTufZ(W>AO?3KQIsfAH=$pc*a4*cH@?ES){vT@+* zlZ)@2y{X@et|4kz_@0==48Hexd5d6Nt_yo&fgrT`>ah9BWo2fj-+f6{JYFgpMVE(fGER%eWtm-(eF>OD7X(pSk1lfpATYIhs{;B()OL5kZ zORj&*I=XPlc#q!}*bpOwG@-9y!yP6RzgQcWoP|wR$k-2AiI{>z=JhC)-@kzpirx#X z+9~_HB^I|{m9+K?*hJ`%q3)vVaK58jaDton%-JRrAbw3r+}4?)PQ_6qVZ0&OP}$0o zy<}9F+%DLvG}CIJy2z7W;AxCTNBcpFsX(wwjvlG zT%d7)oa~dj!(25g&>(m6`@^CXO{=f_28FJAn}AoWlPYnH&7!!=7tWl}1RXFLwv=>g zt+EqOX^=8QwBs~Y1+!iPe^dL#*aPD-t1KE~{;VNR@V-_U`D%u0WyK=XB69;TXGDw) zwUCEhV&KDIAl&fgr>hRtq$&t`^l7ofged<%qWv1C*uE`U`h9CoJk-YnuDyE8)RB>n zEaQf@DmA-L5Az`aaO;W*ZxkPCu+&80r z*XyK4020sc&PuNaDxc> zgNee5j_~5XHj5Zx4;{ZReX5!do9xwKv_0OGz3JKuwD8-EJQ)1%U6LZ^d^3|_&kCg* z33whWl*4I!D*?^+K{)Z#DQxBFNb-||PUd16HJh)X<5rlNK6_Sjl!{y=18!M)n2c^& zQDvFo!dM_JZL#6kD|y|pK6GSIkm?!ycPo{ZEG%g`+~t)KrZDL7Q>cG=$9D0iHzwg}7f}muGj>u>-Yu%Nhzc?e>{HX$ngH51*``^F^ zNmILxdxoZ$A-|qty_;!aSxr?4LtOWU+JYb=$bw#7 z#RS4n*4c*Ve8jSe+#ss@=j(9+TbY9;mpv;RE2TW|@Z^q++pvue#LIx$1O^qsk; z80~K%u97hOxKtq>?)#d4iC&}N=GF_6*LQlY_8y_mN+NI>4uc>BnOYwG0=cbQ(=BB; zvlT7{C_*lGMe;b5368l#Ya=ZYqZ?=i8I0`6YZ~8BG5hD0UyTQ_`M43zd7es80K z7e(+9tm;5!G9+4bM~#F*j*R}2C0__BzY25f3boj)#j#LP&*r;pfc4dcE-b4UiV%dW z=rjp(Yd~JwGHMZN(AvhL@qS8hA!o37Hw=ShN_#9D*!8F%>HQ}0YN4DDyFVb7r2p;v zi=f5yN1q&yB8sUDs`c?KyJu5zWXdmP9Sgc|7aXPp*HC0c_0q)^ocu@#Z<7x)pW{h_ zckL`NWvGnwAtbu)Q+iLIm6}Sz-xxa&Xqx$G0BKnwhYG!Yko67Gg1AmcZ!~stXorAuO3t^uekyV`| zpHtyaz^6^%eXHHAs{hyvWSzDF4Vt?9e98lm!;D35bmfC=&+`!Di#{$Z_%~B)#}GuoN$djbE#aiv5q)BH>v$Rj^d*Q@FcI+M(MB9F z9MMUF7NtNVbckSDhJ5O+e94e)LFA^;mg8CAse*PZ6~^D8?R#c6DXU;qRKi0jDBu31 zmq0vjEw>AVj!Jk8Mc9;qFnP;pONN1TcqyO1>-oKqk?;f2hWD_<(DDA<9wVU9A#Cwb zK{>a83y(JhQ6qEM^MXSjVeZo)2!yN&cm^{tI5+?vV1fWjaN%ZnFu(~+Z`Y%k1VIh9 zTcFsob-!4la!-Xd8g{z$z6vpFsaA#{9oBS9;7M|{fDiiqo*(9b?OLh-|Koq|Z-4#SnhhT$*0SSeGB|&r!1lYjMwLu^x zR|p6RVA<2`^C+x>WZxG!2f}UgT2*zxlt#zxx$wq|w6O^P&m}wjsJnMMp0yp(AZSGeA^lq)3u7`8)Z>7F zkB;?+3<*S!fJlY-H$T)8%nhO)17RaSoGQ*7!Y4tb$MW!t>AGRA5=54uvW~)IW%whO z=BJO^3|1t-kN(08*a7_VYx|?~aI7ZqDVOtNgTWJ?|RGG0r_+dSxrR&ZZT1A{>uOR?|FUV_%jg55m*qQjN<@{{{QR$-z)sz GpZ-6j{Q=4V literal 0 HcmV?d00001 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f5bffe1..81f2036 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a83a4d3..dff0209 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index 69187e8..68cc339 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:async'; import 'package:http/http.dart' as http; +import 'package:flutter/material.dart'; import 'package:local_spend/common/functions/get_token.dart'; class Organisation { @@ -24,7 +25,7 @@ List jsonToOrganisations(String json) { Map decoded = jsonDecode(json); // print(decoded); - List validated = decoded['unvalidated']; + List validated = decoded['validated']; // Map organisation = validated[0]; // // print(""); @@ -101,4 +102,8 @@ Future> findOrganisations(String search) async { return null; } +} + +class OrganizationController extends TextEditingController { + Organisation organisation; } \ No newline at end of file diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index b317542..ed74f92 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -59,6 +59,14 @@ Future submitReceiptAPI( if (response.statusCode == 200) { final responseJson = json.decode(response.body); + print(responseJson[0]); + + showDialogSingleButton( + context, + responseJson[0] == "" ? responseJson[0] : "Upload Successful", + "Transaction successfully submitted to server", + "OK" + ); return LoginModel.fromJson(responseJson); } else { final responseJson = json.decode(response.body); @@ -68,7 +76,7 @@ Future submitReceiptAPI( context, "Unable to Submit Receipt", // "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", - responseJson.toString(), + "Message from server: " + responseJson[1], "OK"); return null; } diff --git a/lib/common/functions/showDialogTwoButtons.dart b/lib/common/functions/showDialogTwoButtons.dart index 03ab0d7..af1cd6c 100644 --- a/lib/common/functions/showDialogTwoButtons.dart +++ b/lib/common/functions/showDialogTwoButtons.dart @@ -23,8 +23,8 @@ void showDialogTwoButtons( new FlatButton( child: new Text(buttonLabel2), onPressed: () { - action(context); Navigator.of(context).pop(); + action(context); }, ), ], diff --git a/lib/common/widgets/popupListView.dart b/lib/common/widgets/popupListView.dart index ceea50a..7f5d27c 100644 --- a/lib/common/widgets/popupListView.dart +++ b/lib/common/widgets/popupListView.dart @@ -5,7 +5,7 @@ class PopupListView { Future dialog(context, List options, String title) { return showDialog( context: context, - barrierDismissible: false, + barrierDismissible: true, builder: (BuildContext context) { return SimpleDialog( diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index f0bfc48..2d377a9 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -84,8 +84,14 @@ class LoginPageState extends State { // child: ListView( // children: [ body: Container( - decoration: BoxDecoration(color: Colors.white), - child: Container( + decoration: new BoxDecoration( + gradient: new LinearGradient( + colors: [Colors.white, Colors.blue[50]], + stops: [0,1], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), child: Container( margin: EdgeInsets.fromLTRB(60,30,60,0), child: Column( children: [ @@ -143,50 +149,41 @@ class LoginPageState extends State { }, ), ), -// Padding( -// padding: EdgeInsets.fromLTRB(0.0, 25.0, 0.0, 100.0), -// child: Container( -// height: 45.0, -// child: RaisedButton( -// -// onPressed: () { -// login( _emailController.text, -// _passwordController.text); -// // showDialog( -// // barrierDismissible: false, -// // ); -// // print("pressed"); -// }, -// child: Text("GO", -// style: -// TextStyle(color: Colors.white, fontSize: 20.0)), -// color: Colors.blue, -// ), -// ), -// ), + Padding( padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0), child : Material( - child : InkWell( + child: new Container( + child : InkWell( onTap: () => login( _emailController.text, _passwordController.text), child: new Container( width: 100, height: 50, - decoration: new BoxDecoration( -// color: Colors.lightBlueAccent, - borderRadius: new BorderRadius.circular(0.0), - ), child: new Center( child: new Text( 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), ), ), - splashColor: Colors.lightBlueAccent, + splashColor: Colors.lightBlueAccent, ), - color: Colors.blueAccent, + + decoration: new BoxDecoration( + border: new Border.all(color : Colors.transparent, width: 2), + borderRadius: BorderRadius.all(Radius.circular(2)), + gradient: new LinearGradient( + colors: [ + Colors.blue[300], + Colors.blue[600], + ], + stops: [0,1], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), ), ), + ), Padding( padding: EdgeInsets.fromLTRB(0, 10, 0, 50), diff --git a/lib/pages/login_page_old.dart b/lib/pages/login_page_old.dart deleted file mode 100644 index 612fe72..0000000 --- a/lib/pages/login_page_old.dart +++ /dev/null @@ -1,209 +0,0 @@ -import 'dart:async'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:local_spend/common/apifunctions/request_login_api.dart'; -import 'package:local_spend/common/functions/show_dialog_single_button.dart'; -import 'package:local_spend/common/platform/platform_scaffold.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:url_launcher/url_launcher.dart'; - -const URL = "https://flutter.io/"; - -class LoginPage extends StatefulWidget { - @override - State createState() { - return new LoginPageState(); - } -} - -class LoginPageState extends State { - final TextEditingController _emailController = TextEditingController(text: 'test@example.com'); // remove - final TextEditingController _passwordController = TextEditingController(text: 'abc123'); // remove - - FocusNode focusNode; // added so focus can move automatically - - Future launchURL(String url) async { - if (await canLaunch(url)) { - await launch(url, forceSafariVC: true, forceWebView: true); - } else { - showDialogSingleButton( - context, - "Unable to reach your website.", - "Currently unable to reach the website $URL. Please try again at a later time.", - "OK"); - } - } - - @override - void initState() { - super.initState(); - _saveCurrentRoute("/LoginPage"); - - focusNode = FocusNode(); - } - - @override - void dispose() { - focusNode.dispose(); //disposes focus node when form disposed - super.dispose(); - } - - _saveCurrentRoute(String lastRoute) async { - SharedPreferences preferences = await SharedPreferences.getInstance(); - await preferences.setString('LastPageRoute', lastRoute); - } - - void login(String username, String password) { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - requestLoginAPI(context, username, - password); - } - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () { - if (Navigator.canPop(context)) { - Navigator.of(context).pushNamedAndRemoveUntil( - '/HomePage', (Route route) => false); - } else { - Navigator.of(context).pushReplacementNamed('/HomePage'); - } - }, - child: PlatformScaffold( -// drawer: BasicDrawer(), - appBar: AppBar( - title: Text( - "LOGIN", - style: TextStyle( - fontSize: 30.0, - color: Colors.black, - ), - ), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), - ), - body: Container( - child: Padding( - padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), - child: ListView( - children: [ - Container( - alignment: Alignment.topCenter, - child: Padding( - padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 15.0), - child: Text( - "Local Loop", - style: TextStyle(fontSize: 40.0, color: Colors.black), - ), - )), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 78.0), - child: RichText( - text: TextSpan( - children: [ - TextSpan( - text: - 'This is the logon page.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - TextSpan( - text: - ' It is currently in development.', - style: new TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - ], - ), - ), - ), - Text( - "EMAIL", - style: TextStyle( - fontSize: 16.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _emailController, - decoration: InputDecoration( - hintText: "Use your login email", - ), - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - FocusScope.of(context).requestFocus(focusNode); - }, - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 35.0, 0.0, 0.0), - child: Text( - "PASSWORD", - style: TextStyle( - fontSize: 16.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _passwordController, - focusNode: focusNode, - decoration: InputDecoration( - hintText: 'Your password, keep it secret, keep it safe.', - ), - obscureText: true, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - login( _emailController.text, - _passwordController.text); - }, - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 70.0, 0.0, 0.0), - child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - login( _emailController.text, - _passwordController.text); -// showDialog( -// barrierDismissible: false, -// ); -// print("pressed"); - }, - child: Text("LOGIN", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), - color: Colors.blue, - ), - ), - ), - ], - ), - ), - ), - ), - ); - } -} diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 3c34a72..ccfd83e 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -16,7 +16,7 @@ import 'package:local_spend/common/widgets/popupListView.dart'; import 'package:local_spend/common/widgets/labeled_checkbox.dart'; const URL = "https://flutter.io/"; -const demonstration = true; +const demonstration = false; class ReceiptPage extends StatefulWidget { @override @@ -32,6 +32,7 @@ class ReceiptPageState extends State { final TextEditingController _recurringController = TextEditingController(text: "None"); final TextEditingController _typeController = TextEditingController(); final TextEditingController _orgController = TextEditingController(); + final OrganizationController _organizationController = OrganizationController(); FocusNode focusNode; // added so focus can move automatically @@ -71,7 +72,7 @@ class ReceiptPageState extends State { // this file is getting really messy sorry everyone - void submitReceipt(String amount, String time, String orgName) async { + void submitReceipt(String amount, String time, Organisation organisation) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); if (demonstration) @@ -89,6 +90,7 @@ class ReceiptPageState extends State { child: new Text("OK"), onPressed: () { Navigator.of(context).pop(); + Navigator.of(context).pushReplacementNamed('/HomePage'); //TODO: Reset form after dialog exit }, ), @@ -96,7 +98,6 @@ class ReceiptPageState extends State { ); }, ).then((_) { - Navigator.of(context).pushReplacementNamed('/HomePage'); }); } else { @@ -105,16 +106,21 @@ class ReceiptPageState extends State { // setting up 'receipt' receipt.amount = amount; receipt.time = formatDate(time); - receipt.organisationName = orgName; + debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); + receipt.organisationName = organisation.name; + receipt.street = organisation.streetName; + receipt.town = organisation.town; + receipt.postcode = organisation.postcode; // receipt.essential = convertBoolToString(toConvert) - //TODO: initialise receipt with correct values from form +// TODO: Categories // receipt.category = category; // receipt.etc = etc; submitReceiptAPI(context, receipt); + Navigator.of(context).pushReplacementNamed('/HomePage'); } } @@ -166,7 +172,7 @@ class ReceiptPageState extends State { // know that before writing this and it's done now so I'm keeping it. } - String listOrganisations(List organisations, context) { + Organisation listOrganisations(List organisations, context) { if (organisations.length == 0) { showDialogSingleButton( context, @@ -189,7 +195,13 @@ class ReceiptPageState extends State { // dialog.then((value) => debugPrint(value)); - dialog.then((value) => _orgController.text = value); + + dialog.then((value) { + _orgController.text = value; + _organizationController.organisation = organisations.where((thisOrg) => thisOrg.name == value).elementAt(0); + // this may not work when two organisations have the same name, + // then again the popupListView can't display two of the same names properly either + }); //can't return value as it is and thus would block } @@ -305,15 +317,14 @@ class ReceiptPageState extends State { onPressed: () { if (_orgController.text != "") { var organisations = findOrganisations( - _orgController.text); + _orgController.text); // returns Future> var choice = organisations.then((data) => listOrganisations(data, context)); - choice.then((value) => _orgController.text = value); - setState(() { + choice.then((value) => _orgController.text = value.name); + choice.then((value) => _organizationController.organisation = value); - }); } else { // no data entered @@ -354,7 +365,7 @@ class ReceiptPageState extends State { ), onSubmitted: (_) { submitReceipt(_amountController.text, - _timeController.text, _orgController.text); + _timeController.text, _organizationController.organisation); // TODO: make sure organisation is valid // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry }, @@ -452,7 +463,7 @@ class ReceiptPageState extends State { height: 65.0, child: RaisedButton( onPressed: () { - submitReceipt(_amountController.text, _timeController.text, _orgController.text); + submitReceipt(_amountController.text, _timeController.text, _organizationController.organisation); }, child: Text("GO", style: diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index a77d3b4..163761c 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -156,21 +156,22 @@ class SettingsPageState extends State { ), ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), - child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - feedback(context); - }, - child: Text("FEEDBACK", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), - color: Colors.green, - ), - ), - ), +// Padding( +// padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), +// child: Container( +// height: 65.0, +// child: RaisedButton( +// onPressed: () { +// feedback(context); +// }, +// child: Text("FEEDBACK", +// style: +// TextStyle(color: Colors.white, fontSize: 22.0)), +// color: Colors.green, +// ), +// ), +// ), + ], ), ), From fef1621d3ef781e29cc034cac7c3f57cbc7976b6 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 11:42:34 +0100 Subject: [PATCH 034/122] Logout works all that needs doing now is 'save login' --- ios/Podfile.lock | 4 ++-- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/apifunctions/request_logout_api.dart | 10 ++++++++-- lib/common/apifunctions/submit_receipt_api.dart | 8 ++++---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 81f2036..f5bffe1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index dff0209..a83a4d3 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/request_logout_api.dart b/lib/common/apifunctions/request_logout_api.dart index 324660f..17a63a2 100644 --- a/lib/common/apifunctions/request_logout_api.dart +++ b/lib/common/apifunctions/request_logout_api.dart @@ -1,5 +1,5 @@ -import 'dart:io'; import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; @@ -16,12 +16,18 @@ Future requestLogoutAPI(BuildContext context) async { token = result; }); + Map body = { + "Token":token, + }; + final response = await http.post( url, - headers: {HttpHeaders.authorizationHeader: "Token $token"}, + body: json.encode(body), ); if (response.statusCode == 200) { + debugPrint("Logout successful: " + response.body); + saveLogout(); return null; } else { diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index ed74f92..7c68ca3 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -62,10 +62,10 @@ Future submitReceiptAPI( print(responseJson[0]); showDialogSingleButton( - context, - responseJson[0] == "" ? responseJson[0] : "Upload Successful", - "Transaction successfully submitted to server", - "OK" + context, + responseJson[0] == "" ? responseJson[0] : "Upload Successful", + "Transaction successfully submitted to server", + "OK" ); return LoginModel.fromJson(responseJson); } else { From 4c036b8bf2bfa604d4a6e25680459318cfd448ec Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 11:43:21 +0100 Subject: [PATCH 035/122] ooops --- ...splat_sport_air_horn_2x_blasts_002_21151.mp3 | Bin 46104 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/zapsplat_sport_air_horn_2x_blasts_002_21151.mp3 diff --git a/assets/zapsplat_sport_air_horn_2x_blasts_002_21151.mp3 b/assets/zapsplat_sport_air_horn_2x_blasts_002_21151.mp3 deleted file mode 100644 index a8349465c9d02f36c088d3f55b372d620a799d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46104 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�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 GpZ-6j{Q=4V From c288f257c56daa38310fce5714f8731c1ae074e1 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 12:09:10 +0100 Subject: [PATCH 036/122] save login works --- .../apifunctions/request_login_api.dart | 9 +++--- .../apifunctions/request_logout_api.dart | 4 +-- .../apifunctions/submit_receipt_api.dart | 8 ++--- lib/common/functions/logout.dart | 10 ++++++ lib/common/widgets/basic_drawer.dart | 2 +- lib/pages/login_page.dart | 32 ++++++++++++++++--- lib/pages/receipt_page.dart | 2 +- 7 files changed, 51 insertions(+), 16 deletions(-) diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 2e31f8e..c1ac5e3 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -20,14 +20,14 @@ Future requestLoginAPI( 'password': password, }; - debugPrint('$body'); +// debugPrint('$body'); final response = await http.post( url, body: json.encode(body), ); - debugPrint(response.body); +// debugPrint(response.body); if (response.statusCode == 200) { final responseJson = json.decode(response.body); @@ -38,17 +38,18 @@ Future requestLoginAPI( return LoginModel.fromJson(responseJson); } else { - debugPrint("Invalid, either creds are wrong or server is down"); - Navigator.of(context).pushReplacementNamed('/HomePage'); // just here temporarily while server is down +// debugPrint("Invalid, either credentials are wrong or server is down"); final responseJson = json.decode(response.body); saveCurrentLogin(responseJson, body["email"]); + showDialogSingleButton( context, "Unable to Login", "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", "OK"); + return null; } } diff --git a/lib/common/apifunctions/request_logout_api.dart b/lib/common/apifunctions/request_logout_api.dart index 17a63a2..342c85b 100644 --- a/lib/common/apifunctions/request_logout_api.dart +++ b/lib/common/apifunctions/request_logout_api.dart @@ -26,12 +26,12 @@ Future requestLogoutAPI(BuildContext context) async { ); if (response.statusCode == 200) { - debugPrint("Logout successful: " + response.body); +// debugPrint("Logout successful: " + response.body); saveLogout(); return null; } else { - debugPrint("Logout unsuccessful: " + response.body); +// debugPrint("Logout unsuccessful: " + response.body); saveLogout(); return null; diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 7c68ca3..bfbabfc 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -46,20 +46,20 @@ Future submitReceiptAPI( 'session_key': preferences.get('LastToken'), }; - debugPrint('$body'); - debugPrint(json.encode(body)); +// debugPrint('$body'); +// debugPrint(json.encode(body)); final response = await http.post( url, body: json.encode(body), ); - debugPrint(response.body); +// debugPrint(response.body); if (response.statusCode == 200) { final responseJson = json.decode(response.body); - print(responseJson[0]); +// print(responseJson[0]); showDialogSingleButton( context, diff --git a/lib/common/functions/logout.dart b/lib/common/functions/logout.dart index 8f9ba29..e05447d 100644 --- a/lib/common/functions/logout.dart +++ b/lib/common/functions/logout.dart @@ -1,7 +1,17 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; +import 'package:shared_preferences/shared_preferences.dart'; logout(context) { requestLogoutAPI(context); Navigator.of(context).pushReplacementNamed('/LoginPage'); + _clearLoginDetails(); +} + +_clearLoginDetails() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + + preferences.setString('username', ""); + preferences.setString('password', ""); + print("details cleared"); } \ No newline at end of file diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart index f19c835..b03085a 100644 --- a/lib/common/widgets/basic_drawer.dart +++ b/lib/common/widgets/basic_drawer.dart @@ -37,7 +37,7 @@ class _BasicDrawerState extends State { style: TextStyle(color: Colors.black, fontSize: 20.0), ), onTap: () { - debugPrint('$token'); +// debugPrint('$token'); Navigator.of(context).pushNamed('/ReceiptPage'); }, // enabled: token != null && token.isNotEmpty, diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 2d377a9..b653bc5 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -19,8 +19,8 @@ class LoginPage extends StatefulWidget { } class LoginPageState extends State { - final TextEditingController _emailController = TextEditingController(text: 'test@example.com'); // remove - final TextEditingController _passwordController = TextEditingController(text: 'abc123'); // remove + final TextEditingController _emailController = TextEditingController(/*text: 'test@example.com'*/); // remove + final TextEditingController _passwordController = TextEditingController(/*text: 'abc123'*/); // remove bool _saveLoginDetails = true; // I am extremely sorry for the placement of this variable // it will be fixed soon I promise @@ -44,6 +44,8 @@ class LoginPageState extends State { _saveCurrentRoute("/LoginPage"); focusNode = FocusNode(); + + _fillLoginDetails(); } @override @@ -52,13 +54,35 @@ class LoginPageState extends State { super.dispose(); } + _fillLoginDetails() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + + var username = await preferences.get('username'); + var password = await preferences.get('password'); + + _emailController.text = await username; + _passwordController.text = await password; + } + _saveCurrentRoute(String lastRoute) async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('LastPageRoute', lastRoute); } - void login(String username, String password) { + login(String username, String password) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); + SharedPreferences preferences = await SharedPreferences.getInstance(); + + if (_saveLoginDetails) { + await preferences.setString('username', username); + await preferences.setString('password', password); + print("details saved"); + } else { + await preferences.setString('username', ""); + await preferences.setString('password', ""); + print("details cleared"); + } + requestLoginAPI(context, username, password); } @@ -174,7 +198,7 @@ class LoginPageState extends State { gradient: new LinearGradient( colors: [ Colors.blue[300], - Colors.blue[600], + Colors.blue[500], ], stops: [0,1], begin: Alignment.topLeft, diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index ccfd83e..fb56640 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -106,7 +106,7 @@ class ReceiptPageState extends State { // setting up 'receipt' receipt.amount = amount; receipt.time = formatDate(time); - debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); +// debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); receipt.organisationName = organisation.name; receipt.street = organisation.streetName; receipt.town = organisation.town; From 13533727433e3f17e40f1e3e918df5df144fa54b Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 12:14:47 +0100 Subject: [PATCH 037/122] nothing more to do..? i believe that the app is finished. ta-da! --- lib/pages/receipt_page.dart | 59 +++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index fb56640..86b173c 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -75,42 +75,62 @@ class ReceiptPageState extends State { void submitReceipt(String amount, String time, Organisation organisation) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); - if (demonstration) - { + if (amount == "" || time == "" || organisation == null) { await showDialog( context: context, builder: (BuildContext context) { // return object of type Dialog return AlertDialog( - title: new Text("Success"), - content: new Text("Receipt successfully submitted."), + title: new Text("Invalid data"), + content: new Text( + "We couldn't process your request because one or more required fields are missing."), actions: [ - // usually buttons at the bottom of the dialog new FlatButton( child: new Text("OK"), onPressed: () { Navigator.of(context).pop(); - Navigator.of(context).pushReplacementNamed('/HomePage'); - //TODO: Reset form after dialog exit }, ), ], ); }, - ).then((_) { - }); + ); } else { - Receipt receipt = new Receipt(); + if (demonstration) { + await showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Success"), + content: new Text("Receipt successfully submitted."), + actions: [ + // usually buttons at the bottom of the dialog + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushReplacementNamed('/HomePage'); + }, + ), + ], + ); + }, + ).then((_) {}); + } - // setting up 'receipt' - receipt.amount = amount; - receipt.time = formatDate(time); + else { + Receipt receipt = new Receipt(); + + // setting up 'receipt' + receipt.amount = amount; + receipt.time = formatDate(time); // debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); - receipt.organisationName = organisation.name; - receipt.street = organisation.streetName; - receipt.town = organisation.town; - receipt.postcode = organisation.postcode; + receipt.organisationName = organisation.name; + receipt.street = organisation.streetName; + receipt.town = organisation.town; + receipt.postcode = organisation.postcode; // receipt.essential = convertBoolToString(toConvert) @@ -119,8 +139,9 @@ class ReceiptPageState extends State { // receipt.category = category; // receipt.etc = etc; - submitReceiptAPI(context, receipt); - Navigator.of(context).pushReplacementNamed('/HomePage'); + submitReceiptAPI(context, receipt); + Navigator.of(context).pushReplacementNamed('/HomePage'); + } } } From a088f2b4e0ebfa1538edf390a5037f6843991151 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 12:14:47 +0100 Subject: [PATCH 038/122] nothing more to do..? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit i believe that the app is finished. ta-da! Edit: actually ‘categories’ needs to be added --- lib/pages/receipt_page.dart | 59 +++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index fb56640..86b173c 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -75,42 +75,62 @@ class ReceiptPageState extends State { void submitReceipt(String amount, String time, Organisation organisation) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); - if (demonstration) - { + if (amount == "" || time == "" || organisation == null) { await showDialog( context: context, builder: (BuildContext context) { // return object of type Dialog return AlertDialog( - title: new Text("Success"), - content: new Text("Receipt successfully submitted."), + title: new Text("Invalid data"), + content: new Text( + "We couldn't process your request because one or more required fields are missing."), actions: [ - // usually buttons at the bottom of the dialog new FlatButton( child: new Text("OK"), onPressed: () { Navigator.of(context).pop(); - Navigator.of(context).pushReplacementNamed('/HomePage'); - //TODO: Reset form after dialog exit }, ), ], ); }, - ).then((_) { - }); + ); } else { - Receipt receipt = new Receipt(); + if (demonstration) { + await showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Success"), + content: new Text("Receipt successfully submitted."), + actions: [ + // usually buttons at the bottom of the dialog + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushReplacementNamed('/HomePage'); + }, + ), + ], + ); + }, + ).then((_) {}); + } - // setting up 'receipt' - receipt.amount = amount; - receipt.time = formatDate(time); + else { + Receipt receipt = new Receipt(); + + // setting up 'receipt' + receipt.amount = amount; + receipt.time = formatDate(time); // debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); - receipt.organisationName = organisation.name; - receipt.street = organisation.streetName; - receipt.town = organisation.town; - receipt.postcode = organisation.postcode; + receipt.organisationName = organisation.name; + receipt.street = organisation.streetName; + receipt.town = organisation.town; + receipt.postcode = organisation.postcode; // receipt.essential = convertBoolToString(toConvert) @@ -119,8 +139,9 @@ class ReceiptPageState extends State { // receipt.category = category; // receipt.etc = etc; - submitReceiptAPI(context, receipt); - Navigator.of(context).pushReplacementNamed('/HomePage'); + submitReceiptAPI(context, receipt); + Navigator.of(context).pushReplacementNamed('/HomePage'); + } } } From 4ec386019d869a0eeb81ef4b6196803f8c6693f4 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 12:54:55 +0100 Subject: [PATCH 039/122] cleanup, 'recurring' now is submitted too also getting ready to add categories --- .../apifunctions/request_login_api.dart | 3 - .../apifunctions/submit_receipt_api.dart | 3 - lib/common/functions/get_token.dart | 2 +- lib/common/widgets/basic_drawer.dart | 69 -------- lib/main.dart | 3 - lib/pages/about_screen.dart | 138 --------------- lib/pages/login_page.dart | 1 - lib/pages/receipt_page.dart | 163 ++++++++++++------ lib/pages/settings.dart | 2 - 9 files changed, 109 insertions(+), 275 deletions(-) delete mode 100644 lib/common/widgets/basic_drawer.dart delete mode 100644 lib/pages/about_screen.dart diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index c1ac5e3..2361c67 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -6,9 +6,6 @@ import 'package:http/http.dart' as http; import 'package:local_spend/common/functions/save_current_login.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; -import 'package:local_spend/config.dart'; -// debug -import 'package:flutter/foundation.dart'; Future requestLoginAPI( BuildContext context, String email, String password) async { diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index bfbabfc..96570b2 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -6,9 +6,6 @@ import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; -import 'package:local_spend/config.dart'; -// debug -import 'package:flutter/foundation.dart'; class Receipt { var amount = ""; diff --git a/lib/common/functions/get_token.dart b/lib/common/functions/get_token.dart index c502ade..bdf19cf 100644 --- a/lib/common/functions/get_token.dart +++ b/lib/common/functions/get_token.dart @@ -3,6 +3,6 @@ import 'package:shared_preferences/shared_preferences.dart'; getToken() async { SharedPreferences preferences = await SharedPreferences.getInstance(); - String getToken = await preferences.getString("LastToken"); + String getToken = preferences.getString("LastToken"); return getToken; } diff --git a/lib/common/widgets/basic_drawer.dart b/lib/common/widgets/basic_drawer.dart deleted file mode 100644 index b03085a..0000000 --- a/lib/common/widgets/basic_drawer.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:local_spend/common/apifunctions/request_logout_api.dart'; -import 'package:local_spend/common/functions/get_token.dart'; -import 'package:local_spend/common/functions/logout.dart'; -// debug -import 'package:flutter/foundation.dart'; - -class BasicDrawer extends StatefulWidget { - @override - _BasicDrawerState createState() => _BasicDrawerState(); -} - -class _BasicDrawerState extends State { - var token; - // TODO: add getter with getToken to check logged in - - @override - Widget build(BuildContext context) { - return Drawer( - child: Container( - padding: new EdgeInsets.all(32), - child: ListView( - children: [ - ListTile( - title: Text ( - "Home", - style: TextStyle(color: Colors.black, fontSize: 20.0), - ), - onTap: () { - Navigator.of(context).pushNamed('/HomePage'); - } - ), - ListTile( - title: Text( - "Submit Receipt", - style: TextStyle(color: Colors.black, fontSize: 20.0), - ), - onTap: () { -// debugPrint('$token'); - Navigator.of(context).pushNamed('/ReceiptPage'); - }, - // enabled: token != null && token.isNotEmpty, - ), - ListTile( - title: Text( - "About", - style: TextStyle(color: Colors.black, fontSize: 20.0), - ), - onTap: () { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - Navigator.of(context).pushReplacementNamed('/AboutPage'); - }, - ), - ListTile( - title: Text( - "Logout", - style: TextStyle(color: Colors.black, fontSize: 20.0), - ), - onTap: () { - logout(context); - }, - ), - ], - ), - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index d98746d..9354be8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,9 +3,7 @@ import 'package:local_spend/pages/home_page.dart'; import 'package:local_spend/pages/login_page.dart'; import 'package:local_spend/pages/receipt_page.dart'; import 'package:local_spend/pages/spash_screen.dart'; -import 'package:local_spend/pages/about_screen.dart'; import 'package:local_spend/pages/settings.dart'; -import 'package:local_spend/config.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; void main() { @@ -34,7 +32,6 @@ class MyApp extends StatelessWidget { "/HomePage": (BuildContext context) => HomePage(), "/LoginPage": (BuildContext context) => LoginPage(), "/ReceiptPage": (BuildContext context) => ReceiptPage(), - "/AboutPage": (BuildContext context) => AboutPage(), "/SettingsPage": (BuildContext context) => SettingsPage(), }, home: SplashScreen(), diff --git a/lib/pages/about_screen.dart b/lib/pages/about_screen.dart deleted file mode 100644 index ad64060..0000000 --- a/lib/pages/about_screen.dart +++ /dev/null @@ -1,138 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:local_spend/common/platform/platform_scaffold.dart'; -import 'package:local_spend/common/widgets/basic_drawer.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:flutter_linkify/flutter_linkify.dart'; - -class AboutPage extends StatefulWidget { - @override -// _HomePageState createState() => _HomePageState(); - State createState() { - return new _HomePageState(); - } -} - -class _HomePageState extends State { - @override - void initState() { - super.initState(); - _saveCurrentRoute("/AboutPage"); - } - - @override - void dispose() { - super.dispose(); - } - - _saveCurrentRoute(String lastRoute) async { - SharedPreferences preferences = await SharedPreferences.getInstance(); - await preferences.setString('LastScreenRoute', lastRoute); - } - - @override - Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () { - if (Navigator.canPop(context)) { - Navigator.of(context).pushNamedAndRemoveUntil( - '/HomePage', (Route route) => true); - } else { - Navigator.of(context).pushReplacementNamed('/HomePage'); - } - }, - child: PlatformScaffold( - appBar: AppBar( - title: Text( - "About Page", - style: TextStyle( - fontSize: 20, - color: Colors.black, - ), - ), - leading: BackButton(), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), - ), - body: Container( - padding: EdgeInsets.all(32.0), - child: ListView( - children: [ - InkWell( - child: const Center(child: Text - ('Pear Trading', - style: TextStyle( - fontSize: 20, - color: Colors.blue, - ), - ), - ), - onTap: () => launch('https://app.peartrade.org/#/login?returnUrl=%2Fdashboard') - ), - Padding( - padding: EdgeInsets.fromLTRB(0,20,0,0), - child: Text( - "Pear Trading is a commerce company designed to register and monitor money circulating in the local economy.", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0,20,0,0), - child: Text( - "Email: Test@admin.com", - // TODO: Make this an @email link - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18.0, - color: Colors.blue, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0,20,0,0), - child: Text( - "Phone: +44(0)1524 64544", - // TODO: Make this a @phone link - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18.0, - color: Colors.blue, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0,40,0,0), - child: Text( - "Developed by Shadowcat Industries", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 20.0, - color: Colors.black, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0,20,0,0), - child: InkWell( - child: const Center(child: Text - ('Shadowcat', - style: TextStyle( - fontSize: 20, - color: Colors.blue, - ), - ), - ), - onTap: () => launch('https://shadow.cat/') - ), - ), - ], - ), - ), - ), - ); - } -} \ No newline at end of file diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index b653bc5..74f7b95 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/request_login_api.dart'; diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 86b173c..94bbfd9 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -5,15 +5,12 @@ import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; -import 'package:local_spend/common/widgets/basic_drawer.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:intl/intl.dart'; -import 'package:local_spend/pages/settings.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; import 'package:local_spend/common/widgets/popupListView.dart'; -import 'package:local_spend/common/widgets/labeled_checkbox.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -29,8 +26,8 @@ class ReceiptPageState extends State { final TextEditingController _timeController = TextEditingController(); final TextEditingController _amountController = TextEditingController(); final TextEditingController _essentialController = TextEditingController(); - final TextEditingController _recurringController = TextEditingController(text: "None"); - final TextEditingController _typeController = TextEditingController(); + final TextEditingController _recurringController = TextEditingController(); + final TextEditingController _categoryController = TextEditingController(); final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); @@ -56,6 +53,8 @@ class ReceiptPageState extends State { _saveCurrentRoute("/ReceiptPageState"); focusNode = FocusNode(); + + _recurringController.text = "None"; } @override @@ -72,18 +71,19 @@ class ReceiptPageState extends State { // this file is getting really messy sorry everyone - void submitReceipt(String amount, String time, Organisation organisation) async { + void submitReceipt(String amount, String time, Organisation organisation, String recurring) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); - if (amount == "" || time == "" || organisation == null) { - await showDialog( + if (organisation == null) { + _findOrganizationsDialog(context); +/* await showDialog( context: context, builder: (BuildContext context) { // return object of type Dialog return AlertDialog( - title: new Text("Invalid data"), + title: new Text("Missing organisation"), content: new Text( - "We couldn't process your request because one or more required fields are missing."), + "Please press 'Find' to select your desired organization."), actions: [ new FlatButton( child: new Text("OK"), @@ -94,53 +94,77 @@ class ReceiptPageState extends State { ], ); }, - ); + );*/ } else { - if (demonstration) { + if (amount == "" || time == "") { await showDialog( context: context, builder: (BuildContext context) { // return object of type Dialog return AlertDialog( - title: new Text("Success"), - content: new Text("Receipt successfully submitted."), + title: new Text("Missing required data"), + content: new Text( + "We couldn't process your request because one or more required fields are missing."), actions: [ - // usually buttons at the bottom of the dialog new FlatButton( child: new Text("OK"), onPressed: () { Navigator.of(context).pop(); - Navigator.of(context).pushReplacementNamed('/HomePage'); }, ), ], ); }, - ).then((_) {}); + ); } - else { - Receipt receipt = new Receipt(); + if (demonstration) { + await showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Success"), + content: new Text("Receipt successfully submitted."), + actions: [ + // usually buttons at the bottom of the dialog + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + Navigator.of(context).pushReplacementNamed("/HomePage"); + }, + ), + ], + ); + }, + ).then((_) {}); + } - // setting up 'receipt' - receipt.amount = amount; - receipt.time = formatDate(time); -// debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); - receipt.organisationName = organisation.name; - receipt.street = organisation.streetName; - receipt.town = organisation.town; - receipt.postcode = organisation.postcode; + else { + Receipt receipt = new Receipt(); -// receipt.essential = convertBoolToString(toConvert) + // setting up 'receipt' + receipt.amount = amount; + receipt.time = formatDate(time); + // debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); + receipt.organisationName = organisation.name; + receipt.street = organisation.streetName; + receipt.town = organisation.town; + receipt.postcode = organisation.postcode; + receipt.recurring = recurring; -// TODO: Categories + // receipt.essential = convertBoolToString(toConvert) -// receipt.category = category; -// receipt.etc = etc; + // TODO: Categories - submitReceiptAPI(context, receipt); - Navigator.of(context).pushReplacementNamed('/HomePage'); + // receipt.category = category; + // receipt.etc = etc; + + submitReceiptAPI(context, receipt); + Navigator.of(context).pushReplacementNamed("/HomePage"); + } } } } @@ -226,6 +250,29 @@ class ReceiptPageState extends State { //can't return value as it is and thus would block } + _findOrganizationsDialog(context) { + if (_orgController.text != "") { + var organisations = findOrganisations( + _orgController.text); // returns Future> + + var choice = organisations.then((data) => + listOrganisations(data, context)); + + choice.then((value) => _orgController.text = value.name); + choice.then((value) => _organizationController.organisation = value); + + } else { + // no data entered + + showDialogSingleButton( + context, + "No data", + "We were unable to service your request because no data was entered.", + "OK" + ); + } + } + @override Widget build(BuildContext context) { return WillPopScope( @@ -336,26 +383,7 @@ class ReceiptPageState extends State { padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints child: FlatButton( onPressed: () { - if (_orgController.text != "") { - var organisations = findOrganisations( - _orgController.text); // returns Future> - - var choice = organisations.then((data) => - listOrganisations(data, context)); - - choice.then((value) => _orgController.text = value.name); - choice.then((value) => _organizationController.organisation = value); - - } else { - // no data entered - - showDialogSingleButton( - context, - "No data", - "We were unable to service your request because no data was entered.", - "OK" - ); - } + _findOrganizationsDialog(context); }, child: Text("Find", style: TextStyle(color: Colors.blue, fontSize: 18.0) @@ -386,7 +414,7 @@ class ReceiptPageState extends State { ), onSubmitted: (_) { submitReceipt(_amountController.text, - _timeController.text, _organizationController.organisation); + _timeController.text, _organizationController.organisation, _recurringController.text); // TODO: make sure organisation is valid // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry }, @@ -484,7 +512,32 @@ class ReceiptPageState extends State { height: 65.0, child: RaisedButton( onPressed: () { - submitReceipt(_amountController.text, _timeController.text, _organizationController.organisation); + try { + submitReceipt( + _amountController.text, _timeController.text, + _organizationController.organisation, _recurringController.text); + } + catch (_) { + showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Invalid data"), + content: new Text( + "We couldn't process your request because some of the data entered is invalid."), + actions: [ + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } }, child: Text("GO", style: diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 163761c..ebdc4b2 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; @@ -7,7 +6,6 @@ import 'package:local_spend/common/functions/logout.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:local_spend/common/functions/customAbout.dart' as custom; import 'package:local_spend/common/functions/showDialogTwoButtons.dart'; -import 'package:local_spend/common/functions/feedback.dart'; const URL = "https://flutter.io/"; const demonstration = false; From c5cf66a2107c436c3399477fb038a21ffd246d67 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 15:12:16 +0100 Subject: [PATCH 040/122] Changed navigation a bit, added 'stats' section sections are easy to add and remove --- lib/main.dart | 4 +- lib/pages/home_page.dart | 10 +++- lib/pages/{settings.dart => more_page.dart} | 8 +-- lib/pages/receipt_page.dart | 10 ++-- lib/pages/stats_page.dart | 66 +++++++++++++++++++++ pubspec.lock | 10 ++-- 6 files changed, 91 insertions(+), 17 deletions(-) rename lib/pages/{settings.dart => more_page.dart} (96%) create mode 100644 lib/pages/stats_page.dart diff --git a/lib/main.dart b/lib/main.dart index 9354be8..a4a84be 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,7 @@ import 'package:local_spend/pages/home_page.dart'; import 'package:local_spend/pages/login_page.dart'; import 'package:local_spend/pages/receipt_page.dart'; import 'package:local_spend/pages/spash_screen.dart'; -import 'package:local_spend/pages/settings.dart'; +import 'package:local_spend/pages/more_page.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; void main() { @@ -32,7 +32,7 @@ class MyApp extends StatelessWidget { "/HomePage": (BuildContext context) => HomePage(), "/LoginPage": (BuildContext context) => LoginPage(), "/ReceiptPage": (BuildContext context) => ReceiptPage(), - "/SettingsPage": (BuildContext context) => SettingsPage(), + "/MorePage": (BuildContext context) => MorePage(), }, home: SplashScreen(), ); diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index d3547f4..bad8709 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:local_spend/pages/receipt_page.dart'; -import 'package:local_spend/pages/settings.dart'; +import 'package:local_spend/pages/more_page.dart'; +import 'package:local_spend/pages/stats_page.dart'; class HomePage extends StatelessWidget { static String _title = 'Text here'; @@ -27,7 +28,8 @@ class _HomePageState extends State { TextStyle(fontSize: 30, fontWeight: FontWeight.bold); static List _widgetOptions = [ ReceiptPage(), - SettingsPage() + StatsPage(), + MorePage() ]; void _onItemTapped(int index) { @@ -48,6 +50,10 @@ class _HomePageState extends State { icon: Icon(Icons.receipt), title: Text('Submit Receipt'), ), + BottomNavigationBarItem( + icon: Icon(Icons.show_chart), + title: Text('Statistics'), + ), BottomNavigationBarItem( icon: Icon(Icons.more_horiz), title: Text('More'), diff --git a/lib/pages/settings.dart b/lib/pages/more_page.dart similarity index 96% rename from lib/pages/settings.dart rename to lib/pages/more_page.dart index ebdc4b2..21814de 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/more_page.dart @@ -10,14 +10,14 @@ import 'package:local_spend/common/functions/showDialogTwoButtons.dart'; const URL = "https://flutter.io/"; const demonstration = false; -class SettingsPage extends StatefulWidget { +class MorePage extends StatefulWidget { @override State createState() { - return new SettingsPageState(); + return new MorePageState(); } } -class SettingsPageState extends State { +class MorePageState extends State { FocusNode focusNode; // added so focus can move automatically DateTime date; @@ -25,7 +25,7 @@ class SettingsPageState extends State { @override void initState() { super.initState(); - _saveCurrentRoute("/SettingsPageState"); + _saveCurrentRoute("/MorePageState"); focusNode = FocusNode(); } diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 94bbfd9..0c5e381 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -31,7 +31,7 @@ class ReceiptPageState extends State { final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); - FocusNode focusNode; // added so focus can move automatically + FocusNode focusNode; DateTime date; @@ -55,6 +55,7 @@ class ReceiptPageState extends State { focusNode = FocusNode(); _recurringController.text = "None"; + _categoryController.text = ""; } @override @@ -71,7 +72,7 @@ class ReceiptPageState extends State { // this file is getting really messy sorry everyone - void submitReceipt(String amount, String time, Organisation organisation, String recurring) async { + void submitReceipt(String amount, String time, Organisation organisation, String recurring, String category) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); if (organisation == null) { @@ -154,6 +155,7 @@ class ReceiptPageState extends State { receipt.town = organisation.town; receipt.postcode = organisation.postcode; receipt.recurring = recurring; + receipt.category = category; // receipt.essential = convertBoolToString(toConvert) @@ -414,7 +416,7 @@ class ReceiptPageState extends State { ), onSubmitted: (_) { submitReceipt(_amountController.text, - _timeController.text, _organizationController.organisation, _recurringController.text); + _timeController.text, _organizationController.organisation, _recurringController.text, _categoryController.text); // TODO: make sure organisation is valid // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry }, @@ -515,7 +517,7 @@ class ReceiptPageState extends State { try { submitReceipt( _amountController.text, _timeController.text, - _organizationController.organisation, _recurringController.text); + _organizationController.organisation, _recurringController.text, _categoryController.text); } catch (_) { showDialog( diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart new file mode 100644 index 0000000..adcbdb4 --- /dev/null +++ b/lib/pages/stats_page.dart @@ -0,0 +1,66 @@ + +import 'package:flutter/material.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:local_spend/common/functions/logout.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:local_spend/common/functions/customAbout.dart' as custom; +import 'package:local_spend/common/functions/showDialogTwoButtons.dart'; + +const URL = "https://flutter.io/"; +const demonstration = false; + +class StatsPage extends StatefulWidget { + @override + State createState() { + return new StatsPageState(); + } +} + +class StatsPageState extends State { + + @override + void initState() { + super.initState(); + _saveCurrentRoute("/StatsPageState"); + } + + @override + void dispose() { + super.dispose(); + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastPageRoute', lastRoute); + } + + @override + Widget build(BuildContext context) { + return PlatformScaffold( + appBar: AppBar( + backgroundColor: Colors.blue[400], + title: Text( + "Statistics", + style: TextStyle( + fontSize: 20, + color: Colors.white, + ), + ), +// leading: BackButton(), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), + + body: Container( + padding: EdgeInsets.fromLTRB(0, 15, 0, 0), + child: Column( + children: [ + // some graphs and charts here etc + Center(child : Text("(imagine this is a really cool graph!)"),) + ], + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index a1721f3..b229dc3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,5 +1,5 @@ # Generated by pub -# See https://www.dartlang.org/tools/pub/glossary#lockfile +# See https://dart.dev/tools/pub/glossary#lockfile packages: analyzer: dependency: transitive @@ -21,7 +21,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" boolean_selector: dependency: transitive description: @@ -330,7 +330,7 @@ packages: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.7.0" pool: dependency: transitive description: @@ -358,7 +358,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.3" shared_preferences: dependency: "direct main" description: @@ -440,7 +440,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.4" + version: "0.2.5" timing: dependency: transitive description: From adae182b1a658a97e50d4fa32ddf89c63b1907e2 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 16 Jul 2019 16:55:00 +0100 Subject: [PATCH 041/122] preparing for 'categories' --- lib/common/apifunctions/categories.dart | 78 ++++ lib/pages/receipt_page.dart | 495 +++++++++++++----------- 2 files changed, 353 insertions(+), 220 deletions(-) create mode 100644 lib/common/apifunctions/categories.dart diff --git a/lib/common/apifunctions/categories.dart b/lib/common/apifunctions/categories.dart new file mode 100644 index 0000000..6f3f590 --- /dev/null +++ b/lib/common/apifunctions/categories.dart @@ -0,0 +1,78 @@ +import 'dart:convert'; +import 'dart:async'; +import 'package:http/http.dart' as http; +import 'package:local_spend/common/functions/get_token.dart'; + +class Category { + String name; + String index; + + Category({ + this.name, + this.index, + }); +} + +Future> getCategories() async { + const url = "https://dev.peartrade.org/api/search/category"; + var token; + + await getToken().then((result) { + token = result; + }); + + Map body = { + "session_key":token, + }; + + final response = await http.post ( + url, + body: json.encode(body), + ); + +// print(response.body); + + if (response.statusCode == 200) { + //request successful + List categories = new List(); + Map responseMap = json.decode(response.body); + + var categoriesJSON = responseMap['categories']; + + //nice. + // so the response needs to be decoded iteratively, like + // categories.add(new Category(name: categoriesJSON[i.toString()], index: i.toString())); + +// print(categoriesJSON['11']); // prints "Banana" + + int i = 1; // starts on 1. that was annoying to debug! + while (true) { + + if (categoriesJSON[i.toString()] != null) { +// print("Iteration " + i.toString()); +// print(categoriesJSON[i.toString()]); + categories.add(new Category( + name: categoriesJSON[i.toString()], index: i.toString())); +// print(categories.last); + i++; + } else { +// print("Number of categories: " + (i - 1).toString()); +// print("categoriesJSON[" + i.toString() + ".toString()] == null"); + break; + } + } // does this until error, which then tells it that there is no more JSON left + +// print(categories[11].name); + +// decodedResponse.forEach((key, value) { +//// print(key + ": " + value); +// categories.add(new Category(name: value, index: key)); +// }); + +// print(categories[10].name.toString()); // prints "Banana" + return categories; + } else { + // not successful + return null; + } +} \ No newline at end of file diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 0c5e381..d9c62b8 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -11,6 +11,7 @@ import 'package:intl/intl.dart'; import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; import 'package:local_spend/common/widgets/popupListView.dart'; +import 'package:local_spend/common/apifunctions/categories.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -30,6 +31,7 @@ class ReceiptPageState extends State { final TextEditingController _categoryController = TextEditingController(); final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); + List _categoryDropDownItems = List(); FocusNode focusNode; @@ -49,6 +51,10 @@ class ReceiptPageState extends State { @override void initState() { + getCategoriesStrings().then((value) { + _categoryDropDownItems = value; + }); + super.initState(); _saveCurrentRoute("/ReceiptPageState"); @@ -56,6 +62,9 @@ class ReceiptPageState extends State { _recurringController.text = "None"; _categoryController.text = ""; +// getCategoriesStrings().then((value) { +// _categoryDropDownItems = value; +// }); } @override @@ -72,7 +81,7 @@ class ReceiptPageState extends State { // this file is getting really messy sorry everyone - void submitReceipt(String amount, String time, Organisation organisation, String recurring, String category) async { + void submitReceipt(String amount, String time, Organisation organisation, String recurring, String category, String essential) async { SystemChannels.textInput.invokeMethod('TextInput.hide'); if (organisation == null) { @@ -157,12 +166,7 @@ class ReceiptPageState extends State { receipt.recurring = recurring; receipt.category = category; - // receipt.essential = convertBoolToString(toConvert) - - // TODO: Categories - - // receipt.category = category; - // receipt.etc = etc; + receipt.essential = essential; submitReceiptAPI(context, receipt); Navigator.of(context).pushReplacementNamed("/HomePage"); @@ -180,7 +184,25 @@ class ReceiptPageState extends State { return "false"; } - List getOptions() { + Future> getCategoriesStrings() async { + var categories = getCategories(); //future> + var categoriesStrings = List(); + + categories.then((val) { + val.forEach((thisCategory) { +// print(thisCategory.name); + categoriesStrings.add(thisCategory.name); + }); + +// print(categoriesStrings[10]); // prints 'Banana' +// print(categoriesStrings.toString()); + + _categoryDropDownItems = categoriesStrings; + return categoriesStrings; + }); + } + + List getRecurringOptions() { var options = new List(7); options[0] = "None"; options[1] = "Daily"; @@ -277,279 +299,312 @@ class ReceiptPageState extends State { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () { - if (Navigator.canPop(context)) { - Navigator.of(context).pushNamedAndRemoveUntil( - '/LoginPage', (Route route) => false); - } else { - Navigator.of(context).pushReplacementNamed('/LoginPage'); - } - }, - child: PlatformScaffold( + return PlatformScaffold( - appBar: AppBar( - backgroundColor: Colors.blue[400], - title: Text( - "Submit Receipt", - style: TextStyle( - fontSize: 20, - color: Colors.white, - ), + appBar: AppBar( + backgroundColor: Colors.blue[400], + title: Text( + "Submit Receipt", + style: TextStyle( + fontSize: 20, + color: Colors.white, ), -// leading: BackButton(), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), ), +// leading: BackButton(), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), - body: Container( - padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), - child: ListView( - children: [ - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child : Text( - "Time of Transaction", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), + body: Container( + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: ListView( + children: [ + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + child : Text( + "Time of Transaction", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, ), ), - DateTimePickerFormField( - inputType: InputType.both, - format: DateFormat("dd/MM/yyyy 'at' hh:mm"), - editable: true, - controller: _timeController, + ), + DateTimePickerFormField( + inputType: InputType.both, + format: DateFormat("dd/MM/yyyy 'at' hh:mm"), + editable: true, + controller: _timeController, + decoration: InputDecoration( + labelText: 'Date/Time of Transaction', hasFloatingPlaceholder: false), + onChanged: (dt) => setState(() => date = dt), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + child: Text( + "Amount", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _amountController, decoration: InputDecoration( - labelText: 'Date/Time of Transaction', hasFloatingPlaceholder: false), - onChanged: (dt) => setState(() => date = dt), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child: Text( - "Amount", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), + hintText: 'Value in £', ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _amountController, - decoration: InputDecoration( - hintText: 'Value in £', - ), // obscureText: true, - autocorrect: false, - keyboardType: TextInputType.number, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - FocusScope.of(context).requestFocus(focusNode); + autocorrect: false, + keyboardType: TextInputType.number, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + FocusScope.of(context).requestFocus(focusNode); // submitReceipt(_amountController.text, _timeController.text); - }, - ), + }, ), + ), - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child : Container ( - height: 22, // this should be the same height as text + child : Container ( + height: 22, // this should be the same height as text - child : ListView( - scrollDirection: Axis.horizontal, - children: [ + child : ListView( + scrollDirection: Axis.horizontal, + children: [ - Container( - child: Text( - "Organization Name", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), + Container( + child: Text( + "Organization Name", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.bold, ), ), + ), - Container( - child : Padding( - padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints - child: FlatButton( - onPressed: () { - _findOrganizationsDialog(context); - }, - child: Text("Find", - style: TextStyle(color: Colors.blue, fontSize: 18.0) - ), - ), - ), - ) + Container( + child : Padding( + padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints + child: FlatButton( + onPressed: () { + _findOrganizationsDialog(context); + }, + child: Text("Find", + style: TextStyle(color: Colors.blue, fontSize: 18.0) + ), + ), + ), + ) - ], - ), + ], ), ), + ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _orgController, - focusNode: focusNode, - decoration: InputDecoration( - hintText: 'Eg. Pear Trading', - ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), + child: TextField( + controller: _orgController, + focusNode: focusNode, + decoration: InputDecoration( + hintText: 'Eg. Pear Trading', + ), // obscureText: true, - autocorrect: true, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - submitReceipt(_amountController.text, - _timeController.text, _organizationController.organisation, _recurringController.text, _categoryController.text); - // TODO: make sure organisation is valid - // TODO: Add 'find organisation' button which displays a dialog to, well, find the organisation's address or manual entry - }, + autocorrect: true, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, ), + onSubmitted: (_) { + submitReceipt(_amountController.text, + _timeController.text, _organizationController.organisation, _recurringController.text, _categoryController.text, _essentialController.text); + }, ), + ), - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + Padding( + padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child : Container ( - height: 18, + child : Container ( + height: 18, - child : ListView( - scrollDirection: Axis.horizontal, + child : ListView( + scrollDirection: Axis.horizontal, - children: [ - Container( - child: Text( - "Essential", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - ), + children: [ + Container( + child: Text( + "Essential", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, ), ), + ), - Container( - child : Padding( - padding: EdgeInsets.fromLTRB(20.0, 0.0, 0, 0), + Container( + child : Padding( + padding: EdgeInsets.fromLTRB(20.0, 0.0, 0, 0), - child: Checkbox(value: - _essentialController.text.toLowerCase() == 'true', - onChanged: (bool newValue) { - setState(() { - _essentialController.text = - convertBoolToString(newValue); - }); - }), - ), + child: Checkbox(value: + _essentialController.text.toLowerCase() == 'true', + onChanged: (bool newValue) { + setState(() { + _essentialController.text = + convertBoolToString(newValue); + }); + }), ), + ), - ], - ), + ], ), ), + ), - Padding( - padding: EdgeInsets.fromLTRB(0.0,18,0.0,0.0), + Padding( + padding: EdgeInsets.fromLTRB(0.0,18,0.0,0.0), - child : Container ( - height: 35, + child : Container ( + height: 35, // width: 400, - child : ListView( - scrollDirection: Axis.horizontal, + child : ListView( + scrollDirection: Axis.horizontal, - children: [ - Container( - padding: const EdgeInsets.fromLTRB(0, 7, 0, 8), - child: Text( - "Recurring", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - ), + children: [ + Container( + padding: const EdgeInsets.fromLTRB(0, 7, 0, 8), + child: Text( + "Recurring", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, ), ), + ), - Container( + Container( + padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), + child: DropdownButton( + value: _recurringController.text, + onChanged: (String newValue) { + setState(() { + _recurringController.text = newValue; + }); + }, + items: getRecurringOptions().map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }) + .toList(), + ) + ), + ], + ), + ), + ), + + + Padding( + padding: EdgeInsets.fromLTRB(0.0,18,0.0,0.0), + + child : Container ( + height: 35, +// width: 400, + + child : ListView( + scrollDirection: Axis.horizontal, + + children: [ + Container( + padding: const EdgeInsets.fromLTRB(0, 7, 0, 8), + child: Text( + "Category", + style: TextStyle( + fontSize: 18.0, + color: Colors.black, + ), + ), + ), + + Container( padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), child: DropdownButton( - value: _recurringController.text, + value: _categoryController.text, onChanged: (String newValue) { setState(() { - _recurringController.text = newValue; + _categoryController.text = newValue; }); }, - items: getOptions().map>((String value) { + items: _categoryDropDownItems.map>((String value) { return DropdownMenuItem( value: value, child: Text(value), ); - }) - .toList(), + }).toList(), ) - ), - ], - ), + ), + ], ), ), + ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 0.0), - child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - try { - submitReceipt( - _amountController.text, _timeController.text, - _organizationController.organisation, _recurringController.text, _categoryController.text); - } - catch (_) { - showDialog( - context: context, - builder: (BuildContext context) { - // return object of type Dialog - return AlertDialog( - title: new Text("Invalid data"), - content: new Text( - "We couldn't process your request because some of the data entered is invalid."), - actions: [ - new FlatButton( - child: new Text("OK"), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - }, - child: Text("GO", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), - color: Colors.blue, - ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + try { + submitReceipt( + _amountController.text, _timeController.text, + _organizationController.organisation, _recurringController.text, _categoryController.text, _essentialController.text); + } + catch (_) { + showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Invalid data"), + content: new Text( + "We couldn't process your request because some of the data entered is invalid."), + actions: [ + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + }, + child: Text("GO", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.blue, ), ), - ], - ), + ), + ], ), ), ); From 4ab078c45e19f58d0375c99ed185668aed464764 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 17 Jul 2019 12:31:28 +0100 Subject: [PATCH 042/122] Statistics/graphs section implemented Only using sample data atm --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/widgets/charts/auto_label.dart | 74 ++++++++ lib/common/widgets/charts/donut_chart.dart | 56 ++++++ .../widgets/charts/grouped_bar_chart.dart | 81 ++++++++ .../charts/numeric_line_bar_combo.dart | 95 ++++++++++ lib/common/widgets/charts/outside_label.dart | 69 +++++++ .../charts/scatter_bucketingAxis_legend.dart | 136 ++++++++++++++ .../charts/series_legend_with_measures.dart | 129 +++++++++++++ lib/pages/receipt_page.dart | 2 +- lib/pages/stats_page.dart | 175 +++++++++++++++++- pubspec.lock | 14 ++ pubspec.yaml | 2 +- 13 files changed, 829 insertions(+), 10 deletions(-) create mode 100644 lib/common/widgets/charts/auto_label.dart create mode 100644 lib/common/widgets/charts/donut_chart.dart create mode 100644 lib/common/widgets/charts/grouped_bar_chart.dart create mode 100644 lib/common/widgets/charts/numeric_line_bar_combo.dart create mode 100644 lib/common/widgets/charts/outside_label.dart create mode 100644 lib/common/widgets/charts/scatter_bucketingAxis_legend.dart create mode 100644 lib/common/widgets/charts/series_legend_with_measures.dart diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f5bffe1..81f2036 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a83a4d3..dff0209 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/widgets/charts/auto_label.dart b/lib/common/widgets/charts/auto_label.dart new file mode 100644 index 0000000..96f7209 --- /dev/null +++ b/lib/common/widgets/charts/auto_label.dart @@ -0,0 +1,74 @@ +/// Donut chart with labels example. This is a simple pie chart with a hole in +/// the middle. +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:flutter/material.dart'; + +class DonutAutoLabelChart extends StatelessWidget { + final List seriesList; + final bool animate; + + DonutAutoLabelChart(this.seriesList, {this.animate}); + + /// Creates a [PieChart] with sample data and no transition. + factory DonutAutoLabelChart.withSampleData() { + return new DonutAutoLabelChart( + _createSampleData(), + // Disable animations for image tests. + animate: true, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.PieChart(seriesList, + animate: animate, + // Configure the width of the pie slices to 60px. The remaining space in + // the chart will be left as a hole in the center. + // + // [ArcLabelDecorator] will automatically position the label inside the + // arc if the label will fit. If the label will not fit, it will draw + // outside of the arc with a leader line. Labels can always display + // inside or outside using [LabelPosition]. + // + // Text style for inside / outside can be controlled independently by + // setting [insideLabelStyleSpec] and [outsideLabelStyleSpec]. + // + // Example configuring different styles for inside/outside: + // new charts.ArcLabelDecorator( + // insideLabelStyleSpec: new charts.TextStyleSpec(...), + // outsideLabelStyleSpec: new charts.TextStyleSpec(...)), + defaultRenderer: new charts.ArcRendererConfig( + arcWidth: 60, + arcRendererDecorators: [new charts.ArcLabelDecorator()])); + } + + /// Create one series with sample hard coded data. + static List> _createSampleData() { + final data = [ + new LinearSales("Other", 17), + new LinearSales("Mars", 26), + new LinearSales("Morecambe", 35), + new LinearSales("Lancaster", 48), + ]; + + return [ + new charts.Series( + id: 'Sales', + domainFn: (LinearSales sales, _) => sales.key, + measureFn: (LinearSales sales, _) => sales.sales, + data: data, + // Set a label accessor to control the text of the arc label. + labelAccessorFn: (LinearSales row, _) => '${row.key}: ${row.sales}', + ) + ]; + } +} + +/// Sample linear data type. +class LinearSales { + final String key; + final int sales; + + LinearSales(this.key, this.sales); +} \ No newline at end of file diff --git a/lib/common/widgets/charts/donut_chart.dart b/lib/common/widgets/charts/donut_chart.dart new file mode 100644 index 0000000..06feda5 --- /dev/null +++ b/lib/common/widgets/charts/donut_chart.dart @@ -0,0 +1,56 @@ +/// Donut chart example. This is a simple pie chart with a hole in the middle. +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:flutter/material.dart'; + +class DonutPieChart extends StatelessWidget { + final List seriesList; + final bool animate; + + DonutPieChart(this.seriesList, {this.animate}); + + /// Creates a [PieChart] with sample data and no transition. + factory DonutPieChart.withSampleData() { + return new DonutPieChart( + _createSampleData(), + animate: true, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.PieChart(seriesList, + animate: animate, + // Configure the width of the pie slices to 60px. The remaining space in + // the chart will be left as a hole in the center. + defaultRenderer: new charts.ArcRendererConfig(arcWidth: 60)); + } + + /// Create one series with sample hard coded data. + static List> _createSampleData() { + final data = [ + new LinearSales(0, 100), + new LinearSales(1, 75), + new LinearSales(2, 25), + new LinearSales(3, 5), + ]; + + return [ + new charts.Series( + id: 'Sales', + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.sales, + data: data, + ) + ]; + } +} + + +/// Sample linear data type. +class LinearSales { + final int year; + final int sales; + + LinearSales(this.year, this.sales); +} \ No newline at end of file diff --git a/lib/common/widgets/charts/grouped_bar_chart.dart b/lib/common/widgets/charts/grouped_bar_chart.dart new file mode 100644 index 0000000..24554e5 --- /dev/null +++ b/lib/common/widgets/charts/grouped_bar_chart.dart @@ -0,0 +1,81 @@ +/// Bar chart example +import 'package:flutter/material.dart'; +import 'package:charts_flutter/flutter.dart' as charts; + +class GroupedBarChart extends StatelessWidget { + final List seriesList; + final bool animate; + + GroupedBarChart(this.seriesList, {this.animate}); + + factory GroupedBarChart.withSampleData() { + return new GroupedBarChart( + _createSampleData(), + // Disable animations for image tests. + animate: false, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.BarChart( + seriesList, + animate: animate, + barGroupingType: charts.BarGroupingType.grouped, + ); + } + + /// Create series list with multiple series + static List> _createSampleData() { + final desktopSalesData = [ + new OrdinalSales('2014', 5), + new OrdinalSales('2015', 25), + new OrdinalSales('2016', 100), + new OrdinalSales('2017', 75), + ]; + + final tabletSalesData = [ + new OrdinalSales('2014', 25), + new OrdinalSales('2015', 50), + new OrdinalSales('2016', 10), + new OrdinalSales('2017', 20), + ]; + + final mobileSalesData = [ + new OrdinalSales('2014', 10), + new OrdinalSales('2015', 15), + new OrdinalSales('2016', 50), + new OrdinalSales('2017', 45), + ]; + + return [ + new charts.Series( + id: 'Desktop', + domainFn: (OrdinalSales sales, _) => sales.year, + measureFn: (OrdinalSales sales, _) => sales.sales, + data: desktopSalesData, + ), + new charts.Series( + id: 'Tablet', + domainFn: (OrdinalSales sales, _) => sales.year, + measureFn: (OrdinalSales sales, _) => sales.sales, + data: tabletSalesData, + ), + new charts.Series( + id: 'Mobile', + domainFn: (OrdinalSales sales, _) => sales.year, + measureFn: (OrdinalSales sales, _) => sales.sales, + data: mobileSalesData, + ), + ]; + } +} + +/// Sample ordinal data type. +class OrdinalSales { + final String year; + final int sales; + + OrdinalSales(this.year, this.sales); +} \ No newline at end of file diff --git a/lib/common/widgets/charts/numeric_line_bar_combo.dart b/lib/common/widgets/charts/numeric_line_bar_combo.dart new file mode 100644 index 0000000..2f261dd --- /dev/null +++ b/lib/common/widgets/charts/numeric_line_bar_combo.dart @@ -0,0 +1,95 @@ +/// Example of a numeric combo chart with two series rendered as bars, and a +/// third rendered as a line. +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:flutter/material.dart'; + +class NumericComboLineBarChart extends StatelessWidget { + final List seriesList; + final bool animate; + + NumericComboLineBarChart(this.seriesList, {this.animate}); + + /// Creates a [LineChart] with sample data and no transition. + factory NumericComboLineBarChart.withSampleData() { + return new NumericComboLineBarChart( + _createSampleData(), + // Disable animations for image tests. + animate: false, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.NumericComboChart(seriesList, + animate: animate, + // Configure the default renderer as a line renderer. This will be used + // for any series that does not define a rendererIdKey. + defaultRenderer: new charts.LineRendererConfig(), + // Custom renderer configuration for the bar series. + customSeriesRenderers: [ + new charts.BarRendererConfig( + // ID used to link series to this renderer. + customRendererId: 'customBar') + ]); + } + + /// Create one series with sample hard coded data. + static List> _createSampleData() { + final desktopSalesData = [ + new LinearSales(0, 5), + new LinearSales(1, 25), + new LinearSales(2, 100), + new LinearSales(3, 75), + ]; + + final tableSalesData = [ + new LinearSales(0, 5), + new LinearSales(1, 25), + new LinearSales(2, 100), + new LinearSales(3, 75), + ]; + + final mobileSalesData = [ + new LinearSales(0, 10), + new LinearSales(1, 50), + new LinearSales(2, 200), + new LinearSales(3, 150), + ]; + + return [ + new charts.Series( + id: 'Desktop', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.sales, + data: desktopSalesData, + ) + // Configure our custom bar renderer for this series. + ..setAttribute(charts.rendererIdKey, 'customBar'), + new charts.Series( + id: 'Tablet', + colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.sales, + data: tableSalesData, + ) + // Configure our custom bar renderer for this series. + ..setAttribute(charts.rendererIdKey, 'customBar'), + new charts.Series( + id: 'Mobile', + colorFn: (_, __) => charts.MaterialPalette.green.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.sales, + data: mobileSalesData), + ]; + } +} + +/// Sample linear data type. +class LinearSales { + final int year; + final int sales; + + LinearSales(this.year, this.sales); +} \ No newline at end of file diff --git a/lib/common/widgets/charts/outside_label.dart b/lib/common/widgets/charts/outside_label.dart new file mode 100644 index 0000000..ba8bc71 --- /dev/null +++ b/lib/common/widgets/charts/outside_label.dart @@ -0,0 +1,69 @@ +/// Simple pie chart with outside labels example. +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:flutter/material.dart'; + +class PieOutsideLabelChart extends StatelessWidget { + final List seriesList; + final bool animate; + + PieOutsideLabelChart(this.seriesList, {this.animate}); + + /// Creates a [PieChart] with sample data and no transition. + factory PieOutsideLabelChart.withSampleData() { + return new PieOutsideLabelChart( + _createSampleData(), + // Disable animations for image tests. + animate: true, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.PieChart(seriesList, + animate: animate, + // Add an [ArcLabelDecorator] configured to render labels outside of the + // arc with a leader line. + // + // Text style for inside / outside can be controlled independently by + // setting [insideLabelStyleSpec] and [outsideLabelStyleSpec]. + // + // Example configuring different styles for inside/outside: + // new charts.ArcLabelDecorator( + // insideLabelStyleSpec: new charts.TextStyleSpec(...), + // outsideLabelStyleSpec: new charts.TextStyleSpec(...)), + defaultRenderer: new charts.ArcRendererConfig(arcRendererDecorators: [ + new charts.ArcLabelDecorator( + labelPosition: charts.ArcLabelPosition.outside) + ])); + } + + /// Create one series with sample hard coded data. + static List> _createSampleData() { + final data = [ + new LinearSales(0, 23), + new LinearSales(1, 44), + new LinearSales(2, 25), + new LinearSales(3, 15), + ]; + + return [ + new charts.Series( + id: 'Sales', + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.sales, + data: data, + // Set a label accessor to control the text of the arc label. + labelAccessorFn: (LinearSales row, _) => '${row.year}: ${row.sales}', + ) + ]; + } +} + +/// Sample linear data type. +class LinearSales { + final int year; + final int sales; + + LinearSales(this.year, this.sales); +} \ No newline at end of file diff --git a/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart b/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart new file mode 100644 index 0000000..3d7a2ff --- /dev/null +++ b/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart @@ -0,0 +1,136 @@ +/// Example of a scatter plot chart with a bucketing measure axis and a legend. +/// +/// A bucketing measure axis positions all values beneath a certain threshold +/// into a reserved space on the axis range. The label for the bucket line will +/// be drawn in the middle of the bucket range, rather than aligned with the +/// gridline for that value's position on the scale. +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:flutter/material.dart'; + +class BucketingAxisScatterPlotChart extends StatelessWidget { + final List seriesList; + final bool animate; + + BucketingAxisScatterPlotChart(this.seriesList, {this.animate}); + + /// Creates a [ScatterPlotChart] with sample data and no transition. + factory BucketingAxisScatterPlotChart.withSampleData() { + return new BucketingAxisScatterPlotChart( + _createSampleData(), + // Disable animations for image tests. + animate: false, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.ScatterPlotChart(seriesList, + // Set up a bucketing axis that will place all values below 0.1 (10%) + // into a bucket at the bottom of the chart. + // + // Configure a tick count of 3 so that we get 100%, 50%, and the + // threshold. + primaryMeasureAxis: new charts.BucketingAxisSpec( + threshold: 0.1, + tickProviderSpec: new charts.BucketingNumericTickProviderSpec( + desiredTickCount: 3)), + // Add a series legend to display the series names. + behaviors: [ + new charts.SeriesLegend(position: charts.BehaviorPosition.end), + ], + animate: animate); + } + + /// Create one series with sample hard coded data. + static List> _createSampleData() { + final myFakeDesktopData = [ + new LinearSales(52, 0.75, 14.0), + ]; + + final myFakeTabletData = [ + new LinearSales(45, 0.3, 18.0), + ]; + + final myFakeMobileData = [ + new LinearSales(56, 0.8, 17.0), + ]; + + final myFakeChromebookData = [ + new LinearSales(25, 0.6, 13.0), + ]; + + final myFakeHomeData = [ + new LinearSales(34, 0.5, 15.0), + ]; + + final myFakeOtherData = [ + new LinearSales(10, 0.25, 15.0), + new LinearSales(12, 0.075, 14.0), + new LinearSales(13, 0.225, 15.0), + new LinearSales(16, 0.03, 14.0), + new LinearSales(24, 0.04, 13.0), + new LinearSales(37, 0.1, 14.5), + ]; + + return [ + new charts.Series( + id: 'Cheese', + colorFn: (LinearSales sales, _) => + charts.MaterialPalette.blue.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.revenueShare, + radiusPxFn: (LinearSales sales, _) => sales.radius, + data: myFakeDesktopData), + new charts.Series( + id: 'Carrots', + colorFn: (LinearSales sales, _) => + charts.MaterialPalette.red.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.revenueShare, + radiusPxFn: (LinearSales sales, _) => sales.radius, + data: myFakeTabletData), + new charts.Series( + id: 'Cucumbers', + colorFn: (LinearSales sales, _) => + charts.MaterialPalette.green.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.revenueShare, + radiusPxFn: (LinearSales sales, _) => sales.radius, + data: myFakeMobileData), + new charts.Series( + id: 'Crayons', + colorFn: (LinearSales sales, _) => + charts.MaterialPalette.purple.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.revenueShare, + radiusPxFn: (LinearSales sales, _) => sales.radius, + data: myFakeChromebookData), + new charts.Series( + id: 'Celery', + colorFn: (LinearSales sales, _) => + charts.MaterialPalette.indigo.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.revenueShare, + radiusPxFn: (LinearSales sales, _) => sales.radius, + data: myFakeHomeData), + new charts.Series( + id: 'Cauliflower', + colorFn: (LinearSales sales, _) => + charts.MaterialPalette.gray.shadeDefault, + domainFn: (LinearSales sales, _) => sales.year, + measureFn: (LinearSales sales, _) => sales.revenueShare, + radiusPxFn: (LinearSales sales, _) => sales.radius, + data: myFakeOtherData), + ]; + } +} + +/// Sample linear data type. +class LinearSales { + final int year; + final double revenueShare; + final double radius; + + LinearSales(this.year, this.revenueShare, this.radius); +} \ No newline at end of file diff --git a/lib/common/widgets/charts/series_legend_with_measures.dart b/lib/common/widgets/charts/series_legend_with_measures.dart new file mode 100644 index 0000000..76334f8 --- /dev/null +++ b/lib/common/widgets/charts/series_legend_with_measures.dart @@ -0,0 +1,129 @@ +/// Bar chart with example of a legend with customized position, justification, +/// desired max rows, and padding. These options are shown as an example of how +/// to use the customizations, they do not necessary have to be used together in +/// this way. Choosing [end] as the position does not require the justification +/// to also be [endDrawArea]. +import 'package:flutter/material.dart'; +import 'package:charts_flutter/flutter.dart' as charts; + +/// Example that shows how to build a series legend that shows measure values +/// when a datum is selected. +/// +/// Also shows the option to provide a custom measure formatter. +class LegendWithMeasures extends StatelessWidget { + final List seriesList; + final bool animate; + + LegendWithMeasures(this.seriesList, {this.animate}); + + factory LegendWithMeasures.withSampleData() { + return new LegendWithMeasures( + _createSampleData(), + // Disable animations for image tests. + animate: false, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.BarChart( + seriesList, + animate: animate, + barGroupingType: charts.BarGroupingType.grouped, + // Add the legend behavior to the chart to turn on legends. + // This example shows how to optionally show measure and provide a custom + // formatter. + behaviors: [ + new charts.SeriesLegend( + // Positions for "start" and "end" will be left and right respectively + // for widgets with a build context that has directionality ltr. + // For rtl, "start" and "end" will be right and left respectively. + // Since this example has directionality of ltr, the legend is + // positioned on the right side of the chart. + position: charts.BehaviorPosition.end, + // By default, if the position of the chart is on the left or right of + // the chart, [horizontalFirst] is set to false. This means that the + // legend entries will grow as new rows first instead of a new column. + horizontalFirst: false, + // This defines the padding around each legend entry. + cellPadding: new EdgeInsets.only(right: 4.0, bottom: 4.0), + // Set show measures to true to display measures in series legend, + // when the datum is selected. + showMeasures: true, + // Optionally provide a measure formatter to format the measure value. + // If none is specified the value is formatted as a decimal. + measureFormatter: (num value) { + return value == null ? '-' : '${value}k'; + }, + ), + ], + ); + } + + /// Create series list with multiple series + static List> _createSampleData() { + final desktopSalesData = [ + new OrdinalSales('2014', 5), + new OrdinalSales('2015', 25), + new OrdinalSales('2016', 100), + new OrdinalSales('2017', 75), + ]; + + final tabletSalesData = [ + new OrdinalSales('2014', 25), + new OrdinalSales('2015', 50), + // Purposely have a null data for 2016 to show the null value format. + new OrdinalSales('2017', 20), + ]; + + final mobileSalesData = [ + new OrdinalSales('2014', 10), + new OrdinalSales('2015', 15), + new OrdinalSales('2016', 50), + new OrdinalSales('2017', 45), + ]; + + final otherSalesData = [ + new OrdinalSales('2014', 20), + new OrdinalSales('2015', 35), + new OrdinalSales('2016', 15), + new OrdinalSales('2017', 10), + ]; + + return [ + new charts.Series( + id: 'Lancaster', + domainFn: (OrdinalSales sales, _) => sales.year, + measureFn: (OrdinalSales sales, _) => sales.sales, + data: desktopSalesData, + ), + new charts.Series( + id: 'Morecambe', + domainFn: (OrdinalSales sales, _) => sales.year, + measureFn: (OrdinalSales sales, _) => sales.sales, + data: tabletSalesData, + ), + new charts.Series( + id: 'Mars', + domainFn: (OrdinalSales sales, _) => sales.year, + measureFn: (OrdinalSales sales, _) => sales.sales, + data: mobileSalesData, + ), + new charts.Series( + id: 'Other', + domainFn: (OrdinalSales sales, _) => sales.year, + measureFn: (OrdinalSales sales, _) => sales.sales, + data: otherSalesData, + ), + ]; + } +} + +/// Sample ordinal data type. +class OrdinalSales { + final String year; + final int sales; + + OrdinalSales(this.year, this.sales); +} \ No newline at end of file diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index d9c62b8..343072e 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -565,7 +565,7 @@ class ReceiptPageState extends State { ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 0.0), + padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), child: Container( height: 65.0, child: RaisedButton( diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index adcbdb4..aefe483 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -6,6 +5,13 @@ import 'package:local_spend/common/functions/logout.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:local_spend/common/functions/customAbout.dart' as custom; import 'package:local_spend/common/functions/showDialogTwoButtons.dart'; +import 'package:local_spend/common/widgets/charts/donut_chart.dart'; +import 'package:local_spend/common/widgets/charts/outside_label.dart'; +import 'package:local_spend/common/widgets/charts/auto_label.dart'; +import 'package:local_spend/common/widgets/charts/grouped_bar_chart.dart'; +import 'package:local_spend/common/widgets/charts/scatter_bucketingAxis_legend.dart'; +import 'package:local_spend/common/widgets/charts/numeric_line_bar_combo.dart'; +import 'package:local_spend/common/widgets/charts/series_legend_with_measures.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -52,12 +58,171 @@ class StatsPageState extends State { iconTheme: IconThemeData(color: Colors.black), ), - body: Container( - padding: EdgeInsets.fromLTRB(0, 15, 0, 0), - child: Column( + + body : Container( + padding: EdgeInsets.fromLTRB(0, 0, 0, 0), + child: ListView( children: [ // some graphs and charts here etc - Center(child : Text("(imagine this is a really cool graph!)"),) +// Container( +// padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), +// child : Text( +// "Really Cool Chart", +// textAlign: TextAlign.center, +// style: TextStyle( +// fontSize: 22.0, +// color: Colors.black, +// fontWeight: FontWeight.bold, +// ), +// ), +// ), +// +// Container( +// height: 250, +//// width: 250, +// child: new DonutPieChart.withSampleData() +// ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "GroupedBarChart", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, +// width: 250, + child: new GroupedBarChart.withSampleData() + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "BucketingAxisScatterPlotChart", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, +// width: 250, + child: new BucketingAxisScatterPlotChart.withSampleData() + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,20,0.0,0.0), + child : Text( + "PieOutsideLabelChart", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, +// width: 250, + child: new PieOutsideLabelChart.withSampleData() + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "DonutAutoLabelChart", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, +// width: 250, + child: new DonutAutoLabelChart.withSampleData() + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "DonutPieChart", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, +// width: 250, + child: new DonutPieChart.withSampleData() + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "NumericComboLineBarChart", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, +// width: 250, + child: new NumericComboLineBarChart.withSampleData() + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "LegendWithMeasures", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, +// width: 250, + child: new LegendWithMeasures.withSampleData() + ), + ], ), ), diff --git a/pubspec.lock b/pubspec.lock index b229dc3..cc8d2b8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -92,6 +92,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.2" + charts_common: + dependency: transitive + description: + name: charts_common + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.0" + charts_flutter: + dependency: "direct main" + description: + name: charts_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.0" code_builder: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a5d9364..c05bf61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: datetime_picker_formfield: ^0.1.8 flutter_linkify: ^1.0.3 flutter_fadein: ^1.1.1 - + charts_flutter: ^0.6.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 From bf1046c4e5f2f68421040c50591bb29a4c7cecaf Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 18 Jul 2019 10:26:37 +0100 Subject: [PATCH 043/122] getting graph data from api not sure if this is needed, was suggested though --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/apifunctions/get_graph_data.dart | 49 +++++++++++++++++++++ lib/main.dart | 7 ++- 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 lib/common/apifunctions/get_graph_data.dart diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 81f2036..f5bffe1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index dff0209..a83a4d3 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart new file mode 100644 index 0000000..e217901 --- /dev/null +++ b/lib/common/apifunctions/get_graph_data.dart @@ -0,0 +1,49 @@ +import 'dart:convert'; +import 'dart:async'; +import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; + +enum DataPoint {date, String} + +class GraphData { + List data = new List(); + + Future> getGraphData(String graphType) async { + /// Graph types: + /// - total_last_week + /// - avg_spend_last_week + /// - total_last_month + /// - avg_spend_last_month + /// + /// HTTP POST request sample: + /// {"graph":"total_last_week","session_key":"blahblahblah"} + + final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + SharedPreferences preferences = await SharedPreferences.getInstance(); + + Map body = { + 'graph': graphType, + 'session_key': preferences.get('LastToken'), + }; + + final response = await http.post( + url, + body: json.encode(body), + ); + + if (response.statusCode == 200) { + final responseJson = jsonDecode(response.body); + final labels = responseJson['graph']['labels']; + final data = responseJson['graph']['data']; +// final bounds = responseJson['graph']['bounds']; // why is this even returned? +// print(labels[5]); +// print(data[5]); + } else { + final errorMessage = json.decode(response.body)['message']; + print("Error: " + errorMessage); + } + } + + +} + diff --git a/lib/main.dart b/lib/main.dart index a4a84be..7970364 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,8 @@ import 'package:local_spend/pages/spash_screen.dart'; import 'package:local_spend/pages/more_page.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:local_spend/common/apifunctions/get_graph_data.dart'; + void main() { runApp(MyApp()); } @@ -13,9 +15,12 @@ void main() { class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + GraphData gd = new GraphData(); + gd.getGraphData('total_last_week'); + //var config = ConfigWrapper.of(context); return new MaterialApp( - + debugShowCheckedModeBanner: false, localizationsDelegates: [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, From d7625f7b88fa6c75938a033c67f66eea43ef1d4e Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 18 Jul 2019 12:05:09 +0100 Subject: [PATCH 044/122] implementing API graphs and getting frustrated at async stuff --- To Do List.txt | 17 -- android/build.gradle | 2 +- lib/common/apifunctions/get_graph_data.dart | 59 ++++++- .../widgets/charts/time_series_simple.dart | 60 +++++++ lib/main.dart | 4 +- lib/pages/receipt_page.dart | 4 +- lib/pages/stats_page.dart | 157 ++---------------- 7 files changed, 134 insertions(+), 169 deletions(-) delete mode 100644 To Do List.txt create mode 100644 lib/common/widgets/charts/time_series_simple.dart diff --git a/To Do List.txt b/To Do List.txt deleted file mode 100644 index 6617c34..0000000 --- a/To Do List.txt +++ /dev/null @@ -1,17 +0,0 @@ -TODO - ⁃ Show username - ⁃ add ‘confirm logout’ - - Splash Screen - ⁃ Splash screen transition - fade - - Login - ⁃ save login details option (checkbox or something) - - Navigation - ⁃ Make it look good - - Submit Receipt - ⁃ Categories - ⁃ Recurring - ⁃ 'organisation name' dialog works diff --git a/android/build.gradle b/android/build.gradle index 541636c..f44bb13 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,4 +26,4 @@ subprojects { task clean(type: Delete) { delete rootProject.buildDir -} +} \ No newline at end of file diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index e217901..995ecfe 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -2,13 +2,12 @@ import 'dart:convert'; import 'dart:async'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; - -enum DataPoint {date, String} +import 'package:charts_flutter/flutter.dart' as charts; class GraphData { - List data = new List(); + List data = new List(); - Future> getGraphData(String graphType) async { + Future> getGraphData(String graphType) async { /// Graph types: /// - total_last_week /// - avg_spend_last_week @@ -18,6 +17,7 @@ class GraphData { /// HTTP POST request sample: /// {"graph":"total_last_week","session_key":"blahblahblah"} + charts.Series dataSeries = new charts.Series(); final url = "https://dev.peartrade.org/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); @@ -33,17 +33,62 @@ class GraphData { if (response.statusCode == 200) { final responseJson = jsonDecode(response.body); - final labels = responseJson['graph']['labels']; - final data = responseJson['graph']['data']; -// final bounds = responseJson['graph']['bounds']; // why is this even returned? + final List labels = responseJson['graph']['labels']; + final List data = responseJson['graph']['data']; +// final List bounds = responseJson['graph']['bounds']; // why is this even returned? + + /* + final data = [ + new TimeSeriesSales(new DateTime(2017, 9, 19), 5), + new TimeSeriesSales(new DateTime(2017, 9, 26), 25), + new TimeSeriesSales(new DateTime(2017, 10, 3), 100), + new TimeSeriesSales(new DateTime(2017, 10, 10), 75), + ]; + */ + + List timeSeriesSpendList = new List(); + + for (int i = 0; i < labels.length; i++) { + print(DateTime(labels[i])); + timeSeriesSpendList.add(new TimeSeriesSpend(data[i], DateTime(labels[i]))); + } + + return [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: timeSeriesSpendList, + ) + ]; + + /* + new charts.Series( + id: 'Sales', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSales sales, _) => sales.time, + measureFn: (TimeSeriesSales sales, _) => sales.sales, + data: data, + )*/ + // print(labels[5]); // print(data[5]); } else { final errorMessage = json.decode(response.body)['message']; print("Error: " + errorMessage); + + return null; } } } +class TimeSeriesSpend { + final DateTime time; + final int spend; + + TimeSeriesSpend(this.spend, this.time); +} + diff --git a/lib/common/widgets/charts/time_series_simple.dart b/lib/common/widgets/charts/time_series_simple.dart new file mode 100644 index 0000000..8144c67 --- /dev/null +++ b/lib/common/widgets/charts/time_series_simple.dart @@ -0,0 +1,60 @@ +/// Timeseries chart example +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:flutter/material.dart'; + +class SimpleTimeSeriesChart extends StatelessWidget { + final List seriesList; + final bool animate; + + SimpleTimeSeriesChart(this.seriesList, {this.animate}); + + /// Creates a [TimeSeriesChart] with sample data and no transition. + factory SimpleTimeSeriesChart.withSampleData() { + return new SimpleTimeSeriesChart( + _createSampleData(), + // Disable animations for image tests. + animate: true, + ); + } + + + @override + Widget build(BuildContext context) { + return new charts.TimeSeriesChart( + seriesList, + animate: animate, + // Optionally pass in a [DateTimeFactory] used by the chart. The factory + // should create the same type of [DateTime] as the data provided. If none + // specified, the default creates local date time. + dateTimeFactory: const charts.LocalDateTimeFactory(), + ); + } + + /// Create one series with sample hard coded data. + static List> _createSampleData() { + final data = [ + new TimeSeriesSales(new DateTime(2017, 9, 19), 5), + new TimeSeriesSales(new DateTime(2017, 9, 26), 25), + new TimeSeriesSales(new DateTime(2017, 10, 3), 100), + new TimeSeriesSales(new DateTime(2017, 10, 10), 75), + ]; + + return [ + new charts.Series( + id: 'Sales', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSales sales, _) => sales.time, + measureFn: (TimeSeriesSales sales, _) => sales.sales, + data: data, + ) + ]; + } +} + +/// Sample time series data type. +class TimeSeriesSales { + final DateTime time; + final int sales; + + TimeSeriesSales(this.time, this.sales); +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 7970364..fe77db1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,8 +15,8 @@ void main() { class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - GraphData gd = new GraphData(); - gd.getGraphData('total_last_week'); +// GraphData gd = new GraphData(); +// gd.getGraphData('total_last_week'); //var config = ConfigWrapper.of(context); return new MaterialApp( diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 343072e..d7ffa40 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -204,7 +204,7 @@ class ReceiptPageState extends State { List getRecurringOptions() { var options = new List(7); - options[0] = "None"; + options[0] = "None"; // this should not be hardcoded and should be fetched from API instead options[1] = "Daily"; options[2] = "Weekly"; options[3] = "Fortnightly"; @@ -556,7 +556,7 @@ class ReceiptPageState extends State { value: value, child: Text(value), ); - }).toList(), + }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null ) ), ], diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index aefe483..5e94df9 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -12,6 +12,9 @@ import 'package:local_spend/common/widgets/charts/grouped_bar_chart.dart'; import 'package:local_spend/common/widgets/charts/scatter_bucketingAxis_legend.dart'; import 'package:local_spend/common/widgets/charts/numeric_line_bar_combo.dart'; import 'package:local_spend/common/widgets/charts/series_legend_with_measures.dart'; +import 'package:local_spend/common/widgets/charts/time_series_simple.dart'; +import 'package:local_spend/common/apifunctions/get_graph_data.dart'; +import 'package:charts_flutter/flutter.dart' as charts; const URL = "https://flutter.io/"; const demonstration = false; @@ -25,6 +28,9 @@ class StatsPage extends StatefulWidget { class StatsPageState extends State { + GraphData graphData = new GraphData(); + List totalLastWeek; + @override void initState() { super.initState(); @@ -43,6 +49,15 @@ class StatsPageState extends State { @override Widget build(BuildContext context) { + if (graphData.data != null) { + graphData.getGraphData('total_last_week').then((val) { + totalLastWeek = val; + setState(() { + // update view + }); + }); + } + return PlatformScaffold( appBar: AppBar( backgroundColor: Colors.blue[400], @@ -63,30 +78,11 @@ class StatsPageState extends State { padding: EdgeInsets.fromLTRB(0, 0, 0, 0), child: ListView( children: [ - // some graphs and charts here etc -// Container( -// padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), -// child : Text( -// "Really Cool Chart", -// textAlign: TextAlign.center, -// style: TextStyle( -// fontSize: 22.0, -// color: Colors.black, -// fontWeight: FontWeight.bold, -// ), -// ), -// ), -// -// Container( -// height: 250, -//// width: 250, -// child: new DonutPieChart.withSampleData() -// ), Container( padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), child : Text( - "GroupedBarChart", + "This Week's Spend", textAlign: TextAlign.center, style: TextStyle( fontSize: 22.0, @@ -100,127 +96,8 @@ class StatsPageState extends State { padding: EdgeInsets.symmetric(horizontal: 10), height: 200, // width: 250, - child: new GroupedBarChart.withSampleData() - ), - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "BucketingAxisScatterPlotChart", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, -// width: 250, - child: new BucketingAxisScatterPlotChart.withSampleData() - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,20,0.0,0.0), - child : Text( - "PieOutsideLabelChart", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, -// width: 250, - child: new PieOutsideLabelChart.withSampleData() - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "DonutAutoLabelChart", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, -// width: 250, - child: new DonutAutoLabelChart.withSampleData() - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "DonutPieChart", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, -// width: 250, - child: new DonutPieChart.withSampleData() - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "NumericComboLineBarChart", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, -// width: 250, - child: new NumericComboLineBarChart.withSampleData() - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "LegendWithMeasures", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, -// width: 250, - child: new LegendWithMeasures.withSampleData() + child: new SimpleTimeSeriesChart(totalLastWeek),//seriesList: List ), ], From 9a091543323673b50c6598fea559599d644b9dd9 Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 18 Jul 2019 14:28:34 +0100 Subject: [PATCH 045/122] save before checking-out previous --- lib/common/apifunctions/get_graph_data.dart | 2 +- lib/pages/receipt_page.dart | 35 +++++++++++---------- lib/pages/spash_screen.dart | 2 +- lib/pages/stats_page.dart | 4 +-- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 995ecfe..7729701 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -17,7 +17,7 @@ class GraphData { /// HTTP POST request sample: /// {"graph":"total_last_week","session_key":"blahblahblah"} - charts.Series dataSeries = new charts.Series(); + charts.Series dataSeries = new charts.Series(); final url = "https://dev.peartrade.org/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index d7ffa40..03f5476 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -542,23 +542,24 @@ class ReceiptPageState extends State { ), ), - Container( - padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), - child: DropdownButton( - value: _categoryController.text, - onChanged: (String newValue) { - setState(() { - _categoryController.text = newValue; - }); - }, - items: _categoryDropDownItems.map>((String value) { - return DropdownMenuItem( - value: value, - child: Text(value), - ); - }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null - ) - ), +// Container( +// padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), +// child: DropdownButton( +// value: _categoryController.text, +// onChanged: (String newValue) { +// setState(() { +// _categoryController.text = newValue; +// }); +// }, +// items: _categoryDropDownItems.map>((String value) { +// return DropdownMenuItem( +// value: value, +// child: Text(value), +// ); +// }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null +// ) +// ), + ], ), ), diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index 4aa22ab..acb4449 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -10,7 +10,7 @@ class SplashScreen extends StatefulWidget { } class _SplashScreenState extends State { - final int splashDuration = 3; + final int splashDuration = 1; startTime() async { return Timer(Duration(seconds: splashDuration), () { diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index 5e94df9..157507f 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -49,14 +49,14 @@ class StatsPageState extends State { @override Widget build(BuildContext context) { - if (graphData.data != null) { +// if (graphData.data != null) { graphData.getGraphData('total_last_week').then((val) { totalLastWeek = val; setState(() { // update view }); }); - } +// } return PlatformScaffold( appBar: AppBar( From d9abbbd0e70ca8fac1e124ff2f495d71df821c56 Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 18 Jul 2019 16:38:12 +0100 Subject: [PATCH 046/122] Graph objectification --- lib/common/apifunctions/get_graph_data.dart | 4 +-- lib/common/widgets/charts/chart_builder.dart | 19 +++++++++++ lib/pages/receipt_page.dart | 36 ++++++++++---------- lib/pages/stats_page.dart | 16 +++++---- 4 files changed, 48 insertions(+), 27 deletions(-) create mode 100644 lib/common/widgets/charts/chart_builder.dart diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 7729701..71ae7d6 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -49,8 +49,8 @@ class GraphData { List timeSeriesSpendList = new List(); for (int i = 0; i < labels.length; i++) { - print(DateTime(labels[i])); - timeSeriesSpendList.add(new TimeSeriesSpend(data[i], DateTime(labels[i]))); + print(DateTime.parse(labels[i])); + timeSeriesSpendList.add(new TimeSeriesSpend(data[i], DateTime.parse(labels[i]))); } return [ diff --git a/lib/common/widgets/charts/chart_builder.dart b/lib/common/widgets/charts/chart_builder.dart new file mode 100644 index 0000000..eea35bb --- /dev/null +++ b/lib/common/widgets/charts/chart_builder.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/widgets/charts/time_series_simple.dart'; + +class TimeSeries extends StatelessWidget { + + final String chartDataName; + + TimeSeries({ + this.chartDataName, + }); + + @override + Widget build(BuildContext context) { + return new Container( + padding: EdgeInsets.symmetric(horizontal: 7.5, vertical: 7.5), + child: SimpleTimeSeriesChart.withSampleData(), + ); + } +} \ No newline at end of file diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 03f5476..1dd800a 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -28,7 +28,7 @@ class ReceiptPageState extends State { final TextEditingController _amountController = TextEditingController(); final TextEditingController _essentialController = TextEditingController(); final TextEditingController _recurringController = TextEditingController(); - final TextEditingController _categoryController = TextEditingController(); + final TextEditingController _categoryController = TextEditingController(); // TODO: fix this final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); List _categoryDropDownItems = List(); @@ -542,23 +542,23 @@ class ReceiptPageState extends State { ), ), -// Container( -// padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), -// child: DropdownButton( -// value: _categoryController.text, -// onChanged: (String newValue) { -// setState(() { -// _categoryController.text = newValue; -// }); -// }, -// items: _categoryDropDownItems.map>((String value) { -// return DropdownMenuItem( -// value: value, -// child: Text(value), -// ); -// }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null -// ) -// ), + Container( + padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), + child: DropdownButton( + value: _categoryController.text, + onChanged: (String newValue) { + setState(() { + _categoryController.text = newValue; + }); + }, + items: _categoryDropDownItems.map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null + ) + ), ], ), diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index 157507f..c5be96b 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -15,6 +15,7 @@ import 'package:local_spend/common/widgets/charts/series_legend_with_measures.da import 'package:local_spend/common/widgets/charts/time_series_simple.dart'; import 'package:local_spend/common/apifunctions/get_graph_data.dart'; import 'package:charts_flutter/flutter.dart' as charts; +import 'package:local_spend/common/widgets/charts/chart_builder.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -50,12 +51,12 @@ class StatsPageState extends State { @override Widget build(BuildContext context) { // if (graphData.data != null) { - graphData.getGraphData('total_last_week').then((val) { - totalLastWeek = val; - setState(() { - // update view - }); - }); +// graphData.getGraphData('total_last_week').then((val) { +// totalLastWeek = val; +// setState(() { +// // update view +// }); +// }); // } return PlatformScaffold( @@ -97,7 +98,8 @@ class StatsPageState extends State { height: 200, // width: 250, - child: new SimpleTimeSeriesChart(totalLastWeek),//seriesList: List + child: new TimeSeries(), +// child: new SimpleTimeSeriesChart(totalLastWeek),//seriesList: List ), ], From 1b207c1ce6533809f7fe1817d169320ad870c02f Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 18 Jul 2019 16:47:58 +0100 Subject: [PATCH 047/122] save also, two exclamation marks have been added (very important) --- lib/common/apifunctions/get_graph_data.dart | 3 ++- lib/pages/receipt_page.dart | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 71ae7d6..6cabf2a 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -50,7 +50,8 @@ class GraphData { for (int i = 0; i < labels.length; i++) { print(DateTime.parse(labels[i])); - timeSeriesSpendList.add(new TimeSeriesSpend(data[i], DateTime.parse(labels[i]))); + timeSeriesSpendList.add(new TimeSeriesSpend(i, DateTime(i))); +// timeSeriesSpendList.add(new TimeSeriesSpend(data[i], DateTime.parse(labels[i]))); } return [ diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 1dd800a..878a624 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -28,7 +28,7 @@ class ReceiptPageState extends State { final TextEditingController _amountController = TextEditingController(); final TextEditingController _essentialController = TextEditingController(); final TextEditingController _recurringController = TextEditingController(); - final TextEditingController _categoryController = TextEditingController(); // TODO: fix this + final TextEditingController _categoryController = TextEditingController(); // TODO: fix this!! final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); List _categoryDropDownItems = List(); From 2e0802ac73999ca212f5393a687516d024580582 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 19 Jul 2019 12:06:02 +0100 Subject: [PATCH 048/122] save before experiment, broken --- lib/common/apifunctions/categories.dart | 2 +- lib/common/widgets/future_dropdownmenu.dart | 35 +++++++ lib/pages/receipt_page.dart | 103 +++++++++++++------- 3 files changed, 103 insertions(+), 37 deletions(-) create mode 100644 lib/common/widgets/future_dropdownmenu.dart diff --git a/lib/common/apifunctions/categories.dart b/lib/common/apifunctions/categories.dart index 6f3f590..a329309 100644 --- a/lib/common/apifunctions/categories.dart +++ b/lib/common/apifunctions/categories.dart @@ -13,7 +13,7 @@ class Category { }); } -Future> getCategories() async { +Future> getCategories() async { // confusing name const url = "https://dev.peartrade.org/api/search/category"; var token; diff --git a/lib/common/widgets/future_dropdownmenu.dart b/lib/common/widgets/future_dropdownmenu.dart new file mode 100644 index 0000000..b364b30 --- /dev/null +++ b/lib/common/widgets/future_dropdownmenu.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class DropDownMenu extends StatefulWidget { + + final List items; + final Function onChanged; + final String value; + + DropDownMenu({ + this.items, + this.onChanged, + this.value, + }); + + @override + _DropDownMenuState createState() => _DropDownMenuState(items: this.items, onNewValue: this.onChanged, value: this.value); +} + +class _DropDownMenuState extends State { + + final List items; + final Function onNewValue; + final String value; + + _DropDownMenuState({ + this.items, + this.onNewValue, + this.value + }); + + @override + Widget build(BuildContext context) { + return new DropdownButton(value: this.value, items: this.items, onChanged: (newValue) => onNewValue(newValue),); + } +} \ No newline at end of file diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 878a624..4f87047 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -12,6 +12,7 @@ import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; import 'package:local_spend/common/widgets/popupListView.dart'; import 'package:local_spend/common/apifunctions/categories.dart'; +import 'package:local_spend/common/widgets/future_dropdownmenu.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -31,7 +32,7 @@ class ReceiptPageState extends State { final TextEditingController _categoryController = TextEditingController(); // TODO: fix this!! final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); - List _categoryDropDownItems = List(); + List> _categoryDropDownItems; FocusNode focusNode; @@ -51,8 +52,11 @@ class ReceiptPageState extends State { @override void initState() { - getCategoriesStrings().then((value) { + + getCategoriesList().then((value) { + setState(() { _categoryDropDownItems = value; + }); }); super.initState(); @@ -61,10 +65,7 @@ class ReceiptPageState extends State { focusNode = FocusNode(); _recurringController.text = "None"; - _categoryController.text = ""; -// getCategoriesStrings().then((value) { -// _categoryDropDownItems = value; -// }); + _categoryController.text = "None"; } @override @@ -184,22 +185,26 @@ class ReceiptPageState extends State { return "false"; } - Future> getCategoriesStrings() async { - var categories = getCategories(); //future> - var categoriesStrings = List(); + Future>> getCategoriesList() async { + //TODO: Return a list of [String, String] where {1} is categoryName and {2} is categoryValue for request + var categoriesList = List(); - categories.then((val) { - val.forEach((thisCategory) { + var categories = await getCategories(); //future> + + categories.forEach((thisCategory) { // print(thisCategory.name); - categoriesStrings.add(thisCategory.name); - }); + var thisMap = new DropdownMenuItem( + child: new Text(thisCategory.name), + value: thisCategory.index, + ); + + categoriesList.add(thisMap); + }); // print(categoriesStrings[10]); // prints 'Banana' // print(categoriesStrings.toString()); - _categoryDropDownItems = categoriesStrings; - return categoriesStrings; - }); + return categoriesList; } List getRecurringOptions() { @@ -237,7 +242,7 @@ class ReceiptPageState extends State { return (components[2] + "-" + components[1] + "-" + components[0] + "T" + components[3] + ":" + components[4] + ":00.000+01:00"); - // Yes, there is probably a function to convert dates, but I didn't + // Yes, there is a function to convert dates, but I didn't // know that before writing this and it's done now so I'm keeping it. } @@ -299,6 +304,13 @@ class ReceiptPageState extends State { @override Widget build(BuildContext context) { +// _categoryDropDownItems = [ +// Map.fromIterable(["wappa dappa doo", "1"]), +// Map.fromIterable(["interesting flip flops", "2"]), +// "gray skies", value: "3"), +// "fortified systems" value: "4"), +// ]; + return PlatformScaffold( appBar: AppBar( @@ -521,15 +533,13 @@ class ReceiptPageState extends State { Padding( - padding: EdgeInsets.fromLTRB(0.0,18,0.0,0.0), + padding: EdgeInsets.fromLTRB(0.0,7,0.0,0.0), child : Container ( height: 35, // width: 400, - child : ListView( - scrollDirection: Axis.horizontal, - + child : Row( children: [ Container( padding: const EdgeInsets.fromLTRB(0, 7, 0, 8), @@ -543,23 +553,44 @@ class ReceiptPageState extends State { ), Container( - padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), - child: DropdownButton( - value: _categoryController.text, - onChanged: (String newValue) { - setState(() { - _categoryController.text = newValue; - }); - }, - items: _categoryDropDownItems.map>((String value) { - return DropdownMenuItem( - value: value, - child: Text(value), - ); - }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null - ) + padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), + child: DropdownButton( +// items: [ +// DropdownMenuItem(child: Text("eeeee"), value: "eeeee"), +// DropdownMenuItem(child: Text("Cucumbers"), value: "Cucumbers"), +// DropdownMenuItem(child: Text("Mar shmellows"), value: "Marshmellows"), +// DropdownMenuItem(child: Text("Pickled Sardines"), value: "Pickled Sardines"), +// ].toList(), + items: _categoryDropDownItems, + + value: _categoryController.text, +// value: "skip skap skop", + onChanged: (newValue) { + setState(() { + _categoryController.text = newValue; + }); + } + ), ), +// Container( +// padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), +// child: DropdownButton( +// value: _categoryController.text, +// onChanged: (String newValue) { +// setState(() { +// _categoryController.text = newValue; +// }); +// }, +// items: _categoryDropDownItems.map>((String value) { +// return DropdownMenuItem( +// value: value, +// child: Text(value), +// ); +// }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null +// ) +// ), + ], ), ), From 525a092f40b845047da227cf790bc7dc2f90ffa5 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 19 Jul 2019 15:15:04 +0100 Subject: [PATCH 049/122] dropdownbutton still not working fully ...but it works a bit more than before! --- lib/common/apifunctions/categories.dart | 4 +- lib/common/widgets/future_dropdownmenu.dart | 50 +++---- lib/pages/receipt_page.dart | 145 +++++++++++++------- 3 files changed, 122 insertions(+), 77 deletions(-) diff --git a/lib/common/apifunctions/categories.dart b/lib/common/apifunctions/categories.dart index a329309..6cdf153 100644 --- a/lib/common/apifunctions/categories.dart +++ b/lib/common/apifunctions/categories.dart @@ -70,7 +70,9 @@ Future> getCategories() async { // confusing name // }); // print(categories[10].name.toString()); // prints "Banana" - return categories; + + return categories; // categories is List + // Category is defined at the top^^ } else { // not successful return null; diff --git a/lib/common/widgets/future_dropdownmenu.dart b/lib/common/widgets/future_dropdownmenu.dart index b364b30..85573fb 100644 --- a/lib/common/widgets/future_dropdownmenu.dart +++ b/lib/common/widgets/future_dropdownmenu.dart @@ -1,35 +1,25 @@ import 'package:flutter/material.dart'; +import 'package:local_spend/common/apifunctions/categories.dart'; +import 'dart:async'; -class DropDownMenu extends StatefulWidget { +Future> getDropDownItems(String type) async { + List> items = new List>(); - final List items; - final Function onChanged; - final String value; - - DropDownMenu({ - this.items, - this.onChanged, - this.value, - }); +// if (type == "categories") { + var categories = await getCategories(); - @override - _DropDownMenuState createState() => _DropDownMenuState(items: this.items, onNewValue: this.onChanged, value: this.value); + categories.forEach((thisValue) { + items.add( + new DropdownMenuItem( + child: new Text(thisValue.name), + value: thisValue.index, + key: Key(thisValue.index), + ), + ); + }); + + print("oof"); + + return items; +// } } - -class _DropDownMenuState extends State { - - final List items; - final Function onNewValue; - final String value; - - _DropDownMenuState({ - this.items, - this.onNewValue, - this.value - }); - - @override - Widget build(BuildContext context) { - return new DropdownButton(value: this.value, items: this.items, onChanged: (newValue) => onNewValue(newValue),); - } -} \ No newline at end of file diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 4f87047..b37601d 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -29,10 +29,12 @@ class ReceiptPageState extends State { final TextEditingController _amountController = TextEditingController(); final TextEditingController _essentialController = TextEditingController(); final TextEditingController _recurringController = TextEditingController(); - final TextEditingController _categoryController = TextEditingController(); // TODO: fix this!! + + TextEditingController _categoryController; // TODO: fix this!! final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); - List> _categoryDropDownItems; + DropdownButton _dropDownMenu = new DropdownButton(items: null, onChanged: null); + String _category; FocusNode focusNode; @@ -53,9 +55,16 @@ class ReceiptPageState extends State { @override void initState() { - getCategoriesList().then((value) { - setState(() { - _categoryDropDownItems = value; +// getCategoriesList().then((value) { +// setState(() { +// _categoryDropDownItems = value; +// }); +// }); +// loadDropDownMenu(); + + getDropDownMenu().then((value) { + setState((){ + _dropDownMenu = value; }); }); @@ -65,7 +74,7 @@ class ReceiptPageState extends State { focusNode = FocusNode(); _recurringController.text = "None"; - _categoryController.text = "None"; +// _categoryController.text = null; } @override @@ -82,7 +91,57 @@ class ReceiptPageState extends State { // this file is getting really messy sorry everyone - void submitReceipt(String amount, String time, Organisation organisation, String recurring, String category, String essential) async { + void loadDropDownMenu() async { +// _dropDownMenu = await getDropDownMenu( +// "categories", +// setCategory, +// ); + + /// + /// so the below code works when 'value' is not specified but then, obviously, the value of the dropdownbutton can't be set. + /// when it is specified, it doesn't work: + /// [VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: 'package:flutter/src/material/dropdown.dart': Failed assertion: line 608 pos 15: 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem item) => item.value == value).length == 1': is not true. + /// + + getDropDownItems("categories").then((categories) { +// _category = categories[0]; +// _dropDownMenu = new DropdownButton(/*value : _categoryController.text, */items: categories, onChanged: (newValue) => _categoryController.text = newValue); + setState(() { + _dropDownMenu = new DropdownButton(items: categories, onChanged: (newValue) => _category = newValue, value: _category); + }); + }); + } + + Future getDropDownMenu() async { + List categories = await getDropDownItems("categories"); + + categories.forEach((thisOne) { + print("This value: " + thisOne.value); + }); +// _categoryController = new TextEditingController(text: null); + return new DropdownButton( + items: categories, + onChanged: (newValue) { + _category = newValue; + setState(() { + _category = newValue; + }); + }, + + /* + items: categories.map((dynamic value) { + return DropdownMenuItem( + value : value.value, + child: new Text(value.value) + ); + }).toList(), + */ + + value: _category); + } + + void submitReceipt(String amount, String time, Organisation organisation, String recurring, String category, String essential) async + { SystemChannels.textInput.invokeMethod('TextInput.hide'); if (organisation == null) { @@ -185,27 +244,27 @@ class ReceiptPageState extends State { return "false"; } - Future>> getCategoriesList() async { - //TODO: Return a list of [String, String] where {1} is categoryName and {2} is categoryValue for request - var categoriesList = List(); - - var categories = await getCategories(); //future> - - categories.forEach((thisCategory) { -// print(thisCategory.name); - var thisMap = new DropdownMenuItem( - child: new Text(thisCategory.name), - value: thisCategory.index, - ); - - categoriesList.add(thisMap); - }); - -// print(categoriesStrings[10]); // prints 'Banana' -// print(categoriesStrings.toString()); - - return categoriesList; - } +// Future>> getCategoriesList() async { +// //TODO: Return a list of [String, String] where {1} is categoryName and {2} is categoryValue for request +// var categoriesList = List(); +// +// var categories = await getCategories(); //future> +// +// categories.forEach((thisCategory) { +//// print(thisCategory.name); +// var thisMap = new DropdownMenuItem( +// child: new Text(thisCategory.name), +// value: thisCategory.index, +// ); +// +// categoriesList.add(thisMap); +// }); +// +//// print(categoriesStrings[10]); // prints 'Banana' +//// print(categoriesStrings.toString()); +// +// return categoriesList; +// } List getRecurringOptions() { var options = new List(7); @@ -531,7 +590,6 @@ class ReceiptPageState extends State { ), ), - Padding( padding: EdgeInsets.fromLTRB(0.0,7,0.0,0.0), @@ -554,23 +612,18 @@ class ReceiptPageState extends State { Container( padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), - child: DropdownButton( -// items: [ -// DropdownMenuItem(child: Text("eeeee"), value: "eeeee"), -// DropdownMenuItem(child: Text("Cucumbers"), value: "Cucumbers"), -// DropdownMenuItem(child: Text("Mar shmellows"), value: "Marshmellows"), -// DropdownMenuItem(child: Text("Pickled Sardines"), value: "Pickled Sardines"), -// ].toList(), - items: _categoryDropDownItems, - - value: _categoryController.text, -// value: "skip skap skop", - onChanged: (newValue) { - setState(() { - _categoryController.text = newValue; - }); - } - ), + child: _dropDownMenu, +// child: DropdownButton( +// items: _categoryDropDownItems, +// +// value: _categoryController.text, +//// value: "skip skap skop", +// onChanged: (newValue) { +// setState(() { +// _categoryController.text = newValue; +// }); +// } +// ), ), // Container( From 755893ee109d3d633388df6d2a67f36594ba7313 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 5 Aug 2019 09:27:10 +0100 Subject: [PATCH 050/122] just gonna redo the whole receipt page this is because the code for it is now completely messy and impossible to follow (yeah, my fault) and I need to start remembering how to code properly again after two weeks --- ios/Podfile.lock | 2 +- lib/pages/receipt_page.dart | 45 ++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f5bffe1..a4e1203 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -25,4 +25,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: aff02bfeed411c636180d6812254b2daeea14d09 -COCOAPODS: 1.7.3 +COCOAPODS: 1.7.5 diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index b37601d..27bcad0 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -33,7 +33,8 @@ class ReceiptPageState extends State { TextEditingController _categoryController; // TODO: fix this!! final TextEditingController _orgController = TextEditingController(); final OrganizationController _organizationController = OrganizationController(); - DropdownButton _dropDownMenu = new DropdownButton(items: null, onChanged: null); + DropdownButton _categoriesDropDownButton = new DropdownButton(items: null /*onChanged: blahBlahBlah*/); + DropdownButton _recurringDropDownButton = new DropdownButton(items: null /*onChanged: blahBlahBlah*/); String _category; FocusNode focusNode; @@ -62,9 +63,9 @@ class ReceiptPageState extends State { // }); // loadDropDownMenu(); - getDropDownMenu().then((value) { + getCategoriesDropDownMenu("categories").then((value) { setState((){ - _dropDownMenu = value; + _categoriesDropDownButton = value; }); }); @@ -107,20 +108,20 @@ class ReceiptPageState extends State { // _category = categories[0]; // _dropDownMenu = new DropdownButton(/*value : _categoryController.text, */items: categories, onChanged: (newValue) => _categoryController.text = newValue); setState(() { - _dropDownMenu = new DropdownButton(items: categories, onChanged: (newValue) => _category = newValue, value: _category); + _categoriesDropDownButton = new DropdownButton(items: categories, onChanged: (newValue) => _category = newValue, value: _category); }); }); } + + Future getCategoriesDropDownMenu(String type) async { + List dropDownItems = await getDropDownItems(type); - Future getDropDownMenu() async { - List categories = await getDropDownItems("categories"); - - categories.forEach((thisOne) { - print("This value: " + thisOne.value); - }); +// dropDownItems.forEach((thisOne) { +// print("This value: " + thisOne.value); +// }); // _categoryController = new TextEditingController(text: null); return new DropdownButton( - items: categories, + items: dropDownItems, onChanged: (newValue) { _category = newValue; setState(() { @@ -267,16 +268,18 @@ class ReceiptPageState extends State { // } List getRecurringOptions() { - var options = new List(7); - options[0] = "None"; // this should not be hardcoded and should be fetched from API instead - options[1] = "Daily"; - options[2] = "Weekly"; - options[3] = "Fortnightly"; - options[4] = "Monthly"; - options[5] = "Quarterly"; - options[6] = "Yearly"; +// var options = new List(7); +// options[0] = "None"; // this should not be hardcoded and should be fetched from API instead +// options[1] = "Daily"; +// options[2] = "Weekly"; +// options[3] = "Fortnightly"; +// options[4] = "Monthly"; +// options[5] = "Quarterly"; +// options[6] = "Yearly"; +// +// return options; - return options; + var options = } String formatDate(String date) { @@ -612,7 +615,7 @@ class ReceiptPageState extends State { Container( padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), - child: _dropDownMenu, + child: _categoriesDropDownButton, // child: DropdownButton( // items: _categoryDropDownItems, // From 5adb7ae9029dc8e799c9b3ef157a8e43f2cd52fb Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 5 Aug 2019 09:33:39 +0100 Subject: [PATCH 051/122] The rebuild has begun! --- lib/main.dart | 3 ++- lib/pages/home_page.dart | 3 ++- lib/pages/receipt_page.dart | 25 +++++++++++++------------ lib/pages/receipt_page_2.dart | 29 +++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 lib/pages/receipt_page_2.dart diff --git a/lib/main.dart b/lib/main.dart index fe77db1..61fff8d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:local_spend/pages/home_page.dart'; import 'package:local_spend/pages/login_page.dart'; import 'package:local_spend/pages/receipt_page.dart'; +import 'package:local_spend/pages/receipt_page_2.dart'; import 'package:local_spend/pages/spash_screen.dart'; import 'package:local_spend/pages/more_page.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; @@ -36,7 +37,7 @@ class MyApp extends StatelessWidget { routes: { "/HomePage": (BuildContext context) => HomePage(), "/LoginPage": (BuildContext context) => LoginPage(), - "/ReceiptPage": (BuildContext context) => ReceiptPage(), + "/ReceiptPage": (BuildContext context) => ReceiptPage2(), "/MorePage": (BuildContext context) => MorePage(), }, home: SplashScreen(), diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index bad8709..d33119d 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:local_spend/pages/receipt_page.dart'; +import 'package:local_spend/pages/receipt_page_2.dart'; import 'package:local_spend/pages/more_page.dart'; import 'package:local_spend/pages/stats_page.dart'; @@ -27,7 +28,7 @@ class _HomePageState extends State { static const TextStyle optionStyle = TextStyle(fontSize: 30, fontWeight: FontWeight.bold); static List _widgetOptions = [ - ReceiptPage(), + ReceiptPage2(), StatsPage(), MorePage() ]; diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart index 27bcad0..603791c 100644 --- a/lib/pages/receipt_page.dart +++ b/lib/pages/receipt_page.dart @@ -1,3 +1,4 @@ +/* import 'dart:async'; import 'package:flutter/material.dart'; @@ -112,7 +113,7 @@ class ReceiptPageState extends State { }); }); } - + Future getCategoriesDropDownMenu(String type) async { List dropDownItems = await getDropDownItems(type); @@ -268,18 +269,16 @@ class ReceiptPageState extends State { // } List getRecurringOptions() { -// var options = new List(7); -// options[0] = "None"; // this should not be hardcoded and should be fetched from API instead -// options[1] = "Daily"; -// options[2] = "Weekly"; -// options[3] = "Fortnightly"; -// options[4] = "Monthly"; -// options[5] = "Quarterly"; -// options[6] = "Yearly"; -// -// return options; + var options = new List(7); + options[0] = "None"; // this should not be hardcoded and should be fetched from API instead + options[1] = "Daily"; + options[2] = "Weekly"; + options[3] = "Fortnightly"; + options[4] = "Monthly"; + options[5] = "Quarterly"; + options[6] = "Yearly"; - var options = + return options; } String formatDate(String date) { @@ -698,3 +697,5 @@ class ReceiptPageState extends State { ); } } + +*/ \ No newline at end of file diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart new file mode 100644 index 0000000..979213e --- /dev/null +++ b/lib/pages/receipt_page_2.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; + +class ReceiptPage2 extends StatefulWidget { + @override + State createState() { + return new ReceiptPage2State(); + } +} + +class ReceiptPage2State extends State { + @override + Widget build(BuildContext context) { + return PlatformScaffold( + appBar: AppBar( + backgroundColor: Colors.blue[400], + title: Text( + "Submit Receipt", + style: TextStyle( + fontSize: 20, + color: Colors.white, + ), + ), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), + ); + } +} \ No newline at end of file From fa7cf8ffa051bb7f618222e702f5fd540ea9f43c Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 5 Aug 2019 11:44:03 +0100 Subject: [PATCH 052/122] Date/time picker added, receipt page 2.0 looking good! --- lib/pages/more_page.dart | 5 --- lib/pages/receipt_page_2.dart | 81 +++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/lib/pages/more_page.dart b/lib/pages/more_page.dart index 21814de..d05a0a3 100644 --- a/lib/pages/more_page.dart +++ b/lib/pages/more_page.dart @@ -86,11 +86,6 @@ class MorePageState extends State { ), ), ), -// -// Padding( -// padding: EdgeInsets.fromLTRB(10, 15, 0, 0), -// child: Text("helloooo"), -// ), Padding( padding: EdgeInsets.fromLTRB(0.0, 25.0, 0.0, 0.0), diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 979213e..61ba0da 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:intl/intl.dart'; +import 'package:flutter/cupertino.dart'; class ReceiptPage2 extends StatefulWidget { @override @@ -9,8 +11,11 @@ class ReceiptPage2 extends StatefulWidget { } class ReceiptPage2State extends State { + DateTime _transactionDate = DateTime.now(); + @override Widget build(BuildContext context) { + return PlatformScaffold( appBar: AppBar( backgroundColor: Colors.blue[400], @@ -24,6 +29,82 @@ class ReceiptPage2State extends State { centerTitle: true, iconTheme: IconThemeData(color: Colors.black), ), + + body: ListView( + children: [ + // each CHILD has its own horizontal padding because if the listView has padding, Android's end-of-scroll animation + // doesn't fit the screen properly and looks weird + Container( + padding: const EdgeInsets.fromLTRB(15, 17, 0, 0), + child : Text( + "Receipt Details", + style: TextStyle( + fontSize: 24, + color: Colors.grey[700], + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + child: Row( + children: [ + Text( + "Date/Time", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + + Container( + padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + child: CupertinoDatePicker( + initialDateTime: _transactionDate.isAfter(DateTime.now()) + ? DateTime.now() + : _transactionDate, + onDateTimeChanged: (DateTime newDate) { + setState(() => { + newDate.isAfter(DateTime.now()) + ? _transactionDate = DateTime.now() + : _transactionDate = newDate, + }); + }, + use24hFormat: true, + maximumDate: DateTime.now(), + ), + ); + }); + },// onPressed: () => showDatePicker(context: context, initialDate: _transactionDate, firstDate: null, lastDate: _transactionDate), + child: Text( + _transactionDate == null + ? 'None set.' + : _transactionDate.year == DateTime.now().year + ? '${new DateFormat.MMMd().format(_transactionDate)}' + ", " + '${new DateFormat.Hm().format(_transactionDate)}' + : '${new DateFormat.MMMd().format(_transactionDate)}' + " " + _transactionDate.year.toString() + ", " + '${new DateFormat.Hm().format(_transactionDate)}', + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, + ), + ), + ], + ), + ), + + ], + ), + ); } } \ No newline at end of file From e742badcc837f3629181dc619b3cc251519d95b4 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 5 Aug 2019 12:11:40 +0100 Subject: [PATCH 053/122] 'amount' button it doesn't actually function yet, but it looks pretty! --- ios/Podfile.lock | 4 +-- ios/Runner.xcodeproj/project.pbxproj | 8 ++--- lib/pages/more_page.dart | 2 +- lib/pages/receipt_page_2.dart | 46 ++++++++++++++++++++++++++-- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4e1203..8132310 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a83a4d3..a0f8e33 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( @@ -380,7 +380,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = G78D5X4L92; @@ -509,7 +509,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = G78D5X4L92; @@ -536,7 +536,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = G78D5X4L92; diff --git a/lib/pages/more_page.dart b/lib/pages/more_page.dart index d05a0a3..ae9405b 100644 --- a/lib/pages/more_page.dart +++ b/lib/pages/more_page.dart @@ -100,7 +100,7 @@ class MorePageState extends State { applicationName: "Local Spend Tracker", children: [ Text("Pear Trading is a commerce company designed to register and monitor money circulating in the local economy."), - Text("\nContact at test@example.com or +44(0)1524 64544"), + Text("\nContact at test@example.com or +44 01524 64544"), Padding( padding: EdgeInsets.fromLTRB(0,20,0,0), diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 61ba0da..ad8757c 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -12,6 +12,7 @@ class ReceiptPage2 extends StatefulWidget { class ReceiptPage2State extends State { DateTime _transactionDate = DateTime.now(); + double _transactionAmount = 0; @override Widget build(BuildContext context) { @@ -34,6 +35,7 @@ class ReceiptPage2State extends State { children: [ // each CHILD has its own horizontal padding because if the listView has padding, Android's end-of-scroll animation // doesn't fit the screen properly and looks weird + Container( padding: const EdgeInsets.fromLTRB(15, 17, 0, 0), child : Text( @@ -44,7 +46,7 @@ class ReceiptPage2State extends State { fontWeight: FontWeight.bold, ), ), - ), + ), // "Receipt Details" title Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), @@ -100,11 +102,49 @@ class ReceiptPage2State extends State { ), ], ), - ), + ), // Date/Time picker + + Container( + padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + child: Row( + children: [ + Text( + "Amount", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + + Container( + padding: const EdgeInsets.fromLTRB(36, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + ); + }); + },// onPressed: () => showDatePicker(context: context, initialDate: _transactionDate, firstDate: null, lastDate: _transactionDate), + child: Text( + _transactionAmount == null + ? 'None set.' + : "£" + _transactionAmount.toString() + "0", + style : TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, + ), + ), + ], + ), + ), // Date/Time picker ], ), - ); } } \ No newline at end of file From 59f69b102f5245e9e4b6c7527f7a4d1ec38850f4 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 5 Aug 2019 12:24:40 +0100 Subject: [PATCH 054/122] Layout fixed --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/pages/receipt_page_2.dart | 72 +++++++++++++++++----------- 3 files changed, 47 insertions(+), 31 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8132310..a4e1203 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a0f8e33..5b4844c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index ad8757c..208c5fa 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -3,6 +3,16 @@ import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:intl/intl.dart'; import 'package:flutter/cupertino.dart'; +class Transaction { + DateTime date; + double amount; + + Transaction( + this.date, + this.amount, + ); +} + class ReceiptPage2 extends StatefulWidget { @override State createState() { @@ -11,9 +21,8 @@ class ReceiptPage2 extends StatefulWidget { } class ReceiptPage2State extends State { - DateTime _transactionDate = DateTime.now(); - double _transactionAmount = 0; - + Transaction transaction = new Transaction(DateTime.now(), 0); + @override Widget build(BuildContext context) { @@ -52,17 +61,20 @@ class ReceiptPage2State extends State { padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), child: Row( children: [ - Text( - "Date/Time", - style: TextStyle( - fontSize: 18, - color: Colors.black, - fontWeight: FontWeight.bold, + Container( + child : Text( + "Date/Time", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), + width: 110, ), Container( - padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: 32.0, child: RaisedButton( onPressed: () { @@ -72,14 +84,14 @@ class ReceiptPage2State extends State { return Container( height: MediaQuery.of(context).copyWith().size.height / 3, child: CupertinoDatePicker( - initialDateTime: _transactionDate.isAfter(DateTime.now()) + initialDateTime: transaction.date.isAfter(DateTime.now()) ? DateTime.now() - : _transactionDate, + : transaction.date, onDateTimeChanged: (DateTime newDate) { setState(() => { newDate.isAfter(DateTime.now()) - ? _transactionDate = DateTime.now() - : _transactionDate = newDate, + ? transaction.date = DateTime.now() + : transaction.date = newDate, }); }, use24hFormat: true, @@ -89,11 +101,11 @@ class ReceiptPage2State extends State { }); },// onPressed: () => showDatePicker(context: context, initialDate: _transactionDate, firstDate: null, lastDate: _transactionDate), child: Text( - _transactionDate == null + transaction.date == null ? 'None set.' - : _transactionDate.year == DateTime.now().year - ? '${new DateFormat.MMMd().format(_transactionDate)}' + ", " + '${new DateFormat.Hm().format(_transactionDate)}' - : '${new DateFormat.MMMd().format(_transactionDate)}' + " " + _transactionDate.year.toString() + ", " + '${new DateFormat.Hm().format(_transactionDate)}', + : transaction.date.year == DateTime.now().year + ? '${new DateFormat.MMMd().format(transaction.date)}' + ", " + '${new DateFormat.Hm().format(transaction.date)}' + : '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + ", " + '${new DateFormat.Hm().format(transaction.date)}', style: TextStyle(color: Colors.white, fontSize: 18.0), ), @@ -108,17 +120,21 @@ class ReceiptPage2State extends State { padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), child: Row( children: [ - Text( - "Amount", - style: TextStyle( - fontSize: 18, - color: Colors.black, - fontWeight: FontWeight.bold, + Container( + child : Text( + "Amount", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), + width: 110, ), + Container( - padding: const EdgeInsets.fromLTRB(36, 0, 0, 0), + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: 32.0, child: RaisedButton( onPressed: () { @@ -131,9 +147,9 @@ class ReceiptPage2State extends State { }); },// onPressed: () => showDatePicker(context: context, initialDate: _transactionDate, firstDate: null, lastDate: _transactionDate), child: Text( - _transactionAmount == null + transaction.amount == null ? 'None set.' - : "£" + _transactionAmount.toString() + "0", + : "£" + transaction.amount.toString() + "0", style : TextStyle(color: Colors.white, fontSize: 18.0), ), color: Colors.blue, @@ -141,7 +157,7 @@ class ReceiptPage2State extends State { ), ], ), - ), // Date/Time picker + ), // Amount picker ], ), From eaf7a06f52603b42aa3b86955f9be74b1f081e4c Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 7 Aug 2019 13:15:15 +0100 Subject: [PATCH 055/122] UI looking FANTASTIC new organisations dialog added with very sexy listView --- lib/common/apifunctions/categories.dart | 19 ++++ .../apifunctions/find_organisations.dart | 46 ++-------- lib/common/widgets/organisations_dialog.dart | 79 +++++++++++++++++ lib/pages/receipt_page_2.dart | 86 +++++++++++++++---- 4 files changed, 173 insertions(+), 57 deletions(-) create mode 100644 lib/common/widgets/organisations_dialog.dart diff --git a/lib/common/apifunctions/categories.dart b/lib/common/apifunctions/categories.dart index 6cdf153..dc537ab 100644 --- a/lib/common/apifunctions/categories.dart +++ b/lib/common/apifunctions/categories.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:async'; import 'package:http/http.dart' as http; import 'package:local_spend/common/functions/get_token.dart'; +import 'package:flutter/material.dart'; class Category { String name; @@ -13,6 +14,24 @@ class Category { }); } +Future>> getCategoriesList() async { + //TODO: Return a list of [String, String] where {1} is categoryName and {2} is categoryValue for request + var categoriesList = List(); + + var categories = await getCategories(); + + categories.forEach((thisCategory) { + var thisMap = new DropdownMenuItem( + child: new Text(thisCategory.name), + value: thisCategory.index, + ); + + categoriesList.add(thisMap); + }); + + return categoriesList; +} + Future> getCategories() async { // confusing name const url = "https://dev.peartrade.org/api/search/category"; var token; diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index 68cc339..8ad1fdf 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -4,6 +4,7 @@ import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import 'package:local_spend/common/functions/get_token.dart'; + class Organisation { var id = 0; var name = ""; @@ -11,40 +12,22 @@ class Organisation { var streetName = ""; //street_name var town = ""; - Organisation(int id, String name, String postcode, String streetName, String town) { - this.id = id; - this.name = name; - this.postcode = postcode; - this.streetName = streetName; //street_name - this.town = town; - } + Organisation( + this.id, + this.name, + this.postcode, + this.streetName, + this.town, + ); } List jsonToOrganisations(String json) { Map decoded = jsonDecode(json); -// print(decoded); - List validated = decoded['validated']; -// Map organisation = validated[0]; -// -// print(""); -// print("Response:"); -// for (var i = 0; i < validated.length; i++) { -// print(validated[i]); -// } - List organisationsMaps = new List(); - validated.forEach((element) => organisationsMaps.add(element)); - -// print(""); -// print("organisationsMaps:"); -// print(organisationsMaps); - List organisations = new List(); - -// organisationsMaps[0].forEach((k,v) => print('${k}: ${v}')); for (var i = 0; i < organisationsMaps.length; i++) { final params = organisationsMaps[i].values.toList(); @@ -60,17 +43,6 @@ List jsonToOrganisations(String json) { organisations.add(newOrganisation); } - // the reason some organizations do not show up is because they are not all validated - // option to 'show unvalidated' should be added along with maybe a settings section -// -// print(""); -// print("Local:"); -// for (var i = 0; i < organisations.length; i++) -// { -// print(organisations[i].name); -// } -// print(""); - return organisations; } @@ -92,8 +64,6 @@ Future> findOrganisations(String search) async { body: json.encode(body), ); -// print(response.body); - if (response.statusCode == 200) { //request successful return jsonToOrganisations(response.body); diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart new file mode 100644 index 0000000..ab000ac --- /dev/null +++ b/lib/common/widgets/organisations_dialog.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'dart:async'; + +import 'package:local_spend/common/apifunctions/find_organisations.dart'; + +class FindOrganisations { + + TextField getSearchBar(TextEditingController controller, String hintText) { + return TextField( + controller: controller, + decoration: InputDecoration( + hintText: hintText, + icon: Icon(Icons.search), + ), + ); + } + + List getStuff() { + var numItems = 200; + var itemsList = new List(); + + for (int i = 0; i < numItems; i++) { + itemsList.add(Text( + "Payee " + (i + 1).toString(), + style: new TextStyle(fontSize: 18), + )); + } + + return itemsList; + } + + Future dialog(context) { + var searchBar = getSearchBar(null, "Payee Name"); + var stuff = getStuff(); + return showDialog( + context: context, + barrierDismissible: true, + + builder: (BuildContext context) { + return SimpleDialog( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 10), + child: searchBar, + ), + + Container( + padding: EdgeInsets.all(10), + width: MediaQuery.of(context).size.width * 0.7, + height: MediaQuery.of(context).size.height * 0.7, + + child: Material( + shadowColor: Colors.transparent, + color: Colors.transparent, + child: ListView.builder( + itemCount: stuff.length, + itemBuilder: (context, index) { + return Card( + child: ListTile( + leading: Icon(Icons.person), + title: stuff[index], + trailing: Icon(Icons.arrow_forward_ios), + ) + ); + }, + ), + ), + ), + + + // help button for if org not listed + // cancel and ok buttons + + ], + ); + }, + ); + } +} \ No newline at end of file diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 208c5fa..f58c4db 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -2,17 +2,27 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:intl/intl.dart'; import 'package:flutter/cupertino.dart'; +import 'package:local_spend/common/apifunctions/find_organisations.dart'; +import 'package:local_spend/common/widgets/organisations_dialog.dart'; class Transaction { DateTime date; - double amount; - + TextEditingController amount; + Organisation organisation; + Transaction( this.date, this.amount, + this.organisation, ); } +// Find Organisations + + + +// end Find Organisations + class ReceiptPage2 extends StatefulWidget { @override State createState() { @@ -21,7 +31,11 @@ class ReceiptPage2 extends StatefulWidget { } class ReceiptPage2State extends State { - Transaction transaction = new Transaction(DateTime.now(), 0); + Transaction transaction = new Transaction( + DateTime.now(), + new TextEditingController(), + new Organisation(null, null, null, null, null), + ); @override Widget build(BuildContext context) { @@ -116,6 +130,50 @@ class ReceiptPage2State extends State { ), ), // Date/Time picker + Container( + padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + child: Row( + children: [ + Container( + child : Text( + "Payee", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + width: 110, + ), + + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { +// var popupListView = new PopupListView(); +// var dialog = popupListView.dialog(context, optionsList, "Choose Organization"); + var organisations = new FindOrganisations(); + var orgDialog = organisations.dialog(context); + + orgDialog.then((organisation) { + debugPrint(organisation.name); + }); + }, + child: Text( + transaction.organisation.name == null + ? 'Find' + : transaction.organisation.name, + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, + ), + ), + ], + ), + ), // Organisation picker + Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), child: Row( @@ -136,23 +194,13 @@ class ReceiptPage2State extends State { Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: 32.0, - child: RaisedButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (BuildContext builder) { - return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, - ); - }); - },// onPressed: () => showDatePicker(context: context, initialDate: _transactionDate, firstDate: null, lastDate: _transactionDate), - child: Text( - transaction.amount == null - ? 'None set.' - : "£" + transaction.amount.toString() + "0", - style : TextStyle(color: Colors.white, fontSize: 18.0), + width: 100, + child: TextField( + controller: transaction.amount, + decoration: InputDecoration( + hintText: "£0.00" ), - color: Colors.blue, + keyboardType: TextInputType.number, ), ), ], From 60b1c5b10c1ed1b5bce6c78e59f954b25c626ae7 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 7 Aug 2019 13:22:14 +0100 Subject: [PATCH 056/122] added 'favourites' --- lib/common/widgets/organisations_dialog.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index ab000ac..f175ae4 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -44,6 +44,14 @@ class FindOrganisations { child: searchBar, ), + Container( + padding: EdgeInsets.fromLTRB(20, 20, 0, 0), + child: Text( + "Favourites", + style: new TextStyle(fontSize: 23, fontWeight: FontWeight.bold), + ), + ), + Container( padding: EdgeInsets.all(10), width: MediaQuery.of(context).size.width * 0.7, From aa6de5559a80b54b3936b2a4260fcda681a5d40a Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 7 Aug 2019 14:02:36 +0100 Subject: [PATCH 057/122] more --- lib/common/widgets/organisations_dialog.dart | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index f175ae4..db1a3c9 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -15,7 +15,7 @@ class FindOrganisations { ); } - List getStuff() { + List getFavourites() { var numItems = 200; var itemsList = new List(); @@ -29,9 +29,12 @@ class FindOrganisations { return itemsList; } + // todo: get all organisations, favourites and all data from one 'organisations' class or similar + // eg items: organisations.getFavourites().orderBy(name), + Future dialog(context) { var searchBar = getSearchBar(null, "Payee Name"); - var stuff = getStuff(); + var favourites = getFavourites(); return showDialog( context: context, barrierDismissible: true, @@ -53,21 +56,22 @@ class FindOrganisations { ), Container( - padding: EdgeInsets.all(10), + padding: EdgeInsets.fromLTRB(10, 10, 10, 0), width: MediaQuery.of(context).size.width * 0.7, - height: MediaQuery.of(context).size.height * 0.7, + height: MediaQuery.of(context).size.height * 0.67, child: Material( shadowColor: Colors.transparent, color: Colors.transparent, child: ListView.builder( - itemCount: stuff.length, + itemCount: favourites.length, itemBuilder: (context, index) { return Card( child: ListTile( leading: Icon(Icons.person), - title: stuff[index], + title: favourites[index], trailing: Icon(Icons.arrow_forward_ios), + onTap: () {}, ) ); }, From 1e40d78dcde63d66d20c89069a41ecf525c2f8c0 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 7 Aug 2019 15:32:52 +0100 Subject: [PATCH 058/122] organisations working sorta --- .../apifunctions/find_organisations.dart | 127 ++++++++------- lib/common/widgets/organisations_dialog.dart | 152 +++++++++++------- lib/pages/receipt_page_2.dart | 6 - 3 files changed, 168 insertions(+), 117 deletions(-) diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index 8ad1fdf..e51051e 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -4,7 +4,6 @@ import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import 'package:local_spend/common/functions/get_token.dart'; - class Organisation { var id = 0; var name = ""; @@ -13,67 +12,83 @@ class Organisation { var town = ""; Organisation( - this.id, - this.name, - this.postcode, - this.streetName, - this.town, - ); + this.id, + this.name, + this.postcode, + this.streetName, + this.town, + ); } -List jsonToOrganisations(String json) { - Map decoded = jsonDecode(json); - List validated = decoded['validated']; - List organisationsMaps = new List(); - validated.forEach((element) => organisationsMaps.add(element)); - List organisations = new List(); +class Organisations { - for (var i = 0; i < organisationsMaps.length; i++) { - final params = organisationsMaps[i].values.toList(); + List getTestData() { + var numItems = 200; + var itemsList = new List(); - var newOrganisation = new Organisation( - params[0].toInt(), - params[1].toString(), - params[2].toString(), // oof - params[3].toString(), // this could be improved... - params[4].toString(), + for (int i = 0; i < numItems; i++) { + itemsList.add(new Organisation( + i, + "Payee " + (i + 1).toString(), + "eee eee", + "yeet street", + "Robloxia" + )); + } + + return itemsList; + } + + List _jsonToOrganisations(String json) { + Map decoded = jsonDecode(json); + List validated = decoded['validated']; + List organisationsMaps = new List(); + validated.forEach((element) => organisationsMaps.add(element)); + List organisations = new List(); + + for (var i = 0; i < organisationsMaps.length; i++) { + final params = organisationsMaps[i].values.toList(); + + var newOrganisation = new Organisation( + params[0].toInt(), + params[1].toString(), + params[2].toString(), // oof + params[3].toString(), // this could be improved... + params[4].toString(), + ); + + organisations.add(newOrganisation); + } + + return organisations; + } + + Future> findOrganisations(String search) async { + final url = "https://dev.peartrade.org/api/search"; + var token; + + await getToken().then((result) { + token = result; + }); + + Map body = { + "search_name":search, + "session_key":token, + }; + + final response = await http.post ( + url, + body: json.encode(body), ); - organisations.add(newOrganisation); + if (response.statusCode == 200) { + //request successful + return _jsonToOrganisations(response.body); + } else { + // not successful + return null; + } + } - - return organisations; -} - -Future> findOrganisations(String search) async { - final url = "https://dev.peartrade.org/api/search"; - var token; - - await getToken().then((result) { - token = result; - }); - - Map body = { - "search_name":search, - "session_key":token, - }; - - final response = await http.post ( - url, - body: json.encode(body), - ); - - if (response.statusCode == 200) { - //request successful - return jsonToOrganisations(response.body); - } else { - // not successful - return null; - } - -} - -class OrganizationController extends TextEditingController { - Organisation organisation; } \ No newline at end of file diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index db1a3c9..3939196 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -15,75 +15,117 @@ class FindOrganisations { ); } - List getFavourites() { - var numItems = 200; - var itemsList = new List(); - - for (int i = 0; i < numItems; i++) { - itemsList.add(Text( - "Payee " + (i + 1).toString(), - style: new TextStyle(fontSize: 18), - )); - } - - return itemsList; - } - // todo: get all organisations, favourites and all data from one 'organisations' class or similar // eg items: organisations.getFavourites().orderBy(name), Future dialog(context) { - var searchBar = getSearchBar(null, "Payee Name"); - var favourites = getFavourites(); + TextEditingController searchBarText = new TextEditingController(); + var organisations = new Organisations(); + var listTitle = "All Organisations"; + var organisationsList = organisations.getTestData(); + + void _submitSearch(String search) { + listTitle = "Results for \'" + search + "\'"; + + var futureOrgs = organisations.findOrganisations(search); + futureOrgs.then((val) { + debugPrint("There are " + val.length.toString() + + " payees matching the query \'" + search + "\'."); + organisationsList = val; + }); + } + return showDialog( context: context, barrierDismissible: true, builder: (BuildContext context) { - return SimpleDialog( - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 10), - child: searchBar, - ), + return StatefulBuilder( + builder: (context, setState) { + return SimpleDialog( + children: [ + Padding( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + child: Row( + children: [ + Container( + width: 200, + height: 50, + child: TextField( + controller: searchBarText, + decoration: InputDecoration( + hintText: "Payee Name", + ), + onSubmitted: (_) { + _submitSearch(searchBarText.text); + setState(() => {}); + }, + ), + ), - Container( - padding: EdgeInsets.fromLTRB(20, 20, 0, 0), - child: Text( - "Favourites", - style: new TextStyle(fontSize: 23, fontWeight: FontWeight.bold), - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(10, 10, 10, 0), - width: MediaQuery.of(context).size.width * 0.7, - height: MediaQuery.of(context).size.height * 0.67, - - child: Material( - shadowColor: Colors.transparent, - color: Colors.transparent, - child: ListView.builder( - itemCount: favourites.length, - itemBuilder: (context, index) { - return Card( - child: ListTile( - leading: Icon(Icons.person), - title: favourites[index], - trailing: Icon(Icons.arrow_forward_ios), - onTap: () {}, - ) - ); - }, + Container( + width: 80, + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + child: RaisedButton( + onPressed: () { + _submitSearch(searchBarText.text); + setState(() => {}); + }, + child: Icon(Icons.search, color: Colors.white), + color: Colors.blue, + // make inactive when search in progress as activity indicator + ), + ), + ], + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(20, 20, 20, 0), + child: Text( + listTitle, + style: new TextStyle( + fontSize: 23, fontWeight: FontWeight.bold), + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(10, 10, 10, 0), + width: MediaQuery + .of(context) + .size + .width * 0.7, + height: MediaQuery + .of(context) + .size + .height * 0.67, + + child: Material( + shadowColor: Colors.transparent, + color: Colors.transparent, + child: ListView.builder( + itemCount: organisationsList.length, + itemBuilder: (context, index) { + return Card( + child: ListTile( + leading: Icon(Icons.person), + title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), + trailing: Icon(Icons.arrow_forward_ios), + onTap: () {}, + ) + ); + }, + ), + ), ), - ), - ), - // help button for if org not listed - // cancel and ok buttons + // help button for if org not listed + // cancel and ok buttons - ], + ], + ); + }, ); }, ); diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index f58c4db..226e11a 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -17,12 +17,6 @@ class Transaction { ); } -// Find Organisations - - - -// end Find Organisations - class ReceiptPage2 extends StatefulWidget { @override State createState() { From 3dba00b0b6d6ada5ea098a06fbd8f296a8a3f97e Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 8 Aug 2019 15:25:43 +0100 Subject: [PATCH 059/122] literally nothing --- .../apifunctions/find_organisations.dart | 2 +- lib/pages/receipt_page_2.dart | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index e51051e..4d441a3 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -24,7 +24,7 @@ class Organisation { class Organisations { List getTestData() { - var numItems = 200; + var numItems = 10; var itemsList = new List(); for (int i = 0; i < numItems; i++) { diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 226e11a..0970062 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -36,16 +36,16 @@ class ReceiptPage2State extends State { return PlatformScaffold( appBar: AppBar( - backgroundColor: Colors.blue[400], - title: Text( - "Submit Receipt", - style: TextStyle( - fontSize: 20, - color: Colors.white, + backgroundColor: Colors.blue[400], + title: Text( + "Submit Receipt", + style: TextStyle( + fontSize: 20, + color: Colors.white, + ), ), - ), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), ), body: ListView( @@ -107,7 +107,7 @@ class ReceiptPage2State extends State { ), ); }); - },// onPressed: () => showDatePicker(context: context, initialDate: _transactionDate, firstDate: null, lastDate: _transactionDate), + }, child: Text( transaction.date == null ? 'None set.' From 0996a1e25268512cbc8855edfd3d0dd9277038b3 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 9 Aug 2019 14:32:47 +0100 Subject: [PATCH 060/122] organisations dialog improved --- lib/common/widgets/organisations_dialog.dart | 47 +++++++++++++------- lib/pages/receipt_page_2.dart | 2 +- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 3939196..91ddd34 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -19,19 +19,22 @@ class FindOrganisations { // eg items: organisations.getFavourites().orderBy(name), Future dialog(context) { + bool _searchEnabled = false; TextEditingController searchBarText = new TextEditingController(); var organisations = new Organisations(); var listTitle = "All Organisations"; var organisationsList = organisations.getTestData(); - void _submitSearch(String search) { + void _submitSearch(String search) async { + _searchEnabled = false; listTitle = "Results for \'" + search + "\'"; var futureOrgs = organisations.findOrganisations(search); - futureOrgs.then((val) { - debugPrint("There are " + val.length.toString() + + futureOrgs.then((value) { + debugPrint("There are " + value.length.toString() + " payees matching the query \'" + search + "\'."); - organisationsList = val; + organisationsList = value; + _searchEnabled = true; }); } @@ -49,31 +52,45 @@ class FindOrganisations { child: Row( children: [ Container( - width: 200, + width: 140, height: 50, child: TextField( controller: searchBarText, decoration: InputDecoration( hintText: "Payee Name", ), - onSubmitted: (_) { - _submitSearch(searchBarText.text); + onChanged: (value) { + if (value.length > 0) { + _searchEnabled = true; + } else { + _searchEnabled = false; + } setState(() => {}); }, + onSubmitted: (value) { + if (_searchEnabled) { + _submitSearch(searchBarText.text); + setState(() => {}); + } + }, ), ), Container( width: 80, padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - child: RaisedButton( - onPressed: () { - _submitSearch(searchBarText.text); - setState(() => {}); - }, - child: Icon(Icons.search, color: Colors.white), - color: Colors.blue, - // make inactive when search in progress as activity indicator + child: IgnorePointer( + ignoring: _searchEnabled, + child: RaisedButton( + onPressed: () { + _submitSearch(searchBarText.text); + setState(() => {}); + }, + + child: Icon(Icons.search, color: Colors.white), + color: _searchEnabled ? Colors.blue : Colors.blue[200], + // make inactive when search in progress as activity indicator + ), ), ), ], diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 0970062..1a52946 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -149,8 +149,8 @@ class ReceiptPage2State extends State { // var dialog = popupListView.dialog(context, optionsList, "Choose Organization"); var organisations = new FindOrganisations(); var orgDialog = organisations.dialog(context); - orgDialog.then((organisation) { + setState(() => {}); debugPrint(organisation.name); }); }, From fa481f839d01f79ab49f29ac5b3967dd0916a1bc Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 9 Aug 2019 16:45:58 +0100 Subject: [PATCH 061/122] fixed number keyboard (also looking into UI fixes) --- lib/pages/receipt_page_2.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 1a52946..7f45d6e 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -194,7 +194,7 @@ class ReceiptPage2State extends State { decoration: InputDecoration( hintText: "£0.00" ), - keyboardType: TextInputType.number, + keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true), ), ), ], From 679fbd2f975c81a3dab2423952a970b763a2632e Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 10:15:36 +0100 Subject: [PATCH 062/122] async organisations dialog works now --- lib/common/widgets/organisations_dialog.dart | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 91ddd34..ab8f374 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -25,17 +25,18 @@ class FindOrganisations { var listTitle = "All Organisations"; var organisationsList = organisations.getTestData(); - void _submitSearch(String search) async { + Future _submitSearch(String search) async { _searchEnabled = false; listTitle = "Results for \'" + search + "\'"; - var futureOrgs = organisations.findOrganisations(search); - futureOrgs.then((value) { - debugPrint("There are " + value.length.toString() + + var futureOrgs = await organisations.findOrganisations(search); +// futureOrgs.then((value) { + debugPrint("There are " + futureOrgs.length.toString() + " payees matching the query \'" + search + "\'."); - organisationsList = value; + organisationsList = futureOrgs; _searchEnabled = true; - }); + return futureOrgs.length; +// }); } return showDialog( @@ -69,8 +70,10 @@ class FindOrganisations { }, onSubmitted: (value) { if (_searchEnabled) { - _submitSearch(searchBarText.text); - setState(() => {}); + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() {}); + }); } }, ), From 2218422df4181403a111938f931c5c701d277e39 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 10:33:02 +0100 Subject: [PATCH 063/122] new organisation dialog submitting started --- .../apifunctions/find_organisations.dart | 2 +- lib/common/widgets/organisations_dialog.dart | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index 4d441a3..772f37a 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -31,7 +31,7 @@ class Organisations { itemsList.add(new Organisation( i, "Payee " + (i + 1).toString(), - "eee eee", + "tee hee hee", "yeet street", "Robloxia" )); diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index ab8f374..2134fb7 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -39,6 +39,10 @@ class FindOrganisations { // }); } + _chosenOrg(Organisation chosen) { + debugPrint(chosen.name + " tapped"); + } + return showDialog( context: context, barrierDismissible: true, @@ -114,7 +118,7 @@ class FindOrganisations { width: MediaQuery .of(context) .size - .width * 0.7, + .width, height: MediaQuery .of(context) .size @@ -127,12 +131,20 @@ class FindOrganisations { itemCount: organisationsList.length, itemBuilder: (context, index) { return Card( - child: ListTile( - leading: Icon(Icons.person), - title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), - trailing: Icon(Icons.arrow_forward_ios), - onTap: () {}, - ) + child: ListTile( + leading: Icon(Icons.person), + title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), + subtitle: Text(organisationsList[index].postcode.toUpperCase()), +// trailing: Icon(Icons.arrow_forward_ios), +// onTap: _chosenOrg(organisationsList[index]), + onTap: (){ + _chosenOrg(organisationsList[index]); + }, + onLongPress: (){ + // show more details about the organisation in a new dialog + + }, + ), ); }, ), From 9cba3e037ca459596827f355c8228c1e5822407e Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 10:42:17 +0100 Subject: [PATCH 064/122] safer code --- lib/common/widgets/organisations_dialog.dart | 3 ++- lib/pages/receipt_page_2.dart | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 2134fb7..9c265c3 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -23,7 +23,8 @@ class FindOrganisations { TextEditingController searchBarText = new TextEditingController(); var organisations = new Organisations(); var listTitle = "All Organisations"; - var organisationsList = organisations.getTestData(); +// var organisationsList = organisations.getTestData(); + var organisationsList = List(); Future _submitSearch(String search) async { _searchEnabled = false; diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 7f45d6e..2bee870 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -150,8 +150,11 @@ class ReceiptPage2State extends State { var organisations = new FindOrganisations(); var orgDialog = organisations.dialog(context); orgDialog.then((organisation) { - setState(() => {}); - debugPrint(organisation.name); + try { + debugPrint(organisation.name); + } catch(_) { + debugPrint("No organisation chosen."); + } }); }, child: Text( From ee682eef82a4916323ea336e6279388ee038e27a Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 10:48:50 +0100 Subject: [PATCH 065/122] new organisation picker -actually- works now --- lib/common/widgets/organisations_dialog.dart | 7 ++++--- lib/pages/receipt_page_2.dart | 9 +++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 9c265c3..94e4180 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -32,8 +32,8 @@ class FindOrganisations { var futureOrgs = await organisations.findOrganisations(search); // futureOrgs.then((value) { - debugPrint("There are " + futureOrgs.length.toString() + - " payees matching the query \'" + search + "\'."); +// debugPrint("There are " + futureOrgs.length.toString() + +// " payees matching the query \'" + search + "\'."); organisationsList = futureOrgs; _searchEnabled = true; return futureOrgs.length; @@ -41,7 +41,7 @@ class FindOrganisations { } _chosenOrg(Organisation chosen) { - debugPrint(chosen.name + " tapped"); +// debugPrint(chosen.name + " tapped"); } return showDialog( @@ -139,6 +139,7 @@ class FindOrganisations { // trailing: Icon(Icons.arrow_forward_ios), // onTap: _chosenOrg(organisationsList[index]), onTap: (){ + Navigator.of(context).pop(organisationsList[index]); _chosenOrg(organisationsList[index]); }, onLongPress: (){ diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 2bee870..1cce097 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -151,7 +151,10 @@ class ReceiptPage2State extends State { var orgDialog = organisations.dialog(context); orgDialog.then((organisation) { try { - debugPrint(organisation.name); + organisation.name.length; + transaction.organisation = organisation; +// debugPrint(organisation.name); + setState(() {}); } catch(_) { debugPrint("No organisation chosen."); } @@ -160,7 +163,9 @@ class ReceiptPage2State extends State { child: Text( transaction.organisation.name == null ? 'Find' - : transaction.organisation.name, + : transaction.organisation.name.length > 14 + ? transaction.organisation.name.substring(0,12) + "..." + : transaction.organisation.name, style: TextStyle(color: Colors.white, fontSize: 18.0), ), From 4e67bfbbec56a126ce09d5180e097bb8c87c5a12 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 11:19:37 +0100 Subject: [PATCH 066/122] 'Recurring' and 'Category' added --- lib/pages/receipt_page_2.dart | 164 +++++++++++++++++++++++++++++++++- 1 file changed, 161 insertions(+), 3 deletions(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 1cce097..55ab2d2 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -9,11 +9,17 @@ class Transaction { DateTime date; TextEditingController amount; Organisation organisation; + String recurring; + bool isEssential; + String category; Transaction( this.date, this.amount, this.organisation, + this.recurring, + this.isEssential, + this.category, ); } @@ -29,10 +35,29 @@ class ReceiptPage2State extends State { DateTime.now(), new TextEditingController(), new Organisation(null, null, null, null, null), + "None", + false, + "Uncategorised", ); - + + List _sampleRecurringOptions = new List(7); + List _sampleCategories = new List(4); + @override Widget build(BuildContext context) { + _sampleRecurringOptions[0] = "None"; + _sampleRecurringOptions[1] = "Daily"; + _sampleRecurringOptions[2] = "Weekly"; + _sampleRecurringOptions[3] = "Fortnightly"; + _sampleRecurringOptions[4] = "Monthly"; + _sampleRecurringOptions[5] = "Quarterly"; + _sampleRecurringOptions[6] = "Yearly"; // these will be difficult to fetch from server as they are coded into the site's rather than fetched + + _sampleCategories[0] = "Uncategorised"; + _sampleCategories[1] = "Cheese"; + _sampleCategories[2] = "Fish"; + _sampleCategories[3] = "Music"; + return PlatformScaffold( appBar: AppBar( @@ -110,7 +135,7 @@ class ReceiptPage2State extends State { }, child: Text( transaction.date == null - ? 'None set.' + ? 'None set' : transaction.date.year == DateTime.now().year ? '${new DateFormat.MMMd().format(transaction.date)}' + ", " + '${new DateFormat.Hm().format(transaction.date)}' : '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + ", " + '${new DateFormat.Hm().format(transaction.date)}', @@ -176,6 +201,139 @@ class ReceiptPage2State extends State { ), ), // Organisation picker + Container( + padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + child: Row( + children: [ + Container( + child : Text( + "Recurring", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + width: 110, + ), + + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + child: CupertinoPicker( + backgroundColor: Colors.white, + children: _sampleRecurringOptions.map((thisOption) => Text(thisOption)).toList(), + onSelectedItemChanged: ((newValue) { + transaction.recurring = _sampleRecurringOptions[newValue]; + setState(() {}); + }), + itemExtent: 32, + ), + ); + }); + }, + child: Text( + transaction.recurring == null + ? 'None' + : transaction.recurring, + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, + ), + ), + ], + ), + ), // Recurring picker + + Container( + padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + child: Row( + children: [ + Container( + child : Text( + "Category", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + width: 110, + ), + + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + child: CupertinoPicker( + backgroundColor: Colors.white, + children: _sampleCategories.map((thisOption) => Text(thisOption)).toList(), + onSelectedItemChanged: ((newValue) { + transaction.category = _sampleCategories[newValue]; + setState(() {}); + }), + itemExtent: 32, + ), + ); + }); + }, + child: Text( + transaction.category == null + ? 'None' + : transaction.category, + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, + ), + ), + ], + ), + ), // Category picker + + Container( + padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + child: Row( + children: [ + Container( + child : Text( + "Essential", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + width: 95, + ), + + Container( + height: 32.0, + child: Checkbox( + value: transaction.isEssential, + onChanged: ((value) { + setState(() => transaction.isEssential = value); + }), + ), + ), + ], + ), + ), // Essential + Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), child: Row( @@ -200,7 +358,7 @@ class ReceiptPage2State extends State { child: TextField( controller: transaction.amount, decoration: InputDecoration( - hintText: "£0.00" + hintText: "0.00" ), keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true), ), From 405a037a1506e0d2196e50d6126bf543c7406305 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 11:37:59 +0100 Subject: [PATCH 067/122] uploading receipt --- .../apifunctions/find_organisations.dart | 13 ++-- .../apifunctions/submit_receipt_api.dart | 7 +- lib/pages/receipt_page_2.dart | 66 +++++++++++++++++++ 3 files changed, 75 insertions(+), 11 deletions(-) diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index 772f37a..aa66ef9 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -12,13 +12,12 @@ class Organisation { var town = ""; Organisation( - this.id, - this.name, - this.postcode, - this.streetName, - this.town, - ); - + this.id, + this.name, + this.postcode, + this.streetName, + this.town, + ); } class Organisations { diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 96570b2..9dbb338 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -37,26 +37,25 @@ Future submitReceiptAPI( 'recurring': receipt.recurring, 'street_name': receipt.street, 'postcode': receipt.postcode, - 'town': receipt.town, 'session_key': preferences.get('LastToken'), }; // debugPrint('$body'); -// debugPrint(json.encode(body)); + debugPrint(json.encode(body)); final response = await http.post( url, body: json.encode(body), ); -// debugPrint(response.body); + debugPrint(response.body); if (response.statusCode == 200) { final responseJson = json.decode(response.body); -// print(responseJson[0]); + print(responseJson[0]); showDialogSingleButton( context, diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 55ab2d2..f23be12 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -4,6 +4,7 @@ import 'package:intl/intl.dart'; import 'package:flutter/cupertino.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; import 'package:local_spend/common/widgets/organisations_dialog.dart'; +import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; class Transaction { DateTime date; @@ -40,6 +41,33 @@ class ReceiptPage2State extends State { "Uncategorised", ); + _submitReceipt(Transaction transaction) { + DateTime dt = new DateTime.now(); + // sample transaction: + // { + // "transaction_type":1, + // "transaction_value":33, + // "purchase_time":"2019-08-12T11:06:00.000+01:00", + // "organisation_id":59661, + // "essential":false, + // "session_key":"C438432A-B775-11E9-8EE8-147589E69626" + // } + + Receipt receipt = new Receipt(); + receipt.organisationName = transaction.organisation.name; + receipt.street = transaction.organisation.streetName; + receipt.postcode = transaction.organisation.postcode; + receipt.town = transaction.organisation.town; + receipt.recurring = transaction.recurring; + receipt.category = transaction.category; + receipt.amount = transaction.amount.text.toString(); + receipt.time = DateFormat("yyyy-MM-dd'T'hh:mm':00.000+01:00'").format(transaction.date).toString(); + receipt.essential = transaction.isEssential.toString(); +// receipt.time = dt.format(transaction.date); + + submitReceiptAPI(context, receipt); + } + List _sampleRecurringOptions = new List(7); List _sampleCategories = new List(4); @@ -367,6 +395,44 @@ class ReceiptPage2State extends State { ), ), // Amount picker + Padding( + padding: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + try { + _submitReceipt(transaction); + } + catch (_) { + showDialog( + context: context, + builder: (BuildContext context) { + // return object of type Dialog + return AlertDialog( + title: new Text("Invalid data"), + content: new Text( + "We couldn't process your request because some of the data entered is invalid."), + actions: [ + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + }, + child: Text("GO", + style: + TextStyle(color: Colors.white, fontSize: 22.0)), + color: Colors.blue, + ), + ), + ), ], ), ); From a7db1c528b7b0dae4ba65224fea6618b61d57bf4 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 11:54:13 +0100 Subject: [PATCH 068/122] making uploads safe --- lib/common/apifunctions/submit_receipt_api.dart | 3 ++- lib/pages/receipt_page_2.dart | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 9dbb338..9093cbc 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -31,7 +31,8 @@ Future submitReceiptAPI( 'transaction_type' : "3", 'transaction_value': receipt.amount, 'purchase_time': receipt.time, - 'category': receipt.category, +// 'category': receipt.category, +// 'category': receipt.category, 'essential': receipt.essential, 'organisation_name': receipt.organisationName, 'recurring': receipt.recurring, diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index f23be12..67de152 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -59,11 +59,15 @@ class ReceiptPage2State extends State { receipt.postcode = transaction.organisation.postcode; receipt.town = transaction.organisation.town; receipt.recurring = transaction.recurring; + + if (transaction.recurring == "None") { + receipt.recurring = ""; + } + receipt.category = transaction.category; receipt.amount = transaction.amount.text.toString(); receipt.time = DateFormat("yyyy-MM-dd'T'hh:mm':00.000+01:00'").format(transaction.date).toString(); receipt.essential = transaction.isEssential.toString(); -// receipt.time = dt.format(transaction.date); submitReceiptAPI(context, receipt); } From fc2add563699fe6ce9fddd920c16f88a69383439 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 12:09:04 +0100 Subject: [PATCH 069/122] implementing categories submit --- lib/common/apifunctions/categories.dart | 35 ++----------------- .../apifunctions/submit_receipt_api.dart | 3 +- lib/common/widgets/future_dropdownmenu.dart | 25 ------------- lib/pages/receipt_page_2.dart | 28 ++++++++++----- 4 files changed, 24 insertions(+), 67 deletions(-) delete mode 100644 lib/common/widgets/future_dropdownmenu.dart diff --git a/lib/common/apifunctions/categories.dart b/lib/common/apifunctions/categories.dart index dc537ab..b00cc75 100644 --- a/lib/common/apifunctions/categories.dart +++ b/lib/common/apifunctions/categories.dart @@ -4,35 +4,7 @@ import 'package:http/http.dart' as http; import 'package:local_spend/common/functions/get_token.dart'; import 'package:flutter/material.dart'; -class Category { - String name; - String index; - - Category({ - this.name, - this.index, - }); -} - -Future>> getCategoriesList() async { - //TODO: Return a list of [String, String] where {1} is categoryName and {2} is categoryValue for request - var categoriesList = List(); - - var categories = await getCategories(); - - categories.forEach((thisCategory) { - var thisMap = new DropdownMenuItem( - child: new Text(thisCategory.name), - value: thisCategory.index, - ); - - categoriesList.add(thisMap); - }); - - return categoriesList; -} - -Future> getCategories() async { // confusing name +Future> getCategories() async { const url = "https://dev.peartrade.org/api/search/category"; var token; @@ -53,7 +25,7 @@ Future> getCategories() async { // confusing name if (response.statusCode == 200) { //request successful - List categories = new List(); + List categories = new List(); Map responseMap = json.decode(response.body); var categoriesJSON = responseMap['categories']; @@ -70,8 +42,7 @@ Future> getCategories() async { // confusing name if (categoriesJSON[i.toString()] != null) { // print("Iteration " + i.toString()); // print(categoriesJSON[i.toString()]); - categories.add(new Category( - name: categoriesJSON[i.toString()], index: i.toString())); + categories.add(categoriesJSON[i.toString()]); // print(categories.last); i++; } else { diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 9093cbc..9dbb338 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -31,8 +31,7 @@ Future submitReceiptAPI( 'transaction_type' : "3", 'transaction_value': receipt.amount, 'purchase_time': receipt.time, -// 'category': receipt.category, -// 'category': receipt.category, + 'category': receipt.category, 'essential': receipt.essential, 'organisation_name': receipt.organisationName, 'recurring': receipt.recurring, diff --git a/lib/common/widgets/future_dropdownmenu.dart b/lib/common/widgets/future_dropdownmenu.dart deleted file mode 100644 index 85573fb..0000000 --- a/lib/common/widgets/future_dropdownmenu.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:local_spend/common/apifunctions/categories.dart'; -import 'dart:async'; - -Future> getDropDownItems(String type) async { - List> items = new List>(); - -// if (type == "categories") { - var categories = await getCategories(); - - categories.forEach((thisValue) { - items.add( - new DropdownMenuItem( - child: new Text(thisValue.name), - value: thisValue.index, - key: Key(thisValue.index), - ), - ); - }); - - print("oof"); - - return items; -// } -} diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 67de152..f63b8ab 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -1,10 +1,12 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:intl/intl.dart'; +import 'dart:core'; import 'package:flutter/cupertino.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; import 'package:local_spend/common/widgets/organisations_dialog.dart'; import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; +import 'package:local_spend/common/apifunctions/categories.dart'; class Transaction { DateTime date; @@ -40,6 +42,10 @@ class ReceiptPage2State extends State { false, "Uncategorised", ); + + Future> getCats() async { + return await getCategories(); + } _submitReceipt(Transaction transaction) { DateTime dt = new DateTime.now(); @@ -64,6 +70,7 @@ class ReceiptPage2State extends State { receipt.recurring = ""; } + print("Category: " + transaction.category); receipt.category = transaction.category; receipt.amount = transaction.amount.text.toString(); receipt.time = DateFormat("yyyy-MM-dd'T'hh:mm':00.000+01:00'").format(transaction.date).toString(); @@ -73,10 +80,20 @@ class ReceiptPage2State extends State { } List _sampleRecurringOptions = new List(7); - List _sampleCategories = new List(4); @override Widget build(BuildContext context) { + + Future> _futureCats = getCats(); + List _categories = new List(); + _categories.add("Fetching categories..."); + + _futureCats.then((value) { + _categories = null; + _categories = value; + setState(() {}); + }); + _sampleRecurringOptions[0] = "None"; _sampleRecurringOptions[1] = "Daily"; _sampleRecurringOptions[2] = "Weekly"; @@ -85,11 +102,6 @@ class ReceiptPage2State extends State { _sampleRecurringOptions[5] = "Quarterly"; _sampleRecurringOptions[6] = "Yearly"; // these will be difficult to fetch from server as they are coded into the site's rather than fetched - _sampleCategories[0] = "Uncategorised"; - _sampleCategories[1] = "Cheese"; - _sampleCategories[2] = "Fish"; - _sampleCategories[3] = "Music"; - return PlatformScaffold( appBar: AppBar( @@ -313,9 +325,9 @@ class ReceiptPage2State extends State { height: MediaQuery.of(context).copyWith().size.height / 3, child: CupertinoPicker( backgroundColor: Colors.white, - children: _sampleCategories.map((thisOption) => Text(thisOption)).toList(), + children: _categories.map((thisOption) => Text(thisOption)).toList(), onSelectedItemChanged: ((newValue) { - transaction.category = _sampleCategories[newValue]; + transaction.category = _categories[newValue]; setState(() {}); }), itemExtent: 32, From 7d30a8fc94098d8a88518c9d7b11eff4bd06266b Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 12:29:49 +0100 Subject: [PATCH 070/122] receipt submits are now safe --- lib/pages/receipt_page_2.dart | 70 ++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index f63b8ab..82e1331 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -42,7 +42,23 @@ class ReceiptPage2State extends State { false, "Uncategorised", ); - + + _invalidDialog(context) { + return AlertDialog( + title: new Text("Invalid data"), + content: new Text( + "We couldn't process your request because some of the data entered is invalid."), + actions: [ + new FlatButton( + child: new Text("OK"), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + } + Future> getCats() async { return await getCategories(); } @@ -64,14 +80,19 @@ class ReceiptPage2State extends State { receipt.street = transaction.organisation.streetName; receipt.postcode = transaction.organisation.postcode; receipt.town = transaction.organisation.town; + receipt.recurring = transaction.recurring; if (transaction.recurring == "None") { receipt.recurring = ""; } - print("Category: " + transaction.category); receipt.category = transaction.category; + + if (transaction.category == "Uncategorised") { + receipt.category = ""; + } + receipt.amount = transaction.amount.text.toString(); receipt.time = DateFormat("yyyy-MM-dd'T'hh:mm':00.000+01:00'").format(transaction.date).toString(); receipt.essential = transaction.isEssential.toString(); @@ -418,27 +439,40 @@ class ReceiptPage2State extends State { child: RaisedButton( onPressed: () { try { - _submitReceipt(transaction); + /* + DateTime.now(), + new TextEditingController(), + new Organisation(null, null, null, null, null), + "None", + false, + "Uncategorised", + */ + if (transaction.amount.text == "" || transaction.organisation.name == null) { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } else { + if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { + _submitReceipt(transaction); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } + } } catch (_) { showDialog( context: context, builder: (BuildContext context) { - // return object of type Dialog - return AlertDialog( - title: new Text("Invalid data"), - content: new Text( - "We couldn't process your request because some of the data entered is invalid."), - actions: [ - new FlatButton( - child: new Text("OK"), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, + return _invalidDialog(context); + } ); } }, From cb75f1ff8747df36e05fab2c1ea2697503a9b1f2 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 15:17:50 +0100 Subject: [PATCH 071/122] general fixes, login behaves slightly better --- lib/common/widgets/organisations_dialog.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 94e4180..9666b96 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -91,8 +91,13 @@ class FindOrganisations { ignoring: _searchEnabled, child: RaisedButton( onPressed: () { - _submitSearch(searchBarText.text); - setState(() => {}); + if (_searchEnabled) { + var result = _submitSearch( + searchBarText.text); + result.then((_) { + setState(() {}); + }); + } }, child: Icon(Icons.search, color: Colors.white), From 3060a6d1f9bac306db3d1acc99758161034b6131 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 15:18:01 +0100 Subject: [PATCH 072/122] forgot to stage all the changes... --- ios/Podfile.lock | 4 +-- ios/Runner.xcodeproj/project.pbxproj | 2 +- .../apifunctions/request_login_api.dart | 27 +++++++++++--- lib/common/widgets/organisations_dialog.dart | 33 ++++++++--------- lib/pages/login_page.dart | 36 +++++++++++-------- lib/pages/receipt_page_2.dart | 16 +++------ 6 files changed, 65 insertions(+), 53 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4e1203..8132310 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5b4844c..a0f8e33 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 2361c67..27d3bdc 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -7,6 +7,27 @@ import 'package:local_spend/common/functions/save_current_login.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; +Future _incorrectDialog(BuildContext context) async { + return showDialog( + context: context, + barrierDismissible: true, + builder: (BuildContext context) { + return AlertDialog( + title: Text("Unable to Login"), + content: Text("Incorrect login details. Please try again."), + actions: [ + FlatButton( + child: Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); +} + Future requestLoginAPI( BuildContext context, String email, String password) async { //var apiUrl = ConfigWrapper.of(context).apiKey; @@ -41,11 +62,7 @@ Future requestLoginAPI( saveCurrentLogin(responseJson, body["email"]); - showDialogSingleButton( - context, - "Unable to Login", - "You may have supplied an invalid 'Email' / 'Password' combination. Please try again or email an administrator.", - "OK"); + _incorrectDialog(context); return null; } diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 9666b96..3c35499 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -71,9 +71,9 @@ class FindOrganisations { } else { _searchEnabled = false; } - setState(() => {}); + setState(() => {_searchEnabled}); }, - onSubmitted: (value) { + onSubmitted: (_) { if (_searchEnabled) { var result = _submitSearch(searchBarText.text); result.then((_) { @@ -87,23 +87,20 @@ class FindOrganisations { Container( width: 80, padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - child: IgnorePointer( - ignoring: _searchEnabled, - child: RaisedButton( - onPressed: () { - if (_searchEnabled) { - var result = _submitSearch( - searchBarText.text); - result.then((_) { - setState(() {}); - }); - } - }, - child: Icon(Icons.search, color: Colors.white), - color: _searchEnabled ? Colors.blue : Colors.blue[200], - // make inactive when search in progress as activity indicator - ), + child: RaisedButton( + onPressed: (() { + if (_searchEnabled) { + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() {}); + }); + } + }), + + child: Icon(Icons.search, color: Colors.white), + color: _searchEnabled ? Colors.blue : Colors.blue[200], + // make inactive when search in progress as activity indicator ), ), ], diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 74f7b95..fc42e52 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -109,12 +109,13 @@ class LoginPageState extends State { body: Container( decoration: new BoxDecoration( gradient: new LinearGradient( - colors: [Colors.white, Colors.blue[50]], + colors: [Colors.blue[50], Colors.white], stops: [0,1], begin: Alignment.topCenter, end: Alignment.bottomCenter, ), - ), child: Container( + ), + child: Container( margin: EdgeInsets.fromLTRB(60,30,60,0), child: Column( children: [ @@ -178,19 +179,6 @@ class LoginPageState extends State { child : Material( child: new Container( - child : InkWell( - onTap: () => login( _emailController.text, _passwordController.text), - child: new Container( - width: 100, - height: 50, - child: new Center( - child: new Text( - 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), - ), - ), - splashColor: Colors.lightBlueAccent, - ), - decoration: new BoxDecoration( border: new Border.all(color : Colors.transparent, width: 2), borderRadius: BorderRadius.all(Radius.circular(2)), @@ -204,6 +192,24 @@ class LoginPageState extends State { end: Alignment.bottomRight, ), ), + + child : Material( + type: MaterialType.transparency, + + child : InkWell( + onTap: () => login( _emailController.text, _passwordController.text), + child: new Container( + width: 100, + height: 50, + child: new Center( + child: new Text( + 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), + ), + ), + ), + ), + + ), ), ), diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 82e1331..897be0b 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -439,14 +439,6 @@ class ReceiptPage2State extends State { child: RaisedButton( onPressed: () { try { - /* - DateTime.now(), - new TextEditingController(), - new Organisation(null, null, null, null, null), - "None", - false, - "Uncategorised", - */ if (transaction.amount.text == "" || transaction.organisation.name == null) { showDialog( context: context, @@ -459,10 +451,10 @@ class ReceiptPage2State extends State { _submitReceipt(transaction); } else { showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } ); } } From 8bdc413eabc4c41abcd3498eb2ca4a67517af925 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 16:03:00 +0100 Subject: [PATCH 073/122] debugging graphs... it's hard!! --- ios/Podfile.lock | 4 +-- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/apifunctions/get_graph_data.dart | 11 ++++++-- .../apifunctions/submit_receipt_api.dart | 4 +-- lib/pages/stats_page.dart | 25 +++++++++++-------- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8132310..a4e1203 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a0f8e33..5b4844c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 6cabf2a..aea686c 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -7,7 +7,8 @@ import 'package:charts_flutter/flutter.dart' as charts; class GraphData { List data = new List(); - Future> getGraphData(String graphType) async { + Future>> getGraphData(String graphType) async { +// print("called"); /// Graph types: /// - total_last_week /// - avg_spend_last_week @@ -35,6 +36,10 @@ class GraphData { final responseJson = jsonDecode(response.body); final List labels = responseJson['graph']['labels']; final List data = responseJson['graph']['data']; + + for (int i = 0; i < data.length; i++) { +// print(labels[i].toString() + " : " + data[i].toString()); + } // final List bounds = responseJson['graph']['bounds']; // why is this even returned? /* @@ -49,11 +54,13 @@ class GraphData { List timeSeriesSpendList = new List(); for (int i = 0; i < labels.length; i++) { - print(DateTime.parse(labels[i])); +// print(DateTime.parse(labels[i])); timeSeriesSpendList.add(new TimeSeriesSpend(i, DateTime(i))); // timeSeriesSpendList.add(new TimeSeriesSpend(data[i], DateTime.parse(labels[i]))); } +// print(timeSeriesSpendList); + return [ new charts.Series( id: 'Spend', diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 9dbb338..9ea7462 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -50,12 +50,12 @@ Future submitReceiptAPI( body: json.encode(body), ); - debugPrint(response.body); +// debugPrint(response.body); if (response.statusCode == 200) { final responseJson = json.decode(response.body); - print(responseJson[0]); +// print(responseJson[0]); showDialogSingleButton( context, diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index c5be96b..e8a470c 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -30,7 +30,7 @@ class StatsPage extends StatefulWidget { class StatsPageState extends State { GraphData graphData = new GraphData(); - List totalLastWeek; + List> displayedGraphData; @override void initState() { @@ -50,14 +50,15 @@ class StatsPageState extends State { @override Widget build(BuildContext context) { -// if (graphData.data != null) { -// graphData.getGraphData('total_last_week').then((val) { -// totalLastWeek = val; -// setState(() { -// // update view -// }); -// }); -// } + if (graphData.data.length == 0) { + graphData.getGraphData('total_last_week').then((fetchedData) { + displayedGraphData = (fetchedData); + for (int i = 0; i < fetchedData[0].data.length; i++) { + print(fetchedData[0].data[i].time); // this is getting very frustrating + } + setState(() {}); + }); + } return PlatformScaffold( appBar: AppBar( @@ -98,8 +99,10 @@ class StatsPageState extends State { height: 200, // width: 250, - child: new TimeSeries(), -// child: new SimpleTimeSeriesChart(totalLastWeek),//seriesList: List +// child: new TimeSeries(), + child: displayedGraphData != null ? new charts.TimeSeriesChart(displayedGraphData) : Container(), //List> +// child: new charts.TimeSeriesChart(displayedGraphData), +// child: new SimpleTimeSeriesChart(),//seriesList: List ), ], From 2734131f083b71750a67b23711f926b66d870c88 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 12 Aug 2019 16:28:46 +0100 Subject: [PATCH 074/122] fixing weird CupertinoPicker --- lib/pages/receipt_page_2.dart | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 897be0b..e064039 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -101,19 +101,20 @@ class ReceiptPage2State extends State { } List _sampleRecurringOptions = new List(7); + List _categories = new List(); @override Widget build(BuildContext context) { - Future> _futureCats = getCats(); - List _categories = new List(); - _categories.add("Fetching categories..."); - - _futureCats.then((value) { - _categories = null; - _categories = value; - setState(() {}); - }); + if (_categories.length == 0) { + Future> _futureCats = getCats(); + _categories.add("Fetching categories..."); + _futureCats.then((value) { + _categories = null; + _categories = value; + setState(() {}); + }); + } _sampleRecurringOptions[0] = "None"; _sampleRecurringOptions[1] = "Daily"; From 9b34dd370d9aba1f6c135389daa4aa4ced2b6581 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 13 Aug 2019 12:36:10 +0100 Subject: [PATCH 075/122] added More Info dialog on long press of payee --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/widgets/organisations_dialog.dart | 71 ++++++++++++++++++-- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4e1203..8132310 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5b4844c..a0f8e33 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 3c35499..1465aed 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -18,6 +18,69 @@ class FindOrganisations { // todo: get all organisations, favourites and all data from one 'organisations' class or similar // eg items: organisations.getFavourites().orderBy(name), + Future _moreInfoDialog(context, Organisation organisation) { + TextStyle informationTitleStyle = new TextStyle(fontSize: 16); + TextStyle informationStyle = new TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + + return showDialog( + context: context, + barrierDismissible: true, + + builder: (BuildContext context) { + return StatefulBuilder( + builder: (context, setState) { + return SimpleDialog( + children: [ + Container( + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + child: Text( + organisation.name, + style: new TextStyle( + fontSize: 21, fontWeight: FontWeight.bold), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Divider(), + ), + + Container( + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.symmetric(horizontal: 10), + child: Table( +// defaultColumnWidth: FixedColumnWidth(100), + children: [ + TableRow( + children: [ + Text("Street:", style: informationTitleStyle), + Text(organisation.streetName, style: informationStyle), + ], + ), + TableRow( + children: [ + Text("Postcode:", style: informationTitleStyle), + Text(organisation.postcode.toUpperCase(), style: informationStyle), + ], + ), + TableRow( + children: [ + Text("Town:", style: informationTitleStyle), + Text(organisation.town, style: informationStyle), + ], + ), + ], + ), + ), + + ], + ); + }, + ); + }, + ); + } + Future dialog(context) { bool _searchEnabled = false; TextEditingController searchBarText = new TextEditingController(); @@ -40,10 +103,6 @@ class FindOrganisations { // }); } - _chosenOrg(Organisation chosen) { -// debugPrint(chosen.name + " tapped"); - } - return showDialog( context: context, barrierDismissible: true, @@ -142,11 +201,11 @@ class FindOrganisations { // onTap: _chosenOrg(organisationsList[index]), onTap: (){ Navigator.of(context).pop(organisationsList[index]); - _chosenOrg(organisationsList[index]); }, onLongPress: (){ // show more details about the organisation in a new dialog - + var moreInfo = _moreInfoDialog(context, organisationsList[index]); + moreInfo.whenComplete(null); }, ), ); From 41bc2749659ed5cb218dd4389ceefb666ea92796 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 16 Aug 2019 14:21:21 +0100 Subject: [PATCH 076/122] Added message for when the server is down --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- .../apifunctions/request_login_api.dart | 42 +++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8132310..a4e1203 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a0f8e33..5b4844c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 27d3bdc..9cdc0ef 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -7,14 +7,14 @@ import 'package:local_spend/common/functions/save_current_login.dart'; import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; -Future _incorrectDialog(BuildContext context) async { +Future _incorrectDialog(BuildContext context, bool isLoginWrong) async { return showDialog( context: context, barrierDismissible: true, builder: (BuildContext context) { return AlertDialog( title: Text("Unable to Login"), - content: Text("Incorrect login details. Please try again."), + content: Text(isLoginWrong ? "Incorrect login details. Please try again." : "The server is having issues; sorry for the inconvenience. Please try again later."), actions: [ FlatButton( child: Text('OK'), @@ -40,30 +40,30 @@ Future requestLoginAPI( // debugPrint('$body'); - final response = await http.post( - url, - body: json.encode(body), - ); + try { + final response = await http.post( + url, + body: json.encode(body), + ); -// debugPrint(response.body); + if (response.statusCode == 200) { + final responseJson = json.decode(response.body); - if (response.statusCode == 200) { - final responseJson = json.decode(response.body); - var user = new LoginModel.fromJson(responseJson); + saveCurrentLogin(responseJson, body["email"]); + Navigator.of(context).pushReplacementNamed('/HomePage'); - saveCurrentLogin(responseJson, body["email"]); - Navigator.of(context).pushReplacementNamed('/HomePage'); + return LoginModel.fromJson(responseJson); + } else { + final responseJson = json.decode(response.body); - return LoginModel.fromJson(responseJson); - } else { -// debugPrint("Invalid, either credentials are wrong or server is down"); + saveCurrentLogin(responseJson, body["email"]); - final responseJson = json.decode(response.body); + _incorrectDialog(context, true); - saveCurrentLogin(responseJson, body["email"]); - - _incorrectDialog(context); - - return null; + return null; + } + } catch (_) { + _incorrectDialog(context, false); } } + From eebc8aeee334dd1c1c619bac2c8675d72bcefdb8 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 16 Aug 2019 14:22:06 +0100 Subject: [PATCH 077/122] nicer error message --- lib/common/apifunctions/request_login_api.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 9cdc0ef..3d3bfcb 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -4,7 +4,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:local_spend/common/functions/save_current_login.dart'; -import 'package:local_spend/common/functions/show_dialog_single_button.dart'; import 'package:local_spend/model/json/login_model.dart'; Future _incorrectDialog(BuildContext context, bool isLoginWrong) async { @@ -14,7 +13,7 @@ Future _incorrectDialog(BuildContext context, bool isLoginWrong) async { builder: (BuildContext context) { return AlertDialog( title: Text("Unable to Login"), - content: Text(isLoginWrong ? "Incorrect login details. Please try again." : "The server is having issues; sorry for the inconvenience. Please try again later."), + content: Text(isLoginWrong ? "Incorrect login details. Please try again." : "Our servers are having issues at the moment; sorry for the inconvenience. Please try again later."), actions: [ FlatButton( child: Text('OK'), From 94150ddd76df86c5d37e9d9dfc8f796f3547cdee Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 16 Aug 2019 14:23:03 +0100 Subject: [PATCH 078/122] better error catching --- lib/common/apifunctions/request_login_api.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 3d3bfcb..2f74052 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -61,7 +61,8 @@ Future requestLoginAPI( return null; } - } catch (_) { + } catch (error) { + debugPrint(error.toString()); _incorrectDialog(context, false); } } From fdb6a5c69bc41c963d0b42d01e2dae91b39318bd Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 16 Aug 2019 16:44:24 +0100 Subject: [PATCH 079/122] Graphs properly rendered and fetched --- lib/common/apifunctions/get_graph_data.dart | 132 ++++++++++++++------ lib/pages/stats_page.dart | 105 +++++++++++++--- 2 files changed, 182 insertions(+), 55 deletions(-) diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index aea686c..8012a29 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -5,25 +5,34 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:charts_flutter/flutter.dart' as charts; class GraphData { - List data = new List(); + var chartType; + List> graph; - Future>> getGraphData(String graphType) async { -// print("called"); - /// Graph types: - /// - total_last_week - /// - avg_spend_last_week - /// - total_last_month - /// - avg_spend_last_month - /// - /// HTTP POST request sample: - /// {"graph":"total_last_week","session_key":"blahblahblah"} + GraphData( + this.chartType, + ); + + List cachedData; + bool loaded = false; + + Future setGraphData() async { + if (loaded == true) { + this.graph = [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: cachedData, + ) + ]; + } - charts.Series dataSeries = new charts.Series(); final url = "https://dev.peartrade.org/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { - 'graph': graphType, + 'graph': this.chartType, 'session_key': preferences.get('LastToken'), }; @@ -37,29 +46,82 @@ class GraphData { final List labels = responseJson['graph']['labels']; final List data = responseJson['graph']['data']; - for (int i = 0; i < data.length; i++) { -// print(labels[i].toString() + " : " + data[i].toString()); - } -// final List bounds = responseJson['graph']['bounds']; // why is this even returned? + List timeSeriesSpendList = new List(); - /* - final data = [ - new TimeSeriesSales(new DateTime(2017, 9, 19), 5), - new TimeSeriesSales(new DateTime(2017, 9, 26), 25), - new TimeSeriesSales(new DateTime(2017, 10, 3), 100), - new TimeSeriesSales(new DateTime(2017, 10, 10), 75), + for (int i = 0; i < labels.length; i++) { + timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); +// print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); + } + + cachedData = timeSeriesSpendList; + loaded = true; + + this.graph = [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: timeSeriesSpendList, + ) ]; - */ + } else { + final errorMessage = json.decode(response.body)['message']; + print("Error: " + errorMessage); + + this.graph = null; + } + } + + Future>> getGraphData() async { + if (loaded == true) { + return [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: cachedData, + ) + ]; + } + + /// Graph types: + /// - total_last_week + /// - avg_spend_last_week + /// - total_last_month + /// - avg_spend_last_month + /// + /// HTTP POST request sample: + /// {"graph":"total_last_week","session_key":"blahblahblah"} + + final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + SharedPreferences preferences = await SharedPreferences.getInstance(); + + Map body = { + 'graph': this.chartType, + 'session_key': preferences.get('LastToken'), + }; + + final response = await http.post( + url, + body: json.encode(body), + ); + + if (response.statusCode == 200) { + final responseJson = jsonDecode(response.body); + final List labels = responseJson['graph']['labels']; + final List data = responseJson['graph']['data']; List timeSeriesSpendList = new List(); for (int i = 0; i < labels.length; i++) { -// print(DateTime.parse(labels[i])); - timeSeriesSpendList.add(new TimeSeriesSpend(i, DateTime(i))); -// timeSeriesSpendList.add(new TimeSeriesSpend(data[i], DateTime.parse(labels[i]))); + timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); +// print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); } -// print(timeSeriesSpendList); + cachedData = timeSeriesSpendList; + loaded = true; return [ new charts.Series( @@ -70,18 +132,6 @@ class GraphData { data: timeSeriesSpendList, ) ]; - - /* - new charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (TimeSeriesSales sales, _) => sales.time, - measureFn: (TimeSeriesSales sales, _) => sales.sales, - data: data, - )*/ - -// print(labels[5]); -// print(data[5]); } else { final errorMessage = json.decode(response.body)['message']; print("Error: " + errorMessage); @@ -95,7 +145,7 @@ class GraphData { class TimeSeriesSpend { final DateTime time; - final int spend; + final double spend; TimeSeriesSpend(this.spend, this.time); } diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index e8a470c..92fbc72 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -29,8 +29,16 @@ class StatsPage extends StatefulWidget { class StatsPageState extends State { - GraphData graphData = new GraphData(); - List> displayedGraphData; + /// Graph types: + /// - total_last_week + /// - avg_spend_last_week + /// - total_last_month + /// - avg_spend_last_month + + GraphData totalLastWeekGraph = new GraphData("total_last_week"); + GraphData avgSpendLastWeekGraph = new GraphData("avg_spend_last_week"); + GraphData totalLastMonthGraph = new GraphData("total_last_month"); + GraphData avgSpendLastMonth = new GraphData("avg_spend_last_month"); @override void initState() { @@ -50,12 +58,29 @@ class StatsPageState extends State { @override Widget build(BuildContext context) { - if (graphData.data.length == 0) { - graphData.getGraphData('total_last_week').then((fetchedData) { - displayedGraphData = (fetchedData); - for (int i = 0; i < fetchedData[0].data.length; i++) { - print(fetchedData[0].data[i].time); // this is getting very frustrating - } + + // Initializing graphs: + + if (!totalLastWeekGraph.loaded) { + totalLastWeekGraph.setGraphData().then((_) { + setState(() {}); + }); + } + + if (!avgSpendLastWeekGraph.loaded) { + avgSpendLastWeekGraph.setGraphData().then((_) { + setState(() {}); + }); + } + + if (!totalLastMonthGraph.loaded) { + totalLastMonthGraph.setGraphData().then((_) { + setState(() {}); + }); + } + + if (!avgSpendLastMonth.loaded) { + avgSpendLastMonth.setGraphData().then((_) { setState(() {}); }); } @@ -84,7 +109,7 @@ class StatsPageState extends State { Container( padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), child : Text( - "This Week's Spend", + "Last Week's Total Spend", textAlign: TextAlign.center, style: TextStyle( fontSize: 22.0, @@ -97,12 +122,64 @@ class StatsPageState extends State { Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, -// width: 250, + child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Container(), //List> + ), -// child: new TimeSeries(), - child: displayedGraphData != null ? new charts.TimeSeriesChart(displayedGraphData) : Container(), //List> -// child: new charts.TimeSeriesChart(displayedGraphData), -// child: new SimpleTimeSeriesChart(),//seriesList: List + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "Last Week's Average Spend", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Container(), //List> + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "Last Month's Spend", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Container(), //List> + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "Last Month's Average Spend", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Container(), //List> ), ], From 503cd3ca59f74821490f9a94e262202ebd8f9da6 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 16 Aug 2019 16:56:46 +0100 Subject: [PATCH 080/122] improvements to graphs --- ios/Podfile.lock | 4 ++-- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/pages/charts/preset_graphs.dart | 29 ++++++++++++++++++++++++++++ lib/pages/stats_page.dart | 8 ++++---- 4 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 lib/pages/charts/preset_graphs.dart diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4e1203..8132310 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5b4844c..a0f8e33 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/pages/charts/preset_graphs.dart b/lib/pages/charts/preset_graphs.dart new file mode 100644 index 0000000..b48885d --- /dev/null +++ b/lib/pages/charts/preset_graphs.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:local_spend/common/apifunctions/get_graph_data.dart'; + +class PresetChart extends StatefulWidget { + PresetChart({Key key}) : super(key: key); + + @override + _PresetChartState createState() { + return _PresetChartState(); + } +} + +class _PresetChartState extends State { + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return null; + } +} \ No newline at end of file diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index 92fbc72..d690003 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -122,7 +122,7 @@ class StatsPageState extends State { Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Container(), //List> + child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> ), Container( @@ -141,7 +141,7 @@ class StatsPageState extends State { Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Container(), //List> + child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> ), Container( @@ -160,7 +160,7 @@ class StatsPageState extends State { Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Container(), //List> + child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List> ), Container( @@ -179,7 +179,7 @@ class StatsPageState extends State { Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Container(), //List> + child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List> ), ], From 3c1191ec54aa00fcbb485b9ecccaebda03078b0e Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 09:41:11 +0100 Subject: [PATCH 081/122] fixed weird colors on nav bar --- lib/pages/charts/preset_graphs.dart | 4 +- lib/pages/home_page.dart | 1 - lib/pages/new_stats_page.dart | 65 +++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 lib/pages/new_stats_page.dart diff --git a/lib/pages/charts/preset_graphs.dart b/lib/pages/charts/preset_graphs.dart index b48885d..f2f1f6d 100644 --- a/lib/pages/charts/preset_graphs.dart +++ b/lib/pages/charts/preset_graphs.dart @@ -24,6 +24,8 @@ class _PresetChartState extends State { @override Widget build(BuildContext context) { - return null; + return new Container( + + ); } } \ No newline at end of file diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index d33119d..37c1970 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:local_spend/pages/receipt_page.dart'; import 'package:local_spend/pages/receipt_page_2.dart'; import 'package:local_spend/pages/more_page.dart'; import 'package:local_spend/pages/stats_page.dart'; diff --git a/lib/pages/new_stats_page.dart b/lib/pages/new_stats_page.dart new file mode 100644 index 0000000..75b526d --- /dev/null +++ b/lib/pages/new_stats_page.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:local_spend/common/apifunctions/get_graph_data.dart'; +import 'package:charts_flutter/flutter.dart' as charts; + +const URL = "https://flutter.io/"; +const demonstration = false; + +class NewStatsPage extends StatefulWidget { + @override + State createState() { + return new NewStatsPageState(); + } +} + +class NewStatsPageState extends State { + + /// Graph types: + /// - total_last_week + /// - avg_spend_last_week + /// - total_last_month + /// - avg_spend_last_month + + @override + void initState() { + super.initState(); + _saveCurrentRoute("/StatsPageState"); + } + + @override + void dispose() { + super.dispose(); + } + + _saveCurrentRoute(String lastRoute) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + await preferences.setString('LastPageRoute', lastRoute); + } + + @override + Widget build(BuildContext context) { + + return PlatformScaffold( + appBar: AppBar( + backgroundColor: Colors.blue[400], + title: Text( + "Statistics", + style: TextStyle( + fontSize: 20, + color: Colors.white, + ), + ), +// leading: BackButton(), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), + + + body : Container( + + ), + ); + } +} From 1719a66e3274db622145236edc67d34dcd16593f Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 09:49:14 +0100 Subject: [PATCH 082/122] removed old file --- lib/pages/receipt_page.dart | 701 ------------------------------------ 1 file changed, 701 deletions(-) delete mode 100644 lib/pages/receipt_page.dart diff --git a/lib/pages/receipt_page.dart b/lib/pages/receipt_page.dart deleted file mode 100644 index 603791c..0000000 --- a/lib/pages/receipt_page.dart +++ /dev/null @@ -1,701 +0,0 @@ -/* -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; -import 'package:local_spend/common/functions/show_dialog_single_button.dart'; -import 'package:local_spend/common/platform/platform_scaffold.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:intl/intl.dart'; -import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; -import 'package:local_spend/common/apifunctions/find_organisations.dart'; -import 'package:local_spend/common/widgets/popupListView.dart'; -import 'package:local_spend/common/apifunctions/categories.dart'; -import 'package:local_spend/common/widgets/future_dropdownmenu.dart'; - -const URL = "https://flutter.io/"; -const demonstration = false; - -class ReceiptPage extends StatefulWidget { - @override - State createState() { - return new ReceiptPageState(); - } -} - -class ReceiptPageState extends State { - final TextEditingController _timeController = TextEditingController(); - final TextEditingController _amountController = TextEditingController(); - final TextEditingController _essentialController = TextEditingController(); - final TextEditingController _recurringController = TextEditingController(); - - TextEditingController _categoryController; // TODO: fix this!! - final TextEditingController _orgController = TextEditingController(); - final OrganizationController _organizationController = OrganizationController(); - DropdownButton _categoriesDropDownButton = new DropdownButton(items: null /*onChanged: blahBlahBlah*/); - DropdownButton _recurringDropDownButton = new DropdownButton(items: null /*onChanged: blahBlahBlah*/); - String _category; - - FocusNode focusNode; - - DateTime date; - - Future launchURL(String url) async { - if (await canLaunch(url)) { - await launch(url, forceSafariVC: true, forceWebView: true); - } else { - showDialogSingleButton( - context, - "Unable to reach your website.", - "Currently unable to reach the website $URL. Please try again at a later time.", - "OK"); - } - } - - @override - void initState() { - -// getCategoriesList().then((value) { -// setState(() { -// _categoryDropDownItems = value; -// }); -// }); -// loadDropDownMenu(); - - getCategoriesDropDownMenu("categories").then((value) { - setState((){ - _categoriesDropDownButton = value; - }); - }); - - super.initState(); - _saveCurrentRoute("/ReceiptPageState"); - - focusNode = FocusNode(); - - _recurringController.text = "None"; -// _categoryController.text = null; - } - - @override - void dispose() { - super.dispose(); - - focusNode.dispose(); //disposes focus node when form disposed - } - - _saveCurrentRoute(String lastRoute) async { - SharedPreferences preferences = await SharedPreferences.getInstance(); - await preferences.setString('LastPageRoute', lastRoute); - } - - // this file is getting really messy sorry everyone - - void loadDropDownMenu() async { -// _dropDownMenu = await getDropDownMenu( -// "categories", -// setCategory, -// ); - - /// - /// so the below code works when 'value' is not specified but then, obviously, the value of the dropdownbutton can't be set. - /// when it is specified, it doesn't work: - /// [VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: 'package:flutter/src/material/dropdown.dart': Failed assertion: line 608 pos 15: 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem item) => item.value == value).length == 1': is not true. - /// - - getDropDownItems("categories").then((categories) { -// _category = categories[0]; -// _dropDownMenu = new DropdownButton(/*value : _categoryController.text, */items: categories, onChanged: (newValue) => _categoryController.text = newValue); - setState(() { - _categoriesDropDownButton = new DropdownButton(items: categories, onChanged: (newValue) => _category = newValue, value: _category); - }); - }); - } - - Future getCategoriesDropDownMenu(String type) async { - List dropDownItems = await getDropDownItems(type); - -// dropDownItems.forEach((thisOne) { -// print("This value: " + thisOne.value); -// }); -// _categoryController = new TextEditingController(text: null); - return new DropdownButton( - items: dropDownItems, - onChanged: (newValue) { - _category = newValue; - setState(() { - _category = newValue; - }); - }, - - /* - items: categories.map((dynamic value) { - return DropdownMenuItem( - value : value.value, - child: new Text(value.value) - ); - }).toList(), - */ - - value: _category); - } - - void submitReceipt(String amount, String time, Organisation organisation, String recurring, String category, String essential) async - { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - - if (organisation == null) { - _findOrganizationsDialog(context); -/* await showDialog( - context: context, - builder: (BuildContext context) { - // return object of type Dialog - return AlertDialog( - title: new Text("Missing organisation"), - content: new Text( - "Please press 'Find' to select your desired organization."), - actions: [ - new FlatButton( - child: new Text("OK"), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - );*/ - } - else { - if (amount == "" || time == "") { - await showDialog( - context: context, - builder: (BuildContext context) { - // return object of type Dialog - return AlertDialog( - title: new Text("Missing required data"), - content: new Text( - "We couldn't process your request because one or more required fields are missing."), - actions: [ - new FlatButton( - child: new Text("OK"), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - else { - if (demonstration) { - await showDialog( - context: context, - builder: (BuildContext context) { - // return object of type Dialog - return AlertDialog( - title: new Text("Success"), - content: new Text("Receipt successfully submitted."), - actions: [ - // usually buttons at the bottom of the dialog - new FlatButton( - child: new Text("OK"), - onPressed: () { - Navigator.of(context).pop(); - Navigator.of(context).pushReplacementNamed("/HomePage"); - }, - ), - ], - ); - }, - ).then((_) {}); - } - - else { - Receipt receipt = new Receipt(); - - // setting up 'receipt' - receipt.amount = amount; - receipt.time = formatDate(time); - // debugPrint(organisation.name + ", " + organisation.streetName + ", " + organisation.town + ", " + organisation.postcode); - receipt.organisationName = organisation.name; - receipt.street = organisation.streetName; - receipt.town = organisation.town; - receipt.postcode = organisation.postcode; - receipt.recurring = recurring; - receipt.category = category; - - receipt.essential = essential; - - submitReceiptAPI(context, receipt); - Navigator.of(context).pushReplacementNamed("/HomePage"); - } - } - } - } - - String convertBoolToString(bool toConvert) { - if (toConvert) - { - return "true"; - } - - return "false"; - } - -// Future>> getCategoriesList() async { -// //TODO: Return a list of [String, String] where {1} is categoryName and {2} is categoryValue for request -// var categoriesList = List(); -// -// var categories = await getCategories(); //future> -// -// categories.forEach((thisCategory) { -//// print(thisCategory.name); -// var thisMap = new DropdownMenuItem( -// child: new Text(thisCategory.name), -// value: thisCategory.index, -// ); -// -// categoriesList.add(thisMap); -// }); -// -//// print(categoriesStrings[10]); // prints 'Banana' -//// print(categoriesStrings.toString()); -// -// return categoriesList; -// } - - List getRecurringOptions() { - var options = new List(7); - options[0] = "None"; // this should not be hardcoded and should be fetched from API instead - options[1] = "Daily"; - options[2] = "Weekly"; - options[3] = "Fortnightly"; - options[4] = "Monthly"; - options[5] = "Quarterly"; - options[6] = "Yearly"; - - return options; - } - - String formatDate(String date) { -// return ""; - // should be in format: - // yyyy-MM-ddThh:mm:00.000+01:00 - // eg 2019-07-05T10:24:00.000+01.00 (real life example, works) - - // current format = "dd/MM/yyyy 'at' hh:mm" - // 0123456789ABCDEFGHIJK - - var components = new List(5); - - components[0] = (date.substring(0,2)); // dd - components[1] = (date.substring(3,5)); // MM - components[2] = (date.substring(6,10)); // yyyy - components[3] = (date.substring(14,16)); // hh - components[4] = (date.substring(17,19)); // mm - - //print(components); - - return (components[2] + "-" + components[1] + "-" + components[0] - + "T" + components[3] + ":" + components[4] + ":00.000+01:00"); - - // Yes, there is a function to convert dates, but I didn't - // know that before writing this and it's done now so I'm keeping it. - } - - Organisation listOrganisations(List organisations, context) { - if (organisations.length == 0) { - showDialogSingleButton( - context, - "No matching organizations", - "We were unable to find any organizations matching this text.", - "OK" - ); - return null; - } - var optionsList = new List(); - - for (var i = 0; i < organisations.length; i++) { - optionsList.add(organisations[i].name); - } - -// var popupListView = new PopupListView(context, optionsList, "Choose Organization"); - - var popupListView = new PopupListView(); - var dialog = popupListView.dialog(context, optionsList, "Choose Organization"); - -// dialog.then((value) => debugPrint(value)); - - - dialog.then((value) { - _orgController.text = value; - _organizationController.organisation = organisations.where((thisOrg) => thisOrg.name == value).elementAt(0); - // this may not work when two organisations have the same name, - // then again the popupListView can't display two of the same names properly either - }); - //can't return value as it is and thus would block - } - - _findOrganizationsDialog(context) { - if (_orgController.text != "") { - var organisations = findOrganisations( - _orgController.text); // returns Future> - - var choice = organisations.then((data) => - listOrganisations(data, context)); - - choice.then((value) => _orgController.text = value.name); - choice.then((value) => _organizationController.organisation = value); - - } else { - // no data entered - - showDialogSingleButton( - context, - "No data", - "We were unable to service your request because no data was entered.", - "OK" - ); - } - } - - @override - Widget build(BuildContext context) { -// _categoryDropDownItems = [ -// Map.fromIterable(["wappa dappa doo", "1"]), -// Map.fromIterable(["interesting flip flops", "2"]), -// "gray skies", value: "3"), -// "fortified systems" value: "4"), -// ]; - - return PlatformScaffold( - - appBar: AppBar( - backgroundColor: Colors.blue[400], - title: Text( - "Submit Receipt", - style: TextStyle( - fontSize: 20, - color: Colors.white, - ), - ), -// leading: BackButton(), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), - ), - - body: Container( - padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), - child: ListView( - children: [ - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child : Text( - "Time of Transaction", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - DateTimePickerFormField( - inputType: InputType.both, - format: DateFormat("dd/MM/yyyy 'at' hh:mm"), - editable: true, - controller: _timeController, - decoration: InputDecoration( - labelText: 'Date/Time of Transaction', hasFloatingPlaceholder: false), - onChanged: (dt) => setState(() => date = dt), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - child: Text( - "Amount", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _amountController, - decoration: InputDecoration( - hintText: 'Value in £', - ), -// obscureText: true, - autocorrect: false, - keyboardType: TextInputType.number, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - FocusScope.of(context).requestFocus(focusNode); -// submitReceipt(_amountController.text, _timeController.text); - }, - ), - ), - - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - - child : Container ( - height: 22, // this should be the same height as text - - child : ListView( - scrollDirection: Axis.horizontal, - children: [ - - Container( - child: Text( - "Organization Name", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Container( - child : Padding( - padding: EdgeInsets.fromLTRB(5,0,0,4), // sorry about hardcoded constraints - child: FlatButton( - onPressed: () { - _findOrganizationsDialog(context); - }, - child: Text("Find", - style: TextStyle(color: Colors.blue, fontSize: 18.0) - ), - ), - ), - ) - - ], - ), - ), - ), - - Padding( - padding: EdgeInsets.fromLTRB(0.0, 5.0, 0.0, 0.0), - child: TextField( - controller: _orgController, - focusNode: focusNode, - decoration: InputDecoration( - hintText: 'Eg. Pear Trading', - ), -// obscureText: true, - autocorrect: true, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - submitReceipt(_amountController.text, - _timeController.text, _organizationController.organisation, _recurringController.text, _categoryController.text, _essentialController.text); - }, - ), - ), - - Padding( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), - - child : Container ( - height: 18, - - child : ListView( - scrollDirection: Axis.horizontal, - - children: [ - Container( - child: Text( - "Essential", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - ), - ), - ), - - Container( - child : Padding( - padding: EdgeInsets.fromLTRB(20.0, 0.0, 0, 0), - - child: Checkbox(value: - _essentialController.text.toLowerCase() == 'true', - onChanged: (bool newValue) { - setState(() { - _essentialController.text = - convertBoolToString(newValue); - }); - }), - ), - ), - - ], - ), - ), - ), - - Padding( - padding: EdgeInsets.fromLTRB(0.0,18,0.0,0.0), - - child : Container ( - height: 35, -// width: 400, - - child : ListView( - scrollDirection: Axis.horizontal, - - children: [ - Container( - padding: const EdgeInsets.fromLTRB(0, 7, 0, 8), - child: Text( - "Recurring", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - ), - ), - ), - - Container( - padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), - child: DropdownButton( - value: _recurringController.text, - onChanged: (String newValue) { - setState(() { - _recurringController.text = newValue; - }); - }, - items: getRecurringOptions().map>((String value) { - return DropdownMenuItem( - value: value, - child: Text(value), - ); - }) - .toList(), - ) - ), - ], - ), - ), - ), - - Padding( - padding: EdgeInsets.fromLTRB(0.0,7,0.0,0.0), - - child : Container ( - height: 35, -// width: 400, - - child : Row( - children: [ - Container( - padding: const EdgeInsets.fromLTRB(0, 7, 0, 8), - child: Text( - "Category", - style: TextStyle( - fontSize: 18.0, - color: Colors.black, - ), - ), - ), - - Container( - padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), - child: _categoriesDropDownButton, -// child: DropdownButton( -// items: _categoryDropDownItems, -// -// value: _categoryController.text, -//// value: "skip skap skop", -// onChanged: (newValue) { -// setState(() { -// _categoryController.text = newValue; -// }); -// } -// ), - ), - -// Container( -// padding: const EdgeInsets.fromLTRB(29, 0, 0, 0), -// child: DropdownButton( -// value: _categoryController.text, -// onChanged: (String newValue) { -// setState(() { -// _categoryController.text = newValue; -// }); -// }, -// items: _categoryDropDownItems.map>((String value) { -// return DropdownMenuItem( -// value: value, -// child: Text(value), -// ); -// }).toList(), // fix errors here by [items] being an empty container while _categoryDropDownItems is null -// ) -// ), - - ], - ), - ), - ), - - Padding( - padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), - child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - try { - submitReceipt( - _amountController.text, _timeController.text, - _organizationController.organisation, _recurringController.text, _categoryController.text, _essentialController.text); - } - catch (_) { - showDialog( - context: context, - builder: (BuildContext context) { - // return object of type Dialog - return AlertDialog( - title: new Text("Invalid data"), - content: new Text( - "We couldn't process your request because some of the data entered is invalid."), - actions: [ - new FlatButton( - child: new Text("OK"), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - } - }, - child: Text("GO", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), - color: Colors.blue, - ), - ), - ), - ], - ), - ), - ); - } -} - -*/ \ No newline at end of file From aa40a5c92631e640263f40c0e9e62288c99f2f05 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 10:05:07 +0100 Subject: [PATCH 083/122] removed broken reference --- lib/main.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 61fff8d..7a63c3b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:local_spend/pages/home_page.dart'; import 'package:local_spend/pages/login_page.dart'; -import 'package:local_spend/pages/receipt_page.dart'; import 'package:local_spend/pages/receipt_page_2.dart'; import 'package:local_spend/pages/spash_screen.dart'; import 'package:local_spend/pages/more_page.dart'; From 2e1b74a222e7f3fe8e5aef9ca6f739835cc8f239 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 11:19:41 +0100 Subject: [PATCH 084/122] dialog looks slightly better --- lib/common/widgets/organisations_dialog.dart | 100 +++++++++---------- 1 file changed, 49 insertions(+), 51 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 1465aed..5c69e48 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -86,7 +86,6 @@ class FindOrganisations { TextEditingController searchBarText = new TextEditingController(); var organisations = new Organisations(); var listTitle = "All Organisations"; -// var organisationsList = organisations.getTestData(); var organisationsList = List(); Future _submitSearch(String search) async { @@ -94,13 +93,9 @@ class FindOrganisations { listTitle = "Results for \'" + search + "\'"; var futureOrgs = await organisations.findOrganisations(search); -// futureOrgs.then((value) { -// debugPrint("There are " + futureOrgs.length.toString() + -// " payees matching the query \'" + search + "\'."); organisationsList = futureOrgs; _searchEnabled = true; return futureOrgs.length; -// }); } return showDialog( @@ -166,54 +161,57 @@ class FindOrganisations { ), ), - Container( - padding: EdgeInsets.fromLTRB(20, 20, 20, 0), - child: Text( - listTitle, - style: new TextStyle( - fontSize: 23, fontWeight: FontWeight.bold), - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(10, 10, 10, 0), - width: MediaQuery - .of(context) - .size - .width, - height: MediaQuery - .of(context) - .size - .height * 0.67, - - child: Material( - shadowColor: Colors.transparent, - color: Colors.transparent, - child: ListView.builder( - itemCount: organisationsList.length, - itemBuilder: (context, index) { - return Card( - child: ListTile( - leading: Icon(Icons.person), - title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), - subtitle: Text(organisationsList[index].postcode.toUpperCase()), -// trailing: Icon(Icons.arrow_forward_ios), -// onTap: _chosenOrg(organisationsList[index]), - onTap: (){ - Navigator.of(context).pop(organisationsList[index]); - }, - onLongPress: (){ - // show more details about the organisation in a new dialog - var moreInfo = _moreInfoDialog(context, organisationsList[index]); - moreInfo.whenComplete(null); - }, - ), - ); - }, + Column( + children: organisationsList.length > 0 ? [ + Container( + padding: EdgeInsets.fromLTRB(20, 20, 20, 0), + child: Text( + listTitle, + style: new TextStyle( + fontSize: 23, fontWeight: FontWeight.bold), + ), ), - ), - ), + Container( + padding: EdgeInsets.fromLTRB(10, 10, 10, 0), + width: MediaQuery + .of(context) + .size + .width, + height: MediaQuery + .of(context) + .size + .height * 0.67, + + child: Material( + shadowColor: Colors.transparent, + color: Colors.transparent, + child: ListView.builder( + itemCount: organisationsList.length, + itemBuilder: (context, index) { + return Card( + child: ListTile( + leading: Icon(Icons.person), + title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), + subtitle: Text(organisationsList[index].postcode.toUpperCase()), + // trailing: Icon(Icons.arrow_forward_ios), + // onTap: _chosenOrg(organisationsList[index]), + onTap: (){ + Navigator.of(context).pop(organisationsList[index]); + }, + onLongPress: (){ + // show more details about the organisation in a new dialog + var moreInfo = _moreInfoDialog(context, organisationsList[index]); + moreInfo.whenComplete(null); + }, + ), + ); + }, + ), + ), + ), + ] : [ Container(), ], + ), // help button for if org not listed // cancel and ok buttons From ff7cdf490794a3824b8bad02c924155de1c1c702 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 11:43:53 +0100 Subject: [PATCH 085/122] let the testing begin! --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/widgets/organisations_dialog.dart | 101 ++++++++++--------- lib/pages/stats_page.dart | 2 +- 4 files changed, 57 insertions(+), 52 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8132310..a4e1203 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a0f8e33..5b4844c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 5c69e48..ce65afa 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'dart:async'; - +import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; class FindOrganisations { @@ -83,6 +83,7 @@ class FindOrganisations { Future dialog(context) { bool _searchEnabled = false; + bool _orgsFetched = false; TextEditingController searchBarText = new TextEditingController(); var organisations = new Organisations(); var listTitle = "All Organisations"; @@ -107,62 +108,66 @@ class FindOrganisations { builder: (context, setState) { return SimpleDialog( children: [ - Padding( - padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - child: Row( - children: [ - Container( - width: 140, - height: 50, - child: TextField( - controller: searchBarText, - decoration: InputDecoration( - hintText: "Payee Name", + Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + width: 150, + height: 50, + child: TextField( + controller: searchBarText, + decoration: InputDecoration( + hintText: "Payee Name", + ), + onChanged: (value) { + if (value.length > 0) { + _searchEnabled = true; + } else { + _searchEnabled = false; + } + setState(() => {_searchEnabled}); + }, + onSubmitted: _searchEnabled ? (_) { + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() {}); + }); + } : null, ), - onChanged: (value) { - if (value.length > 0) { - _searchEnabled = true; - } else { - _searchEnabled = false; - } - setState(() => {_searchEnabled}); - }, - onSubmitted: (_) { - if (_searchEnabled) { - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() {}); - }); - } - }, ), - ), - Container( - width: 80, - padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + Container( + width: 80, + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - child: RaisedButton( - onPressed: (() { - if (_searchEnabled) { - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() {}); - }); - } - }), + child: RaisedButton( + onPressed: (() { + if (_searchEnabled) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() { + _orgsFetched = true; + }); + }); + } + }), - child: Icon(Icons.search, color: Colors.white), - color: _searchEnabled ? Colors.blue : Colors.blue[200], - // make inactive when search in progress as activity indicator + child: Icon(Icons.search, color: Colors.white), + color: _searchEnabled ? Colors.blue : Colors.blue[200], + // make inactive when search in progress as activity indicator + ), ), - ), - ], - ), + ], + ), + ], ), Column( - children: organisationsList.length > 0 ? [ + children: _orgsFetched ? [ Container( padding: EdgeInsets.fromLTRB(20, 20, 20, 0), child: Text( diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index d690003..5e8067f 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -147,7 +147,7 @@ class StatsPageState extends State { Container( padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), child : Text( - "Last Month's Spend", + "Last Month's Total Spend", textAlign: TextAlign.center, style: TextStyle( fontSize: 22.0, From d0defec7d62a1455a6be26522d914c148da1e72c Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 11:54:12 +0100 Subject: [PATCH 086/122] testing has commenced adding accessibility options now --- lib/pages/receipt_page_2.dart | 1 + test/widget_test.dart | 17 +++++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index e064039..3244b56 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -470,6 +470,7 @@ class ReceiptPage2State extends State { } }, child: Text("GO", + key: Key("goButton"), style: TextStyle(color: Colors.white, fontSize: 22.0)), color: Colors.blue, diff --git a/test/widget_test.dart b/test/widget_test.dart index ea7f4d6..3835e00 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -11,20 +11,17 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:local_spend/main.dart'; void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { + + testWidgets('GO button repetition test', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(MyApp()); - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); + // Tap the GO button and trigger a frame. + await tester.tap(find.byKey(Key("goButton"))); await tester.pump(); - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); + // Verify that the dialog has shown +// expect(find.text('GO'), findsNothing); +// expect(find.text('Invalid data'), findsOneWidget); }); } From abbd0a7170be201cf0e56850600a333584409044 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 11:58:26 +0100 Subject: [PATCH 087/122] tooltips added to graphs --- lib/pages/stats_page.dart | 44 +++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index 5e8067f..8b79872 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -119,10 +119,13 @@ class StatsPageState extends State { ), ), - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + Tooltip( + message: "Graph of total spend last week", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + ), ), Container( @@ -138,10 +141,13 @@ class StatsPageState extends State { ), ), - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + Tooltip( + message: "Graph of average spend last week", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + ), ), Container( @@ -157,10 +163,13 @@ class StatsPageState extends State { ), ), - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List> + Tooltip( + message: "Graph of total spend last month", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List> + ), ), Container( @@ -176,10 +185,13 @@ class StatsPageState extends State { ), ), - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List> + Tooltip( + message: "Graph of average spend last month", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List> + ), ), ], From 68a33c53e948813bfc2c8ae12cadf48e8820da95 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 12:36:12 +0100 Subject: [PATCH 088/122] animation, tooltips, ui sizing fixed --- lib/common/widgets/organisations_dialog.dart | 217 ++++---- lib/pages/receipt_page_2.dart | 499 ++++++++++--------- 2 files changed, 371 insertions(+), 345 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index ce65afa..d374f8f 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -106,123 +106,126 @@ class FindOrganisations { builder: (BuildContext context) { return StatefulBuilder( builder: (context, setState) { - return SimpleDialog( - children: [ - Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, + return AnimatedContainer( + duration: Duration(seconds: 1), + child : SimpleDialog( + children: [ + Column( children: [ - Container( - padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - width: 150, - height: 50, - child: TextField( - controller: searchBarText, - decoration: InputDecoration( - hintText: "Payee Name", + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + width: 150, + height: 50, + child: TextField( + controller: searchBarText, + decoration: InputDecoration( + hintText: "Payee Name", + ), + onChanged: (value) { + if (value.length > 0) { + _searchEnabled = true; + } else { + _searchEnabled = false; + } + setState(() => {_searchEnabled}); + }, + onSubmitted: _searchEnabled ? (_) { + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() {}); + }); + } : null, + ), ), - onChanged: (value) { - if (value.length > 0) { - _searchEnabled = true; - } else { - _searchEnabled = false; - } - setState(() => {_searchEnabled}); - }, - onSubmitted: _searchEnabled ? (_) { - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() {}); - }); - } : null, - ), - ), - Container( - width: 80, - padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + Container( + width: 80, + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - child: RaisedButton( - onPressed: (() { - if (_searchEnabled) { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() { - _orgsFetched = true; - }); - }); - } - }), + child: RaisedButton( + onPressed: (() { + if (_searchEnabled) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() { + _orgsFetched = true; + }); + }); + } + }), - child: Icon(Icons.search, color: Colors.white), - color: _searchEnabled ? Colors.blue : Colors.blue[200], - // make inactive when search in progress as activity indicator - ), + child: Icon(Icons.search, color: Colors.white), + color: _searchEnabled ? Colors.blue : Colors.blue[200], + // make inactive when search in progress as activity indicator + ), + ), + ], ), ], ), + + Column( + children: _orgsFetched ? [ + Container( + padding: EdgeInsets.fromLTRB(20, 20, 20, 0), + child: Text( + listTitle, + style: new TextStyle( + fontSize: 23, fontWeight: FontWeight.bold), + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(10, 10, 10, 0), + width: MediaQuery + .of(context) + .size + .width, + height: MediaQuery + .of(context) + .size + .height * 0.67, + + child: Material( + shadowColor: Colors.transparent, + color: Colors.transparent, + child: ListView.builder( + itemCount: organisationsList.length, + itemBuilder: (context, index) { + return Card( + child: ListTile( + leading: Icon(Icons.person), + title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), + subtitle: Text(organisationsList[index].postcode.toUpperCase()), + // trailing: Icon(Icons.arrow_forward_ios), + // onTap: _chosenOrg(organisationsList[index]), + onTap: (){ + Navigator.of(context).pop(organisationsList[index]); + }, + onLongPress: (){ + // show more details about the organisation in a new dialog + var moreInfo = _moreInfoDialog(context, organisationsList[index]); + moreInfo.whenComplete(null); + }, + ), + ); + }, + ), + ), + ), + ] : [ Container(), ], + ), + + // help button for if org not listed + // cancel and ok buttons + ], ), - - Column( - children: _orgsFetched ? [ - Container( - padding: EdgeInsets.fromLTRB(20, 20, 20, 0), - child: Text( - listTitle, - style: new TextStyle( - fontSize: 23, fontWeight: FontWeight.bold), - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(10, 10, 10, 0), - width: MediaQuery - .of(context) - .size - .width, - height: MediaQuery - .of(context) - .size - .height * 0.67, - - child: Material( - shadowColor: Colors.transparent, - color: Colors.transparent, - child: ListView.builder( - itemCount: organisationsList.length, - itemBuilder: (context, index) { - return Card( - child: ListTile( - leading: Icon(Icons.person), - title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), - subtitle: Text(organisationsList[index].postcode.toUpperCase()), - // trailing: Icon(Icons.arrow_forward_ios), - // onTap: _chosenOrg(organisationsList[index]), - onTap: (){ - Navigator.of(context).pop(organisationsList[index]); - }, - onLongPress: (){ - // show more details about the organisation in a new dialog - var moreInfo = _moreInfoDialog(context, organisationsList[index]); - moreInfo.whenComplete(null); - }, - ), - ); - }, - ), - ), - ), - ] : [ Container(), ], - ), - - // help button for if org not listed - // cancel and ok buttons - - ], - ); + ); }, ); }, diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 3244b56..1467d10 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -158,164 +158,173 @@ class ReceiptPage2State extends State { Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), - child: Row( - children: [ - Container( - child : Text( - "Date/Time", - style: TextStyle( - fontSize: 18, - color: Colors.black, - fontWeight: FontWeight.bold, + child: Tooltip( + message: "Date and time of transaction", + child: Row( + children: [ + Container( + child : Text( + "Date/Time", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), + width: 110, ), - width: 110, - ), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, - child: RaisedButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (BuildContext builder) { - return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, - child: CupertinoDatePicker( - initialDateTime: transaction.date.isAfter(DateTime.now()) - ? DateTime.now() - : transaction.date, - onDateTimeChanged: (DateTime newDate) { - setState(() => { - newDate.isAfter(DateTime.now()) - ? transaction.date = DateTime.now() - : transaction.date = newDate, - }); - }, - use24hFormat: true, - maximumDate: DateTime.now(), - ), - ); - }); - }, - child: Text( - transaction.date == null - ? 'None set' - : transaction.date.year == DateTime.now().year - ? '${new DateFormat.MMMd().format(transaction.date)}' + ", " + '${new DateFormat.Hm().format(transaction.date)}' - : '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + ", " + '${new DateFormat.Hm().format(transaction.date)}', - style: - TextStyle(color: Colors.white, fontSize: 18.0), + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + child: CupertinoDatePicker( + initialDateTime: transaction.date.isAfter(DateTime.now()) + ? DateTime.now() + : transaction.date, + onDateTimeChanged: (DateTime newDate) { + setState(() => { + newDate.isAfter(DateTime.now()) + ? transaction.date = DateTime.now() + : transaction.date = newDate, + }); + }, + use24hFormat: true, + maximumDate: DateTime.now(), + ), + ); + }); + }, + child: Text( + transaction.date == null + ? 'None set' + : transaction.date.year == DateTime.now().year + ? '${new DateFormat.MMMd().format(transaction.date)}' + ", " + '${new DateFormat.Hm().format(transaction.date)}' + : '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + ", " + '${new DateFormat.Hm().format(transaction.date)}', + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, ), - color: Colors.blue, ), - ), - ], + ], + ), ), ), // Date/Time picker Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), - child: Row( - children: [ - Container( - child : Text( - "Payee", - style: TextStyle( - fontSize: 18, - color: Colors.black, - fontWeight: FontWeight.bold, + child: Tooltip( + message: "Transaction payee", + child: Row( + children: [ + Container( + child : Text( + "Payee", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), + width: 110, ), - width: 110, - ), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, - child: RaisedButton( - onPressed: () { -// var popupListView = new PopupListView(); -// var dialog = popupListView.dialog(context, optionsList, "Choose Organization"); - var organisations = new FindOrganisations(); - var orgDialog = organisations.dialog(context); - orgDialog.then((organisation) { - try { - organisation.name.length; - transaction.organisation = organisation; -// debugPrint(organisation.name); - setState(() {}); - } catch(_) { - debugPrint("No organisation chosen."); - } - }); - }, - child: Text( - transaction.organisation.name == null - ? 'Find' - : transaction.organisation.name.length > 14 - ? transaction.organisation.name.substring(0,12) + "..." - : transaction.organisation.name, - style: - TextStyle(color: Colors.white, fontSize: 18.0), + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { + // var popupListView = new PopupListView(); + // var dialog = popupListView.dialog(context, optionsList, "Choose Organization"); + var organisations = new FindOrganisations(); + var orgDialog = organisations.dialog(context); + orgDialog.then((organisation) { + try { + organisation.name.length; + transaction.organisation = organisation; + // debugPrint(organisation.name); + setState(() {}); + } catch(_) { + debugPrint("No organisation chosen."); + } + }); + }, + child: Text( + transaction.organisation.name == null + ? 'Find' + : transaction.organisation.name.length > 14 + ? transaction.organisation.name.substring(0,12) + "..." + : transaction.organisation.name, + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, ), - color: Colors.blue, ), - ), - ], + ], + ), ), ), // Organisation picker Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), - child: Row( - children: [ - Container( - child : Text( - "Recurring", - style: TextStyle( - fontSize: 18, - color: Colors.black, - fontWeight: FontWeight.bold, + child: Tooltip( + message: "Transaction recrudescence", + child: Row( + children: [ + Container( + child : Text( + "Recurring", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), + width: 110, ), - width: 110, - ), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, - child: RaisedButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (BuildContext builder) { - return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, - child: CupertinoPicker( - backgroundColor: Colors.white, - children: _sampleRecurringOptions.map((thisOption) => Text(thisOption)).toList(), - onSelectedItemChanged: ((newValue) { - transaction.recurring = _sampleRecurringOptions[newValue]; - setState(() {}); - }), - itemExtent: 32, - ), - ); - }); - }, - child: Text( - transaction.recurring == null - ? 'None' - : transaction.recurring, - style: - TextStyle(color: Colors.white, fontSize: 18.0), + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + height: 32.0, + child: RaisedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + child: CupertinoPicker( + backgroundColor: Colors.white, + children: _sampleRecurringOptions.map((thisOption) => Text(thisOption)).toList(), + onSelectedItemChanged: ((newValue) { + transaction.recurring = _sampleRecurringOptions[newValue]; + setState(() {}); + }), + itemExtent: 32, + ), + ); + }); + }, + child: Text( + transaction.recurring == null + ? 'None' + : transaction.recurring, + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, ), - color: Colors.blue, ), - ), - ], + ], + ), ), ), // Recurring picker @@ -338,33 +347,36 @@ class ReceiptPage2State extends State { Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: 32.0, - child: RaisedButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (BuildContext builder) { - return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, - child: CupertinoPicker( - backgroundColor: Colors.white, - children: _categories.map((thisOption) => Text(thisOption)).toList(), - onSelectedItemChanged: ((newValue) { - transaction.category = _categories[newValue]; - setState(() {}); - }), - itemExtent: 32, - ), - ); - }); - }, - child: Text( - transaction.category == null - ? 'None' - : transaction.category, - style: - TextStyle(color: Colors.white, fontSize: 18.0), + child: Tooltip( + message: "Category of transaction", + child: RaisedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + child: CupertinoPicker( + backgroundColor: Colors.white, + children: _categories.map((thisOption) => Text(thisOption)).toList(), + onSelectedItemChanged: ((newValue) { + transaction.category = _categories[newValue]; + setState(() {}); + }), + itemExtent: 32, + ), + ); + }); + }, + child: Text( + transaction.category == null + ? 'None' + : transaction.category, + style: + TextStyle(color: Colors.white, fontSize: 18.0), + ), + color: Colors.blue, ), - color: Colors.blue, ), ), ], @@ -373,107 +385,118 @@ class ReceiptPage2State extends State { Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), - child: Row( - children: [ - Container( - child : Text( - "Essential", - style: TextStyle( - fontSize: 18, - color: Colors.black, - fontWeight: FontWeight.bold, + child: Tooltip( + message: "Essential or not", + child: Row( + children: [ + Container( + child : Text( + "Essential", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + width: 95, + ), + + Container( + height: 32.0, + child: Checkbox( + value: transaction.isEssential, + onChanged: ((value) { + setState(() => transaction.isEssential = value); + }), ), ), - width: 95, - ), - - Container( - height: 32.0, - child: Checkbox( - value: transaction.isEssential, - onChanged: ((value) { - setState(() => transaction.isEssential = value); - }), - ), - ), - ], + ], + ), ), ), // Essential Container( padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), - child: Row( - children: [ - Container( - child : Text( - "Amount", - style: TextStyle( - fontSize: 18, - color: Colors.black, - fontWeight: FontWeight.bold, + child: Tooltip( + message: "Transaction amount", + child: Row( + children: [ + Container( + child : Text( + "Amount", + style: TextStyle( + fontSize: 18, + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), + width: 110, ), - width: 110, - ), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, - width: 100, - child: TextField( - controller: transaction.amount, - decoration: InputDecoration( - hintText: "0.00" + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + height: 32.0, + width: 100, + child: TextField( + controller: transaction.amount, + decoration: InputDecoration( + hintText: "0.00" + ), + keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true), ), - keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true), ), - ), - ], + ], + ), ), ), // Amount picker Padding( padding: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), - child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - try { - if (transaction.amount.text == "" || transaction.organisation.name == null) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } else { - if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { - _submitReceipt(transaction); - } else { + child: Tooltip( + message: "Submit receipt", + child: Container( + height: 65.0, + child: RaisedButton( + onPressed: () { + try { + if (transaction.amount.text == "" || transaction.organisation.name == null) { showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } ); + } else { + if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { + _submitReceipt(transaction); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } } } - } - catch (_) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } - }, - child: Text("GO", - key: Key("goButton"), - style: - TextStyle(color: Colors.white, fontSize: 22.0)), - color: Colors.blue, + catch (_) { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } + }, + + + child: Text("GO", + style: + TextStyle(color: Colors.white, fontSize: 22.0), + ), + color: Colors.blue, + ), ), ), ), From 05a57e8203d19a26685a4cb205cf59459d590cfb Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 13:50:30 +0100 Subject: [PATCH 089/122] fixing Dispose() errors some widgets aren't loading and disposing properly --- lib/common/widgets/organisations_dialog.dart | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index d374f8f..30b79b5 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -106,9 +106,11 @@ class FindOrganisations { builder: (BuildContext context) { return StatefulBuilder( builder: (context, setState) { - return AnimatedContainer( - duration: Duration(seconds: 1), - child : SimpleDialog( + return +// AnimatedContainer( +// duration: Duration(seconds: 1), +// child : + SimpleDialog( children: [ Column( children: [ @@ -217,14 +219,14 @@ class FindOrganisations { ), ), ), - ] : [ Container(), ], + ] : [ Container() ], ), // help button for if org not listed // cancel and ok buttons ], - ), +// ), ); }, ); From 6cd65b8ac615c675405c32c6b6ad74a6021dd3a2 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 15:02:02 +0100 Subject: [PATCH 090/122] implementing organisation/customer-specific graphs --- lib/common/apifunctions/get_graph_data.dart | 17 +- lib/common/functions/save_current_login.dart | 5 + lib/model/json/login_model.dart | 5 +- lib/pages/customerGraphs.dart | 151 +++++++++++++++ lib/pages/orgGraphs.dart | 35 ++++ lib/pages/stats_page.dart | 191 ++++--------------- 6 files changed, 250 insertions(+), 154 deletions(-) create mode 100644 lib/pages/customerGraphs.dart create mode 100644 lib/pages/orgGraphs.dart diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 8012a29..e2d1bb1 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -86,12 +86,27 @@ class GraphData { ]; } - /// Graph types: + // TODO: Show available graph types based on whether or not the user is an Organisation or User + + /// Customer graph types: https://dev.peartrade.org/api/v1/customer/graphs /// - total_last_week /// - avg_spend_last_week /// - total_last_month /// - avg_spend_last_month /// + /// Organisations' graphs types: to fetch, POST to https://dev.peartrade.org/api/stats/[name] as {"session_key":"[boop beep]"} + /// - organisations_all : organisation + /// - pies : organisation/pies + /// - snippets : organisation/snippets + /// - graphs : organisation/graphs + /// - {"graph":"customers_last_7_days","session_key":"[bleep]"} + /// - {"graph":"customers_last_30_days","session_key":"[blah]"} + /// - {"graph":"sales_last_7_days","session_key":"[bloop]"} + /// - {"graph":"sales_last_7_days","session_key":"[reee]"} + /// - {"graph":"purchases_last_7_days","session_key":"[yee]"} + /// - {"graph":"purchases_last_30_days","session_key":"[yah]"} + /// - {"graph":"purchases_all;","session_key":"[kappa]"} // I don't think this one works + /// /// HTTP POST request sample: /// {"graph":"total_last_week","session_key":"blahblahblah"} diff --git a/lib/common/functions/save_current_login.dart b/lib/common/functions/save_current_login.dart index 5800c10..44ec919 100644 --- a/lib/common/functions/save_current_login.dart +++ b/lib/common/functions/save_current_login.dart @@ -16,6 +16,9 @@ saveCurrentLogin(Map responseJson, loginEmail) async { var email = (loginEmail != null) ? loginEmail : ""; + var userType = (responseJson != null && responseJson.isNotEmpty) + ? LoginModel.fromJson(responseJson).userType + : ""; await preferences.setString( 'LastUser', (user != null && user.length > 0) ? user : ""); @@ -23,4 +26,6 @@ saveCurrentLogin(Map responseJson, loginEmail) async { 'LastToken', (token != null && token.length > 0) ? token : ""); await preferences.setString( 'LastEmail', (email != null && email.length > 0) ? email : ""); + await preferences.setString( + 'LastUserType', (userType != null && userType.length > 0) ? userType : ""); } diff --git a/lib/model/json/login_model.dart b/lib/model/json/login_model.dart index f47a15d..a87a810 100644 --- a/lib/model/json/login_model.dart +++ b/lib/model/json/login_model.dart @@ -1,15 +1,18 @@ class LoginModel { final String userName; final String token; + final String userType; - LoginModel(this.userName, this.token); + LoginModel(this.userName, this.token, this.userType); LoginModel.fromJson(Map json) : userName = json['display_name'], + userType = json['user_type'], token = json['session_key']; Map toJson() => { 'name': userName, + 'user_type': userType, 'token': token, }; } diff --git a/lib/pages/customerGraphs.dart b/lib/pages/customerGraphs.dart new file mode 100644 index 0000000..c581385 --- /dev/null +++ b/lib/pages/customerGraphs.dart @@ -0,0 +1,151 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/apifunctions/get_graph_data.dart'; +import 'package:charts_flutter/flutter.dart' as charts; + +class CustomerGraphs extends StatefulWidget { + CustomerGraphs({Key key}) : super(key: key); + + @override + _CustomerGraphsState createState() { + return _CustomerGraphsState(); + } +} + +class _CustomerGraphsState extends State { + GraphData totalLastWeekGraph = new GraphData("total_last_week"); + GraphData avgSpendLastWeekGraph = new GraphData("avg_spend_last_week"); + GraphData totalLastMonthGraph = new GraphData("total_last_month"); + GraphData avgSpendLastMonth = new GraphData("avg_spend_last_month"); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // Initializing graphs: + if (!totalLastWeekGraph.loaded) { + totalLastWeekGraph.setGraphData().then((_) { + setState(() {}); + }); + } + + if (!avgSpendLastWeekGraph.loaded) { + avgSpendLastWeekGraph.setGraphData().then((_) { + setState(() {}); + }); + } + + if (!totalLastMonthGraph.loaded) { + totalLastMonthGraph.setGraphData().then((_) { + setState(() {}); + }); + } + + if (!avgSpendLastMonth.loaded) { + avgSpendLastMonth.setGraphData().then((_) { + setState(() {}); + }); + } + + return ListView( + children: [ + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "Last Week's Total Spend", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Tooltip( + message: "Graph of total spend last week", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "Last Week's Average Spend", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Tooltip( + message: "Graph of average spend last week", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "Last Month's Total Spend", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Tooltip( + message: "Graph of total spend last month", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List> + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), + child : Text( + "Last Month's Average Spend", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + + Tooltip( + message: "Graph of average spend last month", + child : Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List> + ), + ), + + ], + ); + } +} \ No newline at end of file diff --git a/lib/pages/orgGraphs.dart b/lib/pages/orgGraphs.dart new file mode 100644 index 0000000..c016abf --- /dev/null +++ b/lib/pages/orgGraphs.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:local_spend/common/apifunctions/get_graph_data.dart'; +import 'package:charts_flutter/flutter.dart' as charts; + +class OrgGraphs extends StatefulWidget { + OrgGraphs({Key key}) : super(key: key); + + @override + _OrgGraphsState createState() { + return _OrgGraphsState(); + } +} + +class _OrgGraphsState extends State { + GraphData totalLastWeekGraph = new GraphData("total_last_week"); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ListView( + children: [ + + ], + ); + } +} \ No newline at end of file diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index 8b79872..a98f471 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -1,21 +1,8 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:local_spend/common/functions/logout.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:local_spend/common/functions/customAbout.dart' as custom; -import 'package:local_spend/common/functions/showDialogTwoButtons.dart'; -import 'package:local_spend/common/widgets/charts/donut_chart.dart'; -import 'package:local_spend/common/widgets/charts/outside_label.dart'; -import 'package:local_spend/common/widgets/charts/auto_label.dart'; -import 'package:local_spend/common/widgets/charts/grouped_bar_chart.dart'; -import 'package:local_spend/common/widgets/charts/scatter_bucketingAxis_legend.dart'; -import 'package:local_spend/common/widgets/charts/numeric_line_bar_combo.dart'; -import 'package:local_spend/common/widgets/charts/series_legend_with_measures.dart'; -import 'package:local_spend/common/widgets/charts/time_series_simple.dart'; -import 'package:local_spend/common/apifunctions/get_graph_data.dart'; -import 'package:charts_flutter/flutter.dart' as charts; -import 'package:local_spend/common/widgets/charts/chart_builder.dart'; +import 'package:local_spend/pages/customerGraphs.dart'; +import 'package:local_spend/pages/orgGraphs.dart'; const URL = "https://flutter.io/"; const demonstration = false; @@ -28,17 +15,7 @@ class StatsPage extends StatefulWidget { } class StatsPageState extends State { - - /// Graph types: - /// - total_last_week - /// - avg_spend_last_week - /// - total_last_month - /// - avg_spend_last_month - - GraphData totalLastWeekGraph = new GraphData("total_last_week"); - GraphData avgSpendLastWeekGraph = new GraphData("avg_spend_last_week"); - GraphData totalLastMonthGraph = new GraphData("total_last_month"); - GraphData avgSpendLastMonth = new GraphData("avg_spend_last_month"); + String userType = "-"; @override void initState() { @@ -56,31 +33,17 @@ class StatsPageState extends State { await preferences.setString('LastPageRoute', lastRoute); } + Future _getUserType() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + return await preferences.get('LastUserType'); + } + @override Widget build(BuildContext context) { - - // Initializing graphs: - - if (!totalLastWeekGraph.loaded) { - totalLastWeekGraph.setGraphData().then((_) { - setState(() {}); - }); - } - - if (!avgSpendLastWeekGraph.loaded) { - avgSpendLastWeekGraph.setGraphData().then((_) { - setState(() {}); - }); - } - - if (!totalLastMonthGraph.loaded) { - totalLastMonthGraph.setGraphData().then((_) { - setState(() {}); - }); - } - - if (!avgSpendLastMonth.loaded) { - avgSpendLastMonth.setGraphData().then((_) { + if (userType == "-") { + _getUserType().then((value) { + print(value); + userType = '${value[0].toUpperCase()}${value.substring(1)}'; // capitalises first letter setState(() {}); }); } @@ -88,114 +51,38 @@ class StatsPageState extends State { return PlatformScaffold( appBar: AppBar( backgroundColor: Colors.blue[400], - title: Text( - "Statistics", - style: TextStyle( - fontSize: 20, - color: Colors.white, - ), + title: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Statistics", + style: TextStyle( + fontSize: 20, + color: Colors.white, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 10) + ), + + Text( + "User type: " + userType, + style: TextStyle( + fontSize: 20, + color: Colors.white70, + ), + ), + ], + ), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), ), -// leading: BackButton(), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), - ), body : Container( padding: EdgeInsets.fromLTRB(0, 0, 0, 0), - child: ListView( - children: [ - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "Last Week's Total Spend", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Tooltip( - message: "Graph of total spend last week", - child : Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "Last Week's Average Spend", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Tooltip( - message: "Graph of average spend last week", - child : Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "Last Month's Total Spend", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Tooltip( - message: "Graph of total spend last month", - child : Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List> - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( - "Last Month's Average Spend", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22.0, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - ), - - Tooltip( - message: "Graph of average spend last month", - child : Container( - padding: EdgeInsets.symmetric(horizontal: 10), - height: 200, - child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List> - ), - ), - - ], - ), + child: (userType == "-" ? null : (userType.toLowerCase() == "customer" ? CustomerGraphs() : OrgGraphs())), ), ); } From b4c93ff80d29f85aa60434b5af218035c2c4aef5 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 15:23:58 +0100 Subject: [PATCH 091/122] writing functions to get org graph data --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/apifunctions/get_graph_data.dart | 154 ++++++++++++++++++++ lib/pages/stats_page.dart | 2 +- 4 files changed, 158 insertions(+), 4 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4e1203..8132310 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5b4844c..a0f8e33 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index e2d1bb1..8846917 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -156,6 +156,160 @@ class GraphData { } +} + +class OrgGraphData { + var chartType; + List> graph; + + OrgGraphData( + this.chartType, + ); + + List cachedData; + bool loaded = false; + + Future setGraphData() async { + if (loaded == true) { + this.graph = [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: cachedData, + ) + ]; + } + + final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + SharedPreferences preferences = await SharedPreferences.getInstance(); + + Map body = { + 'graph': this.chartType, + 'session_key': preferences.get('LastToken'), + }; + + final response = await http.post( + url, + body: json.encode(body), + ); + + if (response.statusCode == 200) { + final responseJson = jsonDecode(response.body); + final List labels = responseJson['graph']['labels']; + final List data = responseJson['graph']['data']; + + List timeSeriesSpendList = new List(); + + for (int i = 0; i < labels.length; i++) { + timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); +// print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); + } + + cachedData = timeSeriesSpendList; + loaded = true; + + this.graph = [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: timeSeriesSpendList, + ) + ]; + } else { + final errorMessage = json.decode(response.body)['message']; + print("Error: " + errorMessage); + + this.graph = null; + } + } + + Future>> getGraphData() async { + if (loaded == true) { + return [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: cachedData, + ) + ]; + } + + // TODO: Show available graph types based on whether or not the user is an Organisation or User + + /// Customer graph types: https://dev.peartrade.org/api/v1/customer/graphs + /// - total_last_week + /// - avg_spend_last_week + /// - total_last_month + /// - avg_spend_last_month + /// + /// Organisations' graphs types: to fetch, POST to https://dev.peartrade.org/api/stats/[name] as {"session_key":"[boop beep]"} + /// - organisations_all : organisation + /// - pies : organisation/pies + /// - snippets : organisation/snippets + /// - graphs : organisation/graphs + /// - {"graph":"customers_last_7_days","session_key":"[bleep]"} + /// - {"graph":"customers_last_30_days","session_key":"[blah]"} + /// - {"graph":"sales_last_7_days","session_key":"[bloop]"} + /// - {"graph":"sales_last_7_days","session_key":"[reee]"} + /// - {"graph":"purchases_last_7_days","session_key":"[yee]"} + /// - {"graph":"purchases_last_30_days","session_key":"[yah]"} + /// - {"graph":"purchases_all;","session_key":"[kappa]"} // I don't think this one works + /// + /// HTTP POST request sample: + /// {"graph":"total_last_week","session_key":"blahblahblah"} + + final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + SharedPreferences preferences = await SharedPreferences.getInstance(); + + Map body = { + 'graph': this.chartType, + 'session_key': preferences.get('LastToken'), + }; + + final response = await http.post( + url, + body: json.encode(body), + ); + + if (response.statusCode == 200) { + final responseJson = jsonDecode(response.body); + final List labels = responseJson['graph']['labels']; + final List data = responseJson['graph']['data']; + + List timeSeriesSpendList = new List(); + + for (int i = 0; i < labels.length; i++) { + timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); +// print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); + } + + cachedData = timeSeriesSpendList; + loaded = true; + + return [ + new charts.Series( + id: 'Spend', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesSpend spend, _) => spend.time, + measureFn: (TimeSeriesSpend spend, _) => spend.spend, + data: timeSeriesSpendList, + ) + ]; + } else { + final errorMessage = json.decode(response.body)['message']; + print("Error: " + errorMessage); + + return null; + } + } + + } class TimeSeriesSpend { diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index a98f471..f9f9431 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -63,7 +63,7 @@ class StatsPageState extends State { ), ), Padding( - padding: EdgeInsets.symmetric(horizontal: 10) + padding: EdgeInsets.symmetric(horizontal: 7) ), Text( From e44687fb6b14a559388b4a6cbfe91b7b275c0d7e Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 15:32:54 +0100 Subject: [PATCH 092/122] ui, save before experiment --- lib/pages/stats_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index f9f9431..9fee878 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -63,11 +63,11 @@ class StatsPageState extends State { ), ), Padding( - padding: EdgeInsets.symmetric(horizontal: 7) + padding: EdgeInsets.symmetric(horizontal: 4) ), Text( - "User type: " + userType, + userType, style: TextStyle( fontSize: 20, color: Colors.white70, From cda3fc57e9ecd6ccdc3c8aac6c910eaaaea5516a Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 15:36:41 +0100 Subject: [PATCH 093/122] fix broken dialog --- lib/common/widgets/organisations_dialog.dart | 11 ++++++++--- lib/pages/receipt_page_2.dart | 2 -- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 30b79b5..4a55641 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -134,12 +134,17 @@ class FindOrganisations { } setState(() => {_searchEnabled}); }, - onSubmitted: _searchEnabled ? (_) { + onSubmitted: ((_) { + if (_searchEnabled) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); var result = _submitSearch(searchBarText.text); result.then((_) { - setState(() {}); + setState(() { + _orgsFetched = true; + }); }); - } : null, + } + }), ), ), diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 1467d10..70d67f1 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -241,8 +241,6 @@ class ReceiptPage2State extends State { height: 32.0, child: RaisedButton( onPressed: () { - // var popupListView = new PopupListView(); - // var dialog = popupListView.dialog(context, optionsList, "Choose Organization"); var organisations = new FindOrganisations(); var orgDialog = organisations.dialog(context); orgDialog.then((organisation) { From 9a5bfbaaf0d0bbf4c600c328f50105fa9dc5c1cd Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 19 Aug 2019 15:47:08 +0100 Subject: [PATCH 094/122] some info added to orgs dialog --- ios/Podfile.lock | 4 ++-- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/widgets/organisations_dialog.dart | 7 +++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8132310..a4e1203 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a0f8e33..5b4844c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 4a55641..9a7b2e1 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -224,6 +224,13 @@ class FindOrganisations { ), ), ), + + Center( + child : Container( + padding: EdgeInsets.fromLTRB(0, 10, 0, 0), + child : Text("Long press a payee for more info", style: TextStyle(fontStyle: FontStyle.italic)), + ), + ), ] : [ Container() ], ), From 231ed2c9df11e67bebdc7832c399f56cb2ae36ca Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 13:54:45 +0100 Subject: [PATCH 095/122] many UI improvements and subtle tweaks --- lib/common/apifunctions/categories.dart | 2 +- .../apifunctions/find_organisations.dart | 2 +- lib/common/apifunctions/get_graph_data.dart | 16 +- .../apifunctions/request_login_api.dart | 35 ++-- .../apifunctions/request_logout_api.dart | 2 +- .../apifunctions/submit_receipt_api.dart | 2 +- .../widgets/animatedGradientButton.dart | 27 ++++ lib/env/dev.g.dart | 2 +- lib/env/dev.json | 2 +- lib/env/prod.g.dart | 2 +- lib/env/prod.json | 2 +- lib/pages/login_page.dart | 93 +++++------ lib/pages/receipt_page_2.dart | 149 ++++++++++-------- pubspec.lock | 7 + pubspec.yaml | 1 + 15 files changed, 191 insertions(+), 153 deletions(-) create mode 100644 lib/common/widgets/animatedGradientButton.dart diff --git a/lib/common/apifunctions/categories.dart b/lib/common/apifunctions/categories.dart index b00cc75..e9099b4 100644 --- a/lib/common/apifunctions/categories.dart +++ b/lib/common/apifunctions/categories.dart @@ -5,7 +5,7 @@ import 'package:local_spend/common/functions/get_token.dart'; import 'package:flutter/material.dart'; Future> getCategories() async { - const url = "https://dev.peartrade.org/api/search/category"; + const url = "https://dev.localspend.co.uk/api/search/category"; var token; await getToken().then((result) { diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index aa66ef9..b30479c 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -64,7 +64,7 @@ class Organisations { } Future> findOrganisations(String search) async { - final url = "https://dev.peartrade.org/api/search"; + final url = "https://dev.localspend.co.uk/api/search"; var token; await getToken().then((result) { diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 8846917..862582d 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -28,7 +28,7 @@ class GraphData { ]; } - final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { @@ -88,13 +88,13 @@ class GraphData { // TODO: Show available graph types based on whether or not the user is an Organisation or User - /// Customer graph types: https://dev.peartrade.org/api/v1/customer/graphs + /// Customer graph types: https://dev.localspend.co.uk/api/v1/customer/graphs /// - total_last_week /// - avg_spend_last_week /// - total_last_month /// - avg_spend_last_month /// - /// Organisations' graphs types: to fetch, POST to https://dev.peartrade.org/api/stats/[name] as {"session_key":"[boop beep]"} + /// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[name] as {"session_key":"[boop beep]"} /// - organisations_all : organisation /// - pies : organisation/pies /// - snippets : organisation/snippets @@ -110,7 +110,7 @@ class GraphData { /// HTTP POST request sample: /// {"graph":"total_last_week","session_key":"blahblahblah"} - final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { @@ -182,7 +182,7 @@ class OrgGraphData { ]; } - final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { @@ -242,13 +242,13 @@ class OrgGraphData { // TODO: Show available graph types based on whether or not the user is an Organisation or User - /// Customer graph types: https://dev.peartrade.org/api/v1/customer/graphs + /// Customer graph types: https://dev.localspend.co.uk/api/v1/customer/graphs /// - total_last_week /// - avg_spend_last_week /// - total_last_month /// - avg_spend_last_month /// - /// Organisations' graphs types: to fetch, POST to https://dev.peartrade.org/api/stats/[name] as {"session_key":"[boop beep]"} + /// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[name] as {"session_key":"[boop beep]"} /// - organisations_all : organisation /// - pies : organisation/pies /// - snippets : organisation/snippets @@ -264,7 +264,7 @@ class OrgGraphData { /// HTTP POST request sample: /// {"graph":"total_last_week","session_key":"blahblahblah"} - final url = "https://dev.peartrade.org/api/v1/customer/graphs"; + final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 2f74052..10565d3 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -11,26 +11,27 @@ Future _incorrectDialog(BuildContext context, bool isLoginWrong) async { context: context, barrierDismissible: true, builder: (BuildContext context) { - return AlertDialog( - title: Text("Unable to Login"), - content: Text(isLoginWrong ? "Incorrect login details. Please try again." : "Our servers are having issues at the moment; sorry for the inconvenience. Please try again later."), - actions: [ - FlatButton( - child: Text('OK'), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], + return AnimatedContainer( + duration: Duration(seconds: 2), + child : AlertDialog( + title: Text("Uh-oh!"), + content: Text(isLoginWrong ? "Incorrect login details. Please try again." : "Our servers are having issues at the moment; sorry for the inconvenience. Please try again later."), + actions: [ + FlatButton( + child: Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ), ); }, ); } -Future requestLoginAPI( - BuildContext context, String email, String password) async { - //var apiUrl = ConfigWrapper.of(context).apiKey; - final url = "https://dev.peartrade.org/api/login"; +Future requestLoginAPI(BuildContext context, String email, String password) async { + final url = "https://dev.localspend.co.uk/api/login"; Map body = { 'email': email, @@ -43,7 +44,7 @@ Future requestLoginAPI( final response = await http.post( url, body: json.encode(body), - ); + ).timeout(Duration(seconds: 5)); if (response.statusCode == 200) { final responseJson = json.decode(response.body); @@ -61,6 +62,8 @@ Future requestLoginAPI( return null; } + } on TimeoutException catch (_) { + _incorrectDialog(context, false); } catch (error) { debugPrint(error.toString()); _incorrectDialog(context, false); diff --git a/lib/common/apifunctions/request_logout_api.dart b/lib/common/apifunctions/request_logout_api.dart index 342c85b..afa5b8d 100644 --- a/lib/common/apifunctions/request_logout_api.dart +++ b/lib/common/apifunctions/request_logout_api.dart @@ -8,7 +8,7 @@ import 'package:local_spend/common/functions/save_logout.dart'; import 'package:local_spend/model/json/login_model.dart'; Future requestLogoutAPI(BuildContext context) async { - final url = "https://dev.peartrade.org/api/logout"; + final url = "https://dev.localspend.co.uk/api/logout"; var token; diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 9ea7462..7727c17 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -23,7 +23,7 @@ class Receipt { Future submitReceiptAPI( BuildContext context, Receipt receipt) async { //var apiUrl = ConfigWrapper.of(context).apiKey; - final url = "https://dev.peartrade.org/api/upload"; + final url = "https://dev.localspend.co.uk/api/upload"; SharedPreferences preferences = await SharedPreferences.getInstance(); diff --git a/lib/common/widgets/animatedGradientButton.dart b/lib/common/widgets/animatedGradientButton.dart new file mode 100644 index 0000000..c50d302 --- /dev/null +++ b/lib/common/widgets/animatedGradientButton.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:simple_animations/simple_animations.dart'; + +class AnimatedBackground extends StatelessWidget { + @override + Widget build(BuildContext context) { + final tween = MultiTrackTween([ + Track("color1").add(Duration(seconds: 4), + ColorTween(begin: Colors.lightBlue, end: Colors.lightBlue[300])), + ]); + + return ControlledAnimation( + playback: Playback.MIRROR, + tween: tween, + duration: tween.duration, + builder: (context, animation) { + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [animation["color1"], Colors.lightBlue])), + ); + }, + ); + } +} \ No newline at end of file diff --git a/lib/env/dev.g.dart b/lib/env/dev.g.dart index ad6c7c4..2ab2ce9 100644 --- a/lib/env/dev.g.dart +++ b/lib/env/dev.g.dart @@ -9,5 +9,5 @@ part of 'dev.dart'; const _$configJsonLiteral = { 'env': 'DEV', 'production': false, - 'apiUrl': 'https://dev.peartrade.org/api' + 'apiUrl': 'https://dev.localspend.co.uk/api' }; diff --git a/lib/env/dev.json b/lib/env/dev.json index 403630b..b2a9044 100644 --- a/lib/env/dev.json +++ b/lib/env/dev.json @@ -1,5 +1,5 @@ { "env": "DEV", "production": false, - "apiUrl": "https://dev.peartrade.org/api" + "apiUrl": "https://dev.localspend.co.uk/api" } \ No newline at end of file diff --git a/lib/env/prod.g.dart b/lib/env/prod.g.dart index 46e18c7..0d1854f 100644 --- a/lib/env/prod.g.dart +++ b/lib/env/prod.g.dart @@ -9,5 +9,5 @@ part of 'prod.dart'; const _$configJsonLiteral = { 'env': 'PROD', 'production': true, - 'apiUrl': 'https://www.peartrade.org/api' + 'apiUrl': 'https://www.localspend.co.uk/api' }; diff --git a/lib/env/prod.json b/lib/env/prod.json index ccdabad..fe2f989 100644 --- a/lib/env/prod.json +++ b/lib/env/prod.json @@ -1,5 +1,5 @@ { "env": "PROD", "production": true, - "apiUrl": "https://www.peartrade.org/api" + "apiUrl": "https://www.localspend.co.uk/api" } \ No newline at end of file diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index fc42e52..d3cec6a 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -18,6 +18,7 @@ class LoginPage extends StatefulWidget { } class LoginPageState extends State { + bool _isLoggingIn = false; final TextEditingController _emailController = TextEditingController(/*text: 'test@example.com'*/); // remove final TextEditingController _passwordController = TextEditingController(/*text: 'abc123'*/); // remove bool _saveLoginDetails = true; // I am extremely sorry for the placement of this variable @@ -69,6 +70,7 @@ class LoginPageState extends State { } login(String username, String password) async { + _isLoggingIn = true; SystemChannels.textInput.invokeMethod('TextInput.hide'); SharedPreferences preferences = await SharedPreferences.getInstance(); @@ -82,8 +84,9 @@ class LoginPageState extends State { print("details cleared"); } - requestLoginAPI(context, username, - password); + requestLoginAPI(context, username, password).then((value) { + _isLoggingIn = false; + }); } @override @@ -98,14 +101,6 @@ class LoginPageState extends State { } }, child: PlatformScaffold( -// drawer: BasicDrawer(), -// body: Container( -// decoration: BoxDecoration(color: Colors.white), -// margin: const EdgeInsets.all(20), -// child: Padding( -// padding: EdgeInsets.fromLTRB(30.0, 170.0, 30.0, 0.0), -// child: ListView( -// children: [ body: Container( decoration: new BoxDecoration( gradient: new LinearGradient( @@ -115,14 +110,15 @@ class LoginPageState extends State { end: Alignment.bottomCenter, ), ), - child: Container( + child: AnimatedContainer( + duration: Duration(seconds: 2), margin: EdgeInsets.fromLTRB(60,30,60,0), child: Column( children: [ Expanded( - child: Container( - margin: EdgeInsets.fromLTRB(15,0,15,0), -// alignment: FractionalOffset(0.5, 0.3), // not sure what this does ngl :/ + child: AnimatedContainer( + duration: Duration(seconds: 2), + margin: EdgeInsets.fromLTRB(15,0,15,0), decoration: BoxDecoration( image: DecorationImage( image: AssetImage('assets/images/launch_image.png') @@ -177,39 +173,42 @@ class LoginPageState extends State { Padding( padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0), - child : Material( - child: new Container( - decoration: new BoxDecoration( - border: new Border.all(color : Colors.transparent, width: 2), - borderRadius: BorderRadius.all(Radius.circular(2)), - gradient: new LinearGradient( - colors: [ - Colors.blue[300], - Colors.blue[500], - ], - stops: [0,1], - begin: Alignment.topLeft, - end: Alignment.bottomRight, + child: Opacity( + opacity: _isLoggingIn ? 0.5 : 1, + child : Material( + child: new Container( + decoration: new BoxDecoration( + border: new Border.all(color : Colors.transparent, width: 2), + borderRadius: BorderRadius.all(Radius.circular(2)), + gradient: new LinearGradient( + colors: [ + Colors.blue[300], + Colors.blue[500], + ], + stops: [0,1], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), ), - ), - child : Material( - type: MaterialType.transparency, + child : Material( + type: MaterialType.transparency, - child : InkWell( - onTap: () => login( _emailController.text, _passwordController.text), - child: new Container( - width: 100, - height: 50, - child: new Center( - child: new Text( - 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), + child : InkWell( + onTap: _isLoggingIn ? null : () => login( _emailController.text, _passwordController.text), + child: new Container( + width: 100, + height: 50, + child: new Center( + child: new Text( + 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), + ), ), ), ), - ), + ), ), ), ), @@ -229,22 +228,6 @@ class LoginPageState extends State { }); }, ), - - /*child: LabeledCheckboxWithIcon( - label : "SAVE LOGIN", - textStyle: TextStyle(fontSize: 18, color: Colors.black54, fontWeight: FontWeight.bold), - icon: Icons.account_box, // need to remove icon padding!! - iconSize: 18, - iconColor: Colors.black54, - padding: const EdgeInsets.fromLTRB(0,0,0,0), - value : _saveLoginDetails, - - onChanged: (bool newValue) { - setState(() { - _saveLoginDetails = newValue; - }); - }, - ),*/ ), ], ), diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 70d67f1..e526f43 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -3,6 +3,7 @@ import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:intl/intl.dart'; import 'dart:core'; import 'package:flutter/cupertino.dart'; +import 'package:local_spend/common/widgets/animatedGradientButton.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; import 'package:local_spend/common/widgets/organisations_dialog.dart'; import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; @@ -72,7 +73,7 @@ class ReceiptPage2State extends State { // "purchase_time":"2019-08-12T11:06:00.000+01:00", // "organisation_id":59661, // "essential":false, - // "session_key":"C438432A-B775-11E9-8EE8-147589E69626" + // "session_key":"C438440A-B775-11E9-8EE8-147589E69626" // } Receipt receipt = new Receipt(); @@ -149,7 +150,7 @@ class ReceiptPage2State extends State { child : Text( "Receipt Details", style: TextStyle( - fontSize: 24, + fontSize: 26, color: Colors.grey[700], fontWeight: FontWeight.bold, ), @@ -166,17 +167,18 @@ class ReceiptPage2State extends State { child : Text( "Date/Time", style: TextStyle( - fontSize: 18, + fontSize: 22, color: Colors.black, fontWeight: FontWeight.bold, ), ), - width: 110, + width: MediaQuery.of(context).size.width * 0.3, ), Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, + height: 40.0, + width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { showModalBottomSheet( @@ -208,7 +210,7 @@ class ReceiptPage2State extends State { ? '${new DateFormat.MMMd().format(transaction.date)}' + ", " + '${new DateFormat.Hm().format(transaction.date)}' : '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + ", " + '${new DateFormat.Hm().format(transaction.date)}', style: - TextStyle(color: Colors.white, fontSize: 18.0), + TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -228,17 +230,18 @@ class ReceiptPage2State extends State { child : Text( "Payee", style: TextStyle( - fontSize: 18, + fontSize: 22, color: Colors.black, fontWeight: FontWeight.bold, ), ), - width: 110, + width: MediaQuery.of(context).size.width * 0.3, ), Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, + height: 40.0, + width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { var organisations = new FindOrganisations(); @@ -261,7 +264,7 @@ class ReceiptPage2State extends State { ? transaction.organisation.name.substring(0,12) + "..." : transaction.organisation.name, style: - TextStyle(color: Colors.white, fontSize: 18.0), + TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -281,17 +284,18 @@ class ReceiptPage2State extends State { child : Text( "Recurring", style: TextStyle( - fontSize: 18, + fontSize: 22, color: Colors.black, fontWeight: FontWeight.bold, ), ), - width: 110, + width: MediaQuery.of(context).size.width * 0.3, ), Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, + height: 40.0, + width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { showModalBottomSheet( @@ -306,7 +310,7 @@ class ReceiptPage2State extends State { transaction.recurring = _sampleRecurringOptions[newValue]; setState(() {}); }), - itemExtent: 32, + itemExtent: 40, ), ); }); @@ -316,7 +320,7 @@ class ReceiptPage2State extends State { ? 'None' : transaction.recurring, style: - TextStyle(color: Colors.white, fontSize: 18.0), + TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -334,17 +338,18 @@ class ReceiptPage2State extends State { child : Text( "Category", style: TextStyle( - fontSize: 18, + fontSize: 22, color: Colors.black, fontWeight: FontWeight.bold, ), ), - width: 110, + width: MediaQuery.of(context).size.width * 0.3, ), Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, + height: 40.0, + width: MediaQuery.of(context).size.width * 0.6, child: Tooltip( message: "Category of transaction", child: RaisedButton( @@ -361,7 +366,7 @@ class ReceiptPage2State extends State { transaction.category = _categories[newValue]; setState(() {}); }), - itemExtent: 32, + itemExtent: 40, ), ); }); @@ -371,7 +376,7 @@ class ReceiptPage2State extends State { ? 'None' : transaction.category, style: - TextStyle(color: Colors.white, fontSize: 18.0), + TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -391,16 +396,17 @@ class ReceiptPage2State extends State { child : Text( "Essential", style: TextStyle( - fontSize: 18, + fontSize: 22, color: Colors.black, fontWeight: FontWeight.bold, ), ), - width: 95, + width: MediaQuery.of(context).size.width * 0.3, ), Container( - height: 32.0, + height: 40.0, + width: MediaQuery.of(context).size.width * 0.6, child: Checkbox( value: transaction.isEssential, onChanged: ((value) { @@ -423,19 +429,19 @@ class ReceiptPage2State extends State { child : Text( "Amount", style: TextStyle( - fontSize: 18, + fontSize: 22, color: Colors.black, fontWeight: FontWeight.bold, ), ), - width: 110, + width: MediaQuery.of(context).size.width * 0.3, ), Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 32.0, - width: 100, + height: 40.0, + width: MediaQuery.of(context).size.width * 0.6, child: TextField( controller: transaction.amount, decoration: InputDecoration( @@ -454,46 +460,57 @@ class ReceiptPage2State extends State { child: Tooltip( message: "Submit receipt", child: Container( - height: 65.0, - child: RaisedButton( - onPressed: () { - try { - if (transaction.amount.text == "" || transaction.organisation.name == null) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); + decoration: new BoxDecoration( + border: new Border.all(color : Colors.transparent, width: 2), + borderRadius: BorderRadius.all(Radius.circular(2)), + ), + height: 75.0, + child: Stack( + children: [ + AnimatedBackground(), + Material( + type: MaterialType.transparency, + child: InkWell( + child: Center( + child : Text("GO", + style: + TextStyle(color: Colors.white, fontSize: 30.0), + ), + ), + onTap: () { + try { + if (transaction.amount.text == "" || transaction.organisation.name == null) { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } else { + if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { + _submitReceipt(transaction); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } } - ); - } else { - if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { - _submitReceipt(transaction); - } else { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } - } - } - catch (_) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } - }, - - - child: Text("GO", - style: - TextStyle(color: Colors.white, fontSize: 22.0), - ), - color: Colors.blue, + } + catch (_) { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } + }, + ), + ), + ], ), ), ), diff --git a/pubspec.lock b/pubspec.lock index cc8d2b8..8db997c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -394,6 +394,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.3" + simple_animations: + dependency: "direct main" + description: + name: simple_animations + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.3" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index c05bf61..385c2e0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,6 +25,7 @@ dependencies: flutter_linkify: ^1.0.3 flutter_fadein: ^1.1.1 charts_flutter: ^0.6.0 + simple_animations: ^1.3.3 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 From 84c2fb1f2a7a934ec2a601b728f5c6c5981d4f76 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 13:58:53 +0100 Subject: [PATCH 096/122] button is less square --- lib/pages/receipt_page_2.dart | 87 +++++++++++++++++------------------ 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index e526f43..c565922 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -460,57 +460,56 @@ class ReceiptPage2State extends State { child: Tooltip( message: "Submit receipt", child: Container( - decoration: new BoxDecoration( - border: new Border.all(color : Colors.transparent, width: 2), - borderRadius: BorderRadius.all(Radius.circular(2)), - ), height: 75.0, - child: Stack( - children: [ - AnimatedBackground(), - Material( - type: MaterialType.transparency, - child: InkWell( - child: Center( - child : Text("GO", - style: - TextStyle(color: Colors.white, fontSize: 30.0), + child: ClipRRect( + borderRadius: BorderRadius.circular(2), + child: Stack( + children: [ + AnimatedBackground(), + Material( + type: MaterialType.transparency, + child: InkWell( + child: Center( + child : Text("GO", + style: + TextStyle(color: Colors.white, fontSize: 30.0), + ), ), - ), - onTap: () { - try { - if (transaction.amount.text == "" || transaction.organisation.name == null) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } else { - if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { - _submitReceipt(transaction); - } else { + onTap: () { + try { + if (transaction.amount.text == "" || transaction.organisation.name == null) { showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } ); + } else { + if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { + _submitReceipt(transaction); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } } } - } - catch (_) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } - }, + catch (_) { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } + }, + ), ), - ), - ], + ], + ), ), ), ), From d7bcb29eda6d2a4ec0fe192dc88c3620483c839f Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 14:04:31 +0100 Subject: [PATCH 097/122] made UI more responsive to screen size --- lib/pages/receipt_page_2.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index c565922..1b8b681 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -158,7 +158,7 @@ class ReceiptPage2State extends State { ), // "Receipt Details" title Container( - padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Tooltip( message: "Date and time of transaction", child: Row( @@ -221,7 +221,7 @@ class ReceiptPage2State extends State { ), // Date/Time picker Container( - padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Tooltip( message: "Transaction payee", child: Row( @@ -275,7 +275,7 @@ class ReceiptPage2State extends State { ), // Organisation picker Container( - padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Tooltip( message: "Transaction recrudescence", child: Row( @@ -331,7 +331,7 @@ class ReceiptPage2State extends State { ), // Recurring picker Container( - padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Row( children: [ Container( @@ -387,7 +387,7 @@ class ReceiptPage2State extends State { ), // Category picker Container( - padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Tooltip( message: "Essential or not", child: Row( @@ -420,7 +420,7 @@ class ReceiptPage2State extends State { ), // Essential Container( - padding: EdgeInsets.fromLTRB(25,15,15.0,0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Tooltip( message: "Transaction amount", child: Row( @@ -456,7 +456,7 @@ class ReceiptPage2State extends State { ), // Amount picker Padding( - padding: EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Tooltip( message: "Submit receipt", child: Container( From 49038e9adc1875716e4887c955b48b97d4c4a2f4 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 14:06:39 +0100 Subject: [PATCH 098/122] consistency in ui --- lib/pages/receipt_page_2.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 1b8b681..cb7960d 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -443,6 +443,10 @@ class ReceiptPage2State extends State { height: 40.0, width: MediaQuery.of(context).size.width * 0.6, child: TextField( + style: TextStyle( + fontSize: 20, + ), + textAlign: TextAlign.center, controller: transaction.amount, decoration: InputDecoration( hintText: "0.00" From 28cd64aaee257dea9edfb2840ee5349798e56c6d Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 14:13:01 +0100 Subject: [PATCH 099/122] i need to fix these pickers --- lib/pages/receipt_page_2.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index cb7960d..c5124fa 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -305,12 +305,14 @@ class ReceiptPage2State extends State { height: MediaQuery.of(context).copyWith().size.height / 3, child: CupertinoPicker( backgroundColor: Colors.white, - children: _sampleRecurringOptions.map((thisOption) => Text(thisOption)).toList(), + children: _sampleRecurringOptions.map((thisOption) => Text(thisOption, style: TextStyle(fontSize: 30))).toList(), onSelectedItemChanged: ((newValue) { transaction.recurring = _sampleRecurringOptions[newValue]; setState(() {}); }), - itemExtent: 40, + magnification: 1.1, + useMagnifier: true, + itemExtent: 36, ), ); }); @@ -361,12 +363,14 @@ class ReceiptPage2State extends State { height: MediaQuery.of(context).copyWith().size.height / 3, child: CupertinoPicker( backgroundColor: Colors.white, - children: _categories.map((thisOption) => Text(thisOption)).toList(), + children: _categories.map((thisOption) => Text(thisOption, style: TextStyle(fontSize: 30),)).toList(), onSelectedItemChanged: ((newValue) { transaction.category = _categories[newValue]; setState(() {}); }), - itemExtent: 40, + magnification: 1.1, + useMagnifier: true, + itemExtent: 36, ), ); }); From f5d2e991a8746cab36bb3d3408789f288f43d00a Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 16:01:56 +0100 Subject: [PATCH 100/122] ui improvements --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- .../widgets/animatedGradientButton.dart | 19 +- lib/main.dart | 4 - lib/pages/login_page.dart | 215 ++++++++---------- lib/pages/receipt_page_2.dart | 139 ++++++----- 6 files changed, 184 insertions(+), 199 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4e1203..8132310 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5b4844c..a0f8e33 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/widgets/animatedGradientButton.dart b/lib/common/widgets/animatedGradientButton.dart index c50d302..6880eb9 100644 --- a/lib/common/widgets/animatedGradientButton.dart +++ b/lib/common/widgets/animatedGradientButton.dart @@ -2,11 +2,22 @@ import 'package:flutter/material.dart'; import 'package:simple_animations/simple_animations.dart'; class AnimatedBackground extends StatelessWidget { + final List animateColors; + final Color lastColor; + final Alignment begin, end; + + AnimatedBackground( + this.animateColors, + this.lastColor, + this.begin, + this.end, + ); + @override Widget build(BuildContext context) { final tween = MultiTrackTween([ Track("color1").add(Duration(seconds: 4), - ColorTween(begin: Colors.lightBlue, end: Colors.lightBlue[300])), + ColorTween(begin: this.animateColors[0], end: this.animateColors[1])), ]); return ControlledAnimation( @@ -17,9 +28,9 @@ class AnimatedBackground extends StatelessWidget { return Container( decoration: BoxDecoration( gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [animation["color1"], Colors.lightBlue])), + begin: this.begin, + end: this.end, + colors: [animation["color1"], this.lastColor])), ); }, ); diff --git a/lib/main.dart b/lib/main.dart index 7a63c3b..64d2d0c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,10 +15,6 @@ void main() { class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { -// GraphData gd = new GraphData(); -// gd.getGraphData('total_last_week'); - - //var config = ConfigWrapper.of(context); return new MaterialApp( debugShowCheckedModeBanner: false, localizationsDelegates: [ diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index d3cec6a..e05ea28 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -7,6 +7,7 @@ import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:local_spend/common/widgets/labeled_checkbox.dart'; +import 'package:local_spend/common/widgets/animatedGradientButton.dart'; const URL = "https://flutter.io/"; @@ -101,137 +102,117 @@ class LoginPageState extends State { } }, child: PlatformScaffold( - body: Container( - decoration: new BoxDecoration( - gradient: new LinearGradient( - colors: [Colors.blue[50], Colors.white], - stops: [0,1], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - ), - child: AnimatedContainer( - duration: Duration(seconds: 2), - margin: EdgeInsets.fromLTRB(60,30,60,0), - child: Column( - children: [ - Expanded( - child: AnimatedContainer( - duration: Duration(seconds: 2), - margin: EdgeInsets.fromLTRB(15,0,15,0), - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/images/launch_image.png') - ), - ), - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), - child: TextField( - autocorrect: false, - textAlign: TextAlign.center, - controller: _emailController, - decoration: InputDecoration( - hintText: "EMAIL", - hintStyle: TextStyle(fontSize: 15), - ), - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - FocusScope.of(context).requestFocus(focusNode); - }, - ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 15.0, 0.0, 0.0), - child: TextField( - autocorrect: false, - textAlign: TextAlign.center, - controller: _passwordController, - focusNode: focusNode, - decoration: InputDecoration( - hintText: 'PASSWORD', - hintStyle: TextStyle(fontSize: 15), - ), - obscureText: true, - style: TextStyle( - fontSize: 18.0, - color: Colors.grey[800], - fontWeight: FontWeight.bold, - ), - onSubmitted: (_) { - login( _emailController.text, - _passwordController.text); - }, - ), - ), + body: Stack( + children: [ + AnimatedBackground([Colors.blue[50], Colors.lightBlue[50]], Colors.white, Alignment.topRight, Alignment.bottomLeft), - Padding( - padding: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0), - - child: Opacity( - opacity: _isLoggingIn ? 0.5 : 1, - child : Material( - child: new Container( - decoration: new BoxDecoration( - border: new Border.all(color : Colors.transparent, width: 2), - borderRadius: BorderRadius.all(Radius.circular(2)), - gradient: new LinearGradient( - colors: [ - Colors.blue[300], - Colors.blue[500], - ], - stops: [0,1], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ), - - child : Material( - type: MaterialType.transparency, - - child : InkWell( - onTap: _isLoggingIn ? null : () => login( _emailController.text, _passwordController.text), - child: new Container( - width: 100, - height: 50, - child: new Center( - child: new Text( - 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), - ), + Container( + margin: EdgeInsets.fromLTRB(60,30,60,0), + child: Column( + children: [ + Expanded( + child: AnimatedContainer( + duration: Duration(seconds: 2), + margin: EdgeInsets.fromLTRB(15,0,15,0), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/images/launch_image.png') ), ), ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0), + child: TextField( + autocorrect: false, + textAlign: TextAlign.center, + controller: _emailController, + decoration: InputDecoration( + hintText: "EMAIL", + hintStyle: TextStyle(fontSize: 15), + ), + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + FocusScope.of(context).requestFocus(focusNode); + }, + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(0.0, 15.0, 0.0, 0.0), + child: TextField( + autocorrect: false, + textAlign: TextAlign.center, + controller: _passwordController, + focusNode: focusNode, + decoration: InputDecoration( + hintText: 'PASSWORD', + hintStyle: TextStyle(fontSize: 15), + ), + obscureText: true, + style: TextStyle( + fontSize: 18.0, + color: Colors.grey[800], + fontWeight: FontWeight.bold, + ), + onSubmitted: (_) { + login( _emailController.text, + _passwordController.text); + }, + ), + ), + Container( + margin: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0), + width: 100, + height: 50, + child: Opacity( + opacity: _isLoggingIn ? 0.5 : 1, + child: ClipRRect( + borderRadius: BorderRadius.circular(2), + child : Stack( + children : [ + AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.topRight, Alignment.bottomLeft), + Material( + type: MaterialType.transparency, + child : InkWell( + onTap: _isLoggingIn ? null : () => login( _emailController.text, _passwordController.text), + child: new Center( + child: new Text( + 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), + ), + ), + ), + ], + ), ), ), ), - ), - Padding( - padding: EdgeInsets.fromLTRB(0, 10, 0, 50), + Padding( + padding: EdgeInsets.fromLTRB(0, 10, 0, 50), - child: LabeledCheckbox( - label : "SAVE LOGIN", - textStyle: TextStyle(fontSize: 18, color: Colors.black54, fontWeight: FontWeight.bold), - padding: const EdgeInsets.fromLTRB(0,0,0,0), - value : _saveLoginDetails, + child: LabeledCheckbox( + label : "SAVE LOGIN", + textStyle: TextStyle(fontSize: 18, color: Colors.black54, fontWeight: FontWeight.bold), + padding: const EdgeInsets.fromLTRB(0,0,0,0), + value : _saveLoginDetails, - onChanged: (bool newValue) { - setState(() { - _saveLoginDetails = newValue; - }); - }, + onChanged: (bool newValue) { + setState(() { + _saveLoginDetails = newValue; + }); + }, + ), ), - ), - ], + ], + ), ), - ), + ], ), ), ); diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index c5124fa..9f44f99 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -66,15 +66,6 @@ class ReceiptPage2State extends State { _submitReceipt(Transaction transaction) { DateTime dt = new DateTime.now(); - // sample transaction: - // { - // "transaction_type":1, - // "transaction_value":33, - // "purchase_time":"2019-08-12T11:06:00.000+01:00", - // "organisation_id":59661, - // "essential":false, - // "session_key":"C438440A-B775-11E9-8EE8-147589E69626" - // } Receipt receipt = new Receipt(); receipt.organisationName = transaction.organisation.name; @@ -205,10 +196,12 @@ class ReceiptPage2State extends State { }, child: Text( transaction.date == null - ? 'None set' - : transaction.date.year == DateTime.now().year - ? '${new DateFormat.MMMd().format(transaction.date)}' + ", " + '${new DateFormat.Hm().format(transaction.date)}' - : '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + ", " + '${new DateFormat.Hm().format(transaction.date)}', + ? 'None set.' + : transaction.date.year != DateTime.now().year + ? '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + " at " + '${new DateFormat.Hm().format(transaction.date)}' + : transaction.date.day == DateTime.now().day && transaction.date.month == DateTime.now().month + ? "Today at " + '${new DateFormat.Hm().format(transaction.date)}' + : '${new DateFormat.MMMd().format(transaction.date)}' + " at " + '${new DateFormat.Hm().format(transaction.date)}', style: TextStyle(color: Colors.white, fontSize: 22.0), ), @@ -299,23 +292,24 @@ class ReceiptPage2State extends State { child: RaisedButton( onPressed: () { showModalBottomSheet( - context: context, - builder: (BuildContext builder) { - return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, - child: CupertinoPicker( - backgroundColor: Colors.white, - children: _sampleRecurringOptions.map((thisOption) => Text(thisOption, style: TextStyle(fontSize: 30))).toList(), - onSelectedItemChanged: ((newValue) { - transaction.recurring = _sampleRecurringOptions[newValue]; - setState(() {}); - }), - magnification: 1.1, - useMagnifier: true, - itemExtent: 36, - ), - ); - }); + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context).copyWith().size.height / 3, + child: CupertinoPicker( + backgroundColor: Colors.white, + children: _sampleRecurringOptions.map((thisOption) => Text(thisOption, style: TextStyle(fontSize: 30))).toList(), + onSelectedItemChanged: ((newValue) { + transaction.recurring = _sampleRecurringOptions[newValue]; + setState(() {}); + }), + magnification: 1.1, + useMagnifier: true, + itemExtent: 36, + ), + ); + } + ); }, child: Text( transaction.recurring == null @@ -380,7 +374,7 @@ class ReceiptPage2State extends State { ? 'None' : transaction.category, style: - TextStyle(color: Colors.white, fontSize: 22.0), + TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -471,52 +465,55 @@ class ReceiptPage2State extends State { height: 75.0, child: ClipRRect( borderRadius: BorderRadius.circular(2), - child: Stack( - children: [ - AnimatedBackground(), - Material( - type: MaterialType.transparency, - child: InkWell( - child: Center( - child : Text("GO", - style: - TextStyle(color: Colors.white, fontSize: 30.0), + child: Opacity( + opacity: 1, + child: Stack( + children: [ + AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.topLeft, Alignment.bottomRight), + Material( + type: MaterialType.transparency, + child: InkWell( + child: Center( + child : Text("GO", + style: + TextStyle(color: Colors.white, fontSize: 30.0), + ), ), - ), - onTap: () { - try { - if (transaction.amount.text == "" || transaction.organisation.name == null) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } else { - if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { - _submitReceipt(transaction); - } else { + onTap: () { + try { + if (transaction.amount.text == "" || transaction.organisation.name == null) { showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } ); + } else { + if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { + _submitReceipt(transaction); + } else { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } } } - } - catch (_) { - showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); - } - }, + catch (_) { + showDialog( + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + } + ); + } + }, + ), ), - ), - ], + ], + ), ), ), ), From ebf09413fddb03833dfbf88ff45ef7b0c948ef80 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 16:08:11 +0100 Subject: [PATCH 101/122] fixed slow rebuilding slightly --- lib/pages/receipt_page_2.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 9f44f99..c1381c9 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -104,7 +104,6 @@ class ReceiptPage2State extends State { _futureCats.then((value) { _categories = null; _categories = value; - setState(() {}); }); } From 68102ea6288a2c9390360023d87bd0521dbad8c4 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 20 Aug 2019 16:37:32 +0100 Subject: [PATCH 102/122] orgs dialog button disables/enables properly --- ios/Podfile.lock | 4 +-- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/widgets/organisations_dialog.dart | 32 ++++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8132310..a4e1203 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -6,13 +6,13 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a0f8e33..5b4844c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -281,7 +281,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 9a7b2e1..32a69eb 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -82,6 +82,8 @@ class FindOrganisations { } Future dialog(context) { + var focusNode = new FocusNode(); + bool _searchEnabled = false; bool _orgsFetched = false; TextEditingController searchBarText = new TextEditingController(); @@ -104,6 +106,8 @@ class FindOrganisations { barrierDismissible: true, builder: (BuildContext context) { + FocusScope.of(context).requestFocus(focusNode); + return StatefulBuilder( builder: (context, setState) { return @@ -122,6 +126,7 @@ class FindOrganisations { width: 150, height: 50, child: TextField( + focusNode: focusNode, controller: searchBarText, decoration: InputDecoration( hintText: "Payee Name", @@ -134,17 +139,15 @@ class FindOrganisations { } setState(() => {_searchEnabled}); }, - onSubmitted: ((_) { - if (_searchEnabled) { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() { - _orgsFetched = true; - }); + onSubmitted: _searchEnabled ? ((_) { + SystemChannels.textInput.invokeMethod('TextInput.hide'); + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() { + _orgsFetched = true; }); - } - }), + }); + }) : null, ), ), @@ -153,8 +156,7 @@ class FindOrganisations { padding: EdgeInsets.fromLTRB(20, 0, 0, 0), child: RaisedButton( - onPressed: (() { - if (_searchEnabled) { + onPressed: _searchEnabled ? (() { SystemChannels.textInput.invokeMethod('TextInput.hide'); var result = _submitSearch(searchBarText.text); result.then((_) { @@ -162,12 +164,10 @@ class FindOrganisations { _orgsFetched = true; }); }); - } - }), + }) : null, child: Icon(Icons.search, color: Colors.white), - color: _searchEnabled ? Colors.blue : Colors.blue[200], - // make inactive when search in progress as activity indicator + color : Colors.blue, ), ), ], From cf6753363c10ceda915b8252da81084a10e2e5ef Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 21 Aug 2019 10:16:46 +0100 Subject: [PATCH 103/122] lots of UI and some improvements to logic --- .idea/codeStyles/Project.xml | 116 ++++++++++++++++++ lib/common/functions/customAbout.dart | 6 +- .../widgets/animatedGradientButton.dart | 4 +- lib/common/widgets/organisations_dialog.dart | 22 ++-- lib/pages/login_page.dart | 4 +- lib/pages/more_page.dart | 71 ++++++++--- lib/pages/receipt_page_2.dart | 26 ++-- 7 files changed, 201 insertions(+), 48 deletions(-) create mode 100644 .idea/codeStyles/Project.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +

+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+ + + + + \ No newline at end of file diff --git a/lib/common/functions/customAbout.dart b/lib/common/functions/customAbout.dart index 28f8732..20c3c83 100644 --- a/lib/common/functions/customAbout.dart +++ b/lib/common/functions/customAbout.dart @@ -264,9 +264,13 @@ class AboutDialog extends StatelessWidget { body.add(Expanded( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: ListBody( children: [ - Text(name, style: Theme.of(context).textTheme.title), + Container( + padding: EdgeInsets.only(top: 10), + child: Text(name, style: Theme.of(context).textTheme.title), + ), Text(version, style: Theme.of(context).textTheme.body1), Text(applicationLegalese ?? '', style: Theme.of(context).textTheme.caption), ], diff --git a/lib/common/widgets/animatedGradientButton.dart b/lib/common/widgets/animatedGradientButton.dart index 6880eb9..9814ac8 100644 --- a/lib/common/widgets/animatedGradientButton.dart +++ b/lib/common/widgets/animatedGradientButton.dart @@ -5,18 +5,20 @@ class AnimatedBackground extends StatelessWidget { final List animateColors; final Color lastColor; final Alignment begin, end; + final int duration; AnimatedBackground( this.animateColors, this.lastColor, this.begin, this.end, + this.duration, ); @override Widget build(BuildContext context) { final tween = MultiTrackTween([ - Track("color1").add(Duration(seconds: 4), + Track("color1").add(Duration(seconds: this.duration), ColorTween(begin: this.animateColors[0], end: this.animateColors[1])), ]); diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 32a69eb..2c921aa 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -82,7 +82,6 @@ class FindOrganisations { } Future dialog(context) { - var focusNode = new FocusNode(); bool _searchEnabled = false; bool _orgsFetched = false; @@ -106,15 +105,10 @@ class FindOrganisations { barrierDismissible: true, builder: (BuildContext context) { - FocusScope.of(context).requestFocus(focusNode); return StatefulBuilder( builder: (context, setState) { - return -// AnimatedContainer( -// duration: Duration(seconds: 1), -// child : - SimpleDialog( + return SimpleDialog( children: [ Column( children: [ @@ -126,7 +120,7 @@ class FindOrganisations { width: 150, height: 50, child: TextField( - focusNode: focusNode, + autofocus: true, controller: searchBarText, decoration: InputDecoration( hintText: "Payee Name", @@ -157,13 +151,13 @@ class FindOrganisations { child: RaisedButton( onPressed: _searchEnabled ? (() { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() { - _orgsFetched = true; - }); + SystemChannels.textInput.invokeMethod('TextInput.hide'); + var result = _submitSearch(searchBarText.text); + result.then((_) { + setState(() { + _orgsFetched = true; }); + }); }) : null, child: Icon(Icons.search, color: Colors.white), diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index e05ea28..84f831d 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -104,7 +104,7 @@ class LoginPageState extends State { child: PlatformScaffold( body: Stack( children: [ - AnimatedBackground([Colors.blue[50], Colors.lightBlue[50]], Colors.white, Alignment.topRight, Alignment.bottomLeft), + AnimatedBackground([Colors.lightBlue[50], Colors.lightBlue[50]], Colors.white, Alignment.topRight, Alignment.bottomLeft, 3), Container( margin: EdgeInsets.fromLTRB(60,30,60,0), @@ -175,7 +175,7 @@ class LoginPageState extends State { borderRadius: BorderRadius.circular(2), child : Stack( children : [ - AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.topRight, Alignment.bottomLeft), + AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.bottomRight, Alignment.topLeft, 3), Material( type: MaterialType.transparency, child : InkWell( diff --git a/lib/pages/more_page.dart b/lib/pages/more_page.dart index ae9405b..f467213 100644 --- a/lib/pages/more_page.dart +++ b/lib/pages/more_page.dart @@ -70,12 +70,11 @@ class MorePageState extends State { ), body: Container( - padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), child: ListView( children: [ Container( - padding: EdgeInsets.fromLTRB(0.0,25,0.0,0.0), + padding: EdgeInsets.fromLTRB(30.0,25,30.0,0.0), child : Text( "Local Spend Tracker", textAlign: TextAlign.center, @@ -88,7 +87,7 @@ class MorePageState extends State { ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 25.0, 0.0, 0.0), + padding: EdgeInsets.fromLTRB(30.0, 25.0, 30.0, 0.0), child: Container( height: 65.0, child: RaisedButton( @@ -98,22 +97,56 @@ class MorePageState extends State { context: context, applicationIcon: new Icon(Icons.receipt), applicationName: "Local Spend Tracker", - children: [ - Text("Pear Trading is a commerce company designed to register and monitor money circulating in the local economy."), - Text("\nContact at test@example.com or +44 01524 64544"), - - Padding( - padding: EdgeInsets.fromLTRB(0,20,0,0), - child: InkWell( - child: Text - ('Developed by Shadowcat Systems', - style: TextStyle( - color: Colors.blue, - ), - ), - onTap: () => launch('https://shadow.cat/') + children: + [ + Text("Pear Trading is a commerce company designed to register and monitor money circulating in the local economy.\n"), + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 35, + child: RaisedButton( + onPressed: () => {}, + child: Text("Contact us", + style: + TextStyle(color: Colors.white, fontSize: 18.0)), + color: Colors.green, ), ), + + Container( + height: 35, + margin: EdgeInsets.fromLTRB(10, 20, 10, 0), + child: RaisedButton( + child: Text + ('Pear Trading', + style: TextStyle( + color: Colors.white, + fontSize: 18.0 + ), + ), + color: Colors.lightGreen, + onPressed: () => launch('http://www.peartrade.org') + ), + ), + + Container( + height: 35, + margin: EdgeInsets.fromLTRB(10, 20, 10, 0), + child: Material( + child: OutlineButton( + child: Text + ('Shadowcat Systems', + style: TextStyle( + color: Colors.black, + fontSize: 18.0 /// I don't know what to do with this button + ), + ), + onPressed: () => launch('https://shadow.cat/'), + ), + color: Colors.lightGreenAccent, + shadowColor: Colors.transparent, + ), + ), + ], ); @@ -127,7 +160,7 @@ class MorePageState extends State { ), Padding( - padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), + padding: EdgeInsets.fromLTRB(30.0, 20.0, 30.0, 0.0), child: Container( height: 65.0, child: RaisedButton( @@ -150,7 +183,7 @@ class MorePageState extends State { ), // Padding( -// padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0), +// padding: EdgeInsets.fromLTRB(30.0, 20.0, 30.0, 0.0), // child: Container( // height: 65.0, // child: RaisedButton( diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index c1381c9..526c33b 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -98,6 +98,10 @@ class ReceiptPage2State extends State { @override Widget build(BuildContext context) { + var _widgetHeight = MediaQuery.of(context).size.height * 0.06 < 40.0 ? 40.0 : MediaQuery.of(context).size.height * 0.06; + + debugPrint(_widgetHeight.toString()); + if (_categories.length == 0) { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); @@ -136,7 +140,7 @@ class ReceiptPage2State extends State { // doesn't fit the screen properly and looks weird Container( - padding: const EdgeInsets.fromLTRB(15, 17, 0, 0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.025,MediaQuery.of(context).size.height * 0.025,0,0.0), child : Text( "Receipt Details", style: TextStyle( @@ -167,7 +171,7 @@ class ReceiptPage2State extends State { Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 40.0, + height: _widgetHeight, width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { @@ -232,7 +236,7 @@ class ReceiptPage2State extends State { Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 40.0, + height: _widgetHeight, width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { @@ -269,7 +273,7 @@ class ReceiptPage2State extends State { Container( padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), child: Tooltip( - message: "Transaction recrudescence", + message: "Repeating?", child: Row( children: [ Container( @@ -286,7 +290,7 @@ class ReceiptPage2State extends State { Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 40.0, + height: _widgetHeight, width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { @@ -343,7 +347,7 @@ class ReceiptPage2State extends State { Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 40.0, + height: _widgetHeight, width: MediaQuery.of(context).size.width * 0.6, child: Tooltip( message: "Category of transaction", @@ -402,7 +406,7 @@ class ReceiptPage2State extends State { ), Container( - height: 40.0, + height: _widgetHeight, width: MediaQuery.of(context).size.width * 0.6, child: Checkbox( value: transaction.isEssential, @@ -437,7 +441,7 @@ class ReceiptPage2State extends State { Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 40.0, + height: _widgetHeight, width: MediaQuery.of(context).size.width * 0.6, child: TextField( style: TextStyle( @@ -457,18 +461,18 @@ class ReceiptPage2State extends State { ), // Amount picker Padding( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), + padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,MediaQuery.of(context).size.height * 0.03,MediaQuery.of(context).size.width * 0.05,15.0), child: Tooltip( message: "Submit receipt", child: Container( - height: 75.0, + height: _widgetHeight * 1.7, child: ClipRRect( borderRadius: BorderRadius.circular(2), child: Opacity( opacity: 1, child: Stack( children: [ - AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.topLeft, Alignment.bottomRight), + AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.topLeft, Alignment.bottomRight, 4), Material( type: MaterialType.transparency, child: InkWell( From 19021a9a09420365255fbe7313a9eabc73b02af8 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 21 Aug 2019 12:35:21 +0100 Subject: [PATCH 104/122] maps api implementation started --- .gitignore | 3 ++- android/app/src/main/AndroidManifest.xml | 5 ++++ ios/Runner/Info.plist | 2 ++ lib/pages/home_page.dart | 10 ++++++++ lib/pages/map_page.dart | 32 ++++++++++++++++++++++++ lib/pages/receipt_page_2.dart | 2 -- pubspec.lock | 7 ++++++ pubspec.yaml | 1 + 8 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 lib/pages/map_page.dart diff --git a/.gitignore b/.gitignore index 228c2c7..6f22238 100644 --- a/.gitignore +++ b/.gitignore @@ -234,4 +234,5 @@ fabric.properties !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -# End of https://www.gitignore.io/api/android,flutter,androidstudio \ No newline at end of file +# End of https://www.gitignore.io/api/android,flutter,androidstudio +lib/common/felixApiCreds.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7949887..ccadded 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -30,6 +30,11 @@ + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index fd153b8..b9f4528 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -47,5 +47,7 @@ UIViewControllerBasedStatusBarAppearance + io.flutter.embedded_views_preview + diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 37c1970..2c7d3d4 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:local_spend/pages/receipt_page_2.dart'; import 'package:local_spend/pages/more_page.dart'; import 'package:local_spend/pages/stats_page.dart'; +import 'package:local_spend/pages/map_page.dart'; class HomePage extends StatelessWidget { static String _title = 'Text here'; @@ -24,11 +25,13 @@ class HomePageWidget extends StatefulWidget { class _HomePageState extends State { int _selectedIndex = 0; + static const TextStyle optionStyle = TextStyle(fontSize: 30, fontWeight: FontWeight.bold); static List _widgetOptions = [ ReceiptPage2(), StatsPage(), + MapPage(), MorePage() ]; @@ -40,6 +43,8 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { + var _itemText = TextStyle(color: Colors.grey[400]); + return Scaffold( body: Center( child: _widgetOptions.elementAt(_selectedIndex), @@ -54,12 +59,17 @@ class _HomePageState extends State { icon: Icon(Icons.show_chart), title: Text('Statistics'), ), + BottomNavigationBarItem( + icon: Icon(Icons.map), + title: Text('Locations'), + ), BottomNavigationBarItem( icon: Icon(Icons.more_horiz), title: Text('More'), ), ], currentIndex: _selectedIndex, + unselectedItemColor: Colors.grey[400], selectedItemColor: Colors.blue[400], onTap: _onItemTapped, ), diff --git a/lib/pages/map_page.dart b/lib/pages/map_page.dart new file mode 100644 index 0000000..f15c25d --- /dev/null +++ b/lib/pages/map_page.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_maps/flutter_maps.dart'; +import 'package:local_spend/common/felixApiCreds.dart'; + +class MapPage extends StatefulWidget { + MapPage({Key key}) : super(key: key); + + @override + _MapPageState createState() { + return _MapPageState(); + } +} + +class _MapPageState extends State { + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + var fac = new FelixApiCreds(); + + // TODO: implement build + return Text(fac.mapsApiKey); + } +} \ No newline at end of file diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 526c33b..81b9ce1 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -100,8 +100,6 @@ class ReceiptPage2State extends State { var _widgetHeight = MediaQuery.of(context).size.height * 0.06 < 40.0 ? 40.0 : MediaQuery.of(context).size.height * 0.06; - debugPrint(_widgetHeight.toString()); - if (_categories.length == 0) { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); diff --git a/pubspec.lock b/pubspec.lock index 8db997c..b6850bf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -193,6 +193,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_maps: + dependency: "direct main" + description: + name: flutter_maps + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" flutter_test: dependency: "direct dev" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 385c2e0..ecc6222 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -26,6 +26,7 @@ dependencies: flutter_fadein: ^1.1.1 charts_flutter: ^0.6.0 simple_animations: ^1.3.3 + flutter_maps: ^0.1.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 From 55310068ea3eb481e235e257c7cdb91a4a53d6d7 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 21 Aug 2019 14:53:52 +0100 Subject: [PATCH 105/122] Code is B-E-A-U-TIFUL! All complies to standards. Complies to flutter/dart 'pedantic' coding standards (their name, not mine) --- .gitignore | 1 + analysis_options.yaml | 18 ++ android/app/build.gradle | 2 +- android/app/src/main/AndroidManifest.xml | 12 +- ios/Podfile | 2 +- ios/Podfile.lock | 19 +- ios/Runner.xcodeproj/project.pbxproj | 22 ++ ios/Runner/AppDelegate.m | 2 + lib/common/apifunctions/categories.dart | 12 +- .../apifunctions/find_organisations.dart | 34 +- lib/common/apifunctions/get_graph_data.dart | 33 +- .../apifunctions/request_login_api.dart | 31 +- .../apifunctions/request_logout_api.dart | 2 +- .../apifunctions/submit_receipt_api.dart | 7 +- lib/common/functions/customAbout.dart | 89 ++++-- lib/common/functions/feedback.dart | 11 +- lib/common/functions/get_token.dart | 3 +- lib/common/functions/logout.dart | 10 +- lib/common/functions/save_current_login.dart | 12 +- lib/common/functions/save_logout.dart | 2 +- .../functions/showDialogTwoButtons.dart | 4 +- lib/common/platform/platform_scaffold.dart | 36 ++- .../widgets/animatedGradientButton.dart | 11 +- lib/common/widgets/charts/auto_label.dart | 11 +- lib/common/widgets/charts/chart_builder.dart | 7 +- lib/common/widgets/charts/donut_chart.dart | 12 +- .../widgets/charts/grouped_bar_chart.dart | 11 +- .../charts/numeric_line_bar_combo.dart | 16 +- lib/common/widgets/charts/outside_label.dart | 11 +- .../charts/scatter_bucketingAxis_legend.dart | 22 +- .../charts/series_legend_with_measures.dart | 11 +- .../widgets/charts/time_series_simple.dart | 11 +- lib/common/widgets/custom_checkbox.dart | 129 ++++---- lib/common/widgets/labeled_checkbox.dart | 22 +- lib/common/widgets/organisations_dialog.dart | 255 ++++++++------- lib/common/widgets/popupListView.dart | 6 +- lib/config.dart | 12 +- lib/env/dev.dart | 2 +- lib/env/prod.dart | 2 +- lib/main.dart | 9 +- lib/model/json/login_model.dart | 8 +- lib/pages/charts/preset_graphs.dart | 31 -- lib/pages/customerGraphs.dart | 59 ++-- lib/pages/home_page.dart | 9 +- lib/pages/login_page.dart | 112 ++++--- lib/pages/map_page.dart | 53 +++- lib/pages/more_page.dart | 77 ++--- lib/pages/new_stats_page.dart | 14 +- lib/pages/orgGraphs.dart | 8 +- lib/pages/receipt_page_2.dart | 300 +++++++++++------- lib/pages/spash_screen.dart | 5 +- lib/pages/stats_page.dart | 28 +- pubspec.lock | 61 ++-- pubspec.yaml | 10 +- test/widget_test.dart | 1 - 55 files changed, 915 insertions(+), 785 deletions(-) create mode 100644 analysis_options.yaml delete mode 100644 lib/pages/charts/preset_graphs.dart diff --git a/.gitignore b/.gitignore index 6f22238..54a10d1 100644 --- a/.gitignore +++ b/.gitignore @@ -236,3 +236,4 @@ fabric.properties # End of https://www.gitignore.io/api/android,flutter,androidstudio lib/common/felixApiCreds.dart +android/app/src/main/AndroidManifest.xml diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..84426a6 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,18 @@ +include: package:pedantic/analysis_options.yaml + +analyzer: + exclude: + - lib/src/locations.g.dart + +linter: + rules: + - always_declare_return_types + - camel_case_types + - empty_constructor_bodies + - annotate_overrides + - avoid_init_to_null + - constant_identifier_names + - one_member_abstracts + - slash_for_doc_comments + - sort_constructors_first + - unnecessary_brace_in_string_interps \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index c4b5c4a..865c574 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -25,7 +25,7 @@ apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 27 + compileSdkVersion 28 lintOptions { disable 'InvalidPackage' diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ccadded..be8cc8c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -14,8 +14,14 @@ FlutterApplication and put your custom class here. --> + + + + + - - diff --git a/ios/Podfile b/ios/Podfile index d077b08..671bf46 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +platform :ios, '9.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a4e1203..371ba09 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,5 +1,13 @@ PODS: - Flutter (1.0.0) + - google_maps_flutter (0.0.1): + - Flutter + - GoogleMaps + - GoogleMaps (3.3.0): + - GoogleMaps/Maps (= 3.3.0) + - GoogleMaps/Base (3.3.0) + - GoogleMaps/Maps (3.3.0): + - GoogleMaps/Base - shared_preferences (0.0.1): - Flutter - url_launcher (0.0.1): @@ -7,12 +15,19 @@ PODS: DEPENDENCIES: - Flutter (from `.symlinks/flutter/ios`) + - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - GoogleMaps + EXTERNAL SOURCES: Flutter: :path: ".symlinks/flutter/ios" + google_maps_flutter: + :path: ".symlinks/plugins/google_maps_flutter/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" url_launcher: @@ -20,9 +35,11 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a + google_maps_flutter: 78a52114c898b42ea647919679a4c58b70abe876 + GoogleMaps: cfee83da305b9aaeccf92c24ac79df11c3003492 shared_preferences: 1feebfa37bb57264736e16865e7ffae7fc99b523 url_launcher: 0067ddb8f10d36786672aa0722a21717dba3a298 -PODFILE CHECKSUM: aff02bfeed411c636180d6812254b2daeea14d09 +PODFILE CHECKSUM: 3389836f37640698630b8f0670315d626d5f1469 COCOAPODS: 1.7.5 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5b4844c..8fc019b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -163,6 +163,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, ACE3DC71CDB8FA5537935604 /* [CP] Embed Pods Frameworks */, + E6C2807EE928990FB790046F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -292,6 +293,24 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + E6C2807EE928990FB790046F /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMaps.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -390,6 +409,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -519,6 +539,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -546,6 +567,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m index 59a72e9..e72daa9 100644 --- a/ios/Runner/AppDelegate.m +++ b/ios/Runner/AppDelegate.m @@ -1,10 +1,12 @@ #include "AppDelegate.h" #include "GeneratedPluginRegistrant.h" +#import "GoogleMaps/GoogleMaps.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GMSServices provideAPIKey:@"AIzaSyDfCRFolRWvgfgSK0UCl5n5rNb5CS7O7KI"]; [GeneratedPluginRegistrant registerWithRegistry:self]; // Override point for customization after application launch. return [super application:application didFinishLaunchingWithOptions:launchOptions]; diff --git a/lib/common/apifunctions/categories.dart b/lib/common/apifunctions/categories.dart index e9099b4..160ed7e 100644 --- a/lib/common/apifunctions/categories.dart +++ b/lib/common/apifunctions/categories.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:async'; import 'package:http/http.dart' as http; import 'package:local_spend/common/functions/get_token.dart'; -import 'package:flutter/material.dart'; Future> getCategories() async { const url = "https://dev.localspend.co.uk/api/search/category"; @@ -13,10 +12,10 @@ Future> getCategories() async { }); Map body = { - "session_key":token, + "session_key": token, }; - final response = await http.post ( + final response = await http.post( url, body: json.encode(body), ); @@ -36,9 +35,8 @@ Future> getCategories() async { // print(categoriesJSON['11']); // prints "Banana" - int i = 1; // starts on 1. that was annoying to debug! + int i = 1; // starts on 1. that was annoying to debug! while (true) { - if (categoriesJSON[i.toString()] != null) { // print("Iteration " + i.toString()); // print(categoriesJSON[i.toString()]); @@ -61,10 +59,10 @@ Future> getCategories() async { // print(categories[10].name.toString()); // prints "Banana" - return categories; // categories is List + return categories; // categories is List // Category is defined at the top^^ } else { // not successful return null; } -} \ No newline at end of file +} diff --git a/lib/common/apifunctions/find_organisations.dart b/lib/common/apifunctions/find_organisations.dart index b30479c..1b2ad84 100644 --- a/lib/common/apifunctions/find_organisations.dart +++ b/lib/common/apifunctions/find_organisations.dart @@ -1,39 +1,32 @@ import 'dart:convert'; import 'dart:async'; import 'package:http/http.dart' as http; -import 'package:flutter/material.dart'; import 'package:local_spend/common/functions/get_token.dart'; class Organisation { - var id = 0; - var name = ""; - var postcode = ""; - var streetName = ""; //street_name - var town = ""; - Organisation( this.id, this.name, this.postcode, this.streetName, this.town, - ); + ); + + var id = 0; + var name = ""; + var postcode = ""; + var streetName = ""; //street_name + var town = ""; } class Organisations { - List getTestData() { var numItems = 10; var itemsList = new List(); for (int i = 0; i < numItems; i++) { - itemsList.add(new Organisation( - i, - "Payee " + (i + 1).toString(), - "tee hee hee", - "yeet street", - "Robloxia" - )); + itemsList.add(new Organisation(i, "Payee " + (i + 1).toString(), + "tee hee hee", "yeet street", "Robloxia")); } return itemsList; @@ -72,11 +65,11 @@ class Organisations { }); Map body = { - "search_name":search, - "session_key":token, + "search_name": search, + "session_key": token, }; - final response = await http.post ( + final response = await http.post( url, body: json.encode(body), ); @@ -88,6 +81,5 @@ class Organisations { // not successful return null; } - } -} \ No newline at end of file +} diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 862582d..f24ebdf 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -5,13 +5,13 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:charts_flutter/flutter.dart' as charts; class GraphData { - var chartType; - List> graph; - GraphData( this.chartType, ); + var chartType; + List> graph; + List cachedData; bool loaded = false; @@ -49,7 +49,8 @@ class GraphData { List timeSeriesSpendList = new List(); for (int i = 0; i < labels.length; i++) { - timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); + timeSeriesSpendList.add( + new TimeSeriesSpend(data[i] * 1.00, DateTime.parse(labels[i]))); // print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); } @@ -131,7 +132,8 @@ class GraphData { List timeSeriesSpendList = new List(); for (int i = 0; i < labels.length; i++) { - timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); + timeSeriesSpendList.add( + new TimeSeriesSpend(data[i] * 1.00, DateTime.parse(labels[i]))); // print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); } @@ -154,18 +156,16 @@ class GraphData { return null; } } - - } class OrgGraphData { - var chartType; - List> graph; - OrgGraphData( this.chartType, ); + var chartType; + List> graph; + List cachedData; bool loaded = false; @@ -203,7 +203,8 @@ class OrgGraphData { List timeSeriesSpendList = new List(); for (int i = 0; i < labels.length; i++) { - timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); + timeSeriesSpendList.add( + new TimeSeriesSpend(data[i] * 1.00, DateTime.parse(labels[i]))); // print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); } @@ -285,7 +286,8 @@ class OrgGraphData { List timeSeriesSpendList = new List(); for (int i = 0; i < labels.length; i++) { - timeSeriesSpendList.add(new TimeSeriesSpend(data[i]*1.00, DateTime.parse(labels[i]))); + timeSeriesSpendList.add( + new TimeSeriesSpend(data[i] * 1.00, DateTime.parse(labels[i]))); // print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); } @@ -308,14 +310,11 @@ class OrgGraphData { return null; } } - - } class TimeSeriesSpend { + TimeSeriesSpend(this.spend, this.time); + final DateTime time; final double spend; - - TimeSeriesSpend(this.spend, this.time); } - diff --git a/lib/common/apifunctions/request_login_api.dart b/lib/common/apifunctions/request_login_api.dart index 10565d3..552332e 100644 --- a/lib/common/apifunctions/request_login_api.dart +++ b/lib/common/apifunctions/request_login_api.dart @@ -13,9 +13,11 @@ Future _incorrectDialog(BuildContext context, bool isLoginWrong) async { builder: (BuildContext context) { return AnimatedContainer( duration: Duration(seconds: 2), - child : AlertDialog( + child: AlertDialog( title: Text("Uh-oh!"), - content: Text(isLoginWrong ? "Incorrect login details. Please try again." : "Our servers are having issues at the moment; sorry for the inconvenience. Please try again later."), + content: Text(isLoginWrong + ? "Incorrect login details. Please try again." + : "Our servers are having issues at the moment; sorry for the inconvenience. Please try again later."), actions: [ FlatButton( child: Text('OK'), @@ -30,7 +32,8 @@ Future _incorrectDialog(BuildContext context, bool isLoginWrong) async { ); } -Future requestLoginAPI(BuildContext context, String email, String password) async { +Future requestLoginAPI( + BuildContext context, String email, String password) async { final url = "https://dev.localspend.co.uk/api/login"; Map body = { @@ -38,19 +41,19 @@ Future requestLoginAPI(BuildContext context, String email, String pa 'password': password, }; -// debugPrint('$body'); - try { - final response = await http.post( - url, - body: json.encode(body), - ).timeout(Duration(seconds: 5)); + final response = await http + .post( + url, + body: json.encode(body), + ) + .timeout(Duration(seconds: 5)); if (response.statusCode == 200) { final responseJson = json.decode(response.body); saveCurrentLogin(responseJson, body["email"]); - Navigator.of(context).pushReplacementNamed('/HomePage'); + await Navigator.of(context).pushReplacementNamed('/HomePage'); return LoginModel.fromJson(responseJson); } else { @@ -58,15 +61,15 @@ Future requestLoginAPI(BuildContext context, String email, String pa saveCurrentLogin(responseJson, body["email"]); - _incorrectDialog(context, true); + await _incorrectDialog(context, true); return null; } } on TimeoutException catch (_) { - _incorrectDialog(context, false); + await _incorrectDialog(context, false); } catch (error) { debugPrint(error.toString()); - _incorrectDialog(context, false); + await _incorrectDialog(context, false); } + return null; } - diff --git a/lib/common/apifunctions/request_logout_api.dart b/lib/common/apifunctions/request_logout_api.dart index afa5b8d..efb64a3 100644 --- a/lib/common/apifunctions/request_logout_api.dart +++ b/lib/common/apifunctions/request_logout_api.dart @@ -17,7 +17,7 @@ Future requestLogoutAPI(BuildContext context) async { }); Map body = { - "Token":token, + "Token": token, }; final response = await http.post( diff --git a/lib/common/apifunctions/submit_receipt_api.dart b/lib/common/apifunctions/submit_receipt_api.dart index 7727c17..f6761b4 100644 --- a/lib/common/apifunctions/submit_receipt_api.dart +++ b/lib/common/apifunctions/submit_receipt_api.dart @@ -28,7 +28,7 @@ Future submitReceiptAPI( SharedPreferences preferences = await SharedPreferences.getInstance(); Map body = { - 'transaction_type' : "3", + 'transaction_type': "3", 'transaction_value': receipt.amount, 'purchase_time': receipt.time, 'category': receipt.category, @@ -38,7 +38,6 @@ Future submitReceiptAPI( 'street_name': receipt.street, 'postcode': receipt.postcode, 'town': receipt.town, - 'session_key': preferences.get('LastToken'), }; @@ -61,13 +60,11 @@ Future submitReceiptAPI( context, responseJson[0] == "" ? responseJson[0] : "Upload Successful", "Transaction successfully submitted to server", - "OK" - ); + "OK"); return LoginModel.fromJson(responseJson); } else { final responseJson = json.decode(response.body); - showDialogSingleButton( context, "Unable to Submit Receipt", diff --git a/lib/common/functions/customAbout.dart b/lib/common/functions/customAbout.dart index 20c3c83..8f923c2 100644 --- a/lib/common/functions/customAbout.dart +++ b/lib/common/functions/customAbout.dart @@ -103,7 +103,8 @@ class AboutListTile extends StatelessWidget { return ListTile( leading: icon, title: child ?? - Text(MaterialLocalizations.of(context).aboutListTileTitle(applicationName ?? _defaultApplicationName(context))), + Text(MaterialLocalizations.of(context).aboutListTileTitle( + applicationName ?? _defaultApplicationName(context))), onTap: () { showAboutDialog( context: context, @@ -178,13 +179,14 @@ void showLicensePage({ String applicationLegalese, }) { assert(context != null); - Navigator.push(context, MaterialPageRoute( - builder: (BuildContext context) => LicensePage( - applicationName: applicationName, - applicationVersion: applicationVersion, - applicationLegalese: applicationLegalese, - ) - )); + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => LicensePage( + applicationName: applicationName, + applicationVersion: applicationVersion, + applicationLegalese: applicationLegalese, + ))); } /// An about box. This is a dialog box with the application's icon, name, @@ -256,15 +258,22 @@ class AboutDialog extends StatelessWidget { Widget build(BuildContext context) { assert(debugCheckHasMaterialLocalizations(context)); final String name = applicationName ?? _defaultApplicationName(context); - final String version = applicationVersion ?? _defaultApplicationVersion(context); + final String version = + applicationVersion ?? _defaultApplicationVersion(context); final Widget icon = applicationIcon ?? _defaultApplicationIcon(context); List body = []; - if (icon != null) - body.add(IconTheme(data: const IconThemeData(size: 45.0), child: icon)); + if (icon != null) { + body.add( + IconTheme( + data: const IconThemeData(size: 45.0), + child: icon + ), + ); + } + body.add(Expanded( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 24.0), - child: ListBody( children: [ Container( @@ -272,7 +281,8 @@ class AboutDialog extends StatelessWidget { child: Text(name, style: Theme.of(context).textTheme.title), ), Text(version, style: Theme.of(context).textTheme.body1), - Text(applicationLegalese ?? '', style: Theme.of(context).textTheme.caption), + Text(applicationLegalese ?? '', + style: Theme.of(context).textTheme.caption), ], ), ), @@ -283,15 +293,15 @@ class AboutDialog extends StatelessWidget { children: body, ), ]; - if (children != null) - body.addAll(children); + if (children != null) body.addAll(children); return AlertDialog( content: SingleChildScrollView( child: ListBody(children: body), ), actions: [ FlatButton( - child: Text(MaterialLocalizations.of(context).viewLicensesButtonLabel), + child: + Text(MaterialLocalizations.of(context).viewLicensesButtonLabel), onPressed: () { showLicensePage( context: context, @@ -376,7 +386,7 @@ class _LicensePageState extends State { int debugFlowId = -1; assert(() { final dev.Flow flow = dev.Flow.begin(); - dev.Timeline.timeSync('_initLicenses()', () { }, flow: flow); + dev.Timeline.timeSync('_initLicenses()', () {}, flow: flow); debugFlowId = flow.id; return true; }()); @@ -385,11 +395,12 @@ class _LicensePageState extends State { return; } assert(() { - dev.Timeline.timeSync('_initLicenses()', () { }, flow: dev.Flow.step(debugFlowId)); + dev.Timeline.timeSync('_initLicenses()', () {}, + flow: dev.Flow.step(debugFlowId)); return true; }()); final List paragraphs = - await SchedulerBinding.instance.scheduleTask>( + await SchedulerBinding.instance.scheduleTask>( license.paragraphs.toList, Priority.animation, debugLabel: 'License', @@ -404,8 +415,7 @@ class _LicensePageState extends State { )); _licenses.add(Container( decoration: const BoxDecoration( - border: Border(bottom: BorderSide(width: 0.0)) - ), + border: Border(bottom: BorderSide(width: 0.0))), child: Text( license.packages.join(', '), style: const TextStyle(fontWeight: FontWeight.bold), @@ -425,7 +435,8 @@ class _LicensePageState extends State { } else { assert(paragraph.indent >= 0); _licenses.add(Padding( - padding: EdgeInsetsDirectional.only(top: 8.0, start: 16.0 * paragraph.indent), + padding: EdgeInsetsDirectional.only( + top: 8.0, start: 16.0 * paragraph.indent), child: Text(paragraph.text), )); } @@ -436,7 +447,8 @@ class _LicensePageState extends State { _loaded = true; }); assert(() { - dev.Timeline.timeSync('Build scheduled', () { }, flow: dev.Flow.end(debugFlowId)); + dev.Timeline.timeSync('Build scheduled', () {}, + flow: dev.Flow.end(debugFlowId)); return true; }()); } @@ -444,16 +456,27 @@ class _LicensePageState extends State { @override Widget build(BuildContext context) { assert(debugCheckHasMaterialLocalizations(context)); - final String name = widget.applicationName ?? _defaultApplicationName(context); - final String version = widget.applicationVersion ?? _defaultApplicationVersion(context); - final MaterialLocalizations localizations = MaterialLocalizations.of(context); + final String name = + widget.applicationName ?? _defaultApplicationName(context); + final String version = + widget.applicationVersion ?? _defaultApplicationVersion(context); + final MaterialLocalizations localizations = + MaterialLocalizations.of(context); final List contents = [ - Text(name, style: Theme.of(context).textTheme.headline, textAlign: TextAlign.center), - Text(version, style: Theme.of(context).textTheme.body1, textAlign: TextAlign.center), + Text(name, + style: Theme.of(context).textTheme.headline, + textAlign: TextAlign.center), + Text(version, + style: Theme.of(context).textTheme.body1, + textAlign: TextAlign.center), Container(height: 18.0), - Text(widget.applicationLegalese ?? '', style: Theme.of(context).textTheme.caption, textAlign: TextAlign.center), + Text(widget.applicationLegalese ?? '', + style: Theme.of(context).textTheme.caption, + textAlign: TextAlign.center), Container(height: 18.0), - Text('Powered by Flutter', style: Theme.of(context).textTheme.body1, textAlign: TextAlign.center), + Text('Powered by Flutter', + style: Theme.of(context).textTheme.body1, + textAlign: TextAlign.center), Container(height: 24.0), ]; contents.addAll(_licenses); @@ -480,7 +503,8 @@ class _LicensePageState extends State { bottom: false, child: Scrollbar( child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 12.0), + padding: + const EdgeInsets.symmetric(horizontal: 8.0, vertical: 12.0), children: contents, ), ), @@ -499,7 +523,8 @@ String _defaultApplicationName(BuildContext context) { // can provide an explicit applicationName to the widgets defined in this // file, instead of relying on the default. final Title ancestorTitle = context.ancestorWidgetOfExactType(Title); - return ancestorTitle?.title ?? Platform.resolvedExecutable.split(Platform.pathSeparator).last; + return ancestorTitle?.title ?? + Platform.resolvedExecutable.split(Platform.pathSeparator).last; } String _defaultApplicationVersion(BuildContext context) { diff --git a/lib/common/functions/feedback.dart b/lib/common/functions/feedback.dart index 9156358..921c752 100644 --- a/lib/common/functions/feedback.dart +++ b/lib/common/functions/feedback.dart @@ -2,8 +2,7 @@ import 'package:flutter/material.dart'; final TextEditingController _feedbackController = TextEditingController(); -void feedback( - BuildContext context) { +void feedback(BuildContext context) { // flutter defined function showDialog( context: context, @@ -15,13 +14,11 @@ void feedback( children: [ Text("We would love to hear your thoughts."), Text("\nThis section needs to be fixed."), - Container( margin: const EdgeInsets.fromLTRB(0, 20, 0, 0), width: 200, height: 70, - - child : new TextField( + child: new TextField( controller: _feedbackController, decoration: InputDecoration( hintText: 'Enter your feedback here', @@ -41,7 +38,7 @@ void feedback( ), new Container( padding: const EdgeInsets.fromLTRB(0, 10, 0, 0), - child : new FlatButton( + child: new FlatButton( child: new Text("Submit"), onPressed: () { submit(_feedbackController.text); @@ -58,4 +55,4 @@ void feedback( void submit(String feedback) { debugPrint(feedback); -} \ No newline at end of file +} diff --git a/lib/common/functions/get_token.dart b/lib/common/functions/get_token.dart index bdf19cf..71a1fa5 100644 --- a/lib/common/functions/get_token.dart +++ b/lib/common/functions/get_token.dart @@ -1,6 +1,7 @@ import 'package:shared_preferences/shared_preferences.dart'; +import 'dart:async'; -getToken() async { +Future getToken() async { SharedPreferences preferences = await SharedPreferences.getInstance(); String getToken = preferences.getString("LastToken"); diff --git a/lib/common/functions/logout.dart b/lib/common/functions/logout.dart index e05447d..68e47a1 100644 --- a/lib/common/functions/logout.dart +++ b/lib/common/functions/logout.dart @@ -2,16 +2,16 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; import 'package:shared_preferences/shared_preferences.dart'; -logout(context) { +void logout(context) { requestLogoutAPI(context); Navigator.of(context).pushReplacementNamed('/LoginPage'); _clearLoginDetails(); } -_clearLoginDetails() async { +void _clearLoginDetails() async { SharedPreferences preferences = await SharedPreferences.getInstance(); - preferences.setString('username', ""); - preferences.setString('password', ""); + await preferences.setString('username', ""); + await preferences.setString('password', ""); print("details cleared"); -} \ No newline at end of file +} diff --git a/lib/common/functions/save_current_login.dart b/lib/common/functions/save_current_login.dart index 44ec919..824e09b 100644 --- a/lib/common/functions/save_current_login.dart +++ b/lib/common/functions/save_current_login.dart @@ -1,7 +1,7 @@ import 'package:local_spend/model/json/login_model.dart'; import 'package:shared_preferences/shared_preferences.dart'; -saveCurrentLogin(Map responseJson, loginEmail) async { +void saveCurrentLogin(Map responseJson, loginEmail) async { SharedPreferences preferences = await SharedPreferences.getInstance(); var user; @@ -13,9 +13,7 @@ saveCurrentLogin(Map responseJson, loginEmail) async { var token = (responseJson != null && responseJson.isNotEmpty) ? LoginModel.fromJson(responseJson).token : ""; - var email = (loginEmail != null) - ? loginEmail - : ""; + var email = (loginEmail != null) ? loginEmail : ""; var userType = (responseJson != null && responseJson.isNotEmpty) ? LoginModel.fromJson(responseJson).userType : ""; @@ -23,9 +21,9 @@ saveCurrentLogin(Map responseJson, loginEmail) async { await preferences.setString( 'LastUser', (user != null && user.length > 0) ? user : ""); await preferences.setString( - 'LastToken', (token != null && token.length > 0) ? token : ""); + 'LastToken', (token != null && token.isNotEmpty) ? token : ""); await preferences.setString( 'LastEmail', (email != null && email.length > 0) ? email : ""); - await preferences.setString( - 'LastUserType', (userType != null && userType.length > 0) ? userType : ""); + await preferences.setString('LastUserType', + (userType != null && userType.isNotEmpty) ? userType : ""); } diff --git a/lib/common/functions/save_logout.dart b/lib/common/functions/save_logout.dart index ecd54fa..4d5e419 100644 --- a/lib/common/functions/save_logout.dart +++ b/lib/common/functions/save_logout.dart @@ -1,6 +1,6 @@ import 'package:shared_preferences/shared_preferences.dart'; -saveLogout() async { +void saveLogout() async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('LastUser', ""); diff --git a/lib/common/functions/showDialogTwoButtons.dart b/lib/common/functions/showDialogTwoButtons.dart index af1cd6c..5949a64 100644 --- a/lib/common/functions/showDialogTwoButtons.dart +++ b/lib/common/functions/showDialogTwoButtons.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -void showDialogTwoButtons( - BuildContext context, String title, String message, String buttonLabel1, String buttonLabel2, Function action) { +void showDialogTwoButtons(BuildContext context, String title, String message, + String buttonLabel1, String buttonLabel2, Function action) { // flutter defined function showDialog( context: context, diff --git a/lib/common/platform/platform_scaffold.dart b/lib/common/platform/platform_scaffold.dart index 0209aa6..e3dbff9 100644 --- a/lib/common/platform/platform_scaffold.dart +++ b/lib/common/platform/platform_scaffold.dart @@ -4,6 +4,25 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class PlatformScaffold extends StatelessWidget { + + PlatformScaffold( + {this.key, + this.appBar, + this.body, + this.floatingActionButton, + this.floatingActionButtonLocation, + this.floatingActionButtonAnimator, + this.persistentFooterButtons, + this.drawer, + this.endDrawer, + this.bottomNavigationBar, + this.backgroundColor, + this.resizeToAvoidBottomPadding = true, + this.primary = true}) + : assert(primary != null), + super(key: key); + + @override final Key key; final PreferredSizeWidget appBar; final Widget body; @@ -18,23 +37,6 @@ class PlatformScaffold extends StatelessWidget { final bool resizeToAvoidBottomPadding; final bool primary; - PlatformScaffold( - {this.key, - this.appBar, - this.body, - this.floatingActionButton, - this.floatingActionButtonLocation, - this.floatingActionButtonAnimator, - this.persistentFooterButtons, - this.drawer, - this.endDrawer, - this.bottomNavigationBar, - this.backgroundColor, - this.resizeToAvoidBottomPadding: true, - this.primary: true}) - : assert(primary != null), - super(key: key); - @override Widget build(BuildContext context) { return Platform.isIOS diff --git a/lib/common/widgets/animatedGradientButton.dart b/lib/common/widgets/animatedGradientButton.dart index 9814ac8..fb6853c 100644 --- a/lib/common/widgets/animatedGradientButton.dart +++ b/lib/common/widgets/animatedGradientButton.dart @@ -2,10 +2,6 @@ import 'package:flutter/material.dart'; import 'package:simple_animations/simple_animations.dart'; class AnimatedBackground extends StatelessWidget { - final List animateColors; - final Color lastColor; - final Alignment begin, end; - final int duration; AnimatedBackground( this.animateColors, @@ -15,6 +11,11 @@ class AnimatedBackground extends StatelessWidget { this.duration, ); + final List animateColors; + final Color lastColor; + final Alignment begin, end; + final int duration; + @override Widget build(BuildContext context) { final tween = MultiTrackTween([ @@ -37,4 +38,4 @@ class AnimatedBackground extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/auto_label.dart b/lib/common/widgets/charts/auto_label.dart index 96f7209..85174d0 100644 --- a/lib/common/widgets/charts/auto_label.dart +++ b/lib/common/widgets/charts/auto_label.dart @@ -4,9 +4,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class DonutAutoLabelChart extends StatelessWidget { - final List seriesList; - final bool animate; - DonutAutoLabelChart(this.seriesList, {this.animate}); /// Creates a [PieChart] with sample data and no transition. @@ -18,6 +15,8 @@ class DonutAutoLabelChart extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -67,8 +66,8 @@ class DonutAutoLabelChart extends StatelessWidget { /// Sample linear data type. class LinearSales { + LinearSales(this.key, this.sales); + final String key; final int sales; - - LinearSales(this.key, this.sales); -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/chart_builder.dart b/lib/common/widgets/charts/chart_builder.dart index eea35bb..1b6514e 100644 --- a/lib/common/widgets/charts/chart_builder.dart +++ b/lib/common/widgets/charts/chart_builder.dart @@ -2,13 +2,12 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/widgets/charts/time_series_simple.dart'; class TimeSeries extends StatelessWidget { - - final String chartDataName; - TimeSeries({ this.chartDataName, }); + final String chartDataName; + @override Widget build(BuildContext context) { return new Container( @@ -16,4 +15,4 @@ class TimeSeries extends StatelessWidget { child: SimpleTimeSeriesChart.withSampleData(), ); } -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/donut_chart.dart b/lib/common/widgets/charts/donut_chart.dart index 06feda5..1b4fe11 100644 --- a/lib/common/widgets/charts/donut_chart.dart +++ b/lib/common/widgets/charts/donut_chart.dart @@ -3,9 +3,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class DonutPieChart extends StatelessWidget { - final List seriesList; - final bool animate; - DonutPieChart(this.seriesList, {this.animate}); /// Creates a [PieChart] with sample data and no transition. @@ -16,6 +13,8 @@ class DonutPieChart extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -46,11 +45,10 @@ class DonutPieChart extends StatelessWidget { } } - /// Sample linear data type. class LinearSales { + LinearSales(this.year, this.sales); + final int year; final int sales; - - LinearSales(this.year, this.sales); -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/grouped_bar_chart.dart b/lib/common/widgets/charts/grouped_bar_chart.dart index 24554e5..e069a0c 100644 --- a/lib/common/widgets/charts/grouped_bar_chart.dart +++ b/lib/common/widgets/charts/grouped_bar_chart.dart @@ -3,9 +3,6 @@ import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; class GroupedBarChart extends StatelessWidget { - final List seriesList; - final bool animate; - GroupedBarChart(this.seriesList, {this.animate}); factory GroupedBarChart.withSampleData() { @@ -16,6 +13,8 @@ class GroupedBarChart extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -74,8 +73,8 @@ class GroupedBarChart extends StatelessWidget { /// Sample ordinal data type. class OrdinalSales { + OrdinalSales(this.year, this.sales); + final String year; final int sales; - - OrdinalSales(this.year, this.sales); -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/numeric_line_bar_combo.dart b/lib/common/widgets/charts/numeric_line_bar_combo.dart index 2f261dd..c6b38dd 100644 --- a/lib/common/widgets/charts/numeric_line_bar_combo.dart +++ b/lib/common/widgets/charts/numeric_line_bar_combo.dart @@ -4,8 +4,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class NumericComboLineBarChart extends StatelessWidget { - final List seriesList; - final bool animate; NumericComboLineBarChart(this.seriesList, {this.animate}); @@ -18,6 +16,8 @@ class NumericComboLineBarChart extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -29,7 +29,7 @@ class NumericComboLineBarChart extends StatelessWidget { // Custom renderer configuration for the bar series. customSeriesRenderers: [ new charts.BarRendererConfig( - // ID used to link series to this renderer. + // ID used to link series to this renderer. customRendererId: 'customBar') ]); } @@ -65,7 +65,7 @@ class NumericComboLineBarChart extends StatelessWidget { measureFn: (LinearSales sales, _) => sales.sales, data: desktopSalesData, ) - // Configure our custom bar renderer for this series. + // Configure our custom bar renderer for this series. ..setAttribute(charts.rendererIdKey, 'customBar'), new charts.Series( id: 'Tablet', @@ -74,7 +74,7 @@ class NumericComboLineBarChart extends StatelessWidget { measureFn: (LinearSales sales, _) => sales.sales, data: tableSalesData, ) - // Configure our custom bar renderer for this series. + // Configure our custom bar renderer for this series. ..setAttribute(charts.rendererIdKey, 'customBar'), new charts.Series( id: 'Mobile', @@ -88,8 +88,8 @@ class NumericComboLineBarChart extends StatelessWidget { /// Sample linear data type. class LinearSales { + LinearSales(this.year, this.sales); + final int year; final int sales; - - LinearSales(this.year, this.sales); -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/outside_label.dart b/lib/common/widgets/charts/outside_label.dart index ba8bc71..cd32404 100644 --- a/lib/common/widgets/charts/outside_label.dart +++ b/lib/common/widgets/charts/outside_label.dart @@ -3,9 +3,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class PieOutsideLabelChart extends StatelessWidget { - final List seriesList; - final bool animate; - PieOutsideLabelChart(this.seriesList, {this.animate}); /// Creates a [PieChart] with sample data and no transition. @@ -17,6 +14,8 @@ class PieOutsideLabelChart extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -62,8 +61,8 @@ class PieOutsideLabelChart extends StatelessWidget { /// Sample linear data type. class LinearSales { + LinearSales(this.year, this.sales); + final int year; final int sales; - - LinearSales(this.year, this.sales); -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart b/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart index 3d7a2ff..ef3dad6 100644 --- a/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart +++ b/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart @@ -8,8 +8,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class BucketingAxisScatterPlotChart extends StatelessWidget { - final List seriesList; - final bool animate; BucketingAxisScatterPlotChart(this.seriesList, {this.animate}); @@ -22,6 +20,8 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -77,7 +77,7 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { new charts.Series( id: 'Cheese', colorFn: (LinearSales sales, _) => - charts.MaterialPalette.blue.shadeDefault, + charts.MaterialPalette.blue.shadeDefault, domainFn: (LinearSales sales, _) => sales.year, measureFn: (LinearSales sales, _) => sales.revenueShare, radiusPxFn: (LinearSales sales, _) => sales.radius, @@ -85,7 +85,7 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { new charts.Series( id: 'Carrots', colorFn: (LinearSales sales, _) => - charts.MaterialPalette.red.shadeDefault, + charts.MaterialPalette.red.shadeDefault, domainFn: (LinearSales sales, _) => sales.year, measureFn: (LinearSales sales, _) => sales.revenueShare, radiusPxFn: (LinearSales sales, _) => sales.radius, @@ -93,7 +93,7 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { new charts.Series( id: 'Cucumbers', colorFn: (LinearSales sales, _) => - charts.MaterialPalette.green.shadeDefault, + charts.MaterialPalette.green.shadeDefault, domainFn: (LinearSales sales, _) => sales.year, measureFn: (LinearSales sales, _) => sales.revenueShare, radiusPxFn: (LinearSales sales, _) => sales.radius, @@ -101,7 +101,7 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { new charts.Series( id: 'Crayons', colorFn: (LinearSales sales, _) => - charts.MaterialPalette.purple.shadeDefault, + charts.MaterialPalette.purple.shadeDefault, domainFn: (LinearSales sales, _) => sales.year, measureFn: (LinearSales sales, _) => sales.revenueShare, radiusPxFn: (LinearSales sales, _) => sales.radius, @@ -109,7 +109,7 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { new charts.Series( id: 'Celery', colorFn: (LinearSales sales, _) => - charts.MaterialPalette.indigo.shadeDefault, + charts.MaterialPalette.indigo.shadeDefault, domainFn: (LinearSales sales, _) => sales.year, measureFn: (LinearSales sales, _) => sales.revenueShare, radiusPxFn: (LinearSales sales, _) => sales.radius, @@ -117,7 +117,7 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { new charts.Series( id: 'Cauliflower', colorFn: (LinearSales sales, _) => - charts.MaterialPalette.gray.shadeDefault, + charts.MaterialPalette.gray.shadeDefault, domainFn: (LinearSales sales, _) => sales.year, measureFn: (LinearSales sales, _) => sales.revenueShare, radiusPxFn: (LinearSales sales, _) => sales.radius, @@ -128,9 +128,9 @@ class BucketingAxisScatterPlotChart extends StatelessWidget { /// Sample linear data type. class LinearSales { + LinearSales(this.year, this.revenueShare, this.radius); + final int year; final double revenueShare; final double radius; - - LinearSales(this.year, this.revenueShare, this.radius); -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/series_legend_with_measures.dart b/lib/common/widgets/charts/series_legend_with_measures.dart index 76334f8..11c5ab6 100644 --- a/lib/common/widgets/charts/series_legend_with_measures.dart +++ b/lib/common/widgets/charts/series_legend_with_measures.dart @@ -11,9 +11,6 @@ import 'package:charts_flutter/flutter.dart' as charts; /// /// Also shows the option to provide a custom measure formatter. class LegendWithMeasures extends StatelessWidget { - final List seriesList; - final bool animate; - LegendWithMeasures(this.seriesList, {this.animate}); factory LegendWithMeasures.withSampleData() { @@ -24,6 +21,8 @@ class LegendWithMeasures extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -122,8 +121,8 @@ class LegendWithMeasures extends StatelessWidget { /// Sample ordinal data type. class OrdinalSales { + OrdinalSales(this.year, this.sales); + final String year; final int sales; - - OrdinalSales(this.year, this.sales); -} \ No newline at end of file +} diff --git a/lib/common/widgets/charts/time_series_simple.dart b/lib/common/widgets/charts/time_series_simple.dart index 8144c67..aa733a2 100644 --- a/lib/common/widgets/charts/time_series_simple.dart +++ b/lib/common/widgets/charts/time_series_simple.dart @@ -3,9 +3,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class SimpleTimeSeriesChart extends StatelessWidget { - final List seriesList; - final bool animate; - SimpleTimeSeriesChart(this.seriesList, {this.animate}); /// Creates a [TimeSeriesChart] with sample data and no transition. @@ -17,6 +14,8 @@ class SimpleTimeSeriesChart extends StatelessWidget { ); } + final List seriesList; + final bool animate; @override Widget build(BuildContext context) { @@ -53,8 +52,8 @@ class SimpleTimeSeriesChart extends StatelessWidget { /// Sample time series data type. class TimeSeriesSales { + TimeSeriesSales(this.time, this.sales); + final DateTime time; final int sales; - - TimeSeriesSales(this.time, this.sales); -} \ No newline at end of file +} diff --git a/lib/common/widgets/custom_checkbox.dart b/lib/common/widgets/custom_checkbox.dart index f11be2d..f011c3a 100644 --- a/lib/common/widgets/custom_checkbox.dart +++ b/lib/common/widgets/custom_checkbox.dart @@ -58,12 +58,10 @@ class CustomCheckbox extends StatefulWidget { this.checkColor, this.materialTapTargetSize, this.useTapTarget = true, - }) : assert(tristate != null), + }) : assert(tristate != null), assert(tristate || value != null), super(key: key); - - final bool useTapTarget; /// Whether this checkbox is checked. @@ -138,7 +136,8 @@ class CustomCheckbox extends StatefulWidget { _CustomCheckboxState createState() => _CustomCheckboxState(); } -class _CustomCheckboxState extends State with TickerProviderStateMixin { +class _CustomCheckboxState extends State + with TickerProviderStateMixin { @override Widget build(BuildContext context) { assert(debugCheckHasMaterial(context)); @@ -147,25 +146,26 @@ class _CustomCheckboxState extends State with TickerProviderStat Size size; switch (widget.materialTapTargetSize ?? themeData.materialTapTargetSize) { case MaterialTapTargetSize.padded: - size = const Size(2 * kRadialReactionRadius + 8.0, 2 * kRadialReactionRadius + 8.0); + size = const Size( + 2 * kRadialReactionRadius + 8.0, 2 * kRadialReactionRadius + 8.0); break; case MaterialTapTargetSize.shrinkWrap: size = const Size(2 * kRadialReactionRadius, 2 * kRadialReactionRadius); break; } - Size noTapTargetSize = Size(CustomCheckbox.width, - CustomCheckbox.width); + Size noTapTargetSize = Size(CustomCheckbox.width, CustomCheckbox.width); final BoxConstraints additionalConstraints = - BoxConstraints.tight(widget - .useTapTarget? size : noTapTargetSize); - + BoxConstraints.tight(widget.useTapTarget ? size : noTapTargetSize); + return _CheckboxRenderObjectWidget( value: widget.value, tristate: widget.tristate, activeColor: widget.activeColor ?? themeData.toggleableActiveColor, checkColor: widget.checkColor ?? const Color(0xFFFFFFFF), - inactiveColor: widget.onChanged != null ? themeData.unselectedWidgetColor : themeData.disabledColor, + inactiveColor: widget.onChanged != null + ? themeData.unselectedWidgetColor + : themeData.disabledColor, onChanged: widget.onChanged, additionalConstraints: additionalConstraints, vsync: this, @@ -174,19 +174,18 @@ class _CustomCheckboxState extends State with TickerProviderStat } class _CheckboxRenderObjectWidget extends LeafRenderObjectWidget { - const _CheckboxRenderObjectWidget({ - Key key, - @required this.value, - @required this.tristate, - @required this.activeColor, - @required this.checkColor, - @required this.inactiveColor, - @required this.onChanged, - @required this.vsync, - @required this.additionalConstraints, - this.useTapTarget = true - - }) : assert(tristate != null), + const _CheckboxRenderObjectWidget( + {Key key, + @required this.value, + @required this.tristate, + @required this.activeColor, + @required this.checkColor, + @required this.inactiveColor, + @required this.onChanged, + @required this.vsync, + @required this.additionalConstraints, + this.useTapTarget = true}) + : assert(tristate != null), assert(tristate || value != null), assert(activeColor != null), assert(inactiveColor != null), @@ -205,15 +204,15 @@ class _CheckboxRenderObjectWidget extends LeafRenderObjectWidget { @override _RenderCheckbox createRenderObject(BuildContext context) => _RenderCheckbox( - value: value, - tristate: tristate, - activeColor: activeColor, - checkColor: checkColor, - inactiveColor: inactiveColor, - onChanged: onChanged, - vsync: vsync, - additionalConstraints: additionalConstraints, - ); + value: value, + tristate: tristate, + activeColor: activeColor, + checkColor: checkColor, + inactiveColor: inactiveColor, + onChanged: onChanged, + vsync: vsync, + additionalConstraints: additionalConstraints, + ); @override void updateRenderObject(BuildContext context, _RenderCheckbox renderObject) { @@ -243,24 +242,23 @@ class _RenderCheckbox extends RenderToggleable { BoxConstraints additionalConstraints, ValueChanged onChanged, @required TickerProvider vsync, - }) : _oldValue = value, + }) : _oldValue = value, super( - value: value, - tristate: tristate, - activeColor: activeColor, - inactiveColor: inactiveColor, - onChanged: onChanged, - additionalConstraints: additionalConstraints, - vsync: vsync, - ); + value: value, + tristate: tristate, + activeColor: activeColor, + inactiveColor: inactiveColor, + onChanged: onChanged, + additionalConstraints: additionalConstraints, + vsync: vsync, + ); bool _oldValue; Color checkColor; @override set value(bool newValue) { - if (newValue == value) - return; + if (newValue == value) return; _oldValue = value; super.value = newValue; } @@ -278,7 +276,8 @@ class _RenderCheckbox extends RenderToggleable { RRect _outerRectAt(Offset origin, double t) { final double inset = 1.0 - (t - 0.5).abs() * 2.0; final double size = _kEdgeSize - inset * _kStrokeWidth; - final Rect rect = Rect.fromLTWH(origin.dx + inset, origin.dy + inset, size, size); + final Rect rect = + Rect.fromLTWH(origin.dx + inset, origin.dy + inset, size, size); return RRect.fromRectAndRadius(rect, _kEdgeRadius); } @@ -288,7 +287,9 @@ class _RenderCheckbox extends RenderToggleable { // As t goes from 0.0 to 0.25, animate from the inactiveColor to activeColor. return onChanged == null ? inactiveColor - : (t >= 0.25 ? activeColor : Color.lerp(inactiveColor, activeColor, t * 4.0)); + : (t >= 0.25 + ? activeColor + : Color.lerp(inactiveColor, activeColor, t * 4.0)); } // White stroke used to paint the check and dash. @@ -303,7 +304,8 @@ class _RenderCheckbox extends RenderToggleable { assert(t >= 0.0 && t <= 0.5); final double size = outer.width; // As t goes from 0.0 to 1.0, gradually fill the outer RRect. - final RRect inner = outer.deflate(math.min(size / 2.0, _kStrokeWidth + size * t)); + final RRect inner = + outer.deflate(math.min(size / 2.0, _kStrokeWidth + size * t)); canvas.drawDRRect(outer, inner, paint); } @@ -347,11 +349,13 @@ class _RenderCheckbox extends RenderToggleable { final Canvas canvas = context.canvas; paintRadialReaction(canvas, offset, size.center(Offset.zero)); - final Offset origin = offset + (size / 2.0 - const Size.square(_kEdgeSize) / 2.0); + final Offset origin = + offset + (size / 2.0 - const Size.square(_kEdgeSize) / 2.0); final AnimationStatus status = position.status; - final double tNormalized = status == AnimationStatus.forward || status == AnimationStatus.completed - ? position.value - : 1.0 - position.value; + final double tNormalized = + status == AnimationStatus.forward || status == AnimationStatus.completed + ? position.value + : 1.0 - position.value; // Four cases: false to null, false to true, null to false, true to false if (_oldValue == false || value == false) { @@ -366,29 +370,36 @@ class _RenderCheckbox extends RenderToggleable { _initStrokePaint(paint); final double tShrink = (t - 0.5) * 2.0; - if (_oldValue == null || value == null) + if (_oldValue == null || value == null) { _drawDash(canvas, origin, tShrink, paint); - else + } + else { _drawCheck(canvas, origin, tShrink, paint); + } } - } else { // Two cases: null to true, true to null + } else { + // Two cases: null to true, true to null final RRect outer = _outerRectAt(origin, 1.0); - final Paint paint = Paint() ..color = _colorAt(1.0); + final Paint paint = Paint()..color = _colorAt(1.0); canvas.drawRRect(outer, paint); _initStrokePaint(paint); if (tNormalized <= 0.5) { final double tShrink = 1.0 - tNormalized * 2.0; - if (_oldValue == true) + if (_oldValue == true) { _drawCheck(canvas, origin, tShrink, paint); - else + } + else { _drawDash(canvas, origin, tShrink, paint); + } } else { final double tExpand = (tNormalized - 0.5) * 2.0; - if (value == true) + if (value == true) { _drawCheck(canvas, origin, tExpand, paint); - else + } + else { _drawDash(canvas, origin, tExpand, paint); + } } } } diff --git a/lib/common/widgets/labeled_checkbox.dart b/lib/common/widgets/labeled_checkbox.dart index a97d9c9..36aa4f8 100644 --- a/lib/common/widgets/labeled_checkbox.dart +++ b/lib/common/widgets/labeled_checkbox.dart @@ -28,11 +28,8 @@ class LabeledCheckboxWithIcon extends StatelessWidget { onTap: () { onChanged(!value); }, - - child: Padding( padding: padding, - child: Row( // crossAxisAlignment: CrossAxisAlignment.center, //doesn't do anything @@ -40,16 +37,18 @@ class LabeledCheckboxWithIcon extends StatelessWidget { Container( padding: EdgeInsets.all(0), width: iconSize, - - child : Icon( + child: Icon( icon, - // size: iconSize, + // size: iconSize, color: iconColor, ), ), - - Expanded(child: Text(label, style: textStyle, textAlign: TextAlign.center,)), - + Expanded( + child: Text( + label, + style: textStyle, + textAlign: TextAlign.center, + )), CustomCheckbox( //custom checkbox removes padding so the form looks nice @@ -89,11 +88,9 @@ class LabeledCheckbox extends StatelessWidget { }, child: Padding( padding: padding, - child: Row( children: [ Expanded(child: Text(label, style: textStyle)), - CustomCheckbox( //custom checkbox removes padding so the form looks nice @@ -110,7 +107,6 @@ class LabeledCheckbox extends StatelessWidget { } } - /* //USAGE: @@ -134,4 +130,4 @@ Widget build(BuildContext context) { ), ); } -*/ \ No newline at end of file +*/ diff --git a/lib/common/widgets/organisations_dialog.dart b/lib/common/widgets/organisations_dialog.dart index 2c921aa..cb3d16b 100644 --- a/lib/common/widgets/organisations_dialog.dart +++ b/lib/common/widgets/organisations_dialog.dart @@ -4,7 +4,6 @@ import 'package:flutter/services.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; class FindOrganisations { - TextField getSearchBar(TextEditingController controller, String hintText) { return TextField( controller: controller, @@ -20,12 +19,12 @@ class FindOrganisations { Future _moreInfoDialog(context, Organisation organisation) { TextStyle informationTitleStyle = new TextStyle(fontSize: 16); - TextStyle informationStyle = new TextStyle(fontSize: 16, fontWeight: FontWeight.bold); + TextStyle informationStyle = + new TextStyle(fontSize: 16, fontWeight: FontWeight.bold); return showDialog( context: context, barrierDismissible: true, - builder: (BuildContext context) { return StatefulBuilder( builder: (context, setState) { @@ -39,12 +38,10 @@ class FindOrganisations { fontSize: 21, fontWeight: FontWeight.bold), ), ), - Container( padding: EdgeInsets.symmetric(horizontal: 10), child: Divider(), ), - Container( width: MediaQuery.of(context).size.width, padding: EdgeInsets.symmetric(horizontal: 10), @@ -54,13 +51,15 @@ class FindOrganisations { TableRow( children: [ Text("Street:", style: informationTitleStyle), - Text(organisation.streetName, style: informationStyle), + Text(organisation.streetName, + style: informationStyle), ], ), TableRow( children: [ Text("Postcode:", style: informationTitleStyle), - Text(organisation.postcode.toUpperCase(), style: informationStyle), + Text(organisation.postcode.toUpperCase(), + style: informationStyle), ], ), TableRow( @@ -72,7 +71,6 @@ class FindOrganisations { ], ), ), - ], ); }, @@ -82,7 +80,6 @@ class FindOrganisations { } Future dialog(context) { - bool _searchEnabled = false; bool _orgsFetched = false; TextEditingController searchBarText = new TextEditingController(); @@ -95,148 +92,150 @@ class FindOrganisations { listTitle = "Results for \'" + search + "\'"; var futureOrgs = await organisations.findOrganisations(search); - organisationsList = futureOrgs; - _searchEnabled = true; - return futureOrgs.length; + organisationsList = futureOrgs; + _searchEnabled = true; + return futureOrgs.length; } return showDialog( context: context, barrierDismissible: true, - builder: (BuildContext context) { - return StatefulBuilder( builder: (context, setState) { return SimpleDialog( - children: [ - Column( + children: [ + Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - width: 150, - height: 50, - child: TextField( - autofocus: true, - controller: searchBarText, - decoration: InputDecoration( - hintText: "Payee Name", - ), - onChanged: (value) { - if (value.length > 0) { - _searchEnabled = true; - } else { - _searchEnabled = false; - } - setState(() => {_searchEnabled}); - }, - onSubmitted: _searchEnabled ? ((_) { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() { - _orgsFetched = true; - }); - }); - }) : null, - ), + Container( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + width: 150, + height: 50, + child: TextField( + autofocus: true, + controller: searchBarText, + decoration: InputDecoration( + hintText: "Payee Name", ), - - Container( - width: 80, - padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - - child: RaisedButton( - onPressed: _searchEnabled ? (() { - SystemChannels.textInput.invokeMethod('TextInput.hide'); - var result = _submitSearch(searchBarText.text); - result.then((_) { - setState(() { - _orgsFetched = true; + onChanged: (value) { + if (value.isNotEmpty) { + _searchEnabled = true; + } else { + _searchEnabled = false; + } + setState(() => {_searchEnabled}); + }, + onSubmitted: _searchEnabled + ? ((_) { + SystemChannels.textInput + .invokeMethod('TextInput.hide'); + var result = + _submitSearch(searchBarText.text); + result.then((_) { + setState(() { + _orgsFetched = true; + }); }); - }); - }) : null, - - child: Icon(Icons.search, color: Colors.white), - color : Colors.blue, - ), - ), - ], + }) + : null, + ), + ), + Container( + width: 80, + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + child: RaisedButton( + onPressed: _searchEnabled + ? (() { + SystemChannels.textInput + .invokeMethod('TextInput.hide'); + var result = + _submitSearch(searchBarText.text); + result.then((_) { + setState(() { + _orgsFetched = true; + }); + }); + }) + : null, + child: Icon(Icons.search, color: Colors.white), + color: Colors.blue, + ), ), ], ), + ], + ), - Column( - children: _orgsFetched ? [ - Container( - padding: EdgeInsets.fromLTRB(20, 20, 20, 0), - child: Text( - listTitle, - style: new TextStyle( - fontSize: 23, fontWeight: FontWeight.bold), - ), - ), - - Container( - padding: EdgeInsets.fromLTRB(10, 10, 10, 0), - width: MediaQuery - .of(context) - .size - .width, - height: MediaQuery - .of(context) - .size - .height * 0.67, - - child: Material( - shadowColor: Colors.transparent, - color: Colors.transparent, - child: ListView.builder( - itemCount: organisationsList.length, - itemBuilder: (context, index) { - return Card( - child: ListTile( - leading: Icon(Icons.person), - title: Text(organisationsList[index].name, style: new TextStyle(fontSize: 18)), - subtitle: Text(organisationsList[index].postcode.toUpperCase()), - // trailing: Icon(Icons.arrow_forward_ios), - // onTap: _chosenOrg(organisationsList[index]), - onTap: (){ - Navigator.of(context).pop(organisationsList[index]); - }, - onLongPress: (){ - // show more details about the organisation in a new dialog - var moreInfo = _moreInfoDialog(context, organisationsList[index]); - moreInfo.whenComplete(null); - }, - ), - ); - }, + Column( + children: _orgsFetched + ? [ + Container( + padding: EdgeInsets.fromLTRB(20, 20, 20, 0), + child: Text( + listTitle, + style: new TextStyle( + fontSize: 23, fontWeight: FontWeight.bold), ), ), - ), - - Center( - child : Container( - padding: EdgeInsets.fromLTRB(0, 10, 0, 0), - child : Text("Long press a payee for more info", style: TextStyle(fontStyle: FontStyle.italic)), + Container( + padding: EdgeInsets.fromLTRB(10, 10, 10, 0), + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height * 0.67, + child: Material( + shadowColor: Colors.transparent, + color: Colors.transparent, + child: ListView.builder( + itemCount: organisationsList.length, + itemBuilder: (context, index) { + return Card( + child: ListTile( + leading: Icon(Icons.person), + title: Text(organisationsList[index].name, + style: new TextStyle(fontSize: 18)), + subtitle: Text(organisationsList[index] + .postcode + .toUpperCase()), + // trailing: Icon(Icons.arrow_forward_ios), + // onTap: _chosenOrg(organisationsList[index]), + onTap: () { + Navigator.of(context) + .pop(organisationsList[index]); + }, + onLongPress: () { + // show more details about the organisation in a new dialog + var moreInfo = _moreInfoDialog( + context, organisationsList[index]); + moreInfo.whenComplete(null); + }, + ), + ); + }, + ), + ), ), - ), - ] : [ Container() ], - ), + Center( + child: Container( + padding: EdgeInsets.fromLTRB(0, 10, 0, 0), + child: Text("Long press a payee for more info", + style: + TextStyle(fontStyle: FontStyle.italic)), + ), + ), + ] + : [Container()], + ), - // help button for if org not listed - // cancel and ok buttons - - ], + // help button for if org not listed + // cancel and ok buttons + ], // ), - ); + ); }, ); }, ); } -} \ No newline at end of file +} diff --git a/lib/common/widgets/popupListView.dart b/lib/common/widgets/popupListView.dart index 7f5d27c..e1f2c10 100644 --- a/lib/common/widgets/popupListView.dart +++ b/lib/common/widgets/popupListView.dart @@ -6,7 +6,6 @@ class PopupListView { return showDialog( context: context, barrierDismissible: true, - builder: (BuildContext context) { return SimpleDialog( title: Text(title), @@ -16,7 +15,8 @@ class PopupListView { ); } - List getDialogOptions(context, List options /*, Function onPressed*/) { + List getDialogOptions( + context, List options /*, Function onPressed*/) { var dialogOptionsList = new List(); for (var i = 0; i < options.length; i++) { @@ -33,4 +33,4 @@ class PopupListView { return dialogOptionsList; } -} \ No newline at end of file +} diff --git a/lib/config.dart b/lib/config.dart index 4e86245..c01ea03 100644 --- a/lib/config.dart +++ b/lib/config.dart @@ -5,13 +5,13 @@ part 'config.g.dart'; @JsonSerializable(createToJson: false) class Config { - final String env; - final bool production; - final String apiKey; - Config({this.env, this.production, this.apiKey}); factory Config.fromJson(Map json) => _$ConfigFromJson(json); + + final String env; + final bool production; + final String apiKey; } class ConfigWrapper extends StatelessWidget { @@ -24,7 +24,7 @@ class ConfigWrapper extends StatelessWidget { static Config of(BuildContext context) { final _InheritedConfig inheritedConfig = - context.inheritFromWidgetOfExactType(_InheritedConfig); + context.inheritFromWidgetOfExactType(_InheritedConfig); return inheritedConfig.config; } @@ -43,4 +43,4 @@ class _InheritedConfig extends InheritedWidget { @override bool updateShouldNotify(_InheritedConfig oldWidget) => config != oldWidget.config; -} \ No newline at end of file +} diff --git a/lib/env/dev.dart b/lib/env/dev.dart index 4a7ee00..386a36b 100644 --- a/lib/env/dev.dart +++ b/lib/env/dev.dart @@ -3,4 +3,4 @@ import 'package:json_annotation/json_annotation.dart'; part 'dev.g.dart'; @JsonLiteral('dev.json', asConst: true) -Map get config => _$configJsonLiteral; \ No newline at end of file +Map get config => _$configJsonLiteral; diff --git a/lib/env/prod.dart b/lib/env/prod.dart index ac3dc8d..cd369b3 100644 --- a/lib/env/prod.dart +++ b/lib/env/prod.dart @@ -3,4 +3,4 @@ import 'package:json_annotation/json_annotation.dart'; part 'prod.g.dart'; @JsonLiteral('prod.json', asConst: true) -Map get config => _$configJsonLiteral; \ No newline at end of file +Map get config => _$configJsonLiteral; diff --git a/lib/main.dart b/lib/main.dart index 64d2d0c..6b433ea 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,13 +1,12 @@ import 'package:flutter/material.dart'; import 'package:local_spend/pages/home_page.dart'; import 'package:local_spend/pages/login_page.dart'; +import 'package:local_spend/pages/map_page.dart'; import 'package:local_spend/pages/receipt_page_2.dart'; import 'package:local_spend/pages/spash_screen.dart'; import 'package:local_spend/pages/more_page.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:local_spend/common/apifunctions/get_graph_data.dart'; - void main() { runApp(MyApp()); } @@ -21,10 +20,7 @@ class MyApp extends StatelessWidget { GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], - supportedLocales: [ - Locale("en") - ], - + supportedLocales: [Locale("en")], title: "Local Spend Tracker", theme: new ThemeData( primarySwatch: Colors.blueGrey, @@ -32,6 +28,7 @@ class MyApp extends StatelessWidget { routes: { "/HomePage": (BuildContext context) => HomePage(), "/LoginPage": (BuildContext context) => LoginPage(), + '/MapPage': (BuildContext context) => MapSample(), "/ReceiptPage": (BuildContext context) => ReceiptPage2(), "/MorePage": (BuildContext context) => MorePage(), }, diff --git a/lib/model/json/login_model.dart b/lib/model/json/login_model.dart index a87a810..6fbfc20 100644 --- a/lib/model/json/login_model.dart +++ b/lib/model/json/login_model.dart @@ -1,8 +1,4 @@ class LoginModel { - final String userName; - final String token; - final String userType; - LoginModel(this.userName, this.token, this.userType); LoginModel.fromJson(Map json) @@ -10,6 +6,10 @@ class LoginModel { userType = json['user_type'], token = json['session_key']; + final String userName; + final String token; + final String userType; + Map toJson() => { 'name': userName, 'user_type': userType, diff --git a/lib/pages/charts/preset_graphs.dart b/lib/pages/charts/preset_graphs.dart deleted file mode 100644 index f2f1f6d..0000000 --- a/lib/pages/charts/preset_graphs.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:charts_flutter/flutter.dart' as charts; -import 'package:local_spend/common/apifunctions/get_graph_data.dart'; - -class PresetChart extends StatefulWidget { - PresetChart({Key key}) : super(key: key); - - @override - _PresetChartState createState() { - return _PresetChartState(); - } -} - -class _PresetChartState extends State { - @override - void initState() { - super.initState(); - } - - @override - void dispose() { - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return new Container( - - ); - } -} \ No newline at end of file diff --git a/lib/pages/customerGraphs.dart b/lib/pages/customerGraphs.dart index c581385..d020935 100644 --- a/lib/pages/customerGraphs.dart +++ b/lib/pages/customerGraphs.dart @@ -56,10 +56,9 @@ class _CustomerGraphsState extends State { return ListView( children: [ - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( + padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), + child: Text( "Last Week's Total Spend", textAlign: TextAlign.center, style: TextStyle( @@ -69,19 +68,21 @@ class _CustomerGraphsState extends State { ), ), ), - Tooltip( message: "Graph of total spend last week", - child : Container( + child: Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + child: totalLastWeekGraph.graph != null + ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) + : Center( + child: Text( + "Loading graph...")), //List> ), ), - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( + padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), + child: Text( "Last Week's Average Spend", textAlign: TextAlign.center, style: TextStyle( @@ -91,19 +92,21 @@ class _CustomerGraphsState extends State { ), ), ), - Tooltip( message: "Graph of average spend last week", - child : Container( + child: Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List> + child: avgSpendLastWeekGraph.graph != null + ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) + : Center( + child: Text( + "Loading graph...")), //List> ), ), - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( + padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), + child: Text( "Last Month's Total Spend", textAlign: TextAlign.center, style: TextStyle( @@ -113,19 +116,21 @@ class _CustomerGraphsState extends State { ), ), ), - Tooltip( message: "Graph of total spend last month", - child : Container( + child: Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List> + child: totalLastMonthGraph.graph != null + ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) + : Center( + child: Text( + "Loading graph...")), //List> ), ), - Container( - padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0), - child : Text( + padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), + child: Text( "Last Month's Average Spend", textAlign: TextAlign.center, style: TextStyle( @@ -135,17 +140,19 @@ class _CustomerGraphsState extends State { ), ), ), - Tooltip( message: "Graph of average spend last month", - child : Container( + child: Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 200, - child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List> + child: avgSpendLastMonth.graph != null + ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) + : Center( + child: Text( + "Loading graph...")), //List> ), ), - ], ); } -} \ No newline at end of file +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 2c7d3d4..b4a7c3b 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -5,7 +5,7 @@ import 'package:local_spend/pages/stats_page.dart'; import 'package:local_spend/pages/map_page.dart'; class HomePage extends StatelessWidget { - static String _title = 'Text here'; + static String _title = 'SpendTracker'; @override Widget build(BuildContext context) { @@ -27,11 +27,11 @@ class _HomePageState extends State { int _selectedIndex = 0; static const TextStyle optionStyle = - TextStyle(fontSize: 30, fontWeight: FontWeight.bold); + TextStyle(fontSize: 30, fontWeight: FontWeight.bold); static List _widgetOptions = [ ReceiptPage2(), StatsPage(), - MapPage(), + MapSample(), MorePage() ]; @@ -43,7 +43,6 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { - var _itemText = TextStyle(color: Colors.grey[400]); return Scaffold( body: Center( @@ -75,4 +74,4 @@ class _HomePageState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 84f831d..2b21cda 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -9,7 +9,7 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:local_spend/common/widgets/labeled_checkbox.dart'; import 'package:local_spend/common/widgets/animatedGradientButton.dart'; -const URL = "https://flutter.io/"; +const url = "https://flutter.io/"; class LoginPage extends StatefulWidget { @override @@ -20,12 +20,15 @@ class LoginPage extends StatefulWidget { class LoginPageState extends State { bool _isLoggingIn = false; - final TextEditingController _emailController = TextEditingController(/*text: 'test@example.com'*/); // remove - final TextEditingController _passwordController = TextEditingController(/*text: 'abc123'*/); // remove - bool _saveLoginDetails = true; // I am extremely sorry for the placement of this variable - // it will be fixed soon I promise + final TextEditingController _emailController = + TextEditingController(/*text: 'test@example.com'*/); // remove + final TextEditingController _passwordController = + TextEditingController(/*text: 'abc123'*/); // remove + bool _saveLoginDetails = + true; // I am extremely sorry for the placement of this variable + // it will be fixed soon I promise - FocusNode focusNode; // added so focus can move automatically + FocusNode focusNode; // added so focus can move automatically Future launchURL(String url) async { if (await canLaunch(url)) { @@ -34,7 +37,7 @@ class LoginPageState extends State { showDialogSingleButton( context, "Unable to reach your website.", - "Currently unable to reach the website $URL. Please try again at a later time.", + "Currently unable to reach the website $url. Please try again at a later time.", "OK"); } } @@ -55,7 +58,7 @@ class LoginPageState extends State { super.dispose(); } - _fillLoginDetails() async { + void _fillLoginDetails() async { SharedPreferences preferences = await SharedPreferences.getInstance(); var username = await preferences.get('username'); @@ -65,14 +68,14 @@ class LoginPageState extends State { _passwordController.text = await password; } - _saveCurrentRoute(String lastRoute) async { + void _saveCurrentRoute(String lastRoute) async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('LastPageRoute', lastRoute); } - login(String username, String password) async { + void login(String username, String password) async { _isLoggingIn = true; - SystemChannels.textInput.invokeMethod('TextInput.hide'); + await SystemChannels.textInput.invokeMethod('TextInput.hide'); SharedPreferences preferences = await SharedPreferences.getInstance(); if (_saveLoginDetails) { @@ -85,7 +88,7 @@ class LoginPageState extends State { print("details cleared"); } - requestLoginAPI(context, username, password).then((value) { + await requestLoginAPI(context, username, password).then((value) { _isLoggingIn = false; }); } @@ -100,24 +103,25 @@ class LoginPageState extends State { } else { Navigator.of(context).pushReplacementNamed('/HomePage'); } + return null; }, child: PlatformScaffold( body: Stack( children: [ - AnimatedBackground([Colors.lightBlue[50], Colors.lightBlue[50]], Colors.white, Alignment.topRight, Alignment.bottomLeft, 3), - + AnimatedBackground([Colors.lightBlue[50], Colors.lightBlue[50]], + Colors.white, Alignment.topRight, Alignment.bottomLeft, 3), Container( - margin: EdgeInsets.fromLTRB(60,30,60,0), + margin: EdgeInsets.fromLTRB(60, 30, 60, 0), child: Column( children: [ Expanded( child: AnimatedContainer( duration: Duration(seconds: 2), - margin: EdgeInsets.fromLTRB(15,0,15,0), + margin: EdgeInsets.fromLTRB(15, 0, 15, 0), decoration: BoxDecoration( image: DecorationImage( - image: AssetImage('assets/images/launch_image.png') - ), + image: + AssetImage('assets/images/launch_image.png')), ), ), ), @@ -159,49 +163,57 @@ class LoginPageState extends State { fontWeight: FontWeight.bold, ), onSubmitted: (_) { - login( _emailController.text, - _passwordController.text); + login(_emailController.text, _passwordController.text); }, ), ), - - Container( - margin: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0), - width: 100, - height: 50, - child: Opacity( - opacity: _isLoggingIn ? 0.5 : 1, - child: ClipRRect( - borderRadius: BorderRadius.circular(2), - child : Stack( - children : [ - AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.bottomRight, Alignment.topLeft, 3), - Material( - type: MaterialType.transparency, - child : InkWell( - onTap: _isLoggingIn ? null : () => login( _emailController.text, _passwordController.text), - - child: new Center( - child: new Text( - 'GO', style: new TextStyle(fontSize: 18, color: Colors.white),), + Container( + margin: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0), + width: 100, + height: 50, + child: Opacity( + opacity: _isLoggingIn ? 0.5 : 1, + child: ClipRRect( + borderRadius: BorderRadius.circular(2), + child: Stack( + children: [ + AnimatedBackground( + [Colors.blue, Colors.lightBlue[300]], + Colors.lightBlue, + Alignment.bottomRight, + Alignment.topLeft, + 3), + Material( + type: MaterialType.transparency, + child: InkWell( + onTap: _isLoggingIn + ? null + : () => login(_emailController.text, + _passwordController.text), + child: new Center( + child: new Text( + 'GO', + style: new TextStyle( + fontSize: 18, color: Colors.white), + ), + ), ), ), - ), - ], + ], + ), ), ), ), - ), - Padding( padding: EdgeInsets.fromLTRB(0, 10, 0, 50), - child: LabeledCheckbox( - label : "SAVE LOGIN", - textStyle: TextStyle(fontSize: 18, color: Colors.black54, fontWeight: FontWeight.bold), - padding: const EdgeInsets.fromLTRB(0,0,0,0), - value : _saveLoginDetails, - + label: "SAVE LOGIN", + textStyle: TextStyle( + fontSize: 18, + color: Colors.black54, + fontWeight: FontWeight.bold), + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + value: _saveLoginDetails, onChanged: (bool newValue) { setState(() { _saveLoginDetails = newValue; diff --git a/lib/pages/map_page.dart b/lib/pages/map_page.dart index f15c25d..1cdb36c 100644 --- a/lib/pages/map_page.dart +++ b/lib/pages/map_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_maps/flutter_maps.dart'; -import 'package:local_spend/common/felixApiCreds.dart'; +import 'dart:async'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:local_spend/common/platform/platform_scaffold.dart'; class MapPage extends StatefulWidget { MapPage({Key key}) : super(key: key); @@ -13,20 +14,48 @@ class MapPage extends StatefulWidget { class _MapPageState extends State { @override - void initState() { - super.initState(); + Widget build(BuildContext context) { + return PlatformScaffold( + appBar: AppBar( + backgroundColor: Colors.blue[400], + title: Text( + "Submit Receipt", + style: TextStyle( + fontSize: 20, + color: Colors.white, + ), + ), + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), + body: null, + ); } +} +class MapSample extends StatefulWidget { @override - void dispose() { - super.dispose(); - } + State createState() => MapSampleState(); +} + +class MapSampleState extends State { + Completer _controller = Completer(); + + static final CameraPosition _kGooglePlex = CameraPosition( + target: LatLng(37.42796133580664, -122.085749655962), + zoom: 14.4746, + ); @override Widget build(BuildContext context) { - var fac = new FelixApiCreds(); - - // TODO: implement build - return Text(fac.mapsApiKey); + return new Scaffold( + body: GoogleMap( + mapType: MapType.hybrid, + initialCameraPosition: _kGooglePlex, + onMapCreated: (GoogleMapController controller) { + _controller.complete(controller); + }, + ), + ); } -} \ No newline at end of file +} diff --git a/lib/pages/more_page.dart b/lib/pages/more_page.dart index f467213..6c7b45a 100644 --- a/lib/pages/more_page.dart +++ b/lib/pages/more_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -7,7 +6,7 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:local_spend/common/functions/customAbout.dart' as custom; import 'package:local_spend/common/functions/showDialogTwoButtons.dart'; -const URL = "https://flutter.io/"; +const url = "https://flutter.io/"; const demonstration = false; class MorePage extends StatefulWidget { @@ -18,7 +17,7 @@ class MorePage extends StatefulWidget { } class MorePageState extends State { - FocusNode focusNode; // added so focus can move automatically + FocusNode focusNode; // added so focus can move automatically DateTime date; @@ -37,7 +36,7 @@ class MorePageState extends State { focusNode.dispose(); //disposes focus node when form disposed } - _saveCurrentRoute(String lastRoute) async { + void _saveCurrentRoute(String lastRoute) async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('LastPageRoute', lastRoute); } @@ -52,9 +51,9 @@ class MorePageState extends State { } else { Navigator.of(context).pushReplacementNamed('/LoginPage'); } + return null; }, child: PlatformScaffold( - appBar: AppBar( backgroundColor: Colors.blue[400], title: Text( @@ -68,14 +67,12 @@ class MorePageState extends State { centerTitle: true, iconTheme: IconThemeData(color: Colors.black), ), - body: Container( child: ListView( children: [ - Container( - padding: EdgeInsets.fromLTRB(30.0,25,30.0,0.0), - child : Text( + padding: EdgeInsets.fromLTRB(30.0, 25, 30.0, 0.0), + child: Text( "Local Spend Tracker", textAlign: TextAlign.center, style: TextStyle( @@ -92,53 +89,49 @@ class MorePageState extends State { height: 65.0, child: RaisedButton( onPressed: () { - custom.showAboutDialog( context: context, applicationIcon: new Icon(Icons.receipt), applicationName: "Local Spend Tracker", - children: - [ - Text("Pear Trading is a commerce company designed to register and monitor money circulating in the local economy.\n"), + children: [ + Text( + "Pear Trading is a commerce company designed to register and monitor money circulating in the local economy.\n"), Container( padding: EdgeInsets.symmetric(horizontal: 10), height: 35, child: RaisedButton( onPressed: () => {}, child: Text("Contact us", - style: - TextStyle(color: Colors.white, fontSize: 18.0)), + style: TextStyle( + color: Colors.white, fontSize: 18.0)), color: Colors.green, ), ), - Container( height: 35, margin: EdgeInsets.fromLTRB(10, 20, 10, 0), child: RaisedButton( - child: Text - ('Pear Trading', - style: TextStyle( - color: Colors.white, - fontSize: 18.0 + child: Text( + 'Pear Trading', + style: TextStyle( + color: Colors.white, fontSize: 18.0), ), - ), - color: Colors.lightGreen, - onPressed: () => launch('http://www.peartrade.org') - ), + color: Colors.lightGreen, + onPressed: () => + launch('http://www.peartrade.org')), ), - Container( height: 35, margin: EdgeInsets.fromLTRB(10, 20, 10, 0), child: Material( child: OutlineButton( - child: Text - ('Shadowcat Systems', + child: Text( + 'Shadowcat Systems', style: TextStyle( - color: Colors.black, - fontSize: 18.0 /// I don't know what to do with this button - ), + color: Colors.black, fontSize: 18.0 + + /// I don't know what to do with this button + ), ), onPressed: () => launch('https://shadow.cat/'), ), @@ -146,14 +139,11 @@ class MorePageState extends State { shadowColor: Colors.transparent, ), ), - ], ); - }, child: Text("ABOUT", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), + style: TextStyle(color: Colors.white, fontSize: 22.0)), color: Colors.blue, ), ), @@ -166,17 +156,15 @@ class MorePageState extends State { child: RaisedButton( onPressed: () { showDialogTwoButtons( - context, - "Logout", - "Are you sure you want to log out?", - "Cancel", - "Logout", - logout - ); + context, + "Logout", + "Are you sure you want to log out?", + "Cancel", + "Logout", + logout); }, child: Text("LOGOUT", - style: - TextStyle(color: Colors.white, fontSize: 22.0)), + style: TextStyle(color: Colors.white, fontSize: 22.0)), color: Colors.red, ), ), @@ -197,7 +185,6 @@ class MorePageState extends State { // ), // ), // ), - ], ), ), diff --git a/lib/pages/new_stats_page.dart b/lib/pages/new_stats_page.dart index 75b526d..4dca8a4 100644 --- a/lib/pages/new_stats_page.dart +++ b/lib/pages/new_stats_page.dart @@ -1,10 +1,8 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:local_spend/common/apifunctions/get_graph_data.dart'; -import 'package:charts_flutter/flutter.dart' as charts; -const URL = "https://flutter.io/"; +const url = "https://flutter.io/"; const demonstration = false; class NewStatsPage extends StatefulWidget { @@ -15,7 +13,6 @@ class NewStatsPage extends StatefulWidget { } class NewStatsPageState extends State { - /// Graph types: /// - total_last_week /// - avg_spend_last_week @@ -33,14 +30,13 @@ class NewStatsPageState extends State { super.dispose(); } - _saveCurrentRoute(String lastRoute) async { + void _saveCurrentRoute(String lastRoute) async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('LastPageRoute', lastRoute); } @override Widget build(BuildContext context) { - return PlatformScaffold( appBar: AppBar( backgroundColor: Colors.blue[400], @@ -55,11 +51,7 @@ class NewStatsPageState extends State { centerTitle: true, iconTheme: IconThemeData(color: Colors.black), ), - - - body : Container( - - ), + body: Container(), ); } } diff --git a/lib/pages/orgGraphs.dart b/lib/pages/orgGraphs.dart index c016abf..4b08e9a 100644 --- a/lib/pages/orgGraphs.dart +++ b/lib/pages/orgGraphs.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/apifunctions/get_graph_data.dart'; -import 'package:charts_flutter/flutter.dart' as charts; +//import 'package:charts_flutter/flutter.dart' as charts; class OrgGraphs extends StatefulWidget { OrgGraphs({Key key}) : super(key: key); @@ -27,9 +27,7 @@ class _OrgGraphsState extends State { @override Widget build(BuildContext context) { return ListView( - children: [ - - ], + children: [], ); } -} \ No newline at end of file +} diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 81b9ce1..73bc2ae 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/platform/platform_scaffold.dart'; import 'package:intl/intl.dart'; -import 'dart:core'; +import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:local_spend/common/widgets/animatedGradientButton.dart'; import 'package:local_spend/common/apifunctions/find_organisations.dart'; @@ -10,13 +10,6 @@ import 'package:local_spend/common/apifunctions/submit_receipt_api.dart'; import 'package:local_spend/common/apifunctions/categories.dart'; class Transaction { - DateTime date; - TextEditingController amount; - Organisation organisation; - String recurring; - bool isEssential; - String category; - Transaction( this.date, this.amount, @@ -25,6 +18,13 @@ class Transaction { this.isEssential, this.category, ); + + DateTime date; + TextEditingController amount; + Organisation organisation; + String recurring; + bool isEssential; + String category; } class ReceiptPage2 extends StatefulWidget { @@ -44,7 +44,7 @@ class ReceiptPage2State extends State { "Uncategorised", ); - _invalidDialog(context) { + AlertDialog _invalidDialog(context) { return AlertDialog( title: new Text("Invalid data"), content: new Text( @@ -64,9 +64,7 @@ class ReceiptPage2State extends State { return await getCategories(); } - _submitReceipt(Transaction transaction) { - DateTime dt = new DateTime.now(); - + void _submitReceipt(Transaction transaction) { Receipt receipt = new Receipt(); receipt.organisationName = transaction.organisation.name; receipt.street = transaction.organisation.streetName; @@ -86,7 +84,9 @@ class ReceiptPage2State extends State { } receipt.amount = transaction.amount.text.toString(); - receipt.time = DateFormat("yyyy-MM-dd'T'hh:mm':00.000+01:00'").format(transaction.date).toString(); + receipt.time = DateFormat("yyyy-MM-dd'T'hh:mm':00.000+01:00'") + .format(transaction.date) + .toString(); receipt.essential = transaction.isEssential.toString(); submitReceiptAPI(context, receipt); @@ -97,10 +97,11 @@ class ReceiptPage2State extends State { @override Widget build(BuildContext context) { + var _widgetHeight = MediaQuery.of(context).size.height * 0.06 < 40.0 + ? 40.0 + : MediaQuery.of(context).size.height * 0.06; - var _widgetHeight = MediaQuery.of(context).size.height * 0.06 < 40.0 ? 40.0 : MediaQuery.of(context).size.height * 0.06; - - if (_categories.length == 0) { + if (_categories.isNotEmpty) { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); _futureCats.then((value) { @@ -108,15 +109,15 @@ class ReceiptPage2State extends State { _categories = value; }); } - + _sampleRecurringOptions[0] = "None"; _sampleRecurringOptions[1] = "Daily"; _sampleRecurringOptions[2] = "Weekly"; _sampleRecurringOptions[3] = "Fortnightly"; _sampleRecurringOptions[4] = "Monthly"; _sampleRecurringOptions[5] = "Quarterly"; - _sampleRecurringOptions[6] = "Yearly"; // these will be difficult to fetch from server as they are coded into the site's rather than fetched - + _sampleRecurringOptions[6] = "Yearly"; + // these will be difficult to fetch from server as they are coded into the site's HTML rather than fetched return PlatformScaffold( appBar: AppBar( @@ -131,15 +132,19 @@ class ReceiptPage2State extends State { centerTitle: true, iconTheme: IconThemeData(color: Colors.black), ), - body: ListView( children: [ - // each CHILD has its own horizontal padding because if the listView has padding, Android's end-of-scroll animation + // each CHILD has its own horizontal padding because if the listView + // has padding, Android's end-of-scroll animation // doesn't fit the screen properly and looks weird Container( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.025,MediaQuery.of(context).size.height * 0.025,0,0.0), - child : Text( + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.025, + MediaQuery.of(context).size.height * 0.025, + 0, + 0.0), + child: Text( "Receipt Details", style: TextStyle( fontSize: 26, @@ -150,13 +155,17 @@ class ReceiptPage2State extends State { ), // "Receipt Details" title Container( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.05, + 15, + MediaQuery.of(context).size.width * 0.05, + 0.0), child: Tooltip( message: "Date and time of transaction", child: Row( - children: [ + children: [ Container( - child : Text( + child: Text( "Date/Time", style: TextStyle( fontSize: 22, @@ -166,7 +175,6 @@ class ReceiptPage2State extends State { ), width: MediaQuery.of(context).size.width * 0.3, ), - Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: _widgetHeight, @@ -177,17 +185,23 @@ class ReceiptPage2State extends State { context: context, builder: (BuildContext builder) { return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, + height: MediaQuery.of(context) + .copyWith() + .size + .height / + 3, child: CupertinoDatePicker( - initialDateTime: transaction.date.isAfter(DateTime.now()) - ? DateTime.now() - : transaction.date, + initialDateTime: + transaction.date.isAfter(DateTime.now()) + ? DateTime.now() + : transaction.date, onDateTimeChanged: (DateTime newDate) { setState(() => { - newDate.isAfter(DateTime.now()) - ? transaction.date = DateTime.now() - : transaction.date = newDate, - }); + newDate.isAfter(DateTime.now()) + ? transaction.date = + DateTime.now() + : transaction.date = newDate, + }); }, use24hFormat: true, maximumDate: DateTime.now(), @@ -199,12 +213,20 @@ class ReceiptPage2State extends State { transaction.date == null ? 'None set.' : transaction.date.year != DateTime.now().year - ? '${new DateFormat.MMMd().format(transaction.date)}' + " " + transaction.date.year.toString() + " at " + '${new DateFormat.Hm().format(transaction.date)}' - : transaction.date.day == DateTime.now().day && transaction.date.month == DateTime.now().month - ? "Today at " + '${new DateFormat.Hm().format(transaction.date)}' - : '${new DateFormat.MMMd().format(transaction.date)}' + " at " + '${new DateFormat.Hm().format(transaction.date)}', - style: - TextStyle(color: Colors.white, fontSize: 22.0), + ? '${new DateFormat.MMMd().format(transaction.date)}' + + " " + + transaction.date.year.toString() + + " at " + + '${new DateFormat.Hm().format(transaction.date)}' + : transaction.date.day == DateTime.now().day && + transaction.date.month == + DateTime.now().month + ? "Today at " + + '${new DateFormat.Hm().format(transaction.date)}' + : '${new DateFormat.MMMd().format(transaction.date)}' + + " at " + + '${new DateFormat.Hm().format(transaction.date)}', + style: TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -215,13 +237,17 @@ class ReceiptPage2State extends State { ), // Date/Time picker Container( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.05, + 15, + MediaQuery.of(context).size.width * 0.05, + 0.0), child: Tooltip( message: "Transaction payee", child: Row( - children: [ + children: [ Container( - child : Text( + child: Text( "Payee", style: TextStyle( fontSize: 22, @@ -231,7 +257,6 @@ class ReceiptPage2State extends State { ), width: MediaQuery.of(context).size.width * 0.3, ), - Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: _widgetHeight, @@ -244,9 +269,9 @@ class ReceiptPage2State extends State { try { organisation.name.length; transaction.organisation = organisation; - // debugPrint(organisation.name); + // debugPrint(organisation.name); setState(() {}); - } catch(_) { + } catch (_) { debugPrint("No organisation chosen."); } }); @@ -255,10 +280,11 @@ class ReceiptPage2State extends State { transaction.organisation.name == null ? 'Find' : transaction.organisation.name.length > 14 - ? transaction.organisation.name.substring(0,12) + "..." - : transaction.organisation.name, - style: - TextStyle(color: Colors.white, fontSize: 22.0), + ? transaction.organisation.name + .substring(0, 12) + + "..." + : transaction.organisation.name, + style: TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -269,13 +295,17 @@ class ReceiptPage2State extends State { ), // Organisation picker Container( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.05, + 15, + MediaQuery.of(context).size.width * 0.05, + 0.0), child: Tooltip( message: "Repeating?", child: Row( - children: [ + children: [ Container( - child : Text( + child: Text( "Recurring", style: TextStyle( fontSize: 22, @@ -285,7 +315,6 @@ class ReceiptPage2State extends State { ), width: MediaQuery.of(context).size.width * 0.3, ), - Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: _widgetHeight, @@ -293,31 +322,37 @@ class ReceiptPage2State extends State { child: RaisedButton( onPressed: () { showModalBottomSheet( - context: context, - builder: (BuildContext builder) { - return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, - child: CupertinoPicker( - backgroundColor: Colors.white, - children: _sampleRecurringOptions.map((thisOption) => Text(thisOption, style: TextStyle(fontSize: 30))).toList(), - onSelectedItemChanged: ((newValue) { - transaction.recurring = _sampleRecurringOptions[newValue]; - setState(() {}); - }), - magnification: 1.1, - useMagnifier: true, - itemExtent: 36, - ), - ); - } - ); + context: context, + builder: (BuildContext builder) { + return Container( + height: MediaQuery.of(context) + .copyWith() + .size + .height / + 3, + child: CupertinoPicker( + backgroundColor: Colors.white, + children: _sampleRecurringOptions + .map((thisOption) => Text(thisOption, + style: TextStyle(fontSize: 30))) + .toList(), + onSelectedItemChanged: ((newValue) { + transaction.recurring = + _sampleRecurringOptions[newValue]; + setState(() {}); + }), + magnification: 1.1, + useMagnifier: true, + itemExtent: 36, + ), + ); + }); }, child: Text( transaction.recurring == null ? 'None' : transaction.recurring, - style: - TextStyle(color: Colors.white, fontSize: 22.0), + style: TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -328,11 +363,15 @@ class ReceiptPage2State extends State { ), // Recurring picker Container( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.05, + 15, + MediaQuery.of(context).size.width * 0.05, + 0.0), child: Row( - children: [ + children: [ Container( - child : Text( + child: Text( "Category", style: TextStyle( fontSize: 22, @@ -342,7 +381,6 @@ class ReceiptPage2State extends State { ), width: MediaQuery.of(context).size.width * 0.3, ), - Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: _widgetHeight, @@ -355,12 +393,22 @@ class ReceiptPage2State extends State { context: context, builder: (BuildContext builder) { return Container( - height: MediaQuery.of(context).copyWith().size.height / 3, + height: MediaQuery.of(context) + .copyWith() + .size + .height / + 3, child: CupertinoPicker( backgroundColor: Colors.white, - children: _categories.map((thisOption) => Text(thisOption, style: TextStyle(fontSize: 30),)).toList(), + children: _categories + .map((thisOption) => Text( + thisOption, + style: TextStyle(fontSize: 30), + )) + .toList(), onSelectedItemChanged: ((newValue) { - transaction.category = _categories[newValue]; + transaction.category = + _categories[newValue]; setState(() {}); }), magnification: 1.1, @@ -374,8 +422,7 @@ class ReceiptPage2State extends State { transaction.category == null ? 'None' : transaction.category, - style: - TextStyle(color: Colors.white, fontSize: 22.0), + style: TextStyle(color: Colors.white, fontSize: 22.0), ), color: Colors.blue, ), @@ -386,13 +433,17 @@ class ReceiptPage2State extends State { ), // Category picker Container( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.05, + 15, + MediaQuery.of(context).size.width * 0.05, + 0.0), child: Tooltip( message: "Essential or not", child: Row( - children: [ + children: [ Container( - child : Text( + child: Text( "Essential", style: TextStyle( fontSize: 22, @@ -402,7 +453,6 @@ class ReceiptPage2State extends State { ), width: MediaQuery.of(context).size.width * 0.3, ), - Container( height: _widgetHeight, width: MediaQuery.of(context).size.width * 0.6, @@ -419,13 +469,17 @@ class ReceiptPage2State extends State { ), // Essential Container( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,15,MediaQuery.of(context).size.width * 0.05,0.0), + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.05, + 15, + MediaQuery.of(context).size.width * 0.05, + 0.0), child: Tooltip( message: "Transaction amount", child: Row( - children: [ + children: [ Container( - child : Text( + child: Text( "Amount", style: TextStyle( fontSize: 22, @@ -435,8 +489,6 @@ class ReceiptPage2State extends State { ), width: MediaQuery.of(context).size.width * 0.3, ), - - Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), height: _widgetHeight, @@ -447,10 +499,9 @@ class ReceiptPage2State extends State { ), textAlign: TextAlign.center, controller: transaction.amount, - decoration: InputDecoration( - hintText: "0.00" - ), - keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true), + decoration: InputDecoration(hintText: "0.00"), + keyboardType: TextInputType.numberWithOptions( + decimal: true, signed: true), ), ), ], @@ -459,7 +510,11 @@ class ReceiptPage2State extends State { ), // Amount picker Padding( - padding: EdgeInsets.fromLTRB(MediaQuery.of(context).size.width * 0.05,MediaQuery.of(context).size.height * 0.03,MediaQuery.of(context).size.width * 0.05,15.0), + padding: EdgeInsets.fromLTRB( + MediaQuery.of(context).size.width * 0.05, + MediaQuery.of(context).size.height * 0.03, + MediaQuery.of(context).size.width * 0.05, + 15.0), child: Tooltip( message: "Submit receipt", child: Container( @@ -470,45 +525,52 @@ class ReceiptPage2State extends State { opacity: 1, child: Stack( children: [ - AnimatedBackground([Colors.blue, Colors.lightBlue[300]], Colors.lightBlue, Alignment.topLeft, Alignment.bottomRight, 4), + AnimatedBackground( + [Colors.blue, Colors.lightBlue[300]], + Colors.lightBlue, + Alignment.topLeft, + Alignment.bottomRight, + 4), Material( type: MaterialType.transparency, child: InkWell( child: Center( - child : Text("GO", - style: - TextStyle(color: Colors.white, fontSize: 30.0), + child: Text( + "GO", + style: TextStyle( + color: Colors.white, fontSize: 30.0), ), ), onTap: () { try { - if (transaction.amount.text == "" || transaction.organisation.name == null) { + if (transaction.amount.text == "" || + transaction.organisation.name == null) { showDialog( context: context, builder: (BuildContext context) { return _invalidDialog(context); - } - ); + }); } else { - if (double.tryParse(transaction.amount.text) != null && double.tryParse(transaction.amount.text) > 0) { + if (double.tryParse( + transaction.amount.text) != + null && + double.tryParse(transaction.amount.text) > + 0) { _submitReceipt(transaction); } else { showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + }); } } - } - catch (_) { + } catch (_) { showDialog( - context: context, - builder: (BuildContext context) { - return _invalidDialog(context); - } - ); + context: context, + builder: (BuildContext context) { + return _invalidDialog(context); + }); } }, ), @@ -524,4 +586,4 @@ class ReceiptPage2State extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index acb4449..f887e09 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -12,7 +12,7 @@ class SplashScreen extends StatefulWidget { class _SplashScreenState extends State { final int splashDuration = 1; - startTime() async { + Future startTime() async { return Timer(Duration(seconds: splashDuration), () { SystemChannels.textInput.invokeMethod('TextInput.hide'); Navigator.of(context).pushReplacementNamed('/LoginPage'); @@ -41,8 +41,7 @@ class _SplashScreenState extends State { alignment: FractionalOffset(0.5, 0.3), decoration: BoxDecoration( image: DecorationImage( - image: AssetImage('assets/images/launch_image.png') - ), + image: AssetImage('assets/images/launch_image.png')), ), ), ), diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index 9fee878..f6102fd 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -4,7 +4,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:local_spend/pages/customerGraphs.dart'; import 'package:local_spend/pages/orgGraphs.dart'; -const URL = "https://flutter.io/"; +const url = "https://flutter.io/"; const demonstration = false; class StatsPage extends StatefulWidget { @@ -28,7 +28,7 @@ class StatsPageState extends State { super.dispose(); } - _saveCurrentRoute(String lastRoute) async { + void _saveCurrentRoute(String lastRoute) async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('LastPageRoute', lastRoute); } @@ -43,7 +43,8 @@ class StatsPageState extends State { if (userType == "-") { _getUserType().then((value) { print(value); - userType = '${value[0].toUpperCase()}${value.substring(1)}'; // capitalises first letter + userType = + '${value[0].toUpperCase()}${value.substring(1)}'; // capitalises first letter setState(() {}); }); } @@ -62,10 +63,7 @@ class StatsPageState extends State { color: Colors.white, ), ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 4) - ), - + Padding(padding: EdgeInsets.symmetric(horizontal: 4)), Text( userType, style: TextStyle( @@ -75,14 +73,16 @@ class StatsPageState extends State { ), ], ), - centerTitle: true, - iconTheme: IconThemeData(color: Colors.black), - ), - - - body : Container( + centerTitle: true, + iconTheme: IconThemeData(color: Colors.black), + ), + body: Container( padding: EdgeInsets.fromLTRB(0, 0, 0, 0), - child: (userType == "-" ? null : (userType.toLowerCase() == "customer" ? CustomerGraphs() : OrgGraphs())), + child: (userType == "-" + ? null + : (userType.toLowerCase() == "customer" + ? CustomerGraphs() + : OrgGraphs())), ), ); } diff --git a/pubspec.lock b/pubspec.lock index b6850bf..168c087 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -35,42 +35,42 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "1.1.4" + version: "1.1.6" build_config: dependency: transitive description: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" + version: "0.4.1+1" build_daemon: dependency: transitive description: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "2.0.0" build_resolvers: dependency: transitive description: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.0.7" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.6.1" + version: "1.6.6" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "3.0.6" + version: "3.0.9" built_collection: dependency: transitive description: @@ -84,7 +84,7 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "6.6.0" + version: "6.7.0" charcode: dependency: transitive description: @@ -106,6 +106,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" code_builder: dependency: transitive description: @@ -133,14 +140,14 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.1.2" csslib: dependency: transitive description: name: csslib url: "https://pub.dartlang.org" source: hosted - version: "0.16.0" + version: "0.16.1" cupertino_icons: dependency: "direct main" description: @@ -154,7 +161,7 @@ packages: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "1.2.7" + version: "1.2.9" datetime_picker_formfield: dependency: "direct main" description: @@ -193,13 +200,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_maps: - dependency: "direct main" - description: - name: flutter_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -219,6 +219,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.7" + google_maps_flutter: + dependency: "direct main" + description: + name: google_maps_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.20+5" graphs: dependency: transitive description: @@ -283,7 +290,7 @@ packages: source: hosted version: "2.3.0" json_serializable: - dependency: "direct dev" + dependency: "direct main" description: name: json_serializable url: "https://pub.dartlang.org" @@ -330,7 +337,7 @@ packages: name: package_config url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0" package_resolver: dependency: transitive description: @@ -346,7 +353,7 @@ packages: source: hosted version: "1.6.2" pedantic: - dependency: transitive + dependency: "direct dev" description: name: pedantic url: "https://pub.dartlang.org" @@ -372,7 +379,7 @@ packages: name: pubspec_parse url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" quiver: dependency: transitive description: @@ -419,7 +426,7 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "0.9.4+2" + version: "0.9.4+3" source_span: dependency: transitive description: @@ -475,7 +482,7 @@ packages: name: timing url: "https://pub.dartlang.org" source: hosted - version: "0.1.1+1" + version: "0.1.1+2" typed_data: dependency: transitive description: @@ -503,14 +510,14 @@ packages: name: watcher url: "https://pub.dartlang.org" source: hosted - version: "0.9.7+10" + version: "0.9.7+12" web_socket_channel: dependency: transitive description: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "1.0.13" + version: "1.0.15" yaml: dependency: transitive description: @@ -519,5 +526,5 @@ packages: source: hosted version: "2.1.16" sdks: - dart: ">=2.3.0-dev.0.1 <3.0.0" - flutter: ">=0.1.4 <2.0.0" + dart: ">=2.3.0 <3.0.0" + flutter: ">=1.5.0 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index ecc6222..6e3259c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,7 @@ description: Local Spend Tracker version: 1.0.0+1 environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" + sdk: ">=2.2.2 <3.0.0" dependencies: flutter: @@ -26,7 +26,8 @@ dependencies: flutter_fadein: ^1.1.1 charts_flutter: ^0.6.0 simple_animations: ^1.3.3 - flutter_maps: ^0.1.0 + google_maps_flutter: ^0.5.20+5 + json_serializable: ^2.0.2 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 @@ -34,9 +35,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - build_runner: ^1.1.3 - json_serializable: ^2.1.2 - + pedantic: ^1.4.0 + build_runner: ^1.2.7 # For information on the generic Dart part of this file, see the # following page: https://www.dartlang.org/tools/pub/pubspec diff --git a/test/widget_test.dart b/test/widget_test.dart index 3835e00..5beab46 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -11,7 +11,6 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:local_spend/main.dart'; void main() { - testWidgets('GO button repetition test', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(MyApp()); From 7553ce25f878d752b8dba12ab212e5070eabed16 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 21 Aug 2019 16:50:26 +0100 Subject: [PATCH 106/122] organisations graphs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit save login is now somehow broken 🧐 --- lib/common/apifunctions/get_graph_data.dart | 317 +++++++++----------- lib/pages/map_page.dart | 14 +- lib/pages/orgGraphs.dart | 148 ++++++++- lib/pages/spash_screen.dart | 5 +- 4 files changed, 293 insertions(+), 191 deletions(-) diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index f24ebdf..6513fb4 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -4,6 +4,132 @@ import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import 'package:charts_flutter/flutter.dart' as charts; + +/// Customer graph types: https://dev.localspend.co.uk/api/v1/customer/graphs +/// - total_last_week +/// - avg_spend_last_week +/// - total_last_month +/// - avg_spend_last_month + + +/// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[name] as {"session_key":"[boop beep]"} +/// - organisations_all : organisation +/// - pies : organisation/pies +/// - snippets : organisation/snippets +/// - graphs : organisation/graphs +/// - {"graph":"customers_last_7_days","session_key":"[bleep]"} +/// - {"graph":"customers_last_30_days","session_key":"[blah]"} +/// - {"graph":"sales_last_7_days","session_key":"[bloop]"} +/// - {"graph":"sales_last_7_days","session_key":"[reee]"} +/// - {"graph":"purchases_last_7_days","session_key":"[yee]"} +/// - {"graph":"purchases_last_30_days","session_key":"[yah]"} +/// - {"graph":"purchases_all;","session_key":"[kappa]"} // I don't think this one works +/// +/// HTTP POST request sample: +/// {"graph":"total_last_week","session_key":"blahblahblah"} + + + +class OrganisationGraph { + OrganisationGraph( + this.chartType, + {this.graphsType = ""} + ); + + String graphsType = ""; // type of graph, eg customers_last_7_days, sales_last_30_days, purchases_last_30_days etc + String chartType; // type of chart, eg organisations_all, pies, snippets or graphs + + List> graph; + + List cachedData; + + bool loaded = false; + + Future getGraphData() async { + if (loaded) { + this.graph = [ + new charts.Series( + id: 'Chart', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesCustomersOrSales spend, _) => spend.time, + measureFn: (TimeSeriesCustomersOrSales spend, _) => + spend.numberOfStuff, + data: cachedData, + ) + ]; + return null; + } + + String url = "https://dev.localspend.co.uk/api/v1/organisation/"; + + if (!(this.chartType == "organisations_all")) { + url += this.chartType; + } + + SharedPreferences preferences = await SharedPreferences.getInstance(); + Map body; + + if (this.chartType == "graphs") { + body = { + 'graph': this.graphsType, + 'session_key': preferences.get('LastToken'), + }; + } else { + body = { + 'session_key': preferences.get('LastToken'), + }; + } + + print(url); + print(json.encode(body).toString()); + + final response = await http.post( + url, + body: json.encode(body), + ); + + try { + if (response.statusCode == 200) { + final responseJson = jsonDecode(response.body); + final List labels = responseJson['graph']['labels']; + final List data = responseJson['graph']['data']; + + List graphDataList = new List< + TimeSeriesCustomersOrSales>(); + + for (int i = 0; i < labels.length; i++) { + graphDataList.add( + new TimeSeriesCustomersOrSales( + data[i] * 1.00, DateTime.parse(labels[i]))); + } + + this.cachedData = graphDataList; + this.loaded = true; + + this.graph = [ + new charts.Series( + id: 'Chart', + colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, + domainFn: (TimeSeriesCustomersOrSales spend, _) => spend.time, + measureFn: (TimeSeriesCustomersOrSales spend, _) => + spend.numberOfStuff, + data: graphDataList, + ) + ]; + return this.graph; + } else { + final errorMessage = json.decode(response.body)['message']; + print("Error: " + errorMessage); + this.graph = null; + } + } catch (error) { + print(error.toString()); + } + + } + +} + class GraphData { GraphData( this.chartType, @@ -15,8 +141,8 @@ class GraphData { List cachedData; bool loaded = false; - Future setGraphData() async { - if (loaded == true) { + Future>> setGraphData() async { + if (loaded) { this.graph = [ new charts.Series( id: 'Spend', @@ -26,6 +152,7 @@ class GraphData { data: cachedData, ) ]; + return null; } final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; @@ -66,167 +193,16 @@ class GraphData { data: timeSeriesSpendList, ) ]; + return this.graph; + } else { final errorMessage = json.decode(response.body)['message']; print("Error: " + errorMessage); this.graph = null; - } - } - - Future>> getGraphData() async { - if (loaded == true) { - return [ - new charts.Series( - id: 'Spend', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (TimeSeriesSpend spend, _) => spend.time, - measureFn: (TimeSeriesSpend spend, _) => spend.spend, - data: cachedData, - ) - ]; - } - - // TODO: Show available graph types based on whether or not the user is an Organisation or User - - /// Customer graph types: https://dev.localspend.co.uk/api/v1/customer/graphs - /// - total_last_week - /// - avg_spend_last_week - /// - total_last_month - /// - avg_spend_last_month - /// - /// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[name] as {"session_key":"[boop beep]"} - /// - organisations_all : organisation - /// - pies : organisation/pies - /// - snippets : organisation/snippets - /// - graphs : organisation/graphs - /// - {"graph":"customers_last_7_days","session_key":"[bleep]"} - /// - {"graph":"customers_last_30_days","session_key":"[blah]"} - /// - {"graph":"sales_last_7_days","session_key":"[bloop]"} - /// - {"graph":"sales_last_7_days","session_key":"[reee]"} - /// - {"graph":"purchases_last_7_days","session_key":"[yee]"} - /// - {"graph":"purchases_last_30_days","session_key":"[yah]"} - /// - {"graph":"purchases_all;","session_key":"[kappa]"} // I don't think this one works - /// - /// HTTP POST request sample: - /// {"graph":"total_last_week","session_key":"blahblahblah"} - - final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; - SharedPreferences preferences = await SharedPreferences.getInstance(); - - Map body = { - 'graph': this.chartType, - 'session_key': preferences.get('LastToken'), - }; - - final response = await http.post( - url, - body: json.encode(body), - ); - - if (response.statusCode == 200) { - final responseJson = jsonDecode(response.body); - final List labels = responseJson['graph']['labels']; - final List data = responseJson['graph']['data']; - - List timeSeriesSpendList = new List(); - - for (int i = 0; i < labels.length; i++) { - timeSeriesSpendList.add( - new TimeSeriesSpend(data[i] * 1.00, DateTime.parse(labels[i]))); -// print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); - } - - cachedData = timeSeriesSpendList; - loaded = true; - - return [ - new charts.Series( - id: 'Spend', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (TimeSeriesSpend spend, _) => spend.time, - measureFn: (TimeSeriesSpend spend, _) => spend.spend, - data: timeSeriesSpendList, - ) - ]; - } else { - final errorMessage = json.decode(response.body)['message']; - print("Error: " + errorMessage); - return null; } } -} - -class OrgGraphData { - OrgGraphData( - this.chartType, - ); - - var chartType; - List> graph; - - List cachedData; - bool loaded = false; - - Future setGraphData() async { - if (loaded == true) { - this.graph = [ - new charts.Series( - id: 'Spend', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (TimeSeriesSpend spend, _) => spend.time, - measureFn: (TimeSeriesSpend spend, _) => spend.spend, - data: cachedData, - ) - ]; - } - - final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; - SharedPreferences preferences = await SharedPreferences.getInstance(); - - Map body = { - 'graph': this.chartType, - 'session_key': preferences.get('LastToken'), - }; - - final response = await http.post( - url, - body: json.encode(body), - ); - - if (response.statusCode == 200) { - final responseJson = jsonDecode(response.body); - final List labels = responseJson['graph']['labels']; - final List data = responseJson['graph']['data']; - - List timeSeriesSpendList = new List(); - - for (int i = 0; i < labels.length; i++) { - timeSeriesSpendList.add( - new TimeSeriesSpend(data[i] * 1.00, DateTime.parse(labels[i]))); -// print(timeSeriesSpendList[i].time.toString() + " : " + timeSeriesSpendList[i].spend.toString()); - } - - cachedData = timeSeriesSpendList; - loaded = true; - - this.graph = [ - new charts.Series( - id: 'Spend', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (TimeSeriesSpend spend, _) => spend.time, - measureFn: (TimeSeriesSpend spend, _) => spend.spend, - data: timeSeriesSpendList, - ) - ]; - } else { - final errorMessage = json.decode(response.body)['message']; - print("Error: " + errorMessage); - - this.graph = null; - } - } Future>> getGraphData() async { if (loaded == true) { @@ -241,30 +217,6 @@ class OrgGraphData { ]; } - // TODO: Show available graph types based on whether or not the user is an Organisation or User - - /// Customer graph types: https://dev.localspend.co.uk/api/v1/customer/graphs - /// - total_last_week - /// - avg_spend_last_week - /// - total_last_month - /// - avg_spend_last_month - /// - /// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[name] as {"session_key":"[boop beep]"} - /// - organisations_all : organisation - /// - pies : organisation/pies - /// - snippets : organisation/snippets - /// - graphs : organisation/graphs - /// - {"graph":"customers_last_7_days","session_key":"[bleep]"} - /// - {"graph":"customers_last_30_days","session_key":"[blah]"} - /// - {"graph":"sales_last_7_days","session_key":"[bloop]"} - /// - {"graph":"sales_last_7_days","session_key":"[reee]"} - /// - {"graph":"purchases_last_7_days","session_key":"[yee]"} - /// - {"graph":"purchases_last_30_days","session_key":"[yah]"} - /// - {"graph":"purchases_all;","session_key":"[kappa]"} // I don't think this one works - /// - /// HTTP POST request sample: - /// {"graph":"total_last_week","session_key":"blahblahblah"} - final url = "https://dev.localspend.co.uk/api/v1/customer/graphs"; SharedPreferences preferences = await SharedPreferences.getInstance(); @@ -318,3 +270,10 @@ class TimeSeriesSpend { final DateTime time; final double spend; } + +class TimeSeriesCustomersOrSales { + TimeSeriesCustomersOrSales(this.numberOfStuff, this.time); + + final DateTime time; + final double numberOfStuff; +} \ No newline at end of file diff --git a/lib/pages/map_page.dart b/lib/pages/map_page.dart index 1cdb36c..2b05ef5 100644 --- a/lib/pages/map_page.dart +++ b/lib/pages/map_page.dart @@ -49,13 +49,13 @@ class MapSampleState extends State { @override Widget build(BuildContext context) { return new Scaffold( - body: GoogleMap( - mapType: MapType.hybrid, - initialCameraPosition: _kGooglePlex, - onMapCreated: (GoogleMapController controller) { - _controller.complete(controller); - }, - ), +// body: GoogleMap( +// mapType: MapType.hybrid, +// initialCameraPosition: _kGooglePlex, +// onMapCreated: (GoogleMapController controller) { +// _controller.complete(controller); +// }, +// ), ); } } diff --git a/lib/pages/orgGraphs.dart b/lib/pages/orgGraphs.dart index 4b08e9a..057f68c 100644 --- a/lib/pages/orgGraphs.dart +++ b/lib/pages/orgGraphs.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/apifunctions/get_graph_data.dart'; -//import 'package:charts_flutter/flutter.dart' as charts; +import 'package:charts_flutter/flutter.dart' as charts; class OrgGraphs extends StatefulWidget { OrgGraphs({Key key}) : super(key: key); @@ -12,7 +12,27 @@ class OrgGraphs extends StatefulWidget { } class _OrgGraphsState extends State { - GraphData totalLastWeekGraph = new GraphData("total_last_week"); + + /// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[graph_type] as {"session_key":"[boop beep]"} + /// - organisations_all : organisation + /// - pies : organisation/pies + /// - snippets : organisation/snippets + /// - graphs : organisation/graphs + /// - {"graph":"customers_last_7_days","session_key":"[bleep]"} + /// - {"graph":"customers_last_30_days","session_key":"[blah]"} + /// - {"graph":"sales_last_7_days","session_key":"[bloop]"} + /// - {"graph":"sales_last_7_days","session_key":"[reee]"} + /// - {"graph":"purchases_last_7_days","session_key":"[yee]"} + /// - {"graph":"purchases_last_30_days","session_key":"[yah]"} + /// - {"graph":"purchases_all;","session_key":"[kappa]"} // I don't think this one works + /// + /// HTTP POST request sample: + /// {"graph":"total_last_week","session_key":"blahblahblah"} + +// OrganisationGraph customersLastWeek = new OrganisationGraph("graphs", graphsType: "customers_last_7_days"); + OrganisationGraph customersLastMonth = new OrganisationGraph("graphs", graphsType: "customers_last_30_days"); + OrganisationGraph salesLastMonth = new OrganisationGraph("graphs", graphsType: "sales_last_30_days"); + OrganisationGraph purchasesLastMonth = new OrganisationGraph("graphs", graphsType: "purchases_last_30_days"); //purchases_last_30_days @override void initState() { @@ -26,8 +46,130 @@ class _OrgGraphsState extends State { @override Widget build(BuildContext context) { +// if (!customersLastWeek.loaded) { +// customersLastWeek.getGraphData().then((_) { +// setState(() {}); +// }); +// } + if (!customersLastMonth.loaded) { + customersLastMonth.getGraphData().then((_) { + setState(() {}); + }); + } + if (!salesLastMonth.loaded) { + salesLastMonth.getGraphData().then((_) { + setState(() {}); + }); + } + if (!purchasesLastMonth.loaded) { + purchasesLastMonth.getGraphData().then((_) { + setState(() {}); + }); + } + return ListView( - children: [], + children: [ +// Container( +// padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), +// child: Text( +// "Last Week's Customers", +// textAlign: TextAlign.center, +// style: TextStyle( +// fontSize: 22.0, +// color: Colors.black, +// fontWeight: FontWeight.bold, +// ), +// ), +// ), +// Tooltip( +// message: "Graph of customers last week", +// child: Container( +// padding: EdgeInsets.symmetric(horizontal: 10), +// height: 200, +// child: customersLastWeek.graph != null +// ? new charts.TimeSeriesChart(customersLastWeek.graph) +// : Center( +// child: Text( +// "Loading graph...")), //List> +// ), +// ), + + Container( + padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), + child: Text( + "This Month's Customers", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Tooltip( + message: "Customers this month", // this needs to be better + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: customersLastMonth.graph != null + ? new charts.TimeSeriesChart(customersLastMonth.graph) + : Center( + child: Text( + "Loading graph...")), //List> + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), + child: Text( + "This Month's Revenue", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Tooltip( + message: "Revenue from sales this month", + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: salesLastMonth.graph != null + ? new charts.TimeSeriesChart(salesLastMonth.graph) + : Center( + child: Text( + "Loading graph...")), //List> + ), + ), + + Container( + padding: EdgeInsets.fromLTRB(0.0, 17, 0.0, 0.0), + child: Text( + "This Month's Sales", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22.0, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + Tooltip( + message: "Number of sales this month", + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + height: 200, + child: purchasesLastMonth.graph != null + ? new charts.TimeSeriesChart(purchasesLastMonth.graph) + : Center( + child: Text( + "Loading graph...")), //List> + ), + ), + + ], ); } } diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index f887e09..bcfe751 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -41,14 +41,15 @@ class _SplashScreenState extends State { alignment: FractionalOffset(0.5, 0.3), decoration: BoxDecoration( image: DecorationImage( - image: AssetImage('assets/images/launch_image.png')), + image: AssetImage('assets/images/launch_image.png'), + ), ), ), ), Container( margin: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 30.0), child: Text( - "© Copyright Statement 2019", + "© Copyright Pear Trading 2019", style: TextStyle( fontSize: 16.0, color: Colors.black, From d8ecd50acdf76d3632a9275563ebf11212e07040 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 21 Aug 2019 16:59:08 +0100 Subject: [PATCH 107/122] progress indicators --- lib/pages/customerGraphs.dart | 24 ++++++++++++++++-------- lib/pages/orgGraphs.dart | 14 ++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/pages/customerGraphs.dart b/lib/pages/customerGraphs.dart index d020935..efdd7eb 100644 --- a/lib/pages/customerGraphs.dart +++ b/lib/pages/customerGraphs.dart @@ -76,8 +76,10 @@ class _CustomerGraphsState extends State { child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center( - child: Text( - "Loading graph...")), //List> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.orange), + ) + ), //List>es> ), ), Container( @@ -100,8 +102,10 @@ class _CustomerGraphsState extends State { child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center( - child: Text( - "Loading graph...")), //List> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.blue), + ) + ), //List>es> ), ), Container( @@ -124,8 +128,10 @@ class _CustomerGraphsState extends State { child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center( - child: Text( - "Loading graph...")), //List> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.green), + ) + ), //List>es> ), ), Container( @@ -148,8 +154,10 @@ class _CustomerGraphsState extends State { child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center( - child: Text( - "Loading graph...")), //List> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.red), + ) + ), //List>es> ), ), ], diff --git a/lib/pages/orgGraphs.dart b/lib/pages/orgGraphs.dart index 057f68c..82ef593 100644 --- a/lib/pages/orgGraphs.dart +++ b/lib/pages/orgGraphs.dart @@ -114,8 +114,7 @@ class _OrgGraphsState extends State { child: customersLastMonth.graph != null ? new charts.TimeSeriesChart(customersLastMonth.graph) : Center( - child: Text( - "Loading graph...")), //List> + child: CircularProgressIndicator()), //List> ), ), @@ -139,8 +138,9 @@ class _OrgGraphsState extends State { child: salesLastMonth.graph != null ? new charts.TimeSeriesChart(salesLastMonth.graph) : Center( - child: Text( - "Loading graph...")), //List> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.green), + )), //List> ), ), @@ -164,8 +164,10 @@ class _OrgGraphsState extends State { child: purchasesLastMonth.graph != null ? new charts.TimeSeriesChart(purchasesLastMonth.graph) : Center( - child: Text( - "Loading graph...")), //List> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.red), + ) + ), //List> ), ), From 62d50f86a8f4376fba569f6f94a916551028a8bb Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 21 Aug 2019 17:06:53 +0100 Subject: [PATCH 108/122] (profile mode) --- ios/Podfile.lock | 4 ++-- ios/Runner.xcodeproj/project.pbxproj | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 371ba09..e0081c9 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -14,7 +14,7 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) @@ -25,7 +25,7 @@ SPEC REPOS: EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" google_maps_flutter: :path: ".symlinks/plugins/google_maps_flutter/ios" shared_preferences: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 8fc019b..f0bdeff 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -282,7 +282,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( From 030f482a54de592a0d261f3030499eac0a5a1036 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 23 Aug 2019 17:52:48 +0100 Subject: [PATCH 109/122] categories still broken --- ios/Podfile.lock | 4 ++-- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/pages/receipt_page_2.dart | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e0081c9..371ba09 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -14,7 +14,7 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) @@ -25,7 +25,7 @@ SPEC REPOS: EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" google_maps_flutter: :path: ".symlinks/plugins/google_maps_flutter/ios" shared_preferences: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f0bdeff..8fc019b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -282,7 +282,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 73bc2ae..d98f9c7 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -95,6 +95,12 @@ class ReceiptPage2State extends State { List _sampleRecurringOptions = new List(7); List _categories = new List(); + @override + void initState() { + super.initState(); + } + + @override Widget build(BuildContext context) { var _widgetHeight = MediaQuery.of(context).size.height * 0.06 < 40.0 @@ -105,8 +111,8 @@ class ReceiptPage2State extends State { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); _futureCats.then((value) { - _categories = null; _categories = value; + setState(() {}); }); } From f4a2e6ca7a633770e2de515999527f16fbbfd73b Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 11:00:57 +0100 Subject: [PATCH 110/122] save before debugging marathon --- lib/main.dart | 17 +++++++++++++++++ lib/pages/login_page.dart | 14 +++++--------- lib/pages/stats_page.dart | 2 ++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 6b433ea..3f9987c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,14 +6,31 @@ import 'package:local_spend/pages/receipt_page_2.dart'; import 'package:local_spend/pages/spash_screen.dart'; import 'package:local_spend/pages/more_page.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:local_spend/common/apifunctions/get_graph_data.dart'; void main() { runApp(MyApp()); } +void loadGraphs() { + +} + +class GraphWithTitle { + GraphWithTitle({ + this.graph, + this.title + }); + + GraphData graph; + String title; +} + class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + var graphList = List(); + return new MaterialApp( debugShowCheckedModeBanner: false, localizationsDelegates: [ diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 2b21cda..a43bc27 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -21,12 +21,10 @@ class LoginPage extends StatefulWidget { class LoginPageState extends State { bool _isLoggingIn = false; final TextEditingController _emailController = - TextEditingController(/*text: 'test@example.com'*/); // remove + TextEditingController(); final TextEditingController _passwordController = - TextEditingController(/*text: 'abc123'*/); // remove - bool _saveLoginDetails = - true; // I am extremely sorry for the placement of this variable - // it will be fixed soon I promise + TextEditingController(); + bool _saveLoginDetails = true; FocusNode focusNode; // added so focus can move automatically @@ -81,11 +79,9 @@ class LoginPageState extends State { if (_saveLoginDetails) { await preferences.setString('username', username); await preferences.setString('password', password); - print("details saved"); } else { - await preferences.setString('username', ""); - await preferences.setString('password', ""); - print("details cleared"); + await preferences.setString('username', ""); // this does work... + await preferences.setString('password', ""); // ...but this doesn't seem to have any effect..? } await requestLoginAPI(context, username, password).then((value) { diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index f6102fd..f3f1e06 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -10,6 +10,8 @@ const demonstration = false; class StatsPage extends StatefulWidget { @override State createState() { + print("TODO: The 'stats' page should be loaded on login and cached rather than reloading on every opening of the page."); + print("Create new List in instantiated MyApp() and pass that or load it from this class' child with (graphs = super.graphList) or something."); return new StatsPageState(); } } From ece2c62762bd41b3cf931eb9244fc01373c156d4 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 11:22:19 +0100 Subject: [PATCH 111/122] i'm so stupid ughhh --- lib/pages/receipt_page_2.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index d98f9c7..162ac6b 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -107,7 +107,7 @@ class ReceiptPage2State extends State { ? 40.0 : MediaQuery.of(context).size.height * 0.06; - if (_categories.isNotEmpty) { + if (_categories.isEmpty) { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); _futureCats.then((value) { From ac82ec4d48a1f67aab6aef5711bd13f7b4d63bda Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 11:37:13 +0100 Subject: [PATCH 112/122] most of the bugs are just me being silly ngl --- lib/common/functions/save_logout.dart | 2 ++ lib/pages/login_page.dart | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/common/functions/save_logout.dart b/lib/common/functions/save_logout.dart index 4d5e419..92753cb 100644 --- a/lib/common/functions/save_logout.dart +++ b/lib/common/functions/save_logout.dart @@ -6,4 +6,6 @@ void saveLogout() async { await preferences.setString('LastUser', ""); await preferences.setString('LastToken', ""); await preferences.setString('LastEmail', ""); + await preferences.setString('username', ""); + await preferences.setString('password', ""); } diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index a43bc27..f77d0e5 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -80,8 +80,8 @@ class LoginPageState extends State { await preferences.setString('username', username); await preferences.setString('password', password); } else { - await preferences.setString('username', ""); // this does work... - await preferences.setString('password', ""); // ...but this doesn't seem to have any effect..? + await preferences.setString('username', ""); + await preferences.setString('password', ""); } await requestLoginAPI(context, username, password).then((value) { From 7aeccb46cf764e58e24e69cfbd700cf577abf306 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 11:39:20 +0100 Subject: [PATCH 113/122] that's a strange bug indeed --- lib/pages/receipt_page_2.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 162ac6b..aaccdbc 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -111,6 +111,7 @@ class ReceiptPage2State extends State { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); _futureCats.then((value) { + print("Categories: " + value.toString()); _categories = value; setState(() {}); }); From c6f69172268b5fa5356389d67ad29bd4f4690221 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 11:41:08 +0100 Subject: [PATCH 114/122] Revert "that's a strange bug indeed" This reverts commit 7aeccb46cf764e58e24e69cfbd700cf577abf306. --- lib/pages/receipt_page_2.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index aaccdbc..162ac6b 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -111,7 +111,6 @@ class ReceiptPage2State extends State { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); _futureCats.then((value) { - print("Categories: " + value.toString()); _categories = value; setState(() {}); }); From 204cd74544ef45fb987d17a2796149b5bf2c5458 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 11:50:07 +0100 Subject: [PATCH 115/122] pickers now reset on opening not sure if this looks too great --- lib/pages/receipt_page_2.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 162ac6b..83f5892 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -327,6 +327,8 @@ class ReceiptPage2State extends State { width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { + transaction.recurring = _sampleRecurringOptions[0]; + setState(() {}); showModalBottomSheet( context: context, builder: (BuildContext builder) { @@ -395,6 +397,8 @@ class ReceiptPage2State extends State { message: "Category of transaction", child: RaisedButton( onPressed: () { + transaction.category = _categories[0]; + setState(() {}); showModalBottomSheet( context: context, builder: (BuildContext builder) { From 96fdc01eea322f685f3e81979973901d4fbaea33 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 12:18:02 +0100 Subject: [PATCH 116/122] logout works properly --- .../apifunctions/request_logout_api.dart | 20 +++++-------------- lib/common/functions/logout.dart | 11 +++++----- lib/common/functions/save_logout.dart | 2 -- lib/pages/receipt_page_2.dart | 4 ++-- 4 files changed, 13 insertions(+), 24 deletions(-) diff --git a/lib/common/apifunctions/request_logout_api.dart b/lib/common/apifunctions/request_logout_api.dart index efb64a3..471ce9f 100644 --- a/lib/common/apifunctions/request_logout_api.dart +++ b/lib/common/apifunctions/request_logout_api.dart @@ -1,13 +1,13 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:local_spend/common/functions/get_token.dart'; import 'package:local_spend/common/functions/save_logout.dart'; -import 'package:local_spend/model/json/login_model.dart'; -Future requestLogoutAPI(BuildContext context) async { +Future requestLogoutAPI() async { + saveLogout(); + final url = "https://dev.localspend.co.uk/api/logout"; var token; @@ -20,20 +20,10 @@ Future requestLogoutAPI(BuildContext context) async { "Token": token, }; - final response = await http.post( + await http.post( url, body: json.encode(body), ); - if (response.statusCode == 200) { -// debugPrint("Logout successful: " + response.body); - - saveLogout(); - return null; - } else { -// debugPrint("Logout unsuccessful: " + response.body); - - saveLogout(); - return null; - } + return true; } diff --git a/lib/common/functions/logout.dart b/lib/common/functions/logout.dart index 68e47a1..1b14d6b 100644 --- a/lib/common/functions/logout.dart +++ b/lib/common/functions/logout.dart @@ -1,17 +1,18 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:local_spend/common/functions/save_logout.dart'; void logout(context) { - requestLogoutAPI(context); - Navigator.of(context).pushReplacementNamed('/LoginPage'); - _clearLoginDetails(); + _clearLoginDetails().then((_) { + requestLogoutAPI(); + Navigator.of(context).pushReplacementNamed('/LoginPage'); + }); } -void _clearLoginDetails() async { +Future _clearLoginDetails() async { SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.setString('username', ""); await preferences.setString('password', ""); - print("details cleared"); } diff --git a/lib/common/functions/save_logout.dart b/lib/common/functions/save_logout.dart index 92753cb..4d5e419 100644 --- a/lib/common/functions/save_logout.dart +++ b/lib/common/functions/save_logout.dart @@ -6,6 +6,4 @@ void saveLogout() async { await preferences.setString('LastUser', ""); await preferences.setString('LastToken', ""); await preferences.setString('LastEmail', ""); - await preferences.setString('username', ""); - await preferences.setString('password', ""); } diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 83f5892..4ef3c00 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -112,6 +112,7 @@ class ReceiptPage2State extends State { _categories.add("Fetching categories..."); _futureCats.then((value) { _categories = value; + _categories.insert(0, "Uncategorised"); setState(() {}); }); } @@ -406,8 +407,7 @@ class ReceiptPage2State extends State { height: MediaQuery.of(context) .copyWith() .size - .height / - 3, + .height / 3, child: CupertinoPicker( backgroundColor: Colors.white, children: _categories From c6e69b037bcdae00af04bdf1b28527afacf99399 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 27 Aug 2019 17:00:19 +0100 Subject: [PATCH 117/122] profile mode, no changes --- ios/Podfile.lock | 4 ++-- ios/Runner.xcodeproj/project.pbxproj | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 371ba09..e0081c9 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -14,7 +14,7 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) @@ -25,7 +25,7 @@ SPEC REPOS: EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" google_maps_flutter: :path: ".symlinks/plugins/google_maps_flutter/ios" shared_preferences: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 8fc019b..f0bdeff 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -282,7 +282,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( From a51254977848b186506eaefc7602f78c708a6c0b Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 2 Sep 2019 12:57:14 +0100 Subject: [PATCH 118/122] Maps, optimization, testing, code cleanup --- android/app/src/main/AndroidManifest.xml | 2 +- assets/Consolas.ttf | Bin 0 -> 98504 bytes assets/images/cat.png | Bin 0 -> 92020 bytes assets/images/shadowcat-long.png | Bin 0 -> 87167 bytes assets/images/text.png | Bin 0 -> 172889 bytes ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- ios/Runner/AppDelegate.m | 2 +- ios/Runner/Info.plist | 4 +- lib/common/apifunctions/get_graph_data.dart | 33 +++---- lib/common/apifunctions/get_map_data.dart | 92 ++++++++++++++++++ lib/common/functions/customAbout.dart | 6 +- lib/common/functions/logout.dart | 1 - lib/common/platform/platform_scaffold.dart | 25 +++-- .../widgets/animatedGradientButton.dart | 1 - .../charts/numeric_line_bar_combo.dart | 1 - .../charts/scatter_bucketingAxis_legend.dart | 1 - lib/common/widgets/custom_checkbox.dart | 9 +- lib/main.dart | 13 +-- lib/pages/customerGraphs.dart | 25 +++-- lib/pages/home_page.dart | 3 +- lib/pages/login_page.dart | 6 +- lib/pages/map_page.dart | 61 ++++++------ lib/pages/more_page.dart | 47 +++++---- lib/pages/orgGraphs.dart | 25 ++--- lib/pages/receipt_page_2.dart | 55 ++++++----- lib/pages/spash_screen.dart | 4 - lib/pages/stats_page.dart | 6 +- pubspec.yaml | 5 + 29 files changed, 257 insertions(+), 176 deletions(-) create mode 100644 assets/Consolas.ttf create mode 100644 assets/images/cat.png create mode 100644 assets/images/shadowcat-long.png create mode 100644 assets/images/text.png create mode 100644 lib/common/apifunctions/get_map_data.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index be8cc8c..184c9d7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -19,7 +19,7 @@ + android:value="AIzaSyD0vsoT6Omnn01hbUiCjAhiS47uFYWnEHE"/> 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 L>)yBWRpzGwLH-Cp literal 0 HcmV?d00001 diff --git a/assets/images/cat.png b/assets/images/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..584392423d4bb9ef722477897b09128ecb04ff89 GIT binary patch literal 92020 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 D(fGDt literal 0 HcmV?d00001 diff --git a/assets/images/shadowcat-long.png b/assets/images/shadowcat-long.png new file mode 100644 index 0000000000000000000000000000000000000000..5fc9df856865dfafd35f693a72c62e1cff129b56 GIT binary patch literal 87167 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�o=Z`Ao?o%v0WSUNuY(oyNS~H=M^k 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 literal 0 HcmV?d00001 diff --git a/assets/images/text.png b/assets/images/text.png new file mode 100644 index 0000000000000000000000000000000000000000..f83d20c7499a088534aa8184b67748435a785f7c GIT binary patch literal 172889 zcmeFac{o-58b7?vL)%d8GR8Jkl3^P|<|%}1nG-g)DVfVWhay8;D4CTZQ;`rdMyMnt znG%wO3X$=5@1EzJ=Q++fz2~~#-}}#d6dnJas6AGT??ni@IV)2z#6ad9D6_hAK)(X?-Fbn#+(MK@I=H8NR43@Z_WEL7&${Vu${wQYP-NHLU_*A2l)U17`RxyeIkvLr@4szc}SQgrYi0NcxRK zrx97?2&*m|>j{LOAj0Z!@P}SRNc!qce-gx*>sGOiV^u-IwxQFzXf}a{Fx4EsYC$^@#i`*0uh;gr=o-G043f7S0lp*K0at_Xu zJ6P<>y08*sSI(eViO8CHYrN=2#6~SUp=NM!YI5?8R;%(ET&Hp1mVL8jqw%Kmk09BN zmF0Jj-}8owo((-gzWT2D*^>4h_HF{rCF|i2@h3K_c5QDQ=;dzJw5~DXM@?Y&xW}oc zUR@Nu!+k}WaOBCsSKGGl#{|~Nh!8tXf;$3Xp~@>{&{?6-PK`jQW`*+KQ({|cVistmWN)Gv zZrZhBC3#7ix3yWBQJK~@gx$mHNO71lU*z+92l%ao`xFm|H)0(k6W!>AnhmSz<=hz7 zaMT%1e08BT3E?a$tBHFR#*$Y5d4cCD!VU5o&8uzAq&}lW5a*pSu`Y)W&+xsFX%`o3igU$NR@sbzF+g?osyiSURDPthZV=Nk6w>RZKiOk-ZzR7UY)zF0h zA%DQWYn`-7T1khJ*!YDF3h(CK9lg8DaM7^KAimJzbYQ8vq1fq(LYlthBE!4sdb6k5 zPTLnAFNnHpU*Kw>a68C!^9rSDi+0N?mD|{?`<4@RZRlM#EEPTiT<7SDA}@qWv>v+u zd@$f5f9;LU1GO=7cMG$nRm8N!j4SjPuiGh5P26x_P4m*FndZw+SqzFEMJ*h8e}pYh zT)RdDZ+`A>a!RsEkwy`==)`QjWa(UfdS1O+t?7Cwy;8f@Ve`W$?Bichq)(q7JUx<6 zo4;R2PG-4O=c>HTNSsO=L&|(<|XGH=c9%*pNVH4$uJf3eA)6;%g9!q<#T2JThe@xHr)TVRs^F7J^!AwMB|Y*cjA)biP}#;T`PU8h=H zGb|&O(D&Y8e@>gX+dkyFxTf?5*%@^^)tWZxcpB>qUDO~}slS-(lTiKg>Oc4;C0Qb`x* z$736Fi&5{>-|w36XSyN$^sJk2_KW7Fi2VJ9LVE;ck`=Wt>q=e!qQuBwu>b18Z+pED z#?ksVA85Ac7VeSkx%@`OoS#GYn+Cs*AK~-0ItgFiCt`O5rfM!7E=;J?rqdp|C6lo~ z^&Nr=CP)uPeNc&JZ z@1ubk-vB>Vxjo+4uHpHWPU+;LjHA!zo>g=XB^*mz$lRXW)4XS#@bFILNn^nSCLijH zoutcU-F=5>C-zYsjWnVxmaUF{$bY{7RMDJqN@-C2AwQjSp%zV@VNI1J=Vo^q(oRJL z&JGXEojqkDY&uqnTZ>F*liznGx)e3Ul(H}Q4d1ZO6kC*QXT#0m>kkTxT5D{(?Oxf< zd>9qXI76R&H|0YLy$jvo+Xr-GMi1tezpD)ir#$BysttdrQj^;tTV03G?|AY2xPrlL zgC&DC1IhVUBbB&;RhOQ5HvhWs;-CA6&eW}J%6B{-G9)q7>9_00uWPPXtSFRTxjVC( zyng;{iSBv#xpuNwWSdkx^bZGW`uY#Nk~7ece|>cJ1bsW_Xqsw)Z@4 zs=kvmD>P#(9CR{oFJAR89;fQ%ym-L=fUuKt>bF$&Tc=ak&sd*%bn2OW&+AX4ej6u- zI2qE!Wlepx77aQa-_C^fCfa}NzM7tt9vCF_W7uja=b`_!&5JQ72G@m0j9%lf)V5=$ zkJlZ4Vg9Y!>s$HI)L!Fi2J3(!1Gah9cQsI9q;<8gPzSV9M*mvgLoX30N&_3s#T|8xc=l|oGo?dDf;ZFX1vj2ENPXk{!ys$pr)AfRf4PNac z-o=aOKi!0_%|FL+yWrvc6CYa}VZ1Z`Je=YQH!t!ZZ^7*!8OT3R|CihN=kEXd^j?m3 ze@)K6oJ-vEUr)pPIR2N@hiBv-}@c_E-J{=@Zea z(0n>L8%GynQguXDc;`uf&G=vA;Z<>7czHNiS`Y(&L=8klWH6F4;?hUKG%=XJ4f4m4 zJI2rf>$k;u;r^FV{^i)64kH#!E36@!?O!HI@-#J zVQ_ZGY$a_3kKrZ61jTKwMFg!SZL9?)ZAGm`ByB`&Z1Bf^KIFfi{%=F8y4qYIni35C z$I`cTwSnRPX&^E-(l$~ycG41p7+bqzf+8ZvYz3u`iC7EbC8RJCVm6XE5uEiuF7&s- z{_R4iJRHF@;hg_=4DnfP;bP(9FI|FO`>3dG&-T(E|f9!B}{OLp7a2}p`;?k7k{>R$3`R-iBzvcw1TFfBE#U+xq93f1c*}@6-9eLGZ`;e>?rZU&Gr0@A512 z|6{11NB#FfJYDU)ym20QC3~=t|7~slG48*fxbp(C!bE@V?D+q|RCwYp{=b`u|7~6U z|70TmvSb?voQpl)R$llYM*NQt{e$gekl!}V)?cI^EP*A75_z4;riU*of5?{Bzv0P^e2 z-*EjJpB;OD!?gpDUvK_~>(}_~*!vr<9f16L^EX_-#%IUg-*D{!OSn zhSxo@2Tr5lRZ+B!hQ1C0;dc;$2nk0Zer&_vGYG^53Yo z!Ud9c_mCVu1cEvYp`N>&mX@~BrK$xEq4xFlbsM=bpycRyWMgBo`^&p<24z!I7ITk| zgBW}#>f^_cA)h`uDKe5Xl7~Ll$nR}>k$!wUoIxJ_y5x*;!i^gRS&n8OIgTr1QGT-} zRmmTwrfRk}rWL|l#zQ<0W=wM(Kh7r3N{2y`b#!z9oSOQoE9b;nSAR@rjyHyqxiwKR zHC{h*`d#alyMa?2ylHh>-0Uwm{ywbLY!S!}b9;_9%&SuMv^B#zonU zjHgzZ##0KLwnc40A zVxbj-)Y8&=mwK)=)OYbiQ>w(dtm&y~UB~F3KY!kcL0U0i>^xpxQPE_D3F)1YJ%5!tEQBxmWls+YvL)?%t*ioTEam(6 z@3Tru=uDF3rev@vII{67iqruyOXlhcS+RvhI9ysp3$}YXffPbG)y~Wdxj!=A8GD-Jh_Tot_>W%Zmmtt>+ zhO&!_c5wuJQTln65b(AZ{{vGVg#1b0EXuCRU?#~!5bpx z7YFePNl6sPMtyjSE$UfKk|Pv0XHL0&e8~j{BCvl~^~n6`*N67#^CuB+w=sgrg1TE_ zTh^rH^~vw|ARayH+OxQhm1>!QL)6R0&lgs zkk5S0wAH7+LOlZm^254mA;%Z$_C9nOp|uS9ad0?b@%fi&g>4qClP9w)D)y2qQP*>- zVP85`>Y12O3)g)ibsnzXO*G7ihzPfd*kjFYv20BXD=q2XqtfWDYyOoADS30QSw zBqu>qlGVYI{b?*o#uhZ5(=Q^b#)8-m>84QwG+(~9bGF>KX@3VJyLHR0{4}WL<>e4G zH9TLgdTdzbxq)WOt#3>> z0~kq&h)r7~EK}tA$^sR5FiFY%k2k)Z^qIMnf>u!A%+tO}>OJavxV5!a5sTdoo(-ke z^uV#V5vH{CY^`FUfwH+dJMsP`T}P2@$6S7T=RBQTR{eJk?>Y2v`+T@*pOu|Wf*vWUK-X9JOy>Q**>Fm36&jEco@8FJB@SKRgeo*?XuF z{OdUQF_KtyGR~k?u3^t^IYuU?fy2Q(ntNo9AI~l>{(N18ZvT-aEut-a9;#w^W+&Fy z-yaba6CWS-b)sFx+M3%ucypO?@7}$;8I1Uo^eims@pydx=S&R^a2dY7(w~QG_6qFp zI`ZuTxU+j+Gx|g;K(xCvl8+ZZzL`_NX!*RelQgP@gj}hyDV&M~k#+ALW1o}6u=iM? z8-%j(?&)wqmP&(g2_7iC!k1Vs+JL^?i(R)W! zU`iuQDi&6Tj?o-)TL4ebV5K2~OPi&x1rG^;xK2vD(`B@#UFVcO#e>LWz;+ zii5WnGru%ZaVjb)k(dWA_Y)0QLrW{n3gh#7ji;-e=(1P8v@qZnM(e?wy3+;|_k#OU zf*+Hc;S*9)>ALq!1VV7k1^rGwbCm;D!`1G@Fc$jUZdXTaYpd#;3VVi)<+9)i289hq zLSkZf!KnzIxCykJ+yU5XnqE`_hdTM;LvxpK1JcmY5aavJcC}q$izHs|J2N>c$?Den z0?ZAv&O$igTgTyqloTq9vSYmA`8u~K2P}i-oJZ?eT!LvT6 zO3k8vp>f}>RQn9yHVp#rq3E1G8;@&wd4~od$UJ`SRB2f*;BVw$y1%^1ia6nnGsNpuc6nwvaa$;x!U8#@(Bt=myZgTQ_Y+m}uqcDw#-8=HE%?ujq5!r6TM z*?gVH+36Q9(d>V@$psPI*cVJ7ERPy-K0>IKh~u}5vWLDj<`zr$9P z4;9VA965yuAwekby@I=Oy2OYRThvcgXW?q~RKzpr9!(3z?c1d04Ver4?8h%6bu(mr zU-$4x#hr4m9a+&L*vfcJYGe*TPzV3|&`cm%AfN>W>7t{fmARZP%2paiJ$RzI4UCOj9-be{s;OZS6%)htZkPupar*Z=Zm0;`a0S!t;**4X%%HRkcmOnzo0@Zybmlbd2^@Q67zI2uhADERB#?4K$edI?)>pglp z7-ABg1Cw}UIX^S#QAu_-?#kFg_iXG*uv5Uf*rdcL_MzPfXgNQXN+J6}v)b3|BuS|BYO*i~6sS$N>U0l%VtR%sJ;EJ_b`hdNBpzuw}4 zii(Q!>C>m<2Aw%vD$Q(sGY;#a_K^U`Ym|!fl$4O@Kc4;~5uq24rjE&RU{p##Akva$ zxu{9M$TB!OI%W??kGg;6)hw6KjHg7{1lt($p&sbw?@~>zIIOt`LcXS^CSVQe$mN(A z2!h-2?OzvU4lu{6znt+>B=Ex0 zUtw{Wigj|a=5VcDxUPm$>xVn%i{>{MGWJtZX<@DyWItDFHUT%xNPdl1QyFfbEHtF* z{{8zMv&+d@d`{|&mz1#LmvJWG(j6VtVM4d2e`q#TlD|-LJj_Ur<)&69K~TDBdF5S3 zQ-`B3hvYaQ)Uc8S5x9N+Bw9!;fbOc&T371kFLuuo34oVOf1q4Nef@zmRW2iUZb_a` z{SFb<=qjtkr-Fgm*c%F+KOQ}K@+3Qzb6fKgjv3h5%ZBbq>aa%dg;BW$@G8OYwFiK% z68V;JL0MUR;K%GJc9*Jke?-EX+1@+)(pi4gDqf!+=kw75yPKSzR&j9=f=H_bWXwb$ zIrROt%Wl+aSfmo8vMTNkfwv=El_snjBP2Bc35d=MvxcC+V!mjH70%o742c-zUJ}JD zzD`ZTqzHTaiWT$s5?;;9`m$+X4zOe@4j;s*|AHLfks~A}M(afa!1E!P4ijDd>ocxR z5R?$PC*nEYrq^ra_B1}aFbia>dbYH-aqi-_ODr|u{4*}=7qWljXXs(v)Ga*o*nuX@ zBpUYyRc{g80fC!oc_LmRGEs0(S9zF4Sye8d*`E+R1 zm0+aoPYgrro_Qd4_!Nu#vVti;_CLcMb&?y*9z%=FZhlC|}FX{LfTONBA^ zb`qUl40tt@3OhOhi@Me8*8bDsU)-XvHd!^2g*HYPl|K4Z-qzN}4ol6oYUl#l{kVGq zMMsVvje+HI6Cy-uY)s5ih%lMCe2;QhNWiT?dbYY5^m2B2x}P>2P3Mha}65P60#)5;F z6Hm$C{NyD=M4{W=yjAwi^kSj++}p}(pm5EQ@D3-ZrJ0voKZ#~=XIGFB?;?7yGq)kj zfOzG$`23iPv-9UH{}e1L@a^11%XeRWmIS)=<$^1Q=HAx(uN;D~kkvcGUOF(#IpOLZa%UyCGcWyYBRF29k0pFooEBzZlP~xmg@UZ zc-$AVrK;w+i|u5Jb$rn_^4lAWpI28`*^{)ED|t1)b96F1yLF5Kv$s{Rg@#Xei(Yq*UUO3= zOtREskUflaJ;9VBNV37f!F$ewqCV5<-Y?pZwjmUqEfwww>=Nj@OQLudi@jFX??iV^ zwNjd$o>?JC_CZzE%Fx{+st_JFHnxiJCac!Y`(0C_CIb7_cm=Ode!nPM(CWUSAR4Pf zxSdc(f*|ru_@Yb_lHlkZ!kIH?c$(#9yLl|i2Hf(-cG1#87(GwT$H3ijHpau#^Ji*k zSY#AomYVK;?`jU;$7Mg;u4F+b4*7u9aje2&OC#0%B=EM+14~XM0*i4ddeu7*E$z<+E0%^V2_dfQV(=10c30VWPDoD+(GeV7v zXI>F=aB`(fYr*v3O^#hFMmSWOokue=KI-Pp>334Qqp!*EJtIYhwY##rJgscXqvk=w z#<#8kvFn&5M2Q)%NLpEX?6&6} zqas7CJ9}`ZMxQLsXciiH@I`-93GlugbQH{#$fAYom-c|f@hO1$S&Nac8rGoCLEIu% zz2yXH@Ghi5k-$)W=1f894J<`9H3L7m>|vw7Rc2!qa% zEMj&DO#&njpT`=uH^T5JH6=#!^4wgT&cKzCl^{dI{x6F^LIL@cPR`D0;x=tpOTy5X zv@LY=_Xfz1`BGSfDkAm^m>@u|icC#S&1MhtG{~Cdc-C+s=*zjXdP?8~Um$y75PZhC z>Czp8l%b3~vs*B3LOrD`$@hKh6&!t3_{{#|g7%5=GiGLQMUX`*jIGgV>JiKPM}3jF zgAHia$+^qqUW>A2!$7o}L1e6(Ui=|G?HM=p_N{)<+D!frzG%sqoR8F191!WL!&Wm- zjwGxo^7`*qVx)+~9a3VFpw_fCtZfD@|H!am zZ>LDc(;!rD4uG(o7|TS@mVE5 z@N&>DH(Sx0R*>cr(`isOdKQA7iMqxnw7;SbyH2Xunlbg}&6^h>6g7-3DCE+gAn+2s zDm|w>^5DUP+Y;*_+d}r{kQxa>)0ZCsyS=M>oGN3?rJkW71z5f!VKTvs<+k(_ zcXsVVrwcY;m(kpSy9oF`Xs@TIhsX^4KKL>W*|R`kjtt!;T*s)JCPh+YT*jgCB={wyr z2 z)JP0%1b6=Z`|h%cgiV%xuv!j*H&7UwyO>FttcC@MaI0U&i2@qXntU~$j&j?AC!LJx zG4G4@_$UwZe+Wp_%@03Yd$9>@hI>mg86OU$?ZDZyXK!9(UIiZ?f9j^_6OX(f2|sF$ ziZ;v0EyB=1mEC?!rKki3$^jh#0T0*E57U2KMn;C){KNv#gd+bByeA3d%#lqX{H#Ym zQauu#`q@iHY%Os{DCOv#y1D=-h%JyG&eaD`OVQ`#N2m;{U zj7rUEP9_V4E-iU|@sVvv^i~2I(9uCuQMn<+_Z zHMhE_4|}tTgy2mb92`O*)e1^F5uIZopDFCTdv|<$?!%!ur}%aZ~_sbVk~E zw-2V6fBOOE_Jz0IeN*&9jL@S30SSra%SJ_0YksB97=uEC5cJdFshY$Fkwb?lK{FSZ zkO&=`qi2gNG2lNA=}I&mWlQWhQWyy51qRtKjrL%lt*ZNIDIPp{&$Os>l5~F#rZ`O#vB`}91bVjRlfH6_3Nd)yu3FWNynkiCEOW@C{a9r9?{&aTmZ_1 z;o~GZ9bl2e!K9Hm+}XWSaf_ht2hK6E2y|&lcQ2}p#&O9A(|Tf7t6-NBhg=)Zo-s6(=y8@j{3AeKPN$b2*+O1vHm9SZ@e%Up zq8A+7aJAXYXEM24DQ@H#?!46~-66m6n#a@nIDf zCrE^+VGimBW+f7MS;U!#XYW}xtsOa?$DVvYj#tx4oOK)yCra#5kCfnB zw#R8JmlI~JEq&DDS|I?|mD&?#wvS#1scWJwHhiKzzNII3dQ@}I*u(Q|kiK)oPZK%V zlij2|*g}K160ABupxkIQ2Kiq@0QeH3bwFX1sJTK#=FS$VmWQ{1dx&|@4@*CB5T{@C ztEUl4DXJP^ok_nDB##i#=}kyXB#U7ZjszJqP$M;sY8x{FNM!}3JdFE$Ranf^ zBeiL8AZNfAlC&e7_Ln0+u2AY7(n%#ZE7{Kxyy1=rNyyG6Qx$@@#*da(=d{>WkRU=j zY{MX+h>W;Y<(HUN*zFHPSNLRf-y3x90sZ5X#MWus7&JBH$IsHF_tJC7QbUm0UbK>C zq$XCpOdIKU@`k@F0cRnKQvD6R^aI6)JFS zZe4;^2%TQs1uIPgITm#$0~i$*8!M~2>u8;?2e|OmLFYIuAIjOx%xoQ>a`qzT;6eO0 zL=H|{<`3d>+L9dnNm_dRN!w!A*r6=iWQ9PsWR;fEOU3O9?RxBGnAtsWTaRz++sEAa zxcSeYpS^_;yZZL+Tk*t>$&RkBqURkQjv0W#Cbj#H8pc>_NixgAD5G9$=uLE!~jw|9(XFl#vzO z$Ga5Epiod&L91=(kOFcJWnxIv!u%KNnfQ+$Rm$y2qd1Nh0$tVpntAcS?8s5$(f~V% zCkth!6_mwBvqwf5p(Hx)CSGG+dZ=QsuJ+!&FAIrg6(YOcBk2#Ay$quZ2(Ax%0? zd3H!FUpP>!GxGM$Jel%1u;L@z9^UkhGHwEbC^b1LB=L}kg_@PfPqFZ7Hg_Z*&aSIt zx9iTJ12S;Wrk!3YXk*p&Q1AA@l0baBn8OVQV?Gq{YC7h~gD3oYA%Tyv@SREuPJM3o zI46gjFzU7^66YTvZ@FA-TA@BUH8t{WZMMv^H_&7g;?8JB4H@(hc*%@pUHa15sfb}_ zr|sTMqG`FeXklPASdRY!)g@3;R48zO0wH^a0+`ID;bHSH>zhO(4P^8fOD21q|8l=E zvtbz0!{(f8Vw!F~H^Cq1d&bIsA@fy3PfyR=i_=PslP5F@^u+pMZajya z-}GI>q7Sv^LMr6*mpWTJ6W&($I7+` ze-67+VtP8A)}8Wh+Cjc(Wg{bqg7**t`%gYS(t^=`$`hNzXT`jK4dfj?6a_2@xA(0y zXlicM6j4h8w+#<1PJSc!V6FyK@Ocj&gqqKKP3Y9OZyp%d*xW~t9+h*~K;lyG3;E)i zy?ge2rlFzHv$W*Il2)RrkzM5=={-1x^wYCY~h4V@$T$m1{*o8!?ZHD9&Se6=#00Nhzqh$`-J73<~ zmWjz>UgL=>?n>${x_dXPOz#EU#@KNRQj!~@c-p!z&AW)Eql97J7>V88f&qKcGd8Az zC&tnFiCTX5kp)Aad>ESTW_d@S#;9l?FxITBEHwEyzvEZ8Qv6f9#!B=H74v)3@3-j! z1Lu1cndhjXp+S8XM3tr)udqR9N=V!#ZwZno*FJg#i(0R!pDRO)z-wz~N2p!?LKtA$`CXfLY`x({a4{Iv=wCWZeQLt=`D15VpYjP5zkU3c7-*e zucxGBeyi0lB+uZ;Mgr7pG5z6YI-s>58xU*B`_tJnkg*o@Sc=7#@bcu8OpWPIjE>4n4(xL!k z(9Q4NP0n?3;cTmecsYB!h#bo&#?9~0;lPZftOt#&tGqz#&bOyw9|ztn@J~^paKFlb`J;?0Tc3k+=dh z^%beOle>!rjZI8^pc9~Keyo8Lf)51HEWS@D8|UEZ;pxTDmT@Ujuxg%@DMAuZbnc#7 zSqGU-NmrL1@lmk#2g6@jJB#k!iBkbXiT zDQ52TXJl=%R9p;5Glv9eP_z*Oz4zz2tuJ@jg198H?Qf}4qg-oIX1pjH&x)i3{2oy) z9)L`~$H4&bWJfeQh||(Wgl&~PzQwBvYm+vrC6o+tPap;)$;=TKPVqbrBqgz<$)#cQ zyI$<&F}AO=4B!f1_4YzTM5NFlWIVCFYj1z}rTAu%e**ph_O%Tb zrFK=_CS=+-2(w1oN7fg&iV>*ezyPGmRbO6%Ir?SvH0$JLZe1%OK2vn67 zL7ej|>m+K}gYE9SCD?Vfv_6Tm#vXver>GSvm?e-MsBtQx)IiI&e_#UYJJf@R<|t#H zG=rbex+5w+1N7{5nI*$em1`8V4OLhmeYv4U3JuRSwm=0(^J>yX;(C}PSwPoJ1Z`Fy zY(s-wsrCE!i)~Jol6ok76Xux`<0UF3#_k^mk2MLr?(D`k%z5gJs!{061iY!5qvMQ8 zta^Bbz)?_^5_pf??RUx?TPSPCJc~kWFt%V6lo(y2bB3pT&p_1!d>pT)K69knxReVh zfT>VY6o}42a>PeDIXZr&APv2!#Q2O{$;X}j*lE;MuY-8P&6_kAE?fxDVDbbVy5;?o z7$68sMU7qW(qSf`HW{5GgKUAux(ky)Sod^wcD};%T;hv1Iej{DY|5kZB*FFx=Bhfj z?-b)D;EndTm2;{N*B@VCXmTIEG$9o_QT=9C{t}uRC;%to-ll05P1r|IAy~rf?YqO! z52WHwhoQ4z;nk0Y;%60v`}_?FIB39HHew0j>MZj0jl_3I_{(wC|W2riW>WSe9^H`={`%YgyD>MUTR>|%CT{h)EnDQ+SGGjYOPD8;DIAP>~{@AHlV)TGf9 zQYRTNF(IloK9C{MJUnEw91H-V8v8+LA0$@ZfFkY=5LN(>@agqyBX#=qSZLFD@j@38 zr0{3Yv_W9QdB%cB0QL&S=7U{{5P6g#UPA$$Q5Z5rc(C#^&o^hE4+7@LH3B&1u4_+BJey1Sb^TLigC;B^Gsh`pZg)t~~_gU!~v0g-Y~Omws; z2)BHQkhnPdhfp%FI-CBvOPzQujGb+PUd2yn%^`8<%2*h$_xki+--O3ud_d8Tx7rB&|1b8^f4 z?CrVGa8Q_=%VP(jwh$gp1R{lc?lmW{T4n5m>@)Ti*?dm%FB^fIEc>?6gdqsL(DQjf zi4oO;;p<)`)KvksgE8WB_%hk|3mb1NNE~wtLxTpyV91~J{)ULnQ=rClUFGApGSCrN zqMoaHh+6qmcs{*GUevV~+p4(Y6IcTZ#3W?p#I(F*Y+<@~<&#s0FbuStK(z-O)-|OCf@w6E;=}ChCRzkga$oAOd$7Eal;KwQO{_quzvsPR z@v*1`_huzIIhj8p-%0(gBJnwStn8h_p0zVw)56{sG@2P3gK|H2N5{ zEhuuo=(piraW}7a zuEXS8KYE_MT>@fGTFJNFAMRNPHCRrptRJorsJ)a^@B>t90tW>qgc4 zY%xGur}vCw>L?PSgFt(2&z#1@ z$(1_0J<8BIe1~3&*I&Zj z@JYsh%_w1b)c($z*^Z&B{GdSBxB8^2t=GHMu-9?S!?VkAw#;@M-HW}d*tDxT4$rnW z*KylhoB1P&$;oyfq+Hl^de?n2##FJ_Yy1N#Hv;*hbAVL=7|D4vUy&_Wfeu9L7p6gr z*={IJ8?X2WdwD&Gn*OmT89%!jv>nghK6e7!7nrx{aVTn63noPbnb=ic41^WvE&klO zS+~@@b&8|x?c-Do9PGy~eCj)so0~f)&_$?UJ+==?`CMFQfh44bjKvrfUkJuf8IN7M z`Uz@Cmqu-*_CC#bG;_o-zXbJ-k%6f9XlKZ>xKxi*^6~Q%TQ1dknQZUaLt~p2h8eux z({I$v>znt*b%bqAC7Ig4DlT|F#as=~o7p7r9zcY6Mh~hok^{|5&zpIIY*D?EbD5iZ zkG>)a!Xee=z3&ziO6^v22MbCK8#kd>HgHR=cZof2B2VqaiBpypb~@jn$NGhXRU&WU zwTWtv)I4vB@TNJ0UT^((Yfc+=={PnB@8*#>FXl)Z=17WXc8lUrihnI=X=s?l&c^1C z*VTRTX7rqJG&esr>8V~X(CBIrjTaw&1KOH6w$P9;QQbwM^faH(sSgz3`|xz%eG`?l z8P%||uu$)Vl9`$}(=t+b@*{%-#A0!sOwCLspNvx=!76mJ^~6`2 zPKY#&m1R4w(S|p?^rr3zovv&Gaa>v*Cq{(2(ZNp1<&#OK2}SF3hZi{Yv;h9Be!YS=zOt`z;KDMU(dl!KZaEhIz_Jc`&-3AeIROWNg8dJaaINluoXtxf*eqH&Za%1bhUWB(Q4nf$getzfI=>q%9lV3(*&om$+znm14WiH!bTC%EV%^zh#NVt95<%wJ zw$GO?T{;Jy#{q*mYB2=IR3i*B7qpR1jk>a+hD@LwtfSDp@$kaz>l&gC<^xZuaQNWC zdc5SVqg1`D#r;l7gxiCVj|CQ&mI}2`FFHcURUT)aO7ivV+Gh8ypUfUPa-_=Ad*lKq z=vI|L`pO5L!}T3hvh^B4%B6!csr>`SO&75QTxKD{@uGD5;qTUt6l4=)l-m}N|Vbx}XM ztZy3u!ifd3>HG1gWk2sF0~7VD%p{A`-3n@$4kNF0U1Ddl*jUi|+z==(y8`7i>x??L zCIg@GWKh-(Eq-?Iy16DoY|zWQ!n$ z7R>G^^D^nWKnZ%5Kp#Cd2xVRFJNknGpb-byVVLDVIW8wnr{ZqtQJ=43>Vo$EGP4?w zsTR;O%uvubht))>wJxj_J({jl;Nc4T{O0}!Bvj+zChJRHmPetFA7Af;cP88)>lb=` z$NS90D0KZ$xR!wt>smOL51F35f)nj6X^_ycl&OQT?lXS)_o;5VjaWvZv$7FQ<_rK^2bm;iWxWs|Hh{8jJib^oGy z&_{5SPp@I@p53_T=fU7sqKsYo1|^GaVR%&uD4$;acaE@}0_da+1V>S;hYB=6J^5}? zUbj-~7M;TZLGIDxni}bc`OYcJiGXV+5xC4`UPp#7G}L&(EWzn$vc`Vsfj39|p%kVL z4Hs?E*Fht6r;loZz7c5;C>|Xn>RxoUBadquDr4f}Bq7_8lY&|l9-8K+SJow(tP-Tc zRY;^SetuJMI5R-Be|m95#{c{0stYnBZ1hpNr;3SMGEh|z?Udk6tcBUsUA`IHPp$74 zm?R%ue_8Yr8tnu!p$O3(yg6&h2_4Y~JVYcwJkHkpXp&t2ei>Zh8|(W}w`3H(u@)e| zuiYJo_k$k9g0;0ZcIcbGJ_BpBu&^)~-jC{)t+#Lm9wE-+mdEj&SMxn(I8HilVn7bw zRg-3KpV>9kt2Qk}b=|{k(-&9vu*CHppPU3Y(-**wz+1EF<^NdZC@gwsUUCvDv<>f%GE1?(g z929lm5Q?CbR}C*eu|VmdokA%jHI>z*+?EFF8&Hudw~B-}ghKnBK$;pSzKgN6w4^6d z^Eev$^oI;&TA)v_o|~kYr^?>;HM)^FP;hI_K>z{GM@t@B6cEo;GnfL8dvJ933@| zN=r|dm6yNH*zG%KTtdtRfbcFCn`8~(N!H0Xj=eAMw_J}Jv-7IpIno{NdF`aT_74K$LbyBN)L6Y_tdH{pD&hwa6SbW2 zuCBE_X=GG?)u@n=-zThUqcuqL++uyO?p`m1qz`7;kK!d=J z0TR{oD;UYken)#kd(ya9w!QbqGI@b?1T(Q!+tuvc2%G7vq$TlI#n>?r`Z3mZ(=E=XPOjN zB_1t+o`i!3+9|@?0_PK?;R0&sy8qpVKQgIf2X06=2e(5qdk_ZYz{n=+Z?5uEDP3hK zjl2~j9vyMNfB)W6=5$MrZ&?WpW&1kicr6Zo9tpH0uzs;5`frTai+DI|# zFx=058Zm6Ug6cUKD0jfu1N_xz{$ue31RxT1rKO(AQ@y5%>S#*wTJw^qd9o#~ezc9{ zRa}0<9ehYwcm(J+!P ztX5U7UXA6@Oc z44B&piWl31g8{HB(U6Dnk%;A6*8f!`Q}Ke}VZ#&cI0Hvy>iAU{ovww z`sFXch?anI%MXA^B4)x6;6MJ~Ljmm;_mN3xPUe(3mD9WaTA3!=m?lzA95@U8($|;f zBK*32<~@rib#-^(nOE@Jp%o9#SbiSOSnUefwuG*Wp6klP!dE)>?Iv*`;e@lG{ygj| z8i!4aK1o1oe~+po?eLzx>U-fS+jk;{&GauugmL5Z=M~02yQxV=;<)=ZH+Oq`$kVPA z=@WRxa)^2LQcc>~OXzP-d6OxU=7A_OhjJFAO4xT>R19A& zgMkcAB{Xf}HRqwMWuR0SXmy5jvdF%Noe%;m=e(<@I|0= z_=I{qNXYK{h+pWEvwIv9AX&TskYr-s`+r22)Ivx-Ude*#=d3>bc~RY0;lJil)G zZzK4hPapAs{sK=;MC3j#PODFa7!h=@E>dGcz-8&~Z1S z7okE?R%8+;aU-s^>w*G%tOuOSOrUM2U!>1-Unm@d%N@4AKV?zrpjzJIZD!mf;B(G9 z8plAN$jfh8!Ry_2@jSc04`qa>LRbJVkZ>^|N9PpTv{Tc!V`98JUI9RV^X5$mAjZg$ zI)Ny7F-b3$`t_gSxVriVzj%#WJvXqmeT1WX=?l6zyPPLat{5=9Kr8Am7)AMF^3E++ z=)`yee=oHLiyS(1&J4$+b5YL|fhc`Q&w)qAHLTQFe|T;x>Li&QCf`GaI}O4(6LuKr z+f|+zwykl$b7PzCAs0RYeo`D2<`^@zjc`ZAjt&TM4Rf!fA-Gn<{nR*bI3VKrnuOld zQJ2`Qxze7$_n{7qyLazBbS3B|WMU#I2i`#acOsUsc>sxp%p!siQK_nK2d4@vh6*iV zpJ!`LvoZPNSC_y^v7dz6n!)K39Id5^qLzOR3=IvhT51RNuy@-hmloD-Ij%zZ(3CBM z(iF1rhLlW&aAU$WK!x#Tc-}Y|($9f`{(gCLP&7xFXBWMWEy3_`DqZpF*1?1}udI@i zclcK@GGQduT-yxXFVn+7K_+ROcQ3x7#C%aL_jJU;?HAHi3kPUCtIP*3!%RI0sIQcK z0?-%o6E3+B|K+3=8}sNmEE>xuTT+wL_-*4Cp-Ffp*7@Mo5#{?uCqg+Zl{p`FwzciO zb?cU>NwxQU1~hX_K3A^fc6-d1%?=b=;_Q6kyY$7r-*L?#qlX{d6`ty=uy{xZ!2{}p zJJ_7jwSt&{tH0KDA^!kmy&uxA@u{z0LE7FBc=mX>=o)3H*iv3$o&V%5(K?eOCIN(8 zY>@HR)SjrU@|#&QoJGPJ0|f;ID>;4VP`m&K%g;vwQ3Ch0l}H?#z7>6UdDJ~a z^6;z(%shrZE|tsF-Q>-OVw3+Cn4g zfv@Ef%BlRQmlow^<|vdw8yI7BWrjENpFPv|1FNkELszN}v9`+#wnX z%1Yvzow#aHDE@rQuRuj~BdEs>HpQ@R-Q}dXG@4649gPC?_F}2JR{V9q3I+Dtga?_q z2dr>dHv`#Yavdt0iRITzPgO9}cs1gpe1;A^qO45vV{L$s<~9&q(DtOtxNj%2 z5eSGL{K-DyTWFdmkR*`2G-#i3UP3d4a~4?&ff%2}r=Z6q{CfTYTGh8`Qje^==uMQN zZBg?1^y*s8N|!Gln?4-*e+R%6*h4x3&YE(S(M=&>CGGRuOXea2mm_I7>PqwT=TlP} zc7=x2!dw(P=v@9yQ}xKNM{{$|gkw1b#!pqwDH}mhRF_~trYU>zV${^qGI;FkgX~Kt z@W2s30)&dX@JfMsiORgRAI8;Bqdw!|;A#OHljIvy2}F^TsW?1;_N@Io4H=qkNoi@C z`sMaR(J<1CrL!M4eG5b_tvu+OvhuV?)j>KF5U*v!^G$?xnHO;G;-AlJ{+ae%S?nQf z0f1cS5N^Tlz1!Bt=2+`(mOjoL5u!&&L8NAtqE0>h!VgChz&*vw zx{OqUeKUdFOwY^PTNNKhfTzt$%t89{P}wSS9yZTtKgPu14Z#8tkdm&Yt$pnK#;!)9gQ z?u@$7yof6vo`1Dca}kKfSxA6M57k-}dKYb|*xK5DSQxD~LaFXzk3AuB@evh(zm==( zV$>76LTT;7_V=t1H5DSo<}idzKruS-;e)pxCxiYdo3=r4sQqD;$uf3Kgp2?an3X-15){lmCL$6;wG;lD?NH$u=UwTCIG2M>=b+ptrOXhnOw^JWSAYLpvgD?q`*w-sN|pI1 zJc-HGf4@d#2_#Nb-jQf^sR%R7ZB{ps#8H+pt-ugJ6Us^GRSa`E5f^fy@~qIkPaD7X zAz$Vep-&6O?Z3Ywo(LVk9xTv75C&Ky_#g!~gZ%f7dgA46^JQB@8>8wMmVh(0z+Dhj ziS&lcVz1Ybeq)((_ijH3Wb#g>ABgfn;kt;vgpH)s&>6KWs^u2bA(Bsp6rqw{=UScw zG4O-?&aAV=HMpP-)Eod{17x+@Hv<6F03ulwiRGzxnI^yR`BOwi25Y6u!}s57o(7taK}2UDhoCFy*-iKdby{QA%z++sss$k02$n= z4$}{_YqCd=9&Or5vcBeBtw7UMvke z;GsD9w+o2t7V3J<*TCnyqq4pb127aTf_Qe1A16gMid?VNezM=v$jEc8FqeU#JEH(( z9O&rjQBvuX!~qJ|GLjsQ{EYwfd*2%wCpz`LWoGjs?`+YC-J0-~i?OUrX6{};3;eNYGUaXJaBLiFw1)Iz!3ivCy6rc^|25}NX0&?^m!ShR-djc zW>X3Z4DEH$LHlsDc6@ZcO>QC(2FYlA=e^;S_V)H1_2{I9a48^h#cx9H22(|RBcRV8 zuG6Ffq$GEE+Mb>kipdf{8-)fGwZU_$&wf`r4#(?5g(#B5MDC8qT#1p1$ub~&yL^~B z?$_qgP)=g_?1nue%RU^%0zVPu`AzGWj(*%H8wWxuAMI*9%I!xV8NhHlx4p!b-xz!&`AUq z56td9aG`2PKj$om#{mjhrmQ(NCK?XPPMutM`0hOGg*mvblFs%p=_lsq=O5lIs9x9t z-}QqAK^5a?^z}K{n-2;^!9{lU!_#lx`zLF0!#1cH^%G}aK!5wmd7+6P!f`x8{6RlI zN3LHR(d?5X$P`N($^Cu6g9C)_eV5RRZ+v|REthxo0mWZ)5-^a!_ei+zrJO&CIs6fw z`l1n5`x9Nh5U|Q01RF+?Z#+CUOlKpNqIc*g7%BS86~nf{^T$2Dz0KT(^W7F941dR3 z?)q;8&F;ELrlMc_cWZXz{lGvD&HDX=OGRo{Pp{!F8*S14r@ywsKoC5Nw&=HIK*8+n zY$;})zH>~%CU5uA)Azk85r!Okb90mM1XZcuA70#890gerh8_Id zhhLsk-u9~A)57jJGclGZY({E7**ZoS5}GA|NCHU8UdJ4u!axeOe89PU zUO3Q;N=iIbc&spA%2vaUHTc=BpPFY8icSc~(;TEy`nXvtPUYm`)J<|?$6dvU^Q^nO zn+45*>2$!=DalwDMSAy!o(A@?&e@m$z@atmgM#-g;5XLbXz@9mPz$9!iUH$r4P+$v z9YR(K48tp(5=93GUms?-BX%AaB$`IBt?YZ~USvGrKI<>YnK^-+@-~Zof|_ z_92W3kEay^4IUvv&2s+RH_hKiU%wq2V{cjcy&LGs@%YEj(tkt8hR*=G@=YV^AqYf) z>mb8tr4AjRie9wbIkr&N|H2&10|Nv9C^I!KZX81L$gf!VJbKYK55gz%PmquAt36w* z+%J7YRqDiPKYT#~J-l+I0RkWhDjQ+_I?lV=b0#EJbc&#E{ySb!F25hxb0Xn)G%$0- z?*Jr7jn``zqgH(T1KKh!e*RW%TC$E3VY|}7tiy~QA+Os@g#FO?R^bi?U>;s#*Vsce zggR-*_WAq2zNgI#tMrLNgf_IG_%An|8U1tE0T}Fm`30>LyQW0Fr_a)phB%Y*1Gq8RBQ^scDO<4A08x1F{|$(EW}> zu9-r8WNIY&_U+q7>-P~d0RD*QDq1F%xEOTIYxrb*GHKl$p$!i!rcLLmgl}b007T%1 z@~Tm20rRfQ3=a1TJ`I&fE0r2Iv(q`P-r$2?DG3zQ6x5yF*+ZtcH_>uWbPke-LDMuo?V+%n;YH zW69R0<@w-mXh^z;S?0cK^(!mOsvBVF-$uZDm*RHYCyT~Rgu)QE6JS&Jd&g**)i&^n z(DKQ3&8}%cz~c*8KoaH1Mjm~A`+!_|L0w(lADrCRAyb0u4<<_R zjhE0}F=gaNdAl|>L#>!6apcG|MBC{(NbYwH2na9(H0l=FwAaYMK>WK-X7h3dB8|31 zSi{U9H#|H%`eQNc`n1u5MIx&R?##i^Uxm&K1A+j>64fi4{esS~ZK zqNL4;lnWGZbyxFo`Tp?G2>R{-5MXV1OzlLHIs_LVfModAeRy}8LPFd1132Y~f}vId zrmI~d`0sCUVFI2yI=A5?a&VS9=M4II3tyT4MOm4?m|8vS@~=PN+uPgYrcWx#qq08* z5GxP-?3M+vOmCPj2ZcKpAWj!Z=qUvxk7K0aZXsO8lLxb&b5i7w8t^u6nx&*4Isc#i z7^ouKGb1&F)8@Dg9Nq{lIcoUmd{9u3y@rOy6_}p)B4J?h`*-bUxw$M?P!?{YXS0rG zfh-f9BNYM!VtP_#OWQC0`j@sH*9?h;L|dAb34{e2>J@nJ`=W`Tm8{!I+N5PNW+g@EO^LGe`dNsm_a@LtuXc?BQ0`|9LdR`c6v9aQ11T ztHyap$B@X_ojv0t1C;RkO?rM+TiXdiN<-YvRcLA19UL9oW4y*u8Eso*E)yJ(c;Ue8 zAJlrY!pbj{XZ-zN7JzD+!p|{*@$C`!fs|1fX%`#}gW#^)@fPesNCd_k5H^#4Aft}> zigYngVsd2eV6reXJ9ZI5jv;(XeJaWHX(D+53TD5k%;QMxME0Da0=r&wq6vltA=sHd z!Pj&e0{e7BlgFY(a1vYLwmnKoPHtq3W|8xr>xJ9$B_S9s;8=tJ3?rBf`Ku7F{V%`S}lOo1OOc`4eX=@AKH;5M`>hX-hNmW(a z<_AehKF^;%bug1z3~&1U_J@21dMn@ju8S+{ry~I7z{#_=BXMs$&wE$E7;0xm?YmP= zQ!&*!mkwfVBtns3Q-SO^-PFu%KjT{_28MowY6R&SoL<7&n4EJeZ3u~d`()5K)Id&p z>GI{Hi2d?tMu_N%hXTiPD=U4=%$tRnsf8d3D0uHk1Qj0nB$$i1Es|G$Yl=6rJ~pld z!c72L%4|<=^0k$i`6}p|Q#2L!$bpF1$HX*lXkzjc&UdOQ&MicfIm+>9(b08>#9A}+@bDBN zHe&9)p8}m2`_0cn;^J`_`P$PdogRC^sZIrMMHDFG9dm{wqM|go;nz5Cyk+_J{rmp+ zD6mXg=fikUCORj>p6in(z<%JU<6Q-A?xqFr>U$6fyvEDXlG61xF3H0GQg+WYYZZ<| zDvU$^LDP%f_y5&nEaHkInSx<4ZbF7=zmCwVf7gwAHqGg#lj(L3>(xi+;SWmKj=l!KCCr-3B)YQ~`z%bL#$HU_bqAE)(z7y~FehYnl zu|AgyOG8V`anXM>-@hLrX0RGiZqeWaUnoQmp)HHp&C2+N10D*zy32qnT#>s&N(l=a z8zf_MjxUCE`^tu9yrA(;RPjvxf-tm_fp2f%F#WJFTp_ANcgV%^w7I!_4W12ORn^9K z%gf8IvN69-A-oNqK3xEDzv%o0q9T@=@#AiTJpst`!;Qw{v}Cv!^BRwe%bz@HNli;T z4-0q7bxutU_@vD6$Fv`JW)&BUi_6K$O=YLJP@XYHVjbI_6Pgd#1%&AD^0W;gD|2#E z@^wqg`xENw^R*aMwK4c7z5}InE_iE(zv?4Rkua-}nI}SE?V=Hv^#O6aUVg|QGkMti z?j4;Tt(uv?|FJjk7f^oz@#C9vN>D=F!^fv#U}>p@AB@+I#8W7mL+S5z7^>odKtb<( zQB+j4M;54TwsGEpZub$*TP;T%KDZ$F4Cg3kfbYxUb9;4lb?KEhCli#^%zOp7xgYgS zube>u=lrbFzs;UuU_}Q&+oi3<$Ss5rXm~M3{~Fi2&5J>}f=^mwIeKCxM;t)c7_F?V zOrHlOzY|%B7)@~XX(`AMIQ;NZG8(|iI6R8h5Ffmc4X4d3EYuSe7MASFP*S>kvaj^j z*`AfXOiVd=Ahg*zC0g_H@*;aOlq{7ly?bo5dM)aRMqz8O_3X$&p~jvJx2%3OXVaaN)@D}KAbT%eNYDu zdj#C)Uhit8OrJanfT2TBkOuk>I6@Cc9fXDxU1H`9vZ$=>4OVY=ljMjI5gy9Gz-xP^ z^8iHr{#?EA(rFx2(n)mWB8cXA=D)DA`3mX9m}abD1D7yO{9^>k3L8?`q%QQ&d#6CX z=z-pw9S*rehp6zt!Zb(&9X0{?%|L>q^`BX67k$+iI2%a>Se4~ur1w3Cp@m=tgynKAg$cW4lr6CXHG<0@;eigl*+&yhO{elldVRm5+Bp^4~h*_~fnO5yP zjRSO;Qc6nyJ}ysnWLQEazX3BbAYOE6Xo2O~_3n+j6z)f?Q^kO}XBT@;-{x;(P(c9B zYghOW+CiUvUq;4tt+Y)uMGnLlQCY9h_K!#%Hq_SDJ!*gPqSVRw)6@9K2$}?rEAj+` z_uWw!rRlex5Ck$KDdG%hHQB?5^V>hWIY4lB1I_#@#CbQO@1doiAh9y>@L1+bv^!4T ziWWc>-L-=S2(H_}9g1Wl==o0xU&Tz6zCEM~vefH9MDe|Vf1#ny=|dU{Sx6excRZ3( zQZdjfp9IN1EiEN=QILU>T;)!wwwSsB1E#uDvwY%e)2B2Zi31+_aV)}m|L>q+gk8o1 z!|_D>=8Z(e_9|~5SZmrlJ5l1Aqizsg!Z-+W_L(AkIOu8Ir4xF z8HbGbwADAh=9cJiNV|;G-M@c-0{KcWGy+da$P8#%cBnq3B zRORK(a;HykSTlcBrk#|Oj)1BeCvfAT!kX}5}HPl{`|BKIl(Shktg-<9b}D+Gd=;eW5Ow2*oUS~S`b`T}-7>1N$f9*W-dIwcrog9j&; zV2**ZRr~Z{faMet(l*w&f-2Jw1wEL+t3*(Yk{c+ZTg9jeS%hUpb&li9;du+XUHY%Z zbimw~k0Tp@F$mL)E7CnPknncq*cBNzs~2Wrh{StB9+tU^+2r3(v~EF{(a)Z}p5nw3 zQeIXz32SsXP|;_ng$OrBNy!oDm(W{Mb12q4hbhV!I95I7jwUhSxM#CFrc?o82m}Ws z@*ic%XxRzT>XCA6G20}<7HI!T-fA&~n!F|G)saRqop^yL>u7R;s3^?*c6j~DJlS^c zi6m9roTNuK1=LHN6!AkJK9oN__jd2++u}m^qUt7M$C$kavV;*X1%zqyp>i3n0>HWo_TV#$ z`2}u@?XcZKqAvleE)AmiDY+hiuP%t(kxJRU<#+)Jr8tgpE8pTLazZ@DJjB;?$N)%; zT!}zx!&7{K3wUT0*jm?|W1G1tJOUB6-GTn41d<~l=8!keTKawt=O?HAuP8FZ7g8|J-f1laCP`qGdmk8M0ON!`S|%cQqbu4 zYQFM7)W&NZA(H!4?p#%!HY+MML zm>lGtQk1eA0z+qw${L34ZrHMm26tfId*_JD#!H+ofu3M>M0_WrrCshrp*ql)qgRNB z6HN@#vXz~j@`!R4xP(UNCwShYuxd0|iB%G+r*lx?)mDSs=ek`yHyO3>&{+MaP^xvP zbk2yn9*MHP4?5>;Se8JSI~(v@##_7>ikifzD@=s_KKoZa5)cBaxjdQi@Aq_0jm08g zmG3u}x&yRigI8cltNZbDBDNm!yGee04=_n!(*RG^=z@4qef`k%O0kDihUV^)xHnno zPYNLTUr57Sur+~d-yDd)4e~?*PV$`coH-m?t|7_B|doYGm=Nl~=-(kG915wO}7!RABUV_*!Kj_O%{sk>P zy$S<{GjeZV+~M9&7y*p3`XauKz}pD9zb{6s)ec=%7~w+l$la8*Kvx8<9fgAx+-(B9>@p=$qQjofn}`Avzl+K1=L zoOhfnh9L*+dv8?F=AaPzcRd*m1$szmbtpnl*Mjzw#@Yjh$fitmTPhLO3<#TQOuzw? zGHm$~qT=5eF8_0HWY}G}Ah~+#{De#lB&OvcpQI5~iisaGzE8*iLw=4BlTjKW>ZEUz zAIAm@*Ku5$!rzGX$$9bM-oFD#HY9l~iG!g6;KDKyu@5-akR`(8TPvIgOM(D05;2LAx?z1Y*LQLRz9l1} zA+*mvki5@VJ#PHOt#SL?rOyRKeQV-r;QA36^ zW9Q=L$Q7{FLUZ#@Eoqnvh<2Nag zt62dY+5z%SOYQw#3|ZCCQoQ!r_USzOfL@87eSzWP8nkXKvA@O>~OCy}L9iq1LIATA*g4*hifDB|ufT3=LKx!fwa9271>2Do4p zN2{^jV_P}oCPFYgtpKj5L-DG_10Y>dUS0=*bbD9>rvmNYzFPbJa5E#Kz;XhK?PruP zOPwQrh?S{g!p(v_n@@zs2#_vbYdPM43|wVC@4Yo9He7?al8khG%4B;0{!v$m>NGJBb=H=M0||0wVJ{zg~-J_=OW%j43BZG zk4}f@T=J*yS&>5sRC{f10OLm}O_|h-57Sb3VGzKSkR|X8+R-0-Q_t0FJi3GrxrP|g z8Q$1Q@2F7x6hN#1#QcB{B*Hhj*MZIG+&R{A{YOa9@bvH~-wLd|jQE3&lDB=cf{TOf zY4ksFen6mK0c!+`x{G>n&2vl!47z=Cq}Pew1@anJHR`!6oLG%Sb{nB^F^Gv<4w4W`(=Zhgq9 z2TmKc{(4DTisof`jwr)~N6rq(d%A83L_r#6y{!Yvo^|Z=u?z}Q1hw9PTYr3pPGP*) zh#j6Hjr3^_TT^2-+UqP7CW+@BXc#(K-yqlEOSqXX?KqPOJ03`oc?HEf! zlOdx*t9RDeIQ@+7gB?_i&H;Fo7e`+>optI7s-Ug3K=EC?J_huD|lKc_Y?{OqP z$eszZJBE-H9f|WDFl0vtH;Wf^Zfjdz3pxZCqfNiP_or?p-;7wiMRj zc5I;Q@+{Cm>)R$qT^0QAZ-)zH2C0Zuv-tzgbo`Q|qsNAYTPWuzVzUa)Y9>4ks(vxk zs)(&sOplLWu0Zeh`=FMg=C(wISBULJ;yDv5YxN@BQojeMJkHO1R5gAjJD30ACm~6W zZS8w&`xlE*(#jiP`B1s1eMN#qErDky1}gfQCEq}J$}0D-h1 zVg(Nr?o9Y649A#|g!pytyGha&QIp)~(K6ASf(jK!;hxKZ@jQ4)vwgh1HSTiXiHqwc z&b<2c#6)kfg2kdw&i&l@S2jI8?fMhHA4fc`;TZHwyRTKFL;mz1dRD!I1R6h8EP8Tz zT=f!uB_!*ZsrQvNO)SBopX2uiKLiToyf%tmU>u&J|)Qq&DX=QadxZ(YNPY79=TNjWf588)HH%IV-<&= zbz?BF#XxL>oC)=Gs*2$Q&u$NQdELR-T8tb%OFbGD+TQ@7W55`8n3|hYLlpsc%A|fk z8XiS$+Uv!@Bb@iyJTVl!%`E-};c~uA>b-lgj|JlQ+Zw!hcJT$^ny7}#FN680V}BgZ z^fsb(-$Ic#9-M7cqsz;(wU!aaO#Gg!sC+*ZgwqfpfD6(*e5RZfy?)c%E>+(^f zXVQ<4VH(uQDgo%7h-WseH1<%-T> ze!6`CO0?u`yhsUJ+zF9xe7nyK9^j zGG5>Au&s%`gHiZ;2KmhgSS>)jfoo-}s-5G93yNR5mk1!r@{t1FFR+P*tU{MJoRF{h5u$LfV zlmeFzZX>jS9fL2gIGHrfLy4|UP&piG1{aXbmg4eqm)EfakF&E8mkdPfg1vpynX~6% zt>HkQ19_x3B&CFO?LYUW{2N zM=#^A5mLHuKnh(XcnNIpN4%1gpo-Vsj=fT*nu%yo~9L*Kh}&OJ?H#I`;-t8hUO>Dzs5?k0~Gu7Lt#=T^vc`;;Ia(So%i^X965 zEwM(5=q4dDhAg6zaESnU?->WJ_LxGx99bp~dg@xIOr#&^pg0By@mZu#cT73G^n3%c zI3Cn%IEl6+m>MEYV!0US(WCp2N{ita@!f>OjEL*Q`on8%BFVrU;}D)LmYyY`VO)av zhve)`tZ8{X38$42CfuYMwpeic|Q5kQfdrH-7DyG)?&u!T;1z^0h`BRo%ZC19o6@V;DeR#9o#B^z05 zFKWQn3axJ=6!JN^0W3|avM%U2tF_|GUXHpT#Sp2bnfe7!k$UdzZCf*7H!sj8bXF%fWSf<4~}*k5}+@Hp0yK}Wj_;R-idqBVHv9tvsEeSwwi`*%lV zg`J+XE&Aph;*AOk9n)9Xfc~Y~nJ&Y8S97W8wXIZ2G;B2oo5YrYBnNG+&LC^vFt^u1 zdEEn>*o-_5LHhu==yya8FVO5vte#Tuge@=IH2*`ie9unV7^?69m{7iOIlf571{e-v z_fF%JbZ9rbGn9f$VZjIBg_nYm-$3;O6gP5K?=Z#oa?qbM@Dlxc26R}X$}IuvB0Lue zS%a46VOiQoZiA7fJVz}85ZDcL`=#^e58$*$st36#d)sTrs%R6R z6WcfI&O;1PS%Cc%Q3w5@*}#gKmbNRJ7&_AT_4d#S3=q}5tFyE73fdGe*TQNrWdr}@ zmi=*DMnWjQIja2X2;{h=NUDBKptQz;fiQXXO?^VZxhnxFsJIfs}D9IOAU_; zr9Q)z-tW$hufL5yOOLw;icn0n4@m!oq~GBO+B3r^MzArn5fo zZ5d@Y=Injjro z-1u2Jc9WCdO-zJ|a2ujw)eY!cmu`Mu4Pd~on(JgMc$_=%2W*Q?Aox%P1^u)#vr|u( zj~-Gtq@TYS$ru92_dJbI2X2vexKs>R0^Z!7XeW*6GDJ{87El0j3C@4)T!Yep7mSI< zWEmlP_C`YG)vVJ(vZ(a1afZWqeB8*WPw*I*ZXXy#h%-hG$0}|)bkf5qXbvq)NPzT2 z?LA!;T4XtP0OFPi?R z+k})TbB7Wuqz7_-NVTXz+=?{TrvMAMlbFb8SYB%(`Wu`;2w?()Xd90qYul8T6M2a%m(XA(2o}yFR3E;i9LUtuKI0DbEN}!Wzk5 zBi0NE+4bS$<*oW}PY&fzI0*I`K86#~8-UDH&DRhf8v&v$dV);!z3K+Z;;3Z+Oa65toUA!QKX9)D*8n3s{w zK+Y1e4e5ixNDxiSMCtRvLDB#X6nTWTO^^ON#jnSq|8i!9zRMt#1$_3Im#n6=)yO zzQCwRxBzIM86VI(g~SjDVSWZG64#L>JYf4p1b;tzM2Z*`{N?a;gd}}IzHQ^OSH5uv z7L>hw_s;N`qM~B6?WCtj0$a(T1SOQAwI}o5M;zWYIyjiiF6DgR0|aws5u(T+W@XvD zs)`0Pr17ZtD)xZ{%GfmDc<)`Ewvfw16-xVEy&g-C5vv=5p*N)KqFnaCEbROTq@n?P z|73zoX^9Ywd-5f;jh1>-qCrJ#9{jV3g9v;?SBb6@-M3u-+qe3AcbTkj1|BONbcQ0# zc(CX>oHl4}?>nQabzGNUJ^!7a)55IvSZ08!i=9{ zPb14ZvJyHl47bB6CMj*cpHVB`8P&FlSi_@(^%ABSu^qZ#Re=N#HOZ~@fR8dNlvhq> zKV)!cNM6NLOcs7{mO8Q4&yN7Cj2Bwni7)erJZRzwMsJP>)C!+jA9FTPYLB$|8+I={ zrYPH1(`WS2>0{60@1O24P4nX!Y(HvqmpP&fX#{`1kAQ49F)^vEc=>V&@spS>;dt5= z?%wfQNVbcgmLdc}9O$7SW)MSL3f23dSh{yOlyZo`|17fy(ZSdT{0eKWF~mWR_6Uqr zg7?A*i?;}7Q>%B6wRXZxZ@{0UaUPE(;gkjICcL_^v*$l^2^FL8&n&!x6EJ&Km4Yq` zQl9nWYeC=FQtr^3l>@QNECJS@cu8eJt=)47A>L5eRDO9mTfhymQAVSC4I4@Gf-W`4 z8B*L6(Yl`p)lSgV++aaVfOavs3T%&YhYn+_J6v)<5SbGBxBA74eMD%MM+&y2szq2k zBh6R7XJfVzIMV*t?&kikdQ3elNTRbsi;)?+FH0ceRW25C03`;qNNC<+lO=ZkBAk>V z0??7_=239vw@l|m8EfFbsQ)~XQtEvCe2}5TLYRnA^;aKR7G(oJ7q3^tN z4T=Z8=GNBZSP_8-7Mv0;4{N&;d_hp@wyHCoUybXT?tqPi<06fh?x916FmPua{01C( zU}$K6`6XG%HXxU|istI9hQ@2bUSeAB-lj0gxrHRG~|X%GtYvKUtBg>P7Qo~{0t z{JL9}xh;>@5VjTEM<-K>9b&2$hife?A&GHnx@Jcb0*$3)Z0m76=~WHx~Fk! zc?9x=S2WgeLntvpAj}-9RBOKS53v7|>@MxtQ z?oGH4kAszDeYmnd7yII zgJ}ao3KiNfKr?b8jmX#hYb&4wuPiN1;6^2BIl4a@7EovdIaFw!dB%xAr!gd4IJU*} zirO+?Y(=6kt=gRxNx>*Y%Y8x^RRqo^lX7R4xzTFryBcp3HU^!gfU^TmL9}-hatn5$ z&}S+fz4M2kH5xHzBt+~jHxE7h3Ufm*s36!luF<^U$1;jDPwL49C@3#NOyrK#A*?%O zX*Ib4K`w zvm%{7gLX*`*f&9rM~SOeh>tJZD5vj=#`11Jg87dhU%1{nk()S`Gdz!O`)B%IRz<|Q zd~+G_!H6f6%zzo*3Tiecv<$bip3;!qPyclyJp*s7V=(=`eLKwZrA|K=rF-Z2qR4ez z5ifBQZTkVXrko36%;u;QO-ldql^*Sk5!PH{M=y3V6YFPTkU8pAj;$k{U>aP|RC_kn za$}%e0{&XqEcU$J@kN9qvmgeTlPAMK?La7i-Oa`N6rMiXwoHhXt!y90?+Frbey>q5 zzt)k{H1wuwB_7?!#n<&RO8lp)mA+?fJPOupar!|A4v%!PPWr zpxZSeE+yZ7E$E6G7-%3FoxPwc$mYG}5F)=G@LHcC9KHMIDAKsS9|{Z=p2Kc}PCUrf zeaTjsB*hSSqrdlvRy-ZToue*@M9^?pq@<(-e4JRi&gL*0BMVtGSD_q?r&$gZw*bX! z5`rx`+=`oU6gP16VD*eB93-?@BEK<(Uudpkh4mpt?3ow_^ZxK&t_88T6mQ2FVm;O& zuW9%8cJsxev1@lQXFky3%M<=FIo*E79@r<~5BOyiro?>e3q_#9J#+4y6D8>lU*r&u zjoF5B5>p4zNrCGsB1e$ftCK3TR|msKc{!3D!c04#i#B1DsS)mkAOH-s#|`s}Mpufn zRcErnw_;VC;Z$Y6?zY>EEZ6L81vPxQXS7(3+IV;zc3{`xJoFfAGg z-J_{n>6SaY`-2?%N`y`7iV6z{0#=ZQO!Q6o6Ev~T<8=pMRx$q}@E=16)b1r>0S`4X zvxDbn6`=?XpY{W#iq*U*j>qr~Fd3r|b^Jgr`x=?Im7JLPK^(nAJRwv---$&y;f8l` zc!xE-g)4~L+p`9oYXz_*_YY}4W1HEknI92(Yr80vjR^@o69D8O}(lm!t6?~#0ce%Z9{B5Pj^MCHKzdZ0Qx zs4f2O>*phS(K4w>8HvGrcnqeA_@2H&Up_dJVLxC+hldbYK@Beh24eLeaj+y)Jy0@W zm|6hR^ARZFQ#WFLXoNMhgbFR!9fZEK#jq@Qudh1T!frzQSXTAC>bKmJZ#06R7_#_h zo8`M;2U`iL@<*XDSo4G-x8eW`5r7zaj)N2>e{`IfumJ#3t3+}E2??T`c0&Fb=QD`i z2ii|U2`>=E%%1pD5ANKtdhIUHDR*PCo+aYi=E`&v!~?2(BNcvznOD2A1m zp`$L5#0LA!{z7O9Jrie0NQk2rILdY32u=!O(+c8Q?s~vHiL9U_O>2c326tm`-I~Q- zLFVFDvWsp!%@s&E#!80hMit4!~MPemAz@HRLXR^hX6wQTqFH;>mP! zb>Hp_OX&Z;yoPP=E1}AE-6&f|p+&<(d*Fb=r)UI&HiHPf0fx}$#)J08wiz#MPxF4G z+E;qVz(+?B$?m>;Zj+%wfl8$k#3L7U`gq>b2Wfn&48Mm z;Tdo<8;DcX6b?+l_k$d7W;jh#s<4E|4J$;C!`Aqw{UiMy9GmoH?#AN!FsvT#OjnR& zID)zR6L#Jka=_6&N5;s&kP1JxE=1#B1>alSky2ti38YjZSf!v9Pju2bA;k;wC8yA< zQId3!knDP7l?&`qRyF?dA3%b8$*uui27(0VDjL-fIqw})4sI@>o9jo0;B6$*DWGQu ztP|EVose&L8g)ty=!9H?KB9X>uocw@nyK`gnF!DN3QwwBDFU8P85d2i6hf8({TcR} z{YhMw-X9(FK*D}uX)`btGE7J?>4?}8oG7rzZEJPM4Wd&QpYwZ=A$C?6G*HyrD8| zCOe5IiIIYr>F3n;UD6?f*Sxk*+B_p=W*rG|EqQLUHde6#*{npp(%ViS-n{1*SaeFJ z{g!!(z3s=YcKG#7-|bQPgyt~I&(YL7DR+qd~T;OXE?O~#REUR@`K zoqNE8s9=*G+VOu+1qbKM-b(8J46IwpGtT$-Mn0!800jn7Hy45l!6*$MA76S6{;?d?3paLhhHaP#Fl>j|0=+3Yc1Pjt!PmhQ4{Y5$ z--qXDd)(M9bSaQ`GB7bU5e*#<-;rO9%5G{tary#YuUlJh0fUl6hb^C23___|ne#?} z!wqrju5frF>e`b>E0oK90AZNRY-t6WQ9_zL|Bn)W_YRd%sQL#rGY3H9%ccVjQ0H zIyMaVLX|Y!zm}?*MXo>0foar`h~xks@T^`iHE)IaHwDa!+d$xdN++htHAE z@mCD*27r1E+i%TP&3NN9LlLvpJ+X9OJeA31-Xt;!+i)`V-@FjqT`{hHaBsNv$1^WJ z3Llc0y_@<}E-m{KCid$yeK}$9c%jq73(1EAFzp^r5nqHOCF}}i?pmr6?B(6JNyVoqMgA}w)*NMsrNVFjTsnhdA8*;&>ffr2Eo77;0U!28Oq%waG1?~nDt|3XqXDVXlq zzcBN277zTn_!-wL6`SYTpT08~rh0+U#13*Nwp@_Kk$7+@Tfj${{CHg-`U8~Gxx%XiJYr-0qx z%n~?@>&p8}fPoTAkHUb}UV~Wxt}Jo!B|1C4q>f#;TE0Zn-hYV1Lb%@BHTDo}TY0(1 z-gNw@0G`fsK0X^aSg7ItnL!JfaJImFQ&h^Z=flxsY%v3DMmI;B|Z*5u{x#(Sv8PlQ2otG6)-m;*iXcCk@;d4D!zX z(Hhvr%}r^vwD~(kHIst+%2!Nok9sM9m?zB@_r5v^=df{}tR8nqfdaBQyNjDFE>MIL zD=I+}VMU0bO|i^9>;~OM7D^k+IYYw9-snk*DdO}MADVYQ+5-td0C#-820NKGR|F%R|_hJF|jNTlQV{@}n$P(8R@7+60Smfe0gMDC5 zB@C*D(8%t=t{)yPDNUYuN2J6uw=QWXXIJ%0hAf`s1!R}x-Vz^N?EH?N*Es?ZDJiUk z$-L;eP2@i*Km%}IWZ)^e5xz$^kbSNMksatV=?Ws`(W$W`^i>=y7v>0aS1R z*g;E5rS6!6&j(HD^TI;WcTdHp-vE959DKE#5;&6T|7NkcoN#~;$!rSB%M6^ zLGfuEyBMlFGJYBjORsDNt;i?hbwtO9(Dlk%Vb?ARhCEeGQq8lAWYb;5!~8E8ms z5EQT0yRFz{4vMV}n)gw+?ZjX?|MHG5a#?i+se7$UH_Q~dC{(G)wrABRu>(zk{ROO% ztQ`)dmnXHg9r36z-L}!xgpqFHaK%XDim&`_?7m{72d6rO*kJw#JZ)SwK{zXWfPLy= zB8Sm(W9ajkHSQKgsLoK4H7WcN+j3u`4lJXE?G_f(IlF}=-%2WKY$G%m z=|Lu&AV<(o>(KX(T}Y{V(BIn|hr=`}#+q4+R&CC05oTsL@auW+{*R^aj_0y(-~Wh^ z5ONC%SqUK_nGGv@C6#O;%F4*jjEpEzR(4V(Ss_W0gpiPxBuQ3Q_V2i!@9%lN?mwRU zd6LiPdSB=JJdg7juNfnizadTq5mRuQ5_OF=+Ytxl68QE_i{AS_T*trxcb_0ku!Pnm zeQJ7I5o41h;yVU@{`@%riR9b4SW7T3dd7eJ_+wh_c?Hf_*}dw9*4DhheHbE@_Xl%7 z=-s#Gj1A_w3^NcEB&HnfM1G z5%&%W6GEsw6w|b1rNDqN6A{imYYAwE!IJgZ{2si!s{?56^+VbrEQQAThmqP6|^-q<>=p< zN|+m!5d~VSIXyl7>K^w^U(iiEh)C&EJ``Xr(qH;dC;DwymO()@mM5_;~PWq-Alnq5{X%yv7_g!2NhdwBnI(ISO2M} z;?fEYI4In~EwN8MDF+_&7X1z{=&TaT|84Hws2V(!GcwZ{5 zdRS56RX2EbxuE+p=->a{ROb0NpRtu12;YV89gRjPJ-cxsxuWkQmyv~Eq6J=c(;v6E zZ|cEiBh$9!-oCFOk33huIU1gT*7c8b;95T&$)zEIU$Y#o(G~1YzRWDkHPo&{GoJ3h zbdG3lN1)vh?{!pSZ2K{*l`>Lv|Iv>1E(QpI5Tw{Y#d%xhIllL7&+3g3)L%kB$1yXH zm9+VD&~g)?JNN=zO9?|}V3=hxC|5pDMv086(!Pg}9#KQ7DUf5nq?{4cGBR@WLtx&s z`r@IXAx#MZxc`50l6EXMrV4Al6oP$Fn?w8fydlDCAKm|e#mHOG?G%7(P4U}>A3BnD zQ({E(wFK@3a1OB^rzkO@B}6RAq_`H)gBBLnJ@EEsm?LG-kuX0$AZAvRe3ZSu*}_#e z?J+pPI=jM79;~ITqf7Fy z_2*97%)7kX4r}CgvU73Gu>Y1g9(5K$8mO8oHP_U&)%LI%xkR2l6NTdT!e!T56G zUsG~6`+za2k9Gz{#!tHJFfu>Eulbm}c3JX4k%hPkOY=V%nGlPrF4S7Gihk{7wHuN+ z=iYoO$zV1e0g`(J66IsS=-4JoK@eLa7^G-l4_2ABNt8VPJvn(GPWly&Vd2TlN4}W7 zs*KulHIv@pAvfl}5R7^Q6i@p64~+OH!B&SzF2vf~?uJkD=r*`~9Oq_uE%?+g0jZl? z%PqTTu3Oyet2r7Iy4JZv$Nn2?6Wh4L+)^ah_nXfC0L6%2ewz zG+oXph0B}MUUj}T*x+4xGD&U_hRM9u0iasng zgrH4?Y(NG?L(G^UX1@CU+RZ3SVyL#^Zwl?USlVE~rLtEkPJkyM`ufJGx4oq56%wiJ z{1pIv>6w3ymH+n#7~KI*k%*9e(h7Z3o+0Xd7-X4u%v#z%$P=e61uR+2Kyj?h>Rptb z7_!uS&CSi<7Fa{$9ID5 zF5?UCe?NYMCxIj}mM{R4%+}v5?zI;F(d$GYT*LLNj1(iQ0XoY2?38wvKUA8c#+L!C z7$h>srx*(1P}sFUUfmD=1M(mG^Z7gaOWuAG@SrL&u1TYMsl4waV`9&(bo&M^oB&_&*ex;}m``mPA zN5_`Eu_A|rM)#om#zcAL%AtkD#d@h8Wv%db(s6YW7P(WIpVVNf^Tf2)XK{m|21v(_ zZGgC6C8@2;Lv1DYdU zIgUicy)lhB>NWq^WAe;k+VzH)Oj6r@OnAfx-YK0J9>)PV1`cg~bu6xZiJ@yHsT47X zP-Z+mNbIk(5q5Njh9bC!E!_3FHO@M*?Rf*sP+E9dZFTf@1v+6Y-;aU9qDMnCNtbn^ zuP)@-L^(#(paA~U1{tZT>v2HzcWh!eCl7sIQ*AtJ_z0RTCqTzN5PQGd3x}9zp!u^F z(uHwTW6COQ(*d0C^7qH-O7A(I0jTQ;1KO-dfe3eM_DC?R(7oT>yNjOfclF2= zLout#B{FhNp?R?APJrO1bzj2PNZ`a5VX&t!(l%5|vbQ>7Oy>o`unt@!g)C!3i0^!$ zQbxYkeBUpImfuT;bJIlEJ7J4tAFS#?C=B>pV3==)I(0!VdH-xaADk2@PCPuNvMw0) z^1IaS(V-u#st{dYrj|HLF9~%Ik%ojk8QS~dhgfbwMtNrl;U$m8PjE9ZV3tQ{*liJV z_}&#&f(OX@4ma1dOw${#R?gu#h#^iqjN4F zr+H6f1gIN!PEzMn!=*n8AiIVDxCOx1jz3afT55=N2Z`R2JA6BcTd=sNMdI)g+#^V$ z7RK0i53j^QH6JsK-dSA}BH#nAKhDkFPVA@w=lTF6$?0fJNJ{GI>gnm(Kpm%3-;QOq zxcg5n!ZJKa7UrYJ`IxrDa zjYB}%^T3wo=9Lqv7nQa%Qd2zrG`y8Gbx8IeXWbUrJULz_D08@lg>Sj@-R3(z?_INm z=nN&otFjFI(%L|vin&Rp`S5=Hhx9c~BG}1G`pVY@ZwL}YU|iU%YO~{w!1JW(u_$%E z;OXhBpy6!~nyK~^F@MDYn3GnZJxaqU-~%fC2;M}6Q%k~R<-1!=mc22R0U)Q()ijBi z`EPs6NH}xsC}yK$fTf6Y0u+NIdHSen`1%bfu1+vu0%eEy$Po0T39+%UG4ZS>nR?VS z?Zs;6UMt2w6)t)K3T!19^A>n816D{UuC1*-Ol(j6aWj}HrH>;j_`D#qPea!XqVRBi zb2AwfsZWioE80lhXM$0mc)sQ`vzK3)Ynp8|z-d1#$3Z`=$8FBdaNOAV%Ol3( z^mNX3tT}E{a8O{kKu6mUY7%an(cX0URB0Q3r1JL%5R^?|TKO46aS!2O5235Hz(exG z;5#+!yaR=ptwH5E01{cjC<#s&;1Z`O124IjP56JtWBar~dAGfu& zHHCn4)xM5^5qbIf-*Iw={hpYBl37VK;o)&^Za3L9*mGXtYM!->`JyLCVO5gcr7hB+ zG?_L&zk(Z_lJyKQ2E6;1{GlY%&4Ag|$K&UC;)9fV<^WhkbgLc#KJ6i!CZnQ%Hut+# zlhB=J&?88C%=x3_7c}B|WNs6sHdp?>XbEn9(*J;9T0<({t4Eg`KCD z*Ep#84roT7z?MSPv{Jkf=^aMTOwXV9f$K<7HV~rM0gwfJ>gk~(KrLaRd-H@ls822Q zs=8Rye7=azG6ut8-79#JJwvW<MQ;(HbD)yYj zbFgXl5-AoSh;JQU76YvNYhr?6JYH=B*L@qF6TVk6g92vgfSASA#-f0vTVrFk|4#F- zk*xC3|Dv+QV^l|zB^^4O4;tpJ^E1<|02_th#tBF^o9u_2TVh}Kp=KBq_Xztd4)e!K z+%ue{B5QeKfJbLqNX5bj2`<_b)61^jVoG1WMMg$i*7XzojT1QGe<5l~R%hAS7k-1KBVzy7x2@Nb^*Harsi0;VsIolY1XqVlZ1*blA_JPUo) zBs!y2d4bQdMvcjTEWx&wPB7|w<6B%PW#^kgeR3YGa2^g;Z_4eO;6VR4)YUbb)NHc~ z`!F5F3@)1<;BNYSrynCM^D_{<)Ixn-)GA050a&391nCKKl*p0##Wn!?GCgEvQ8+fH5xO*_R^x&iNgY5acY*s;Vv3+T46h8ta-O zmoEmMW|-6oS`%K6Du`sF+sM|$SKYvQVd zpUh7p?qDzSeC6Sh>L{IZ27N(aHtZiVhVH=`aSm27TQ(wt+L*!Qx7O#ua|@7s_AxI5 zP9bQ?zVioSNZN(BGFib_dUj>qK3vU6wboGWebG(z42@g^U5F4YgSoYsRl*o3?u+wc z1c^k4F$e&0qZQ`uV$Z!3-bFtl=LB84X*A}1sguNgW&Am)2IX?50MFne1Me_dFMsA{ z_%j^IQxWv_s0ll<)eHuSfsyMzBU2IX=1KOn=LJsQ&(0es( z?bs{5&SWbV56k2yh=Fds`GZX+_6}M>xm6fdY+Og@o`3e~dD|;aPBvgoQwo0EWL}IR ziC=oA)g=k%r`O`q1iv2PerfI88UtP%WI*sYz(V8bn zhaitUom{TlQW&p-M>#+ERk3oyZ^zsUz~%nT%a)7cxVgDpcS=>2QXV{mh5#MR%-C&! z`%Qn-4NcEGFosKc_Zh-tas+&r)oVDX=0j+<6LI7zCQU4R5G(T@oOu{pZO(uV`KR#d zFz@T--2J#)h^>m!T3>smv}yK@vB+z|C0Y}RYSh%+iO!P*gRucP=iW|EriQwI-?vJD z(1eT=L)OpeV5qOAjzLZvV@+xy{{dMM1(r_j^7FJk;~kTW58y5k`(q8#vlZO+8OyLo zaR#ib(>b}=ob9hB!a{X2^Aj7WE}TN!)AJl&yQc1qGZ6vzB2)EPmR^;|1!k3pn71>3x5O>{u1CgM~|C7W8^CB^Go2q zd555!+<{A=^S}P#O;2C=!x<&;HBlskaGpTGlB92U=5FUKC7G|=&)Z7ee+V~#-ga;n z;HMV^<0#d7HzQRKlNc9Do=(_gwQauLt-C&g=~xNQcPF)M3U+`-j8p`h)6ec-geg$z zZWW&Rl=g8djDNSr>ozCrlGQk`+q_Sp`9HZD#AO1KJME1e@8vmw-*D?U5IGs21wnZ* zNikCGXQrt~mqv}}iEi@8__%v`tf^>)1Z~&9jAxdv91*LlK7`@P{7O*Ms3lXRjSo63 z<>OVz*l8GXsZnKkD@xn&5q-PTU00!a^@kwbqf|GJNnq^85M7lwxIuXhe-HBAJdv=O(Oil=&K(5m$FHfW?SL$eG8AA}=9)_fOCr(d6r^ZCR=1RS0{Mn9 z+%%(1%fj98HF;CsDsrtJIZ;J z#kLd56|X>4@$&K#h6X=q(P}vv8#|DnIDCA4Gap*mY{HB0IGks}7UBjB4pIPMKw{mW&BKKH@yFO$7+&xq4OMfP&>{3k^Q~vu#Ra_V zoc;^?#Iq%|F2svxRpNa-R7ym+5$(dqr1|MDUyT1DNb*=imD27<)*xGIkGE%V&H2Hj zqo%rAj=aeg74i_8WZtC+h^Fg_;aA@MXY?A@c}c8CLDKx$p0NwGFAB64qDc)zIY!&= zLbwoNZ?Fs5o(a)(U~6$SwV*3=G&39WC3MtT*z7wEfNQp(K8}fd=P?w4bYcUyerxKO zD9f#p_wl^51la%fV@!#RIxa2sTmuvI_22-+DqO#PB)_P%bp8Pr(PZ;^OxL5_V@o(i03r z&fz6Qo(zL+&Aa4>0-z%cBrn*61eM$ zX%$mIbkRZms@3f(`ozix7InhLPgpIgaZsW45FVfN&bA7(5Wji9_0kjyDHT3-cw?jL z?Uu2#Ii++heaMZWz+Q8puEpm067I3xr0C0b^DFBzB_`2P$~>1J**QwG|642$B-Bhe z-c%G6pw-lX9`aFcrshbA#r@pnOW8gs7VoS^?zSS0aXTSO5IO&X8rqrTng0T%LlBsk zW8m;M+E`MXcch>^q-!pK#-i_X+4J<{T7t}NaIQO?&Bll}2fj7V5FP7c#Eal>p&5Sk zM|OeSmeo;ga<=vDm)ug$eH={%>d`THM9wXDIl3_68K;!sP;^4d$A<@KtX>&j~C>9G(0b z{NoOAAwuf_7RQ|^`D}nv1<#wCXPiNLu+&%Q*7o*d1iPO0^8PB2V#)9-5U9ie?j81K zAHq={fkU=Kkm-}FKYD9*7^6=;K3em2+6dk&JBMe`p+U8~UrH)bJF;nQb(Myv!0X~G zzm2_F(eC`8aVV9CYNM0ITt*NQTqJQaBJ;8!H}IsKF|0;YTO zoz-o1KE@ljT(abFP>{-A=w&?C-1t-P+(xk&xS?LhW9bXzbQ;3Zaf6P(t*` zrf>ZA(u85(a}2#42bu?G!jhVB&8a3tY5@z7j56A;L-Q31D9r|p+QT<&5w;}4Hns~~ z7FMjwGNB{SdZ__$4*m`>W_SqWkPo-_C2FP`0x88=rNLJTZ5tJOCoJ}`hQKI+*~(Mp zdk{_7NpCPrc+gRUy~Zfg*x;HvNn$wNqK1*MEFPYWVEZ)jk1qP)TX5x9#peI`asJLP z`Xmym*y0JLfLu61!{AfKWC`cXS@v15HK(p%OH?`(? zgPvXP7Q!0@u;5r0OWFBD*p$9h=NdFGe_@KX65+|4&XL0tnF>& zXWB7!O;#Hp`168mX`cwJDI*d1L|NGV;i3$n44l+mAZL&uK!NrQeKg?r1|SiYzmNt< zLPkAdD3z-I`njIqLQ`WSJ8O7mpE^nrc}gqgrBXKNoT>gI4hM=N#3*}Bzl?tk34u2d zp%MHLxFsJc!FIkBUYEDLiwhmyRalkS##7;OI5n{jt8WS zKKMKDQzN~@&INZQh;EcQUzESE*z~n6`Y2#@{kO5n3O-Dv%`id190iDI4Vp!&JCp#f z6D@GQhUOcs{7JsLDXLDD{j?3q0da=`Y!GJiutPxx=i}~zji)sx3gl2q@{>qde8j#$ z2*qWi4aRkI*)N4F~nyM4U(1ukdiXh_f?33nJc;2rl^mTL zIZ_TYA3wfq^3!uk@trs=OpNfyz|Ey0;6Gzy7E}&U48;9cuR)~*z8U^kI3$DscjmdA zspb+6x6pAvJa!6z!-CAgsCVI(uu39R(SK6PiZev9?ZzrRI=XcqNH(ul4{uEO!J^|{ z?2;%%t_bK$lwvUsWO+f~7G2$`6B_V}3~EER-4}}CTnyqKY<<36me2m1ao|r{+t+B~6aVi^clQ`L{ildE68tLv@QkjMowvPl z{B^6WCHm-ZXh;XP^I^RT+e=_*1CajfUAV9lZi_nkqln`@dk6MDhVoy1(d^{v3BD|R z{8-+pU+~L`czggzq~R|uO~5l zJXzq9_h!h`Nuwd0fAQn6#yNv+g#_vNoXgBFFlr#l|5#K|(9Gp9gI5J}Q$>}js5@ek zLo1Yb-+K29>KbnZgM#SeHi_}x3ExLONb>p@HlcdYLFVJTJA4IuXwZPN9v4kgbFyDB zXJ)5uI4KzA1MpS7xQCoHi%CWrpElbs1GT>%7*`Z@1r(TA!H(G$m4&Aa2QC0+2=5?l zqM)Qk@nN|2PU-P0E7ouTUGT68k97HMP;=9ba!f`H|R zOzeeInYTUU9WJ695@Fd1T|yB{=fpJuu#Q93Ux_8PI20KDrjAR%0uZiB;0jUQK6g6T z06Ky+MA!j9xzft&kO6SA7dzFf9;h!%_P&TyYLv14aChFVDwWkVL|va5RRA~*Lwe+! z^u5yClbc5Cp-g-2B;5deHA3`?_6&Pxj99oW&`tm~+m0;342b+Pez;ZrgYDYCMSFK7 z*(&32YzCVYMs56enql-FBV2ool@^5C{P$NY;P_22jX`Mm)YrEIt-upkO5}eF15Rv! zU_%$**q@8nK$NdQr+Fam`-{XwfaiVTWB@{~Iz;ZoGbenj0I@<{?*G2Tka;_b1S%n3 zFR)l31KMsLxFPjF*yP?lO2WB`;1A>f0P>+=lgmjP9qK`ie&nieaNTR10Huzd%l#CFt}Di+4CmR5Mm?vzf(7sc-8`ezD_Jm7$)0ruSL+T znT+0w_|lH!;6nAhkEos?ng@ObF!odV*VO#a@$nu*W|ilBMylEI)z1QHXo9s5(5CFZ zEXgCptWtpAjT6E~m=EDt6T0jbKXHdnJ{j*>ZkaS4@81RagdP~(JQ%hR9qxi36env^ zhcL@6s3pQROS=g}%JVc4gaAqT*OE5!ol-61F9UZHi(Mri%##mk7Y`3mOuKA773$sIfx zi98VoP+E8FU>xBM&71gfoZCh21Op|r%JN_D8b#^O|3<2EVAkP_q3995Ks*3s($J!3 zq}jQX*ka@Ge}h?4@GixFL7Hi{%N=q2pfbQ)r3!0cs97xu{rja>c5i56G9Nv#26k33f~Vc8RQY)^62HRx zk^v@feSljdSs)}9sf_ZS3O()L>G5?vvu>g{LEt3m+YF+2^BlaPY{blp4P=S0e0mpS z(SI?c-Z!;xS(E+q&Z($4T7^aduGnNCZ|yPjCWE=8F)@*27IN`<13EUaUjo(Bu>w0L z+qjVTLp=X!x5tB5GycqZw?&-Xk7|nsn6Q3D9v_+_w`Ious1}IJ(CMWr1#$vZkokUp zQ(6sM<;uG!JX4?C0o*NG$R}i75rg#(o)tk*LA508&hh3eX2fYW{W%adm4*dx0a3ZT z1>17~dB;c@qKOthKdSi83#3OpJ@#Tn!ruyG+W2L|rmon-LP{4gu|SFP;S7Egltlzr zM(n*>Nd`CA9q*f)Z$R`u@htb6Z(ABj>jYM!T9;o*7U_WbB^6x&jEkyu*M)P_#b#%fVy7F8d zdPyXq#K-VV%ifC(mpOXM?cgt5a0T1lzv0qJ+C8>VI$>HLfe$n~2U0-Y)=M-o1MJN* zqu;;3B-l_$$|if-jQ~w7aO;T-A&uOGBguX3IBq@As(Hr`&+Lg?SckD(FXLnmzv9b{KfC7Mg)-o_E$s*=$ z@HP{CtnO=lIn{No1+S3WMQ{w#{}I9VqhPuJ6{Br<$rE|AQ<9D+o*FS``5-;*3EWy6 zZvW8UKEr$Z`5YSP3DCKxf*vgDr-S;;G6DGPT?!UhNuvMYyL=KFFN_fAy8*9-hf@lQ ziiRUa4A83$PRyn?+h<&B@LFuy>@E&?2T=`NxsUS2cbY^?k%EwE`35lkE-VUTWERsP zihs%6Hh2-?*6b2j^?d>7*MU&;cL?^F#sCe(1!==?2T#p|)?K6h3tx(9!-Xa*B z5#BiAS9IYy1(U>j%*;qP*%r(V*k(Al!=C4{lq@Jp93>`x+A!|AjyDsWu(9ae`Z3dx zEng8f7Q8|jqG>UDhx$%eQK7HSVp*5rlRq*>tR%i+BZ{l-&p_2~upH_B2Q0x>UYUmx zi9qAA%4&D`B4ctrn0HzfUpq*nnLt>CFy22K`ZA5YU4JERTZ=u~t}n#_i^7&5c|S6G zy#Ipx^FejQE3rUw5CMb+{V6oe`%Y$x^GFQ9{H{1x@G(u(TpLFD*AO>UG5@ZgvhCYa zGQJR@u-7R+S-k&0XpY`~^u^7votPVB?`ti2=<4ngF?mLMYc+R!W;Zp3e5PKdAAD)z zV4%Op@==X8uIBf=Ov#jT_ii)qG6Nb*$lYu`2sv0W*ijWU>i| z*l$=pe1m(mAC>8YdIGHhGYqz(=9#yuxk54b zm(eeYQeYygXhWFnOc;OWoacdLrU#x}V91Ie6L;0OPE6ssoaZPsccH>Rs!lwsL|6NDCc7Q+M!(y;#ml2M+ zzO}iKue6~7`>62AjSs(XE-YO8L*y*@6HnD2kCz{N3pxMQ7Z0)oFXA?&rU)(xvQ2+y zrH|Qd2d-`t(k}3yAP7D7=0QLfJCH2EEIhKP+^cYv66Mt7nys%3+b$B~!3Ad-HD6Kq zW`f+RWol}A3B9}u=Hmx>Vsdh70(btmN(0QvsKNoj>vK;}1Abf48LIrt`1Sr^MWPE6 zqj5TXvNaI2UOg=?-le+jL$3}k0*Dq!xguRWycJ{kh7`oNCSn0q!|x_inSg~3~0A7 zfr%R;4V8}6Jz__zqL0>;7;zC)w`PWYEwN^K4YvVRn{zwEP6i@Bqq=1*3r1c*Mq#Xh zEcGhaOu;DS&aU2>WoyuAtI;??Bbq!rEa$DQ&%8a?pqWhw9G2hn1Zkxu?Oc2^^pgY1IQ=CA^? z@u>b>$kdb37GxGpY_=JcO`D!~+29DMfVjYYjPMnMq!V63A;yK#@ zOs0sZ$^1^!>5^=>m%I#Fp|Orm8(UI~6fhidS`ZA9rLVBV%_8_XH#JxeANDd8w^lHy0KarN14W6G)SBwGxWT>Qd&>Pt+510MllOP> zYjZRF@Y`G&pGTC0?^(FnDN~yjcE7|K(}m!%s&{AXRQ-w}kEDg~;qXPK28RcnhebH4 zDMGQmdbJe3_iC?!o}R@J47lzlCKB}8rsGZJoCby6go{ika5673BA9X7yHW6eH28hQ zR5ncl;|a7+B8sLFFoXVy%$Bi)0Q9p*;moY2uiv4D>ih)F6pBIe+xSwCWtghUHZo;|!Aq7@F?C=3|u+4ze6bv2RhZfKwheIN=8vpvQJr4u*NxZ``2Xs<@;rFzC zGkG(lp8LtgY8L!V(fwwIh27II{iFfB0h_Xf4pA(*xk1UD-{)2(kK?=iF-@*QOW+Qj zddDB<-M1UZ=eyuLKc9=%Gg~k%?;RI{t{DSoAOHFiv$_*IWy_;m|NAY zDPOtd0uX0F|4M)Z?l5kE;ms%5;JVhh-^vn%*MnxX56J=^0DBw6nMk48zxFSnk6Y^l zY#aHXu<;)xWsw={Vgo79(KLUUcBdt4`QCki4#EPT0ER(OZ+{z_5hi0NlULXbb>(MSt+^59}Y=g%F4cd+|euTf9 zPZM7O_3~wLTpDocZ)IpBwaLm6uME&J^&8V-2cKh?b`iFb2*g`^{y+y&Kozhk_d<6< z{|T;Odr)NIkoY@6J^y58^4Gq;6@&#CMmCKegfuI~RFv>15J>&3iSLutg4PeTd?eb@ ziqm$1FYq+hCK@aX80VS7E6z0IhLO-%G#l}#gbeybyg z4H%tGj?OujC&J7$7m+3S8xB|JC`et}0(TlOl}>@DF#Jh!%4#vXef(B$-%|%UnUuxSnGkzd!FpIckPX`0X-Q5K|CmbAl}ef5-KcJn<$xt=p_aY+#lFSCQ?w zGlJ*Ra=I_)6LtSIG99mg!5~(dTJ{!)ghqig&gzkh;(3q#fF+)nNxF_iy|~zuAqcww+@+*qRlnP;7j{;18fJWsW^XgNxu!4)4vhCT%ouZO-0;b4<>o z?%!!({ZGNyp%mVcCCxTMs|0(<4lrYfa_h{23_rpcL)v+W7S_w|op7Mf5Ib~8VGb=t zaU^LSldPt$hQ_KjT*Qf_%L=QKUPMyuYMSE?=H|wG3iRbMT)6InRj=R;>!*Y9v2);< z4^~{8=&S`dG~u%j#R+r__2A4=GWeA+f#UMqdH59zsS=12c#oqWTUx4JV7nHb=g_ohJs5R?71haV#0{qH&T2OHMWvag@ zGtGWPM)htEjMPD)UXEqXb?$9nRxzB4NwLzNFFT(`Nh+glpulw3rNYx8fy*&9OE98q z;t2+cLr}@Y|DwaxgIA7+O5k(?PejAvC!^!gv#Ef}B9fraw}2h(E<$sJSU1mpr*Z)j z>o?mfmywf*%oD*tGE)}so!Vea&<)`!*9OmR>h>TDu|Gg4(3~WF-U)sj5`NyrV&BMy zzCKlQXz}yqvS}Q_uOL#B%^(4ngPw}xm>UI12>hI`k;)RKa9=OM2kia)`Gx4=!>%6a zxswns3@7+c!K0PuxEV|Ujw?{GGGGKcIt`c43Ik@3HG6C3TklR(nGTtmn-kksr1>H! z09`V%=;vc9vBq*VU6I7<5!ch*ZA*lhh$$eI;IvTU?-$KB65%KJj{y$b1CBzXk9_(; zo&5PE@R}8pTK?lX%>)SuD0A3gJ%Wn7;R{@3NI_i_KW6$XW*z{bcHG4&p9}!~Ix=O> zVcllP&F~4GA=o4huBM?`k2soKtH80u@w${*Z;`x&tEbo|I|w6#EN7h8&FwAlqxERj zUkMx^$IcO270%7}`L(ozkI^{4df~V7_c^eTz|QV&4-KJ2_U+qlX!9{$Z4i0x%)c z#m$N-^6jmxUpG~_uvUlG+Wddw*v!pMRIP@7=Q@QVGOYgY-MyPi=xok?Nd{E|qdgwj z&jWYDwG;TX(qxJFvR-=@ex}GatThiEW{=5cuONtE#ez`=!igX1c&Iz+Huz+yu`7yg z!XZ;Yx{H`RByw+)j_4rI6AI@bOlD*s-=K?ifH^}o;Z9Mlb}Kxh1y+P*e{n5*mtOi> z=2+az0lR2S1y0v)^Vc|>dv4QQkA30O96_P13t*o_Y=J*1kF{OEVPGq_kRQ|se(Axe zlfce5p>Vbz0+u{2zrB*XiIItI_drQV^B_6FCyyc$6G(?tN2G{p&8h#e)h<7B9CwYA%_ z{@j5)jB_IQE&>s*3-X5k3<0OID*APRin_|`EoPs0S%jY4Pk_AVghnjjo_chuue519 ziIJ?4kPBBKb7zRIr|StIw-ea0mP1&ML~_Ql9ZPalJe|#~;rein=l!Jip6CE_2|J5> z^vn0*^mXOq{QJ>42<%TH6{sfy2cK?aD$|5&|AiyIut%p`^w-GL6n~NgIHDnBw z8`ZFr`db)ZXxUs@V_iV^_=j~;g(&9hUwPUoSO1GtKAME!0|aNx{PA1^RFOi)Junvn z9!?d2N>5bXPOB0@)xD#rto^wL4y}05A8b8xb8=kd8UOg;?3iVD^y0G}bA*@adPUvF zRB^ys|FGNE60$YjwyNQ31~gXX66C!wV}rW|P}&>ne9!UKx`Pa+be=CXkykC28Mb9V zY9XL~i7Of5XdJefkVzz3zhUbXOIAvRbGRYFhLM^g56(7(i0a39y6@Fz0ld8d86uC? z_Ww2wy!=M?FBR9s>{co6NjBVQDe>v)L#1%Tx=0@}dK>W;`)I;AHXMnaBf!^YlFQT# z(8x7#fZchI4Wk=KBlt<2e&uR+piqF&L@DxExrxXx)ar4nZ8y3kwIjf7dT;Ywuz5gN z8ATdDXm0M5Szol4fFsroda{;@_S-O^9i*4Qt3Iyf|!@E*S`)i zT-u(Z6v!02cU;sIIdC9fUxa1Le!3H2tH&ff<5qXHQ0&{Z4%A?x2_ww32;m`aA8&ax zbiW~v9TPGGzX$S@Hxd#WcWi+KhnZ6|XLaxsN!zjPT1{_S={;`Orr z+Jgt|fXj&}6wzQ61`0?Lm#`1VV~hQ)eq(%>|FK;~*h6jv0Kd!vUJiz`k6Vt^UlIvx z88`4?6EL^&psyu;0~=$PsOC*&>8k_(JS;6OSM>N4M5;yLW{2czNI8z~dAeh{2z#O- z9G+<`n?BEdj023(mab6!b;RWpX*i$zz<~o;7L!M_r|IM;Y2=#WJKfjr%f}RH*BH%~ zNO9u!sWd~5rc4wk$ID!byAVH4PwK}g?)(zEijT*+XG6Nr0h0OGV!rw2OPw(ezsU5j zU#wEO3%FHQu-N*>1*lOIn_1h9#usqI3~4rpCN!^W;;t@*9wiAxA;M7vv~}{ERjcQ^ zgfTO^^9&(cD|vHE*{B6t8}5S#iAW>mlaI2EglZx8oKm`1geL6<*f0LPEVtrT{S>WS z*g$eMRd!5f+R3h>e@iucqB7ML?Bg>-phz5`+`Axh=NEAJsuE=$G^YpQ@%$J9i|_L* zbyzC>cv#nPq+Onu`?SILMIYX64+w1o_T`g1?liw`jWHFaDln3L$f=#*1<$_na;?wo zVKXPnH)B1lP(~#;zwfF0S4SAW?@~UWLQm2IFLMx+-%gIEnZ3bt=}k=cL0X1Q;rhtZ z-)}RjJ~~+vFVK+i`#~)0g@d#K7Siw*eLLcR88*WttDapwuN|k&9 zOnbLA&1Gn{7B`K?gQ{VJpC}2d0Z&h9wOQuGLUTAFLx=&2|K2Fcc;mwEMC?M#FYfSX zzbcHaw;^1sM{tXTI4 z$eNY&0^m~(&=s}|BxyN#%V9*IBl755U<5QCarSaL6BE-Ds7(rnG0&`*$SULVCZe%T z11ADVSZ5@ik64WcQ4iMf zP)3l!;f}1g-Wm$-L7CW|xIH2OtB_!C&p;CTC_-$D0%|~wz_Z{M z5TGPI)D=qHJSHXO5dcE_kHf6_$#~gMP~_6+-)F71d$!8;+Z_(?pnFId2}^^VU)&Qn zQ47LJe-ApFEr<-gv_$@5aSe-JO2Udn*DAo_fhyY3j4K{T&B9k7t*es?Gg7i@YB;cv z19TQ%ydRapcg$@iRJ=88cp_8p=42D%+wgrVfz@Dc$ecI_^Y2ZePCLv4W-u1RMc<*^ zPIuu!FPAB8lRj24v-=b?>f{-y)r&uWh2JeZbhF56Iw;3V`(}l@QnCHQa$tn{`5lk%A0cWuEw(h5EcmYm>NN@#4k8Bzjl>F<=y5(0uIhr~`=j z36tu)1NK?sS-|6PcrmK(79IwlSr&vUD7S zr}}Tu6eGEW_#ODr*F1CV5rwNb`6o$*AibNQ{D20l>1@Eya}l4Nu`xi~zYB7j ztOvF*F2c&E2>r<|TvMC3tqDTm3X#RGVQD!Mh7Hb$$0C|e(1=vC*;qunB|TQ4MojRNZZL&I`*H_2Ig2&@cOI);r|qeEl1rcp+p0x7jz)= zoqq~vUdh)5c9QInuNs@9_sj=T^@!cJ6G!0oVO*GK-MQ!1yG%&Px_^$1)&9dVd<8t` z%s=v>v6{_~LT2981%i5PU%%09Ia6CR)WK`WptA9O}}gQ>U|K^#^QL7+!WA4g3zK~CMs1*}K2i4FPC&`@ur58%Qw2*zhC zfni)3e7P8|UN7Mrgn(v3w2oy8Z9`C=1L!oz6LS6+f?ifpan=KaDL(+dlMhUr-oEw5 ze=EI!a$ize>eo$|VO=}cY z=n3W!scwV}db#)VgixH7v+ z;Aet|4uwT<`q+~Wqj5NTvC<{ePk!dUq=Ug(L`fE4%AsGofIT5x`LIsm?3~oqXGUg> z8z{1Y=z`u5OB?!Hvp|(=?EuUI0n~c*PI(e8q3k^oKvS|*Zh4|VZXH1D`7+XnD|QrU zqGwK)QLw7Ac1xOT-X7 z!B_K^`4_s12jFBHZF?P65^D#@$PRKIJMhzkyx>R&3_{ z7zje$mWiI;C*-_V&WpsW6FKE*os=w|Iy|5R0mu#4?$!jB$NVF$FtJ%HL5$08>q^B%qKuIO!vnv1YSq(WQdWDKsTDm0Hf zsz#MhlZ=6UMcwM5g|k^0-@G3*U+(mQUEas5N>x{CG1pV+7*@uN+AXb{Py|= zf4s8Mf%gTCSkUpTS1eN*`KLr!)&K*auSQ>f)W^rC z{Fy&v!_nBT2@1uGz|%CWYhM4-pYZbVAK`o_(dgy!K~s?V4Pl21$1%`4sF1t__-$cn z=?&&kB|zUVVcxwAtn94c{S&{q5a)bfP`~|FMX=<+>xQWw;YJ*C z{^`%-oDJgmSE4Z9Uh|J@%6Xef6k))&cUm+EJTWRJW@8wImhb{t$L8YPeP*=F*d|=TB0mtC zfk5PAEt6iWTU<9$XkgC_>6b)D?|=F7?;#k@PF^^F{<~OyUIavCD}DjW8VTIg#63vx zRvGgZU~i-t(J&W5s6D`$5QG2L-;(JHb&qJ!9S@)hu3PBTtTO{ZO9q)LPbESeaX7(E zX5<}XRsq6rIYA>A+1PAdwaFP7fj*#&?}Ou~`fWz&*_~b(WOo?hx0FIU(~sR0hb<}T z{zpb;eGict%?cw!4ZD%5Q%nC zN3pHj76GBlaXWdnlvUsARfd%5uU+6a%bGu(APEnQX=LY|>mL|Mm0<}Ute>fOm481z z&nCTlziA+la8zyNdo*N#+Y!Ne{YQKqmz<|lX8ZVVwUetJY~`$M*iR(hzWwP)ZwDtp z1mvgTKkzP_=H#K?R%2GYg)o;DVE|{u5@RgMIs;Gz#@kI;DSW`(Fjav2Gz}Pv-n7Xz zYDyBw0+W?!?*gk`M&7swu8(qY4FR%$6PYfK8;U4Az7P=yg3V{&!w|lg;Q2y<@Gvuz zOqr*HUs(coPt4n1Lj47o{zgMxz-F`R!zU8>q`jk^9_#+&ImSWn4%3ifcw25?MRd6D zh#P&5MlOv!V!{I};VCf;S6F5!mSob_7#cY>5`F|#Sr|&H{{0}!5qkwV(ekfrFOxi{ zzMhd7n)`iCwj~hJ8Fg1m`xMdA`CHC#w4RdtF^pc12!EsJkRf4lM9!19L5e2+vLUR` zbyl1M=2M2j)OY)>JTr!x^E*Q{X|kO%B$Gd(3~FB@{TwEX!=im$A-g0S#FqfT?uP5Y zIe8Z2KcS(a(?Fi3OSDFwyusd$JeXTF65squN5}w)wZq+#8nx_>WONAbt}oaj`3Zu> zEbr7vT@TblFkzZgg~z}m@yi6r|G0dLEE7_9&K1z;7MY;@qmSTar3ni{I;LP$%1-z( z5H@YK&XAijFMZaWZ3G7Nbj8{sy!@uM* znm-|yU8z>AjfV%^87ZoAwDxOly#%Z9mDkD4+dt5xo|n>h2OfNquzR#4KG+tF=S7Qq zd{0;Hh72?yt>Ftrh=zge`mo=v%g66m7XM8WMCmlG+UnIZ^Ua zSv=224o1BR?@xNN@gX*FHa_xGKog}kMfvXIeC|gFlBxQ?{_%%#FlZHf(Bq4BtZaC# zZX%jxqX(8ev*~8VTzizjWV6@N(Xj??>-Llgv(D1HOVcP@AgI(5C+$jx|5BeAN<&#b znvfzBV`8@&Xaz6MKwLx~r)()>LQiQ47;X@pGtig!5}EhT95bv?FH}LZRI9>nUY92~}g zngU%^5;T?W0`QVu2lhF{%Sqke5^+l){=sYzia^97c0>mgIPb@b4o;#nljJ`cT^wqGlW=K3Rz;g;7G4qa4udR<(TJLjLC!^ox zR`vyG4p#qRLB!)oa2rN-=VOV|KRLk%k~^RF$A{}+U3C6dcFfz_TG&nQQ^Ajq?wX9@ z4g;w0*jKf81+LUDKMcdLM|1EdO-Z7SF&HC)5* zkuko&GP%-d&5!6|B9{d|P$s&Gr_R$3jlxTH3~HBv!e1IBEFIVxMu=R5^6f2QkDZ3J za<54|7jHSg%YnLYK~9m(fMl-J4X%tsSFT2kp_@9fkcd`%4z{zLXSw!?VoxphU@qwc z?=W5$h?`Gx?h_b2zKMaB#8sljOf)$JD&o&K`ZvWdc>#>(0;aBh?3WJamr&vy@9pVv zgR;$@E}iE5KTL>hFb&fhL+CMQoMqs(tbRW$-$#KjQ|mv@TrT{V3a3cW71W@uRWg5o zbPs^w48f(fjA9&D*8^&FszCSA4a1M{uMd@#m5D~Sf@}Lq*VJN7zv1hGm1C_)9XtyH z-8~bxJ5i8%r`w%oL{bFo_R$lU97ThWZkxP_EA@~XV!_72TY1%w8UCL^i_MUMqA18O zLpq5@G~&F>aRpb)T=P+F#t0sQHzH!ZY};8X(g<3`6s7|S6F5z*c_xQmn8qb1|FDEc zWDQj6AZU>DSczGcf5+v_ACC~QeY$OYzHCFP2FZ27lY3UA5_aADq=Um{xRrINJvEnB zN5tPKC|=)m3x3|f+n#E3mRAcoEd|jqZe3&*pVy}ggJoR5QZI35iiT_A`+*76=X6+z z*D1!}RVv3%-a%{~k$J`W;c;2wjA#bNlFKDod>SA4KWLmYdIR1YH0DS&;Vsbc;GKe- zb~`LbcW~Edr-1*{h$ILW*ioHiNUPWJ6Jx6vQj{P$^Z^T(MR)i9UPu<4sS5YPrr@f_b4eIViJ;)bgjC#q4NfpyLUHU zs2Re_7;w=Lajhwpu-C{a`k*vN$sNFGUp)HK05G?oDOsayuF<1A^&+|(jy!qD8 zTo3Px9!$Xg`AWQ*o*_;28ju{$oOW(|dG4DiaC0l#n<%s>^{HWG@e@lBBe8ZUjE(`$ zc!Rg|bh5YnW$Vb?dL9=$MKg>vO21ADB>=rVC6i)UfvHp-Jdtm}VD27PEfs}7DpLrQ zuVpwboyLms2Dta4P$7q&LKLcCCRISMuZx3;KLM6(MJ}VLXdswefMv$JCuULyosjZ+ zMc{dW=?=hmAotesF+6A94=&yI6R$6x#Wh84&5O_|aKJia2wz!V&A>-ozNvMCEg$>7 zVWek);NzDFti6Q4JdfdTv!bG65$(|jg65NLg_zBYBhFt9sA?klWsW9wvKvl zFYf9=!p|bJV{H+SnyRDybg6zEE%p-v(=MW9*meG8`2;xhzmXqri$Uulh=)25iQ zJ=)Jdh~K`l?IkQ6zr?4deYHSmP%UFf><*gpk3D-lUl~M$4=rMFdl0S)th7)BCaYii z`!F3*P3l+Q6m0>$X?<*!Sz zueAjK@xnb}xB|R+`}+0kBJ}C? z0J4(dg8Ni!Vk23Vc}GsY`|u$TjMeqfN1j9JuL^Ye8U#yVogj!5HF^G57>zxEE0aCk zHF}$Aqs2u<&1INQFBUQkYeOdZr2+alNGc!@zwTrpJ5>jIkB!wbj{zy9d>2o0A zeTK^6%Wz{-5`waJ|ASUgcPN$dgiqd)b=cEc)PYPjuR!mZMtkvm6&OL8%hTQpY`kQM zN*E~~U^EC#A$Ibzny%JLdHPkM!LC@fzYjr3pWL*)#D)yejSRtc+Zq{pTp=zzEd5yt)_{*Xj0=((2$T2(23tM9it zw+j_Nc)1XoHkute)EbMM3FAz08FuppUsb?t+m-Ec0F2K4dA;fCo1tbHw<)Ca*LkL*jr)vZ>KxqvK7*LGGzjp?KKuNO3#Y8qH+{RSX^OOb;? zavma};4ZL}DFjL?V?Vza!1G@@fh1Dr!K-*>$`RNrVhf-(sTm0ds?{gN@NGMiYhQs~ zXAVUo;F&NiB4nADy?mL6aqlRqwVreYI`T3R9z09|g7)4my%!4j^pJbWOK}B-1+H7! zTRtSqig*IYlAZ9|aP`e^Oz;4y`Ws@MP*dD$l$tQ;4BPsK$J_cCv`gcl0}TN*&jESa z6$A?GTX@tz1*8^$BV7SRjwcxz{bs((K<6Pqroxb7Pb17@&A}ZF_#k6A13KnTbOxfZ zH?>R4#%cBz6>wAJ;O|Fxw$E6OW`2j`FNP`SjXiwIP})czFY`W%6QS|YLA7%Y?j;9_ zS06~?FbgktS^0e#M<8mS1z2Gpa&>+D0#6J)(nM^raY{_xoX+Dz_~d}b_wU_XeFvJZ z?4qnJ`zeU3qBcvL-$;duouo0~lRN_xVX63NO4TA(lIN(m3UTWY7ZXcCR7}f06SGBF z!f`{v-CmA=B*M9b8bEf}c6xi}(z36U#^_*M!98Cs0?i=$#PYYzI-pi#Pb&1eDb&GH z{h|!>0VDw7tUcrA?*0V%$-89%tQTXxWc3!Juy8bW#oEGu1_>Hu5MC4e-Rp%YL-0p% z&P*T4m%?8{Eh@7QXJ4>wa*zwN+wpKjs3$eHI~R9x0}5Y@HA|(MPz60ZJ zEP(nNmCJfCD~RU%3ud{KKzBYv5fTTE+D0@XwwvaS!`eOQAR)JosXJ>Z%Eou$TjUm6 z07%HfW(~9T1^o&YjHB}T2~PWx?yB+m=&KHU(L#VF2Ahp!5wHi>g1qeV)m^bSP6-@p8**JCJF5)7AqUy zzn^#s6ILFSr41k-4=wta_oyyBI1(CMWrKOE#tQv|R!JP*AN!T~#}*UmF$LiRt|a5E>Oru_ta{Stge_^8Pw z-#8;2y2}7&v|zk$2S_!FwK9<6bSLE(`1RijraU(9ze_)k(=z>FoG5DAC$N5YzrE|! zkyBt>5%>P};x{Gjbl{q*>6fcp^kRUWxG-W=&82 zpn-%794sdyEXOgCW)8O>0d`X{2i?*~co+9$ZHwyL0WTQMd-CLDZ@|)N&W6bLGfGS^ zn`=^U1GpN4+2TL{ydz8X;NGpn7v2gw*KHmK+TWcqh9xpW&1$(r7z|z#8-eORV6%|INFLzkCOlcufPDTaek% z!;8e9mOFQaqcO!rYt#&3@EnhV+vPRuI2=d{cs^FeBTR1hv(oZ6S#DT+r2s;t*SL=t z;5Ms>tK{h!h<)FmJX}Y=>Rl@*tW=`8_Y%<`uekj+!Ye9jN+a=gP-SPlr$!eb2H00-+JP$#G3$1P0oy* zrRFlSda3{qTwR(p7jA@EQ1i&Ru>R~6cBwpQVi6F1lwME=@eGO}NUEREAq!!GB=hbo zsxm~yvLAxGq>APH=scu=Lw}hv69arDjs71F*eaEYa1aHPPRxI;CPs%O>E{cW6WwGm zh)5^{AOyEh!1c)l1^@?I<>iu3=}2>IL>2NE`*0UbR32kev=IuegI|~vu}E>%Ndo~gN*SUERw|>h{3I_jvvpPaBBJv4MQwx zAGZKVV=;Tet1^N?EaHB#LX!(6 zJ##`SRt97k=8-OrJe*18y%o zZOlIJr+Vk6Qgr%7%rrp#d5l|G8&`r-bSq$sM5r#lxIVKE-Tv@MNfz@#1S{pX811Y&n>MiPs_rItr=O6u7qtgiypHTc1kuL z#&E}h6@WD&U6up?jRZymDt9@0G>NUIfHf-95RhI*cJ|x)*$oI9jXibPT+CgD6IaCt z+^~-koql824S?~$B~c|{P(cn2_mY^%JP+y3*}j#V z(XDeFsiF(fM4yvtqG}BZD}2qsGQZtA+S4e-r|>5EfR6o+sDbSs3&!9(!V4<^&1nt) zYyi!fcisy#O$fV#A&=F_y#ILhg@1*;+*m9a3BVQ(L@1MvUKq&M$Qa>)I50}%53%SN zzbYc$4|m3cRz{FUK972T#yqiH>;7m#EZ8zMm}@i9)!g7;6)=EqgOe%Dy|_!Y@?*9{ zR9XciRXzZPYy0dE`YO=9r0@DSqQTB1o#O-K{A%N{D@;7m&?1mF59w_^0mbIhc(mJ> ztimd~?F!p)XWXh<3N05@<7a_+++;4Z?gXA*rHzdF`;$9IE*6-@RkRnmRDX^d^b6f2W_%XWo^66UueJbA#x|8Oz~XUwJn6%QE+`@j&CGUe79Hao5z zj=4_FyL|(;E|$yq_PY`bjTJo*u1G=~y0=|BM(Bc-p<^d1E_xp@aEAZ%ERF3tB^xhnpjwFhn zsIOWfJ5QLKYG8w7J>xjS*K4E9za7*(TdUG1C@k=b=F*9cbp8`+F@wJ^U$B-+U}h|; zTPObEbpt_DjCKq$&}Ut&Vi>n1lspaiGG26c71?zawd ze?Wm`(J{dphY2*&%_BCzqQ7VxHsvo(_& zL#imu;WhROx79eqs1QGY*Z#Lp;lr{>1G7xFgon#7k?R1srt?-s#Ex^=LA08pF!o4p z8B2hBwi8@Vb+L}a#o~F^)9Q#xnf&j^a*k%&DF5$YX3uP08K%XAcO48gBsaggPMZsh z5J=`+mR%tA3ovGs{Stt$fs-M3=6en3H2y11-mg&fcWxM*u zo^Aohk8j`ve#&)oR3?(dLQvV}cPxcWS%%pn8UfoB4Grq)U>xs2(cDg4;H{$q0b-)~ zl54s34)EJRw)VjI9zX{$dAehH91yTp%yT(#(m_iSC;H-3%+@X*MSS+)Vf-3;0zNlD zL&Ys?FGmORZJcNeMyQSeTGgr-lU;7PcOvE^c`U&~NS_U&1AJ(Zi(0N+Z8*FQ>QF=R zkltQv%#C5T9{7=snyCi!x)8WRqN%O)(&h@y-%|}$8Oh=E>zIJf1tU9R z;-n|~&6frS#vlU(HlE9J;RfdlgF`&zHTV(-XYlNJyq^634e`Va5EK3e+>>c2mEhsw zLtMsHhbduBdo`wH>xh3pG1r`iCLFkP)Q@VL)r|ql1*;sR_cx9@1-|=ZH}W2aTZr|9 zr5lFa-~oYhIXPwWXC^c)Fe)?b`rkwBn|8ssF&a)ssB5DADqstXn|T@bD;EyH72Zm; zkEpCouIz2`#sJ7u#{~RTRC~{4dbLwKJooX1voJCuF$B2s`n5WG01PPuWo}m@ zdk;C2*zii{#@IL89+67uQR5sf2Aod6jDqjmH@l|Me^d8Dy7XRQ!2%=((UC&AjE9V? z0Gzy|uh|l|`h>|a@yzz>n#AuuF~P_2f$17q1!BT`8b;;@;H3~WJL^SK4N(^_15%<; zJciU_CH!eMOIJgAKH1x5IaUNdqoO@;hzpd)zX7lsF;9Y^Q^Nf9+G~l^jh+$!^2&^o z9wC>`>RjbYllTYBjJ~6SG!gB?v~9-;0PRrtRODW=eRfP!{HD%k8L6YgDR$Qv@oC{- z0^6eugeQT}u-hDjQ5I?i58iOBNlb%iDgADj8>vcg%wS!>0T=^I8H~uNDu??VSK#4^ zN;gAdtzO*Fv2oPaB>J$eyZ5Mjd08aKV{iaPdlwhI^o*jmINNs|@39r-rz8XH4k^a{5L zS_E8uH~~A`R3%Spn7674ra@1J2Z^89gB&TGYS4S{0cl1%&slih`$Q8zN+OtvkuY53 zPHm4gL^wTE&NNU`xR>m{^(5fRXZ%jM4Pu30-QrUA;3cMMpa6q$3yT>9F$NPLNW}Uv zWCW1k;;lZU+ISb_Kge(jP;h(dmSNytjj;tx=f272UfLCAduN7QVWKxuMK9B97l|Xo z0DBLnM7h@G{*_-57*+b!z4P^@-NYb~#x!Hch%`jKaE-wd1j`+V4~(Ij6F3WP?1Y<{ zESs&49H9gG18Ik|X9jFg$-oa*V;tc) zer}|vv*3rPG1(%iJ6G0i-h1()DhkpKJ50lDN%rG`Ry-*232M7Vl7&}p&4QwXq*ez# zuG&Yt?hDvSE_!4lMfUAa<7G)2PM;a8MIL5G-;X$$?rH3(? zd@R`08cVzy`}D8w6zv67e!N-yGF0*iL+Q@>&!|0h@i=ys+rvx=7z$Cra08YWp5tn~ zbqM2>1&Pu1fG&=kY2wf;r>_2bUw+5Vq(kHHPJV(1-VfWTh8QVn-?(}QtD!>Vjv@(R zN4>x8lsteIbg4lw=kN?N$NNAji>d|3X$|HSL{^3i4{#EM(I(K7 zpksOe>f-_mQz)>M#(A9~p&~k{IQ|iS(|0aRDq|g>B;NcqqT%;Q`p?mFAdyM{1JMTH z0!zA>h*h`t3JJTyA%+uIBEf)sWuURG#jb#D9zF0=DsUm965DjDW&;bi{d34Ie_}e^i3B)epum-Z!C@ z>{D)J2J;Cj7FfMrK`I`xXEaP#=fjwuK;_6!gDij!hINRyj7UCZk)D^b+mqSGtIg1Y2Pon|MKpT!JSi+)#57>ufNr@R)FR;_GkuDX@33 zut*^Hbu4wZb=v+ld<;sm%42N z5>eKNQ>fk8`6x<97IOH0BVg#TAdt*Cyj4})f(7S)9{Z1LT3*hFL2{5F1Gd5CL8Z;t zt7Vvwu|y1o$+{p;#4x^sYKj%qJ%KwHXZ3OG@Y)Z1gd@{sJ+57pUCR=qcP508%mdVo z_zS|6857NuR?YSzZ_v8e3C7QMbrAVxv? zob5vLV4y0&DESIXRp2jpzNj;4G+DE_{{nAYF{|5J1)n@thA}eM+k*QC)-=1bA3WHS zjX(%n^qHGO_u9(9FTJR#Uf8HOt2rT_vj1}QP72&pm*cEzOO&h2)Z^Xt@5zA;0 zxPtfI?cXySBLpcI3UTxaxG}#m6a=i@10pOImDM&m%cjkdgRmr`im4mi!`H|bJ*f0i z{)4hYxYw;{v2`A=Eb{=@UeWPN(Q0BYA8c@+8qFjuWDgl<@ga|(seKPLUx?|PlLl9I16L;Y|0_fnKo~GU zjJsPhK@trC?f}Z4U7;_fr7FfVqwCjr1%cPdip&*--(RN!>h5dl{{d?XRCz)Khu=}I@C7tae=g$;uZZLj3!m`W9 zt?yGIgMM6r-J7+OiUq<61~25@&Rc^q@*lLRWni$D#IvED7=V@=>bGAZRtvd7cEw$A zG4IYhlJgZPI~XM3)>xhBXuK|ZVtw_P0v9j%JzExSuR2i8jV!AV)b`LnYw5H%@;-4J@yy2&aCU`=)=g zCO=GCzWb)1My8SRZoJ&usB=Jn5`oaI9;7VgE1%jNKti-Vt$Mrf?F{o7$ zA{BDf+HVc2!K3*+*cSK0iZ_TXaJfBQ2sgjLt^>;{O&HS^glS@Iv(E}3JenKa-ndv` zmF2lX9BcW$X%&hu3e1%!onbMCQv$VsJIgYAP?vcH%&bWf1ohpEvfVLtH5*p6$DhAd zf50%iTD@F+E>gin+0)j#EV0~eAY6}j!N0(z#6$&pK;C80BGes_)2o@9# zy~#PjKB6gq@=ZonVJEdPQ`>-t9_s|G>-Gc$sH@Js-$}B|gQ4KU9gcQM{JD4$(#*l&f|$gHiO#9qfombI zF&R({HBUc6l|t4cZu5R<%C3O5xCf5K)2gdC6Xf5GY_5@clsZGQqp)#G2f}znmvYf< zp_uviFQBvhf+7iwgIenzCA28&%H6D>8H*)e(l!11shNR>c~ z%gd}~Z=dy4QG0eOCAKjZTuMbvd;rO*%HT1L&9k(0AuIC7)V zZegaK>}&PIkX{L=y0s8gvH*>%B=HWg@khMs)9B3LO?=;h8$|5O3UQqS1?ir88VY&S zU-Nrzc+6ake1@{+}(FpuDl8DI5Tm#QB zfKLA$G`F|-v5PEKBziu*a5$F>q(XF=qO)mz5DK#Wx%*B4)~GC{|1{nz8;RdUt$f+h z0y-X6=5WL+^36}psRn*@_Lt{Y6L$ttD~=zUNcUGW`${K@8X;LSxTVB(q;NZjGYu0h6o9X!|zwLN_ z>nPmR^{Zy>)9jTkI1Z3NNn4P(Nge`RuaUdWB7ZW6#|b@&FJd>SM6%BhU2vJ}+VaX^u9B!G$?m~RUmDLI!@FU#6q%RGhF^YOwRPX zLlS|B(Kq_CD(n@s_b{>A_Wrga3!Y3r9v9D$nSk{4gN||A`ZzHX6JW#nJ>qVM?&Cui ziBL#m62(+>MqAz8n>JNphJk1q zsKFEbfAKY6Hc;gc#|zVH>fO_mh%$%{Hy^o#peSNX8a*h8?Tr6Ua1VF)?U+bP9!sgO zTtD3>7X+xWzJ6mkI;H5rjKabV0PYYYI=Wc<_f(;^B7e;OrWQ=ILGm#OJqAb(;l5{^ zlMu*dapzMJw*nXjQs)8yB~tTBzZyRW{z`@`)(vW#X!L1>LFadU^(iv^;M z#T>5H!lpBDVzD~cei+ru01QMZ80&x}qU@UOr#u?Tu)0a85_Jzq5h!o9U3J1xI?Jz* z)ZQ!X^FBVyD_keHd;*b97zk9tsG)J1(zbt@=G1ipkm5Qdt}IO5PN!J>df zx#YC_SE8h{gYE6*5kEAjxcGq)@72+{Qd^QOg8LwaSH>u7U)^BJT^@c|t zGj2NUc}<}jFSe~ARf3xSN!yQ;+YMVm-Q|NPFFj_$`xB*u;G@JTYe##HSD8&BN+r`K z)%Qs4wLB~4s32BZ=WQnibh0cjCJjD{d1E6@shl3D5!<)yp|qUCc;jkHcTM zaWjHI&<~G@aCG8`UuPq8A+XIo-dCJOip*Xd0Ko0Z{X|q{u4QYy;JpiKim zfNsYIj-GMvZ*K7gOo}@m{A7~W@cQ+?i1~!yZvUIH;n!CJG7?HK&^&v#SX=Lf`&Siw z6Sy`g6wx}f_sQZn^&h!8{Fxn|1{*;?G*RQq>D}yY)=!7E`59(j!P^yXwFU5Y>@4*Z ziBC*qj$0Jw>TjXFfoBU(djeh`$*~>%bics4MVLHLloXoKW8*E+YEEpvu`y(~u$Mi8 zNaEZ#F2?=X5~)w~$6r87$V=((QSE~W=p}$Mcw05#64Qfyza@2ea98bwE{vD4O943D zWX`M^AikRQKN5Kk*&UflQedJBdFnSzuiLvn(a{33tu+W##NfT>&<#EINb%EqJ+r4~gS_*XVXNhbt}jEtY!aOsE zLw5rHy8M`&3`2;oB!j3Nhk(>62^IU43;L=%(e-ldux65OtcIBRD8BVL?eCB&V?agb z0ux_fZYF`ya1|f{invH{OVE((48S%RZ~WjykP{mNY<3;Kj$1CV-g=@#8$+}-lIAe( z`yYCkNbL^iL{yOIpE)@>Q9NvQ9D%tvl_o2m_{WwO90jwN&)t=742C5I3{(WfW-m%l z;Siyv;Ycrs+w;B{{`En7_B2>6o9|OXKL)E+j0p(y8ZBfPiHh*}Y~fS|o3;x-rlvHq znG%0YMC3leD9**@QK%~b@t0=BNx*&4_5mEp@7VpWi=!(7J*i=`3>9Ed41y^KTBl)^ zNK+Yj*FSu1L{x2@RKi+_8$e#EA-nZys}T(@H86HV1bZ^0!GJJ6e0Ysidtmor&^TdI z8H@o=q>LoTRb1OQf>pFesb^B}<90Zys-YnOZW%M&R--}H_~P?m?WdErOI(te|-LwcI=EQi^#rfm&v*PcWKEM z_=60BHc6O?a~s-nb1|mOi|juIc3eW7|n_R(73`V5bCvEnFppu3Df=)ZwOll2o z3D~ONH`SN3?D6r+G*P~#sqGZyzh6`xk_*Amx5qyR>Z4}Pc0>*hbjE1bZ4`SBR|Jf6a8xLm&n`foTp2BD!|?5l#~Gw=5J&hPxNL;z4FyC-3G`QJpRIQ=6*f>cTNpGCYjF<6D{>sOv?M=e`m;=8 zYm9FB9cN0^wmK{tdKfe-ze1)moM_2ijD)0Q5UkNF@zl0)`FiP_IS|Xx7QFX7e_llbkUpok~c)@4r_;oMSO~=8)UPaNg7J7*O%PcXDLmC$<=!4 z6R&x}HzyYg=mi5^PU%-5j3>+RlJ?KXa90uCq3G60Ia&PYa+RWTx0fiJvV^xKlge8= zSs?UC-y|8Yd=j87RLyfZ7Vp&#pi5Tb%)@Q; z&?F1VS1S|cQ86PJa^ea=6|>)@8nr!6cn`Q;Qp3ANh7((6zs%tc--Wi!sK^GChXtAE zEFE&Bs{O2u`7F}h{YjR1^kA5qmYCvmoi)1*@^xPg!BTOF+!)xHqgfQ`{Uk_+O>gkC3+2)@SS{=!Iz=N zYb!&@jJ{zh?jOvMwrY;VI52B-iZvE}?CD{Gc5G?XOtw3(-E{!oGhrYYpE!K5zc1=Z zd`D;it`U%N`$=gM2z!*J^TImx?Dalkyc z2FV-Hq8YEf95pU%JwEqm4|0$&2>@5}tntUczVvT&x?tLU{|Rr3zTThL7B9T+v$OY> zo!bf)U$TrXHHKrTLcl^`0%-;l$NNSCnIE>su{2KkRNqt%yDnzh0XpISZ5#pn>B=~D z94$DEcK?(|rWqC54v4JKI*Tbizj!E;x%gFdf9>!2=s|rpuX|4WCntDwcRc@{>J{{- zBG`^~Js2iPIA7Bb7S4;?oCC*i*3T9}P!hm`DyW^Z+*CmB=92NmGpvX8N=u zO-!5-XJg?p0WRs@cM)Eb4?GfwPo+qn(9u1X+wEk*L0niN&^68BQReEOu|8CorjPju zZ=Efw2{w!L&Y6L_-={tMu3l>g)+~j<#{Z(6e!~Uf{`p8$nlN2DMjixM=!flICN>Yx zaFVnk;Jet3*c;>;f?(*rv@Pg$Ch3y03=(5@f7H+$Vyyw(l0m!#F~K!39;#I;QnRqK zLP<;YZ#rC~64)~^*h<*-(HuQ-X&141kcf(7h&gub7~TB#eZs39(%w3k|kN7K~*96R1ldXd%5V=8o8MnJqsU!++QQZn+kn{`h{|nKwUJvu3v# z@X>VyM6G-hiDe+YFW4L8bRrcM+yl@=3@b=GS^~11A{6z~t~j$!Uj1M4#3ctT<9# z0c`~=VGH=X?$V0$tuVM)fYoH`u_rgp?2%dB^$r^enx>!UYYrbhz6MNiVo-vpfKaC2 zYnWtx%}hKkLoa$fY}IJ&U#HGk>mZ}w~^3f^*}7H7Mk^K zmd{g@3uxZkf|vnp27Ja(0Z(#sc+8{@vR zTQ8MTwE`M3xrT2Rbs`E_6i2+fmPYe`PJ8ffaaofFKk(u~DbKFRK_~11G`#u1dse?*Z_^vV~5=HCT>pZJxN>^98 zvz7s7wij6DaX-%MQrV3azWNlg0VMAGqwP2gGr4DR9F( zKE&fu1Wg~Y8z9~&&cPI3@scNh20W=Ml7Fo4Q_!#J=0{d|p_`qkP+P@?WhIKaGxwe1ZX2s*%%i zX^z%U@&}5fd9+QQUKuQ17_?=Fn-yxWiWj#^1olV6&1zrPhF|{WW-O`7+730wfi*IQ z#Gey8A>ppEUZZCZGrP`l3M8Sj1f)q#9!fotw&t`H(=F%wgZNl9S?}4rZ7$y&yUMLctiI|! zQ(^uP=lV>=h*kT6Aj1b2%duofMCf4Q2Y$||G_EbHFtb3HwU(k1Q@1nLmh(WFnnNYY zfl+E&M_G=YP>vqNBwKG)o#TbSVD;UGL9uzULGnQcPG;P5O> zw|3<~5gseuXoozIOt}jvYMi zr-Kka&a!aH@9T1;=W^J)bPv%kH6{c)n~kO7J^c|%YD`FYvgEYyI`@2tAVUd5aKFlt zG^ARf7^~|0x1bnV(I4o@dpi5@UE?9~oApb?3+62H^9)#NVI}vYV(f8_wT;DsMzA37 zb88qA65t5NB$b{$k#Wy)(8OpcMc*_}-^OvZtw+@{ci$SN<$` z96&Nm4NIX{3=)hualE_D-ZO4+MhQS2@8J@n_B459W)B1J#NS8B@E%raqQgJhpS-SP(n;>3cpT?pI$dU67d-uisN<|j{D+v`sH5O!5a+lM0s|po-XVRg@H`WCh7-I*Moc4Ck zumM_4B{QkR@QhubV;a zPt|}&B_wK$@CyixYG0}S?J^Ioh%qWTsCBOG8x&ehF?tXJ#JqDT8kzTS?eIYfQPMc9 z^6=F?7k}e*l{9Ke$MT>UOGXnrhwou*%Pkh|oc38-&8LjP{TiLmkjJulcp3==m^@xa zb_4&Bktpv66vRI!G~~CB&x5x-%Ry1f{cBF5CG{UI1zSx48RFb|k_irn`nU2|*En5w zv;b1%@s`VpcV-C;U&Mf2%>#!JQLqI^j20iRkMi?NoUHMx;0MxD1i^(cXih;TqNb7-&5s@#o&4pxK~2cSw`dSM!PBm; zQXfj`oeIrgA@c04Cole|AR}|*kcGu)-ouBTkj?aiaS0O4$AjvBhQ7fks_&)$yzA%^ zsCaiA3eDN18~Hz3M8C0hPVF(yz2I5EJ*3983DEcpST|S@Z@iV+W_0v2F0ee? z)B0;M+$-^oT2qm<6)c-Q?sffGy)UG(6Vz<__$@AC&Zj}Q`Cz`I86IP|YZuIQMYjA0 zi_rsJ6^>PULdU2d_Yn;}akaW{>Q}kAn`1K6-4vacRmmUUB4=7z{=-I)d<{tMobki#ukJ_R40_hEHr)b(x|9CqdLVr$ z-i0DHQA7gB_W1_OpB)Hyej>{7ZHo)XHU?@Gl^70Mv(gTX-yLGC^Mo?t8sF}P0=XFt z$NrkBMYtt`&3jgl2iMUa8BQ~_Wrfk%E~Xq4S35p`p4>zmqs_n|I7za5<%sDyAYlR+ZPe3@yW6CQ44%g z|H3p%rE{g$Pn>}obXu?jEnJ2C>{2}vW6U2?D8M`bH0-w7vG>l%fKSB|A6j{kG&EjR zK|Awy?&1-M%pY-vt&C!Nlm7=yjPO^9gG&D+D;C35ENulX`5kJCM~lwpOI;luizs$@ zHqux9%O1Z0TxnV2+Iis|H&M3O2!3Wqj|ck4q(}g+es)&wksOyaqY;EC97or2NxCr; z#t;&`%p>c91u;NzZ*FKB}#l8b=b zOpZS$CsEqM>!h`HZzYx!4>}%X3ZO=L4qKS(?^565``Dh;=&MA<4F+}gsEA#q88R_k zTE#)#HZA@YvOc8BxCr=#q!um5w|a*-rTBjKO?Lrqf<}fKBeeM94OGt<>?SLD3R}Sw za8KOOjj$*XzYs;xy8sZbUhVA%|;zV-dOz&7PN9KU@F(`)3NJQNrDSkX=XXKOZcIJ0V_Rwz1@4tHjVeLgmB8YZhedCa%lcMVRO`G)1pce9aMIX(#&bt5~ z^~RxeT+v8Xr66uV*iXQAgotHvXTG zXXwBgC$byFzF%8&OuKta+E1nrFd*Q*0Q9b!| zGJdlTAkKs{sYAKpi$B;w(jS}OEqCi|KK|$|I?B<;^2YXO(!}qv{5cfJhko9=wZd z>pWGP=N_j59Ag%sYuXnJM;slY>*}r zlnj6tb9*LoI5)$XC*C38iRq(E2{0ND*g3G>Dj~PbZw?j*&Eat$KbaB``CA^~(Spy+f{UFJpj_a%AEauGut43o_EPdwNoy zyB++HL*GXr&6aFh4f1{!(TgVXzd;3%=D^I*N$h{`5R_#A4dL@55=^t&7FL4zX^1+P z#^F`pghXH6w9otRoBCpYyn*tbzAPJ3rGIdAuZEXA*d=@%g&$g&3bS=`m(<&)00vw{ zq_9G)9#h$L)Yd2FUg*EnKY#jEbTr@$7&q{sE8dso^2W2L;@tQV%s{{raNS5d@ZMZH zyD6e=-k$UP8R6K@n}*_luB}u?be%z|HSC2sa4|Fl2fm+${o5XW{m5~f21)*y8sy9Z zqJmMa>bDo5bCUtPgtT-hEY2q~s3E;}L)(({=f%D(#%S(ckFk>(=({g~P61f1xp!<} zgm={ciQDykXB9MAk<;l3ld_x^=fooEZV!qWJ)(jz*$MOZ0G^8rnkGe4@ezq zilEAdrvWd%^$f%-Ra73AN&qtNZTx$2$B}{M#g*SA{O2!>0itM*Z)T!90CFxDe1N`C z`U}+RuscB4lCi6e5J?lpc+vED0e_Qdj2!*s zZ0GIx#DfJ3@YEzrW#fyl2{OR@Y~!`>XjfFg%J)!WLSb%Nuk#%R-x{+1J}PNwRKT;V zgC|m(nfoIIQ5YP1KBT3E>e4HuD&x;catP+?`8Zxqp45Kh^Drle=09(dADin$1ZSmD zv)~o!^EN;ge~VxRLX%Y>=xna@41QRr{reA!Ma&Q})rJtkSzfBpBb{?;_Y>YaP0$^1 zmSsqc6?lV?AUD6T!0}E4(_j6HzNvB;PqK9KX-aq8mUCQddvwf3M=V_g^3 z8VcZc2;X6;d_pw(1S>7r2Q?}xD(-zS2l0asL&f7|4C#KsTzumFhY#y70&mNM)OfSC zukDrA(YAS<9r>0ePh2A`1qv7<2bI8Il)4Dm6X;){e2C?Hf8v*8XU@@epDQeu`8>CK z6c{N@yqug5-+N?;z{6&#^xi#(B@mDxD$!fi*Lqiq7+t72q1S@me$T;!F@NAYr>vM@ zpnn!`^cAuMEs#{=)9I!Fjub2j1v&I%?^VHSps@&kE2@+N0r6Q(!Y$R|UU7~-M|snT zFNTE>411Uv$S5jqh6hWP>of4f)NKA-#!B6n)v_YE2#H^p53ZvXXdpsqeyRbaMKO)* z5sPFcTlkH1pP6Jmg*ofz%U#99sX zc5I1Sqb(@#?uXqwYgXH?f6NBXi8ktP{9&D z3H_BLTW;zDK?!7g?Q6IEN^9caSIkEvwe2)`^jT?ft%Z|w?u|-80=(@b{}kgy*WCW_mX)>&J@LBW z%e>m+LIAVC6tFZmH7ybW3%40LYyhyTqBd>R0)PV?!~m^vFc3Pf^z$j1J1qY&kub5js%>Yt;$FtjiLCme-?OSa$msR~ zVndW2qEgf492@pUWuAuv&SqBHAPm6txK6>1OQ%LMicO@llcYfReED)~YhWS@w`c-k z9RST8Ug1a*L7FESLo2JOHWO7Ep-R*Z;^U1S-2L@d0)eE{64)_2+@PwLVZy2crwdyI z1u$pW&+xabMh;Ifr~tMVQBH-q^`oXOZaWnKJhf z_Jq$Jjb7z0K-rjV&Vn1Ns0W?idvyD zl5bDACqVCnOfItPq+qPjAQxQHGBGjn79G0ip(9#=4lwzG0#~(Tm2hHb(^b+`jevP);!s`!3>~a=Qk6rvM0$$1R z*~WqcCY>auPsV4`3cwf5t!#+9_Q<7(l02;_8yUTZv|-}P30Kr3fgoPs4k`Wlyt^Md zTi9)3Kkh+DH`p@utG5%V||6}Poz_I-I{*x4y?1W@KNfNSptdLP8 z(Xh%$wz8s(q9}W0XJ=O`At51AvXY%b2}wc-+3)B6pZC44bDeXY_xy|Jx$oca`~6H5 z4jZfGX*5$NKNYIlTS4pu8#A6bh+#4EjiSME^=_N(bKJeg;&el!Ey<-P$>rF8RiEx} zoy9x21t)L)^C`rT;L0COxk8UH4n`E`-PJKdln;-zePxFZKkgb!2h9k!{7xHkEq9fizt9@QByb+N%Kjd?dRNp@eyW3GsOq6B2Y*o}vH zsG2XbZ=)zlBtl+;4(5c9WNemNIsBs4E3U`E zpILs|d*f<_qL+}(Yak*anOJ!kj6+*p&LfT4=bl#1VTITfn6h;Z4N;(yo-S}LzGEWh z>f51d8W%1lUgqO#1DK)!Eu^R(e1H^S214+LBVR>DrAEwa6*n{?=s4uW{n(^JfB0PQ z$-U8JJ7i!brm8?&tG*Etes_PP;_wgw;Z%3)?tPbW6n+BiT*tp}qAiSHbI0`)E*ySg^v z3H9&Zvt9nfmcUy7Z=uFdWbVbq?O>LauyCrwrG}YM){?xGM^C{>ao#?QiP{C7@7DZL zce$*%>U*(hIwiw_vw)Y)ioaf2igVAdUAvB-e%N`TP@0P36k5jvoTV0K6nK=*yk2!)TIYUvF&$>%V6{vzWhDx#FZ>XYgr-jzFOEt> z>^Yde~f$|9(3f;kSjFS94QgIVj70;)8zsSK^MJy$Wjnl6Dk~k zb8(?4`84*URork+;A*$LiIE7U>>Q8O?aBN1H(jGt7RyE~zumJDyFs-ds;M#E5vk&x zvC9cUzoBcwkv9ZH!0m!KyVUy>5p?&JeX*3dfjXU?O+{}qGEaXmM=}Q}N`n|OOg*{u zo!sN2T$wZ1A-6L}X*D57l{yh4(iAU2CrSGYufYg%w@lbV)rq3>;--nJD5&;}mn1(9)O~H`UlpF<6;UKbq|2WI2 z18_9|Z@B62?(PyS+vosQC)Y6*pfFf>y%@AY}R{8B|-7YQ?L^+_5=6gEHbE zk@C4?rgg9Oy=M~`9(_Ztj3ALVxE@LfMMim zT3UvEQ{K4f#d5t zTl#+dF1;I1QL-9#aClMhzkTL8Yh5-RecZ=ghre|etR#W45)c!X;=3EI06*d2*Ci@0 zL-B-4MB{LHtq{bFOJMBV?))#v+Iklz;2M(_{fqy7sQ{I>2A&FlrDSs zDhwZm5S0?C9a1tfe&7XZRn^`XBP|JgMl_ER6bJWzK5VeuiaO=UpJW6M!a0f2I$JiH z#rux}1DGFR_1E!8J-e}dl|-Uoi20VA>rIAW>r zG^#*VhB;(AetjcNC#M1x9}|SZbb$C?B9z-u{ivoXMg49<2>j&D)1#>m7{@A>sGc5c8ddv$fe$ zVj{yXNintKHH!uyf2J=aX`~W?tt4)Wg2uroc^u0SMXCD{T!u z|DkzkXQCoXgkW=o`VyQ3lm^3%{-1ykVb`jJ0%6N$|3C!?oTotMsn9fA<}&n6eB*lb z6LE-Fi3oPUP{E9PS#7Vus}8|9F?63>hb`3VJ~F^nEid7bfoKkvAU~bFU3D2CKJX#q zT7)Q*7~qLqZRCi|73i~V^CLldPJ%0Wb#>L>Z}Dn{Njbuh-)NUxB0>%Xz;4*kA+5zx zgL|?kxYn5tq7sN12|;Xm`Qm-sgIR5c@eR6ZxO1*m^rsSGqGC$K1|`Lb9GY)LoNP2X zP-K(BK^;m{AQ#l*=#VD_ir4GzWC~R_jc|qzQIfR3DqcQlxvY%ilKP}{W!jR=6aWq%m*I}g`^^e zFe20vehDaK%h4OYJvtb$fJ3g(qhffFu$HS}t@ND4M2!;#nw-z4>1u}$(p~&OnME(< z*99m{a`6PhmiO?(TaSj#6dpya`EcGtF<*MI@ zUJH=eTfckSUcP(>=M@3RLZ*3NCi#i7XB!EoM^DB?Z@8Q@4z$_V1E z@I*T!@|@sNc-fZ4G=aP;gNif3VG_sjp{N+|j|o{FwRad~2%3l(uwVfc-m)KlH^QHR zp9=zjH#l)O6OJ3eAs4D;AuvD`8>(2KI6zJ*if6AVy)`;^WeRGuCrGWlEzQ}YVikH! ztGla9T1Xj?rS_n+NA-7ymK-aP10$jh$w*vHi&q1 z=DhSXbj6ikC;$Y6E)RSf#v@~{dW1PeGEp-fPH|^px`<`!SCM#UZ?~P*I z>Q7g{xY_B{h-*mYvDGbzlDLXgmRl7OX-h+OYirtQA>CeKtKweca18+gYwEY*XmVj? zV>^OVFKv`z?0oRYM;Tnwtm>Mq>X3K~F;X*u*kz&)=A&gMk$fI3)1CE=UDHMzmTbQ- zgXUMU+q}n|X*b-mV7CUy*lsKJfS2|E>_1NC)2u$Ufu!Nb z+bJ9uvXdHA-`2g%!Q!>zkF|0duScj>c_-a5iX19S8})3#>E20+NSOco_uibBBB%y` zk){`jK(7%Op(F8;C>DKee!QHl>L;KmvSZG1UQ*JZyfjDw3H}Bx81B0cIZ8oFp8(;^ zZ?q~Y>pkaCZxfFgLS))lMwqnc#5J#}WG3piLCS|KT!EMR%GzK!DGH#i+6S2SbQ$Ca z|GCCBG#GC~n{$)*7*)Ls0tEr|X1h->uSOgrOFVEEMVC$?SllJTT!=HH4E0C&sBou~ zLo#7gJu`MCC{u_N<1PM8zRok|?hYE`b>10b0NGp|Uf%bn?19En$)mH4FAd#TR6T zg#(ps7#-&Irg|&hd^7XGW);TEXeP@rEx3ll6xT)gsNLL6muIf_C_#wx>dmUX}aU-tfl)R2! zm1s+`fD3$F_5JltfF7xxxq32%9zk9SWt$t~#^3iN0|(Ui9vsK}11{hqL9_iG)~)J4 zb+h#X4OL-!0IDVzZ`B3Pv&q7!dvJD93UPK^;Tp>xY1eXlK>9zazjPKYF|anrq@9}s z8;BjY1%=~kF*Pg zS9J;Z4iMwo4}QV34$!xNN52K7hpmG{%+&q^wc^XuuYwY-qF4cv6PGl0)HgId*GZ-Y zJ29fcwGUU}W+IZ^zeRs>;{z5Qb?4B4+h6Zg%mct2}Yxj~U0!-a{hyPZlEp`1gV@Rgzi(VuR zAoeLob{jR7OhJ#shi58_9tx9FApD?*22@TgH_%{--xsoHrdC0cPa2A2ZBaNhjqyW= ztA6<)T_`W@_ro6tVw?Q<+>i|VV9%5BkIz?}nGRV%I(F|;<+)qrUTZwxisn?o|CQd3iZp?`b?3Y(pPqoK`xGd?H7N829A zOBgQPq;*D;IzONkP0o!fkH!(Y+a#D_JB<;TnrmuyKGy_9(ja%#sd*U zOOW0^Mj6eHxrGH5%y)&5;6m|pojqXDnTx^tdV;cEC)P;8;^HH;es#n1CyfgpFj5z0 zyEFS`+6rGjbcdd7KrdLqL|voDS_1ccNU0hl84l2?Lqj5=moo{E0~kyQCBy=RMtMI- z6zB>?tG?RSRCLK(IPSYTAFrr0&}KAtDsIW>>V+MxDUs5IwupeEVqMSg0_X?zXs+BpXqY zJi2I{HX4T^BD3wm1$0*kjO@fcxQcEAirC)0qpS#sP-x|8w;!cMKxnKmI}7a4!u8_C zq2pKt2$^L2gKS<}*4Eh@3a!<3vn!j^Mp+Wy44Q9F;iUx!B0NZ$G*)4R1io>myIX$_ zEU-j)h)l##m4(r~g9@V$>E`=e-DmW#oo|_4k@n*aW1;3to7`PaR$Tuez{FPMDFQvL z$eklD+$TDQ(0F^kMfU(jDC9Fp=|iMHn@B6ptfTYz{R(zc-&&edTJUv@x6+HZ$^!%7 zPdWBkN&5A{qIa~1_hC44B=SfDfx6U5g=I4y_ssZ!NwLX_XFT5Me z6UhmtUSk$WB1E|u^UN|X7B=b&1-!IQw0_U92Mzg#o#slBM_RQmC=+~R+Uw^)%fm3l*4$gy(vZbOSVP~iIQ&aLumiZdx1zH%dad5 z%cQHHej?IT)$G!jM|%B!e#J@qn{E0GdWajKxltOR6861Yi=nQI{P@jN>2Ybx^HNu9Ay>D`Vqy>-;n zC*HImy$X9d(FZ0O-b>p$yNeRBEE1=611hrCHo0-G`tVW8znOWE8YsSKHMZhIXcxgvZvz|qC!(VK+ zv-cIFQ&T5~J=eVBt*XCy`hcM@E!XCP{uJpEutjqNSl2uG19f~Ubl$bqIO41Jrg>07 zoN*9i^UVu}KEiQH(C|Nnzr!6>?L+ski5@s`8ETMSDvUoiD%aoo{b3{diY~QEQG3yJ z_Hz-toz#PeNwzF8Qg+_^5{AlP$BYk!Y*`;Yu4cS5vJcSj@trccJKk#DJ$u79|KIXf z!f~8Uvn$A8wEC{JzSug0AK-}W?TIv2>WswE#VH`E-U_WwM;Xb|u^smSTvk?^91)^p z;%Y$klm9CVpt?{w)o8mthGGt|se2Q<7JZ>e{zap!!mYFDK28kEw4G)-sc?&ay5b>J ziMzS#Z@ek`EkSyq6tQ;imQ`=DN1BpJK~JmkOSgxf;I(J&^AY8)fkS22jN)(XB3;iE zWu(qX8eIgE`f;1zeP-$mg23OTVz{T&*CTDOXIi=-?His=D!Kr&rxm7tc&=SZ8~sYT z%i>Ebub4i%SmBu_rup^se%d!Ub_JHGBTVU1ijubh8KqP@Rg zaR$K>s|Z%s&Dnn3)U^1(=|3T8R9nIImr{F&hM$)I{g?Kj+M#JfXi_kV3<@zQeeUl! zNdg-C&gE6qP}yyE#X1)*qD2J`AOA4-v{8^uM=)15z-!>7I20ynjrznZzy;xd;A=Gn zYd4K_ji(6D6Z?P*Tpp#-ukuLdl{J6XFDIK+T&=;SM*}Dh7#wQ&B%wGMMWocHjvIS2 zpmW^I8SayOjJ(-sd!~!H*WaJ3^ZXG*h-#cb1pxz5kS;5AVid}k8w%Wc^p>9>Uhh&s zP}3r-da9()%D>iT>)DN4@Aw7R4=vBh#M{(%G=6yrHM9H6E)Q8fC|gur(vnEWqEm=a1Jl!|V-R_Yy-5ly2?yQg zLv=&bADV+oU>b+Zjc(s4K1E2!8qiWwVGDlyVqGyb;770@X7#S)e1$3Sw*dc*8W%2X z=cTCkbbx%jX=F2&q2j9MrX~mNsf|pWob}>i39ZwwU*80;7o}=NU+2>cZ^P2UE%OY! z_;a_(4PTHa^{#1od3l!V)=j$y(r7GP5(D8j4>nQoB(AqRwSyj(h(t*RHfRJfhlKwY z2pC3DK6T+@A^Ul+u^fVj#Z-o1I-~KP0wpW_v?XIUL}j?ld@xRi%YT2i^(S(Gjz@xk zs>M(oLo^vY)k9PGS=PT`M*VX}Sei^h z`qZ`jeCYskH6q|u;n8}LJra7Ac>fV!BKaK|2xW6XuzY+vALu#BrRpp>-?N8EoIU*A z7>Kc4B2dKLkC#2r^>3XtqG~?FL8a{o(Wt4Op35K_4b!J4Cr!Piw%nEq`}?;^wBmO+ zxXGSPR2!~{un9;O%{-6sDz0%eaUDw!!DUmztxL zA4y&g@u$oKZZgM@0%Qo9p5ND=-Z*TgBUo-={6ekcZmWtbf+uew7y*qy{h|KnL2x)ZJ!3lxjRf!?4<6l~7mTXO#n)CV+(Mb<` zC@kF$7ukO-A?xux@Ie556%BpF6LTlJm(i^`f=h_)o zdPx(R&Ys-J{KEN0=Nf-m=G-!j);)*af1QD{4GA7j>-9=&E^s=D03ylF7%0!m%K8n| zyaoL8X+iCKe|D1oNt`y_j$j)&o#*8Pg+d;Q(XpX7!1*6g!Zj^Q@94wIGUx|>73v0 zFi?if%rgEnfG{FnZ59#L2ao;SxnqZP_^v}wRmmGpv?>yT(ufd6yuz5`+tW`-sao;o+F8i|8r42| zLBWa5Hl7Bu=ogQiDUV~aPFc#(bt3|E7O95=tB7PsbwTjT8kDOy2>Xt?x%oTdNabuQ z!jS$zC$Baf&7~p)aDn$(mo=^fSCs?4O_ugxschuocD1)NqcG3uz5f_S7!Hp-UYlBmr;M4fZyg6BQ^4W&=UC!5M(Tmd5u3IWCx(vo}H|$uL-_&02AuJW$XfJzg^4e0+#@}quB5-f;FbDR$N)1 zO0IKCS+lU-<>5FCbiuqR9^*^5h0l zE(~vm5-!mNCThO(Zf)vB{s-||?b;iicd)JhFcjtH9TC5yT$l!h>ay886eb| ztJHdP9%TCXU)4fD6zFD()07aZp2j#Osk0VAA1DCYZ8h+;jZpd*DXEDds=Ic1k!p;V z%@C{+-smIoZ!L%`(KjJ3&i(S&s@+wnj{v~WdR*_!Iec7ox8k5i9!i$&(Wi z+=@%HIBD|xf=}mnX`}lViv}}TAkaTB`?ptSNZ(R^&0F9Up^=rXpMT&(Q`47;*~R(& zR|YBc^SIK|3y(71=I4$yD0%)oHsA+;``c#3y7HJCEAcoKcFq(#0cK9VK zrq1J-*@WjbC(wAxP(>mTsovdQ(X-()&;pO$3N7h9Z1yXcP#xvG`)5p z1G4QXLLENWedw}c@n&6Umy=t{@musfIbS~W7$a{R;$>u0B=@eN zD(=P6EIoG#*Pke9stk(MI8kB85HWp4DS$&%*P#y3nj-lA0q%IKZA9B; z1;HH_Am1*TEL?w6`J{gO1*7s zLX*`_tBV*acGDkC?{_@8hSZKch4qzLUxa&f)Zsy%%}C2CC=eS*#C4j3OtLCuqzxSy zqWTkOK=JwO=kIpqflnG!WH;sqvsv86Chea;%YAp|?f2sidJ#D=Iy(k+;3WK5XZNPM zwO5nARWzF$0Zl`Jl)pw+)ZR0QbUhM9wrfyR!>m<;kiqtG$TKQKu|>vd?U^9tk@E7p zU@dnbwEnw@cm4{t_#J`XY#lZORHS%YDPw0O9p%IIHdzme1t&I9AGvEnmYF|e*$`ie zhIqGH9K#;&Ha4SW+7(tpUl4$34C5J`6xNkU8+~V8_RU;BbDOiiJI|fVV zfRrRcFz|2Sz286ru(?KR8*;9i?;Z4~-h{~4uU}6>SX#Pg##4ebyb8U=m$e0BmZK<) z)EhAG2149)x98W40t5QmQhHtYqKVuA_{o9HVxYM+sAfR%>B8T?bj#9{(s5clb|Zt) z)Q=bLPA#U&zP|G~BcP20$Byln65)>_ci|Fz`F;f57-DI94f)i16~uz zruM{CuPr$o0yguXWsO_3>>CwfZsUXNNHe+)=V*NDzHeY|jgN-04@UJohY|#ous@VF z!7Dm={}Z*#B=L5B&E&FD1@4nR)+eTrMOlg)sviyIVpy$KuAm}Z`U;P+ zNc@AI@h-X%p~=rB`PRgd1+D7UCts(gkeEPB8KMct)zt0-rk7{ks#kweNgKsIN5$EP zIRc0Mn5^P(+d;L^ zgw@M&TVO3)d6oja-qKk|BTe(V?8oBc*=#Rex{VWtyWVA|X7uxB-a7of20kBTM}>CN z*F*LY`qq5-eH0PC4<^;$vWj-r4P`~aYL5&a8%`(SBlT3}SinHlVENrBUR|A^%>{8) z`RoDZ(N?{BNOf25klMHH*quNIo&n_c$VQ1Dd!i4iCYK6hKj^Rk@jsWKL=3GT@)tRT zNN03Fpg>vbSTH0RWKH{nbjiZ4_Ia&V&tANkuYf;i6Ns(*Lc*K2s|ijaoB0b~&%Z=s zsng+)#_$`yc2O8XB|S$C?FjniTF)ZN?CRC4flVV4R`2i4fBtNY3X!O#7hJl`h?hz^W&6 zi`N~Q?CpwsH_y$V&F@l&@0;y;B zN8n`0gxI(3@U(Stxi{W4+|)Pf!lo>aXLjhwZ$}lteMxYDL_iRVB4I>ItehB;Gsil5 z2N$Xl$F28{e!Ozkm=#nSq7gs_W)Z??NbT&*;3z~c8e*UcbBZyxxsCWIBm=!Bp~y~e zv*l9Oiv@upx~ML7pR^=YI?&XQmh@@{M9zjstENUiS4BB!@Bd-uq%-;!4(hw@F1Ar_%EE zs?{`TVD~}jt#mZ6V-PYV+v9>Um3_W^6blkFMp$IasEkT8(z5Ph4qp9WgEt)Jr9m~? z%1_^;M?Hi44Adeq6U+@?L&r!Y45bQF$}c}zN*n~r37H6pA$y@oQbJRX7al_~Nr=48 zIhK!b_}6@lNjx7-ldWE)42=q;_yfM{tGf^aG);rx5-yt0^_%_qP?Xx4DB*x#U!c=| z&I}Cdp^5&AQnISfd^r2T%yR?wEdK?i^2J-pxBpaD%ROFVaNgz4mfB}9W%}fQYWDF99us@X|mJ5fFg=&nbG|ZI>u!5SmW;7B}H%H zvw(E%^hvn1o3Ouz+Lye9B@Sv2RS61)I;j5ft@0i1UO>K$&v#UEl|=W}#K$n!zkcEWfx=Jxr#Xu_V2104paMA*Zb&R@%~ z!blgAxf|bmi$bda52AnxMRhNYVS$olr;Epx57}Rkh_RroB1kV9?PQtl z06CR2bnjEEd>Zym*gfNu+!D`Ad*oMj(9pm8-Eww!RQ}G-r&Zx8^fq{6EG?(1CkW06 zDca#f^^sqp6l{Z1vlbIZJnG#ek#xrS1+yDdu-fL91@PJ8ts|}zo%SVPgN+2C4IG`V z0nL^@5D65iaXNmC8R?YBYLp(bF)&{a75PkW6G%j<|lt7tBpe9-5bMHf{JKM zZ1Ej{L6@=OBU5gyBQJFH=4l~TZ)dJn$T5Uj)n((Y3Nan?dv-H|s>6we-8AuYpdT~0Lh)I6v0ZYAvWNb_h;3TD}R)l%*@jq2}gN%q&` z&AdN*GKLE^vTE>EID7@5G>bDussNUqeu75Xk9LUmkIFEqLnYS|LzabX_muTd^CwT9 zECM_(w8j>sN-QA((hl9fX-wEsOYtA>5kRs$0ZxcXWFBX=sbBJ}QyedG*@0bhgm9!{p=Vu@9;OhCB4yH`ok<#xVAS5LWu* zWcR5yTL6~Rva3-KrOPN&oEo2)*xoxaFZe`%*TV9uKxk-a7i0uY<8!~%cRxcdsVvOS z2c|yVr4O2fYCi6MB>ynjCMtEkc1}R`XG5M{1QG*fnt`{s_cQ|aeV+8`p;+>gj?M=- z2Sh>4&(6&FDYPbFdD;nx-f(ynzzCiq0l*2;T=d?N9DqB?huv>lJOOxDjo0mqyXwh+;f%x?VFuwZ;_OmTf&SlEWAIQwShtH~Yp zF6Ss*Yqju^IQ{zlJ62K?Xyu<@ZZBnG8lGQ-Kz$C+2Z@B%zp6J-3WOu4BnytInbQwr z|5ha*auNkBmz>ivW-JgDbkyx1J~&-gY1_ysvL>?0LNQxiJ)WC|qI5!Yhq0;>hM;sS zqtAoR_wZ~_PEC~}|9D?A%yP!q5RH=tpVuLKb{Ct7;mzy@g-F^QJj|${B}QIM@wd1Z zF}#L$g4+fHdjcv3k?hL*n z?c*r~Id$R)uv$8w3+RcEDGIF5BvdQBM3ju(_sSCE12JGtA&+qk$@D^6Hb+u!AOzz- z@Ihpy)CT0*-RT+M4Rk5~j#V1(i4H(nK9vzDP>Qz-CBz5y1dTZ!aChP%AiTqAqZNn_ zGC)F0=c?_io980~m(Z8aBhqq(wIjD1Lk~xwq zSpbZfp|gU9LkQ<^J_cVKb8}@mB@FsHd7&EoQImXi8v*@kiPL?l$=$wpn(jM=9)TGW zsOVHt*#<1{q~hEe%^NpXd7o?Hj;{aNmen)STRd7?6M%961O}R2WN}AYehIO+BedJW z&H8c;5DT}H!g2fvPyQ9C#~S{c&+wo+`~Ck)AL!pJG|ax@XAX|F^uf+|vCvQf2cfFU zr>9sRS7R^g>$9zVU0*dLOdUC`LGQ}3%zGhX2(~_uV>=q0Ua|z&tstP~26Qzbf&4K| zQs$sDUN)HtitVzWLuH3k4bmFc^_CLbRAtM(Di0Hx3ROk8e>G>SQ$2qqnwhvZ?Ab;D z9x0cXNqS{xK!rXvF0o%aeNxfA^i^&YZ;+*ni%b5ghnBUog1pVB?P2OB8Cr&c^NK8w`a$h3nO zHRcYK_RXYznTY4FEvR0T1C6M0TebG}Yh}U))RgWG4Smct&<~F)EBgiIo@itp{Nua6 z;2R3_K=s;Ofv@yIx{ZLrK7a{}VWRf@hd(!6)c0!jSEv5Mi$^yhzcO6ozg}PnLqaC5 zv$LwF?`CH=WDQosydg)#OWlAUx*EX_+a;_xz(0IRgCw+1Bj*%H!W6vSdO4>OJICiL z$HHh&3a$WaiF|PCU*~X( zc&jTz)Bi4&XW@&0H>QgMcUdbYZMcVCBd!dpCB!O_)%Cteah@QNwn}t&KxXOFyB$Sf z_~fA?rxNG*Ac2IZf)I_YJS(|I%$P_CSu2GuJ92I8r0?fuaXQo&l#M^F_=d0Y@FD@v zd$%M>cOa_hm+}Ug664))6x*Uv@)g)OqU#Ie`;C1S#~9UOu`h5jz_^<~;yJ(+Sznph zn*pGt?9ZERd|4?}m^&_>M_p(g@Bslfmk?^8_zTkiaz|8^j{?cce-I<# z?*ojd(D0HIg-a*o1Nya{G4~&TFN&y0w$KXzAWik8IMwSOyFy)14={A$CmK#Qf)=1s zfV{qN84YM(9FPRJO!(;N&LUWxu+|}&`{gVMOUh1W>x&NitR;{{zO!XS+dOKN7WGcW;}bwsKCweYOebnBF-PY zL`V1X3yc@77me7UX|8cmKuoG_ycN;r0qpoyuGx0dAp%`~gs`=e6*|QDF7T}Xt2cO} zKi&j8b@p*OksuCT7;tiCRU&7i>hrAsHEKo8O*QFJ4?7MTYvHVYJjMB}+T#+XLw$I%><{ygbhB^)qAq zD>6*RYX_fADlg&s4MbwuXIvr?_gFz9g3I2pGRWXdqE-oL*5}re$@y}bPbW{(A&68c z23}$*xem~gmj^6IDiZA6GSw^0@~GeE*)o`4Fbxdi3&hWW8^E~ zUf|OB0)m-m9lW0?5W4TXxnU< z%h#^g@4nWz|K#uN2`Bsx546e5bI5l2ZVaCyG6wI*errR`M`x!Rj@G%j=K=PR9ZwRi%m8l>g!D8AL8&8_}}3P>po(YH*nGboG^% zI2QM0=-LKeZ$(Ye2CyJB4QKs$-{TcaOBfRppyj_y*6iu*yp*iuyH*Syba@6za>tFH z=pR(3Av}(HhK3$*p(Fd-gJc@2MWf)i7M%plRe|euW)BXiMz z8M)kx{b>BxFXMPo6V5f9YzRFjDoY@H*Z?j48PmI0UpG{*PB<;gHjZ68mWJulEZx1^ z=p+%ic@F#-BxE=~5w!9RSVk$qxK?{Zr{;)m7SZTsZeV}i5cHft57G|gBDva}j`)Pt z9v|IpJU|azaW<`oX=J_B-c^KB*a@_UERJFY|4Pu{0#YXs9`y&8f^^{M;#Wlk3RaKf zk7XMbk2)qaaxC7B@daAc)a$Omql7H+4RD;Y&{E3<{Gn;Xlv*QBx5NErkOw1^eIlbv z&Z%IeBfM(%9{KS@rWG3NKm=sD%Qt1VeS*67Q$U}XU3Qiv>HAt^e-m}+%USn!CFMCyp! z3se^+kt zW5hXn%B#{xNxu$7VpGCmVrCS*4}xsV;>SxJG31VMe1GV@T#!+mN=rYp-s7U7$9+cxeIauWIjDQo zWia&uE+U?<0fcl!Haka06Mv>6(8qJn&1c@oqc+pKa*m?To9n2f(@WREhf-6iIDi`~M$D$xE!^=_df%O~(2{#Bp_^{x+GQ^V( zeeOAQ|BNXINS34Y)>kch*iH7lP}DJGZRG8V(?T!8|JN%1$Jk@zXCQH_FoL@0#n>%Q z*Tl`w@|JjO&9?e|9KKrNDZ9<}r6Y>JZ?OoZ=IcN4!%6+{GCm7;*CDlsXL2FzzeWU0 zOk;81sB?JHk}~yb7KS!Wqw6r{3CB08GuCY;ZFH?iahxjH@%ulKG7iwvi`sIRWA1q7 z4MHb|zYcm@q9P3Xwg=?V4s=DjykaEh6s{b$)@VKkB`qf zF>9WKq_6xSbFha*ar+qWi5nQo%+MXRGRK3k|53=k004E#I&?n{huc)`ug*&u)*(-y zIzqgNNUCRzKeSQV(EVe6exAlQX<#eqR>rV!t@u9V72?6(jo`Wh0DXl`R0jmW^cB?& z-vsX(^r)^Fi~2Nt+UwHA#nhzNMA+YDpolEcd=>N3?vv%;gAo*V5*xMy#(%po|E~8D zza9@+xsxrjeo^3n`w)d5{Ot1=FSw<*08V-UUjOd6f(tmIIeh~IhW8F1Q4)ySEyTI$ z{vn$TnAf_jB>njD;}_Vz#(}6cY>P|H_%qqS-9O#f%cam-p~qU;>R4)k`&RRN;tx-5 z=)b0DOTS!(&_uMY<{`qzDow@snZj7rSD#{`Mri1nDuxf(44y#Tv;aXWSQGj?k1u+p zttSnYwb-P%yi3L4^wQnjoFtEjks!rj7A69XpiI&F5Qh{yP#ZF`a*v9Oi-{xsEui)X ze|}~~u4PqMuczt?b!K$g$4K1JIf*}KaQmUYyWlHZO_Dd%=c3?L5fSP;8qBwE-iTCd zhDV-n#p&LPKUQ<}-{N-@yKe{X|G?1TFpN02wt*Q82H$X_x#*HIUE{to-DWgOqzre{YV?_DRY$LugyS@#)jEp8!N2 z^m;IgMwdT$0FMGq-U_teBQ20<@vI$W^i@h4+XXzDuuIk77ka7cHa|k|V?C~fU>xMy zy~xYUyF}}4EvCY_n_6Y%CD>^;-qf+BvsEDRo|_h|BNpu2UvSaAiCcx(>3;1LJ@3(m z(bpB~+#Znq1w_6Dqh_SxY0L`LK+>CkSPLtp)(;ihTxx{*!~`QBkC@ZZ+9DA&6d^W7 z5;e9H23f4(8WT0U86X-VF!d1UVojsv-RN$3q0pG@V69+q-u!+LpZ9wYY`T$+{8WoM?>d=6xZ4xUNeOVhexT1e4J!{oSZg zk}?zso<9+m$pG1bge(Ni>X~}aT}QMGOC3{x{$^$m=z@Y*iAW1FP81HgP9*i!MAiTPmXa~1ufveabFN6<;e9}}&2;bNnu4udWy&RSWUh}d_a ztK}BnzyAvuQqP0Q>EIRLg>m4Xh_Ns68pTXsS^y9u_IGJ8up$W;-#bY3R`8U73-^y# zC0v0>>1jkZB%%c*ShvPm7EM`OS#5_Z@G6$QcjI$738Go6-_yKyNujR31UoV!HbB!L zvG(ok^#dn5gv)CQ13Er{Xvk3@0w)3sAWf)S<%XX*Rh8oZ2v<>jPZd0INXEbwHJ@() zqb*XR&C+)u&t77a3Nh)qpF5X~8J}A}m9JJDkw^>#VH+tuW3Gx~9@7G`DTHxWS5$cG zW_!N5y=4~w!HP4tBSL!v+)kc0%{evqox;sSWj}!w%g%r!86FyS9MIb(x4ht~L)GXb zfb59AU@bZ^=2;3xS@1t4%qW5Ml1fFB}2A`>*j69nEW>tn? zo_~5;!WS_rvR7PPuNI0VXWDT>zuMWsQY&tV5Z^t3qtf;jHHQwNuf>qCPZ|jJ=BP*DDd8|cz}*q+ z_d*1>&jD*Ki3D~_k$Bd&X=F{CKvB=X^R`foH0O5QRv!uFLloIFii-n-)o%Fn)W7#) zIY9Lf1>J^fYTMNH5PY2bnUHtbqp^^d-_X=_V4CRuGCX^BZZS>K+c4n5d~)RTjZNPv z17_#WEjPfrk@2XYK&c$Lv54BxfenK123|Z}q1X~U|AF#yav{TW4>ht119^kIaq#_e zrig6Hdh4ZxfH#2RV0W<&so}!+Z?WF?K6M1?%sWW;-pDvJjk(ISuG~8uV1jz7J1_-r9&}=Gn8Do&T zAN?&7x@?Jz^!jLXWu%aLTC?rHT>JY&Yb!%;1^3OMc_i7PusQqEsicq0gv)mZ#^Gw6 zw1y(%Cxt}Dm>n3k{RrLqx%2qRx>MCSSdc6O<_sww{S`e{CB|QH+_R^*9u1*42Q!k` zGcFB~3JnrBi4Y~Qr113MTf}L3W)8=Czo65BpdkvvGi4A%d{T&Y=`a`lHvVDh4*fxj zC?D++9u>w}G!Alz2?;r;xHj%{5~r)xW8DNUI}o_d@f8W-xJSZ_v~-V7Ba!x$9ct}E zi4AN4QD{C(Sc}}6TKxxFYV| z>2Nv&2p|Lx?As7HL_ra)(+YMfpORO%nMvm0=e83+ zY$b^NPro3Vk2#H<1l8S}Hr{$&itqJ2MpH?&G}cNsT?G4a9ziL4>|X%%S8K4%yzybYSb>_oH<;$;^sw2E-k#fINMwP0XLp{Ytq zN%;ZU6P>G|x{WN-RRj3{B35bttXHK!ohGznwsv+dl^D60ABT*364Q%0vO}X)5}tMm z*d~ddATz549Q>L8`0;Pt$ILYlZQSiPf;{};8KOQ4lcqD50f^a%7}az=)*XneA+!Jk zkSk$#CaS=}_xt}+P&b@GFf*aUd|h;jjT9DN>(Fd{1$?aiD9#{V(l-;)ov5d}rIQyE zR0TK8@hY@|$l|E^!eVe@`DVlXEAw;|{PImIC(S_x!L(}JFbYT%0J#o1%M+^jdt zf||#HMOX^qpUbERp|E@i)_xQ3+o-E zhX4gWt5n!5d|s~10<0dzR9jWjdx=}m(XPb!({no(5tEm!7-5kU{T*ngX!py;FgXY4 zk42e->E4grLstg$JN)=a?f$@*`^3 zfy;pGMN=|=jZ2E!kB;tcnFqcg&n+bqn-g}O5^4I52%PkQ`giq_JnMtFxy^b(u22|h zk9ixr>0aDf_x(sHZahZLOekPb*IPl^ z$Tuh^QjP`Gp+XqdgP`PT;(ns>2GL(Oi$uGUos-iw%TJpb&R|OQ6?mEC>KG< z&qz~3Es*LQnIK5t{1AMI2=5wPi#ep5u{N|gvvBJmp9dB0u~foP*YrY9KhlTI{raL4 zM)<3Qnxqx$mX^rFpTFchLMLpcK0`ylxB{GGJATc}7zc69;B;q$HcV{#pP@*69}Huy zv=A45Y4t@$Sk*PihN?RI`kG-c-}h{Cb`jAwHJBpki0aa34n0qA@lm}DQRX#=@7MNo z)J{!N$zUsK{4k!bnQts5G=sd_?Mng#byEIawX++OCz5e2uV%tGuli-mZKAdvZa!A9Rkr|iu0c?n#(ZEwC=ziWcGrq3mb#knKPY6 zhKB5He0}_lp}BTQl>nJA@egK&wNAWZB1-;9I`;vQpmpcpuj1-_fi$q&mSj8iV15Eeax%~~FAU^wz=_nmMtn5#^xY$^? zek65>MZj|Jpuo)&+qHASABk^p%3-k>h5D=%k64WWXq|r-0jE4|q_CXWv}qH!toIG1 z0$=)CWukUW0sw$Fl$%vQMe}c+xxf0gyXSqi++LFwyHvwbCuQyOn9e6Hg=CbdH8UQEzaqOB($(^ zbZ>JbMB9*lY6Iy3{(HOvl}Lri%x1)pp_TzN9$(b4p!Xz}*4ej-)pjz;{gB2)U)`Ef zSg2<~t-b#!Y%7F<9TOt#TpD_3PQY~8#44`@F~~ePj(50Xj}z_~Y(khdV>0`Ir`tOr zv5j}@jt-D~_QQYZVcJK3#BaP;G4~G=s)4)YEpn;!ke0${v#VH=%z=b*?1>!3L+sArav(%=r zX(Q`QvjNr(UGhAhC>msq!BM5ldX|w|Plk0X?*ZP5r)A$m3|i&JA8*fW>wr%i%mr~7 zKYFC~ITRMCn_1Y611+@F?WD_+l&Cr2664QzH(e`dV#fV zFPsODzz16cMWJj>!Z;jg`UHG|M)Z>efj+PHwKA&`^9*$ zutNs>^D(GyR9GYm47xLV^3v1z9BAZ5lFTB!D<|P5<&J$z_zRTMDK6hR^<0pzgHOyK zG%yd`2nU#sY=yKeUq65G7@41g5tlO>8`(#;ilQ~5^WkZlG1Y|6~cyaER@IS*ItD)7$* za60t-yJkSfUBGyDYBN-F70|>{Hp+!1#K%WtxIXnQD%XxOmK}3HGxNxj<4fO{-+_4* z0F&5l8TNl9T?agu?cTR}kjRcC2_b}p?Cd0jD4UQZd&|hkN=P;#sVF-kSxK@}Aq}#N z5DjI#-}}7h^PbNc?|Gj1|L^;{e!uSoN>fD?qWm>>?M!z&bKt8+&$pjjkKhAUe=I|$ zlhTEgb0Z2@r4L3VTGKcRH@x9Q(HN}Y*po!nDEH%YE$_=$-fp0Gk|Sv9B*?V^ew=Mb zH<$JgxgB(O87U6x|Bm`}8K5br2%6G+{0`I8!JXL(Q2;zSB*-Y1$p*sik4qOKQ8TK(*o{^pfRyxK1Lp`Pd;S; zV;vy~i!I2dw8K9WQAjw!ktHi7$U)EG=?18^4GJa*FNhC%dBi@6xbbkgh4(tPV+nlF z4A0Pg&Ok+Z!0t&t@*inQ#`Oe-Zu30%lm@aAhLaWy6MAHyLA!fe;8pHw*D$;PuU8TxH$g&`Zgs8LDGcJ0jVrhNuB%U z^bmYWn8R0LbZS>!XvH`4476J4Jp-Y~pmGs05EvA6K(d0!901`<3X38!Nx=UIgHQ$B zh3|P1H9gh?2wtXY)Rh#{7u*FvxXuRAHh}TF z9Hba?uy2vcR}N|#`Q&5qbcBO`SlYJkDvVru^f_Y z`~9iO_VVVHf9FIm1U@MJ^!w?o!mM0Bxmp1u4l80?93`BcTyzczWzdpuA8lUmts@U7 z+3_4I&GygLjXjH@js3ILQc)ZS`E7QJi8$ANyi213Txtf+;*%R8v>H}dR`hU zHDt%`$PXtRTA7)g8ChAFMPx3Dd&%ZR8r@$btRY{=;r^bRpD)M{cvQdd*T2p4Q8N>V z>AOF9bneMNWL`C8pTa*0)*mx@7{EpiL%GhCFuFw7_c^RJ%%}eiiF4gZ9u0o<)ybEpy z$m^cFR`%x}tNYgyPJWSNmgTULl2rlEr^~iJkQJJ+o*2D}21s7rvLZnFyQA1KD9c_9;C*y-pnR8kTy> zjmsz7HEHiycOG2}eJip%u?>yUPtKsS7{fsqdrWk67ADWSfwJ#_{fVLUav%Wz?JukA zSHzRG9U(C-(!gdhQgxn=NSSI;%OCHDw7?%4pz50yAkP=T$VyJ%Y%jx;!7wh?tmLk1Z{MjSd{hj^p@*fM~zzVJThQmEiWtM#*bv^ zAfjf-qBsc^&jh3?wNPo*-_npu8h-mW7r&1ao)|c@$dD+CVd?d!;yK>jyu4^w1=^q< z(F;__;{t;EeuTP0osSdZ4$#~eD#%B#qt)(!j;GZ=VZfO4L~m=;F;u}~yj0o#4vZgD zhygC^bOi@V&V(kdDbIig+<`YonKbxBw*QuI>$0aK%64t7W@L8NL@NG#rP+e{Q~wo& zw&kgLrNaA+Fc4k#Zm6>H)*!iD`QK>&4~8M24{_hYVLcrc6-(zTfAoll57CSxaM>L{ zae~e(m~YOr-cdk6;1!2P!H7$(@Sv5N9qzQ zPCQ@Dh6{;8q_g$I_m|wn;sdcWf9K@pE^{369e#N3w+1H6jQ-golY<2LtA^f$lN$Z3 z?338|_uW-<)>qf)3SNRRjtGoFr%^XEWr{YxJIp-~@GV<*#vRPWidz7lH{c9{EWjE9 z-9bX@PK*x9#0cO%(MAdQ11Ad6>4oDwnU%d`b~RO0;^n6|Z=@~Hp4AoP!}bb-^kZy# z_q2Y2LB`QiT(x&L-_<=c*=Sk{N&3#`Rc`@}O7!5MVb%|PHxyS}VN{aH&o#bv^Cmrp z(g_x|r!g@xtrPCJms-Hvj?Y5byPHUUCKG^CzX^TL7&)NJop)34lmU6Ohe(-0re3RK z^&pFLd`H{)zQO{I(-^pVCRgl0o|!YXVPs!5J3i`a%E1sbdpJ{k?$}EQ${Qh z;kW-{4KiE8MqQ&p(g0a5m_6yWTFjAcgtoOZOz_M!qN-#Hz^#h>AZG8y=G*s|lE?2&F zi30HR@Apy+jxy3LpPAM5u$Fl45LQq`Z}8b(=H9zk+-Xq#7=$0lB;kOj8i$ME+SZh3 zeKbm^-Y)!;=Aa*f0I4M#p_6HP0+4dSqgy=50bAfX$oj)F&SRLi`<9Dr6m^;G+>P|m z_4M-Mh~9+Od&}#WoyBazRaE*dPE)Af5fK)q(%>_^ad0kGn?DSdwcXRN>?vc_`5>&n zfFOu~Z+{7!bpVXFm$kk%7Z+3hTKc?`Ej~)AG_{ML*YGIdadZ>^1txsRPST7fLc6Y} z#v6i%1_*jVOJ((H8nP(K$e1e2$z8A`wP^y{z5T|q8p#6$enn%P);)b@^XXywtI5es zW>pUV;i}!mD*PPcpVKcWcsaj$mDSe%v!rN4%y%CUMJFq$`NFK^0wUq-p{Km zD;`83`0zI-=jgth<}0_M)2xCQp^f4cY=<-m9~a^=R37Ap# zo4YL3flp8gZ+JzwT=0z{Cgv~$v$?Iz9V!fr4-+%PGw|upB1$$!VjA*L&ptJWoGky4vTA)$>X$M7W5l0V2kwIrO z+U0QS+9IsRI{}*80_f`IuTt-P&88>kOOpQIO$f7F(L9GTar8R8AdUdB@ALEb9gfH& zC3ocxEZxYWl>R z6~3*kw&UM+B;BD%Bsii<;d{`RSV5kDgtbncmr>~2tDq*Ud6l zh-c`3TA*R%Jkz%HyOefBr=DasB23=}x z9S7PxxZyXYXJDA2yi#da<|oS?$kxWSFh9TY5j`zyoA?9GYF$_%)!u_hcS2+qSy_2l zUI@{v-P1o_fx)t+vW-%kKm?12u`vlrj$#lS-gUy|ilk&q?%T~fqtp;Qpno`CB3Av& zWjt#?!MIM!>gnsNSzGT7^fQB;yc>jZ8N)ihi#{wL&D6a;yy`@0YBXH)?U-$|X3vEj zSd%?Etkd7^D9Pz2lYOb(d|Bc8TCb}xK#V;(Iq8LwDE-WMU#3(^ zD3K+_cpE1$(!*JeMKxMai=~%;fUF~=y}dnvPX!o~Vw!%5I3aNK{-L0x#DHPpz-#{N zlhZw!R^G()Xn|*|K!x{)YOI2=TXHjxRP3a?EN2S;>9Th5gN!tGdR%aXkz>AGF50_E zgNewY+8oNkiqP#VU4GA2b9dkMtThm#Kdj-(cz$4Vh2)2#y0L=HdD&e3RkXO!jr}8* zEC{j~W7>82A^}>T-Eqv%<_U=XPH={=IB3dWy3{@x@LLJ|Um=12csTW3=7q3r1HZ%$ zJI(CgyS9A4J32a~@T+`OR#M7ylr-P^#EQ55&K(MG`Hv=s70EvO^0_l1I1RIV9le;U z4L%{j;QE&@Ur1}%Bs1wjL$ndGe)zXo4xN|d`ez$obas-H@Y?cz2~O%fF1b@Ly<5Z2 zc2sBc&mVtF^fOzS4%%2Y1^!G&()smY#~Oa)Xhx>`1%?*vTJt{nMLs8B?TSw0jYbYQ z^?|F`+`2?>p=13tFJmO_rM)wa0PNtC4@c_E!4DO{#_LP;bF(_Xx<(>5L%iTfX3^&U z_X;~ZSElh6J*N^O27^<0a_Y;=ldk&!Z~_%}5OLN3yXfZD3!RRq@Y`@W+K{o|OEtE% zRODl%DZCbdvK)Xq$=^lcUP07zAq3KuAmTNv=<=NM0%p>pqocj_@@=5Jp7gK@jGuMR zxDdfBS@utRWqpGp@DuJq?1|WE2RvqBusw_F-ZNdo^5Qr)5^s;R+_}DgrLBB7;R=Mz zpXm>^0#7--E8_N2N8x)KXact$GBh-VU(O9_8ZYC6-tmA01F9X_KdZdxEk9d*EDlzF z1@#c zPTw1t^bcI@{f8=8g)`rV`uZ+o2}5QqA(wILt+wh-8{!KiIAE_PtIIso_2?ti6HAZD zSfOo~AX;ajM3y=gi7Xa3LRUlfYcsav3j>sZVDE}sjpGW#_;qAd=sfGW5g5=eg=N36 z*Kw%oyVNtpcueAw|L(8A0R9|`KuS#3u<&%ee5pcfRI@%V}q@g(5jN1eKh*Mc13Ru>>nm;E6znlPjO#)x{>B`Iw zPl414RubKzU?t^ST@F=qpU|Z=k#+G=!Eh=zaUekP&we*8rBxm4Ho7nU=jz^#@dK!& zkDKux?B8c?J2Rr|R(^*j;$>BT2v1VF`bFMc{o_79N8pj9a63=rDR3QPi_hvxF>mmm z2Ne^-sc3C%285ru#Q7fSeG_=GIlkb<+Fl|0_o#C@xdP+zcqxGJE2_Z)59sa|}Klh{}<%b0&0oyw$uY%jkZMc&>gv<`FcGY8|a- zT*Xg8bX)?L8ye@Hv^p$sB#-mfKqy8Oa(6J9w`ZvPrado$PA~I$3Jt+k!u^ahffk3H z^rR~^?e6F}ISzn!PtbrDh~WJ?M!Ohd(iZw*gJy=T!AhVw$3(PKDzisI!_dRgz7J3u zGLw9s78HalAwi1%;kBem6bAhVk@za6#(;xEyAliUO<_IrM z%4!oLqUI`$!%O04Yvz7{R=5z=Ge3U;e>WK0=f;b$fG&KIPQQ}{eOYFvKcCk+wk^=i z6qm%3$fPt3mtTpL&uv~&?z=lEbL2>UhNTNgYJhxUi1TO|$7G6eB!1C1D9<4%AYk1Y zr>X3F-h15>=xo3rMhLUu#4bp-XNVyWSK-|(wcdP?_n#Qt%uo$~bu{{E;E5Pkkl3wQ zT|X7THti4TRK~}L_^$eJP8#CT@sZCpKt=@OihM$F36dhJXCM7RuQrXS&t+t)2nh>&+H%}tMd(EJ=s372=~|>* zWKmI5pBpK(LVgs|+&)bDHeQGqdb3Y$Nf*K&{gTO2;|FOR(T742L-vk=fk6f#>=97| zmzyV|xx_{meX-(W+Esw-)_voT2PPCql(p^~zhnKe4_Q4ipDpU#EU9VT>W@?C=gLze z_kr}9dg0R`BO#WrW}>E@^0FU*>@&}0!gNmfvuq&nUmKy?<#1X!%|*a+w_z5LuAT{Z z*><}iu=}3voNKxgyJDw$Be7_&MA5Me zBZ=bV@3+p<&bZ^5Epv9VcolTZ;Xuu4L)5!F|^niqGMv9^TQ11J3SLT ze-Spm-vh^Yat_$`QWzj}DvSLDMmR?so7&5K;RDy4UyxCt2CM7W^meZdRhE8Lm|~w+Y)uY z70Rose>b{VPh%_Fm#a_y^?`&6?dzrA7e~JMK@^P0W@fbl3Dl(kEQb%aJG&F|X+Q!G zAwTeBbG~^W005@AF~|z8{`ai#`wXBP8z@A*89*S9BPR9G*SR@^s&|iz?%sWoKua&Z z3$cM1z8Q2<-ZC>YA6l^6BnYQ6gq1qEx{8)_@apWstULjNGYUCKulvCg5*cXRoyoHM z=n)yXye!eA4;Sj#)RY5V>6p}h7TTS#PlmT#T+E2vF1qj31Ap8`4^Zbl~( z7aCUB)`OJ}1w{fP<3`ki(sNySa)ACqTLOoUiM_pjfRr&2KS3O9aOR{rynufCuw!sI zK#JF^H}1W}9q$6E>WjcnkG_6&p&RS`DxlD`>yN@gY;&eiXCX+U_*bzF^gC-_sG zMcInNZvwr*<|QF5eUtj@%W2O?qpo5Hm#z44a9;)Dtz?gDYjxZ7zA+d{p9ME14a0f7 z0b*BMD*y-nIT&Zxu!~rr!7{h|3|ne-qF9X#HX5U8U@sZ9T0MBFW$sYlV9r+GPh}Co z%LXNm(cKgOX&83lFIk#e@gE{)U?-TiDz0n>0v&b#{y|PY=C6E$$l6l%s3=Yr`E5a+ z6l89_@RmO*nP*=Eg_<%8?E##`AK=lFb`Ni99vmE;!FnCYcFd*_JLey~@Ly6>Q@w+A z1X6Lv5r+wWekdXb$r2XKXUgBl1L{VgP_%q2q6RHyyyZ`r)w`hMj~h$*X@u2Xb~su3 zmLQzbP=d1TdEIf@>qx0HQQ*mcdjw~e6!_6p<{Aw-w%no={!G1+A-1@}lpY0vG+mFi zz!0z`qt`w!_1_NO6~4DVIDQum#U5;g*l2!- zpnlFhr|mK1xn9{=={(x-@%twXmg(9lHAVf{JCF@x>+hezAPtq;OSih&brbZIaq#f? zZhZG^J|S@xE%4+p6NB&FQ+Bpicy_<5-0r~p->XUEb$U45{?CJ`}gmckdh*Yg!C!_nGW_fLU&7!`w@t!x3BMO%Y+Y# zvAB~DN?pJ`aX~3xc@+tzhjk2Dc4T1Xcx`tQRb~&tWs6<3K0raHD!)7N9Z8tPnE}V` z$^8M6afSRiEI{CFXjEdgc@2rpyNQVjf$C8Ox`)poyiz6tZu_tRqn`B6>|cULM0yWE zNnB4oIKsO#z1I14?xI;v3$3MoYH$)}^0{jNp&Fd!^x8sILCFTnD_zWPdRm`9U(Cr` z4bX__hC=>Pji3x|90DUOc~`C>hxCL5M^5pdxJlU@?2GMPF3xGWT zl3yqm1R_-CY>0enmkJ!JLr{CnvflREVPa~^kdTx#dpN*A&;b_;Wplo1>2&@vzem!$ zV#mw)eXAhc+f5pZl1qpis-Zt%tws;=q7`6xT~! zRvQ+4$rb?UN>r7LjsC;c4RF>Q0V*PRT+%&$J;$}&0N(8`pafA?2gs$+@?_KYe0Fsj zE7Z>(yED9uccwkp{{U;{oN<>0Qe6OaXQnSVyHibvf7g@F$w79GWEwXl^Iew7-m{3) zoiAJ_f)~PCkcFW0Rg%VTi~WPv<`Ld)1-2by=4Z|v#TEt)R7OTd7-mspe)s<(%-|8M zDcj_{cVDfcnik z2OFD~=XPfGBr3A_hhUm+vRr&kP5*4FN4>=X4MPQ}Za{H;3xONt>IGIxgu(fro| z?C!VrZq8{nySlkO6H4!{1{tKOsYw#v1&&=xN$Jz`E1|d}+hGmgD7>L<47v$%eH;jy z5k0gEuRC0vBAgr?5>?KRm=Wt*Z=r3rR*J+FQY6Hod|hHzui4QlbMj|kw}j~zbw>3D z7^glvNUmp23J*HpbX=bLL7me%*+mHYh9T5tXdHmLr~|G#JUtS|FOhJzN5jw)8w;6A z7r>YYBw_!%_#g*1^3AJ*i$fgWp4D@Y5AkdK`0GJ?l11C%^{UG_L{*EK-wk4MDBqMs zW>WYGkN`48;`G6H*t+z)A4WhjQpLVxkrx928Yq~Od@L_d(t`crj}`jN0+KpYk6NLl z4p8;srpCd*TV@a6+5MWm*6{_C(+axl5AU9SaZ+Fi*oQvOYC?a3e(QL1P)^f$CH7Zy?I1yo8bWoww1&iK|fH# zm9TefFER{r85q>RZpQyF3jX~x)6Pw;r+>Gq#Sx>JE^Zx7c+)@?{U>tf5d}nig3V{t zihyr}OHCC>ou5Mb!s{I*Nx90Q&kpTQ^rZ6^kqJ`B>*m*a7Q;Y|I}wYNn8g#7A?^da zbTU7>iQBQ(dF1!cenJ|Hl{?tA3W!O}p86l={b@Wy2DI5LrRz?H2D$FfwY3D;+gZGB zx#GqmW*f8SD~g+PIBP(n$7kGp@S*j5>HYha^&h`K_3NKq4JS&Sr^(X0J4Ctb0er`X zTr*-xL)Om_qKbN1I3NTBhgQ(soS!#pub`FNJ|Sdx;C!sH@cFR@9}%q21W|{i7DRlt zOnc&mv2v*!t6k_Nf?6iwVp5WlI(@^pb9QwCDZ^m|eW8;=kYLou-gK$x82b4g9Sb$t z9p8aMJo?rr{Rkl8(vS+mlLg}V(nCz{<9J`ZV6J#z)+&tUFda5N7X#iG9tx1FsiRDL z2~c~co@OnaV@;Ar+}%zrI`4;JvNX`n5Ay!c}f(nG+?`go1XHaBXMz zzRn|zK#XtRy^~z(T=cAeG5U=t`V0NjzBdk`C(zO_tgT4{Ab$N{q<#sr#Z!NePa`84 z*EPlz>JgAAexu^$Tb5_{+Wl%Rr*mfa6NZ?T(P}65Doz0;6-;&G8OGd+F9Iij0F9y@ z6a4dP5OEe8$sJ1Vatt_*7!uqW6VUDQ>t?{Ngp2a*Vt)HX3vmfnbkJcXH4tU{?c?q3 zkZE~X`uIV%`1wbk;Zj=Z!u+oA=M63{iVOj6FfjvE$Ch#6ScY^tFUFX z!&@g000SU8wymkb^bTYlD|%&%+Pm&56u^2B zWi(93^BK>lJ#8^6RQRvhk&x&Kr~N<#$7#HeKT^!%JNTNBi)<;M>vl*tPA5fAE?55{ zUgbD-zCu@-(kswKmcP+CiRjgxAAH9y?Nxw*yPS7SIlGq%Af)#OM5zy9$MzbTO+wkY8Jc0R69C)x~k3b(_bVfOv=E%nm|tgGhnFJ*n(o;^88;+Gtovl6xJqr$-@& z_)-lsa*?)PLeoxEY7?@0ERWvuJAi|F2W#3h;&4MLEPjaDQSMz7Sake26W997OedPp+PS}c14dnGcV?AQz-t#HNphHsAmzTjxI zadf1Dv($j4xW}Z0=1=O3 z2R6d;YL-z#Cx!p@I1{G(cT%eKJW1^LkvDv@*hq&Z8!bO4|8l-^sCpM08~c^a=KVA! z9UDC~CJ_nbaQ3^p(%)!t4PR2J@;QJ&BZe4e4ZR+uUA9{KeWV1f1AF{7KzJ9#as)Jx z;zCjAn_N)D_&br}tgu9nUzY#+0NS_j|7#+;UN#ISYf9vGCVw0|xy`M{b;joMSSg5@T{Job_x zfQ~ZoC_KrUKbm>`;j5iI3jT|Wb)UCT3$0Ud{G(%a>-aeDAp?8`@gt_EfDRSH+!39t z05yR+bxxXsJ%^@e{fDp69y+|1K$7t$qF4Gha4Z)Uf0fFl2d04j8YYSRqa4wO2vIW} zH?Id$nH1p8dqmZDFyr5`@Xt%-4g#@qOq@yW6W0pYcWA2al#-Id>Xz!qJ7r*#**|-_ zDkU-#R${$<<#nyCs_;bKt9}Vh{OalZEHRd0Fj83o3)8>NXqg^>)1X!S$_gD61e?h3X&ckoI`IQ0?OI-tO1 zV%seNrNri1P+4! zqNnKA8X~5!Z_5mE9bcYVZ+<;} ztlnfy<39>AS)Z@Q?TDJJh-%uxtV{(4_x)Aqi_OrFINHT76>y4w7r{dJ&z87z=ST6r zU-aD^7`TCR=e>bPTyUS^utn+HHuxirPLWUi%pA-xZR233Ud(KOa`fF%JmDJUp>HZ@Y4Q((8x!X;* zP+nR%Wk2to^>=eAv^mhuPOZ~lKNBO}Pbq+3cv{F2yFiGdF}`CA1$_5m-usqRRJ7;6 zSJj@=uTn8$wo+ZuPKiXS1~<4vr^JXUmaq;etNZiR`FE{@r+tyxBgWl10ms#XTE7I= znx4NsWe^^D$>%za#-0{P4WF2>Rq?9r>2|3##k;jfB(obcRcWu|iTaOjfVgp7685q9 z4k!W%JwTedC>=$_93l?nvEy>V_tN}jtIx5T2xcG@TF`M5tY2g5oL!C}n6mPA3D;X@ z1qhoyE6O%GJQ_ry>VWX3l+MWxto>d@LTQi(bfW*5gdpvjD`dWZc6EKjQ-({IFInAK z`0YSXPmk!w|L%T2Uf_d%wJyjIPlN!EqJrdLZZDHDD{T~khhP=xsjk|{>Zp?7W*Dwg zPp)Fo&_F^>{QVRz%Kj=!s3FJ8^t$Iq{h_-9D(KY$}?*f0k{zW=sQ z)LdP{-;Fz^dm5=<^gDO9t@k7aQ56eaVP_idJ5P+3PmS4ZrJL$^B5@{ zzg0oi{!fCQD*&aM^Iw`EPz3z+V>htidj!Cp*YvL5!mSyV=T0-5Gz$R9JX@7gjD;Vb z|9iS57^IY=PQ{4sItbh}_3~^^k(>h|7;g)Z$6S{$%av zke=heroX;dS-%-I*=Fr--Yfo3rDNJTb8~Wf*zAINU;QBl$y2A;MQ_zxJbF3rUA1(e zbZA}_5BhiQAO#*gA!b4>!hZ6(yMHz202=N>h8lIyO%)-QHbl0KL*8Be>xx*?zB1E` zl%=<{Z>FUsF0XG01%97vgy-y-G))_c(?d*rTr?DO>4@hU=BA;LR?6?U1YuB3;c0&) za?~|%=<{dm&bSaM#PR)Uv#Y!_;_*GyrIMRA>h|5cj<+^Dx9_uO72&aV|1qV*v3qv} z@!da&K-ddO=CaK!M z@Pv;~?bS^NBp5=a2M=KNO?3G3KDYBQM@#bRpNIGEacFL3UyBGAG6bs9V)W8fi;qb) zT&<^P+Viv?#qRsj?-zfW$L@(~FTnhoC5H-K?OjOtnL=jZscPnmoY$g@8sz@Ar06RL-(y}r;GS^d)q6R;tCxN^TE7-$cM3;?oB81r z!f9WQ5Mc01*B)~RH39RqDI#mXhdYGQA_>x7pbW4!Jr(BBw?logx=VEO>!=Vr5JPRfraPqou#e*f++v- zj??G?q(CG*Nk{22(sYXj9!Fd{c{0(<+xrax$-Xu{>i5xyT>-i?Ow~}nj$^NLKxFQ&Sn3ayFLkw-s&1Hh8-ls``eAFw$g=@}+OjnOIt0vV_=lh3FM3N7|NC$=$nT z3qi>Bao^eqK==a9_z`5T9J;ujy@w%Yk>I>PUC|U?UY+f4wky#pFnH6~)5Af>@|0n! zc`J#fd(fE$XgQ9*jpP03(7mF-Bkt4}pv#}44$xzm&{nVn-3)8`g!(o{ioqTh(oHRK zjI;1oeXKsk3=ZhtTeM8z@Wdvmq@t^?3X86Y=P%LH;^j+FsKoisE-Z#MxS;Zr9_ z;m47mNzh4W%%&q5OsvZ5ZnDmnfF5|Al*P-h19>{~L7pkdFz5FVkGMYOGhJD_smkN9rl27=$}#Gf|2x+$I>Nf_&%%hOGc)?PP^CTm!#^ zGrBCC5HE_?8Tb40()QMp^!XJe%=s+7d2{pT+mqQCOLJ`Z4_vzosBZN;-9d+DILo{c zv7TTqdIl)|s{d1()v$iYY6&?xG7OTo4fb8nRb-EW$SMf|_W@bL+ z&8b#ShAMz?=wGl?pTK-`R(K6=F$IAM3}#`rcfox?@zDz9FO}9{)clJ z_LMlr;nmn!Ro<4ebe;~@4}oy%DvtOxZEv&?{Rgg47>k0O1D6S$Son3$fG7l?nuf(l z+`Jhx>ElDt%tU^4Yj)8<%*~IM$npkEv&4?Q2YtS0e@)D<__GknYPr-5+-BKaNl$ib z+!T$ro$u=EN+D}`fUMb9h6(T>L2!rdiR}1K3wVV(7V-}X3s*q^poiud^N&Md)uC)# z`|G5%6B0-wIOMCiWrOjnzfZeR3LmuZt-~);5qKt$i%mvyAi+)xGE5Vp*0c4V2jINJ zjE9%TA4GrM}8Nd=_R1hDtDd#8YKBj87`*oewh>(gT- zv|HW1MVV?D_MC0>_kKniJ-51Z?PN$sum3RnGY|`QD^wAH*)U)-p@ZO2=j4Tx0;v`= z^%{o8g{U#j=$zCjuMr%Wi$ib{5glnG!9f^|Az>_+uD<3`|Di!`&vC~X;aR$G{4{*I zy^fW70>@#$D1G$k83LXcAp4m?*I77XA`&nkkYf`+! zVCF;DyRD7!1j^D49EO|kZ04JwwKC>d3Xsg>aUR&9@7>zL0Z;KCaf>H5q0nk>@AEJL zkdE^YynOxB>jQ7C>g7%qX!AdSJ%q(RG>U8YZm}4(0{*kdXr`3?mw7*$_mKv1gKYt| zQtqsbHw@t9Nc*&>JDUdm+2(F14t6VBjs3I)udlfytJg>13t7BznAG;*Or6_{1 z@^M519Yk=0d?z_cPT@UD1UmFCyud5g0~@g7z^6}Je)%HNwiTHD3CaRm?TeqV5n^~3 zV$by9fpVmvbJDPCWZwkv)O>`pO{o1F2Vt8{DGiasAB3yEAwG*AziKc`;roOP5*Lqv zpy2<$W%CsM5)3z8BZWQ!sTb^kD_&jj4^wA{!(lb@Hpj*Ld>r(zGI>k&ORE2iY9sCx zWcp#W4#SLtClKEs<*wK}v6sxzCK5p?DF7jw+}lzqObl##HqNQbND)2x1fdiA{>_4+ zLD)#*(ayU?tD7IL<%VsF4g{f<&Gt=*k1RLvqYi}=yOE}nQ7hir{puC>%ar6?Yxrsi zHsPa<-Dh;CMM0+$x4l-PoK}@_@DtRtht(fy)%A-`^Z> z{ak$+&Wc0VD5t1s*{0wm6sL=+?Ya(siqL!Zxqr~g1m21F&|HJ}=mEDW#fH$j9 zwe8jT5dguQ9cQNpLP)Y3F_vvhnuzKHO*q zN5&6K3lDHEU!CpM7UU30j@9m0SoI112rTQaI)5fC7U6D!O@te-9dbL-aM;bxbSE0=}S zUYVahEp^p+1H(2oSoPi)OyEOa(eq$Adp|PbKltsZzzA)1*>6gmuuux<7u|gMi}c_J zw!#6BtgqebzR^-FT|=-3UV7KQ7*3qniHs1PPzK3p6b-5)ld2P#DGgMh>D`GK6&f)r z+#R}r8_0%V#}O`|927=3J9O>(JvVo6T|9LC1k@;i7_;C0#C+@i<@ta9u!2C(#%Mmk z>wSuX)M<$XudU;*Tc`+n69ra z18sg!vVtwh1VH#%igr6xIhG8`i4a0l!isstR|}Rx6#(bx4VVkCf%1>2th{)&w2I8B`l4l5{>fp>;~z;(2W5}HS(RRDvBC$H&Z`-DW& z3THTqs($@u(Wt)>g3i7etc?R5l1ZIXKmmrU4SvY#q)ZYKp7LqBy=2uOuv#eujxq~C zQh3>c&KsS(&G;8oac-9Xut~<#M(5$vTZgwY6o=pD}d_}eO z7=>AZU-G$QK*AUVPvu48d%-Zduo+2s10^%34u^ew1H|Jm9C{4UWgb;!)Pa!>;jC98 zc&p?T|I6v06~taq0!VlpYG@Dq?EP4JXz+;_4m#)U;Lo~vG`m;YIlapPd4mU)kn5nx zr7bEZ#zVw1^EWc?qag#R4y{Lj9No37(7$W*l)!-ky1dSxpN>@Ft*B&8DVJF~?lMm} zrc45w*o7a%lF$XgHM?M{j=<19BMf-C+Wd1~JU(x3m{QwO5xSd_{3{Q@V(2Xk1`nM) z8nOZx$1lNMv9j{pc#$RR*d-WZQei!T6G>hRQ3PJlFh52p+(>h%^20~*&zONdY&Im< zntgwU|K)yLw!bi2&GuvtrRx@N;3hm1{0JUQj8t%~zILOZ)AMQkh$o-!tb%T_5x^Ce z>bDCX+({U{elt=e+pvef9LwyUp6Q6n32n+d^Z=~z2gI1vh@dZu=+X+;EiP0|<}NlH z8y*&PT%70vCy`Lme-=YNWHksF5p$@1PT_qxP1giA3y>8a&=sOy8O{P*^x{d2h_koz zQ}&gksq3vjkfb>lB;|s+Y{Sjxa+d<7tYMw)`^ka@sdR^4l4X}M_Y=Ve$a zo~Ao5Upnvy1nE`4rl(Q9SJ}tl2gQUo-l-IRTRS^4Xh`rz)24Pgh;;uDHi1h02ePxM z&tvP-&t?ADbCE_eAEs7T@Sybt2G@3Y;#nFpug7rMVduRCQWKgzU$C9Gnp?=c`xhdZ<*KMDUKd+v94*kWh z?`!@8m>*iNmYK^BNPXm4$T1vX)X-)CCdp6^C1M4S%jZTTc9}H4zvMzYj%hsENPd4% z*D^DXMicm`NnmQn;6mWLcv1lk+(outR3sCE(o9N*qB1%T?)o(0SsxI=B>bH+FH@{{!gOdmD+!j6K%s-J?%D_5)jV zf9Iv(HIuN+-ux#jnw4fhkg+Xg!Ac8*dIB1s^f6~sQ|n- z5Td|SYy}ZL|2WM=ihy z&vk9t_Y+tH^!6(FOYEkNnhW4U?Wf=swSo#+7Fr#%mv_z;7;M<0OH-k+6wDCLmbIsH zUth$i?E_g8kQZ}LTZMFoCFn3LSI~-tGbC7uu|vRAi13HJ3!iacH{s-I$1-g0`y;E@ zaRSgLZs8vcW!%n1Fqq2w4wu8imk{>_41d#r%x9!e1<|N#I90Syx_S6 zJt4)buMc?V*SDwV&-l1acTbOAK)8Nw{o}{)TJQMmXEV6&*!iKdAk%WICIC+SIO7rM3V*NkAt`qIY3Pq%>iX~M za(KP@{$hFMp#sqGEnqKA+}S|9sf31ZM?k3a&^FW$`GLklETkAvl(z{vv1U=hZ$$M? z6SW2sZl9m!+6mfVa-CeT%PbVazGQIvG&zi^Vz&&_mk|%3nbg_t)bTL+?p=Xw#2IjR zUO3gyE&IYtmYdeM;FO^;q0oz49PY6ZhdsBC+yET}pwqEQxILMmLNNwe(5VRu)r^d< zueccmYf)g}TWqvm1WAcdRlMrfUF~3|-gl5l5WXgQD!Lb}#@ql%G4u)Dy}fj&$3gN7 zSyW0h#EG4E^$_l?Tb%MZ*KTtU<{xz!GMu4xvokeP{5Uc)w<9Ke4ScbqE(0Vc|TDDA-=5S%h3^H>%*5wR3gV+lCC?!(78=8BG{}Qq4q_ zovY5hE!(85sK3cXEB)9-*tZ8>>a$+uor(CZ7(d2&jQp z4U90)|Ndt}`7W~-<0lnqGJtH5Xy^jCwiWQuw0qC)-I7#SRdX!oAnER}hzET_f`JNL zBUX^X6_!p95Rmg&nS~V09c4+rL!FvN*F<6!@;Y;zN zoHz*7uVz;ApC#`6Eo3sV;hT88Gvu|6L;~_?UtnJZ4|F^z=-3Y3_zpWLk(?bC#R+ju zAm+>YO;5OnS`c*tyBB<`;)?z~IPLgJkx5}xKA-wudKIJ$+_ra0F zx`ZpB9gix{%rI(PiBdXbJLODM;=q=`ydoN=9s?Z=HgSWv`AtZ23y_Ts)mK@&o1^31 z_tT#D&BMh3HuvIqzMvl4h^P!;+5?q)NOq4dL3bvAyp~%bVfzA|a3kP4eBwQCWX0Hh zpN?o{rUA@+duZPA06Xpi@8IC4(Qg-jc-4Ohx8D9c>}{iNDY&-IqVcwRK0)@n7SjG8 zVfpv1r<8A6x88z5KKFWFEYQ7hM8CHHfj&(d!C820+}_NUy?dBRPCsfGs|gmW5m*f6X{9~Z;h>y+Uh&~Te^&hZp!OD-@WgL9YAwWO=x7uP5qKeDDoxZbKyP4qNd8gf16a0#h&pY6P^^2 zXT?eo8ZF>KlK$qW2%dpR`&C$`4wuIuRE@`C4BQVru(N4`ndsec ztrx2X@cG1%*`%B<9}XIwq`Swl4uj#TMv~i309WNc|9NrL7(+x$oZlqwjYr^KF=4{_ zqB{A0SUG8*nN?2?MUWk=)}` zHDSg#N7u(el*1ZsAtWY`Jk@3c>TjiD>P{v?EG?$5n%*P+MHhb36XD-&Dlp!m8L!xY zol{ZJk(4P>vmTs9)Mg{-Gd6~p`}rGFf=?mn{|A`9*>pBrhgmZriO7Yp8KDSc`z2o> zB&=#^e0N|LpbUz+1Dy7GSpuj<5`6^HGJvRM)ZPUZ_`+4D-lL z?J}IABsh1S!pk7^hk){CnHMhz`bBtR4o=;QXgNA{KD&_~V2yRyiv8PpZ(Es3>S=8v z#Fopr9belvw44Tqn}LLlLQ^&YcTy-~R2x4sK#yJ2e+h&%`umKnNx0*!0qno1x$lto z8wW`R+D0(&UfFj}5yErEU?}nF5KMPtT@U%?T1fBk2@KqgtsdqZ+<4M+-+dc>aB%D> z`~3wGl$;=O!EgMp$sB+e2NxIa{}q@sp#gDZ-9Th!(a^kFls5$+9soCB7AcQdBa0XU zvKJ@P#g4G}ADsc@L_m^w02#Pt!#H-E)3>MSm5PEZfi&P}V92M;q?$MgHf|%eBBPQV zN#xzrBZvbLL9yZ$siDwwyo?SGlA~{sCZ=~@GLt3Rwnk$D{XG$f&q`o6|dMoMH#l76z>bdNQ#!owZEFNkO zD9bzbb7UvvAo~h2h-tU|g9HzDu+CX;6G=%h&~zY2+WdK5FQyp$)(b-68dBj{^xPqc zZq4=kq*FA7y(14*agwkhSEt^_m%7)>9;$Q&!$YPOj7aQwP1etsV4Ja{b49e;Ouu9Z z>$`scx5^Y7W-di|S?a7Byt{r8xh-2#rcV4pQO8;A1(is`oYz2&jT0SWcCEM?0q%r< zbj#Ps2WrgM{8`+dHAksva84tyTK4+TnrLL4r)&;Ob{0U`O0Z&ZpaeczD2?NO!`anq z)<(pC0Wbxij#mS^7~-l4gBKa$-@PMYfvw0m4(~inn!%@!s8=R>st!tqy@FiNk5@;4LI}fjj@gBBz7#c-Z7e*mehO?OD&@o0J}DVvT5V_t_=MaK`kp%)!fAhD+!KX~`#IInqaW2n zK=b8~94U5s-}>IQh3Lp+y`%6pzsg)XCjaqwHCPP9qyJ5=E)sZHGD_U z3HHniX=i=eWxdrFLW?NM?6pE6$)Lr1PB`t9)o)O@)V(RE~1WE+=8Wu22SbhK zGvNnO# zuF=xm%*?LtY8(gl;9L6$rd|44H6%db9J=fiP!rF3ZbYb zto%_R$vCoR1#k*7CoZTMrLSFECcgCN5fR64+T~kxYzS7A&NhG_k_~-P^4w%8} za{#0EwF`n^aIZq7{T0uv$FC5;ns`99y<(NDy=D_|Zb(aM$$14Sn!&MzXZ>~0rh%y` z6<9=w!XS|I9qK_)nIk1!#kPQ^2uT~R!yNvuBPb0N3sQ!h_TMUh&D@6Yjcntb2(4Oo$OH2m+|?+QSA} z3Ra+pPXs(*yX1_>0Y=cz)xdBIah)Ue=&{rWR-HO0R6>>{kAs{C)ll_vMr-v~oUm#~>@CEYFv zae++W$e3$WI$CmfWj*+OSF0lj!x_I5M|Nn3Eg&i<24^J$ z5D>I&60ug9)VLp@$aD0u#w`tOhm-DkTqLYVhx0`WsgH3pfcC0RVFwo6=3&vrwn&&p zaO9azQR*79aLaj8Khdf-pgpVF_2P*N@5|F82y0o!?{FNk{6v#0VaWt~j%fxsJ!~q$h~_*A?Yw}a zUpDVGq$d1a0~+uV((3@58}Q)Z=cNbN@xuJv2~oCwJJOCxk7sXPO!_fT0$X0#+WdF< z19a*idw!Oo*%+Hqr%p;jRcaSF*rz{ZY%{VBZK<2vzrvLROyU5?S|;4b z(astDd1K}%OmI=9!gokWkOw?pnE}SMQzL@cc@RG%IpnmMg2&-dr-Y`?Zv%mjPP(|o3|6;oaG0&oN6;4>n>YYR9AbMDxjea)THt^1wNe=?9|^NxKEng+bKRG_}5IqB#-;SKMKYyK0sXXQx|0rEw40gMO}Kk9S}_AW~=v4!Wm1awrA{zOM>LQzGYr9JpdJtE zxWQ6FCuiyB$BsE?T=f-FC~^YUCt3*TNSIRIJqXJ?M`>Tuv2AoKI+X)Y!#~FJG{Ogc zFHt8H8()$@L_k2Cld+iBX={9t(hd+iWaPB9i<}q%Pf}Wj|DmO0+?2J2xQV zr^i5&oS(lN69N9@DyW33@bTnH{ctb&G%!H0MsPOFML1*ReVUXcV$16Vf##2ajj4gT zF;QHTSea47oinItDF37jx3_)}PkXw7K>YFZkjYmgDV!W!W5YQGKjq5DmlZm{eDO3% zZP!V*XMtR}tc)Fk>h%FY`$){E10pS&%S;{m#=ec?z`2VR#l=_sAeTthktWYu_(;Y% zX(fm47Jirp9;LYthul}It>M{15KHLd)B54q znA^9{?!B$CBh2y@tRzm5Ni=OS#phHR08PI__aw)c!xmoQvUhghuzogsB)oRNW}}d= zAw1Hcz;IBiBZmnhCey!w62qXowrT>CpR0Ps%?gKi>dVpwxHlntBdGj$R3HBf96AX% z-l_I7_;qyf9es0pYhwNtrcDen)Fw{{Q7_q0zzf~b83Ti#D^R^~WBCli?v5u6Q>qa& zGgh5z*gOx$TIC|R0mBM>A$!fPp655gpAU|kkZPFwj;ERIucTKG=4liXh=x%^X*Ikn z1+H_5jy^4#0kVY=IvFA-tVEhJ`(ToIl9{je26-KCF8_0%(SW>R{BZCMIqWb*I3K`U zLJ@^n^^QPII}#wxI(v zqPAq|`mlps%rzcUK^DA)MB>;?^YMOhY2l~q*>}FK!ihmB=YzIvgDxB5hY&m`HLxrY z4Z>p5(pv%6V`K$q!m@84k>!a%{Gaa2U&*(@QoxPd?$dJ9@T@A9f1(K+=RI!A9BK=x zL>(gKsv}nu$p)I5XdO;cI+kfalAv(Kne);9K)zChF+H(uOWYD%2qdTFqs$aw7W4NH zKeqegO_dZ42LSNOg1Us91VH9*tV6VNn{xS`jHfz(=5h4NeGL=_C@4hGHx}T@G{)nhM!y!dRsYLnf2x=@WDg$%S^g zAf5!Sp<<~6fr#NUDTrorw> z2wJeNV(%WrxVi%t4&|roGw`k10?0K3RfU@kJcne~4kEKCUOC9p_$?SGWON;%dJhq| zE0Cos;;_W))^eM0Q@6M0THwK0LcpPVP>nKL+73gpcGuP`WbVC@yISZ+yZrR4imkR3 z69}e=U51Gw7MEPv(K`^cfG@OkaNx_SO_&J#_}%%+uGeGU;EYYW^L-n>vgkib}&2@L{=F0j{_zdw-|>QrMLofIcAKg987X{^A93A>juilYTVys!YH- zmj&Ue)wOggI#+Ib$?sDZ6MMD^6@2%;&Rk^WM04lT;9h`RD?NVjypb!SDUg1JC+ax% z6nVE}l6^=qc)NFeY6|hPLV_@QIQayWBRk02%j1c5T3!H_ zY@a%NMUHJ~45AKA;rjU7yYvJc9XA&G4}dt&#_1NkRT7&A+^4n3bKsFhXlqDckf##FNmN0|~#v+m0VY?O(BWtv>b$9U_O zesjAiu9}@FV0!db9BM;&rR&j$#6Xd3@9&cH^<3-dd}(iQuM7MF0|Fy6(0i2=L`3Di zMjLJ;_5DX@kau!Zm!d*Idi3Q(2*Fz~AwFvEM~rrwJ5dmvgNu`nVXowxSG3+RitKA) z2Bn4=pc?tNlB)xV)6xnE2uK^4xq|HxetpMFmo9$5mGYE>lXHoTv`zx3a~J=73KSln zjtFxGtcl~$hoJcx>u!jlLjaaSjN$QjtUVlE1&?+FSr9Twlu_U3q9ebBFtRxN+fY(~ z>0d^mj6LE@7!DdD4tNakELv8H^mpgI92^y4l>R2jHCerg<%Z|<=+RjNgbW)9w5We| zV_yP_-_YC~6*yb=6MLzA!5##A<7NY0CKj;ar`krZzsHUJE39BDO8Dh-=p`Y9lml)j z)DR5fDX3%od1qg{NAcC!l#2wImwz50#~ax1^ragbfF+H49zmm8(kZX$(jP#Ap~?-7 z3V7=1lPQM54S{;7?%Y17J=RSs#H2qOnnn!u?Y& zy%#HNun7El{R~9n8LQl@%`y~qs<>69)P?d1;z<)N(V(m^`}qtuI8(yKpXHOETyphqRL3<@y*Uf}PN%qQgAR{M{w;Kswdiae9`TJAD#qZLz2_tu8omq86k&CPu^$rcCUHgm!ZFssSVse{eV}H&IkA`}zB=uPkiK zE*W_!3e^zX7rWft$8WQ(Swf)F|)ry*9P%tMQQPyMX?NG86R7)Z)>2~Q%w zw-F8h-pHdVCRWBsWU5UvxqqCeAHGIG1#$I76^Qvr(8AkkQm67oe9N3 z%~piagCO<Vjx}2n9&ts2ON0OuiCiAd&NBpXv{BBFzj5Kh@wy9ok=>Km9u2 zSmRV|UnRC?p$1qJ}g{Afpwu0>Y{skS!u$m`J2^9x#xTp2GN*DwzQtTM>cF9<5R>n@tXz0X{>zVAD=SXb<2!_tgf?9L za;`DskZX6W&LIK`!11sbXfh&Kaj^hv#wpaG$5#N`i{d`&&|=DWH5tHCn;=C07h|lP zJcDdsI>IEkA#z|s`vE?JryGA?giZApoiGV-CIZr}{q3N245=1-EeWqvJZ6T*twm@J zu*Z|2@w)RZJhCrOXHcMV2voR4UoswC{GATeDriL-p0(TVqJg$ue*PdN|B-QkeSNqq zkOTc+$(TNlwX!za#5uXRT=<7n{xkVdQ9~0$M?}A@;S)MG*eYbFD`JQAet!4m(hvac zxK5Fc_VD!M<2*Meb^U11&t8<;tCF%R5%df%5mGQ+la!A;zfG7&;%efWe?Wgef|W`N zKu0~ih0$(s3{v!*NHUasMq*N9O=%T!W^IqE93krJAVK(|L}#J z)am7h0}LU`mYPt;a*u=_bn$fFPi> zB>$C*51$Y_1+*srIp$oklLem_8O4Z@3FfS==uKM(9-`=T&LzKUp)*kwo5ersIpmVx zqm7`#T@xlZlsIChiYnKITNtn6)f(S*96T4I1GxCQ`udcR-uyr_wcQQ#I;hAHXq_KA zJBuly5Qp|-H5Q{^tuSK#0xmOCPSk${yw1s)QR_laIXe=9V7Qm6V1aeV8i>pjokRRz z*dIQAEQN5*@4!zG?X8+&P(wHe@GAQ_jZ&RL7ThwKvY=lIGc{TokOjLg5oW3OrEc@ogiz|9 zj&I+neakmqy<^%8%|1-}BSR`i3XvpB*pn6c{9d^shG~Qetu_(K61!JtPyxQej8b9p z9uC-5b0&Yj=(zX;5e7)~_I`vi(9YVKvUyrX^c)f#I*?<$kZ}EylCCeBI72)niP`#` zcUl`mWL*%T2Rv*~?G7D5pu`)GQC*;~p7zZ3ZX#N7_cEXDL7-tN8isE49YdTyL1;q2 z(Xjgh)Z)aA{0bQlP1ecQ9RyLPzK`BJ2z1lD{8!oNcyuixJitV_!l%#N8X-phoZ4K1RI2X!I;|qEM1y+ks}2G&=LHf6iLW~e%0q+Gn*f6X$W9_+s27skGA z;k9nC2_e4VM{4;uBn)gK&$m_O+M*MOMWI7`N;IDH10oM5UOBYARKF!}Xv7wdF7oQ? z>bHal)vCPK0WTZ+0VAG0k36XBe%7qiRW^#@xhIr9LZl>mj92L45HI+UC@zwy6Bo*t z0S`DJFgGko3`(4fz8`b#r4jq=Vy+d)P(SNwV$$=n+JY*V()~^y$LS6`rW^jRJLMyW z|1lIG1pVe9WP%=eMEzhldE9w6i722_x$NMOuzhQYXUaiHBVfdq!$@)czRSTdONw)P zEzU(dFkPN-u3Y!VI%n>`Z2RpHO}WSOv#vna>mb9aiAlISNL)Of#iosrp?vW!zV z3Ax8egI4+5=MkDyKsr-(mT;g_DC*@x@D`L79=A2n@*iC?j~(yB03=y45!MY}(xBR_ z;p4Is6W>LxED^2X;OIyW0c#W`e(H{%zCJT3L6=KLLt=N_6!cIQG0f}ubD=#vxJSumDt_=FzWW!1a%t4h5SVQ&wzNR=7>t<;~m)X#%gr=825I2KLE6c0;b=Z zGe|9IU#fo034$!2HXXy&+eDr82>bx*IH!C>c7=9D+WG>OGrjO#fen z1}>)jfteT8)JHG3$u(FwEo$*GreLdjMclhkAR`)-JhCpXp7BWA0e0F6|GD_5Wl-1} zZC&CMirHoBC`(b1Raa@Ic3P9O~&cKy`P()QYqC$Sp!Fa89NZorO;_pv_*=GYQ z*dO6S)4qiz2Ezhb#E9%VSEkyXDb6qQ3308a>B7?ZZ)FlOA=u2!rQr zOn?q=A$BkrP;L?tkcBUcn=d~%zI=HK9dd4WDY$)KRa+3w@AD!uF%J*i(}q3$wXKQ* z(v%_Y$lc#ddAAuJ1*9f@$!z6|9%hf@xnz}_aOW(^r_-@ef!E{Io@sb%aUN@bI*p8^ zV{tYQ&klNAfSYktoMzP@p3czAF;$9dcz`CM(p>PsCDmGv1j=(}X4e%VbwrC2P6Q~3 zMW)g79G4|zVs1Vy=l=6%X;IMw-EPjSgJb}WgP{%i910q2Qts-XXOY)AQ9f1a;p8-# zX`0nv30gEq=x+PIk?H3&!Vf4#aS#CV#32wYW=stcq^_;Jo387IKt!Tr~I0Uquo&$s{aa#kL z5yd~S6;zM3Jj&@lMn^%8b!prlyUZ8(TV2)>1NKgNbIoG_gw&kX{*(wbT)i{4qnx0L zsb@p}#10?`%Gy;+lRX~sSdrhv4x~-g*l%Lf72Wf7uACl0{ z!IK3{r5sgZZP#vUI2M{FS5$CJmoJ%j7hc+Pva$4t1TElK0?{4V+*rEEbf$8E(@@~v zcDyW>&C9Ra9?Nw=uF{VJAVN}V{KkR|nnoyPiQp<+LULqWZLPo2bvm*8*85q!ZnZLf zo@bH}8&nHr!FKnOwMGmfe|wPxOr6Dqad>!XH4RLXe-7cKvbD9?7h7ObYqk94j5Xnp|vpN!s*)u40r?M zfYpdHiYGd?)8-zcd8t)72A2nxrD_O-|7Ky19$E#lcd*Ba8P0DGYJ{8N$+z}%8HGS! zXkfK}X-x75uHUe^Id==WJ$#ApSfc)2B0dW5>U(EiKRN93Sdit5lUd~V<~&53e}F%) z+6uxL4CFU&^ZRcj!Dmr7Q@OcO{s?>|%KWB6BUB0w;TM7{Y5=-mQ6=2)l}J|HiiJoN zo>Sn=@FD&U3Jqk>Iudp4?o$(ivR{d|mOr?puZhv5mU=mG{*a}0EL{0Un2Wa&Ab;>; zfoYaE{0`zD#Zhl%WMB}*ckd(pqmyohE%8|S32R=91wZ|zLi`lx0t<%|z`^l#d<3sh z4Ul^f2|}>tp4e0l=E8*d9+^@rI2}fgaqnXAsw1i%*3kIkfDPE%=+bN`VE{^A-dd5eMis`8bO$~0}acYo}{60w5Ah3V28?mDr2N@be5u6j;hM3+X(4Ndz zZ{t*4AYhzn2oAtOSeN{utQitRJBz891aqVoRz>rma|Q;C9Q*baD*YP_@fp>Jco#Avq*8}+pH+Pk$ZTlMbOg)1 zL1XxV3w=-;35 z8&%l+Ai{z2x_|bN4prX2ch3wvh{>0Gyjlzxo>5T_M~y1|Q6%dxE-WreL+lfgt9ce( ztIQ$~R;9x%#TREpa5&=Cxd$=H_cnP2g;9(Z+I);*Xa)rt+{i-G0c%IAH2Z!xWhfVP zW*Vk!f#s(dsY7kC9E4G_TtZAq+_D0RgoKoU4I+4LCrJX3cz{vPkIGBAST+H{2DUp; zKp)a}Y<(bGqMUvwlrKBwc#_JHJJ5;o18tfz7zI<2)%Mq+@Y@b}z;)@59)h9?wgG6h zK3Is|g{h&y+tV}i8%PKDk;kI%i0Th@gu^wxV7SF|Q%~uOFkB@%O!Zu_2}*<@VrZ0z zXkWr{+KR*zb5CO=sobCWR(J`9_CJJl2|u~aHqx`qOs99?eLXEKo;^0X35(6wHvh$Z zS?VrKD};A0MtOw~{LM-dUgAO7?A+cdQ@bk2)%5`ao}@n-ysrR*A>_m+X8CBZw`da_ zmA(y!Te{~vMG}kyoKaCxATR9CY#fi{iA-p_Upw?1HK)VKHHpSSteS5x^WAj|#2Hlh z#^}?8@8}$&LwmK=!FjNp5TINRF&2t`sFNOphy#7n&Ey*W7afQz?nL2I{-9CiN+$v7 znO!P0y$4Lh6yYgQB6YBY5iKfEN=kl=)8mMzAb@@VXDAi)-i|7Ka#%8a8c^v6F{hE`CI{p0FGw3t#Jl$$t#Y4wb?X` zQw!MMnF0~NZ*Ew+svRU&Z+?6rym$St(nD*{%oX`nY*|l zg3I_>wawYH_hL+d-7&0)*?Se9o)kG{WMnjqjF0>1$LS!LaKqQoG;Bwn+?*cYb8e~> zsLcF>RPRjx{!K&+JvEl4bJl6a-tp}D{uPB1bWAo|71E~$X`vD>DmLb0LDO9pu zbpCtr9WrMnF@}5Th_gZwiI6twT;s>W6xx`{Ag0QvcS+V`fvCm%kO#s>Z($UEl_F8`#4ArBk{8Uyo(>I6qEHFnTzZbmxV!B+@E!VTyT*8fLRfs6Mvomm!(> zblT~Xze|;y>)*iEE#U3EH)ao=ogd;OQ|_7w?LnjnU_v^58Zr|8GRR~``QM#L`>gTS zF&CPc3qW{AAU`{Kf4j{wglsxGLO#IU{LuCntQfUJFRdcK!RUHE%aCr&^BvD`N33Ss z8h}9{zV->I1-3^C3D1~%VHCkAXh3Kn{l9(xzV?;Sc2yqdd1&<}6@+)e2=NI%_5GcZ z235n3Q%Q<)GTV%MAuOoJ=fl7>4?IOR&PH3{-ZbHF8NoGLwjKa%sTYK9Jo0`wFCg4; z;GQa`FkFc5jI#`72**4T1~(%6q&3e~c8xlE_)POU%<$BZTzcw^x|hs4Nh{z{Ox1l6 z-!}P@0ObepAwMyH>(nCxLLGz!9w7es#``w;J-^_YEY3xQwfJub)Q=JERo$4~cM9A` zSTcHi7bX@~2JfwDRz}!<>Fe8x*tl#@1WqwXdmUb)CCA&_O7RKeQ$%j48s2QC-LDll zi&PNNezdb7f+6K-og;*S<(MJba?Y2WCi0d8(%T&rjjRG2f4N8N9D0rRsmlN*o-Cog ztLSL5o{d)A8g4ST6mDN|@v8I`Tn~29)SgCGMFXatZ0y6ac~!qJ@h~)=0*ZEj>5Jon zID37cgAxder1K&<=tKQ)60ZZJUEz&J1T+qSKGHqI$kb#b0nEk{iqZo5$JG{mV04&- z{&<(cuSyjZsq;sgo~jC}MaDO|H4s-~Cub0!OUs0c*#)^X-JPA3P-2591XY2^i-LNf zTI>-i4-*}y5WxYX(ehw*NGlRc%DQ1BBJBBKhr|Rq0I_fUXZoGzN9LU-cn!c*Fq&Ba zZSb^@PvOJP*nw+b#S7%GE#T3kEvXR2eB?wSXeGa>=;luteY)dY?5+!a;DKWPEbQiw zh=%T+Fe01b;GCyzCg$iKbSjpjV&_(O6yq^9D9>=q2>&gP0s{b1e+9ANd0U5N zV4vDDTlDatr#v!xK5?SnhAqiyq_o$lMeudoCsOz@Nf5$ z0=xW@y!?E;BJOTGt}ns>p@0JHxf3DPpF)Be^T_mHcNTmWB-z|JG8772iw#@^PiD%r zVK5gG4X*|OWGzF}EW&fXth8%#W+A8B@dJ0{<^HneHfRdg0Al8F-#rCo%d+1_Go;1i zlsHK+cBsm-x6WtaGb=_?sMVolzCDlzrNX+NQ1KM|4zwysqkE!6;IKgfm{jI-am!re z?`REcO*NedBhAJZf@jbqMV&(Jj(bTNn2}jll4?qB?(AGumFiz8Xz|Gb>J7$o@$lhZ zFoQ=u4p$%L&V|EY5p7z(bl!Il&r+Sq_@WLJ<2Jkx;Uo(x60y(Jz);eG*cVgYLx-3- zl>Llrp7X+4GGc%zYYgoEm7Ji+``i@#*RFQ_{p)Fd+7LP&3FIyF=AS_*SG8l|XL98d zXG81_3$CY5wRz#n^c~?q2G468&{8g-!`LeaR4~q#;SP_zR*$rlcStJGM(egVQmOQ0 zBqUDv;fJ`lh{yi2y^@qsI}-FzU$Gz^o8^bkp))y}~^PpHFd(QiQmkUaI63yTVJ z)@NaMexkVmhr>}6!x;Ja_yjJS9DjMq)m7}&&PTOF3BccLhG+F?7*Cg6UtPS$NKFZQ zOgd4@I|s~h9K*BWkgTqcVv-RCTl(nXi&$$QetK5U9s|>4y<_3XJ}WGR>R1k)7pr4l zf)4ztT`&$%B@y$ik<@btv#`VXK%`g+Dq**gL!?Ie3; z`g_E2o*L`Ar_m5aPod|>r=k@{4=!$@3l;46sO);?a5v#1{F`L=dBk1oEYkH8w{6{; zFmV@*;R@Pi)A=LFL6l+2_=9;j%4C-EJC6l zn&1jj6n6;S20)~rzRwtJUXSNnAjR#31K@1z@t+u)e7p}fd!@EJ*wu-FM7!Jc>j~vM z_chp~GVf}qCG<`uZ6QrVzwsMB;g_gEHgOxQ3i4?Vs05gtO$2#aT)TtQC<7`HP7h&- zE!(+`qTau*`{jNyF)9WVkXCr@ko9ISpo`<2f#sTf5ez6b_8pN-;S<12lwP?ucjD1e z?nad9K<@(IlO-(J5Xn0{6K1$&jJ4+vl4E^Jsyyo&x}OkuZXLLE@Q?Gh_s?M6$+z=KuSu9v&VgqIOZ%{0=6hGC2o| zBrN3b^n@be1B^Mw-F}GFprAsiGic2VpnBUOWe z{s`5=!oPq2{Gex0Mzj!g-^`c~j!wij{UXc|%}*5eKm+sp4mWbzrnkG%#@JQRO z`eC+h+qMa+phXgB(;7GFxo(nT<7zGEhJ_+%h2bw>zO424n=2i75hZf&?c`lOzP|_V zS;W+Dk&T8{3~6a+<=}VyxTb_m6?f>6J0?rq{%dekMOwiWYYR!+4IxQv2(E@G$+WcZSlig#5I+6^yxC=){kjn;armLv@!^2K?>C7iM`-4&R-r0=Ih;N%A77&g zHoy^NJ6XCjnHs&1{dMS$aFCt@&ijb?8UoSkwy)@NulETL4-W{u9H18{$EC78m@1Bk zU)E>t`TLnA(Y-7z#wrpL5|^4C8{-ZV@e}_p-PY(pl;YUcsrlt+5VznWYZDrI31;>I zlsU9Jbl6=kU6Pd4th*!c!^4m~5U!o}TZErqF4VHyeZ)jgPA=o|!-wy%a^%5aUJ=Rc_ZUljFDHKEVlU+K(RL3XyY1swD* zpiE2Z9CIhSjUpoF>l5MK$FzjDMcmfVo-_+2c*&dTamRLd`&b5z{1_!#r5NjHo0%Sp zZ>~rFdQ8rW8HY%-;VIt?$T7JakL=z>^YIx4d3gci|0+l9HK0oJ7(znw@^%tCN@Ec4 zpnZj_w6qkO-`WT!K|O|t*sA|?4*deZnkH1G{s!yAIkG`R(tm7szW-ALf!mlBl!P6k zS7Tx}xtX6d6?y)`1(&y`StA$Le(dqdPj|>ih({TPRQNMDIC@6K#_t0+f}x_Tadck& zrZTPoAR{5>IhvjpIFB&t94-01QKD zVt^2^0~Cn-SG~}_`IMKSmAbLsC{bZk2GHm~l9`4|y1Jf(f)1SK92kRIpe$G!)=_%^ zg*y)Yi?Z%NkB30?4M`zfX+uuZk;v$Z!=qC);9sgob{|3MwOA*d|M~+0dMxin4N>Aa zg_gj*`)_uf52>a{95Ypt!WEI3Pe{Lg0?-&s`>C!8MNvHeyVyniny)P!FY&hafQ zVQC5bc+1U+n7@M4yw;nZg+)c@fMv11X8S@xI!PiC5N4p7I>e)=`HvR%6}wsYs}&0(Yqa-lBWgT$#UA%Ob{HXOL&!SleT(IGH!$j34yzZ= z{u>F5eLX$*)5-fL(qb2G1qB5;c9kAC3s_%xih!j*1&E~)EW?+KjHzN2`3*rMauD>m zsV3Pi)!z#%!Qtj287PhCU^~Nzw16M}m6eka$z&UI$NqyW2OLQ)P`^7W5-3dk4SkyV zTOzT+WRQnw2>JF8in7biWH*R@JMR|)m!QLd{&-y^|J8?#wHDinMC2;huwi$v|L3#wZ15DL*bKYw@bscM1}p(JIJNML>g16E!HSPfXGAT@?a5nl#A{}JN1GTHmP|ZHG z$P+y{G;>~vh#n@Ge+6CzTN82yZ}bdoYuRFs&A4j`r{NC^G2>dH`;eYJFDY66j%2&A z*f@IbU^}%%QxY}SQmC-W9|W+%t4_jkOrf1$>#t$hlCIl#ZLrw zQAQ7cR@q!`%lEg(2MQJJN%18#+l8RlhKQR9Y~=pzAY~t1Js5;}Q3SC}vVuhptU^WA0OtqfQ=8BXg(5qI^Az>ShAU@C@SC`FM_}|=Mr0J;9LAZFbJ%N zN7{147}YHPg90gcD|t{Z@hjz%62Q0?Lyb?}!u|rmDVxw~F3CMdnMC6In@s?YKnA<@_sDG%2}UIkR7VB&`N?_>r5JQD z!fu&QJW0hUik_BkNGQ~Ny$QboEH+8O&(NwN)%HYT=>!HUuo^@g^u2qV0o2RQl5Jzq zRW{l(X*eUx_ekqr9aTg(@eJNw+Q57wje8N~MI8-2kJ-6%*Ywj)`|P4Z-4~J8?GvmE zr3Z!DUCDY00PEumE36_9*hHn65rewp!xp4o;!=5K!=xD$7ZJRzCG;K^$7fUC$RVS2$KM?j(hmOHZkf>9vHf;9lK=rbYwl6kTG=2EZVvMPfeZUD`53;i%G*ntvUq{YtDtako&Gq$X1(7uFpSCyV z;?jvY8)=T1bIih~UjWL}=&+@;M?Oz4EnVF<7Jw+5%A`VXAe;-pf>*t;`E$s*+fYs< zl|gYx`?ipkJQ~Jugc`Lm$T#P{l#qVZ5|K%^!wd#hB5bar98-+ih{>W#fw6{G8_ENz zaMu0t(y!mtexP$`0)nT_LA)TsC^4)~D*dOK4Wwrp>js&9xjHqEM3s z%FSOdoLzM!Ylj|K5v)idntXGpUV)SY>@-Rqq#C?0fW8h!UL>cW;O_-E1{Ue) z=my?X*np`Ez>cs7ky?55wi7=a;~_J%K)ImPrZu#G$hot2;w2yPLVL7-E;{O#Vvq00 zudVe<2b2$8_O<6EuWc=aW<}-tFxx;k*8I*3^QBLTl;;3saW7%u?VCZs+_QB;!h~tI z2&#h7Qv8Nw%#jD%YC;gDZW z)!DtyrI&Mhr=-o^d1gdUwYBhl`bBa*t5F7EY{1COOsQe=&Hgld9I{u!pnQP=WMi{? zb?%?^Z-uEGjiSt^xP!fMegocqzhID)W9O}=y(6^LuBsh(WKg{){jNxw@DzEUvt{Y( z5Z@>Fg=ZAnRAux>$bafiqDeqO`NuzHo~EwrQ5uq|vt#R9V!Wm9d#LqXA84J=$&&M* zSEv}Be=Nku$MWl=pqbjIee3Np{(pNBj`gpO;8_yQ3ZJ(-{6U0Q2ly!V>%zkynlFS^ zubXNeIK~}YhuGwjdqlLkZgw9lZTNmsQ95dBYOA$<=M~rgc2veT+N>Cv`~14*(Kn9~ zp~Q%V{+UshX<-g1o`jB4I$%YHn^TAt9^lfFm_T|>pIg?vxRO$z8*%O4PI>7~Q_GD| zM?OY)bc0g(KzdYV(Im>%X5tjteLn9*digK_#G7oQP%48QMQDD)#L{Zd6t}0gc7){N z!}lO>!jK0$4n`R;!97fYM<~>yXfDk)Z_qckwaq}K#d6L!*6kZ6?Btvr(b$y0u5nL0 zk0;IemGu{UqAgi4ve!8s8hQMv=hPO6Lgy9<#RnY`w&9#To5n}&B;9-PSnmVjbKZ{l zFWa8+tsGRN*U$Ei>==)Vzf4I|)tA~?E9Mg{CxuUFxJ&9}2eySO8;QCnoj7i`NlHlg zgJ$Xa3c-yegRL$ZshBMGXff|K1B*2?8n5wV; z8LVb9lDvXH;6oBn_zN2yhy>$=-n2(^b#--zY{iZ8=g)2Ko@i~#Ht@mQK$zeqFxtHNGIy}XFqeWNnWM7IsxCq_%kWav_J1lH!z%D_%jv2ZABw-{dawe?I0m}9(GM>D z5nDZe;lc&(Tf!)gmz(^YjV3zGdK-i)xaCVE7nL87gbxL1uHyCgtwtnImad_u#H(rp$At7hG8_n)amwHHPSFh+dVvNDfs zRsR3Pr-OurfEak-Xdzy8=kkTF?j$jz9CV}8HQ40EQt+Jo4ayY<=8<47zVy2?yu91+ z?%~nGhsmi7wM!TQni(0*MfdddBxC!pM9RpOcjvQ{9Hbt)gK=hZI(-LXC}A8(C`hqX zsl-(d7_Dl)O-1GPJJ8_dYV7iHmRuCq`Pyi0rIAWBiH?lh&3FAHVwSgxBZ*m>~tfQw>$ev_?yRCLxf4F1kzJ13oiXccGCyc$l7b}VO&dQmYnM&?(KTL~H zVK6N_9%r+Ibdw6r+SH*1PA~XmWUf%uz8Sw{nQOPWfpt9Rkxrxb8x< z8a))A;)GlXUzZ74i7MA1-pSsa7Q6hJ&^_k=l52=3>3s z371q5PcueTE^dO>>LxO0o|<3&GlY7gjp>@2no*pf*Fdl~MoGqpf-yqSw=h7rIEw&R z0Hnd!ImFNE0=+UMIcqo`w=U`(Zq=lzWdv5Oj*nk0{Wi=Vy~K%{Q-UxsI^puyMzsxsjGBQ<;GgKsycVzqB(qqKf_JTbTF zLKTtKBIx zX#y-+?3zBZO1ew0h$0fDURwEKx>}YYFWHH0_uSq_Mnq_IhoMV^47NUu-N7L0+J3h` z^5IlE5Y;O2J98e2JR8j}s9-ZQg^0KqL4Hdb69j`?{$4!$2b2$v%^$!{8}aiDgTg<- z$9VetHQu;QB&QUZUfzUHU}*;Lu@Y9yEFwqy2Z#Zor)_(Rl%Z6!v9;~NzbKE`pivBL z1Bv(Ub<&W;?b;lqs9~Q+w_9^HoK^N9jkJ_@U*Y(5M6OQry6^n^i|! z`(fP?1QL;v?7^r7EL_-JxKIyPXQZgGQ26)Ej3^?YPdhJvqnXt^js$xI&S~NRds=5D zR~fLmQGsvnEqua=WsI_|g@+u-*9WaHcsBJ-)A)Gd5(1a?f%{Qx_4!DH4?*)iN3yDc5bfQ9@4*_Sex{t-WsXm)AG<=tJ44M zfT-3HomWLr2qYK48Te_+yM84JRA2~mq;2urw~L=Ji)=i+e_sQ`2R6@K)mEK0iClDH zfzV`j<6+okZ(~D)0^BF~WNM*HaO-h{EQbgp`uv&e@L{IzaB|S8^b}wyaYx0#F7x^* z_pR0SX1_jk9SqnP37+4c5EWc!m3TP&!N8<~wzJJaIKElqrcdtN=m=4J2a%8)~KQiVM z%=Hq}0!yu^df4F(>YqdsB4=ED{1d|L*MXlB0b0-PV^Ym?!m$E*haPb&E-znq#jDW+ zX2>nRkpeNFpHU6cPY}-A zM?WC!eLze?BE|Xx@*e{c*^S3i67Pb_b;OwNhC*2w4}f}kc{veIhB~?nhvF9?zxs(4 z{T4>2dA!GFlC~w{sf26fPHb#-r@E45e$QP*HrR@>9P)5?7r_w_fUa$Q=RgfaJvcjy zAg`gBTS%Rr2O5n>8mapsTvSVKzlsdu#q0}}8~Ei?4euc7xSG^V*C#P{u{f zs#$~zUjT_S7xR0hCYA68LvKSnIx@0|rzA;KSorcj78cnHdU~!n(I1VCjak@d+23A| zGAyoq^Tzc7dK*nE{nu*{EtQ5}Dh*K|*Kqm|?F|sPM~zQ;9iKjm%M8vT;610>Vr*=3 zvg}S=+-GMo7Ale0^W5hmElF)nO{+&U41N&j?l;Kg(mP(98qFWj&oWduH}6OFOv@~s z>@%AB1+Vk-=O=YOTrfC&`bT%M+i)z30v+Lw6)`U>_CcEqalthdc3)|}a$H**J@xnA z?ERq)3v&!YM}lW(-SQ1zFF-?{@dzC5I^1St&ZMvm2g@%e#SEtz%A>B}f1v&I#_{6?D``7!N81?v z6jeSC7tm~dZ!Bw@@cdc>JdDHx`kQ#G%gtTRzdey*a0Hph2UJux39Z6cpiXTsos3S zcV5<<03l82_C#S2Fhj~0rcYgFyxk|XwB&^0|NGDdg5DL|SiQilgcFbm)j~_~pZGwgDG-?d|OU zCeCo)I?A$sbz0%r{QP_=M&UDPVG%~coghfwyzsEF2t+zPz7&F6qv7Mny)CV+951u7 zl>B~w$%uw>uj~8w?-~95{j#NZ_g}I8IaaL2gbVWJ>(>grjMTO;#okFwl8E_!q?^r$xXY&^>a38kp&IuS^-e0qAhJ2Lq4E6y z=C}_+u{v^ywH554sbyqlj?OgBO|kX!TPxO1lQ#!mUV$_xC+Tw$O}`}E+CJfLUpfWr z!bRsMxDYT!l0&l;h>R9?7Jj3}YY5FpZdD=?PCGd^Cg%1^{1CC~y}(N%%1w0yB=Bp) zOAKT&l?n-3qf4t~=;dTQrU?m_3gkoQUgXA=9FXT2{WVi=jRN_Uf7Y{Q1uTs$f~HtS11ci=^)2r>7c&=xYd*uq2dD z1N>Qrk(GG+kUE2!H&u+ND8JmmE87^@=lm7VP!F;kPGQreKQI8+j-nov007SbcjC#xeG{;H(sb|*5JabAECeh|R?WrVe`65h(`)#&N}=7~4a7FTTY;6~C2P0^N{nML>{KX1adOub0XQ}mzU}Qr9zvGo}#3``@MNnp>KzA8c zxQIccg(DTNIOHT3J!C-~Pjrj&apr0AF)}N#M>F74fO2#f(80u(k!l=h?NDRx6BZPl z7u#k^{2PJW)#$ak=%dgXs{-Jx;=SAXGW5Z<;|}zuBq!s2(CK#QB{?P}toPqp5XQxF z#vAz{-l#MjZp|mcd`h6m0pR@$LgAN`>?pEn zj6?pR>_d{o%bWvv}R;B2r-Q zK+B;T?$s&_F+Wpas>kS$>f$f309|blW6M2D`cry7^gHO?Mkkv+Lg^`%*&a@%M)$&-FoJ4w} zYoC*maj_I1P%ETtT9B|*TZkEQJiUAOFKa{!2Vi7=5s|k!AUw~dwnxEPIqC;Sk2sKi zNQ{FOtAp&H9W5DW0N2PP#$gqoKX2;(rYC!_ro92fVxsi-NU|%!JvO7D%mGs+4;4Tb zjz)N~zSZ}|Cptde&8tg_NXhRi8JJmu0`htpT*`Kp0|CeR7)_DRbLiY}#9JK0U-<#Z z&!-}om$Ffz_|qfmCl-D{wHQgn;zbflUC4mypaXE?vu zHlF^-G#hVQ1;80fmSthmGj!t^;dRKtfo90Z_%r2L0Veh^ywD#_^0{61$AqQz$*#uW5aV9?WNTcX?pad#5x+jQu z2mE+lyrI4o^U{qCZG);CLF#bch#;}o05 zhg@{c*H<2{XbDl#wp@JHJCKQkI3RB4%J**U#RrQgtKe3e>+I^<=o+2BK8>djL9Xeb zin;_DsWrC;-?W_rM1cE8O_n`6%a%fooGMtc@B8=jBi^OIusr1>@WXpcps@ZMDR$bB z9;dAt2J)9wkXN+_Nf9}2>@w);JZo;A{Z z?&|m*8*9WeksV-CEL{w<3Nte^E${_eB^d7O!5&%ZbbfbfedD%=k&)+>&@)?!p2WPo zygxsG{iSY&hg_fM zGEv~pww2m@d3kyH3}IU;?R31ni83%c&?UNc+#i%}7z`)p>tXDM0DuVY0}+7cV(;SQ zUN4Hs?;SMfI6HFSKE%8Y`32#l+k1N}n2KH3%v0NM5;4i+PyOa@ z1rG~dBjg-ovsbMi1>i@<4FX4*3Yy$l)PF=BxD6?s_F}U10i&b1P-ih3*NeMKuH++r z5;y%Yx3=VShKj`gc$O{uOO1vF*mqEc*CJy9`7<22${3F2B+UF?T7?Ou&8IuhD-VKU zMzuTiVU{mk*;Q~Z$Sdb&xHXwLv5Cl7IXutX5Yxxt{1z~9 zg1t58RVdOG!Tn3dqG^Q+*SH$}otF=G)ruw5(sN&YSP^L1O&Lap1d$IFdzO}2^TJQ; zqXq=KrS=W&beV;3HDn_~=c?Han@cq-Kl|)}W0;w}{v1{C&D-r!U&vj_EyP^<6_1}d z@#yTYs^%>j2Cv|*phI-%y-9H>H~MkAm48Ck;|COLaYqN9V7*A=)89$Iz(sYWT}mm! zvYRhnzg~<6ReEr2Lv%X&{YpZK=RrUSnEz0;ysdkFMtl00KA};B+C&K`EYHWITSKag z`z=O#!)h(%*=bK%vMlniR`6)mqy^hIZyt>3LP!s_+MOXiKB=f-**iR}y+rd9>NPgW%Y&q_iG4A<9VIV#-vV{N5%oTgpQ5>pbpV$TGi93dQqW#LrsV zeMuZ1#Dw)xZQb+JiHR<7986YQe1dzZ#%Xu$)wang=b}fC)XE*%z#5`804|jeVl-?g z?vmNFx8w0Z#kp>8%w^u@$;(LFp008$3(2*|cSE>%nS3RE8$6;C&Negc zRKYxxO~1C9ACFVyqz!N5{brwV{kF+ckm_LE{CyL=1XRc4C{o*59xQ`vcZIwGFu3?M z4V*{NGboq@6?K=@ElbL`Md; zN0nP)3y^GB%U<{)QF+Px%9TC&lC1#Sco74?bm+|C1_KIn;j8wE^)mOBo;ErXY7q-G zUjNB|x=z#mix!3(*4j5#(=L#a^9l-Hib!5H$}k`dF*OjnQv=dC$o37=f7rbDcOk00 z(H+}wt0`j#6b55T{%gfE2oTJd7Jv>BLikW34mh`;gF~@GSS;KgVYk5S&H8Rnqb zYE-fK?b1>SQWH3lVofAhv{nLhkU6ERYwqdk>Sn z{nbDJ(x2EGe&W;r!iohEeDR1f68KK}C?*+q-hjRrbiI!L7nF6_{FqRzEwsymQ0Bi+ zZZqH;Z`95lJ-+OhQ%AE5Ymo$M#q)~bXbEP3C?_yx8$wVd^J~?Q4GlL7n*l7|g@L!Y zzz1=8;{da0Ty0bF$s%43bBxQ}BT5qG>v)Ad&3v@8U~vy^cEaKFjO zY*ujRQzpR|w!T+L6%mJU7`-vgLWHK(!GnnWPJ=$f^nHaPrg;>njQbO7-b#!cyGCq?GbWVHmFkYbv^j`X#W*962Q1lf!9o@7q435$C z{APt_A{f6qr2c;`U3)mx`5K?Fb`wzzj~Kb6a?fQ-i({}9ib9cGZ@GFQ(72)^XMERu^C;!PPH9mCuq0a^g$?k{@_h@kf_P?1)|k;-nsRZPw~baa1 zdUM@`iKM4CGCQ(gF~RgkR9gz0|B)+8aDK+RHe5hx2nNC>|9Wt+g;At}oUFrE0#{Xm zIANmH3Dw1Q{Oj{Nh!`7SLg(3$-%5)nHi|TwN0Z_eM6ypcz(TPMnz;sFszJv>VDQP} z5K0m#M(|Q4d|IzPl|yU(eijVO!w@2M*Tqaj*I)1{{27zOkY|LY*pY7|N(Ttc-Fgtz zcR{uZU)*wJLqs(LeNHb@+2%b9pB4`!xItw4sQ<%iOyG&^>kn?arZJ%ze8^&bgRcxE zIV2vQadQ&`Y(oRbjws^E`=AdplSs%(mWqRcDlnP$iHQk8NZJdc{wyw5Mm?PaCu{vY zDizLrVjd@6!LknhG$NsK9`C{{w+Vt%_WH``Ad&qc-baY1f#bx596xLoND;-)4LEW#CMGBR<<8Vr z*9xX#X5Mz9?%{*x$?rfRu(1&f7^>L@RHb{~a#|zW!u$cc;1yZSAIW#hv-u(a&czhB}JAivdz|F-FAR+IOG0ZL?tj(fG zd($w5W##19|GS}K>@zrufkiO5-!b@Go$@n4_WaEO+*>Ij7 z3KBau%)~UIvkQ^PKl)w3&>?k(d_;(33YY~{DQV84>;`{|Mu+Qn*PMSfSfV$8r0hiu zGG0LJPE9LbDUmJK!Qr8LNxz1#$;fT9hbPoBCZT}Im36sr;quU+iG*@aW~P2HC?(BE z$O%EWG38a}Cj&YUI#;fB&BDZ@je?#YoWOaN0lK{A-9n1^Cr1b_NgCF{8a)2%!h84X zcUbh+^DRGaJuPfiZOJ@WuPSqhM+6ughc!sI4-1fP;DXCjW$r$v57k_xD@Yuhzhdyq zE+HLJQpcTVnrJ~nb4vdyB+wR!DfBUT$z>s-S(w9~uvpU?HvKV}H;=W)gGdxt>c^_C z{+iiKc<|MZ<1qk#0hy<7ll&R-w2f*?Ol%d4j1b ziq#Y=hM6=@{qKZH9aQ*|f+owYae_peID#JRg#_XnzlWk$;tjkR3!w%cf@YD}Jwqu0 z4feaRsh8&vmMMkxgii~Yy^jF^I*<=w`_UG46pIfG`lBdx;gGaxy(jfk*YDoBHcIh#_WW`G(Q1*PGvYdozg=q$BE(VD?aX z{)oD|x}kgIVyCLwt(xpS2VIJe!v3#Y>m}?r{^% z%%Ctcd31RArd47yuJI>a>LNJr2dsFVx^E{)T5A)JUP!`pxgSh%IKvZaf@1q}PE& zDUk#>RFcYWw?frFZ4>a;Qlj{aoS3TqnUP>hVM%ZIbV*pCeEqN}v6r3)Tn`TY2M?nz|LgwEep@Xn#{4@sD;|C45C(8)t z_JyT@Z;tTsc^DzEU_d+{I_QkmEQX4)-2D9YGN1tJDMd~L+^#dfFX5uoN9xEwQ1Ln zO5N&2j5fxR@hQ;c8hv2X8e5J0C%Dgwdaom1zm|oS{xmHm>+3^d-f)ufx-xB zH{q2AzJ#eOqlfZC1(qRNL>8yl_hPvJSe6)IUuOIQ2B>WR*@dzN6dX6~HM5;AMj4w$G-AS_Ve>sVSJq52Fgc z$6og))n-31ykqd&Bt$%i2oah7PmU3jaQ6<=9Af=4<^OqXm93BL1V_2QgA!R* zqL#=-a;`%nb4^VY`0*@EPalP8j7>2x@rcM8;N4I!Mhy-!*_QNSx zH#CeWuBw{vz&1775G3m!isyLoKsIPznCBo=LA2Xvan4qSYOFjBpt$kPJRGE!ruQ?9 z(l3BMzlz98Du}T??IEt$u!||e5&?9r1n9a;OG<2DNqYjg?`Z%yZ~1)wWa0YUrMFlg zvdopNd~a!QkOqe(BYoy(cZi5+tt>B-!5-6-xw{ioiinB0uiX!$qUjhLZ(R3x{?Z~y Y`id8o@SOjH5eYw57PjV9W}fl?15(EXQvd(} literal 0 HcmV?d00001 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e0081c9..371ba09 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -14,7 +14,7 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios-profile`) + - Flutter (from `.symlinks/flutter/ios`) - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) @@ -25,7 +25,7 @@ SPEC REPOS: EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios-profile" + :path: ".symlinks/flutter/ios" google_maps_flutter: :path: ".symlinks/plugins/google_maps_flutter/ios" shared_preferences: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f0bdeff..8fc019b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -282,7 +282,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m index e72daa9..85625ee 100644 --- a/ios/Runner/AppDelegate.m +++ b/ios/Runner/AppDelegate.m @@ -6,7 +6,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GMSServices provideAPIKey:@"AIzaSyDfCRFolRWvgfgSK0UCl5n5rNb5CS7O7KI"]; + [GMSServices provideAPIKey:@"AIzaSyBkVgDYRQoKjCWlGMyl3V6ROzmLEsa5a0w"]; [GeneratedPluginRegistrant registerWithRegistry:self]; // Override point for customization after application launch. return [super application:application didFinishLaunchingWithOptions:launchOptions]; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index b9f4528..6bf45ff 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + io.flutter.embedded_views_preview + CFBundleDevelopmentRegion en CFBundleDisplayName @@ -47,7 +49,5 @@ UIViewControllerBasedStatusBarAppearance - io.flutter.embedded_views_preview - diff --git a/lib/common/apifunctions/get_graph_data.dart b/lib/common/apifunctions/get_graph_data.dart index 6513fb4..f1fbedd 100644 --- a/lib/common/apifunctions/get_graph_data.dart +++ b/lib/common/apifunctions/get_graph_data.dart @@ -4,14 +4,12 @@ import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import 'package:charts_flutter/flutter.dart' as charts; - /// Customer graph types: https://dev.localspend.co.uk/api/v1/customer/graphs /// - total_last_week /// - avg_spend_last_week /// - total_last_month /// - avg_spend_last_month - /// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[name] as {"session_key":"[boop beep]"} /// - organisations_all : organisation /// - pies : organisation/pies @@ -28,16 +26,13 @@ import 'package:charts_flutter/flutter.dart' as charts; /// HTTP POST request sample: /// {"graph":"total_last_week","session_key":"blahblahblah"} - - class OrganisationGraph { - OrganisationGraph( - this.chartType, - {this.graphsType = ""} - ); + OrganisationGraph(this.chartType, {this.graphsType = ""}); - String graphsType = ""; // type of graph, eg customers_last_7_days, sales_last_30_days, purchases_last_30_days etc - String chartType; // type of chart, eg organisations_all, pies, snippets or graphs + String graphsType = + ""; // type of graph, eg customers_last_7_days, sales_last_30_days, purchases_last_30_days etc + String + chartType; // type of chart, eg organisations_all, pies, snippets or graphs List> graph; @@ -53,7 +48,7 @@ class OrganisationGraph { colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, domainFn: (TimeSeriesCustomersOrSales spend, _) => spend.time, measureFn: (TimeSeriesCustomersOrSales spend, _) => - spend.numberOfStuff, + spend.numberOfStuff, data: cachedData, ) ]; @@ -94,13 +89,12 @@ class OrganisationGraph { final List labels = responseJson['graph']['labels']; final List data = responseJson['graph']['data']; - List graphDataList = new List< - TimeSeriesCustomersOrSales>(); + List graphDataList = + new List(); for (int i = 0; i < labels.length; i++) { - graphDataList.add( - new TimeSeriesCustomersOrSales( - data[i] * 1.00, DateTime.parse(labels[i]))); + graphDataList.add(new TimeSeriesCustomersOrSales( + data[i] * 1.00, DateTime.parse(labels[i]))); } this.cachedData = graphDataList; @@ -112,7 +106,7 @@ class OrganisationGraph { colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, domainFn: (TimeSeriesCustomersOrSales spend, _) => spend.time, measureFn: (TimeSeriesCustomersOrSales spend, _) => - spend.numberOfStuff, + spend.numberOfStuff, data: graphDataList, ) ]; @@ -125,9 +119,7 @@ class OrganisationGraph { } catch (error) { print(error.toString()); } - } - } class GraphData { @@ -194,7 +186,6 @@ class GraphData { ) ]; return this.graph; - } else { final errorMessage = json.decode(response.body)['message']; print("Error: " + errorMessage); @@ -276,4 +267,4 @@ class TimeSeriesCustomersOrSales { final DateTime time; final double numberOfStuff; -} \ No newline at end of file +} diff --git a/lib/common/apifunctions/get_map_data.dart b/lib/common/apifunctions/get_map_data.dart new file mode 100644 index 0000000..d9779ac --- /dev/null +++ b/lib/common/apifunctions/get_map_data.dart @@ -0,0 +1,92 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:http/http.dart' as http; +import 'package:json_annotation/json_annotation.dart'; +import 'package:local_spend/common/apifunctions/find_organisations.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart' as gmaps; + +// /v1/supplier/location + +@JsonSerializable() +class LatLng { + LatLng({ + this.lat, + this.lng + }); + + final double lat, lng; +} + +@JsonSerializable() +class Region { + Region({ + this.coords, + this.id, + this.name, + this.zoom + }); + + final LatLng coords; + final String id, name; + final double zoom; +} + +@JsonSerializable() +class Location { + Location({ + this.organisation, + this.lat, + this.lng + }); + + final Organisation organisation; + final double lat, lng; +} + +@JsonSerializable() +class Locations { + Locations({ + this.locations, + this.regions + }); + + final List locations; + final List regions; +} + +Future getLocations(gmaps.LatLng ne, gmaps.LatLng sw) async { + const pearLocationsURL = 'https://dev.localspend.co.uk/api/v1/supplier/location'; + SharedPreferences preferences = await SharedPreferences.getInstance(); + + Map body; + + body = { + 'session_key': preferences.get('LastToken'), + }; + + Map> mapData = { + 'north_east': { + 'latitude': ne.latitude, + 'longitude': ne.longitude + }, + 'south_west': { + 'latitude': sw.latitude, + 'longitude': sw.longitude + }, + }; + + final response = await http.post( + pearLocationsURL, + body: json.encode(body), + ); + + if (response.statusCode == 200) { + print(response.body.toString()); + } else { + print(response.body.toString()); + throw HttpException( + 'Error - ' + response.reasonPhrase, + ); + } +} \ No newline at end of file diff --git a/lib/common/functions/customAbout.dart b/lib/common/functions/customAbout.dart index 8f923c2..ba6168d 100644 --- a/lib/common/functions/customAbout.dart +++ b/lib/common/functions/customAbout.dart @@ -264,10 +264,7 @@ class AboutDialog extends StatelessWidget { List body = []; if (icon != null) { body.add( - IconTheme( - data: const IconThemeData(size: 45.0), - child: icon - ), + IconTheme(data: const IconThemeData(size: 45.0), child: icon), ); } @@ -277,7 +274,6 @@ class AboutDialog extends StatelessWidget { child: ListBody( children: [ Container( - padding: EdgeInsets.only(top: 10), child: Text(name, style: Theme.of(context).textTheme.title), ), Text(version, style: Theme.of(context).textTheme.body1), diff --git a/lib/common/functions/logout.dart b/lib/common/functions/logout.dart index 1b14d6b..128eab8 100644 --- a/lib/common/functions/logout.dart +++ b/lib/common/functions/logout.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:local_spend/common/apifunctions/request_logout_api.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:local_spend/common/functions/save_logout.dart'; void logout(context) { _clearLoginDetails().then((_) { diff --git a/lib/common/platform/platform_scaffold.dart b/lib/common/platform/platform_scaffold.dart index e3dbff9..2b2b0e6 100644 --- a/lib/common/platform/platform_scaffold.dart +++ b/lib/common/platform/platform_scaffold.dart @@ -4,21 +4,20 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class PlatformScaffold extends StatelessWidget { - PlatformScaffold( {this.key, - this.appBar, - this.body, - this.floatingActionButton, - this.floatingActionButtonLocation, - this.floatingActionButtonAnimator, - this.persistentFooterButtons, - this.drawer, - this.endDrawer, - this.bottomNavigationBar, - this.backgroundColor, - this.resizeToAvoidBottomPadding = true, - this.primary = true}) + this.appBar, + this.body, + this.floatingActionButton, + this.floatingActionButtonLocation, + this.floatingActionButtonAnimator, + this.persistentFooterButtons, + this.drawer, + this.endDrawer, + this.bottomNavigationBar, + this.backgroundColor, + this.resizeToAvoidBottomPadding = true, + this.primary = true}) : assert(primary != null), super(key: key); diff --git a/lib/common/widgets/animatedGradientButton.dart b/lib/common/widgets/animatedGradientButton.dart index fb6853c..aca5789 100644 --- a/lib/common/widgets/animatedGradientButton.dart +++ b/lib/common/widgets/animatedGradientButton.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:simple_animations/simple_animations.dart'; class AnimatedBackground extends StatelessWidget { - AnimatedBackground( this.animateColors, this.lastColor, diff --git a/lib/common/widgets/charts/numeric_line_bar_combo.dart b/lib/common/widgets/charts/numeric_line_bar_combo.dart index c6b38dd..a0e71b4 100644 --- a/lib/common/widgets/charts/numeric_line_bar_combo.dart +++ b/lib/common/widgets/charts/numeric_line_bar_combo.dart @@ -4,7 +4,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class NumericComboLineBarChart extends StatelessWidget { - NumericComboLineBarChart(this.seriesList, {this.animate}); /// Creates a [LineChart] with sample data and no transition. diff --git a/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart b/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart index ef3dad6..f59ea0a 100644 --- a/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart +++ b/lib/common/widgets/charts/scatter_bucketingAxis_legend.dart @@ -8,7 +8,6 @@ import 'package:charts_flutter/flutter.dart' as charts; import 'package:flutter/material.dart'; class BucketingAxisScatterPlotChart extends StatelessWidget { - BucketingAxisScatterPlotChart(this.seriesList, {this.animate}); /// Creates a [ScatterPlotChart] with sample data and no transition. diff --git a/lib/common/widgets/custom_checkbox.dart b/lib/common/widgets/custom_checkbox.dart index f011c3a..27645d5 100644 --- a/lib/common/widgets/custom_checkbox.dart +++ b/lib/common/widgets/custom_checkbox.dart @@ -372,8 +372,7 @@ class _RenderCheckbox extends RenderToggleable { final double tShrink = (t - 0.5) * 2.0; if (_oldValue == null || value == null) { _drawDash(canvas, origin, tShrink, paint); - } - else { + } else { _drawCheck(canvas, origin, tShrink, paint); } } @@ -388,16 +387,14 @@ class _RenderCheckbox extends RenderToggleable { final double tShrink = 1.0 - tNormalized * 2.0; if (_oldValue == true) { _drawCheck(canvas, origin, tShrink, paint); - } - else { + } else { _drawDash(canvas, origin, tShrink, paint); } } else { final double tExpand = (tNormalized - 0.5) * 2.0; if (value == true) { _drawCheck(canvas, origin, tExpand, paint); - } - else { + } else { _drawDash(canvas, origin, tExpand, paint); } } diff --git a/lib/main.dart b/lib/main.dart index 3f9987c..309d5ea 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,15 +12,10 @@ void main() { runApp(MyApp()); } -void loadGraphs() { - -} +void loadGraphs() {} class GraphWithTitle { - GraphWithTitle({ - this.graph, - this.title - }); + GraphWithTitle({this.graph, this.title}); GraphData graph; String title; @@ -29,7 +24,7 @@ class GraphWithTitle { class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - var graphList = List(); + // TODO: load graphs on app login and send to graph widgets return new MaterialApp( debugShowCheckedModeBanner: false, @@ -45,7 +40,7 @@ class MyApp extends StatelessWidget { routes: { "/HomePage": (BuildContext context) => HomePage(), "/LoginPage": (BuildContext context) => LoginPage(), - '/MapPage': (BuildContext context) => MapSample(), + '/MapPage': (BuildContext context) => MapPage(), "/ReceiptPage": (BuildContext context) => ReceiptPage2(), "/MorePage": (BuildContext context) => MorePage(), }, diff --git a/lib/pages/customerGraphs.dart b/lib/pages/customerGraphs.dart index efdd7eb..341b399 100644 --- a/lib/pages/customerGraphs.dart +++ b/lib/pages/customerGraphs.dart @@ -76,10 +76,10 @@ class _CustomerGraphsState extends State { child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center( - child: CircularProgressIndicator( - valueColor: new AlwaysStoppedAnimation(Colors.orange), - ) - ), //List>es> + child: CircularProgressIndicator( + valueColor: + new AlwaysStoppedAnimation(Colors.orange), + )), //List>es> ), ), Container( @@ -103,9 +103,8 @@ class _CustomerGraphsState extends State { ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center( child: CircularProgressIndicator( - valueColor: new AlwaysStoppedAnimation(Colors.blue), - ) - ), //List>es> + valueColor: new AlwaysStoppedAnimation(Colors.blue), + )), //List>es> ), ), Container( @@ -128,10 +127,9 @@ class _CustomerGraphsState extends State { child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center( - child: CircularProgressIndicator( - valueColor: new AlwaysStoppedAnimation(Colors.green), - ) - ), //List>es> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.green), + )), //List>es> ), ), Container( @@ -154,10 +152,9 @@ class _CustomerGraphsState extends State { child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center( - child: CircularProgressIndicator( + child: CircularProgressIndicator( valueColor: new AlwaysStoppedAnimation(Colors.red), - ) - ), //List>es> + )), //List>es> ), ), ], diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index b4a7c3b..4e5ad30 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -31,7 +31,7 @@ class _HomePageState extends State { static List _widgetOptions = [ ReceiptPage2(), StatsPage(), - MapSample(), + MapPage(), MorePage() ]; @@ -43,7 +43,6 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( body: Center( child: _widgetOptions.elementAt(_selectedIndex), diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index f77d0e5..a4ebd90 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -20,10 +20,8 @@ class LoginPage extends StatefulWidget { class LoginPageState extends State { bool _isLoggingIn = false; - final TextEditingController _emailController = - TextEditingController(); - final TextEditingController _passwordController = - TextEditingController(); + final TextEditingController _emailController = TextEditingController(); + final TextEditingController _passwordController = TextEditingController(); bool _saveLoginDetails = true; FocusNode focusNode; // added so focus can move automatically diff --git a/lib/pages/map_page.dart b/lib/pages/map_page.dart index 2b05ef5..f2c36ba 100644 --- a/lib/pages/map_page.dart +++ b/lib/pages/map_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'dart:async'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart' as gmaps; +import 'package:local_spend/common/apifunctions/get_map_data.dart' as mapData; import 'package:local_spend/common/platform/platform_scaffold.dart'; class MapPage extends StatefulWidget { @@ -13,13 +14,32 @@ class MapPage extends StatefulWidget { } class _MapPageState extends State { + final Map _markers = {}; + Future _onMapCreated(gmaps.GoogleMapController controller) async { + final region = await controller.getVisibleRegion(); + final locations = await mapData.getLocations(region.northeast, region.southwest); + setState(() { + _markers.clear(); + for (final location in locations.locations) { + final marker = gmaps.Marker( + markerId: gmaps.MarkerId(location.organisation.name), + position: gmaps.LatLng(location.lat, location.lng), + infoWindow: gmaps.InfoWindow( + title: location.organisation.name, + snippet: location.organisation.postcode, + ), + ); + _markers[location.organisation.name] = marker; + } + }); + } @override Widget build(BuildContext context) { return PlatformScaffold( appBar: AppBar( backgroundColor: Colors.blue[400], title: Text( - "Submit Receipt", + "Map", style: TextStyle( fontSize: 20, color: Colors.white, @@ -28,34 +48,15 @@ class _MapPageState extends State { centerTitle: true, iconTheme: IconThemeData(color: Colors.black), ), - body: null, - ); - } -} - -class MapSample extends StatefulWidget { - @override - State createState() => MapSampleState(); -} - -class MapSampleState extends State { - Completer _controller = Completer(); - - static final CameraPosition _kGooglePlex = CameraPosition( - target: LatLng(37.42796133580664, -122.085749655962), - zoom: 14.4746, - ); - - @override - Widget build(BuildContext context) { - return new Scaffold( -// body: GoogleMap( -// mapType: MapType.hybrid, -// initialCameraPosition: _kGooglePlex, -// onMapCreated: (GoogleMapController controller) { -// _controller.complete(controller); -// }, -// ), + body: gmaps.GoogleMap( + myLocationButtonEnabled: false, + mapType: gmaps.MapType.hybrid, + onMapCreated: _onMapCreated, + initialCameraPosition: gmaps.CameraPosition( + target: gmaps.LatLng(54.0411301, -2.8104042), + zoom: 15, + ), + ), ); } } diff --git a/lib/pages/more_page.dart b/lib/pages/more_page.dart index 6c7b45a..b1d3531 100644 --- a/lib/pages/more_page.dart +++ b/lib/pages/more_page.dart @@ -101,6 +101,7 @@ class MorePageState extends State { height: 35, child: RaisedButton( onPressed: () => {}, +// launch(- something -), child: Text("Contact us", style: TextStyle( color: Colors.white, fontSize: 18.0)), @@ -120,25 +121,6 @@ class MorePageState extends State { onPressed: () => launch('http://www.peartrade.org')), ), - Container( - height: 35, - margin: EdgeInsets.fromLTRB(10, 20, 10, 0), - child: Material( - child: OutlineButton( - child: Text( - 'Shadowcat Systems', - style: TextStyle( - color: Colors.black, fontSize: 18.0 - - /// I don't know what to do with this button - ), - ), - onPressed: () => launch('https://shadow.cat/'), - ), - color: Colors.lightGreenAccent, - shadowColor: Colors.transparent, - ), - ), ], ); }, @@ -170,6 +152,33 @@ class MorePageState extends State { ), ), + Padding( + padding: EdgeInsets.fromLTRB(30.0, 20.0, 30.0, 0.0), + child: Container( + height: 75.0, + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(3), + onTap: () => launch('https://shadow.cat'), + child: Column( + children: [ + Align( + child: Text("Developed by"), + alignment: Alignment.centerLeft), + FittedBox( + fit: BoxFit.fitHeight, + child: Image( + image: ExactAssetImage('assets/images/text.png'), + ), + ), + ], + ), + ), + ), + ), + ), + // Padding( // padding: EdgeInsets.fromLTRB(30.0, 20.0, 30.0, 0.0), // child: Container( diff --git a/lib/pages/orgGraphs.dart b/lib/pages/orgGraphs.dart index 82ef593..444f3ce 100644 --- a/lib/pages/orgGraphs.dart +++ b/lib/pages/orgGraphs.dart @@ -12,7 +12,6 @@ class OrgGraphs extends StatefulWidget { } class _OrgGraphsState extends State { - /// Organisations' graphs types: to fetch, POST to https://dev.localspend.co.uk/api/stats/[graph_type] as {"session_key":"[boop beep]"} /// - organisations_all : organisation /// - pies : organisation/pies @@ -30,9 +29,12 @@ class _OrgGraphsState extends State { /// {"graph":"total_last_week","session_key":"blahblahblah"} // OrganisationGraph customersLastWeek = new OrganisationGraph("graphs", graphsType: "customers_last_7_days"); - OrganisationGraph customersLastMonth = new OrganisationGraph("graphs", graphsType: "customers_last_30_days"); - OrganisationGraph salesLastMonth = new OrganisationGraph("graphs", graphsType: "sales_last_30_days"); - OrganisationGraph purchasesLastMonth = new OrganisationGraph("graphs", graphsType: "purchases_last_30_days"); //purchases_last_30_days + OrganisationGraph customersLastMonth = + new OrganisationGraph("graphs", graphsType: "customers_last_30_days"); + OrganisationGraph salesLastMonth = + new OrganisationGraph("graphs", graphsType: "sales_last_30_days"); + OrganisationGraph purchasesLastMonth = new OrganisationGraph("graphs", + graphsType: "purchases_last_30_days"); //purchases_last_30_days @override void initState() { @@ -114,7 +116,8 @@ class _OrgGraphsState extends State { child: customersLastMonth.graph != null ? new charts.TimeSeriesChart(customersLastMonth.graph) : Center( - child: CircularProgressIndicator()), //List> + child: + CircularProgressIndicator()), //List> ), ), @@ -138,9 +141,9 @@ class _OrgGraphsState extends State { child: salesLastMonth.graph != null ? new charts.TimeSeriesChart(salesLastMonth.graph) : Center( - child: CircularProgressIndicator( - valueColor: new AlwaysStoppedAnimation(Colors.green), - )), //List> + child: CircularProgressIndicator( + valueColor: new AlwaysStoppedAnimation(Colors.green), + )), //List> ), ), @@ -164,13 +167,11 @@ class _OrgGraphsState extends State { child: purchasesLastMonth.graph != null ? new charts.TimeSeriesChart(purchasesLastMonth.graph) : Center( - child: CircularProgressIndicator( + child: CircularProgressIndicator( valueColor: new AlwaysStoppedAnimation(Colors.red), - ) - ), //List> + )), //List> ), ), - ], ); } diff --git a/lib/pages/receipt_page_2.dart b/lib/pages/receipt_page_2.dart index 4ef3c00..4456016 100644 --- a/lib/pages/receipt_page_2.dart +++ b/lib/pages/receipt_page_2.dart @@ -92,7 +92,7 @@ class ReceiptPage2State extends State { submitReceiptAPI(context, receipt); } - List _sampleRecurringOptions = new List(7); + List _recurringOptions = new List(7); List _categories = new List(); @override @@ -100,13 +100,15 @@ class ReceiptPage2State extends State { super.initState(); } - @override Widget build(BuildContext context) { var _widgetHeight = MediaQuery.of(context).size.height * 0.06 < 40.0 ? 40.0 : MediaQuery.of(context).size.height * 0.06; + var _fontSize = _widgetHeight * 0.45; + var _fontSizeButton = _widgetHeight * 0.5; + if (_categories.isEmpty) { Future> _futureCats = getCats(); _categories.add("Fetching categories..."); @@ -117,13 +119,13 @@ class ReceiptPage2State extends State { }); } - _sampleRecurringOptions[0] = "None"; - _sampleRecurringOptions[1] = "Daily"; - _sampleRecurringOptions[2] = "Weekly"; - _sampleRecurringOptions[3] = "Fortnightly"; - _sampleRecurringOptions[4] = "Monthly"; - _sampleRecurringOptions[5] = "Quarterly"; - _sampleRecurringOptions[6] = "Yearly"; + _recurringOptions[0] = "None"; + _recurringOptions[1] = "Daily"; + _recurringOptions[2] = "Weekly"; + _recurringOptions[3] = "Fortnightly"; + _recurringOptions[4] = "Monthly"; + _recurringOptions[5] = "Quarterly"; + _recurringOptions[6] = "Yearly"; // these will be difficult to fetch from server as they are coded into the site's HTML rather than fetched return PlatformScaffold( @@ -175,7 +177,7 @@ class ReceiptPage2State extends State { child: Text( "Date/Time", style: TextStyle( - fontSize: 22, + fontSize: _fontSize, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -233,7 +235,8 @@ class ReceiptPage2State extends State { : '${new DateFormat.MMMd().format(transaction.date)}' + " at " + '${new DateFormat.Hm().format(transaction.date)}', - style: TextStyle(color: Colors.white, fontSize: 22.0), + style: TextStyle( + color: Colors.white, fontSize: _fontSizeButton), ), color: Colors.blue, ), @@ -257,7 +260,7 @@ class ReceiptPage2State extends State { child: Text( "Payee", style: TextStyle( - fontSize: 22, + fontSize: _fontSize, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -291,7 +294,8 @@ class ReceiptPage2State extends State { .substring(0, 12) + "..." : transaction.organisation.name, - style: TextStyle(color: Colors.white, fontSize: 22.0), + style: TextStyle( + color: Colors.white, fontSize: _fontSizeButton), ), color: Colors.blue, ), @@ -315,7 +319,7 @@ class ReceiptPage2State extends State { child: Text( "Recurring", style: TextStyle( - fontSize: 22, + fontSize: _fontSize, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -328,7 +332,7 @@ class ReceiptPage2State extends State { width: MediaQuery.of(context).size.width * 0.6, child: RaisedButton( onPressed: () { - transaction.recurring = _sampleRecurringOptions[0]; + transaction.recurring = _recurringOptions[0]; setState(() {}); showModalBottomSheet( context: context, @@ -341,13 +345,13 @@ class ReceiptPage2State extends State { 3, child: CupertinoPicker( backgroundColor: Colors.white, - children: _sampleRecurringOptions + children: _recurringOptions .map((thisOption) => Text(thisOption, style: TextStyle(fontSize: 30))) .toList(), onSelectedItemChanged: ((newValue) { transaction.recurring = - _sampleRecurringOptions[newValue]; + _recurringOptions[newValue]; setState(() {}); }), magnification: 1.1, @@ -361,7 +365,8 @@ class ReceiptPage2State extends State { transaction.recurring == null ? 'None' : transaction.recurring, - style: TextStyle(color: Colors.white, fontSize: 22.0), + style: TextStyle( + color: Colors.white, fontSize: _fontSizeButton), ), color: Colors.blue, ), @@ -383,7 +388,7 @@ class ReceiptPage2State extends State { child: Text( "Category", style: TextStyle( - fontSize: 22, + fontSize: _fontSize, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -407,7 +412,8 @@ class ReceiptPage2State extends State { height: MediaQuery.of(context) .copyWith() .size - .height / 3, + .height / + 3, child: CupertinoPicker( backgroundColor: Colors.white, children: _categories @@ -432,7 +438,8 @@ class ReceiptPage2State extends State { transaction.category == null ? 'None' : transaction.category, - style: TextStyle(color: Colors.white, fontSize: 22.0), + style: TextStyle( + color: Colors.white, fontSize: _fontSizeButton), ), color: Colors.blue, ), @@ -456,7 +463,7 @@ class ReceiptPage2State extends State { child: Text( "Essential", style: TextStyle( - fontSize: 22, + fontSize: _fontSize, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -492,7 +499,7 @@ class ReceiptPage2State extends State { child: Text( "Amount", style: TextStyle( - fontSize: 22, + fontSize: _fontSize, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -505,7 +512,7 @@ class ReceiptPage2State extends State { width: MediaQuery.of(context).size.width * 0.6, child: TextField( style: TextStyle( - fontSize: 20, + fontSize: _fontSize, ), textAlign: TextAlign.center, controller: transaction.amount, diff --git a/lib/pages/spash_screen.dart b/lib/pages/spash_screen.dart index bcfe751..26df3db 100644 --- a/lib/pages/spash_screen.dart +++ b/lib/pages/spash_screen.dart @@ -27,10 +27,7 @@ class _SplashScreenState extends State { @override Widget build(BuildContext context) { - var drawer = Drawer(); - return PlatformScaffold( - drawer: drawer, body: Container( decoration: BoxDecoration(color: Colors.white), child: Column( @@ -38,7 +35,6 @@ class _SplashScreenState extends State { Expanded( child: Container( margin: EdgeInsets.all(15), - alignment: FractionalOffset(0.5, 0.3), decoration: BoxDecoration( image: DecorationImage( image: AssetImage('assets/images/launch_image.png'), diff --git a/lib/pages/stats_page.dart b/lib/pages/stats_page.dart index f3f1e06..2446884 100644 --- a/lib/pages/stats_page.dart +++ b/lib/pages/stats_page.dart @@ -10,8 +10,10 @@ const demonstration = false; class StatsPage extends StatefulWidget { @override State createState() { - print("TODO: The 'stats' page should be loaded on login and cached rather than reloading on every opening of the page."); - print("Create new List in instantiated MyApp() and pass that or load it from this class' child with (graphs = super.graphList) or something."); + print( + "TODO: The 'stats' page should be loaded on login and cached rather than reloading on every opening of the page."); + print( + "Create new List in instantiated MyApp() and pass that or load it from this class' child with (graphs = super.graphList) or something."); return new StatsPageState(); } } diff --git a/pubspec.yaml b/pubspec.yaml index 6e3259c..aab7c52 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,6 +57,11 @@ flutter: - assets/ - assets/images/ - assets/images/launch_image.png + + fonts: + - family: Consolas + fonts: + - asset: assets/Consolas.ttf # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.io/assets-and-images/#resolution-aware. From 2d741e61c76ddf323a5bc9b09f1393eb92653690 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 2 Sep 2019 17:12:19 +0100 Subject: [PATCH 119/122] about page --- ios/Podfile.lock | 4 +- ios/Runner.xcodeproj/project.pbxproj | 2 +- lib/common/apifunctions/get_map_data.dart | 9 +-- lib/pages/more_page.dart | 74 ++++++++++------------- 4 files changed, 36 insertions(+), 53 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 371ba09..e0081c9 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -14,7 +14,7 @@ PODS: - Flutter DEPENDENCIES: - - Flutter (from `.symlinks/flutter/ios`) + - Flutter (from `.symlinks/flutter/ios-profile`) - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) @@ -25,7 +25,7 @@ SPEC REPOS: EXTERNAL SOURCES: Flutter: - :path: ".symlinks/flutter/ios" + :path: ".symlinks/flutter/ios-profile" google_maps_flutter: :path: ".symlinks/plugins/google_maps_flutter/ios" shared_preferences: diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 8fc019b..f0bdeff 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -282,7 +282,7 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios-profile/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( diff --git a/lib/common/apifunctions/get_map_data.dart b/lib/common/apifunctions/get_map_data.dart index d9779ac..032e74f 100644 --- a/lib/common/apifunctions/get_map_data.dart +++ b/lib/common/apifunctions/get_map_data.dart @@ -59,13 +59,8 @@ Future getLocations(gmaps.LatLng ne, gmaps.LatLng sw) async { const pearLocationsURL = 'https://dev.localspend.co.uk/api/v1/supplier/location'; SharedPreferences preferences = await SharedPreferences.getInstance(); - Map body; - - body = { - 'session_key': preferences.get('LastToken'), - }; - Map> mapData = { + 'session_key': preferences.get('LastToken'), 'north_east': { 'latitude': ne.latitude, 'longitude': ne.longitude @@ -78,7 +73,7 @@ Future getLocations(gmaps.LatLng ne, gmaps.LatLng sw) async { final response = await http.post( pearLocationsURL, - body: json.encode(body), + body: json.encode(mapData), ); if (response.statusCode == 200) { diff --git a/lib/pages/more_page.dart b/lib/pages/more_page.dart index b1d3531..1619faa 100644 --- a/lib/pages/more_page.dart +++ b/lib/pages/more_page.dart @@ -94,33 +94,48 @@ class MorePageState extends State { applicationIcon: new Icon(Icons.receipt), applicationName: "Local Spend Tracker", children: [ - Text( - "Pear Trading is a commerce company designed to register and monitor money circulating in the local economy.\n"), + Text("Pear Trading is a commerce company designed to register and monitor money circulating in the local economy.\n"), Container( - padding: EdgeInsets.symmetric(horizontal: 10), + margin: EdgeInsets.symmetric(horizontal: 10), height: 35, child: RaisedButton( - onPressed: () => {}, -// launch(- something -), - child: Text("Contact us", + onPressed: () => launch('http://www.peartrade.org'), + child: Text("Pear Trading", style: TextStyle( color: Colors.white, fontSize: 18.0)), color: Colors.green, ), ), + Container( - height: 35, - margin: EdgeInsets.fromLTRB(10, 20, 10, 0), - child: RaisedButton( - child: Text( - 'Pear Trading', - style: TextStyle( - color: Colors.white, fontSize: 18.0), + margin: EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 0.0), + height: 40.0, + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(3), + onTap: () => launch('https://shadow.cat'), + child: Column( + children: [ + Align( + child: Text("Developed by"), + alignment: Alignment.centerLeft), + Container( + margin: EdgeInsets.all(0), + child : Text( + "Shadowcat Systems", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold + ), + ), + ), + ], ), - color: Colors.lightGreen, - onPressed: () => - launch('http://www.peartrade.org')), + ), + ), ), + ], ); }, @@ -152,33 +167,6 @@ class MorePageState extends State { ), ), - Padding( - padding: EdgeInsets.fromLTRB(30.0, 20.0, 30.0, 0.0), - child: Container( - height: 75.0, - child: Material( - color: Colors.transparent, - child: InkWell( - borderRadius: BorderRadius.circular(3), - onTap: () => launch('https://shadow.cat'), - child: Column( - children: [ - Align( - child: Text("Developed by"), - alignment: Alignment.centerLeft), - FittedBox( - fit: BoxFit.fitHeight, - child: Image( - image: ExactAssetImage('assets/images/text.png'), - ), - ), - ], - ), - ), - ), - ), - ), - // Padding( // padding: EdgeInsets.fromLTRB(30.0, 20.0, 30.0, 0.0), // child: Container( From 2d462788b70f8b2d3c8fb3aeb9b0cd61256a408f Mon Sep 17 00:00:00 2001 From: Ben Goldsworthy Date: Wed, 29 Jul 2020 21:47:11 +0100 Subject: [PATCH 120/122] Upgrade to new Android platform-side wrappers --- android/app/src/main/AndroidManifest.xml | 20 ++++++++++++++----- .../localspend/localspend/MainActivity.java | 9 +-------- .../main/res/drawable/normal_background.xml | 12 +++++++++++ android/app/src/main/res/values/styles.xml | 4 ++++ 4 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 android/app/src/main/res/drawable/normal_background.xml diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 184c9d7..53c13db 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,17 +13,18 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + - + + + + android:name="io.flutter.embedding.android.SplashScreenDrawable" + android:resource="@drawable/launch_background" /> + + + diff --git a/android/app/src/main/java/uk/co/localspend/localspend/MainActivity.java b/android/app/src/main/java/uk/co/localspend/localspend/MainActivity.java index 361cc1c..238a3b4 100644 --- a/android/app/src/main/java/uk/co/localspend/localspend/MainActivity.java +++ b/android/app/src/main/java/uk/co/localspend/localspend/MainActivity.java @@ -1,13 +1,6 @@ package uk.co.localspend.localspend; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } } diff --git a/android/app/src/main/res/drawable/normal_background.xml b/android/app/src/main/res/drawable/normal_background.xml new file mode 100644 index 0000000..331d9ff --- /dev/null +++ b/android/app/src/main/res/drawable/normal_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 00fa441..2032af9 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -5,4 +5,8 @@ Flutter draws its first frame --> @drawable/launch_background + + From b7e23081e22754350a0e0d43897dcab55eddbdd6 Mon Sep 17 00:00:00 2001 From: Ben Goldsworthy Date: Wed, 29 Jul 2020 21:47:40 +0100 Subject: [PATCH 121/122] Upgrade to AndroidX --- android/gradle.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/gradle.properties b/android/gradle.properties index 8bd86f6..a673820 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true From 96508a0228c455cec76986e72275ee33161113fd Mon Sep 17 00:00:00 2001 From: Ben Goldsworthy Date: Wed, 29 Jul 2020 21:48:40 +0100 Subject: [PATCH 122/122] Upgrade resolvable dependencies --- pubspec.lock | 351 ++++++++++++++++++++++++++++++++++++++++----------- pubspec.yaml | 18 +-- 2 files changed, 285 insertions(+), 84 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 168c087..0b7ae06 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,111 +1,125 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "0.36.4" + version: "0.39.15" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "1.6.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "2.4.2" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.0" build: dependency: transitive description: name: build url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.3.0" build_config: dependency: transitive description: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "0.4.1+1" + version: "0.4.2" build_daemon: dependency: transitive description: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.4" build_resolvers: dependency: transitive description: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "1.3.10" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.6.6" + version: "1.10.0" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "3.0.9" + version: "5.2.0" built_collection: dependency: transitive description: name: built_collection url: "https://pub.dartlang.org" source: hosted - version: "4.2.2" + version: "4.3.2" built_value: dependency: transitive description: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "6.7.0" + version: "7.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" charts_common: dependency: transitive description: name: charts_common url: "https://pub.dartlang.org" source: hosted - version: "0.6.0" + version: "0.9.0" charts_flutter: dependency: "direct main" description: name: charts_flutter url: "https://pub.dartlang.org" source: hosted - version: "0.6.0" + version: "0.9.0" checked_yaml: dependency: transitive description: @@ -113,20 +127,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" code_builder: dependency: transitive description: name: code_builder url: "https://pub.dartlang.org" source: hosted - version: "3.2.0" + version: "3.4.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.14.13" convert: dependency: transitive description: @@ -140,42 +168,56 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.1.5" csslib: dependency: transitive description: name: csslib url: "https://pub.dartlang.org" source: hosted - version: "0.16.1" + version: "0.16.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "0.1.2" + version: "0.1.3" dart_style: dependency: transitive description: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "1.2.9" + version: "1.3.6" datetime_picker_formfield: dependency: "direct main" description: name: datetime_picker_formfield url: "https://pub.dartlang.org" source: hosted - version: "0.1.8" + version: "1.0.0" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.1" fixnum: dependency: transitive description: name: fixnum url: "https://pub.dartlang.org" source: hosted - version: "0.10.9" + version: "0.10.11" flutter: dependency: "direct main" description: flutter @@ -194,38 +236,50 @@ packages: name: flutter_linkify url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "3.1.3" flutter_localizations: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.8" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" - front_end: + flutter_web_plugins: dependency: transitive - description: - name: front_end - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.19" + description: flutter + source: sdk + version: "0.0.0" glob: dependency: transitive description: name: glob url: "https://pub.dartlang.org" source: hosted - version: "1.1.7" + version: "1.2.0" google_maps_flutter: dependency: "direct main" description: name: google_maps_flutter url: "https://pub.dartlang.org" source: hosted - version: "0.5.20+5" + version: "0.5.28+1" + google_maps_flutter_platform_interface: + dependency: transitive + description: + name: google_maps_flutter_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" graphs: dependency: transitive description: @@ -239,91 +293,91 @@ packages: name: html url: "https://pub.dartlang.org" source: hosted - version: "0.14.0+2" + version: "0.14.0+3" http: dependency: "direct main" description: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.12.0+2" + version: "0.12.2" http_multi_server: dependency: transitive description: name: http_multi_server url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" http_parser: dependency: transitive description: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "3.1.3" + version: "3.1.4" intl: dependency: transitive description: name: intl url: "https://pub.dartlang.org" source: hosted - version: "0.15.8" + version: "0.16.1" io: dependency: transitive description: name: io url: "https://pub.dartlang.org" source: hosted - version: "0.3.3" + version: "0.3.4" js: dependency: transitive description: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.1+1" + version: "0.6.2" json_annotation: dependency: "direct main" description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "3.0.1" json_serializable: dependency: "direct main" description: name: json_serializable url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" - kernel: + version: "3.3.0" + linkify: dependency: transitive description: - name: kernel + name: linkify url: "https://pub.dartlang.org" source: hosted - version: "0.3.19" + version: "2.1.0" logging: dependency: transitive description: name: logging url: "https://pub.dartlang.org" source: hosted - version: "0.11.3+2" + version: "0.11.4" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.5" + version: "0.12.8" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.1.8" mime: dependency: transitive description: @@ -331,34 +385,76 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.9.6+3" + node_interop: + dependency: transitive + description: + name: node_interop + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + node_io: + dependency: transitive + description: + name: node_io + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" package_config: dependency: transitive description: name: package_config url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" - package_resolver: - dependency: transitive - description: - name: package_resolver - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.10" + version: "1.9.3" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.6.2" + version: "1.7.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+2" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" pedantic: dependency: "direct dev" description: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.9.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + platform_detect: + dependency: transitive + description: + name: platform_detect + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" pool: dependency: transitive description: @@ -366,13 +462,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.4.0" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.13" pub_semver: dependency: transitive description: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "1.4.2" + version: "1.4.4" pubspec_parse: dependency: transitive description: @@ -386,21 +489,77 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.1.3" + sa_anicoto: + dependency: transitive + description: + name: sa_anicoto + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + sa_multi_tween: + dependency: transitive + description: + name: sa_multi_tween + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + sa_stateless_animation: + dependency: transitive + description: + name: sa_stateless_animation + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + sa_v1_migration: + dependency: transitive + description: + name: sa_v1_migration + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" shared_preferences: dependency: "direct main" description: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.5.8" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.2+1" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+10" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2+7" shelf: dependency: transitive description: name: shelf url: "https://pub.dartlang.org" source: hosted - version: "0.7.5" + version: "0.7.7" shelf_web_socket: dependency: transitive description: @@ -414,7 +573,7 @@ packages: name: simple_animations url: "https://pub.dartlang.org" source: hosted - version: "1.3.3" + version: "2.2.1" sky_engine: dependency: transitive description: flutter @@ -426,21 +585,21 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "0.9.4+3" + version: "0.9.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.7.0" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" + version: "1.9.5" stream_channel: dependency: transitive description: @@ -454,14 +613,21 @@ packages: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "0.0.19" + version: "1.2.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" + supercharged: + dependency: transitive + description: + name: supercharged + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" term_glyph: dependency: transitive description: @@ -475,7 +641,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.17" timing: dependency: transitive description: @@ -489,14 +655,42 @@ packages: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.2.0" url_launcher: dependency: "direct main" description: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "3.0.3" + version: "5.5.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+7" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.7" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" vector_math: dependency: transitive description: @@ -510,21 +704,28 @@ packages: name: watcher url: "https://pub.dartlang.org" source: hosted - version: "0.9.7+12" + version: "0.9.7+15" web_socket_channel: dependency: transitive description: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "1.0.15" + version: "1.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" yaml: dependency: transitive description: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "2.1.16" + version: "2.2.1" sdks: - dart: ">=2.3.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" + dart: ">=2.9.0-14.0.dev <3.0.0" + flutter: ">=1.16.3 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index aab7c52..fb53942 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,17 +17,17 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - shared_preferences: ^0.4.2 - url_launcher: ^3.0.3 - json_annotation : ^2.2.0 + shared_preferences: ^0.5.8 + url_launcher: ^5.5.0 + json_annotation : ^3.0.1 http: ^0.12.0+2 - datetime_picker_formfield: ^0.1.8 - flutter_linkify: ^1.0.3 + datetime_picker_formfield: ^1.0.0 + flutter_linkify: ^3.1.3 flutter_fadein: ^1.1.1 - charts_flutter: ^0.6.0 - simple_animations: ^1.3.3 + charts_flutter: ^0.9.0 + simple_animations: ^2.2.1 google_maps_flutter: ^0.5.20+5 - json_serializable: ^2.0.2 + json_serializable: ^3.3.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 @@ -36,7 +36,7 @@ dev_dependencies: flutter_test: sdk: flutter pedantic: ^1.4.0 - build_runner: ^1.2.7 + build_runner: ^1.10.0 # For information on the generic Dart part of this file, see the # following page: https://www.dartlang.org/tools/pub/pubspec