From c6db642ad80f27117ec15203b0220798a59aaebe Mon Sep 17 00:00:00 2001 From: Nirmal Karthikeyan Date: Fri, 22 Oct 2021 09:30:00 +0530 Subject: [PATCH 001/264] Fixed render issue --- lib/Screens/FamilyMemberAdd.dart | 82 +++++++++++++++-------- lib/Screens/IndividualDataCollection.dart | 61 +++++++---------- lib/Widgets/Datepicker.dart | 29 ++++---- lib/Widgets/TextInputWidget.dart | 4 ++ lib/main.dart | 22 +++--- 5 files changed, 113 insertions(+), 85 deletions(-) create mode 100644 lib/Widgets/TextInputWidget.dart diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 6a10c9e..bd58bb1 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -14,35 +14,63 @@ class _FamilyMemberAddState extends State { @override Widget build(BuildContext context) { return Scaffold( - body: SingleChildScrollView( - child: Column( - children: [ - Form( - key: _formKey, - child: Column( - children: [ - TextFormField( - validator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter the name'; - } - return null; - }, + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + centerTitle: true, + title: Text( + 'Add family member', + style: TextStyle(color: Colors.black), + ), + actions: [ + Icon( + Icons.arrow_back_ios_sharp, + ) + ], + ), + body: SafeArea( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.only(left: 20.0,top: 80,right: 20.0), + child: Column( + children: [ + Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + decoration: InputDecoration( + labelText: "Name", + labelStyle: + TextStyle(color: Colors.deepPurpleAccent, fontSize: 14.0), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0)), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10.0))), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter the name'; + } + return null; + }, + ), + Datepicker(), + OutlinedButton( + onPressed: () { + if (_formKey.currentState!.validate() == true) { + print('Form submitted successfully'); + //TODO: Add logic to store locally and to lazy upload to database + } + }, + child: Text('Submit')) + ], ), - OutlinedButton( - onPressed: () { - if (_formKey.currentState!.validate() == true) { - print('Form submitted successfully'); - //TODO: Add logic to store locally and to lazy upload to database - } - }, - child: Text('Submit')) - ], ), - ), - Datepicker(), - ], + + ], + ), ), - )); + ), + )); } } diff --git a/lib/Screens/IndividualDataCollection.dart b/lib/Screens/IndividualDataCollection.dart index 647e73f..1778928 100644 --- a/lib/Screens/IndividualDataCollection.dart +++ b/lib/Screens/IndividualDataCollection.dart @@ -29,44 +29,35 @@ class _IndividualDataCollectionState extends State { ) ], ), - body: Stack(fit: StackFit.expand, children: [ - Column( - children: [ - Padding( - padding: EdgeInsets.only(top: 0.0), - child: Image.asset("assets/image_03.png"), - ), - Expanded( - child: Container(), - ), - Expanded( - child: Image.asset("assets/image_02.png"), - ), - ], - ), + body: SingleChildScrollView( - child: Padding( - padding: EdgeInsets.only(left: 28.0, right: 28.0), - child: Column( - children: [ - DataCard( - 'Add new person', - 'Enter details of a new family member', - 'assets/svg/female.svg', - FamilyMemberAdd(), - Color(0xFFF700FF), - Color(0xff3D2C8D)), - DataCard( - 'Edit existing person', - 'Edit details of an existing family member', - 'assets/svg/female.svg', - FamilyMemberEdit(), - Color(0xFF2E2FFF), - Color(0xFF4FD586)), - ], + child: SizedBox( + height: MediaQuery.of(context).size.height*0.85, + width: MediaQuery.of(context).size.width, + child: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + DataCard( + 'Add new person', + 'Enter details of a new family member', + 'assets/svg/female.svg', + FamilyMemberAdd(), + Color(0xFFF700FF), + Color(0xff3D2C8D)), + DataCard( + 'Edit existing person', + 'Edit details of an existing family member', + 'assets/svg/female.svg', + FamilyMemberEdit(), + Color(0xFF2E2FFF), + Color(0xFF4FD586)), + ], + ), ), ), ) - ])); + ); } } diff --git a/lib/Widgets/Datepicker.dart b/lib/Widgets/Datepicker.dart index a426bcf..1f669e4 100644 --- a/lib/Widgets/Datepicker.dart +++ b/lib/Widgets/Datepicker.dart @@ -10,38 +10,41 @@ class Datepicker extends StatefulWidget { class _Datepickerstate extends State { - late DateTime date; + DateTime date = DateTime.now(); - String getText(){ - - if(date==null){ + String getText() { + if (date == null) { return 'Pick date'; } - else{ - return '${date.month}/${date.day}/${date.year}'; + else { + return '${date.day}/${date.month}/${date.year}'; } } @override - Widget build(BuildContext context){ + Widget build(BuildContext context) { return Container( child: OutlinedButton( child: Text(getText()), - onPressed: (){ pickDate(context);}, + onPressed: () { + pickDate(context); + }, ), ); } Future pickDate(BuildContext context) async { final initialDate = DateTime.now(); - final newDate = await showDatePicker(context: context, initialDate: initialDate, - firstDate: DateTime(DateTime.now().year-100), - lastDate: DateTime(DateTime.now().year), + final newDate = await showDatePicker( + context: context, initialDate: initialDate, + firstDate: DateTime(1900), + lastDate: DateTime.now(), + initialDatePickerMode: DatePickerMode.year, ); - if(newDate == null) return; + if (newDate == null) return; setState(() => date = newDate); } -} +} \ No newline at end of file diff --git a/lib/Widgets/TextInputWidget.dart b/lib/Widgets/TextInputWidget.dart new file mode 100644 index 0000000..514861f --- /dev/null +++ b/lib/Widgets/TextInputWidget.dart @@ -0,0 +1,4 @@ +import 'package:flutter/material.dart'; + + + diff --git a/lib/main.dart b/lib/main.dart index 4fdfda5..2167e33 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,15 +29,17 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return FutureBuilder( - future: jwtToken, - builder: (context, data) { - if (!data.hasData) - return Login(); - else if (data.hasData && data.data == '') - return Login(); - else - return Home(); - }); + // return FutureBuilder( + // future: jwtToken, + // builder: (context, data) { + // if (!data.hasData) + // return Login(); + // else if (data.hasData && data.data == '') + // return Login(); + // else + // return Home(); + // }); + + return Home(); } } From b7f44f9463b60016500a1d9f53aca5f8afe45e37 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 22 Oct 2021 20:48:26 +0530 Subject: [PATCH 002/264] Added a widget to modularise jwt based page rendering --- lib/Widgets/LoadValidPageWidget.dart | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 lib/Widgets/LoadValidPageWidget.dart diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart new file mode 100644 index 0000000..272da88 --- /dev/null +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -0,0 +1,49 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +final storage = FlutterSecureStorage(); + +/*** + * This widget can be used between usual widgets to avoid rendering + * new pages when jwt not found. + * + * @param: + * Default Page, page to default to when jwt not found + * Target Page, page to load if jwt found + * + * @returns: + * Widget, appropriate widget depending on jwt state + * + * Usage: + * LoadValidPageWidget(Login(), Home()); + */ + +class LoadValidPageWidget extends StatelessWidget{ + LoadValidPageWidget(this.DefaultPage, this.TargetPage); + + final Widget DefaultPage; + final Widget TargetPage; + + Future get jwtToken async { + var jwt = await storage.read(key: "jwt"); + print('jwt' + jwt.toString()); + + if (jwt == null) return ""; + return jwt; + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: jwtToken, + builder: (context, data) { + if (!data.hasData) + return DefaultPage; + else if (data.hasData && data.data == '') + return DefaultPage; + else + return TargetPage; + }); + } + +} \ No newline at end of file From 7c0700c761def2ccf681cb96583cca202a3d3eab Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 22 Oct 2021 20:49:32 +0530 Subject: [PATCH 003/264] Added a widget to modularise jwt based page rendering --- lib/main.dart | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 2167e33..e59a14a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,17 +29,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - // return FutureBuilder( - // future: jwtToken, - // builder: (context, data) { - // if (!data.hasData) - // return Login(); - // else if (data.hasData && data.data == '') - // return Login(); - // else - // return Home(); - // }); - + //TODO: Replace with LoadValidPageWidget return Home(); } } From 3515c24fbb30f7c6925006e7c89be5587996c43e Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 22 Oct 2021 20:49:55 +0530 Subject: [PATCH 004/264] Added a widget to modularise jwt based page rendering --- lib/main.dart | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index e59a14a..6ba9e37 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,14 +19,6 @@ void main() { class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); - Future get jwtToken async { - var jwt = await storage.read(key: "jwt"); - print('jwt' + jwt.toString()); - - if (jwt == null) return ""; - return jwt; - } - @override Widget build(BuildContext context) { //TODO: Replace with LoadValidPageWidget From 925787c323b67c25330be1b8c844a50e4a5a3f33 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 22 Oct 2021 22:09:47 +0530 Subject: [PATCH 005/264] Modularised AppBar, added widget for counting steps and added page for community data collection --- lib/Screens/CommunityDataCollection.dart | 84 +++++++++++++++++++++++ lib/Screens/Home.dart | 3 +- lib/Screens/IndividualDataCollection.dart | 70 ++++++++----------- lib/Widgets/AppBarBackButtonWidget.dart | 43 ++++++++++++ lib/Widgets/LoadValidPageWidget.dart | 2 +- lib/Widgets/StepCounterWidget.dart | 50 ++++++++++++++ pubspec.lock | 7 ++ pubspec.yaml | 1 + 8 files changed, 216 insertions(+), 44 deletions(-) create mode 100644 lib/Screens/CommunityDataCollection.dart create mode 100644 lib/Widgets/AppBarBackButtonWidget.dart create mode 100644 lib/Widgets/StepCounterWidget.dart diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart new file mode 100644 index 0000000..e926ab0 --- /dev/null +++ b/lib/Screens/CommunityDataCollection.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; +import 'package:step_progress_indicator/step_progress_indicator.dart'; + +class CommunityDataCollection extends StatefulWidget { + const CommunityDataCollection({Key? key}) : super(key: key); + + @override + _CommunityDataCollectionState createState() => + _CommunityDataCollectionState(); +} + +class _CommunityDataCollectionState extends State { + int count = 0; + final PageController controller = PageController(initialPage: 0); + + _onPageViewChange(int page) { + print(page); + setState(() { + count = page; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Color(0xffEAE7FA), + appBar: AppBarBackButton('Community Data'), + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + StepCounterWidget(3, count), + Expanded( + child: Container( + child: PageView( + onPageChanged: _onPageViewChange, + physics: new NeverScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + controller: controller, + children: [ + Center( + child: Text('First Page'), + ), + Center( + child: Text('Second Page'), + ), + Center( + child: Text('Third Page'), + ), + Center( + child: Text('Submission'), + ) + ], + ), + )), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + FloatingActionButton( + child: Icon(Icons.arrow_left), + onPressed: () { + controller.previousPage( + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }, + ), + FloatingActionButton( + child: Icon(Icons.arrow_right), + onPressed: () { + controller.nextPage( + duration: Duration(milliseconds: 500), + curve: Curves.easeIn); + }) + ], + ) + ], + ), + ); + } +} diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 52c51b2..e63112d 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/IndividualDataCollection.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -67,7 +68,7 @@ class _HomeWidgetState extends State { 'Community Details', 'Data entry for communities', 'assets/svg/house.svg', - IndividualDataCollection(), + CommunityDataCollection(), Color(0xFF2E2FFF), Color(0xFF4FD586)), DataCard( diff --git a/lib/Screens/IndividualDataCollection.dart b/lib/Screens/IndividualDataCollection.dart index 1778928..a11607f 100644 --- a/lib/Screens/IndividualDataCollection.dart +++ b/lib/Screens/IndividualDataCollection.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:geo_spatial/Screens/FamilyMemberEdit.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; class IndividualDataCollection extends StatefulWidget { @@ -15,49 +16,34 @@ class _IndividualDataCollectionState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - backgroundColor: Colors.white, - elevation: 0, - centerTitle: true, - title: Text( - 'Personal Data', - style: TextStyle(color: Colors.black), - ), - actions: [ - Icon( - Icons.arrow_back_ios_sharp, - ) - ], - ), - body: - SingleChildScrollView( - child: SizedBox( - height: MediaQuery.of(context).size.height*0.85, - width: MediaQuery.of(context).size.width, - child: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - DataCard( - 'Add new person', - 'Enter details of a new family member', - 'assets/svg/female.svg', - FamilyMemberAdd(), - Color(0xFFF700FF), - Color(0xff3D2C8D)), - DataCard( - 'Edit existing person', - 'Edit details of an existing family member', - 'assets/svg/female.svg', - FamilyMemberEdit(), - Color(0xFF2E2FFF), - Color(0xFF4FD586)), - ], - ), + appBar: AppBarBackButton('Personal Data'), + body: SingleChildScrollView( + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.85, + width: MediaQuery.of(context).size.width, + child: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + DataCard( + 'Add new person', + 'Enter details of a new family member', + 'assets/svg/female.svg', + FamilyMemberAdd(), + Color(0xFFF700FF), + Color(0xff3D2C8D)), + DataCard( + 'Edit existing person', + 'Edit details of an existing family member', + 'assets/svg/female.svg', + FamilyMemberEdit(), + Color(0xFF2E2FFF), + Color(0xFF4FD586)), + ], ), ), - ) - ); + ), + )); } } diff --git a/lib/Widgets/AppBarBackButtonWidget.dart b/lib/Widgets/AppBarBackButtonWidget.dart new file mode 100644 index 0000000..6e14ab9 --- /dev/null +++ b/lib/Widgets/AppBarBackButtonWidget.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { + const AppBarBackButton(this.title); + + final String title; + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); + + /** + * Widget for app bars with a back button + * + * @param: + * String title: title to be displayed in app bar + * + * @returns: + * Widget: Returns an AppBar + */ + + @override + Widget build(BuildContext context) { + return AppBar( + backgroundColor: Colors.transparent, + leading: IconButton( + splashRadius: 20, + icon: Icon( + Icons.arrow_back, + color: Colors.black, + ), + onPressed: () { + Navigator.pop(context); + }), + elevation: 0, + centerTitle: true, + title: Text( + title, + style: TextStyle(color: Colors.black), + ), + ); + } +} diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index 272da88..c859ef8 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -19,7 +19,7 @@ final storage = FlutterSecureStorage(); */ class LoadValidPageWidget extends StatelessWidget{ - LoadValidPageWidget(this.DefaultPage, this.TargetPage); + LoadValidPageWidget(this.DefaultPage, this.TargetPage, {Key? key}): super(key: key); final Widget DefaultPage; final Widget TargetPage; diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart new file mode 100644 index 0000000..96698aa --- /dev/null +++ b/lib/Widgets/StepCounterWidget.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:step_progress_indicator/step_progress_indicator.dart'; + +class StepCounterWidget extends StatelessWidget { + const StepCounterWidget(this.totalSteps, this.currentStep, {Key? key}) + : super(key: key); + + final int totalSteps; + final int currentStep; + + /** + * Widget for steps count in registration pages + * + * @param: + * int totalSteps: Total number of steps in registration + * int currentStep: Current position of registration + * + * @returns: + * Widget: Returns a StepProgressIndicator + */ + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.all(10), + child: StepProgressIndicator( + totalSteps: totalSteps, + currentStep: currentStep, + size: 36, + selectedColor: Color.fromARGB(250, 157, 133, 244), + unselectedColor: Color.fromARGB(250, 213, 201, 255), + customStep: (index, color, _) => + color == Color.fromARGB(250, 157, 133, 244) + ? Container( + color: color, + child: Icon( + Icons.check, + color: Colors.white, + ), + ) + : Container( + color: color, + child: Icon( + Icons.remove, + ), + ), + )); + } +} diff --git a/pubspec.lock b/pubspec.lock index cfccc93..4840817 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -254,6 +254,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.10.0" + step_progress_indicator: + dependency: "direct main" + description: + name: step_progress_indicator + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" stream_channel: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f94a7b4..cd98fc3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: flutter_svg: 0.23.0 http: 0.13.4 flutter_secure_storage: ^4.2.1 + step_progress_indicator: ^1.0.1 flutter: sdk: flutter From 487b9ad7bc5b4d38810087b1bad951789373c8f4 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 22 Oct 2021 22:15:29 +0530 Subject: [PATCH 006/264] Changed font style --- lib/Widgets/AppBarBackButtonWidget.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Widgets/AppBarBackButtonWidget.dart b/lib/Widgets/AppBarBackButtonWidget.dart index 6e14ab9..35dd3c1 100644 --- a/lib/Widgets/AppBarBackButtonWidget.dart +++ b/lib/Widgets/AppBarBackButtonWidget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:google_fonts/google_fonts.dart'; class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { const AppBarBackButton(this.title); @@ -36,7 +37,7 @@ class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { centerTitle: true, title: Text( title, - style: TextStyle(color: Colors.black), + style: GoogleFonts.montserrat(fontSize: 20, color: Colors.black), ), ); } From ba46d41d710681a9c686899b4093477a9fe2a407 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Sat, 23 Oct 2021 22:10:46 +0530 Subject: [PATCH 007/264] Added code to lock orientation --- lib/main.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index 6ba9e37..745cf52 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,10 +2,16 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Home.dart'; +import 'package:flutter/services.dart'; final storage = FlutterSecureStorage(); void main() { + + WidgetsFlutterBinding.ensureInitialized(); + SystemChrome.setPreferredOrientations( + [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); + runApp( const MaterialApp( debugShowCheckedModeBanner: false, From 97299449be168496d37975c618351f28bcabdc06 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Sat, 23 Oct 2021 23:56:11 +0530 Subject: [PATCH 008/264] Added dependencies in pubspec, changed compileSdkVersion to 31, added permission for location and added a method to get location --- android/app/build.gradle | 2 +- android/app/src/main/AndroidManifest.xml | 5 ++ .../{NetworkConfig.dart => Constants.dart} | 1 + lib/Screens/CommunityDataCollection.dart | 56 ++++++++++++++++++- lib/Screens/Login.dart | 2 +- lib/Utils/GeoLocation.dart | 4 ++ lib/Widgets/LoadValidPageWidget.dart | 5 +- pubspec.lock | 47 ++++++++++++++++ pubspec.yaml | 1 + 9 files changed, 117 insertions(+), 6 deletions(-) rename lib/Constants/{NetworkConfig.dart => Constants.dart} (79%) create mode 100644 lib/Utils/GeoLocation.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index dc3736b..4d3918e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 30 + compileSdkVersion 31 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8b2eb43..3637f14 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,10 @@ + + + + + diff --git a/lib/Constants/NetworkConfig.dart b/lib/Constants/Constants.dart similarity index 79% rename from lib/Constants/NetworkConfig.dart rename to lib/Constants/Constants.dart index 9705b16..7901dc2 100644 --- a/lib/Constants/NetworkConfig.dart +++ b/lib/Constants/Constants.dart @@ -1,2 +1,3 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding String NETWORK_ADDRESS = '192.168.29.156:3000'; +String JWT_STORAGE_KEY = 'jwt'; diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index e926ab0..a7283c5 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; -import 'package:step_progress_indicator/step_progress_indicator.dart'; +import 'package:geolocator/geolocator.dart'; class CommunityDataCollection extends StatefulWidget { const CommunityDataCollection({Key? key}) : super(key: key); @@ -42,7 +42,17 @@ class _CommunityDataCollectionState extends State { controller: controller, children: [ Center( - child: Text('First Page'), + child: FloatingActionButton.extended( + onPressed: () { + _determinePosition().then((val) { + print(val); + }).catchError((error, stackTrace) { + print("outer: $error"); + }); + }, + label: Text('Get location'), + heroTag: "Get location", + ), ), Center( child: Text('Second Page'), @@ -62,6 +72,7 @@ class _CommunityDataCollectionState extends State { children: [ FloatingActionButton( child: Icon(Icons.arrow_left), + heroTag: "Left button", onPressed: () { controller.previousPage( duration: Duration(milliseconds: 500), @@ -70,6 +81,7 @@ class _CommunityDataCollectionState extends State { ), FloatingActionButton( child: Icon(Icons.arrow_right), + heroTag: "Right button", onPressed: () { controller.nextPage( duration: Duration(milliseconds: 500), @@ -82,3 +94,43 @@ class _CommunityDataCollectionState extends State { ); } } + +/** + * Method to get fine location when requested + * Type future, requires then and catchError + * + * @param: + * none + * + * @returns: + * Future.error, in case of exceptions + * Position, in case of success + * + * Cannot modularise method into separate class + */ + +Future _determinePosition() async { + bool serviceEnabled; + LocationPermission permission; + + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + return Future.error( + 'Location services are disabled, try enabling location in your device'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + return Future.error('Location permissions are denied'); + } + } + + if (permission == LocationPermission.deniedForever) { + return Future.error( + 'Location permissions are permanently denied, permission cannot be requested.'); + } + + return await Geolocator.getCurrentPosition(); +} diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 1e4e9de..46c5cb5 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/NetworkConfig.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Widgets/FormCard.dart'; import 'package:geo_spatial/Screens/Home.dart'; import 'package:http/http.dart' as http; diff --git a/lib/Utils/GeoLocation.dart b/lib/Utils/GeoLocation.dart new file mode 100644 index 0000000..fc7c852 --- /dev/null +++ b/lib/Utils/GeoLocation.dart @@ -0,0 +1,4 @@ +import 'package:geolocator/geolocator.dart'; + +//TODO: Modularise _determinePosition method here + diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index c859ef8..c7b8d7e 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -1,5 +1,6 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; final storage = FlutterSecureStorage(); @@ -25,8 +26,8 @@ class LoadValidPageWidget extends StatelessWidget{ final Widget TargetPage; Future get jwtToken async { - var jwt = await storage.read(key: "jwt"); - print('jwt' + jwt.toString()); + var jwt = await storage.read(key: JWT_STORAGE_KEY); + print(JWT_STORAGE_KEY + jwt.toString()); if (jwt == null) return ""; return jwt; diff --git a/pubspec.lock b/pubspec.lock index 4840817..a51e933 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -102,6 +102,46 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + url: "https://pub.dartlang.org" + source: hosted + version: "7.7.1" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.2" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" google_fonts: dependency: "direct main" description: @@ -130,6 +170,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.17.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index cd98fc3..705cab0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,6 +22,7 @@ environment: dependencies: flutter_svg: 0.23.0 + geolocator: ^7.7.1 http: 0.13.4 flutter_secure_storage: ^4.2.1 step_progress_indicator: ^1.0.1 From 3bfa31369127e78863ae403dc4d6f9eb6a75b3d3 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Sun, 24 Oct 2021 01:07:22 +0530 Subject: [PATCH 009/264] Added widget to display content in page view --- lib/Screens/CommunityDataCollection.dart | 70 +++++++--------- lib/Screens/FamilyMemberAdd.dart | 4 +- .../{Datepicker.dart => DatePicker.dart} | 8 +- lib/Widgets/PageViewContentBox.dart | 80 +++++++++++++++++++ 4 files changed, 117 insertions(+), 45 deletions(-) rename lib/Widgets/{Datepicker.dart => DatePicker.dart} (81%) create mode 100644 lib/Widgets/PageViewContentBox.dart diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index a7283c5..bfeacf5 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; import 'package:geolocator/geolocator.dart'; @@ -23,6 +24,16 @@ class _CommunityDataCollectionState extends State { }); } + _navigatePageLeft() { + controller.previousPage( + duration: Duration(milliseconds: 500), curve: Curves.easeIn); + } + + _navigatePageRight() { + controller.nextPage( + duration: Duration(milliseconds: 500), curve: Curves.easeIn); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -42,53 +53,34 @@ class _CommunityDataCollectionState extends State { controller: controller, children: [ Center( - child: FloatingActionButton.extended( - onPressed: () { - _determinePosition().then((val) { - print(val); - }).catchError((error, stackTrace) { - print("outer: $error"); - }); - }, - label: Text('Get location'), - heroTag: "Get location", - ), - ), + child: PageViewContentBox( + FloatingActionButton.extended( + onPressed: () { + _determinePosition().then((val) { + print(val); + }).catchError((error, stackTrace) { + print("outer: $error"); + }); + }, + label: Text('Get location'), + heroTag: "Get location", + ), + null, + _navigatePageRight)), Center( - child: Text('Second Page'), + child: PageViewContentBox(Text('Second Page'), + _navigatePageLeft, _navigatePageRight), ), Center( - child: Text('Third Page'), + child: PageViewContentBox(Text('Third Page'), + _navigatePageLeft, _navigatePageRight), ), Center( - child: Text('Submission'), - ) + child: PageViewContentBox( + Text('Submission'), _navigatePageLeft, null)) ], ), )), - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - FloatingActionButton( - child: Icon(Icons.arrow_left), - heroTag: "Left button", - onPressed: () { - controller.previousPage( - duration: Duration(milliseconds: 500), - curve: Curves.easeIn); - }, - ), - FloatingActionButton( - child: Icon(Icons.arrow_right), - heroTag: "Right button", - onPressed: () { - controller.nextPage( - duration: Duration(milliseconds: 500), - curve: Curves.easeIn); - }) - ], - ) ], ), ); diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index bd58bb1..bf73681 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Widgets/Datepicker.dart'; +import 'package:geo_spatial/Widgets/DatePicker.dart'; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -54,7 +54,7 @@ class _FamilyMemberAddState extends State { return null; }, ), - Datepicker(), + DatePicker(), OutlinedButton( onPressed: () { if (_formKey.currentState!.validate() == true) { diff --git a/lib/Widgets/Datepicker.dart b/lib/Widgets/DatePicker.dart similarity index 81% rename from lib/Widgets/Datepicker.dart rename to lib/Widgets/DatePicker.dart index 1f669e4..1d26436 100644 --- a/lib/Widgets/Datepicker.dart +++ b/lib/Widgets/DatePicker.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:table_calendar/table_calendar.dart'; -class Datepicker extends StatefulWidget { - const Datepicker({Key? key}) : super(key: key); +class DatePicker extends StatefulWidget { + const DatePicker({Key? key}) : super(key: key); @override - _Datepickerstate createState() => _Datepickerstate(); + _DatePickerState createState() => _DatePickerState(); } -class _Datepickerstate extends State { +class _DatePickerState extends State { DateTime date = DateTime.now(); diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart new file mode 100644 index 0000000..09f9509 --- /dev/null +++ b/lib/Widgets/PageViewContentBox.dart @@ -0,0 +1,80 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +///Card to hold content of DataCollecting PageView, has left and right buttons +///Pass method to control viewpage to respective method parameter +///Pass null to hide button + +class PageViewContentBox extends StatelessWidget { + const PageViewContentBox( + this.centerWidget, this.leftClickParam, this.rightClickParam, + {Key? key}) + : super(key: key); + + final Widget centerWidget; + final leftClickParam; + final rightClickParam; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.all(10), + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC674E6F), + blurRadius: 8.0, + ), + ], + ), + child: Padding( + padding: EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Center( + child: centerWidget, + )), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Visibility( + maintainSize: true, + maintainAnimation: true, + maintainState: true, + visible: leftClickParam != null, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: Color.fromARGB(250, 157, 133, 244)), + onPressed: (){ + leftClickParam(); + }, + child: Icon(Icons.arrow_left))), + Visibility( + maintainSize: true, + maintainAnimation: true, + maintainState: true, + visible: rightClickParam != null, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: Color.fromARGB(250, 157, 133, 244)), + onPressed: (){ + rightClickParam(); + }, + child: Icon(Icons.arrow_right))) + ], + ) + ], + ), + ), + ), + ); + } +} From 75cc67d1c0a12acf73df547017fd5d3fc00d25f0 Mon Sep 17 00:00:00 2001 From: nirmalk Date: Wed, 27 Oct 2021 10:08:48 +0530 Subject: [PATCH 010/264] Updated FamilyMemberAdd.dart to use AppBarBackButton --- assets/svg/female.svg | 1 - assets/svg/green_suburb.svg | 1 - assets/svg/house.svg | 1 - assets/svg/houses.svg | 1 - assets/svg/male.svg | 1 - assets/svg/map.svg | 1 - assets/svg/red_suburb.svg | 1 - assets/svg/right-arrow.svg | 1 - assets/svg/right-icon-arrow.svg | 1 - assets/svg/right_arrow.svg | 1 - assets/svg/storage_image.svg | 1 - assets/svg/transgender.svg | 1 - assets/svg/undraw_community_8nwl.svg | 1 - assets/svg/undraw_wishlist_jk8a.svg | 1 - lib/Screens/CommunityDataCollection.dart | 4 ++-- lib/Screens/FamilyMemberAdd.dart | 16 ++-------------- pubspec.yaml | 2 +- 17 files changed, 5 insertions(+), 31 deletions(-) delete mode 100644 assets/svg/female.svg delete mode 100644 assets/svg/green_suburb.svg delete mode 100644 assets/svg/house.svg delete mode 100644 assets/svg/houses.svg delete mode 100644 assets/svg/male.svg delete mode 100644 assets/svg/map.svg delete mode 100644 assets/svg/red_suburb.svg delete mode 100644 assets/svg/right-arrow.svg delete mode 100644 assets/svg/right-icon-arrow.svg delete mode 100644 assets/svg/right_arrow.svg delete mode 100644 assets/svg/storage_image.svg delete mode 100644 assets/svg/transgender.svg delete mode 100644 assets/svg/undraw_community_8nwl.svg delete mode 100644 assets/svg/undraw_wishlist_jk8a.svg diff --git a/assets/svg/female.svg b/assets/svg/female.svg deleted file mode 100644 index f7bdd6b..0000000 --- a/assets/svg/female.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/green_suburb.svg b/assets/svg/green_suburb.svg deleted file mode 100644 index c44f45b..0000000 --- a/assets/svg/green_suburb.svg +++ /dev/null @@ -1 +0,0 @@ -suburbs \ No newline at end of file diff --git a/assets/svg/house.svg b/assets/svg/house.svg deleted file mode 100644 index f030ed8..0000000 --- a/assets/svg/house.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/houses.svg b/assets/svg/houses.svg deleted file mode 100644 index 1f5c3cf..0000000 --- a/assets/svg/houses.svg +++ /dev/null @@ -1 +0,0 @@ -small_town \ No newline at end of file diff --git a/assets/svg/male.svg b/assets/svg/male.svg deleted file mode 100644 index 70688dc..0000000 --- a/assets/svg/male.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/map.svg b/assets/svg/map.svg deleted file mode 100644 index 8e99895..0000000 --- a/assets/svg/map.svg +++ /dev/null @@ -1 +0,0 @@ -Map dark \ No newline at end of file diff --git a/assets/svg/red_suburb.svg b/assets/svg/red_suburb.svg deleted file mode 100644 index 24c7037..0000000 --- a/assets/svg/red_suburb.svg +++ /dev/null @@ -1 +0,0 @@ -suburbs \ No newline at end of file diff --git a/assets/svg/right-arrow.svg b/assets/svg/right-arrow.svg deleted file mode 100644 index 0b775d1..0000000 --- a/assets/svg/right-arrow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/right-icon-arrow.svg b/assets/svg/right-icon-arrow.svg deleted file mode 100644 index 00f5fb5..0000000 --- a/assets/svg/right-icon-arrow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/right_arrow.svg b/assets/svg/right_arrow.svg deleted file mode 100644 index 0b775d1..0000000 --- a/assets/svg/right_arrow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/storage_image.svg b/assets/svg/storage_image.svg deleted file mode 100644 index 90d96a5..0000000 --- a/assets/svg/storage_image.svg +++ /dev/null @@ -1 +0,0 @@ -collecting \ No newline at end of file diff --git a/assets/svg/transgender.svg b/assets/svg/transgender.svg deleted file mode 100644 index ce0b4d8..0000000 --- a/assets/svg/transgender.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/undraw_community_8nwl.svg b/assets/svg/undraw_community_8nwl.svg deleted file mode 100644 index 0384260..0000000 --- a/assets/svg/undraw_community_8nwl.svg +++ /dev/null @@ -1 +0,0 @@ -community \ No newline at end of file diff --git a/assets/svg/undraw_wishlist_jk8a.svg b/assets/svg/undraw_wishlist_jk8a.svg deleted file mode 100644 index fa5ea66..0000000 --- a/assets/svg/undraw_wishlist_jk8a.svg +++ /dev/null @@ -1 +0,0 @@ -wishlist \ No newline at end of file diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index bfeacf5..defa5b4 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -26,12 +26,12 @@ class _CommunityDataCollectionState extends State { _navigatePageLeft() { controller.previousPage( - duration: Duration(milliseconds: 500), curve: Curves.easeIn); + duration: Duration(milliseconds: 200), curve: Curves.easeIn); } _navigatePageRight() { controller.nextPage( - duration: Duration(milliseconds: 500), curve: Curves.easeIn); + duration: Duration(milliseconds: 200), curve: Curves.easeIn); } @override diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index bf73681..2bd68cf 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePicker.dart'; class FamilyMemberAdd extends StatefulWidget { @@ -14,20 +15,7 @@ class _FamilyMemberAddState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - backgroundColor: Colors.white, - elevation: 0, - centerTitle: true, - title: Text( - 'Add family member', - style: TextStyle(color: Colors.black), - ), - actions: [ - Icon( - Icons.arrow_back_ios_sharp, - ) - ], - ), + appBar: AppBarBackButton('Add Family Member'), body: SafeArea( child: SingleChildScrollView( child: Padding( diff --git a/pubspec.yaml b/pubspec.yaml index 705cab0..4c64a9c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,7 +54,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - assets/ - - assets/svg/ + # - assets/svg/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see From 008c631535c6a6cd8d437727acbf780fe1820b60 Mon Sep 17 00:00:00 2001 From: nirmalk Date: Wed, 27 Oct 2021 10:20:07 +0530 Subject: [PATCH 011/264] Implemented PageViewContentBox in FamilyMemberAdd.dart --- lib/Screens/FamilyMemberAdd.dart | 76 +++++++++++++---------------- lib/Widgets/PageViewContentBox.dart | 2 +- 2 files changed, 34 insertions(+), 44 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 2bd68cf..5c0e1fc 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePicker.dart'; +import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; +import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -12,53 +14,41 @@ class FamilyMemberAdd extends StatefulWidget { class _FamilyMemberAddState extends State { final _formKey = GlobalKey(); + int count = 0; + final PageController _controller = PageController(initialPage: 0); + + _onPageViewChange(int page) { + print(page); + setState(() { + count = page; + }); + } + @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), - body: SafeArea( - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.only(left: 20.0,top: 80,right: 20.0), - child: Column( - children: [ - Form( - key: _formKey, - child: Column( - children: [ - TextFormField( - decoration: InputDecoration( - labelText: "Name", - labelStyle: - TextStyle(color: Colors.deepPurpleAccent, fontSize: 14.0), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0)), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0))), - validator: (value) { - if (value == null || value.isEmpty) { - return 'Please enter the name'; - } - return null; - }, - ), - DatePicker(), - OutlinedButton( - onPressed: () { - if (_formKey.currentState!.validate() == true) { - print('Form submitted successfully'); - //TODO: Add logic to store locally and to lazy upload to database - } - }, - child: Text('Submit')) - ], - ), + body: Column( + children: [ + StepCounterWidget(5, count), + Expanded(child: Container( + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: _controller, + children: [ + PageViewContentBox(Text('Page 1'), null,null), + PageViewContentBox(Text('Page 2'), null,null), + PageViewContentBox(Text('Page 3'), null,null), + PageViewContentBox(Text('Page 4'), null,null), + PageViewContentBox(Text('Page 5'), null,null), + PageViewContentBox(Text('Page Check'), null,null), + ], ), - - ], - ), - ), - ), - )); + )) + ], + ) + ); } } diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index 09f9509..b7ce170 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; ///Card to hold content of DataCollecting PageView, has left and right buttons -///Pass method to control viewpage to respective method parameter +///Pass method to control viewpage to respective method parameters (left and right) ///Pass null to hide button class PageViewContentBox extends StatelessWidget { From 8b1ed29b2485fe6d0cccbbc667b5d7581fabeb27 Mon Sep 17 00:00:00 2001 From: nirmalk Date: Wed, 27 Oct 2021 10:42:30 +0530 Subject: [PATCH 012/264] Implemented PageViewContentBox in FamilyMemberAdd.dart --- lib/Screens/FamilyMemberAdd.dart | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 5c0e1fc..57c58a3 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -46,7 +46,17 @@ class _FamilyMemberAddState extends State { PageViewContentBox(Text('Page Check'), null,null), ], ), - )) + )), + Padding( + padding: const EdgeInsets.only(top: 8.0,bottom: 16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + OutlinedButton.icon(onPressed: (){}, label: Text('Cancel'),icon: Icon(Icons.cancel_outlined),), + OutlinedButton.icon(onPressed: (){}, icon: Icon(Icons.arrow_forward_outlined), label: Text('Submit')), + ], + ), + ) ], ) ); From 2c66208c50fafe6855d6075514c98f5d2791496c Mon Sep 17 00:00:00 2001 From: nirmalk Date: Wed, 27 Oct 2021 13:14:35 +0530 Subject: [PATCH 013/264] Removed buttons and related params from PageViewContentBox.dart and made relevant changes to Community and FamilyMember --- lib/Screens/CommunityDataCollection.dart | 12 ++-- lib/Screens/FamilyMemberAdd.dart | 83 +++++++++++++++--------- lib/Widgets/PageViewContentBox.dart | 37 +---------- 3 files changed, 58 insertions(+), 74 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index defa5b4..aba5d72 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -64,20 +64,16 @@ class _CommunityDataCollectionState extends State { }, label: Text('Get location'), heroTag: "Get location", - ), - null, - _navigatePageRight)), + ),)), Center( - child: PageViewContentBox(Text('Second Page'), - _navigatePageLeft, _navigatePageRight), + child: PageViewContentBox(Text('Second Page')), ), Center( - child: PageViewContentBox(Text('Third Page'), - _navigatePageLeft, _navigatePageRight), + child: PageViewContentBox(Text('Third Page')), ), Center( child: PageViewContentBox( - Text('Submission'), _navigatePageLeft, null)) + Text('Submission'))) ], ), )), diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 57c58a3..76d530a 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/Widgets/DatePicker.dart'; import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; @@ -29,36 +28,58 @@ class _FamilyMemberAddState extends State { return Scaffold( backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), - body: Column( - children: [ - StepCounterWidget(5, count), - Expanded(child: Container( - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: _controller, - children: [ - PageViewContentBox(Text('Page 1'), null,null), - PageViewContentBox(Text('Page 2'), null,null), - PageViewContentBox(Text('Page 3'), null,null), - PageViewContentBox(Text('Page 4'), null,null), - PageViewContentBox(Text('Page 5'), null,null), - PageViewContentBox(Text('Page Check'), null,null), - ], - ), - )), - Padding( - padding: const EdgeInsets.only(top: 8.0,bottom: 16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - OutlinedButton.icon(onPressed: (){}, label: Text('Cancel'),icon: Icon(Icons.cancel_outlined),), - OutlinedButton.icon(onPressed: (){}, icon: Icon(Icons.arrow_forward_outlined), label: Text('Submit')), - ], - ), - ) - ], - ) + body: Column( + children: [ + StepCounterWidget(5, count), + Expanded( + child: Container( + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: _controller, + children: [ + PageViewContentBox(pageOne), + PageViewContentBox(Text('Page 2')), + PageViewContentBox(Text('Page 3')), + PageViewContentBox(Text('Page 4')), + PageViewContentBox(Text('Page 5')), + PageViewContentBox(Text('Page Check')), + ], + ), + )), + Padding( + padding: const EdgeInsets.only(top: 8.0, bottom: 16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + OutlinedButton.icon( + onPressed: () {}, + label: Text('Cancel',style: TextStyle(color: Colors.red,fontSize: 20),), + icon: Icon(Icons.cancel_outlined,size: 40,color: Colors.red,), + style: OutlinedButton.styleFrom( + backgroundColor: Colors.white, + ), + ), + OutlinedButton.icon( + onPressed: () {}, + icon: Icon(Icons.arrow_forward_outlined,size: 40,color: Colors.green,), + label: Text('Submit',style: TextStyle(color: Colors.green,fontSize: 20),), + style: OutlinedButton.styleFrom( + backgroundColor: Colors.white, + //shape:, + ), + ), + ], + ), + ) + ], + ), ); } + + final pageOne = Column( + children: [ + Text('Text',textAlign: TextAlign.center,), + ], + ); } diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index b7ce170..1fccb37 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -8,13 +8,10 @@ import 'package:flutter/widgets.dart'; class PageViewContentBox extends StatelessWidget { const PageViewContentBox( - this.centerWidget, this.leftClickParam, this.rightClickParam, - {Key? key}) - : super(key: key); + this.centerWidget, + {Key? key}) : super(key: key); final Widget centerWidget; - final leftClickParam; - final rightClickParam; @override Widget build(BuildContext context) { @@ -41,36 +38,6 @@ class PageViewContentBox extends StatelessWidget { child: Center( child: centerWidget, )), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Visibility( - maintainSize: true, - maintainAnimation: true, - maintainState: true, - visible: leftClickParam != null, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - primary: Color.fromARGB(250, 157, 133, 244)), - onPressed: (){ - leftClickParam(); - }, - child: Icon(Icons.arrow_left))), - Visibility( - maintainSize: true, - maintainAnimation: true, - maintainState: true, - visible: rightClickParam != null, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - primary: Color.fromARGB(250, 157, 133, 244)), - onPressed: (){ - rightClickParam(); - }, - child: Icon(Icons.arrow_right))) - ], - ) ], ), ), From 87dc98f63c7cace062800665e73af57927c5b1bc Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Wed, 27 Oct 2021 15:38:28 +0530 Subject: [PATCH 014/264] Made custom Step counter bar --- lib/Screens/CommunityDataCollection.dart | 2 +- lib/Widgets/StepCounterWidget.dart | 115 ++++++++++++++++------- 2 files changed, 80 insertions(+), 37 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index bfeacf5..cd2dad6 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -43,7 +43,7 @@ class _CommunityDataCollectionState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - StepCounterWidget(3, count), + StepCounterWidget(3, count, [false, false, false]), Expanded( child: Container( child: PageView( diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 96698aa..09e5595 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -1,50 +1,93 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:step_progress_indicator/step_progress_indicator.dart'; -class StepCounterWidget extends StatelessWidget { - const StepCounterWidget(this.totalSteps, this.currentStep, {Key? key}) +/** + * Widget for steps count in registration pages + * + * @param: + * int totalSteps: Total number of steps in registration + * int currentStep: Current position of registration + * + * @returns: + * Widget: Returns a StepProgressIndicator + */ + +class StepCounterWidget extends StatefulWidget { + const StepCounterWidget(this.totalSteps, this.currentStep, this.errorArray, + {Key? key}) : super(key: key); final int totalSteps; final int currentStep; + final List errorArray; - /** - * Widget for steps count in registration pages - * - * @param: - * int totalSteps: Total number of steps in registration - * int currentStep: Current position of registration - * - * @returns: - * Widget: Returns a StepProgressIndicator - */ + @override + _StepCounterWidgetState createState() => _StepCounterWidgetState(); +} +class _StepCounterWidgetState extends State { @override Widget build(BuildContext context) { + List checkBoxWidgetList = []; + + for (int i = 0; i < widget.totalSteps; i++) { + if (i < widget.currentStep) { + try { + widget.errorArray[i] + ? checkBoxWidgetList.add(CheckBox(0)) + : checkBoxWidgetList.add(CheckBox(1)); + print(widget.errorArray[i].toString() + " " + i.toString()); + } catch (error) { + checkBoxWidgetList.add(CheckBox(1)); + } + } else { + checkBoxWidgetList.add(CheckBox(2)); + } + } + return Padding( - padding: EdgeInsets.all(10), - child: StepProgressIndicator( - totalSteps: totalSteps, - currentStep: currentStep, - size: 36, - selectedColor: Color.fromARGB(250, 157, 133, 244), - unselectedColor: Color.fromARGB(250, 213, 201, 255), - customStep: (index, color, _) => - color == Color.fromARGB(250, 157, 133, 244) - ? Container( - color: color, - child: Icon( - Icons.check, - color: Colors.white, - ), - ) - : Container( - color: color, - child: Icon( - Icons.remove, - ), - ), - )); + padding: EdgeInsets.only(left: 10, right: 10), + child: Row( + children: checkBoxWidgetList, + ), + ); + } +} + +class CheckBox extends StatelessWidget { + const CheckBox(this.iconType, {Key? key}) : super(key: key); + final int iconType; + + @override + Widget build(BuildContext context) { + IconData icon; + Color iconColor; + Color backgroundColor; + + if (iconType == 0) { + icon = Icons.close; + iconColor = Color.fromARGB(255, 255, 205, 205); + backgroundColor = Colors.red; + } else if (iconType == 1) { + icon = Icons.check; + iconColor = Colors.white; + backgroundColor = Color.fromARGB(250, 157, 133, 244); + } else { + icon = Icons.remove; + iconColor = Color.fromARGB(255, 0, 0, 0); + backgroundColor = Color.fromARGB(250, 213, 201, 255); + } + return Expanded( + child: Container( + margin: EdgeInsets.only(left: 3.0, right: 3.0), + child: Padding( + padding: EdgeInsets.only(top: 5, bottom: 5), + child: Icon( + icon, + color: iconColor, + ), + ), + color: backgroundColor, + )); } } From 8c7e88a650b4cf154c87efbce055cb20aafef762 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Wed, 27 Oct 2021 15:44:37 +0530 Subject: [PATCH 015/264] Added custom widget for step counter --- lib/Screens/FamilyMemberAdd.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 76d530a..b619ec4 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -30,7 +30,7 @@ class _FamilyMemberAddState extends State { appBar: AppBarBackButton('Add Family Member'), body: Column( children: [ - StepCounterWidget(5, count), + StepCounterWidget(5, count, []), Expanded( child: Container( child: PageView( From 6d2292cb1877a8df50bf3ac078495167811ece34 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Wed, 27 Oct 2021 15:47:06 +0530 Subject: [PATCH 016/264] Added svg assets --- assets/svg/female.svg | 1 + assets/svg/green_suburb.svg | 1 + assets/svg/house.svg | 1 + assets/svg/houses.svg | 1 + assets/svg/male.svg | 1 + assets/svg/map.svg | 1 + assets/svg/red_suburb.svg | 1 + assets/svg/right-arrow.svg | 1 + assets/svg/right-icon-arrow.svg | 1 + assets/svg/right_arrow.svg | 1 + assets/svg/storage_image.svg | 1 + assets/svg/transgender.svg | 1 + assets/svg/undraw_community_8nwl.svg | 1 + assets/svg/undraw_wishlist_jk8a.svg | 1 + 14 files changed, 14 insertions(+) create mode 100644 assets/svg/female.svg create mode 100644 assets/svg/green_suburb.svg create mode 100644 assets/svg/house.svg create mode 100644 assets/svg/houses.svg create mode 100644 assets/svg/male.svg create mode 100644 assets/svg/map.svg create mode 100644 assets/svg/red_suburb.svg create mode 100644 assets/svg/right-arrow.svg create mode 100644 assets/svg/right-icon-arrow.svg create mode 100644 assets/svg/right_arrow.svg create mode 100644 assets/svg/storage_image.svg create mode 100644 assets/svg/transgender.svg create mode 100644 assets/svg/undraw_community_8nwl.svg create mode 100644 assets/svg/undraw_wishlist_jk8a.svg diff --git a/assets/svg/female.svg b/assets/svg/female.svg new file mode 100644 index 0000000..f7bdd6b --- /dev/null +++ b/assets/svg/female.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/green_suburb.svg b/assets/svg/green_suburb.svg new file mode 100644 index 0000000..c44f45b --- /dev/null +++ b/assets/svg/green_suburb.svg @@ -0,0 +1 @@ +suburbs \ No newline at end of file diff --git a/assets/svg/house.svg b/assets/svg/house.svg new file mode 100644 index 0000000..f030ed8 --- /dev/null +++ b/assets/svg/house.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/houses.svg b/assets/svg/houses.svg new file mode 100644 index 0000000..1f5c3cf --- /dev/null +++ b/assets/svg/houses.svg @@ -0,0 +1 @@ +small_town \ No newline at end of file diff --git a/assets/svg/male.svg b/assets/svg/male.svg new file mode 100644 index 0000000..70688dc --- /dev/null +++ b/assets/svg/male.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/map.svg b/assets/svg/map.svg new file mode 100644 index 0000000..8e99895 --- /dev/null +++ b/assets/svg/map.svg @@ -0,0 +1 @@ +Map dark \ No newline at end of file diff --git a/assets/svg/red_suburb.svg b/assets/svg/red_suburb.svg new file mode 100644 index 0000000..24c7037 --- /dev/null +++ b/assets/svg/red_suburb.svg @@ -0,0 +1 @@ +suburbs \ No newline at end of file diff --git a/assets/svg/right-arrow.svg b/assets/svg/right-arrow.svg new file mode 100644 index 0000000..0b775d1 --- /dev/null +++ b/assets/svg/right-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/right-icon-arrow.svg b/assets/svg/right-icon-arrow.svg new file mode 100644 index 0000000..00f5fb5 --- /dev/null +++ b/assets/svg/right-icon-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/right_arrow.svg b/assets/svg/right_arrow.svg new file mode 100644 index 0000000..0b775d1 --- /dev/null +++ b/assets/svg/right_arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/storage_image.svg b/assets/svg/storage_image.svg new file mode 100644 index 0000000..90d96a5 --- /dev/null +++ b/assets/svg/storage_image.svg @@ -0,0 +1 @@ +collecting \ No newline at end of file diff --git a/assets/svg/transgender.svg b/assets/svg/transgender.svg new file mode 100644 index 0000000..ce0b4d8 --- /dev/null +++ b/assets/svg/transgender.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/undraw_community_8nwl.svg b/assets/svg/undraw_community_8nwl.svg new file mode 100644 index 0000000..0384260 --- /dev/null +++ b/assets/svg/undraw_community_8nwl.svg @@ -0,0 +1 @@ +community \ No newline at end of file diff --git a/assets/svg/undraw_wishlist_jk8a.svg b/assets/svg/undraw_wishlist_jk8a.svg new file mode 100644 index 0000000..fa5ea66 --- /dev/null +++ b/assets/svg/undraw_wishlist_jk8a.svg @@ -0,0 +1 @@ +wishlist \ No newline at end of file From 9f7bf96698412b87de43f157264fd6252b53536f Mon Sep 17 00:00:00 2001 From: Nirmal Date: Sat, 30 Oct 2021 18:14:56 +0530 Subject: [PATCH 017/264] Abstracted pages into separate files as forms --- ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Podfile | 41 ++++++++++++++++++ lib/Screens/FamilyAddScreens/PageOne.dart | 52 +++++++++++++++++++++++ lib/Screens/FamilyMemberAdd.dart | 12 +++--- lib/Screens/IndividualDataCollection.dart | 2 +- lib/Widgets/DatePicker.dart | 12 ++++-- lib/Widgets/TextInputWidget.dart | 18 ++++++++ 8 files changed, 128 insertions(+), 11 deletions(-) create mode 100644 ios/Podfile create mode 100644 lib/Screens/FamilyAddScreens/PageOne.dart diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..ec97fc6 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..c4855bf 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..1e8c3c9 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,41 @@ +# 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 flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/lib/Screens/FamilyAddScreens/PageOne.dart b/lib/Screens/FamilyAddScreens/PageOne.dart new file mode 100644 index 0000000..5b6a4f3 --- /dev/null +++ b/lib/Screens/FamilyAddScreens/PageOne.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Widgets/DatePicker.dart'; + + + +class PageOne extends StatefulWidget { + + PageOne(this._formKey); + + final _formKey; + + bool checkValidationState(){ + return _formKey.currentState!.validate(); + } + + @override + _PageOneState createState() => _PageOneState(); +} + +class _PageOneState extends State { + @override + Widget build(BuildContext context){ + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Enter name:',textAlign: TextAlign.start,), + Form( + key: widget._formKey, + child: Column( + children: [ + TextFormField( + validator: (value){ + if(value==null || value=='') + return 'Enter a valid name'; + + else{ + return 'Great'; + } + }, + autovalidateMode: AutovalidateMode.always, + ), + DatePicker(), + ], + ) + ) + ], + ); + } + + +} + diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index b619ec4..66f51f1 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/FamilyAddScreens/PageOne.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; + class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -11,7 +13,7 @@ class FamilyMemberAdd extends StatefulWidget { } class _FamilyMemberAddState extends State { - final _formKey = GlobalKey(); + final formKey = GlobalKey(); int count = 0; final PageController _controller = PageController(initialPage: 0); @@ -38,7 +40,7 @@ class _FamilyMemberAddState extends State { scrollDirection: Axis.horizontal, controller: _controller, children: [ - PageViewContentBox(pageOne), + PageViewContentBox(PageOne(formKey)), PageViewContentBox(Text('Page 2')), PageViewContentBox(Text('Page 3')), PageViewContentBox(Text('Page 4')), @@ -77,9 +79,5 @@ class _FamilyMemberAddState extends State { ); } - final pageOne = Column( - children: [ - Text('Text',textAlign: TextAlign.center,), - ], - ); } + diff --git a/lib/Screens/IndividualDataCollection.dart b/lib/Screens/IndividualDataCollection.dart index a11607f..70a03e5 100644 --- a/lib/Screens/IndividualDataCollection.dart +++ b/lib/Screens/IndividualDataCollection.dart @@ -36,7 +36,7 @@ class _IndividualDataCollectionState extends State { DataCard( 'Edit existing person', 'Edit details of an existing family member', - 'assets/svg/female.svg', + 'assets/svg/male.svg', FamilyMemberEdit(), Color(0xFF2E2FFF), Color(0xFF4FD586)), diff --git a/lib/Widgets/DatePicker.dart b/lib/Widgets/DatePicker.dart index 1d26436..97cb0f1 100644 --- a/lib/Widgets/DatePicker.dart +++ b/lib/Widgets/DatePicker.dart @@ -12,6 +12,8 @@ class _DatePickerState extends State { DateTime date = DateTime.now(); + var textFieldController = TextEditingController(); + String getText() { if (date == null) { return 'Pick date'; @@ -24,12 +26,15 @@ class _DatePickerState extends State { @override Widget build(BuildContext context) { + + return Container( - child: OutlinedButton( - child: Text(getText()), - onPressed: () { + child: TextField( + controller: textFieldController, + onTap: () { pickDate(context); }, + ), ); } @@ -46,5 +51,6 @@ class _DatePickerState extends State { if (newDate == null) return; setState(() => date = newDate); + textFieldController.text = getText(); } } \ No newline at end of file diff --git a/lib/Widgets/TextInputWidget.dart b/lib/Widgets/TextInputWidget.dart index 514861f..7bf0234 100644 --- a/lib/Widgets/TextInputWidget.dart +++ b/lib/Widgets/TextInputWidget.dart @@ -1,4 +1,22 @@ import 'package:flutter/material.dart'; +class TextInputWidget extends StatelessWidget { + + + TextInputWidget(this._formKey,this.validator); + + final _formKey; + final validator; + + + @override + Widget build(BuildContext context) { + return TextFormField( + key: _formKey, + validator: validator, + onChanged: (err){_formKey.currentState!.validate();}, + ); + } +} From ce9ac6e9d3435840fb2400389064a162d215c8b9 Mon Sep 17 00:00:00 2001 From: Nirmal Date: Sat, 30 Oct 2021 19:08:53 +0530 Subject: [PATCH 018/264] FamilyMemberAdd.dart kind of works. StepCounting issues. --- lib/Screens/FamilyAddScreens/PageOne.dart | 6 +----- lib/Screens/FamilyMemberAdd.dart | 20 +++++++++++++------- lib/Widgets/TextInputWidget.dart | 19 ------------------- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/lib/Screens/FamilyAddScreens/PageOne.dart b/lib/Screens/FamilyAddScreens/PageOne.dart index 5b6a4f3..31be75c 100644 --- a/lib/Screens/FamilyAddScreens/PageOne.dart +++ b/lib/Screens/FamilyAddScreens/PageOne.dart @@ -9,10 +9,6 @@ class PageOne extends StatefulWidget { final _formKey; - bool checkValidationState(){ - return _formKey.currentState!.validate(); - } - @override _PageOneState createState() => _PageOneState(); } @@ -34,7 +30,7 @@ class _PageOneState extends State { return 'Enter a valid name'; else{ - return 'Great'; + return null; } }, autovalidateMode: AutovalidateMode.always, diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 66f51f1..33586a4 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -14,14 +14,20 @@ class FamilyMemberAdd extends StatefulWidget { class _FamilyMemberAddState extends State { final formKey = GlobalKey(); + final List> formKeyList = List.generate(10, (index) => GlobalObjectKey(index)); int count = 0; final PageController _controller = PageController(initialPage: 0); + var errorArray = [false,false,false,false,false,false]; _onPageViewChange(int page) { + if(page { appBar: AppBarBackButton('Add Family Member'), body: Column( children: [ - StepCounterWidget(5, count, []), + StepCounterWidget(5, count, errorArray), Expanded( child: Container( child: PageView( @@ -40,12 +46,12 @@ class _FamilyMemberAddState extends State { scrollDirection: Axis.horizontal, controller: _controller, children: [ - PageViewContentBox(PageOne(formKey)), - PageViewContentBox(Text('Page 2')), - PageViewContentBox(Text('Page 3')), - PageViewContentBox(Text('Page 4')), - PageViewContentBox(Text('Page 5')), - PageViewContentBox(Text('Page Check')), + PageViewContentBox(PageOne(formKeyList[1])), + PageViewContentBox(PageOne(formKeyList[2])), + PageViewContentBox(PageOne(formKeyList[3])), + PageViewContentBox(PageOne(formKeyList[4])), + PageViewContentBox(PageOne(formKeyList[5])), + PageViewContentBox(PageOne(formKeyList[6])), ], ), )), diff --git a/lib/Widgets/TextInputWidget.dart b/lib/Widgets/TextInputWidget.dart index 7bf0234..d10255e 100644 --- a/lib/Widgets/TextInputWidget.dart +++ b/lib/Widgets/TextInputWidget.dart @@ -1,22 +1,3 @@ import 'package:flutter/material.dart'; -class TextInputWidget extends StatelessWidget { - - - TextInputWidget(this._formKey,this.validator); - - final _formKey; - final validator; - - - @override - Widget build(BuildContext context) { - return TextFormField( - key: _formKey, - validator: validator, - onChanged: (err){_formKey.currentState!.validate();}, - ); - } -} - From e063c0635a04b19b236b776ea75911768ecf57a3 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Sat, 30 Oct 2021 20:10:17 +0530 Subject: [PATCH 019/264] made changes to family member add --- lib/Screens/FamilyMemberAdd.dart | 46 +++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 33586a4..3d80d32 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -4,7 +4,6 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; - class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -14,20 +13,22 @@ class FamilyMemberAdd extends StatefulWidget { class _FamilyMemberAddState extends State { final formKey = GlobalKey(); - final List> formKeyList = List.generate(10, (index) => GlobalObjectKey(index)); + final List> formKeyList = + List.generate(6, (index) => GlobalObjectKey(index)); int count = 0; final PageController _controller = PageController(initialPage: 0); - var errorArray = [false,false,false,false,false,false]; + var errorArray = [false, false, false, false, false, false]; _onPageViewChange(int page) { - if(page { appBar: AppBarBackButton('Add Family Member'), body: Column( children: [ - StepCounterWidget(5, count, errorArray), + StepCounterWidget(6, count, errorArray), Expanded( child: Container( child: PageView( @@ -46,12 +47,13 @@ class _FamilyMemberAddState extends State { scrollDirection: Axis.horizontal, controller: _controller, children: [ + PageViewContentBox(PageOne(formKeyList[0])), PageViewContentBox(PageOne(formKeyList[1])), PageViewContentBox(PageOne(formKeyList[2])), PageViewContentBox(PageOne(formKeyList[3])), PageViewContentBox(PageOne(formKeyList[4])), PageViewContentBox(PageOne(formKeyList[5])), - PageViewContentBox(PageOne(formKeyList[6])), + Center(child: PageViewContentBox(Text('Submission'))) ], ), )), @@ -62,18 +64,32 @@ class _FamilyMemberAddState extends State { children: [ OutlinedButton.icon( onPressed: () {}, - label: Text('Cancel',style: TextStyle(color: Colors.red,fontSize: 20),), - icon: Icon(Icons.cancel_outlined,size: 40,color: Colors.red,), + label: Text( + 'Cancel', + style: TextStyle(color: Colors.red, fontSize: 20), + ), + icon: Icon( + Icons.cancel_outlined, + size: 40, + color: Colors.red, + ), style: OutlinedButton.styleFrom( backgroundColor: Colors.white, ), ), OutlinedButton.icon( onPressed: () {}, - icon: Icon(Icons.arrow_forward_outlined,size: 40,color: Colors.green,), - label: Text('Submit',style: TextStyle(color: Colors.green,fontSize: 20),), + icon: Icon( + Icons.arrow_forward_outlined, + size: 40, + color: Colors.green, + ), + label: Text( + 'Submit', + style: TextStyle(color: Colors.green, fontSize: 20), + ), style: OutlinedButton.styleFrom( - backgroundColor: Colors.white, + backgroundColor: Colors.white, //shape:, ), ), @@ -84,6 +100,4 @@ class _FamilyMemberAddState extends State { ), ); } - } - From 61d0a30b6fcb555c3d6a07e8cee54ac56d2100aa Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Mon, 1 Nov 2021 21:19:29 +0530 Subject: [PATCH 020/264] Added a separate widget for page view with error form and step counter widget --- lib/Screens/CommunityDataCollection.dart | 84 +++++---------- lib/Screens/FamilyAddScreens/PageOne.dart | 7 +- lib/Widgets/FormPageView.dart | 124 ++++++++++++++++++++++ pubspec.yaml | 2 +- 4 files changed, 159 insertions(+), 58 deletions(-) create mode 100644 lib/Widgets/FormPageView.dart diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 7ae610b..c9920ef 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; -import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; +import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geolocator/geolocator.dart'; class CommunityDataCollection extends StatefulWidget { @@ -17,21 +16,22 @@ class _CommunityDataCollectionState extends State { int count = 0; final PageController controller = PageController(initialPage: 0); - _onPageViewChange(int page) { - print(page); - setState(() { - count = page; - }); - } + final List> formKeyList = + List.generate(3, (index) => GlobalObjectKey(index)); + final error = [false, false, false]; - _navigatePageLeft() { - controller.previousPage( - duration: Duration(milliseconds: 200), curve: Curves.easeIn); - } + // _navigatePageLeft() { + // controller.previousPage( + // duration: Duration(milliseconds: 200), curve: Curves.easeIn); + // } + // + // _navigatePageRight() { + // controller.nextPage( + // duration: Duration(milliseconds: 200), curve: Curves.easeIn); + // } - _navigatePageRight() { - controller.nextPage( - duration: Duration(milliseconds: 200), curve: Curves.easeIn); + _onSubmit(bool isValid) { + print(isValid.toString()); } @override @@ -39,46 +39,19 @@ class _CommunityDataCollectionState extends State { return Scaffold( backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Community Data'), - body: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - StepCounterWidget(3, count, [false, false, false]), - Expanded( - child: Container( - child: PageView( - onPageChanged: _onPageViewChange, - physics: new NeverScrollableScrollPhysics(), - scrollDirection: Axis.horizontal, - controller: controller, - children: [ - Center( - child: PageViewContentBox( - FloatingActionButton.extended( - onPressed: () { - _determinePosition().then((val) { - print(val); - }).catchError((error, stackTrace) { - print("outer: $error"); - }); - }, - label: Text('Get location'), - heroTag: "Get location", - ),)), - Center( - child: PageViewContentBox(Text('Second Page')), - ), - Center( - child: PageViewContentBox(Text('Third Page')), - ), - Center( - child: PageViewContentBox( - Text('Submission'))) - ], - ), - )), - ], - ), + body: FormPageView([ + Text('Hey'), + TextFormField( + decoration: InputDecoration(), + validator: (str) { + if (str == '') + return 'Enter field lmao'; + else + return null; + }, + ), + Text('Haha Hi') + ], _onSubmit), ); } } @@ -122,3 +95,4 @@ Future _determinePosition() async { return await Geolocator.getCurrentPosition(); } + diff --git a/lib/Screens/FamilyAddScreens/PageOne.dart b/lib/Screens/FamilyAddScreens/PageOne.dart index 31be75c..e6bc69b 100644 --- a/lib/Screens/FamilyAddScreens/PageOne.dart +++ b/lib/Screens/FamilyAddScreens/PageOne.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:geo_spatial/Widgets/DatePicker.dart'; @@ -13,7 +14,7 @@ class PageOne extends StatefulWidget { _PageOneState createState() => _PageOneState(); } -class _PageOneState extends State { +class _PageOneState extends State with AutomaticKeepAliveClientMixin{ @override Widget build(BuildContext context){ return Column( @@ -42,7 +43,9 @@ class _PageOneState extends State { ], ); } - + + @override + bool get wantKeepAlive => true; } diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart new file mode 100644 index 0000000..da10920 --- /dev/null +++ b/lib/Widgets/FormPageView.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; +import 'PageViewContentBox.dart'; + +class FormPageView extends StatefulWidget { + const FormPageView(this.pageWidgetList, this.onSubmit, {Key? key}) + : super(key: key); + + final List pageWidgetList; + final Function(bool) onSubmit; + + @override + _FormPageViewState createState() => _FormPageViewState(); +} + +class _FormPageViewState extends State { + //Page position + int count = 0; + late int widgetLength; + late final List> formKeyList; + late final List formErrorTile; + final PageController controller = PageController(initialPage: 0); + late final List widgetList; + + @override + void initState() { + super.initState(); + + widgetLength = widget.pageWidgetList.length; + print(widgetLength); + formErrorTile = List.generate(widgetLength, (index) => false); + + print(formErrorTile); + + formKeyList = List.generate( + widgetLength, (index) => GlobalObjectKey(index)); + + print(formKeyList); + + widgetList = List.generate( + widgetLength, + (index) => PageViewContentBox(FormKeepAlive( + widget.pageWidgetList[index], + formKeyList[index], + ))); + widgetList.add(PageViewContentBox(ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all(Colors.red), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.zero, + side: BorderSide(color: Colors.red)))), + onPressed: () { + bool isValid = true; + for (int i = 0; i < widgetLength; i++) { + isValid &= formKeyList[i].currentState!.validate(); + } + + widget.onSubmit(isValid); + }))); + } + + _onPageViewChange(int page) { + for (int i = 0; i < page; i++) { + setState(() { + formErrorTile[i] = !formKeyList[i].currentState!.validate(); + }); + } + setState(() { + count = page; + }); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + StepCounterWidget(widgetLength, count, formErrorTile), + Expanded( + child: Container( + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: controller, + children: widgetList, + ), + )), + ], + ); + } +} + +class FormKeepAlive extends StatefulWidget { + const FormKeepAlive(this.childWidget, this._formKey, {Key? key}) + : super(key: key); + + final Widget childWidget; + final GlobalObjectKey _formKey; + + @override + State createState() => _FormKeepAliveState(); +} + +class _FormKeepAliveState extends State + with AutomaticKeepAliveClientMixin { + @override + Widget build(BuildContext context) { + super.build(context); + return Form( + child: widget.childWidget, + key: widget._formKey, + onChanged: () { + widget._formKey.currentState!.validate(); + }); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/pubspec.yaml b/pubspec.yaml index 4c64a9c..705cab0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,7 +54,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - assets/ - # - assets/svg/ + - assets/svg/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see From c1e8d3609e8d53f00e49fea95b369f106423c8f6 Mon Sep 17 00:00:00 2001 From: Nirmal Date: Tue, 2 Nov 2021 11:46:14 +0530 Subject: [PATCH 021/264] A comment and implemented FamilyMemberAdd.dart --- ios/Flutter/AppFrameworkInfo.plist | 2 +- lib/Screens/CommunityDataCollection.dart | 1 + lib/Screens/FamilyMemberAdd.dart | 101 ++++++----------------- 3 files changed, 29 insertions(+), 75 deletions(-) diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9367d48..8d4492f 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 8.0 + 9.0 diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index c9920ef..8d4232c 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -94,5 +94,6 @@ Future _determinePosition() async { } return await Geolocator.getCurrentPosition(); + //You can set accuracy to high ig, that returns like 6 decimal points. Plenty enough to plot on maps } diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 3d80d32..3cac6fd 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/FamilyAddScreens/PageOne.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; @@ -12,92 +13,44 @@ class FamilyMemberAdd extends StatefulWidget { } class _FamilyMemberAddState extends State { - final formKey = GlobalKey(); - final List> formKeyList = - List.generate(6, (index) => GlobalObjectKey(index)); + + _onSubmit(bool isValid) { + print(isValid.toString()); + } int count = 0; - final PageController _controller = PageController(initialPage: 0); - var errorArray = [false, false, false, false, false, false]; + final PageController controller = PageController(initialPage: 0); + + final List> formKeyList = + List.generate(3, (index) => GlobalObjectKey(index)); + final error = [false, false, false]; - _onPageViewChange(int page) { - print(page); - for (int i = 0; i < page; i++) { - setState(() { - errorArray[i] = !formKeyList[i].currentState!.validate(); - }); - } - setState(() { - count = page; - }); - } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), - body: Column( - children: [ - StepCounterWidget(6, count, errorArray), - Expanded( - child: Container( - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: _controller, + body: FormPageView([ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - PageViewContentBox(PageOne(formKeyList[0])), - PageViewContentBox(PageOne(formKeyList[1])), - PageViewContentBox(PageOne(formKeyList[2])), - PageViewContentBox(PageOne(formKeyList[3])), - PageViewContentBox(PageOne(formKeyList[4])), - PageViewContentBox(PageOne(formKeyList[5])), - Center(child: PageViewContentBox(Text('Submission'))) + Text('Hey'), + Text('Testing column widget') ], ), - )), - Padding( - padding: const EdgeInsets.only(top: 8.0, bottom: 16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - OutlinedButton.icon( - onPressed: () {}, - label: Text( - 'Cancel', - style: TextStyle(color: Colors.red, fontSize: 20), - ), - icon: Icon( - Icons.cancel_outlined, - size: 40, - color: Colors.red, - ), - style: OutlinedButton.styleFrom( - backgroundColor: Colors.white, - ), - ), - OutlinedButton.icon( - onPressed: () {}, - icon: Icon( - Icons.arrow_forward_outlined, - size: 40, - color: Colors.green, - ), - label: Text( - 'Submit', - style: TextStyle(color: Colors.green, fontSize: 20), - ), - style: OutlinedButton.styleFrom( - backgroundColor: Colors.white, - //shape:, - ), - ), - ], + TextFormField( + decoration: InputDecoration(), + validator: (str) { + if (str == '') + return 'Enter field lmao'; + else + return null; + }, ), - ) - ], - ), - ); + Text('Haha Hi') + ], _onSubmit), + ); } } From a55e08e519700e70b41892ead09f1e126aacc82d Mon Sep 17 00:00:00 2001 From: Nirmal Date: Tue, 2 Nov 2021 18:13:20 +0530 Subject: [PATCH 022/264] Weird error with FamilyMemberAdd() call in IndividualDataCollection.dart --- lib/Screens/FamilyMemberAdd.dart | 30 ++++++++++++++++++----- lib/Screens/IndividualDataCollection.dart | 2 +- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 3cac6fd..c4e15e0 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Screens/FamilyAddScreens/PageOne.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/DatePicker.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; -import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; -import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; + class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -16,7 +15,7 @@ class _FamilyMemberAddState extends State { _onSubmit(bool isValid) { print(isValid.toString()); - } +} int count = 0; final PageController controller = PageController(initialPage: 0); @@ -36,8 +35,27 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text('Hey'), - Text('Testing column widget') + TextFormField( + decoration: InputDecoration(), + validator: (value){ + if(value==""){ + return "Please enter a name";} + else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + DatePicker(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text('Gender: '), + ElevatedButton(onPressed: (){}, + child: Text('Male')), + ElevatedButton(onPressed: (){}, + child: Text('Female')), + ], + ) ], ), TextFormField( diff --git a/lib/Screens/IndividualDataCollection.dart b/lib/Screens/IndividualDataCollection.dart index 70a03e5..c22a5ba 100644 --- a/lib/Screens/IndividualDataCollection.dart +++ b/lib/Screens/IndividualDataCollection.dart @@ -5,7 +5,7 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; class IndividualDataCollection extends StatefulWidget { - const IndividualDataCollection({Key? key}) : super(key: key); + IndividualDataCollection({Key? key}) : super(key: key); @override _IndividualDataCollectionState createState() => From b26832572dcd2cfbe40f1e1c84feba60bb4560c9 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Sun, 7 Nov 2021 14:08:41 +0530 Subject: [PATCH 023/264] Added widget with form validation to get current location --- lib/Screens/CommunityDataCollection.dart | 80 ++++++----------- lib/Widgets/FormPageView.dart | 33 ++++--- lib/Widgets/LocationWidget.dart | 108 +++++++++++++++++++++++ lib/Widgets/PageViewContentBox.dart | 4 - 4 files changed, 157 insertions(+), 68 deletions(-) create mode 100644 lib/Widgets/LocationWidget.dart diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 8d4232c..0fd68a2 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; +import 'package:geo_spatial/Widgets/LocationWidget.dart'; import 'package:geolocator/geolocator.dart'; class CommunityDataCollection extends StatefulWidget { @@ -20,27 +21,42 @@ class _CommunityDataCollectionState extends State { List.generate(3, (index) => GlobalObjectKey(index)); final error = [false, false, false]; - // _navigatePageLeft() { - // controller.previousPage( - // duration: Duration(milliseconds: 200), curve: Curves.easeIn); - // } - // - // _navigatePageRight() { - // controller.nextPage( - // duration: Duration(milliseconds: 200), curve: Curves.easeIn); - // } - _onSubmit(bool isValid) { print(isValid.toString()); + } + @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Community Data'), body: FormPageView([ - Text('Hey'), + LocationWidgetField( + context: context, + onSaved: (data) { + print(data); + }, + autoValidateMode: AutovalidateMode.disabled), + LocationWidgetField( + context: context, + onSaved: (data) { + print(data); + }, + autoValidateMode: AutovalidateMode.disabled), + LocationWidgetField( + context: context, + onSaved: (data) { + print(data); + }, + autoValidateMode: AutovalidateMode.disabled), + LocationWidgetField( + context: context, + onSaved: (data) { + print(data); + }, + autoValidateMode: AutovalidateMode.disabled), TextFormField( decoration: InputDecoration(), validator: (str) { @@ -55,45 +71,3 @@ class _CommunityDataCollectionState extends State { ); } } - -/** - * Method to get fine location when requested - * Type future, requires then and catchError - * - * @param: - * none - * - * @returns: - * Future.error, in case of exceptions - * Position, in case of success - * - * Cannot modularise method into separate class - */ - -Future _determinePosition() async { - bool serviceEnabled; - LocationPermission permission; - - serviceEnabled = await Geolocator.isLocationServiceEnabled(); - if (!serviceEnabled) { - return Future.error( - 'Location services are disabled, try enabling location in your device'); - } - - permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - if (permission == LocationPermission.denied) { - return Future.error('Location permissions are denied'); - } - } - - if (permission == LocationPermission.deniedForever) { - return Future.error( - 'Location permissions are permanently denied, permission cannot be requested.'); - } - - return await Geolocator.getCurrentPosition(); - //You can set accuracy to high ig, that returns like 6 decimal points. Plenty enough to plot on maps -} - diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index da10920..59e5c5b 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -40,7 +40,8 @@ class _FormPageViewState extends State { widgetList = List.generate( widgetLength, - (index) => PageViewContentBox(FormKeepAlive( + (index) => + PageViewContentBox(FormKeepAlive( widget.pageWidgetList[index], formKeyList[index], ))); @@ -56,7 +57,12 @@ class _FormPageViewState extends State { onPressed: () { bool isValid = true; for (int i = 0; i < widgetLength; i++) { - isValid &= formKeyList[i].currentState!.validate(); + var isDataValid = formKeyList[i].currentState!.validate(); + isValid &= isDataValid; + + if (isDataValid) { + formKeyList[i].currentState!.save(); + } } widget.onSubmit(isValid); @@ -66,7 +72,11 @@ class _FormPageViewState extends State { _onPageViewChange(int page) { for (int i = 0; i < page; i++) { setState(() { - formErrorTile[i] = !formKeyList[i].currentState!.validate(); + var isValid = formKeyList[i].currentState!.validate(); + if (isValid) { + formKeyList[i].currentState!.save(); + } + formErrorTile[i] = !isValid; }); } setState(() { @@ -83,13 +93,13 @@ class _FormPageViewState extends State { StepCounterWidget(widgetLength, count, formErrorTile), Expanded( child: Container( - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: controller, - children: widgetList, - ), - )), + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: controller, + children: widgetList, + ), + )), ], ); } @@ -115,7 +125,8 @@ class _FormKeepAliveState extends State child: widget.childWidget, key: widget._formKey, onChanged: () { - widget._formKey.currentState!.validate(); + if (widget._formKey.currentState!.validate()) + widget._formKey.currentState!.save(); }); } diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart new file mode 100644 index 0000000..8c788fc --- /dev/null +++ b/lib/Widgets/LocationWidget.dart @@ -0,0 +1,108 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; + +/** + * Form Widget to get current location with validation + */ + +class LocationWidgetField extends FormField { + LocationWidgetField( + {FormFieldSetter? onSaved, + FormFieldValidator? validator, + required BuildContext context, + AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + : super( + onSaved: onSaved, + validator: validator ?? + (data) { + if (data == null) return "Location field empty"; + return null; + }, + initialValue: null, + autovalidateMode: autoValidateMode, + builder: (FormFieldState state) { + return Padding( + padding: + EdgeInsets.only(left: 20, right: 20, top: 10, bottom: 10), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(4)), + border: state.hasError + ? Border.all(width: 1, color: Colors.red) + : null, + color: state.hasError + ? Color.fromARGB(255, 255, 216, 216) + : Colors.white70, + ), + width: double.infinity, + child: Padding( + padding: EdgeInsets.all(15), + child: Center( + child: state.hasError + ? Text( + state.errorText ?? "error", + style: TextStyle( + color: Colors.red, fontSize: 10), + ) + : Text(state.value != null + ? state.value.toString() + : ""), + ), + ), + ), + Padding( + padding: EdgeInsets.only(top: 10, bottom: 5), + child: ElevatedButton( + onPressed: () async { + _determinePosition().then((value) { + state.didChange(value); + }).catchError((onError, stackTrace) { + print("inner: $onError"); + state.didChange(null); + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar( + content: Text(onError), + )); + }); + }, + child: Text('Get location'), + style: ElevatedButton.styleFrom( + minimumSize: Size(double.infinity, 50)), + ), + ), + ], + )); + }); +} + +Future _determinePosition() async { + bool serviceEnabled; + LocationPermission permission; + + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + return Future.error( + 'Location services are disabled, try enabling location in your device'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + return Future.error('Location permissions are denied'); + } + } + + if (permission == LocationPermission.deniedForever) { + return Future.error( + 'Location permissions are permanently denied, permission cannot be requested.'); + } + + return await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best); + //You can set accuracy to high ig, that returns like 6 decimal points. Plenty enough to plot on maps +} diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index 1fccb37..50b6d59 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -2,10 +2,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -///Card to hold content of DataCollecting PageView, has left and right buttons -///Pass method to control viewpage to respective method parameters (left and right) -///Pass null to hide button - class PageViewContentBox extends StatelessWidget { const PageViewContentBox( this.centerWidget, From 83d26feb98678447663e5450660375740e929fba Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Sun, 7 Nov 2021 14:22:25 +0530 Subject: [PATCH 024/264] Modified location widget style --- lib/Screens/CommunityDataCollection.dart | 2 -- lib/Widgets/FormPageView.dart | 17 ++++++++--------- lib/Widgets/LocationWidget.dart | 11 +++++++---- lib/main.dart | 1 - 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 0fd68a2..027f1a8 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -23,10 +23,8 @@ class _CommunityDataCollectionState extends State { _onSubmit(bool isValid) { print(isValid.toString()); - } - @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 59e5c5b..8f5f5c3 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -40,8 +40,7 @@ class _FormPageViewState extends State { widgetList = List.generate( widgetLength, - (index) => - PageViewContentBox(FormKeepAlive( + (index) => PageViewContentBox(FormKeepAlive( widget.pageWidgetList[index], formKeyList[index], ))); @@ -93,13 +92,13 @@ class _FormPageViewState extends State { StepCounterWidget(widgetLength, count, formErrorTile), Expanded( child: Container( - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: controller, - children: widgetList, - ), - )), + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: controller, + children: widgetList, + ), + )), ], ); } diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index 8c788fc..273c2ba 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -34,10 +34,12 @@ class LocationWidgetField extends FormField { borderRadius: BorderRadius.all(Radius.circular(4)), border: state.hasError ? Border.all(width: 1, color: Colors.red) - : null, + : Border.all( + width: 1, + color: Color.fromARGB(255, 194, 194, 194)), color: state.hasError ? Color.fromARGB(255, 255, 216, 216) - : Colors.white70, + : Color.fromARGB(255, 238, 238, 238), ), width: double.infinity, child: Padding( @@ -51,7 +53,7 @@ class LocationWidgetField extends FormField { ) : Text(state.value != null ? state.value.toString() - : ""), + : "Please fetch your location"), ), ), ), @@ -103,6 +105,7 @@ Future _determinePosition() async { 'Location permissions are permanently denied, permission cannot be requested.'); } - return await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best); + return await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.best); //You can set accuracy to high ig, that returns like 6 decimal points. Plenty enough to plot on maps } diff --git a/lib/main.dart b/lib/main.dart index 745cf52..1b6ddbe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,6 @@ import 'package:flutter/services.dart'; final storage = FlutterSecureStorage(); void main() { - WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations( [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); From b4519b2b493771cf79799499841cf001c4a7b93a Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Wed, 10 Nov 2021 19:36:20 +0530 Subject: [PATCH 025/264] Added more decoration to step counter widget to highlight current page, and added functionality to navigate to page when clicked on corresponding tiles. --- lib/Widgets/FormPageView.dart | 2 +- lib/Widgets/StepCounterWidget.dart | 55 ++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 8f5f5c3..67238c5 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -89,7 +89,7 @@ class _FormPageViewState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - StepCounterWidget(widgetLength, count, formErrorTile), + StepCounterWidget(widgetLength, count, formErrorTile, controller), Expanded( child: Container( child: PageView( diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 09e5595..2bde565 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -13,13 +13,15 @@ import 'package:flutter/widgets.dart'; */ class StepCounterWidget extends StatefulWidget { - const StepCounterWidget(this.totalSteps, this.currentStep, this.errorArray, + const StepCounterWidget( + this.totalSteps, this.currentStep, this.errorArray, this.controller, {Key? key}) : super(key: key); final int totalSteps; final int currentStep; final List errorArray; + final PageController controller; @override _StepCounterWidgetState createState() => _StepCounterWidgetState(); @@ -34,14 +36,16 @@ class _StepCounterWidgetState extends State { if (i < widget.currentStep) { try { widget.errorArray[i] - ? checkBoxWidgetList.add(CheckBox(0)) - : checkBoxWidgetList.add(CheckBox(1)); + ? checkBoxWidgetList.add(CheckBox(0, widget.controller, i)) + : checkBoxWidgetList.add(CheckBox(1, widget.controller, i)); print(widget.errorArray[i].toString() + " " + i.toString()); } catch (error) { - checkBoxWidgetList.add(CheckBox(1)); + checkBoxWidgetList.add(CheckBox(1, widget.controller, i)); } + } else if (i == widget.currentStep) { + checkBoxWidgetList.add(CheckBox(2, widget.controller, i)); } else { - checkBoxWidgetList.add(CheckBox(2)); + checkBoxWidgetList.add(CheckBox(3, widget.controller, i)); } } @@ -55,39 +59,62 @@ class _StepCounterWidgetState extends State { } class CheckBox extends StatelessWidget { - const CheckBox(this.iconType, {Key? key}) : super(key: key); + const CheckBox(this.iconType, this.controller, this.tilePosition, {Key? key}) + : super(key: key); final int iconType; + final PageController controller; + final int tilePosition; @override Widget build(BuildContext context) { IconData icon; Color iconColor; Color backgroundColor; + Border border; if (iconType == 0) { icon = Icons.close; - iconColor = Color.fromARGB(255, 255, 205, 205); - backgroundColor = Colors.red; + backgroundColor = Color.fromARGB(255, 255, 167, 167); + iconColor = Colors.red; + border = Border.all(width: 1.5, color: Colors.red); } else if (iconType == 1) { icon = Icons.check; iconColor = Colors.white; backgroundColor = Color.fromARGB(250, 157, 133, 244); + border = Border.all(width: 0, color: backgroundColor); + } else if (iconType == 2) { + icon = Icons.remove; + iconColor = Color.fromARGB(255, 255, 255, 255); + backgroundColor = Color.fromARGB(250, 182, 170, 255); + border = + Border.all(width: 2.5, color: Color.fromARGB(250, 157, 133, 244)); } else { icon = Icons.remove; iconColor = Color.fromARGB(255, 0, 0, 0); backgroundColor = Color.fromARGB(250, 213, 201, 255); + border = Border.all(width: 0, color: backgroundColor); } return Expanded( child: Container( + decoration: BoxDecoration( + border: border, + ), margin: EdgeInsets.only(left: 3.0, right: 3.0), - child: Padding( - padding: EdgeInsets.only(top: 5, bottom: 5), - child: Icon( - icon, - color: iconColor, + child: Material( + color: backgroundColor, + child: InkWell( + onTap: () { + controller.jumpToPage(tilePosition); + }, + child: Padding( + padding: EdgeInsets.only(top: 5, bottom: 5), + child: Icon( + icon, + color: iconColor, + ), + ), ), ), - color: backgroundColor, )); } } From fb183ed8054b7b124962f1b3a9acbb691e794f2f Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Wed, 10 Nov 2021 21:42:22 +0530 Subject: [PATCH 026/264] Added progress bar for location, added submit tab in step counter to scroll to submit pagge --- lib/Screens/CommunityDataCollection.dart | 1 - lib/Widgets/FormPageView.dart | 10 +++--- lib/Widgets/LocationWidget.dart | 41 +++++++++++++++++++++--- lib/Widgets/StepCounterWidget.dart | 26 +++++++++++++-- 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 027f1a8..6e240ce 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -19,7 +19,6 @@ class _CommunityDataCollectionState extends State { final List> formKeyList = List.generate(3, (index) => GlobalObjectKey(index)); - final error = [false, false, false]; _onSubmit(bool isValid) { print(isValid.toString()); diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 67238c5..5f90030 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -27,19 +27,19 @@ class _FormPageViewState extends State { void initState() { super.initState(); - widgetLength = widget.pageWidgetList.length; + widgetLength = widget.pageWidgetList.length + 1; print(widgetLength); - formErrorTile = List.generate(widgetLength, (index) => false); + formErrorTile = List.generate(widgetLength - 1, (index) => false); print(formErrorTile); formKeyList = List.generate( - widgetLength, (index) => GlobalObjectKey(index)); + widgetLength - 1, (index) => GlobalObjectKey(index)); print(formKeyList); widgetList = List.generate( - widgetLength, + widgetLength - 1, (index) => PageViewContentBox(FormKeepAlive( widget.pageWidgetList[index], formKeyList[index], @@ -55,7 +55,7 @@ class _FormPageViewState extends State { side: BorderSide(color: Colors.red)))), onPressed: () { bool isValid = true; - for (int i = 0; i < widgetLength; i++) { + for (int i = 0; i < widgetLength - 1; i++) { var isDataValid = formKeyList[i].currentState!.validate(); isValid &= isDataValid; diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index 273c2ba..0e0bd18 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -61,7 +61,7 @@ class LocationWidgetField extends FormField { padding: EdgeInsets.only(top: 10, bottom: 5), child: ElevatedButton( onPressed: () async { - _determinePosition().then((value) { + _determinePosition(context).then((value) { state.didChange(value); }).catchError((onError, stackTrace) { print("inner: $onError"); @@ -82,12 +82,40 @@ class LocationWidgetField extends FormField { }); } -Future _determinePosition() async { +Future _determinePosition(context) async { bool serviceEnabled; LocationPermission permission; + BuildContext? progressContext; + + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + progressContext = context; + return WillPopScope( + child: Dialog( + child: Padding( + padding: EdgeInsets.all(20), + child: new Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: EdgeInsets.only(right: 20), + child: CircularProgressIndicator(), + ), + new Text("Fetching Location"), + ], + ), + ), + ), + onWillPop: () async => false); + }, + ); serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + Navigator.of(progressContext!, rootNavigator: true).pop(); return Future.error( 'Location services are disabled, try enabling location in your device'); } @@ -96,16 +124,21 @@ Future _determinePosition() async { if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { + Navigator.of(progressContext!, rootNavigator: true).pop(); + return Future.error('Location permissions are denied'); } } if (permission == LocationPermission.deniedForever) { + Navigator.of(progressContext!, rootNavigator: true).pop(); return Future.error( 'Location permissions are permanently denied, permission cannot be requested.'); } - return await Geolocator.getCurrentPosition( + var location = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.best); - //You can set accuracy to high ig, that returns like 6 decimal points. Plenty enough to plot on maps + + Navigator.of(progressContext!, rootNavigator: true).pop(); + return location; } diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 2bde565..9802ab3 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -33,7 +33,13 @@ class _StepCounterWidgetState extends State { List checkBoxWidgetList = []; for (int i = 0; i < widget.totalSteps; i++) { - if (i < widget.currentStep) { + if (i == widget.totalSteps - 1) { + if (i == widget.currentStep) { + checkBoxWidgetList.add(CheckBox(5, widget.controller, i)); + } else { + checkBoxWidgetList.add(CheckBox(4, widget.controller, i)); + } + } else if (i < widget.currentStep) { try { widget.errorArray[i] ? checkBoxWidgetList.add(CheckBox(0, widget.controller, i)) @@ -88,11 +94,21 @@ class CheckBox extends StatelessWidget { backgroundColor = Color.fromARGB(250, 182, 170, 255); border = Border.all(width: 2.5, color: Color.fromARGB(250, 157, 133, 244)); - } else { + } else if (iconType == 3) { icon = Icons.remove; iconColor = Color.fromARGB(255, 0, 0, 0); backgroundColor = Color.fromARGB(250, 213, 201, 255); border = Border.all(width: 0, color: backgroundColor); + } else if (iconType == 4) { + icon = Icons.upload_rounded; + iconColor = Color.fromARGB(255, 255, 255, 255); + backgroundColor = Color.fromARGB(250, 182, 170, 255); + border = Border.all(width: 0, color: backgroundColor); + } else { + icon = Icons.upload_rounded; + iconColor = Color.fromARGB(255, 255, 255, 255); + backgroundColor = Color.fromARGB(250, 126, 94, 255); + border = Border.all(width: 2, color: backgroundColor); } return Expanded( child: Container( @@ -104,7 +120,11 @@ class CheckBox extends StatelessWidget { color: backgroundColor, child: InkWell( onTap: () { - controller.jumpToPage(tilePosition); + controller.animateToPage( + tilePosition, + curve: Curves.ease, + duration: Duration(milliseconds: 650), + ); }, child: Padding( padding: EdgeInsets.only(top: 5, bottom: 5), From 00d94d20155524d914108c72ff597e367ec9e226 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Thu, 11 Nov 2021 01:13:51 +0530 Subject: [PATCH 027/264] Added custom widget for dropdown field with form validation --- lib/Screens/CommunityDataCollection.dart | 37 +++++++++- lib/Widgets/DropDownFormField.dart | 91 ++++++++++++++++++++++++ lib/Widgets/LocationWidget.dart | 60 +++++++++------- lib/Widgets/PageViewContentBox.dart | 15 +--- 4 files changed, 161 insertions(+), 42 deletions(-) create mode 100644 lib/Widgets/DropDownFormField.dart diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 6e240ce..cd64de2 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,12 +1,34 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/LocationWidget.dart'; -import 'package:geolocator/geolocator.dart'; class CommunityDataCollection extends StatefulWidget { - const CommunityDataCollection({Key? key}) : super(key: key); + CommunityDataCollection({Key? key}) : super(key: key); + + final List _publicResourceList = [ + 'Temple', + 'Church', + 'Mosque', + 'Community hall', + 'Community toilet', + 'Anganwadi centre', + 'Schools', + 'Colleges', + 'Market', + 'Wine shops', + 'PHC', + 'PDS', + 'Petty shops', + 'Whole sale shops', + 'Retail shops', + 'Vegetable shops', + 'Bakeries', + 'Hotels', + 'Food processing units' + ]; @override _CommunityDataCollectionState createState() => @@ -30,25 +52,35 @@ class _CommunityDataCollectionState extends State { backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Community Data'), body: FormPageView([ + DropDownFormField( + list: widget._publicResourceList, + title: "Choose type of resource to tag", + hint: "Select resource type", + subTitle: "Resource", + errorField: "Please choose a resource to tag"), LocationWidgetField( + title: "Record location at top left part of the facility", context: context, onSaved: (data) { print(data); }, autoValidateMode: AutovalidateMode.disabled), LocationWidgetField( + title: "Record location at top right part of the facility", context: context, onSaved: (data) { print(data); }, autoValidateMode: AutovalidateMode.disabled), LocationWidgetField( + title: "Record location at bottom left part of the facility", context: context, onSaved: (data) { print(data); }, autoValidateMode: AutovalidateMode.disabled), LocationWidgetField( + title: "Record location at bottom right part of the facility", context: context, onSaved: (data) { print(data); @@ -63,7 +95,6 @@ class _CommunityDataCollectionState extends State { return null; }, ), - Text('Haha Hi') ], _onSubmit), ); } diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart new file mode 100644 index 0000000..83f8e1b --- /dev/null +++ b/lib/Widgets/DropDownFormField.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class DropDownFormField extends FormField { + DropDownFormField( + {FormFieldSetter? onSaved, + FormFieldValidator? validator, + required list, + required title, + required hint, + required subTitle, + errorField, + AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + : super( + onSaved: onSaved, + validator: validator ?? + (data) { + if (data == null) + return errorField ?? "Please select a value"; + return null; + }, + initialValue: null, + autovalidateMode: autoValidateMode, + builder: (FormFieldState state) { + return Padding( + padding: EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 30), + child: Text(title, + style: GoogleFonts.montserrat( + fontSize: 25, color: Colors.black)), + ), + Card( + elevation: 2, + margin: EdgeInsets.only(bottom: 4), + child: ListTile( + title: Text( + subTitle, + style: GoogleFonts.montserrat(color: Colors.black), + ), + contentPadding: EdgeInsets.fromLTRB(10, 0, 10, 0), + trailing: DropdownButtonHideUnderline( + child: DropdownButton( + value: state.value, + isExpanded: false, + items: list.map((value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), + onChanged: (newValue) { + state.didChange(newValue); + }, + hint: Container( + width: 150, //and here + child: Text( + hint, + style: TextStyle( + color: state.hasError + ? Colors.red + : Colors.grey), + textAlign: TextAlign.end, + ), + ), + style: TextStyle( + color: Colors.black, + decorationColor: Colors.red), + ), + ), + ), + ), + state.hasError + ? Container( + padding: EdgeInsets.all(10), + child: Text( + state.errorText ?? "error", + style: TextStyle(color: Colors.red, fontSize: 10), + ), + ) + : Container() + ], + ), + ); + }); +} diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index 0e0bd18..082c486 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:google_fonts/google_fonts.dart'; /** * Form Widget to get current location with validation @@ -11,6 +12,7 @@ class LocationWidgetField extends FormField { {FormFieldSetter? onSaved, FormFieldValidator? validator, required BuildContext context, + required String title, AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) : super( onSaved: onSaved, @@ -29,6 +31,12 @@ class LocationWidgetField extends FormField { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ + Padding( + padding: EdgeInsets.only(bottom: 30), + child: Text(title, + style: GoogleFonts.montserrat( + fontSize: 25, color: Colors.black)), + ), Container( decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(4)), @@ -51,9 +59,11 @@ class LocationWidgetField extends FormField { style: TextStyle( color: Colors.red, fontSize: 10), ) - : Text(state.value != null - ? state.value.toString() - : "Please fetch your location"), + : Text( + state.value != null + ? state.value.toString() + : "Please fetch your location", + style: TextStyle(fontSize: 12)), ), ), ), @@ -87,6 +97,26 @@ Future _determinePosition(context) async { LocationPermission permission; BuildContext? progressContext; + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + + if (!serviceEnabled) { + return Future.error( + 'Location services are disabled, try enabling location in your device'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + return Future.error('Location permissions are denied'); + } + } + + if (permission == LocationPermission.deniedForever) { + return Future.error( + 'Location permissions are permanently denied, permission cannot be requested.'); + } + showDialog( context: context, barrierDismissible: false, @@ -112,30 +142,6 @@ Future _determinePosition(context) async { }, ); - serviceEnabled = await Geolocator.isLocationServiceEnabled(); - - if (!serviceEnabled) { - Navigator.of(progressContext!, rootNavigator: true).pop(); - return Future.error( - 'Location services are disabled, try enabling location in your device'); - } - - permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - if (permission == LocationPermission.denied) { - Navigator.of(progressContext!, rootNavigator: true).pop(); - - return Future.error('Location permissions are denied'); - } - } - - if (permission == LocationPermission.deniedForever) { - Navigator.of(progressContext!, rootNavigator: true).pop(); - return Future.error( - 'Location permissions are permanently denied, permission cannot be requested.'); - } - var location = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.best); diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index 50b6d59..a224ee4 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -3,9 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class PageViewContentBox extends StatelessWidget { - const PageViewContentBox( - this.centerWidget, - {Key? key}) : super(key: key); + const PageViewContentBox(this.centerWidget, {Key? key}) : super(key: key); final Widget centerWidget; @@ -26,15 +24,8 @@ class PageViewContentBox extends StatelessWidget { ), child: Padding( padding: EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: Center( - child: centerWidget, - )), - ], + child: Center( + child: centerWidget, ), ), ), From 424042cabe705485487039c2b894121ab4cdb874 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 11 Nov 2021 09:05:05 +0530 Subject: [PATCH 028/264] Fixed error, added AppTheme.dart --- lib/Screens/FamilyMemberAdd.dart | 5 +++-- lib/Utils/AppTheme.dart | 0 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 lib/Utils/AppTheme.dart diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index c4e15e0..2deed15 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -32,7 +32,7 @@ class _FamilyMemberAddState extends State { appBar: AppBarBackButton('Add Family Member'), body: FormPageView([ Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ TextFormField( @@ -55,7 +55,8 @@ class _FamilyMemberAddState extends State { ElevatedButton(onPressed: (){}, child: Text('Female')), ], - ) + ), + ], ), TextFormField( diff --git a/lib/Utils/AppTheme.dart b/lib/Utils/AppTheme.dart new file mode 100644 index 0000000..e69de29 From 4ab75fe20f4ed5074a7389556dc328d518a3de80 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 11 Nov 2021 11:20:22 +0530 Subject: [PATCH 029/264] Added gender_picker, new widgets to individual data collection --- lib/Screens/FamilyMemberAdd.dart | 109 +++++++++++++++++++---------- lib/Widgets/DropDownFormField.dart | 2 +- pubspec.lock | 7 ++ pubspec.yaml | 3 +- 4 files changed, 82 insertions(+), 39 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 2deed15..bae9bd2 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:gender_picker/gender_picker.dart'; +import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePicker.dart'; +import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; - class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -12,64 +14,97 @@ class FamilyMemberAdd extends StatefulWidget { } class _FamilyMemberAddState extends State { - _onSubmit(bool isValid) { print(isValid.toString()); -} + } int count = 0; final PageController controller = PageController(initialPage: 0); final List> formKeyList = - List.generate(3, (index) => GlobalObjectKey(index)); + List.generate(3, (index) => GlobalObjectKey(index)); final error = [false, false, false]; - @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), body: FormPageView([ - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextFormField( - decoration: InputDecoration(), - validator: (value){ - if(value==""){ - return "Please enter a name";} - else - return null; - }, - autovalidateMode: AutovalidateMode.always, - ), - DatePicker(), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Text('Gender: '), - ElevatedButton(onPressed: (){}, - child: Text('Male')), - ElevatedButton(onPressed: (){}, - child: Text('Female')), - ], - ), - + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextFormField( + decoration: InputDecoration(), + validator: (value) { + if (value == "") { + return "Please enter a name"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + DatePicker(), + GenderPickerWithImage( + verticalAlignedText: false, + selectedGender: Gender.Male, + selectedGenderTextStyle: TextStyle( + color: Color(0xFF8b32a8), fontWeight: FontWeight.bold), + unSelectedGenderTextStyle: + TextStyle(color: Colors.black, fontWeight: FontWeight.normal), + onChanged: (Gender? gender) { + print(gender); + }, + equallyAligned: true, + animationDuration: Duration(milliseconds: 300), + isCircular: true, + // default : true, + opacityOfGradient: 0.4, + padding: const EdgeInsets.all(3), + size: 70, //default : 40 + ), + DropDownFormField( + list: [ + 'None', + 'Elementary', + 'Secondary', + 'Higher Secondary', + 'Bachelor\'s', + 'Master\'s' ], + hint: "Select the highest", + title: "Educational qualification", + subTitle: "Education", + errorField: "Please choose a qualification", ), TextFormField( + keyboardType: TextInputType.number, decoration: InputDecoration(), - validator: (str) { - if (str == '') - return 'Enter field lmao'; + validator: (value) { + if (value == "") { + return "Please enter a value"; + } else if(value!.length!=10){ + return "Enter a valid number"; + } else return null; }, + autovalidateMode: AutovalidateMode.always, ), - Text('Haha Hi') - ], _onSubmit), - ); + ], + ), + TextFormField( + decoration: InputDecoration(), + validator: (str) { + if (str == '') + return 'Enter field lmao'; + else + return null; + }, + ), + Text('Haha Hi') + ], _onSubmit), + ); } } diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 83f8e1b..5d67e05 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -24,7 +24,7 @@ class DropDownFormField extends FormField { autovalidateMode: autoValidateMode, builder: (FormFieldState state) { return Padding( - padding: EdgeInsets.all(20), + padding: EdgeInsets.all(10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, diff --git a/pubspec.lock b/pubspec.lock index a51e933..ec2f559 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -107,6 +107,13 @@ packages: description: flutter source: sdk version: "0.0.0" + gender_picker: + dependency: "direct main" + description: + name: gender_picker + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" geolocator: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 705cab0..496625a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,7 +34,8 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 google_fonts: - table_calendar: + table_calendar: + gender_picker: ^1.1.0 dev_dependencies: flutter_test: From 97e3c1223d9cf6c98bf3379ae371153cafaf9828 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 11 Nov 2021 13:03:52 +0530 Subject: [PATCH 030/264] Error, needs fixing --- lib/Screens/FamilyMemberAdd.dart | 53 +++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index bae9bd2..33ce562 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -84,24 +84,55 @@ class _FamilyMemberAddState extends State { validator: (value) { if (value == "") { return "Please enter a value"; - } else if(value!.length!=10){ + } else if (value!.length != 10) { return "Enter a valid number"; - } - else + } else return null; }, autovalidateMode: AutovalidateMode.always, ), ], ), - TextFormField( - decoration: InputDecoration(), - validator: (str) { - if (str == '') - return 'Enter field lmao'; - else - return null; - }, + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextFormField( + validator: (value) { + if (value == "") { + return "Please enter a value"; + } else if (value!.length != 10) { + return "Enter a valid Aadhaar"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + DropDownFormField( + //TODO: Replace with a checkbox dialogue + list: [ + 'Widower', + 'Divorcee', + 'Differently abled' + ], + hint: "Select applicable", + title: "Vulnerabilities", + subTitle: "Vulnerabilities", + errorField: "Please choose a vulnerability", + ), + DropDownFormField( + list: [ + 'Clerical support worker', + 'Services and sales worker', + 'Skilled agricultural, forestry and fishery worker', + 'Unemployed' + ], + hint: "Select applicable", + title: "Occupation", + subTitle: "Occupation", + errorField: "Please choose an occupation", + ), + ], ), Text('Haha Hi') ], _onSubmit), From ec43a5243a8860acdaf92eb787b19b62c240c780 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Thu, 11 Nov 2021 14:14:31 +0530 Subject: [PATCH 031/264] Added widget for options, OptionsFormWidget --- lib/Widgets/OptionsFormWidget.dart | 98 ++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 lib/Widgets/OptionsFormWidget.dart diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart new file mode 100644 index 0000000..849634f --- /dev/null +++ b/lib/Widgets/OptionsFormWidget.dart @@ -0,0 +1,98 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + + +/** + * Implementation: + *OptionsWidget(options: [["Yes", "yes"], ["No", "no"]], setDefaultValue: false, onSaved: (data){print(data);}), + */ + +class OptionsWidget extends FormField { + OptionsWidget( + {FormFieldSetter? onSaved, + FormFieldValidator? validator, + required List options, + bool setDefaultValue = false, + AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + : super( + onSaved: onSaved, + validator: validator ?? + (data) { + if (data == null) return "Please choose an option"; + return null; + }, + initialValue: setDefaultValue ? options[0][1] : null, + autovalidateMode: autoValidateMode, + builder: (FormFieldState state) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Wrap( + children: options + .map((e) => new OptionButton( + text: e[0], + optionKey: e[1], + state: state, + isError: state.hasError, + isSelected: state.value == e[1])) + .toList()), + Padding( + padding: EdgeInsets.all(5), + child: state.hasError + ? Text( + state.errorText ?? "error", + style: TextStyle(color: Colors.red, fontSize: 10), + ) + : Container(), + ) + ], + ); + }); +} + +class OptionButton extends StatelessWidget { + const OptionButton( + {Key? key, + required this.text, + required this.optionKey, + required this.state, + required this.isSelected, + this.isError = false}) + : super(key: key); + + final text; + final optionKey; + final state; + final isSelected; + final isError; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.all(5), + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(isSelected + ? Colors.blue + : isError + ? Color.fromARGB(255, 255, 185, 185) + : Colors.grey), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(4)), + side: isError + ? BorderSide(color: Colors.red) + : BorderSide.none))), + onPressed: () { + state.didChange(optionKey); + }, + child: Padding( + padding: EdgeInsets.all(10), + child: Text(text), + )), + ); + } +} + From ba9f0974310554640b08f16b545684b0c275a683 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 12 Nov 2021 18:06:39 +0530 Subject: [PATCH 032/264] Fixed dropdown bug, added scroll view inside page view to avoid overflow --- lib/Screens/CommunityDataCollection.dart | 1 - lib/Screens/FamilyMemberAdd.dart | 5 +- lib/Widgets/DropDownFormField.dart | 64 ++++++++++++------------ lib/Widgets/FormPageView.dart | 42 ++++++++-------- lib/Widgets/PageViewContentBox.dart | 13 ++++- 5 files changed, 65 insertions(+), 60 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index cd64de2..65d4a59 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -56,7 +56,6 @@ class _CommunityDataCollectionState extends State { list: widget._publicResourceList, title: "Choose type of resource to tag", hint: "Select resource type", - subTitle: "Resource", errorField: "Please choose a resource to tag"), LocationWidgetField( title: "Record location at top left part of the facility", diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 33ce562..45d586a 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -75,7 +75,6 @@ class _FamilyMemberAddState extends State { ], hint: "Select the highest", title: "Educational qualification", - subTitle: "Education", errorField: "Please choose a qualification", ), TextFormField( @@ -94,7 +93,7 @@ class _FamilyMemberAddState extends State { ], ), Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ TextFormField( @@ -117,7 +116,6 @@ class _FamilyMemberAddState extends State { ], hint: "Select applicable", title: "Vulnerabilities", - subTitle: "Vulnerabilities", errorField: "Please choose a vulnerability", ), DropDownFormField( @@ -129,7 +127,6 @@ class _FamilyMemberAddState extends State { ], hint: "Select applicable", title: "Occupation", - subTitle: "Occupation", errorField: "Please choose an occupation", ), ], diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 5d67e05..14cf00d 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -9,7 +9,6 @@ class DropDownFormField extends FormField { required list, required title, required hint, - required subTitle, errorField, AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) : super( @@ -30,7 +29,7 @@ class DropDownFormField extends FormField { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.only(bottom: 30), + padding: EdgeInsets.only(bottom: 20), child: Text(title, style: GoogleFonts.montserrat( fontSize: 25, color: Colors.black)), @@ -38,40 +37,39 @@ class DropDownFormField extends FormField { Card( elevation: 2, margin: EdgeInsets.only(bottom: 4), - child: ListTile( - title: Text( - subTitle, - style: GoogleFonts.montserrat(color: Colors.black), - ), - contentPadding: EdgeInsets.fromLTRB(10, 0, 10, 0), - trailing: DropdownButtonHideUnderline( - child: DropdownButton( - value: state.value, - isExpanded: false, - items: list.map((value) { - return DropdownMenuItem( - value: value, - child: Text(value), - ); - }).toList(), - onChanged: (newValue) { - state.didChange(newValue); - }, - hint: Container( - width: 150, //and here - child: Text( - hint, - style: TextStyle( - color: state.hasError - ? Colors.red - : Colors.grey), - textAlign: TextAlign.end, + child: DropdownButtonHideUnderline( + child: DropdownButton( + value: state.value, + isExpanded: true, + items: list.map((value) { + return DropdownMenuItem( + value: value, + child: Container( + child: Text( + value, + overflow: TextOverflow.ellipsis, + ), + padding: EdgeInsets.all(8), ), + ); + }).toList(), + onChanged: (newValue) { + state.didChange(newValue); + }, + hint: Container( + padding: EdgeInsets.all(8), + child: Text( + hint, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: state.hasError + ? Colors.red + : Colors.grey), + textAlign: TextAlign.end, ), - style: TextStyle( - color: Colors.black, - decorationColor: Colors.red), ), + style: TextStyle( + color: Colors.black, decorationColor: Colors.red), ), ), ), diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 5f90030..34fccad 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -44,28 +44,30 @@ class _FormPageViewState extends State { widget.pageWidgetList[index], formKeyList[index], ))); - widgetList.add(PageViewContentBox(ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all(Colors.white), - backgroundColor: MaterialStateProperty.all(Colors.red), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.zero, - side: BorderSide(color: Colors.red)))), - onPressed: () { - bool isValid = true; - for (int i = 0; i < widgetLength - 1; i++) { - var isDataValid = formKeyList[i].currentState!.validate(); - isValid &= isDataValid; - - if (isDataValid) { - formKeyList[i].currentState!.save(); + widgetList.add(PageViewContentBox(Center( + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all(Colors.red), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.zero, + side: BorderSide(color: Colors.red)))), + onPressed: () { + bool isValid = true; + for (int i = 0; i < widgetLength - 1; i++) { + var isDataValid = formKeyList[i].currentState!.validate(); + isValid &= isDataValid; + + if (isDataValid) { + formKeyList[i].currentState!.save(); + } } - } - widget.onSubmit(isValid); - }))); + widget.onSubmit(isValid); + }), + ))); } _onPageViewChange(int page) { diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index a224ee4..81a38d2 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -24,8 +24,17 @@ class PageViewContentBox extends StatelessWidget { ), child: Padding( padding: EdgeInsets.all(12), - child: Center( - child: centerWidget, + child: LayoutBuilder( + builder: + (BuildContext context, BoxConstraints viewportConstraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: + BoxConstraints(minHeight: viewportConstraints.maxHeight), + child: centerWidget, + ), + ); + }, ), ), ), From 1e7d7326b18dc2b90ee88bb8f366d392c3f16a99 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 13 Nov 2021 15:36:46 +0530 Subject: [PATCH 033/264] Check if onSaved returns value --- lib/Screens/FamilyMemberAdd.dart | 35 +++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 45d586a..57537e4 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -5,6 +5,7 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePicker.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; +import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -18,6 +19,8 @@ class _FamilyMemberAddState extends State { print(isValid.toString()); } + bool dailyWageWorker = false; + int count = 0; final PageController controller = PageController(initialPage: 0); @@ -99,7 +102,7 @@ class _FamilyMemberAddState extends State { TextFormField( validator: (value) { if (value == "") { - return "Please enter a value"; + return "Enter 12 digit Aadhaar"; } else if (value!.length != 10) { return "Enter a valid Aadhaar"; } else @@ -129,8 +132,38 @@ class _FamilyMemberAddState extends State { title: "Occupation", errorField: "Please choose an occupation", ), + Container( + child: Column( + children: [ + Text("Are you a daily wage worker?"), + OptionsWidget(options: ["Yes","No"], + onSaved: (val){ + String value = val; + dailyWageWorker = value.toLowerCase() as bool; + print(dailyWageWorker); + }, + //TODO: Add a function that returns final value back to this widget + ), + ], + ), + ), + //TODO: Add work timings + Container( + child: Column( + children: [ + Text('Eligible and receiving old age pension'), + OptionsWidget(options: ["Eligible","Eligible, receiving","Not eligible"]), + ], + ), + ), ], ), + Column( + children:[ + Text('Hi!') + ] + + ), Text('Haha Hi') ], _onSubmit), ); From 108d61f4963ec9404d25dcf1e2edadc9534f702d Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 13 Nov 2021 17:36:34 +0530 Subject: [PATCH 034/264] Fixed scrollview resize issues --- lib/Screens/FamilyMemberAdd.dart | 269 ++++++++++++++-------------- lib/Widgets/FormPageView.dart | 20 ++- lib/Widgets/OptionsFormWidget.dart | 2 + lib/Widgets/PageViewContentBox.dart | 1 + 4 files changed, 152 insertions(+), 140 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 57537e4..61a8ce6 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -31,141 +31,146 @@ class _FamilyMemberAddState extends State { @override Widget build(BuildContext context) { return Scaffold( + resizeToAvoidBottomInset: false, backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), - body: FormPageView([ - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextFormField( - decoration: InputDecoration(), - validator: (value) { - if (value == "") { - return "Please enter a name"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, - ), - DatePicker(), - GenderPickerWithImage( - verticalAlignedText: false, - selectedGender: Gender.Male, - selectedGenderTextStyle: TextStyle( - color: Color(0xFF8b32a8), fontWeight: FontWeight.bold), - unSelectedGenderTextStyle: - TextStyle(color: Colors.black, fontWeight: FontWeight.normal), - onChanged: (Gender? gender) { - print(gender); - }, - equallyAligned: true, - animationDuration: Duration(milliseconds: 300), - isCircular: true, - // default : true, - opacityOfGradient: 0.4, - padding: const EdgeInsets.all(3), - size: 70, //default : 40 - ), - DropDownFormField( - list: [ - 'None', - 'Elementary', - 'Secondary', - 'Higher Secondary', - 'Bachelor\'s', - 'Master\'s' - ], - hint: "Select the highest", - title: "Educational qualification", - errorField: "Please choose a qualification", - ), - TextFormField( - keyboardType: TextInputType.number, - decoration: InputDecoration(), - validator: (value) { - if (value == "") { - return "Please enter a value"; - } else if (value!.length != 10) { - return "Enter a valid number"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextFormField( - validator: (value) { - if (value == "") { - return "Enter 12 digit Aadhaar"; - } else if (value!.length != 10) { - return "Enter a valid Aadhaar"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, - ), - DropDownFormField( - //TODO: Replace with a checkbox dialogue - list: [ - 'Widower', - 'Divorcee', - 'Differently abled' - ], - hint: "Select applicable", - title: "Vulnerabilities", - errorField: "Please choose a vulnerability", - ), - DropDownFormField( - list: [ - 'Clerical support worker', - 'Services and sales worker', - 'Skilled agricultural, forestry and fishery worker', - 'Unemployed' - ], - hint: "Select applicable", - title: "Occupation", - errorField: "Please choose an occupation", - ), - Container( - child: Column( - children: [ - Text("Are you a daily wage worker?"), - OptionsWidget(options: ["Yes","No"], - onSaved: (val){ - String value = val; - dailyWageWorker = value.toLowerCase() as bool; - print(dailyWageWorker); - }, - //TODO: Add a function that returns final value back to this widget + body:SizedBox( + height: MediaQuery.of(context).size.height-MediaQuery.of(context).viewInsets.bottom*1.4, + child: SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: FormPageView([ + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextFormField( + decoration: InputDecoration(), + validator: (value) { + if (value == "") { + return "Please enter a name"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + DatePicker(), + GenderPickerWithImage( + verticalAlignedText: false, + selectedGender: Gender.Male, + selectedGenderTextStyle: TextStyle( + color: Color(0xFF8b32a8), fontWeight: FontWeight.bold), + unSelectedGenderTextStyle: + TextStyle(color: Colors.black, fontWeight: FontWeight.normal), + onChanged: (Gender? gender) { + print(gender); + }, + equallyAligned: true, + animationDuration: Duration(milliseconds: 300), + isCircular: true, + // default : true, + opacityOfGradient: 0.4, + padding: const EdgeInsets.all(3), + size: 70, //default : 40 + ), + DropDownFormField( + list: [ + 'None', + 'Elementary', + 'Secondary', + 'Higher Secondary', + 'Bachelor\'s', + 'Master\'s' + ], + hint: "Select the highest", + title: "Educational qualification", + errorField: "Please choose a qualification", + ), + TextFormField( + keyboardType: TextInputType.number, + decoration: InputDecoration(), + validator: (value) { + if (value == "") { + return "Please enter a value"; + } else if (value!.length != 10) { + return "Enter a valid number"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + ], ), - ], - ), - ), - //TODO: Add work timings - Container( - child: Column( - children: [ - Text('Eligible and receiving old age pension'), - OptionsWidget(options: ["Eligible","Eligible, receiving","Not eligible"]), - ], - ), - ), - ], - ), - Column( - children:[ - Text('Hi!') - ] - + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextFormField( + validator: (value) { + if (value == "") { + return "Enter 12 digit Aadhaar"; + } else if (value!.length != 12) { + return "Enter a valid Aadhaar"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + DropDownFormField( + //TODO: Replace with a CheckBoxListTile + list: ['Widower', 'Divorcee', 'Differently abled'], + hint: "Select applicable", + title: "Vulnerabilities", + errorField: "Please choose a vulnerability", + ), + DropDownFormField( + list: [ + 'Clerical support worker', + 'Services and sales worker', + 'Skilled agricultural, forestry and fishery worker', + 'Unemployed' + ], + hint: "Select applicable", + title: "Occupation", + errorField: "Please choose an occupation", + ), + Container( + child: Column( + children: [ + OptionsWidget( + options: [["Yes","yes"],["No","no"]], + title: "Daily wage worker?", + onSaved: (val) { + String value = val; + dailyWageWorker = value.toLowerCase() as bool; + print(dailyWageWorker); + }, + ), + ], + ), + ), + //TODO: Add work timings + Container( + child: Column( + children: [ + OptionsWidget( + options: [ + ["Eligible","eligible"], + ["Eligible, receiving","eligible_receiving"], + ["Not eligible","not_eligible"] + ], + title: 'Old age pension', + ), + ], + ), + ), + TextFormField(), + ], + ), + Column(children: [Text('Hi!')]), + Text('Haha Hi') + ], _onSubmit), ), - Text('Haha Hi') - ], _onSubmit), - ); + ), + ); } } diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 34fccad..5776770 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; + import 'PageViewContentBox.dart'; class FormPageView extends StatefulWidget { @@ -92,15 +93,18 @@ class _FormPageViewState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ StepCounterWidget(widgetLength, count, formErrorTile, controller), - Expanded( - child: Container( - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: controller, - children: widgetList, + SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: Container( + height: MediaQuery.of(context).size.height * 0.82, + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: controller, + children: widgetList, + ), ), - )), + ), ], ); } diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 849634f..9d2a520 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -13,6 +13,7 @@ class OptionsWidget extends FormField { {FormFieldSetter? onSaved, FormFieldValidator? validator, required List options, + required String title, bool setDefaultValue = false, AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) : super( @@ -29,6 +30,7 @@ class OptionsWidget extends FormField { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ + Text(title,style: TextStyle(fontSize: 15),), Wrap( children: options .map((e) => new OptionButton( diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index 81a38d2..61f9f5a 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -28,6 +28,7 @@ class PageViewContentBox extends StatelessWidget { builder: (BuildContext context, BoxConstraints viewportConstraints) { return SingleChildScrollView( + physics: ClampingScrollPhysics(), child: ConstrainedBox( constraints: BoxConstraints(minHeight: viewportConstraints.maxHeight), From bcfa191aa0938d795bdac0ad152231136134e887 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 13 Nov 2021 17:58:03 +0530 Subject: [PATCH 035/264] Removed SingleChildScrollView in PageViewContentBox.dart --- lib/Screens/FamilyMemberAdd.dart | 7 +++---- lib/Widgets/PageViewContentBox.dart | 16 ++-------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 61a8ce6..a7ee085 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -137,12 +137,11 @@ class _FamilyMemberAddState extends State { child: Column( children: [ OptionsWidget( - options: [["Yes","yes"],["No","no"]], + options: [["Yes",true],["No",false]], title: "Daily wage worker?", onSaved: (val) { - String value = val; - dailyWageWorker = value.toLowerCase() as bool; - print(dailyWageWorker); + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); }, ), ], diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index 61f9f5a..c36c195 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -24,21 +24,9 @@ class PageViewContentBox extends StatelessWidget { ), child: Padding( padding: EdgeInsets.all(12), - child: LayoutBuilder( - builder: - (BuildContext context, BoxConstraints viewportConstraints) { - return SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: ConstrainedBox( - constraints: - BoxConstraints(minHeight: viewportConstraints.maxHeight), - child: centerWidget, - ), - ); - }, + child: centerWidget, ), ), - ), - ); + ); } } From 2e9c55b9c3bb19975d1995fdfd0491c2ab5117b3 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 15 Nov 2021 12:20:28 +0530 Subject: [PATCH 036/264] Added labels, title constructor to DatePicker.dart --- lib/Screens/FamilyAddScreens/PageOne.dart | 51 ----------------------- lib/Screens/FamilyMemberAdd.dart | 44 ++++++++++--------- lib/Widgets/DatePicker.dart | 16 ++++++- 3 files changed, 38 insertions(+), 73 deletions(-) diff --git a/lib/Screens/FamilyAddScreens/PageOne.dart b/lib/Screens/FamilyAddScreens/PageOne.dart index e6bc69b..e69de29 100644 --- a/lib/Screens/FamilyAddScreens/PageOne.dart +++ b/lib/Screens/FamilyAddScreens/PageOne.dart @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:geo_spatial/Widgets/DatePicker.dart'; - - - -class PageOne extends StatefulWidget { - - PageOne(this._formKey); - - final _formKey; - - @override - _PageOneState createState() => _PageOneState(); -} - -class _PageOneState extends State with AutomaticKeepAliveClientMixin{ - @override - Widget build(BuildContext context){ - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('Enter name:',textAlign: TextAlign.start,), - Form( - key: widget._formKey, - child: Column( - children: [ - TextFormField( - validator: (value){ - if(value==null || value=='') - return 'Enter a valid name'; - - else{ - return null; - } - }, - autovalidateMode: AutovalidateMode.always, - ), - DatePicker(), - ], - ) - ) - ], - ); - } - - @override - bool get wantKeepAlive => true; - -} - diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index a7ee085..9d9278c 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -35,7 +35,7 @@ class _FamilyMemberAddState extends State { backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), body:SizedBox( - height: MediaQuery.of(context).size.height-MediaQuery.of(context).viewInsets.bottom*1.4, + height: MediaQuery.of(context).size.height-MediaQuery.of(context).viewInsets.bottom*1.1, child: SingleChildScrollView( physics: ClampingScrollPhysics(), child: FormPageView([ @@ -44,7 +44,9 @@ class _FamilyMemberAddState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ TextFormField( - decoration: InputDecoration(), + decoration: InputDecoration( + label: Text("Name"), + ), validator: (value) { if (value == "") { return "Please enter a name"; @@ -53,7 +55,7 @@ class _FamilyMemberAddState extends State { }, autovalidateMode: AutovalidateMode.always, ), - DatePicker(), + DatePicker("Date of Birth"), GenderPickerWithImage( verticalAlignedText: false, selectedGender: Gender.Male, @@ -87,7 +89,9 @@ class _FamilyMemberAddState extends State { ), TextFormField( keyboardType: TextInputType.number, - decoration: InputDecoration(), + decoration: InputDecoration( + label: Text("Phone Number: "), + ), validator: (value) { if (value == "") { return "Please enter a value"; @@ -148,24 +152,24 @@ class _FamilyMemberAddState extends State { ), ), //TODO: Add work timings - Container( - child: Column( - children: [ - OptionsWidget( - options: [ - ["Eligible","eligible"], - ["Eligible, receiving","eligible_receiving"], - ["Not eligible","not_eligible"] - ], - title: 'Old age pension', - ), - ], - ), - ), - TextFormField(), ], ), - Column(children: [Text('Hi!')]), + Column(children: [ + Container( + child: Column( + children: [ + OptionsWidget( + options: [ + ["Eligible","eligible"], + ["Eligible, receiving","eligible_receiving"], + ["Not eligible","not_eligible"] + ], + title: 'Old age pension', + ), + ], + ), + ), + ]), Text('Haha Hi') ], _onSubmit), ), diff --git a/lib/Widgets/DatePicker.dart b/lib/Widgets/DatePicker.dart index 97cb0f1..732957d 100644 --- a/lib/Widgets/DatePicker.dart +++ b/lib/Widgets/DatePicker.dart @@ -2,7 +2,11 @@ import 'package:flutter/material.dart'; import 'package:table_calendar/table_calendar.dart'; class DatePicker extends StatefulWidget { - const DatePicker({Key? key}) : super(key: key); + + + DatePicker(this.title); + + String title; @override _DatePickerState createState() => _DatePickerState(); @@ -10,12 +14,17 @@ class DatePicker extends StatefulWidget { class _DatePickerState extends State { + @override + void initState(){ + super.initState(); + } + DateTime date = DateTime.now(); var textFieldController = TextEditingController(); String getText() { - if (date == null) { + if (date == "") { return 'Pick date'; } @@ -30,6 +39,9 @@ class _DatePickerState extends State { return Container( child: TextField( + decoration: InputDecoration( + label: Text(widget.title), + ), controller: textFieldController, onTap: () { pickDate(context); From 3ea897296132cb082b810085a47dad0e66cb3817 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 15 Nov 2021 13:09:30 +0530 Subject: [PATCH 037/264] Added more widgets --- lib/Screens/FamilyMemberAdd.dart | 363 +++++++++++++++++++------------ 1 file changed, 227 insertions(+), 136 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 9d9278c..499902e 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -34,146 +34,237 @@ class _FamilyMemberAddState extends State { resizeToAvoidBottomInset: false, backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), - body:SizedBox( - height: MediaQuery.of(context).size.height-MediaQuery.of(context).viewInsets.bottom*1.1, + body: SizedBox( + height: MediaQuery.of(context).size.height - + MediaQuery.of(context).viewInsets.bottom * 1.1, child: SingleChildScrollView( physics: ClampingScrollPhysics(), child: FormPageView([ - Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextFormField( - decoration: InputDecoration( - label: Text("Name"), - ), - validator: (value) { - if (value == "") { - return "Please enter a name"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, - ), - DatePicker("Date of Birth"), - GenderPickerWithImage( - verticalAlignedText: false, - selectedGender: Gender.Male, - selectedGenderTextStyle: TextStyle( - color: Color(0xFF8b32a8), fontWeight: FontWeight.bold), - unSelectedGenderTextStyle: - TextStyle(color: Colors.black, fontWeight: FontWeight.normal), - onChanged: (Gender? gender) { - print(gender); - }, - equallyAligned: true, - animationDuration: Duration(milliseconds: 300), - isCircular: true, - // default : true, - opacityOfGradient: 0.4, - padding: const EdgeInsets.all(3), - size: 70, //default : 40 - ), - DropDownFormField( - list: [ - 'None', - 'Elementary', - 'Secondary', - 'Higher Secondary', - 'Bachelor\'s', - 'Master\'s' - ], - hint: "Select the highest", - title: "Educational qualification", - errorField: "Please choose a qualification", - ), - TextFormField( - keyboardType: TextInputType.number, - decoration: InputDecoration( - label: Text("Phone Number: "), - ), - validator: (value) { - if (value == "") { - return "Please enter a value"; - } else if (value!.length != 10) { - return "Enter a valid number"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextFormField( - validator: (value) { - if (value == "") { - return "Enter 12 digit Aadhaar"; - } else if (value!.length != 12) { - return "Enter a valid Aadhaar"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, - ), - DropDownFormField( - //TODO: Replace with a CheckBoxListTile - list: ['Widower', 'Divorcee', 'Differently abled'], - hint: "Select applicable", - title: "Vulnerabilities", - errorField: "Please choose a vulnerability", - ), - DropDownFormField( - list: [ - 'Clerical support worker', - 'Services and sales worker', - 'Skilled agricultural, forestry and fishery worker', - 'Unemployed' - ], - hint: "Select applicable", - title: "Occupation", - errorField: "Please choose an occupation", - ), - Container( - child: Column( - children: [ - OptionsWidget( - options: [["Yes",true],["No",false]], - title: "Daily wage worker?", - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - }, - ), - ], - ), - ), - //TODO: Add work timings - ], - ), - Column(children: [ - Container( - child: Column( - children: [ - OptionsWidget( - options: [ - ["Eligible","eligible"], - ["Eligible, receiving","eligible_receiving"], - ["Not eligible","not_eligible"] - ], - title: 'Old age pension', - ), - ], - ), - ), - ]), - Text('Haha Hi') - ], _onSubmit), + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextFormField( + decoration: InputDecoration( + label: Text("Name"), + ), + validator: (value) { + if (value == "") { + return "Please enter a name"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + DatePicker("Date of Birth"), + GenderPickerWithImage( + verticalAlignedText: false, + selectedGender: Gender.Male, + selectedGenderTextStyle: TextStyle( + color: Color(0xFF8b32a8), fontWeight: FontWeight.bold), + unSelectedGenderTextStyle: TextStyle( + color: Colors.black, fontWeight: FontWeight.normal), + onChanged: (Gender? gender) { + print(gender); + }, + equallyAligned: true, + animationDuration: Duration(milliseconds: 300), + isCircular: true, + // default : true, + opacityOfGradient: 0.4, + padding: const EdgeInsets.all(3), + size: 70, //default : 40 + ), + DropDownFormField( + list: [ + 'None', + 'Elementary', + 'Secondary', + 'Higher Secondary', + 'Bachelor\'s', + 'Master\'s' + ], + hint: "Select the highest", + title: "Educational qualification", + errorField: "Please choose a qualification", + ), + TextFormField( + keyboardType: TextInputType.number, + decoration: InputDecoration( + label: Text("Phone Number: "), + ), + validator: (value) { + if (value == "") { + return "Please enter a value"; + } else if (value!.length != 10) { + return "Enter a valid number"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextFormField( + decoration: InputDecoration( + label: Text('Aadhaar Number'), + ), + validator: (value) { + if (value == "") { + return "Enter 12 digit Aadhaar"; + } else if (value!.length != 12) { + return "Enter a valid Aadhaar"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, + ), + DropDownFormField( + //TODO: Replace with a CheckBoxListTile + list: [ + 'Widower', + 'Divorcee', + 'Differently abled', + 'Pregnant Woman', + 'Lactating Mother', + 'Elderly (>60 years)', + 'Widower', + 'Differently Abled', + 'Children below 2 years', + 'Others', + 'None' + ], + hint: "Select applicable", + title: "Vulnerabilities", + errorField: "Please choose a vulnerability", + ), + DropDownFormField( + //TODO: Replace with a CheckBoxListTile + list: [ + 'Clerical support worker', + 'Services and sales worker', + 'Agricultural, forestry, fishery worker', + 'Unemployed', + 'Professional', + 'Technician and associate professionals', + 'Craft and related trades workers', + 'Plant/Machine Operators and Assemblers', + 'Elementary occupations', + 'Armed Forces occupations' + ], + hint: "Select applicable", + title: "Occupation", + errorField: "Please choose an occupation", + ), + OptionsWidget( + options: [ + ["Yes", true], + ["No", false] + ], + title: "Daily wage worker?", + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + }, + ), + TextFormField( + decoration: InputDecoration(label: Text('Income/day')), + validator: (value) { + if (value == "") { + return "Enter Income/Day"; + } + }, + ) + ], + ), + Column(children: [ + //TODO: Add work timings + TextFormField( + decoration: InputDecoration(label: Text('Income/month')), + validator: (value) { + if (value == "") { + return "Enter Income/Day"; + } + }, + ), + Column( + children: [ + OptionsWidget( + options: [ + ["Eligible", "eligible"], + ["Eligible, receiving", "eligible_receiving"], + ["Not eligible", "not_eligible"] + ], + title: 'Old age pension', + ), + ], + ), + OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Doing/Did business', + ), + OptionsWidget( + options: [ + ["Married", "married"], + ["Unmarried", "unmarried"], + ], + title: 'Marital Status', + ), + TextFormField( + //TODO: Replace with a custom widget + decoration: InputDecoration(label: Text('Special Skills')), + ), + ]), + Column( + children: [ + TextFormField( + //TODO: Replace with a custom widget + decoration: InputDecoration(label: Text('Frequent ailments')), + ), + TextFormField( + //TODO: Replace with a custom widget + decoration: InputDecoration(label: Text('Communicable Diseases')), + ), + TextFormField( + //TODO? Replace with a custom widget + decoration: InputDecoration(label: Text('Non Communicable Diseases')), + ), + OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Surgeries', + ), + OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Aware about Anganwadi services?', + ), + OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Using anything?', + ), + //TODO: Display next widget only if the previous widget is true + //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog + + ], + ) + ], _onSubmit), ), ), - ); + ); } } From dc8cb13fbea1130c8bc244a1238f872ecc33e4c9 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 16 Nov 2021 01:28:04 +0530 Subject: [PATCH 038/264] Preliminary addition for FamilyMemberAdd.dart done --- lib/Screens/FamilyMemberAdd.dart | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 499902e..bc67da2 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -230,11 +230,13 @@ class _FamilyMemberAddState extends State { ), TextFormField( //TODO: Replace with a custom widget - decoration: InputDecoration(label: Text('Communicable Diseases')), + decoration: + InputDecoration(label: Text('Communicable Diseases')), ), TextFormField( //TODO? Replace with a custom widget - decoration: InputDecoration(label: Text('Non Communicable Diseases')), + decoration: + InputDecoration(label: Text('Non Communicable Diseases')), ), OptionsWidget( options: [ @@ -259,7 +261,27 @@ class _FamilyMemberAddState extends State { ), //TODO: Display next widget only if the previous widget is true //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog - + //TODO: Add a checkbox dialog for PHC services utilised + //TODO: Add a checkbox dialog for private heath clinic facilities used + TextFormField( + decoration: InputDecoration(label: Text('Why private?')), + ), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you use any tobacco based products?"), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you consume alcohol?"), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you have Aarogya Setu installed?"), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you have the Vizhithiru app installed?"), ], ) ], _onSubmit), From 0e266fc6e455d5bac6f31ea4ab80992bad5c04fe Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 16 Nov 2021 01:40:08 +0530 Subject: [PATCH 039/264] Added FamilyDetails.dart and FamilyHomeScreen.dart --- lib/Screens/FamilyDetails.dart | 10 ++++++++++ lib/Screens/FamilyHomeScreen.dart | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 lib/Screens/FamilyDetails.dart create mode 100644 lib/Screens/FamilyHomeScreen.dart diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart new file mode 100644 index 0000000..6544ed0 --- /dev/null +++ b/lib/Screens/FamilyDetails.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class FamilyDetails extends StatelessWidget { + const FamilyDetails({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart new file mode 100644 index 0000000..b054032 --- /dev/null +++ b/lib/Screens/FamilyHomeScreen.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/FamilyDetails.dart'; +import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; + +class FamilyHomeScreen extends StatelessWidget { + const FamilyHomeScreen({required Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + TextButton(onPressed: (){ + Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); + }, child: Text('Add member')), + TextButton(onPressed: (){ + Navigator.push(context, MaterialPageRoute(builder: (context)=>FamilyDetails())); + }, child: Text('Get common details')), + ], + ), + ); + } +} From 15e25ae2e29276d55c09ea61230161d9ebd0dc37 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 16 Nov 2021 09:10:45 +0530 Subject: [PATCH 040/264] Modified redirects from Home.dart, fixed pixel overflow --- lib/Screens/FamilyDetails.dart | 154 +++++++++++++++++++++++++++++- lib/Screens/FamilyHomeScreen.dart | 21 ++-- lib/Screens/FamilyMemberAdd.dart | 6 +- lib/Screens/Home.dart | 3 +- 4 files changed, 170 insertions(+), 14 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 6544ed0..58d9efa 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -1,10 +1,160 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/DropDownFormField.dart'; +import 'package:geo_spatial/Widgets/FormPageView.dart'; +import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; -class FamilyDetails extends StatelessWidget { +class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key}) : super(key: key); + @override + State createState() => _FamilyDetailsState(); +} + +class _FamilyDetailsState extends State { + _onSubmit(bool isValid) { + print(isValid.toString()); + } + + final PageController controller = PageController(initialPage: 0); + + final List> formKeyList = + List.generate(3, (index) => GlobalObjectKey(index)); + final error = [false, false, false]; + + @override Widget build(BuildContext context) { - return Container(); + return Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: Color(0xffEAE7FA), + appBar: AppBarBackButton('Add Family Member'), + body:SizedBox( + height: MediaQuery.of(context).size.height - + MediaQuery.of(context).viewInsets.bottom * 1.1, + child: SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: FormPageView([ + Column( + children: [ + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you have drinking water available?"), + //TODO: Source of water if answer is yes + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you have toilet facilities?"), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Is running water available?"), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "If not toilet, community toilet?"), + OptionsWidget(options: [ + ['Clean', 'clean'], + ['Unclean', 'unclean'] + ], title: "Environmental sanitation level: "), + DropDownFormField( + list: [ + '1', + '2', + '3', + '4', + '5', + 'More' + ], + hint: "Select the highest", + title: "No of two wheelers", + errorField: "Please choose a valid number", + ), + DropDownFormField( + list: [ + '1', + '2', + '3', + '4', + '5', + 'More' + ], + hint: "Select the highest", + title: "No of three wheelers", + errorField: "Please choose a valid number", + ), + //TODO: Add dialog checkboxlist for brands of two and three wheelers + DropDownFormField( + list: [ + '1', + '2', + '3', + '4', + '5', + 'More' + ], + hint: "Select the highest", + title: "No of four wheelers", + errorField: "Please choose a valid number", + ), + //TODO: Add brands of four wheelers + OptionsWidget(options: [['Yes','yes'],['No','no']], title: "Do you own cattle?"), + //TODO: Display if answer to previous question is yes + TextFormField( + decoration: InputDecoration( + label: Text('Income from cattle: ') + ), + autovalidateMode: AutovalidateMode.always, + keyboardType: TextInputType.number, + ), + OptionsWidget( + options: [ + ['Yes','yes'], + ['No','no'] + ], + title: "Do you own farmland?", + ), + //TODO: checkbox dialog for crops cultivated + OptionsWidget( + options: [ + ['Yes','yes'], + ['No','no'] + ], + title: "Do you preserve seeds?", + ), + //TODO: Display if answer to previous question is yes + //TODO: Add autosuggest text widget for seeds preserved + //TODO: Add autosuggest text widget for locally consumed food + //TODO: Add autosuggest text widget for trees owned + OptionsWidget( + options: [ + ['Yes','yes'], + ['No','no'] + ], + title: "Do you have a kitchen garden?", + ), + //TODO: Add autosuggest text widget for kitchen garden crops + TextFormField( + decoration: InputDecoration( + label: Text('First line'), + ), + ), + TextFormField( + decoration: InputDecoration( + label: Text('Second line'), + ), + ), + TextFormField( + decoration: InputDecoration( + label: Text('City'), + ), + ), + ], + ) + ],_onSubmit) + ) + ) + ); } } diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index b054032..38c3fc2 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -3,20 +3,21 @@ import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; class FamilyHomeScreen extends StatelessWidget { - const FamilyHomeScreen({required Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( - body: Column( - children: [ - TextButton(onPressed: (){ - Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); - }, child: Text('Add member')), - TextButton(onPressed: (){ - Navigator.push(context, MaterialPageRoute(builder: (context)=>FamilyDetails())); - }, child: Text('Get common details')), - ], + body: SafeArea( + child: Column( + children: [ + TextButton(onPressed: (){ + Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); + }, child: Text('Add member')), + TextButton(onPressed: (){ + Navigator.push(context, MaterialPageRoute(builder: (context)=>FamilyDetails())); + }, child: Text('Get common details')), + ], + ), ), ); } diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index bc67da2..4b7a8b9 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -257,10 +257,14 @@ class _FamilyMemberAddState extends State { ["Yes", "yes"], ["No", "no"], ], - title: 'Using anything?', + title: 'Using any Anganwadi services?', ), //TODO: Display next widget only if the previous widget is true //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog + ], + ), + Column( + children: [ //TODO: Add a checkbox dialog for PHC services utilised //TODO: Add a checkbox dialog for private heath clinic facilities used TextFormField( diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index e63112d..4302b07 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; +import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Screens/IndividualDataCollection.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -61,7 +62,7 @@ class _HomeWidgetState extends State { 'Individual data', 'Individual data entry for everyone in home', 'assets/svg/female.svg', - IndividualDataCollection(), + FamilyHomeScreen(), Color(0xFFF700FF), Color(0xff3D2C8D)), DataCard( From 64e0572a4dc18baca2d99cf24aea21a188ae4a87 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 16 Nov 2021 12:17:19 +0530 Subject: [PATCH 041/264] Added widgets --- lib/Screens/FamilyDetails.dart | 247 ++++++++++++++++----------------- 1 file changed, 118 insertions(+), 129 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 58d9efa..7b0c2dc 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -19,142 +19,131 @@ class _FamilyDetailsState extends State { final PageController controller = PageController(initialPage: 0); final List> formKeyList = - List.generate(3, (index) => GlobalObjectKey(index)); + List.generate(3, (index) => GlobalObjectKey(index)); final error = [false, false, false]; - @override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, backgroundColor: Color(0xffEAE7FA), appBar: AppBarBackButton('Add Family Member'), - body:SizedBox( - height: MediaQuery.of(context).size.height - - MediaQuery.of(context).viewInsets.bottom * 1.1, - child: SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: FormPageView([ - Column( - children: [ - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have drinking water available?"), - //TODO: Source of water if answer is yes - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have toilet facilities?"), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Is running water available?"), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "If not toilet, community toilet?"), - OptionsWidget(options: [ - ['Clean', 'clean'], - ['Unclean', 'unclean'] - ], title: "Environmental sanitation level: "), - DropDownFormField( - list: [ - '1', - '2', - '3', - '4', - '5', - 'More' - ], - hint: "Select the highest", - title: "No of two wheelers", - errorField: "Please choose a valid number", - ), - DropDownFormField( - list: [ - '1', - '2', - '3', - '4', - '5', - 'More' - ], - hint: "Select the highest", - title: "No of three wheelers", - errorField: "Please choose a valid number", - ), - //TODO: Add dialog checkboxlist for brands of two and three wheelers - DropDownFormField( - list: [ - '1', - '2', - '3', - '4', - '5', - 'More' - ], - hint: "Select the highest", - title: "No of four wheelers", - errorField: "Please choose a valid number", - ), - //TODO: Add brands of four wheelers - OptionsWidget(options: [['Yes','yes'],['No','no']], title: "Do you own cattle?"), - //TODO: Display if answer to previous question is yes - TextFormField( - decoration: InputDecoration( - label: Text('Income from cattle: ') - ), - autovalidateMode: AutovalidateMode.always, - keyboardType: TextInputType.number, - ), - OptionsWidget( - options: [ - ['Yes','yes'], - ['No','no'] - ], - title: "Do you own farmland?", - ), - //TODO: checkbox dialog for crops cultivated - OptionsWidget( - options: [ - ['Yes','yes'], - ['No','no'] - ], - title: "Do you preserve seeds?", - ), - //TODO: Display if answer to previous question is yes - //TODO: Add autosuggest text widget for seeds preserved - //TODO: Add autosuggest text widget for locally consumed food - //TODO: Add autosuggest text widget for trees owned - OptionsWidget( - options: [ - ['Yes','yes'], - ['No','no'] - ], - title: "Do you have a kitchen garden?", - ), - //TODO: Add autosuggest text widget for kitchen garden crops - TextFormField( - decoration: InputDecoration( - label: Text('First line'), - ), - ), - TextFormField( - decoration: InputDecoration( - label: Text('Second line'), - ), - ), - TextFormField( - decoration: InputDecoration( - label: Text('City'), - ), - ), - ], - ) - ],_onSubmit) - ) - ) - ); + body: SizedBox( + height: MediaQuery.of(context).size.height - + MediaQuery.of(context).viewInsets.bottom * 1.1, + child: SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: FormPageView([ + Column( + children: [ + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you have drinking water available?"), + //TODO: Source of water if answer is yes + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you have toilet facilities?"), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Is running water available?"), + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "If not toilet, community toilet?"), + OptionsWidget(options: [ + ['Clean', 'clean'], + ['Unclean', 'unclean'] + ], title: "Environmental sanitation level: "), + ], + ), + Column( + children: [ + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of two wheelers", + errorField: "Please choose a valid number", + ), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of three wheelers", + errorField: "Please choose a valid number", + ), + //TODO: Add dialog checkboxlist for brands of two and three wheelers + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of four wheelers", + errorField: "Please choose a valid number", + ), + ], + ), + Column( + children: [ + //TODO: Add brands of four wheelers + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you own cattle?"), + //TODO: Display if answer to previous question is yes + TextFormField( + decoration: InputDecoration( + label: Text('Income from cattle: ')), + autovalidateMode: AutovalidateMode.always, + keyboardType: TextInputType.number, + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you own farmland?", + ), + //TODO: checkbox dialog for crops cultivated + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you preserve seeds?", + ), + //TODO: Display if answer to previous question is yes + //TODO: Add autosuggest text widget for seeds preserved + //TODO: Add autosuggest text widget for locally consumed food + //TODO: Add autosuggest text widget for trees owned + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have a kitchen garden?", + ), + //TODO: Add autosuggest text widget for kitchen garden crops + ], + ), + Column( + children: [ + TextFormField( + decoration: InputDecoration( + label: Text('First line'), + ), + ), + TextFormField( + decoration: InputDecoration( + label: Text('Second line'), + ), + ), + TextFormField( + decoration: InputDecoration( + label: Text('City'), + ), + ), + ], + ) + ], _onSubmit)))); } } From 95309a7d1220a607c8699200f50a3cb9ce7f1c05 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Wed, 17 Nov 2021 15:51:44 +0530 Subject: [PATCH 042/264] Added keyboard_detector, did login screen styling --- assets/image_01.png | Bin 18217 -> 20976 bytes lib/Screens/FamilyAddScreens/PageOne.dart | 0 lib/Screens/Login.dart | 164 ++++++++++------------ lib/Widgets/FormCard.dart | 73 +++++----- lib/main.dart | 2 +- pubspec.lock | 21 +++ 6 files changed, 132 insertions(+), 128 deletions(-) delete mode 100644 lib/Screens/FamilyAddScreens/PageOne.dart diff --git a/assets/image_01.png b/assets/image_01.png index 4235bba64de9e5a1dfe37b7d1facf4c9a8a0ea55..6b8634631486d868e3db5c9bce5b07db85867be0 100644 GIT binary patch literal 20976 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 diff --git a/lib/Screens/FamilyAddScreens/PageOne.dart b/lib/Screens/FamilyAddScreens/PageOne.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 46c5cb5..69bb91e 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -1,9 +1,11 @@ import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; -import 'package:geo_spatial/Widgets/FormCard.dart'; import 'package:geo_spatial/Screens/Home.dart'; +import 'package:geo_spatial/Widgets/FormCard.dart'; +import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; final storage = FlutterSecureStorage(); @@ -21,6 +23,11 @@ class _MyAppState extends State { var _passwordError = null; bool _isSelected = false; + @override + void initState() { + super.initState(); + } + void _radio() { setState(() { _isSelected = !_isSelected; @@ -97,13 +104,13 @@ class _MyAppState extends State { padding: EdgeInsets.all(2.0), decoration: BoxDecoration( shape: BoxShape.circle, - border: Border.all(width: 2.0, color: Colors.black)), + border: Border.all(width: 2.0, color: Colors.white)), child: isSelected ? Container( width: double.infinity, height: double.infinity, decoration: - BoxDecoration(shape: BoxShape.circle, color: Colors.black), + BoxDecoration(shape: BoxShape.circle, color: Colors.white), ) : Container(), ); @@ -113,101 +120,86 @@ class _MyAppState extends State { child: Container( width: 120, height: 1.0, - color: Colors.black26.withOpacity(.2), + color: Colors.white70.withOpacity(.2), ), ); @override Widget build(BuildContext context) { - return new Scaffold( - backgroundColor: Color(0xffEAE7FA), + return Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: Colors.black, body: Stack( - fit: StackFit.expand, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Padding( - padding: EdgeInsets.only(top: 0.0), - child: Image.asset("assets/image_01.png"), - ), - Expanded( - child: Container(), - ), - Expanded(child: Image.asset("assets/image_02.png")) - ], - ), - SingleChildScrollView( - child: Padding( - padding: EdgeInsets.only(left: 28.0, right: 28.0, top: 60.0), - child: Column( - children: [ - SizedBox( - height: 230, - ), - FormCard(_usernameController, _passwordController, _nameError, - _passwordError), - SizedBox(height: 25), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - SizedBox( - width: 12.0, - ), - GestureDetector( - onTap: _radio, - child: radioButton(_isSelected), - ), - SizedBox( - width: 8.0, - ), - Text("Remember me", - style: TextStyle( - fontSize: 15, - )) - ], - ), - InkWell( - child: Container( - width: 100, - height: 50, - decoration: BoxDecoration( + fit: StackFit.expand, + children: [ + Container( + padding: EdgeInsets.only(top: MediaQuery.of(context).size.height*0.6), + child: Image(image: AssetImage("assets/image_01.png"),), + ), + SingleChildScrollView( + child: Padding( + padding: EdgeInsets.only(left: 20.0, right: 20.0), + child: Column( + children: [ + SizedBox( + height: MediaQuery.of(context).size.height * 0.25, + ), + FormCard(_usernameController, _passwordController, + _nameError, _passwordError), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + SizedBox( + width: 12.0, + ), + GestureDetector( + onTap: _radio, + child: radioButton(_isSelected), + ), + SizedBox( + width: 8.0, + ), + Text("Remember me", + style: GoogleFonts.poppins( + color: Colors.white, fontSize: 14.0)) + ], + ), + InkWell( + child: Container( + width: 100, + height: 45, + decoration: BoxDecoration( gradient: LinearGradient(colors: [ - Color.fromARGB(500, 59, 5, 120), - Color.fromARGB(250, 157, 133, 244), + Color(0xff37786a), + Color(0xff00fdcd), ]), - borderRadius: BorderRadius.circular(6.0), - boxShadow: [ - BoxShadow( - color: Color(0xFF6078ea).withOpacity(.3), - offset: Offset(0.0, 8.0), - blurRadius: 8.0) - ]), - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: _login, - child: Center( - child: Text("SIGN IN", - style: TextStyle( - color: Colors.white, - fontSize: 18, - letterSpacing: 1.0)), + borderRadius: BorderRadius.circular(30.0), + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: _login, + child: Center( + child: Text("SIGN IN", + style: GoogleFonts.poppins( + color: Colors.black, + fontSize: 18, + letterSpacing: 1.0)), + ), ), ), ), - ), - ) - ], - ), - ], + ) + ], + ), + ], + ), ), ), - ), - ], - ), - ); + ], + ), + ); } } diff --git a/lib/Widgets/FormCard.dart b/lib/Widgets/FormCard.dart index ebb812d..192b911 100644 --- a/lib/Widgets/FormCard.dart +++ b/lib/Widgets/FormCard.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; class FormCard extends StatelessWidget { FormCard(this._usernameController, this._passwordController, this._nameError, @@ -14,62 +15,52 @@ class FormCard extends StatelessWidget { return new Container( width: double.infinity, padding: EdgeInsets.only(bottom: 1), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15.0), - boxShadow: [ - BoxShadow( - color: Colors.black12, - offset: Offset(0.0, 15.0), - blurRadius: 15.0), - BoxShadow( - color: Colors.black12, - offset: Offset(0.0, -10.0), - blurRadius: 10.0), - ]), child: Padding( - padding: EdgeInsets.only(left: 16.0, right: 16.0, top: 20.0), + padding: EdgeInsets.only(left: 8.0, right: 8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("Login", - style: TextStyle( - fontSize: 35, - letterSpacing: 0.8, - color: Colors.deepPurpleAccent)), + style: GoogleFonts.poppins( + fontSize: 35, color: Color(0xff00fdcd))), SizedBox( - height: 20, + height: 10, ), TextField( controller: _usernameController, decoration: InputDecoration( - labelText: "Username", + hintText: "Enter username here", + hintStyle: GoogleFonts.poppins(color: Colors.white), + label: Text("Username", + style: GoogleFonts.poppins(color: Colors.white)), + focusedBorder: UnderlineInputBorder( + borderSide: const BorderSide( + color: Colors.greenAccent, width: 1.0)), + floatingLabelStyle: + GoogleFonts.poppins(color: Colors.greenAccent), errorText: _nameError, - labelStyle: - TextStyle(color: Colors.deepPurpleAccent, fontSize: 14.0), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0)), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0))), - ), - SizedBox( - height: 20, + labelStyle: GoogleFonts.poppins(fontSize: 14)), + cursorColor: Colors.greenAccent, ), TextField( - controller: _passwordController, - obscureText: true, - decoration: InputDecoration( - labelText: "Password", + controller: _passwordController, + obscureText: true, + decoration: InputDecoration( + hintText: "Enter password here", + hintStyle: GoogleFonts.poppins(color: Colors.white), + focusColor: Colors.greenAccent, + focusedBorder: UnderlineInputBorder( + borderSide: const BorderSide( + color: Colors.greenAccent, width: 1.0)), + label: Text("Password", + style: GoogleFonts.poppins(color: Colors.white)), + floatingLabelStyle: + GoogleFonts.poppins(color: Colors.greenAccent), errorText: _passwordError, - labelStyle: - TextStyle(color: Colors.deepPurpleAccent, fontSize: 14.0), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0)), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10.0))), - ), + labelStyle: GoogleFonts.poppins(fontSize: 14.0), + )), SizedBox( - height: 70, + height: 20, ), ], ), diff --git a/lib/main.dart b/lib/main.dart index 1b6ddbe..2de6f9a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -27,6 +27,6 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { //TODO: Replace with LoadValidPageWidget - return Home(); + return Login(); } } diff --git a/pubspec.lock b/pubspec.lock index ec2f559..16a9195 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -83,6 +83,27 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_keyboard_visibility: + dependency: "direct main" + description: + name: flutter_keyboard_visibility + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_web: + dependency: transitive + description: + name: flutter_keyboard_visibility_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" flutter_secure_storage: dependency: "direct main" description: From 80375c9f311e93f57a36f948a8976e2bf34759f1 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 19 Nov 2021 00:30:37 +0530 Subject: [PATCH 043/264] Built multi check box list dialog widget, with the choice to choose between single and multiple options --- lib/Widgets/CheckBoxAlertDialog.dart | 219 +++++++++++++++++++++++++++ lib/main.dart | 2 +- 2 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 lib/Widgets/CheckBoxAlertDialog.dart diff --git a/lib/Widgets/CheckBoxAlertDialog.dart b/lib/Widgets/CheckBoxAlertDialog.dart new file mode 100644 index 0000000..f37ac83 --- /dev/null +++ b/lib/Widgets/CheckBoxAlertDialog.dart @@ -0,0 +1,219 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +/** + * Implementation: + * + * Map values = { + 'yes': false, + 'no': false, + }; + + * CheckBoxAlertDialog( + title: 'Choose resource', + hint: 'Choose your resource', + dataMap: values, + singleOption: true, + context: context, + onSaved: (map) { + print(map); + print('called'); + }, + ), + */ + +class CheckBoxAlertDialog extends FormField { + CheckBoxAlertDialog( + {FormFieldSetter? onSaved, + FormFieldValidator? validator, + required title, + required hint, + required Map dataMap, + errorField, + singleOption = false, + required context, + AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) + : super( + onSaved: onSaved, + validator: validator ?? + (data) { + if (data == null || data.isEmpty) + return errorField ?? "Please select a value"; + else { + bool isValid = false; + data.forEach((k, v) => {isValid |= v}); + + if (!isValid) return "Please select a value"; + } + return null; + }, + initialValue: dataMap, + autovalidateMode: autoValidateMode, + builder: (FormFieldState state) { + getDisplayOptions() { + if (state.hasError) { + return Text( + hint, + style: TextStyle(color: Colors.red), + textAlign: TextAlign.end, + ); + } else { + var displayValue = ''; + state.value!.forEach((k, v) { + if (v) displayValue += k + ', '; + }); + + if (displayValue != '') { + if (displayValue.length >= 2) { + displayValue = + displayValue.substring(0, displayValue.length - 2); + } + return Text( + displayValue, + style: TextStyle(color: Colors.black), + textAlign: TextAlign.end, + ); + } else { + return Text( + hint, + style: TextStyle(color: Colors.grey), + textAlign: TextAlign.end, + ); + } + } + } + + return Padding( + padding: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 20), + child: Text(title, + style: GoogleFonts.montserrat( + fontSize: 25, color: Colors.black)), + ), + Card( + elevation: 2, + margin: EdgeInsets.only(bottom: 4), + child: InkWell( + onTap: () { + _showMyDialog(context, title, state, singleOption); + }, + child: Padding( + padding: EdgeInsets.only( + left: 8, right: 8, top: 15, bottom: 15), + child: Row( + children: [ + Expanded( + flex: 1, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: getDisplayOptions(), + ), + ), + Padding( + padding: EdgeInsets.only(left: 5), + child: Icon(Icons.arrow_right), + ) + ], + ), + ), + ), + ), + state.hasError + ? Container( + padding: EdgeInsets.all(10), + child: Text( + state.errorText ?? "error", + style: TextStyle(color: Colors.red, fontSize: 10), + ), + ) + : Container() + ], + ), + ); + }); +} + +Future _showMyDialog(context, dialogTitle, state, singleOption) async { + return showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialogWidget( + dialogTitle: dialogTitle, + state: state, + singleOption: singleOption, + ); + }, + ); +} + +class AlertDialogWidget extends StatefulWidget { + final dialogTitle; + final state; + final singleOption; + + const AlertDialogWidget( + {Key? key, + required this.dialogTitle, + required this.state, + required this.singleOption}) + : super(key: key); + + @override + _AlertDialogWidgetState createState() => _AlertDialogWidgetState(); +} + +class _AlertDialogWidgetState extends State { + @override + Widget build(BuildContext context) { + List dialogList = []; + var dataList = widget.state.value; + + dataList!.forEach((k, v) => { + dialogList.add(CheckboxListTile( + title: Text(k), + value: widget.state.value[k], + onChanged: (value) { + Map newPair = widget.state.value; + + if (widget.singleOption) { + widget.state.value!.forEach((k, v) { + newPair.update( + k, + (existingValue) => false, + ifAbsent: () => false, + ); + }); + } + + newPair[k] = value; + setState(() { + dataList = newPair; + }); + widget.state.didChange(newPair); + }, + )) + }); + + return AlertDialog( + title: Text(widget.dialogTitle), + content: SingleChildScrollView( + child: Column( + children: dialogList, + ), + ), + actions: [ + TextButton( + child: const Text('Ok'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 2de6f9a..1b6ddbe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -27,6 +27,6 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { //TODO: Replace with LoadValidPageWidget - return Login(); + return Home(); } } From 5d1eb76b05671f4c25d495af5aa532fb657c63c1 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 19 Nov 2021 19:08:35 +0530 Subject: [PATCH 044/264] Cloned repo --- pubspec.lock | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 16a9195..ec2f559 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -83,27 +83,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_keyboard_visibility: - dependency: "direct main" - description: - name: flutter_keyboard_visibility - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - flutter_keyboard_visibility_platform_interface: - dependency: transitive - description: - name: flutter_keyboard_visibility_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - flutter_keyboard_visibility_web: - dependency: transitive - description: - name: flutter_keyboard_visibility_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" flutter_secure_storage: dependency: "direct main" description: From a0391851e9791bd0a2a9fa209871af501187b257 Mon Sep 17 00:00:00 2001 From: Soorya Senthil Rajan <62637965+SooryaSRajan@users.noreply.github.com> Date: Fri, 19 Nov 2021 19:50:57 +0530 Subject: [PATCH 045/264] Added date picker widget with form validation --- lib/Screens/FamilyMemberAdd.dart | 11 +++- lib/Widgets/DatePickerWidget.dart | 92 +++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 lib/Widgets/DatePickerWidget.dart diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 4b7a8b9..3f90fd7 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -3,6 +3,7 @@ import 'package:gender_picker/gender_picker.dart'; import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePicker.dart'; +import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; @@ -56,7 +57,15 @@ class _FamilyMemberAddState extends State { }, autovalidateMode: AutovalidateMode.always, ), - DatePicker("Date of Birth"), + DatePickerWidget( + context: context, + title: "Date of Birth", + hint: "Choose a date", + autoValidateMode: AutovalidateMode.always, + onSaved: (data){ + print(data); + }, + ), GenderPickerWithImage( verticalAlignedText: false, selectedGender: Gender.Male, diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart new file mode 100644 index 0000000..dc1da69 --- /dev/null +++ b/lib/Widgets/DatePickerWidget.dart @@ -0,0 +1,92 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class DatePickerWidget extends FormField { + DatePickerWidget( + {FormFieldSetter? onSaved, + FormFieldValidator? validator, + DateTime? defaultDate, + required context, + hint = 'Please choose a date', + title, + AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + : super( + onSaved: onSaved, + validator: validator ?? + (data) { + if (data == null) return "Please choose date"; + return null; + }, + initialValue: defaultDate ?? null, + autovalidateMode: autoValidateMode, + builder: (FormFieldState state) { + Future pickDate(BuildContext context) async { + final initialDate = state.value ?? DateTime.now(); + final newDate = await showDatePicker( + context: context, + initialDate: initialDate, + firstDate: DateTime(1900), + lastDate: DateTime.now(), + initialDatePickerMode: DatePickerMode.year, + ); + + if (newDate != null) state.didChange(newDate); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 8), + child: Text(title ?? 'Choose date', + style: GoogleFonts.montserrat( + fontSize: 20, color: Colors.black)), + ), + Card( + elevation: 6, + margin: EdgeInsets.only(bottom: 4), + child: InkWell( + onTap: () { + pickDate(context); + }, + child: Padding( + padding: EdgeInsets.only( + left: 8, right: 8, top: 15, bottom: 15), + child: Row( + children: [ + Padding( + padding: EdgeInsets.only(right: 20, left: 10), + child: Icon(Icons.calendar_today), + ), + Expanded( + flex: 1, + child: Text( + state.value == null + ? hint + : '${state.value!.day} / ${state.value!.month} / ${state.value!.year}', + style: GoogleFonts.montserrat( + fontSize: 17, + color: state.hasError + ? Colors.red + : Colors.grey)), + ) + ], + ), + ), + ), + ), + state.hasError + ? Container( + padding: EdgeInsets.all(7), + child: Text( + state.errorText ?? "error", + style: TextStyle(color: Colors.red, fontSize: 10), + ), + ) + : Container() + ], + ); + }); +} From 8aeaec1096d13325fe0d1ef985856772bf00f225 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 19 Nov 2021 21:48:24 +0530 Subject: [PATCH 046/264] Modified main to accept themeData --- lib/Utils/DarkTheme.dart | 25 ++++++++++++++++++++ lib/Utils/{AppTheme.dart => LightTheme.dart} | 0 lib/main.dart | 25 +++++++------------- pubspec.lock | 21 ++++++++++++++++ pubspec.yaml | 1 + 5 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 lib/Utils/DarkTheme.dart rename lib/Utils/{AppTheme.dart => LightTheme.dart} (100%) diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart new file mode 100644 index 0000000..1aac38d --- /dev/null +++ b/lib/Utils/DarkTheme.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class darkTheme{ + static ThemeData get DarkTheme{ + return ThemeData( + primaryColor: Colors.white, + scaffoldBackgroundColor: Color(0xff1B0000), + textTheme: TextTheme( + headline1: GoogleFonts.poppins(color: Colors.white, fontSize: 40,fontWeight: FontWeight.w200), + bodyText1: GoogleFonts.poppins(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w100), + bodyText2: GoogleFonts.poppins(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w300), + button: GoogleFonts.poppins(color: Color(0xff43282C))), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + primary: Color(0xffE9C9CC), + elevation: 10.0, + onPrimary: Color(0xff43282C), + side: BorderSide(color: Color(0xff43282C),width: 2,style: BorderStyle.solid), + padding: EdgeInsets.all(10), + ) + ) + ); + } +} \ No newline at end of file diff --git a/lib/Utils/AppTheme.dart b/lib/Utils/LightTheme.dart similarity index 100% rename from lib/Utils/AppTheme.dart rename to lib/Utils/LightTheme.dart diff --git a/lib/main.dart b/lib/main.dart index 1b6ddbe..5813b0c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/Background.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Home.dart'; import 'package:flutter/services.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; final storage = FlutterSecureStorage(); @@ -11,22 +13,11 @@ void main() { SystemChrome.setPreferredOrientations( [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); - runApp( - const MaterialApp( - debugShowCheckedModeBanner: false, - home: SafeArea( - child: MyApp(), - ), - ), - ); -} + runApp(MaterialApp( + home: Login(), + debugShowCheckedModeBanner: false, + theme: darkTheme.DarkTheme + )); + } -class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); - @override - Widget build(BuildContext context) { - //TODO: Replace with LoadValidPageWidget - return Home(); - } -} diff --git a/pubspec.lock b/pubspec.lock index ec2f559..16a9195 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -83,6 +83,27 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_keyboard_visibility: + dependency: "direct main" + description: + name: flutter_keyboard_visibility + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_web: + dependency: transitive + description: + name: flutter_keyboard_visibility_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" flutter_secure_storage: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 496625a..7f2b969 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,7 @@ dependencies: google_fonts: table_calendar: gender_picker: ^1.1.0 + flutter_keyboard_visibility: ^5.1.0 dev_dependencies: flutter_test: From 550e0a2aa43a2ced68f93eafbc2e8acdbd0143fe Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 20 Nov 2021 09:31:16 +0530 Subject: [PATCH 047/264] Added colors.dart and did some theming. Completed login, added background image --- assets/Illustration.png | Bin 0 -> 578868 bytes lib/Screens/FamilyDetails.dart | 5 ++-- lib/Screens/FamilyMemberAdd.dart | 3 +- lib/Screens/Home.dart | 21 ++++++------- lib/Screens/Login.dart | 28 +++++++++++------- lib/Utils/Colors.dart | 7 +++++ lib/Utils/DarkTheme.dart | 2 +- lib/Widgets/DataCard.dart | 7 +++-- lib/Widgets/FormCard.dart | 44 ++++++++++++++++++++-------- lib/Widgets/FormPageView.dart | 35 ++++++++++++---------- lib/Widgets/PageViewContentBox.dart | 9 +++--- lib/main.dart | 1 - 12 files changed, 101 insertions(+), 61 deletions(-) create mode 100644 assets/Illustration.png create mode 100644 lib/Utils/Colors.dart diff --git a/assets/Illustration.png b/assets/Illustration.png new file mode 100644 index 0000000000000000000000000000000000000000..da28abffacf01443768bcdb5bc3fcc2ec435cc69 GIT binary patch literal 578868 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 z zO$cWO88eR)_)QyO2CsqHJTU`vT2;MPYYs)=Q6c~Zv_--_owM}yao zx=0(vf6U4Zy{=B?Ve`>YlPI-TQ>bce}`mCNn(Jv)TyH)7wMiz7V{rJ0k}qNT=~oqd)0a+|dT^F&RFj z{m|eP>bek0a}KIme3G}3!dQVISdddPe^ zd2IfF)n#B$g~Q14xLAys>UPc(u2-5r3De{yYbgy#J~%P75{#h4yGZT5==2UPmSMq} ztLvnbwnoBS!AqRL%#foD_~wfo&tpW0k`UWm6Be-dWO%>!`2x+=xSy)9j13zCvbT3H zBD`xv`KFECofW_{s=0auPa%}o_p~E@XWtD98W+1gli95_EJ38xCYv$I2Gp=T5T(!$ z(h}JT?+&sF^kv+Ko{*j63qEDm7qm(WAeh$U=fL9!2>LlqpZ3S9o6VD&~^>AFqhhsb& zyY&0kKx~r2B3`V5dLJ%ZP1oEijozy^L^mWy_dH)c*~|;F>}jdVNX6={Pf4&&80 zGyCjEPy^is+#*Gsj;3gNDBSapCQ?&%_Y6LNo2Knu=wKSz3-FQ;=b6L<`QfgtIr980 zsWCw=-IoYRvudb#Gl`L5 z>Xng(LU&N#i)jIHa>^8g-fV%op#e{dABUcL4C1u9s(?M-w@9Kd4)aaCKA4NgpL>%t z@FUnTw~r$}7$#S|N7f~Py;_AXi%hjw1k1EeG%);UzZApY!IZk8w42`RnU3W)5^7#aY|o;nYK zd-lYZm&+ukF4Bw51wbT0q?rBC7D~IaC^dO46X7b9YRwkMKuY{|?prK|S-uuct3MRqZ=Azsf>WK2!@?Mc=)5l7V-Z zm&h^=T#ivD+4^8bMUl}-H==uZ>2Zo#{SXr*H1^pGFmvLc1w{7zy(7#by81A6Bmuo? zf-T__p(qe4{1&XlImLHv;YiYdc{iD90|t7|2F!NtCsL6vaFHYA5n4PHTUY`V11(!{ zPww-}PwW+1TPonz9T|a%87fe~UVm8{3gaN`_V^xxpxcISpr>RA>j~}Ch-wDo1#Ym{ z;h5pFy>`x5JD8OBsSGMbxPx(KOJu;GTLKz^ zx(AN9$6esl2z$3Qbx!l3x%ajIdi=c8lAS{Dbf@**LQn@r zV3#-HV+h7DCW%WLd28s*Ob-W~ZIGV)<_(XTaW1a)l5YbUDRC)z&5`e%YdM=f!|90NQz&5=n4&1C_s+<4t@$(Hdp8%O12=P%7rD?1V_a1*z6CHh zEmMo0-W-Uo34xrGeYuI7Wcv zZV!)4iOtslx;S(Ib&oe343u>&^)AsAKc#;u^CEI^E2_&O6x_==mOAG97Db1!3-old z+C5MzB<3O0IX9R8RP2;OSagTmMErIf!UQUe^fDw5+swz$PUW8wp_$oR&7nZpXQw|@ zvtNNjNN>RI{cFO*Kl9~=MwHt=_q8TPJexOrwIwF8cH$H7G_~WuuBD0d5?mxWYc*ga z45nLeBhjVO_xdPSeAS}3X-4b@tcZ=QK{w?%|AgY9S@xI_Sa)9&VD<&dRroxrh$TSS z!m=L61cHJg_KPpGK9;A4o7|9I1>Sn&zo8SWYC=6WYWnI=79A$NCzJ<0*gMU_y?Pnx z^OH3GPm+xP|0GFtd(G!-2wvZ_^d*)vvpsr2r|lF@3el4pVS89^yX{mcs^K4T*s|p` zP22&q?qAkX2bbyyGYaHRX^X9{JM1)UpSC%;V1)aB3Py40qHf@;=BDdWVz!=iqut7F){4H45KtvF^26i0q_17p&t@Kp z1g?R)qHyDyemz|=O4+sbA)skP?tDIJT&;ZtmTrFZ89cixC~3lb8x_}<7`Vt()vlK@~N0NBU`We?jio&_xS!4#9AeF zsm4gxj$wDATR=rmciMg_CuGT2vT5KerhB%R1!W4KbVAYR8i&QPXMBx4QTr?u2EbF$ zBF~-tXM1B$*jyz2Q6Wket2$z{&0v$_A2bx^JB(irrWdljaD+3Fv=~)Xa%1%9Zp?e6 zEzG05HtQEtEV{4C9tI3Re|RY*EC^6U^tqtp+b?UIu2vizy#fbhz$Us)(peHVj}^h* zl4E!HgT%r1CQf+vv$)tRWnT!0jM&l%9gP(B6Wd9{xO)?i@SR4f69yhu^cG{^!elP(hFHd=Zou*<7zfLbpq@PcuT2SP>n)AFqseM z*dd(05Xdiuqk?gkIox^fp2TI3Y9XRU8_xYbH$L^BW%k)@4SH6caN**@Y%Veo3A^eURx0GNF63!+9ly-j{{#Y^k}&D4|Z6fMN2( zKf$pOX!N7ABlH8J?E5-Pw&lRdU2@uL|+TbG)h zm`@;Vb7Cp$?zMFJB+*TwBi||JQ>K#qKYb?|LCAdhc+#_xqlf?A3<8&s)Zp#nh~4zA zw<%t>m6qEc>7?F4wbw~F3Q?WX^=27r$TOY~63_&3Yb##Yy`xUt*=wgS?=%T-cG_htaB<=+ciXdc}r4 z=lj#mh1c!L`VrkJCRl)DJ+ugM=Bn7hf>6XS`}lz=U)^ER=YzbqU!J&@rhAXy-z65+ z!+UnaR5zmo&BDN%2U)J@gNbwiq(=sw1fHbHun$6eoCyxWdCb!agv)7y6AiSyBv%~= znP0PBSFI0_JU62M07+fwb&_m5#Vw~R6bv2`!*QNv8I$q(@nws`GPhYB>;u~C?s$;B zO+(%Of|=P&S$(;Tfb%g9TMP)y)Bnq5g)a-4(qc2R- z`ZwK?f@j8@Y5$v|0o#xgz9mA$=Vld&t<^)jed!|*`J>g8N-%M&if9N2`y71jxvUly z%Z+mh-GYz1I)zP?dpn`Zhih#S^J?L-*(awdG^TUeh&22=-)qE&@F1ZK5F*}M8fsYw zooOhsFK;X`j}?uFYtbepYTADqDu$|#e+?$^$FzY?3co2frg&t%VM)=+MJt}W+DExOI=-eo8ia*}B zezT#%uHg{PX-w$Ax{mM;lB5k z9pSo=T8gU)Rk;=PF-d!376j+dv+6(2$%e;g~35YW(g zjGsG|YEel+{Xt&JV5!gDBX#Vq-}GO5_;Kf{a$1+vuQusKHiUKxD_9TzOpJrK|08=! zlq8TI3!E?iyW#_vf`^In}9Vvtn$@y63uB{TNOmV@#4$WEnn zEEJSQd4&eWLgr%#=~Ny+G6Ae5Hp};ZmzYH{p5!um%=WSMW+DZ}B`arHTvJ)vuIp;btYbqSTF1gL3**KClpRz4qf&UeC~8`R?fNykM9 z*yj51z8ym%Aox^wI*AyN+sM`q4ZWA66DCsFxlKsG{tO%B<(&zuf3tZfgNmj0yv7LN z-_V*i)DO^oqm-FB>q&gIzyT`T{|Jh)u&gqrUq$?MN{nxRvis-(p?MyoWgUL}Sw!w+KD``;JM)=i<}47dm` zIu#v=bJ1Fd4~!zKXfNrySc^nq0!WJ2X^g<>aHrrW%ExHF&ok}#nSAOQ!vC6y_rEa} zLaK)ua0H$i<{hwy!N?XGvk`}TCPdH>Md zRrS(;GD%`*!LFv3_W@gmUN>yr!|twtE3bkXpWf24aJzcta-M*8FO;6<;`Nuo1l;~VM!bh_VG_M8$n%~;8~2jL)^Wj0?CO!v%am_- z>s+dC3;kgS?_aI1Ji=+%an8!w;koFlTop!B0kEp+4|QeMn4{X(H|*!N8%jb^<=Z9* zrSv|26>HG;iDZG9F3|LnsS{%?=%QwUS;WMJ`N`B@xui2~U!xmu?a5Y^jwz%AV0VE0 zplB);K#amgr}4UVp8)DM-7ydshWcwdA+T(~iNe3JO^Pdc&h70jZf)}IB7Mk0z*EKy zRX)|(cxHS*I;OdIb$}mpTcjZo4Wv?zkUlFaawmFyQy(39;<-2JA5&c^`!OH!>ReP~ zDf~1ohHlup^t6bV&l_-Eg?@cSDmenj1i@I>3|5E8nEo=jj963=6f=d!2Y3!N@ZGHb zHEh~?mZABkPFEBhY@_+0w9#v3}PF) zkwl`3lf;;DMAAzs`U*Bn;1j2QOpKcS_XlKw? zC!y9#jDzE5MQxP0spK*col6~6+QeC~ES!79sALJ;$)>j85P@aSh|k(KHrPe*>&1Ao z-KNTP6?Wo3c7b8*y6jbum)Qb7jhpVY|jc6o;=4g&A%v%72vP)D3C54Z(80 z%xi4l9qleiXgqrsiMrXKTjWVho9qL)#x?UV@aytl=bqul`j~ur9lJlbS;$WqVM2JK z4bIGBVuk~B6oX3t+F=pHaI=SQdOk4dFgZzF>TuOor{JYQ6p7*7j+@%gDSFt@{D0Ucyb znbdeB6_x@z#F}UNl5om>d;mJHXJL++ptHBBSJ}pgnT&_{mSjL zR}H;lP*j*Qv(EP^iYbr%nSFrhGM{FLv*({&NDObP`SOcsyfoW)eqZ&+dsyo@v5^C@ z1UMbSi{BzAxJ*)))7ex7?Yv=Ex%0XwUSqJnUs6BU@$9z108k8(Ximl*wwkN^LfS6| zd!vP+E3wd|xNA`tFazo3x5E*6%#HlSE3$TzV>EHKS-^vZRf|lOZ#tDx7PUglziVp9 zK@f~5syEXT3(M9o%VmMthEX0HA%hM$x6FU*!Atm`chm)k|2@U|r;CB+-}CF>dB>I3 zPUr1ZqdJ0;`!H4FqaS^^A)-hInCEPu1rW?L$UTXTsM^rsay$HN;imODR2v7`m%7R1%zFie!L?TL5q(KoQ%d<9m*i9_-%%ZR0RN#g6ROIguk?ZP{V@u!b;(t})-&B(AQIfkw(umi$(E6{d#{v?sSHYQgBh&FYq}+xmi#;VvF$L$fy7hzP zXG(-;un>-OL#cRNPt%v}{Lbiw8x8K~x7F|u3Cq{G#{$YN$U*>NCS5F`n!Ju??gYX4 zia!hf>G7E@r0+VMqn4g%#{tA@oU-8K4H4>~v&dl*HP>5trLl3{9;QngRTvA96ybrE z=cm#)kG|@cF{k)v-2a^g5ZQ0x9DV$G^Ih~Au*2(hRW6!&>ZG&BBb|6_xXh11;51Im zz+(12Y#%)OCp3*ML3%i2on?n3RZI=(M*Ro|>K$;D;C)@Ko(~9lT*1HB^AlsCQDD>a zzu+;NVx!j@_it}eWWRN7*Nd3+)|>+`^GmAXEixPnbq$73HqPE5b2n{v{lJ0zGW)}~ zv$8K)Qmyt9ovIn3iPfO)HAhuRaJ7Q}`ZZQ;@y`~C;S9yLkJGt>4)2DO`rLY8$!T93 zji0=kw|}e)l^qI}(C$egssvwbVQS0} z7JaTL3s{GasX*f2cjXLaSy%84zw)yTi%q$P)+JLoM~VY^7VfD5R_vOwG0BS*tvuer zUht<$6DSCQM!cEL<)vv%zVrB^$7@INeEsb5H#7fiQ`X%q|=2d0v(^euR~=;09w7X_-%)H>!pqvN+1)+!5`4@#|=j zO6}Txspwlo<&puYtCljE)!&FHx7Y1h;hk^7h~w|PC=mR8H}deI2b-@_Lc~=-9!Cwn99!OLh;WCW5@FYP6J`2`e8gp&s zjD^$3cGJ(DQk%N5GUKQ|pMVL?1|9cRMOm?b83f0;C3>%a7n$KbP#7a`XEt`-7Z%<3 z<InF~Sr|-xEK${AT{PDz;82L*c>=g|_kKOjq<0 z&gkW1=vHjxM@vVqJn)lLq?nTBjOdM-3z~U9vXF7c3m_Wt!yqqt>pQgi*n+9z6OAI{E<0lxZ4ch16 zXs5n|CtTa!T6bm6yKZH8@UDm{0fmcrsT`lb$FCy)JOVClune|dh2#ydk3h{ow*@#tC!rak=Z!maB;o)q=Xa<(a+4 zw9Wi+rpPJb{+`C`px*|0Bc973O)@AU7swxNek9H>=4R`z6c2`)xQe5_oSMPi;RO*T z;X}$%)vutN1hfw0gzI^mzuu+=5C4;1@e6!$k%`)$;hg`7*)A`@^SL(Zz0C-At8R9l z-@vNdQBY561yUXa`UJ@R?34j}AG~`Oo}$>->ecWYul%r*6$$b2I2(9(jJI1HpyT@r zcef8@KV$F$x+YX66e!AoA`}Ly6Hs5>b-*)Bbd@iYQkqeCozj2wdQd|RC9o4-yxAUdW~e{s;h>myD1HvX z>ro*9KQ+fB8mf7y2ET_M?4^7vQ-vKY)VUW?frZEldwLjCg;3h{!O$V(jc1vr*IG~& zn|^4h_Ozz|_3H|m*C~l3euixs7(YZH`|pN>y6e)kpH@niF&BT%e45^pvQ!@;PFBFa za>owKR7g;9xbV{mt3&y4w$SoIB7sPUq3|PDQ`Y>3i*sx}`%2 zhP=BA`c*RS28RSk?N>)G_vzaG<$7C^-|T+}e8BWOgg-`h5N==T5&pl^pbIx77*r%x zy&S_>>*!c$@C>l>gf^;$L1~LeUt*i}hCX13hAf_4f!{tF6wP9EhizMx#^SN@c)K@} z(1+A>C801d0mGRqMt7Clc0?&pxd0Jy=LThTZt>I7hqk~TqLTR!UX?K*Q39OqFBEKP zo>!Mwj4!K(ex@B-!)js@)sDDIdH9*|%Y^O6BdSW?S?;fEUBY7>tH9Lej;GgbgQqHl zgjovq$MP(}dKPoY1*!s1*(m_vt=5&+@Vnk^qNuBTby-{CqPc97nT|fxa>_4QWayv0 zh6;us$y2B&OhZf|N6{6?DJYm96yRgfA%oB{u}1pXQ-9L2LqkD8y&oEYSX;(t-(<0i zGqcuoT>>U~9tgfY>8m@-Hx(QwwbN_>m$FwEZj(GW%Ryy6Z*RhM!8TlC zqbQays7jrElKhOeS8fs@)`~rNYqS1J)@<|;{+`(LRn<>DUaXump-8w7{N#6NZspDQ zJ!A@8SjH0)#S{L(EJ7KRl{Qz}spmjYbWL!}M>TRrbR0fYZ2YVAX$sD+mV6ce60yHO z{y_WylLr}{3;9Y!=DwKu=CZILU*Css@Xm}v9{~N%o#2#T!e_sPOj5GE{hjUVAtpIJ z)$0|b%}2`vV`w0UG3?B&e3u}Ne|FYR)%uGOn{%x?LeGmKgu6d0eauCu0mUWOw_OI5$6!k_^#$f8~L z=aZ0kNtBSNzAWG~5kPTSO{Za(0Che_0%f3^h zuZ|4J7Y;OkA6A(QTY=^@hds(b_j+Ms@OEWD=-#{=0RG=SM#X;JS5$OOuIt`1`O8+3 z7YhuF`H`xORnq6VlK}M+E=K{bxQzWPE+^ieJ6ImyD;LvD%weGuKI&pNsG(wrjWdgk zpAAsok18$jgZn!2%upks<9O%%biPki?)}1=3>UAWVj#u~2cIk|1&s6ytrI-T`}42= zb=-fx!lbY#>g_seYtv!x7ulE3Ntb4{S*xYH*zV+XK{(_BWMWxj@hMW92sWyG zA?~wKdL3>3C8L>md6GVMX>&!;?wW1Idg9&^qF(BS@1Ts(Xk*aE;Edn_)?}Vv)m(>> zVk}IaDjKTy6;`Q+DVA@WdZ(tZCLO?>zOsD3_F+WP*W`DPQTh?PJv|3ggV^dW~+ zBq#GxJ4#kIhp8c0R`n>VSRKW`Lu-7bm2XN+glj@`Uc#V>y6-;8#j_5A7Y0@=uy=ic!Ikre2jIy) zv~2wAqKD=}g1k?cx&su^^p_bC`9fOzs0z_qLG+PHsHXyIP7OPu%9@puDNOAV2zv3- zNCH;S)|d!u$bQ=PHZTgI8AgxYQB7!1`emr!D{ZWgX_hIndnismjSg14g=?x()6EonmZDJs@}sMB(=dUKjS~_hkrIL`S`RJ5oxZ!yWbOxDI4KX| zB-vf}duw)GFOlO%zx6o|ow#!5qn&WtgvG9%wHT4!-$Yorc6`G0zxo8${$`hSF!?HYj z5Mv3Go@`$jXyMopH2TX-4C36n&%0Vo&;#!A{(yQDwH!cGz8Q3 zlC@<=)?pbZY5>3fN>zXuIWU9l1_Y5D&0=MhWZe}h=2!6kkAI+Y!%)VE&PQpjZ~ey_ ze=t@UndHLAsE8)jL<)oOz%LSq@@za7L zIB#xjNo?x8z{7MtOZo3xEFDh6$?lq702=rPU>qHLQdKVnIhnMoIG}4|YF%_FBC%r` zXFjVd*MtLaoG^MGBbC0TZ?yJWK7B;9^7*)J>+uN*EOhaf2~$EGO|UHA%Tk$EpFxkT7oXSeu|PuC^=zi3W}*8*^vC@_IWSMmMas_naoTcWrRT}Gv`YTph&zc$djKFF@#3B_O(9gR6F&#?sdkAg ztS^2z`BV0BzlZ`k#;NDimh7w8l#+U@_|AUqpSpU1?KoKY_v-iL7Wb@+j*@wpM0pbb z4ORc~2zzww%j~EACA<4g5F3djOoauTkd2_wH=Nxsm*cK5SqF9QsaKPe77##K@OJ)Z zgbQSLpDUk%O5wE~#47^2l%=X53Z=USPNQ}Y6hNrwV`y6&lYDxsCH|@YS8}odGlV@W z&3;sOUY$W{#inQDQ@q{l#H5bh%M{DmGM2VG zLZr)2#tBw(-L}cZ9J^G4URJj(xJZrixL}yV^pN*Qg?}2lhfq4hsJSBRj;O zcd~q6|G=<6SN=coD5bEcs=MvJzWt)@ps|$AFd*I23=PxIvIZOB(v=lW5&q=IldxKx z1aCT|G096G6eG@d>jB(`cr#G9Ni^BaEF1c(8yJc}*f8^1+#mZ%a|+ z(pm4D|1CidJm7a;eRKNSD@xYVm~E8lf}G*^a;>fvCw}%$%rmyF&@<4t5E0t`T2V*X zn(vq*4BM;H;i3AT2{aaTwb1;l!Wm1w>ri3b%2IIJxw*qjjb~+8S%s5cI>-&1-TC+i zIDc?2?VrQHXD9F?mi~Vb(KG$_#l4ov-dpRrM!U&U7-6fMRlTeBy(3vvoN3gio+gz# z<#ZfHZBT9`cH0az^UG19(+Jiw);+4o;o_y?j=vXr(B@-CSvJLqLa&+d)hZqp-s9+a z)|})kxzmVd=GCoAwSUKifU;O_KbpUz1o;Kd&ujV)$tAZ_+eVknyE4tJqO3b6ox6jH z)V62gYVXTq>$d~O(vh12=DmSxH?B282;k|w)2DE@2_*VL)lIQtMQTNt;W?sKvbQ$T zc6Y<-R4`2~C^8P|-W*uB6s&Ic4(QF4GhI4`s)~T`f?77y!+P+($>&A1`r(&S$77ER zd6&Q+V7`uX`1-WQCgnMPLSzXgrFrfE32-;SPu#6RA1fjn`Srv(iz`9At9vCiuUA{RK%K}+hvj96n*Lh>Bgl_XkIa%GucYK8Q z?*9os-(aLW6J%)q=1knaZgpVnaJ~< zUue~Bu)r_!u0lJsodEvyY-BYC+hW*tii(7HMj;C$kfefr=ks;f9b${A(kmzMJ&iY3 z7NK5bBWM=@A??Lev>0AFzYZ3J-w-D-`T6C-F1+cPs*~N@+Q%?>TMcXoo!uX{o?_v; z^levf0&p~P4;3iiXAt#dtN3>)P{my8BzYo!IkRLU&msXLBUHTXJxPUXUs_HkNl#Ev zt69_r9OQsF#&Zu{2I@j`JCRS!mO3)rC4KJdkU3F^P`)u=?;@~yy^hBxKc8!Y3eBE9 z)eKn?rv>CKY1=`F^^AUUsfb{tNLcOafxe1@Az;iN|{g_Z~u;&8wiR zXL0QxnGt|e#Q1C*MD}d4tgq-N(2>aLtf7K{P`?gmh_U!RQ`qH1p6A*r_suCDgF8=y z^(BOp>gV}VSKX_H3tm0Dyrb_qg25VTlprog0+NxZS#h0JESPe_W$egWhgy~~c{;u8 z{^%9`bI0_2jI^i0{;UK1_PtE3H#bt5S8I3T!8+P^4?BL^5Wr9Q>9osT70wq}K1Tt= zCGTFA!g|6-fGiAZKg#iI(7wDP{^c-EB#xvFLoU z&PSzV#ru1}sAe$x_S~Wgp(G&Tf1kOb2+s0zX|q>Li%q}I&^2)(MGRZ4Mib>3^}C0H z3^H;ha&c67bS3hOIB5R%gv6vttMAhUV)|a+B^>;s`5_|tBXGsqwW`s7B=CDJ#@cK4 zp*~)d>XKhT(e5|D>vO9P5dsA2De7OH4nPz+eb%A~qKL^>P_1wSYTKpX4}yFw4L;wz zzHVHsKJTS(Sv#Tbc~~a4YF(RVm3TOjlQoSy%Jo`(S>TG{`f|BSUM+NQZBB#x-nr## zipYCcK_XHr2w<-yDGd^nUW>kFIJ3q~RmksvP6&6D6D}8>z?;%&-;32HpG&m6LKE&VBm>z*JRWe%0P9#GP7S@By{|uMtb;;SX4R%q) zMEE9t5wddQFx86dGnA7jW)caHE)M0OoQ)d!6fz1fUJ_+C-w|h|=7rHz=vAKJy zR2Y5fZJ_K2u=-kC_Wl$-DU>{S0`yWCg_OYDf%I>=e0D1= z1)=kwO4auZXfGfcL91uQY=Z8$?6=z@jdn-5BFj(8hNX-29>RPkq0d)?b7pUoqL}tB zg^t37NcF7nd+F*Sep)A&>xOU^T6FCKOfs*lQzb*!PtCtNJLG2Sv*>cox9AI)Hl5pn zZ2n#&y2!7x&%9cTL3{L^d@;tM>SwB~UayYx?qKEm5kXA6pMUrQL6~PnUxCdPpSRAi zttPoS!7fX&HRws#9CsD-nVI^W(Q>qU>5S)(rLjw&UlnKPWX~U(AKi5voLINswe2lC zE!eQT-WclOmg_si)-;e5DQKf%leig36dLhsGFqDS-xZDsrwnqpusI|%mRB8*jlUpN zGxvGRb1SdnprxpvOnp}JS?dqofcOdZhrh^!d@Akn@p;^sY8*_K`fscR&g2f@+D&A= z?POeYqq`%%TCP)a82V;;ED&37{M^ZB7%j&OK6Y%2ENpnOem7LK=DT)Scw?AW!XX#R z>lMx^HWltsIBNZ|#k&U|0>d2k>>Cih)v9bCA=1_s|~te`yA(`@Pg+zJB3yaS^x)Y zOD~sXXY*=tbfoUuhC)`9Qylb?<7whOwtoE4UJB4YPzx9+2 zK`#n{5bTQ;daFOP+vuO-VG>< zWB;tMf#Mcn>p@)kRo`anHIt3lc9=Da?r#_*{sD;uvH^(Qadh$gKXGw}al8AfSg8#} zwDq_N?BgY{T`@6a!2TlT*P3c{Srm#fJpt!$9xO)|%(A5CTJP`miQO6tym2!|ZLI#; zl?=|5kTe2kgvo_n0F8zggxWPRP&ahYxh>54x(D(7qXoB7hu{7sdVMkm3Dmv^rgNo~ z#nC{M>ZIq4>~S%Obl`xkeM0DYdg-;Y!=(S3*3vni9>785XFEbc?&9|Dg>o?eOc!M) zQCgg*nnfY4kG9m$-T!Kq<%?i5+GL7pVrD1oli`4sQ%k}CgH@*l%_;aqOH4~NdUAF`OW3fsH( zE31>Uc)nvKpE`FFrQJL)JnJpZu+;zlMQsroX0!mQnA7OGYg$sW(}r%mN%un7t!2<%g^>Jc6GTq(JnvEU|pR=YcY9{w{TztkAOO-PYOHsvlADD zh`(0~N`Wrr-M33s`UU)T;M`wIrCQJ{+K^cLFKAvC1y}D|qM5tp|G+woYVgyw4BTJC z=P=j|u)#rIiz()1u6?uSD1_+M1Li5%Qx6;AeSt(iB#>Y5rYvV%#ZPFkT(kib*)*eK z%ks`2TqL8pkcUFXpd~><3=!=R@$2FsmdUw{YSJJ*?v8IuF1dC)dPDeoP2rz%@p$&Z zu=zv@TqrJGoDED?-)~1;JT5kO*EoSpt=-e|6w4t^3To%zE3yy({XHS?1d!14lx}n2 zehPK?xk9?T4AEIZ$vJvIN1TTihqy!cTUXRWl{HT6XwZ@XqcU?FE=P06kkecwH}vWG ztRfY{S(ruebDTJk0=TKGg|()a&AzBc`>w!%33c~=z0liW3RKoVjz$jioS3YodETXt zxAuwQJ%ZN0X~O_Wn8E!Z-Y?-e%Cc{waI7wbXm(Np$I30z2ChUuL^ts>r&cBjP{!zS z)${VQdn@uPj7ICaFB|d`Dcp^1PL5e*Wn8&C2~EO9h-ZwQY^W!_J1`XHqrR7-v)yh` zsiD2nYn2)#&E_@fr|>IWsk-M^(+8!@!Yr4oBq&VUF1~+!ECiejeep@>`3nA(4x&xzW%t4El@h){D&pY=c0yYnNPm&g9$95QaYuPxOBzWk&cxt*^gC{%heT(T6hc5y(>J; zqcC;ZpGNTu91}>VGI`X%k1@IUFCJdC)COi>6U(h~xm)HdTZT5((rZ+-?hM2mJpPoa ze@?yj4`=#=gi-lno^O2}%$sf(iLkoY+yd+_E-l3&Sb^g1UWyej z8k}OKIK`df?!moC@j`Jg!6gtRIA8YO&)M&J&KTdXjFBH18TY!^T-Us0uIY_d)_ylFuQ91WS_bAZtr25w3hzAQTqlxD}uw6dd6S<`hOS7o`ml~-8c0Y)sqkF z%PH<{EE$|zdM-&iEynB3M#HTBa^+tS$T!xZckwAv?ylQdJ1W^;wcfHRJOi)=!+c`&>&~$4a zS6(?kTue@`72TTwuM^vAx^B-ah-Wknj1-x1L%5V8P|0$Fn{;-}^MpKD?l$bP@&!a8 zSo1R82OGwlXW;QySZ>UuEYV(y3MGD3x}9o7E5BJf5BxnmvI~6zG`O z+PVCk3Nq*Qs}DveC8pRb`Dx>S7%Ntf(rkn?1Tp%~3b&wBMSa^**{W6Qa@RTj!V)|gM0$`lU$)JR6&<4ReEOHrf z^g)Kbcih_NpHu_n>vS>2H*eK$u{?$N&oMta68@y|V*Y!PI7q-qI= zmouY%6_aP4n5t59Kp?IO0MDHA1A$=6_Q>{ouM&F|4WbY*k$CvMa8dqO_R z`J2Xi;)mjckYTZFPc+x2)Pu?IY<2o28f*zYRZo*YnSRyod}~quYcJ>OPb$zT`;J;L z7W~kn{Z~&Q#4c$+d@l;^(Db4O&gU`e39Rvrve%0-(AVINlh{!G(#p{zTa)12phAwd z#}G0cuhjy|Pr6UNGweA*uSH(Cu7O9w@9TD}LV*6bJt2}&74@f$xe1g`xUP6`mNTkv z(=LXqGfF>&_9HTe?e%T9X>?@>kD`Xe;r#`*=(bfph{$nZxyYRtm^KyxP1yckyXfzd zsIY=kved}`Ub$yzUwJyAi0J!m1`pRct?Zgizaguqly6u)>`?$Vkkea@P+Y9SWO7yQ zLq#0KU(gHKeU0d-m+N84@34+|L)nW3__VFwmBdjfJ%!5Vk6}3(fMVxiXzJ` zfrcW@yucs&M-jf+x7{)!HltJfg>5jyX_hkX>0yxPVIQNY(dD5?VV4E|xELaF{p(4; zC`rLMmQ7ybJ$-(Y@@5`peN31e>Dz-E&?M5_MmAlKfEpdZ%bvKDDNNOf)tGc*1faqn zCrL&L%OyW9A37z><%_QgF*J$&K93CJZsdqplLw(^OEbJW5n`gd_Iwuuzc%Tp7JLo!vtNE=$@RbDv0OcX zI=5e*Jk@ROh^}``@9SoGXpo8TS+R+L2)KEEeJ2IX=toq34Ob%Ge1kdn=Dn88USSA} z*jb!_uC%e8juty(Z}lHkOIw{S4U(`PZ_8*@%&T3SBjjzA9=ZpqCvVSAQMQ~f(7<0Z ze`qS*Lq&vc2O9Fe<8fN(?o4gnbiaSTeK1QW@fefqH?y}Kr}P&Ui&KUqx|p2t#6%Fd zm3!}Cb7=C!c+V8Bxwpd~NppsJ2C_2Yo2bAS zv7@%^e6_Jelv&-T1gO*N-c#r)`{pv*Hg(LcPR2@wu4=R(R%UI3R*^x}h`|_dY2C2)V$yh?4~o8f>U1ZOYaB^* z02pdxXr5n^X?~MKk)%OyHDD>i!Q6J8CJ|!Y#`!y~;62KjeZy?Kl0lZ&Hko0FODnUu ze<|3u_V7ygcykXB;$MlfzB=DKhhAg~3M9N#OLxfUN4UQdivb1Lbj+E~& z(`7BJsD4|Hs@>OiM<%SvY{j4xOgf`1m^T#HHC`=t=HM|%U4kDKLV`i~H~q4s z5gc~QBoQa`rQ)AP{$IjZ9~14~Dm6XE%YPr(WHnm1wNzkq6|c`o14FG4_U{y*!hkiJ zTA<`2ou>;h`%2z)B7s~RbH%{z~x0V6ppWTGZrRU!iq0B!CRt? zvbxWa1ZtC8m*An=a)XdVB?hrsvExm3hH|!Qw0t8ba~Lu+3|MA+S_7+>K&ADeC)+Lt z1QX=uk@RP@Yoq{3r|#6;cTO?w{9nJQj!7-sRYjp_EM>coaWpt*0Wr&ekt$>*fTOm_ zE|0S~_pS$A6oB{DUHiXv zy(Fi4kF$|pX08KjDLbIiByp@fzHn1;uUcVghZ7<>r4w;)8gze3e}I0vn5J{z+a&wC z%eY5Ov@}Ahz0#5_KDETU)5$^sx5Qq{4^A!dfw3K$el>f|2b4EYqcKsv=Bb%b+( z%taDk({_s$>Ok4|^od49U=eE)0H})mL}t79LK_*>M}>UUaMk|0ES>PF;>|unronnmcx2Gn{zmi5}d6{VYpR zpv)SBesZ)nv|15}(>^VpmA~Hc`HbyrC5~u*&@ovHT;HMP-luVpGd5u9R}Y_|q+9BW zrMI~COAL$dlj*zheip}8K|7!6_P5r|Aglzd2tO={9}P|st*{NS6+K!Illc=%{wlW# zcEg8<_A$Qohb~z*@0GH@8?;(Xk~FAVX_WapSMvX*5B^p6XmQZ)yYGJnwjCO+Kcaq zK#{cnzT*Aic!%vZ3cigg=mMI+om;2w3xjxefe$ePKyL&X_ z@LYRTi24~|%O2d3BvO%;;1Wr4PIaTB)D(xCm3=;@Ulr6r8v$)Z&XiJ7F-MG@nOa;4 z5vJ9@tmg}=yZa^Z&Gs5qu4F@uQ-><;HI`QT7ZGXfEr7ESy(3|nXxV)=fA z^J9A%}{DfxgO!~>r<%gA$3HHXj5)VjeU zXWCz?**BNuOxdZ?nO%L=5rM00b+C;lDgtyxlhcUilzr^MjVUTCi^kxKojOtu=Z~C@ z4@l$gQ6hJE`Hn(Bgl3!%SZoe_%5}f%nx~je`D}&+ja>MA78oL~w@&=h_`#j9It7>MQqE4-*5L{(KxRpOyw#qDcwiTQf-*YC#y|rVk5&X`$=7!?uV}aQ}qFcf5>Q% z7Cqnw^zC&u>;DFtJqZOt@YM9Gz$<67O9CgLSv$ApVNrq6@)RY4`~P`0t^T}gKuO;B z6o<}xSYkRtL!QSYJzuRB+WW+E#FBUEiOXD$f78a*l^9Tma?^WKFWU9mfs!crG^Dzd zH415)lFBeqcKUS?tW_2X!r^Xew4}#s;uj+mTXtWYkVpXg$dz;MfeG!2E(KR&)!mfaqJwWrdYa8WU1r>8 z;#OY?{0ov1vDfVh$JPI~J$U61vVN)6eereX_e_A*Xt2|#y6&|*r8iDu7CNo2=dDJ9 zjv~zur{LXEF$pXKVD-ogi(s}7#G-Sr*E;`2sV!8mgVY$8J7R&yo5eqUORIwX z_-Ef$I(QRW70ncoL{V9{!8|~ zI8qRh#1daZ$BV4!g7jxyM#?gumXqmAPBNNCRXeHK)`6|Idd?OO7{{ZQ<3`2Ngk+F! z&xL?@jR{M68p(lumynB;;)JTtcR#_{UjOMe(tSU|5;)Pj!E)dIV*uY{nlA6_S1>N+ z)bWe#u^(Sq)T9|CMIbtqVi4iT;OvL6aCXiy4f)l^of1=@xlO<~%Dreya5Yr?;&ha@ zZMVxTZ3+Bv@uSsBX@;bYRYoc@jEVdx#d|L;xaYiw3VZMm_GENHLq9u6B%^Y221M zdrmGkNTEH8l4M_XU;FKG2D$21HOi-i9!9&O&#_SeC+|Mb_Ef)0HEB|k@SC@WjFz}g zPl}`Hw`n;z#1nVT>=(c7eV-1FZz1p;8s#5*m(R(!Y5I*MyzCDEvc052Z{~wVpGtZ| zo2A8?SrJrc3Czj*)*)=D#?>~%d7_Re=Czol`Ymd(DD~(TrT?ns2u-Ra=;_2P7rc3{ zcW(>garV|i0!CCBrbaE{_?61!^k^PgQIP2sRigKQODE_p!DgiqMFfYHYkMqqy)$0e zMd$yuKDA#>kjR3zevvkb2<~u4*Qzj}fsF_=$w{?pTGLzvi}jlbe-xp@ z<=cA@{cwKGZa6ZP5kACMsVm8m$;u%I#GJ0e^(n^(b;TnGH+Y%Jy+p%~X5yaSmA~9zNIcKsJAiOsb;$`q~piL6l(aI^}dss$H|s%LL$l zjvHB&Ec02ly6*OZ#jpO-p3bjdj5ZX_Ai4XIF79CU?AyGurUJ%;P;vuBijs1|@HCl5nLO-<;B+{QRrg+W%dppuv$F+T-< zD2?$J>-265C%(WSTAH)9tDjWi<}>0fK{~@iN63P6BL~0FUFP7HEoOjzqb5X4WP5;>5Kz>f5>m9Zz}Ww9Mnt;%3 zuw3&xeAi+);&btwu`tbK50L}Gqx_0iqdVOx6urX#WE$Zerp z!l9@TW6e0>$35=l#ABV)PO8JPs(JaW)oE3FuJ$!h9+s`!?f@UquJK2;HPT)P@O3rA zH66I6dn@xMIRY&>Z}Lb+?9k(~$NG6Y5vvGmJI$VHWT-4lPDw27D5|k!H~^i>5{S5y z6>JbfJOSD{oYCvra>id$@OY+o>Wm6*(9bZ`f$=29S3pE}86P(xvqN>>aAE1C?YG;yFBX$15D;U6zV(;fnR zli%zeb(Xf2Cyr_2ithenOJXT1ouGWQ0fK(;wy*6-@MX&n2;3ocmb|CtvU^Sv1wagW zQ}yRo*OuZ^#V!uBljhfTw&N7u-aoMG20^6=*{a|CeULx@|4~dZjDlC6?k5NuyWM7% zQ-$*^v0HvHa<~;P(I;Qas)7hQYjpd##Xk|Z8Ds6CsNzwW1~5hQyYu+=*-oQ)&S1w2 zp1urL$pkpsS!kfNg@{jtbU(5mx!cO1!pxhSNO+zbOYz*`R*#|ieXUYKgUGhYBSA5U zhjHlFWwQJOo8tNU$fxf)J>MJ!>7g$be{x7xvC@5eTqEH|d`SlH%$65*Y8p?dv>K$p z!h2bxze~!WX+Q!ENrx~)KdFZeP1gr=xn0QCtCNT0`A%|p8PVp zxvn#Td_aGAxSrE$?WR|KL^H6vginYv&WX(%nBVbf*|DwpMmsrlk-63B=fn8xvCLgzWDy&(Me~RO zH;JNSVy%Y7`UzjF@?TEQLuukv*C!;jx4kb(WP?3;d|taKQV)1zSd~aJIwGU>8!+3o zV>@qqsEL8ued|WP%1Ij^X7bwuK&h)eV;{b2TOcvBpPl{QnlsMGm`gg>SUB1 z96#EYLekznuGrHkl# zg%v+pvgx}DjJL5VJ4YTCCClbK$5-NX#dGf%tR^M?#?rlaQ$ow0vx`W{nDO8Apwz7U zucLHF{w%Z9@_f7lw2l_N`(c0_V!jHJkh-dqMi)!XXSE@2rTt(KJcg_kYuMoS=Xz^x z*{2V2UBN^^ND|r>BYSNc>8W7gN2{*0J8G4>qB1NtV%6*A7<4R3job$qr!6BdzVF8^g+*v zeYZ9%iRdLxG#m3@bz0B*vvggzmT-H%JF2<)Ju>dKa%;beA<(_3s!BJrw@puVfytY5 z&!eK%V!GJOvIK7hcGqmQ53t9qh`JBd_4k}oOu?7z+@t&IXH*|oMrKqWoDVt#RmY)o zTT9;o=M_Ouk7gb8>z?O=Ds`k849^ww&F6*Ra60Bgq$$O=I$hrzSVqe&a#>7a4@i$M zieM|!MI7s`#+pbhd_A*Lsk~{;1q^zkaH%d^==m}t-HUh?v~7FKwpZ~+aouZy1{>;G z1+5=DOF139g9TW{-HcOu-^}}srX}Wf;QQt1>PG0#d8c1-2Djh>GcdURa!qASy)uJPib=WT zL=K73g+lw09uto2ckJeOJ2G5a__2|p*x+A5DpUYnW+BN~C?l!y4#sdC5c7RKk*u$v zdjd{;iJo7r8MZ~!QKHReq|>vi*S&8-?BXP@4iDF0W#n;Pt0C=$-8Vd`M{SR5f+sEK zIf6WwLUJDMk_o|Xrb%a00;tbhzDpX2=x2w=521Mv?`wVP=1k)^IDJ5l36=k@y(b*; zzB0_={rw=Z+3AX2na$%;INHK^%g@rD05I*k_8u; zBIeGdMh=eW0Iw;zN?bMKAAIRcB^J0M814i)8)m`~?%;mZ#1E@-%f?=@BD;SuuIy{i zWdBq7cx4coq%Ev}2-<&nB^OC-h}px2(#hl1teN5RRq_6Fk+u%prHKFW0z9KvGcyqQ zO=;Ic9onY2WyZhVDOaU)wAUlkh3!Fl+Jo<+azQBqvCw21f3??D^fTYlK#QD4diT;L z!tZpNAWl7tKB>e^tXJ89>=cB4A@b~yq>su6dPo(k*`B@%$8a~_z5la#P8QzvQM+4F zPt3o&^D~$%#u{g2>6!9yi}X#WS$SHMJPyLl0j9LhP&p1_QxcxU3Xwqt;HV;})twf0 zO7|NmQ{&uSYXMz<2RpS6_#IkFGbcvdqB1>?#UgXk^}u-q z`0Qe(JXlP8=Og_(ndn{47XMx8#KJ-(kH)0;T{E5i_@AqPoHv_)iIfqe3DH~ssv>^{ zD^DrdY7wW~nyBZh-{_sLGP$i#M2^QWr2u)Q6I%3H_h)(oX_I|wIx*YrlBG$?{A!pn z>A}c^q~V-)el@#YpTJ@TW8IE=-mrE;7Nq4ADPn5$7`(`H*ax|F((hd)~b<1D{tLU%eYp2 zhH3$Ye8;_LmQn(rDWd@O>U0AiVIj$Y@MOPa=V!6Ervafhm_OUTEhh+J^q;R(nAb4w zf>EBfo`{Dtr3;pA%@+;SK<5kgYj<@wz;ALUxp31>4mzK~IV0z%nF$%A3A<$OI$Q!z zVFww;^VU#y-=*`UqU(WCVL9EQMQ(Pi)h3+N4d5FP&9DJ$UQD>W#_`u#va;fK@W6yB zdB7s-l4Xpj8W6gY`j)jD34_B4ra^j&;ISIL);;7K7V1q4@Ps})13(z{7*cm;4kK3Z)xDaZS&6) zupJ(MINxjC^c2rWt6Y6SiC-iNE1r2%SB@`0n`3Sv5MR^3S)P9O`5HZi|FQv)gOz7b zpDSRIX{r8FR;nUp;3VO3kD}OlREwPHHif_57;XG87DhE(VIHH20wMwJrI9O9Gt-RS zXE)&7k_pIoN`6iy5Q!(qD>=C*=$=Oxw{SR$^_q>wxJ^i%P8 z!lS~vH=XsIpVnfahho=L_M<<`>WbmE^{fzVA(OuJDSD$M=8cgqn&{2NAp=~op+>BM zZ)o1{BK%D0U&&R9V$*Sc77~@$f3N$!cUWn;=YwwEva&{{VZe~Wq|Ytd!HS^lT?U$v zwd*%uy`FX0nT{5G9bC5WS*#0Z5;DL}{0gm6|A9ZC)yj(BS0o%(#2Qb^JPlzrAEj`5 zx)0naeNQ(oh7yFz_~-< z-Fz4M)2%UoUZ(w%&7r}hceWlcUKYuP0gBGmAMH`9xW-6mhYdB2KaRW$=p)_JmC!!0u zqR|&R!!<6I=oslI{mD%@0=>x{ zLR!9YA1ahqc=WztCZV)Fe=Y(kLS=~f%pH+{8o+2%FF6^3M|4NTD*BBLwhhsKrEmoZ2pGN%U{a7JCB- zE6iBZFQ~jfd-Xy0@-gz$sVIcww0}ZXhJ%VZ;4~k_lu=>&*_gf7eo_q`UyKEMLbKG@ zbg+;`dTT&fdaGFQ$(Veyr6h&QAyXgdgvb9LVbEK1U#}0p(!h0*!Eo_v}DWt{F zt6ec``oy=JTb*;B3FjUYB|Fu7xUqvjTo2_A(=Ea7bvG-=KOvtUaqccK3sKPGn&H=0 zO9v-sCnovY_G*PGr8Jf-$utaEyK5eNlb%ExRszbtE5P06Hg!`B`^`f1D1sN}IrIKz zzof%?JMeL;oi)^9 zyM|&ze``U8d}MTrgZy*ni(UDfP*rdCguv?1t)ozcg{5JGp8$hnL!U?!jx>)!K1?9@ zVwo^a$=N%H+_2B^TO;x}0d*lyGpJ*{?^$d*96o>~7v>hP?lV~+c}Ta^h#Ai#(=6sO z-tHJg_H3Gg&VdG@qe4LS=hym0>LkobcINf73r&yYlM+r0A`K7W-S*&`)zb=s`|F|9 zLIWtP(M4Xeyq!GeNyU(<2q-z6&wWZW`FCY{;sT^rQ9t{ z@|#N6AT^T$$_ywr=hv{&&seRAz)gc+ZPsh++OA=YtQ$3VA#s;rM{g~eZ3gvZsU6Md z6*v|7*JD#Uz=9w1or)^CV97fnvFl{I?<-jr`)6F7cZ*Gu_SnOQ$n{3noFwY+HTt7d zUCtr=?8dNiN^N5vGc)8sg$hscq&CSi;-rsQ9R^))4)@oor48#>orK|3O|0W zeqvnz*3o~WO;<+2`#c?RJc5TIuO}b79GPDuGMwEQ;e`D0P_N<94ErNf10QWp9{pro zlpADO{!H<`_qQ*rkwK9Gf=2<+tM5Jx`8E#>VlL-WQ;ufA^4CeKC)C>X?p`jk z!LOlMNi1PZK+>c(a#NqvU_W!Qizgn%!Ay46Z#_gmSjybT`I5ZMH5#5pFkiRBK}jxU z;#IDQKp)R`#1Z-;O5GgDiQKo{e#mcuK(~ zVsM=THDdJc%s>j)F88crYPOyJVM2kVMc=iZlorZO*GoUI$X!)T>lAp2_d68k5Yt5k zgb=)IzVYk#9>(6>wwUKALH5z55N8cJx4x~_1fydU@2cI_0t@iQ|7VRKujkLWmx0C~ zX-QeDZ?bvXeyZ@OVQv{n)njGVd|m041&%#T;TjcrXcJ*q;RbT)A{zcc0o*LE=X4ZJR+$8tE5r$Ypz7TZcsh(@FKigDe{4vXZd=+NPE;Nas&| z4u?UGyv$z3^~e3kAtK-LSA%(0B1!Vsw2*({Y|kS{?ImCL-R_Lwy5E_8PNbeEU6~%u zB2lHj$1p*q?8gntN}WO;HPdE6db;>VdK5?V43)YH*NeCaydFJ~d$L*?ucz&$Q4SQ& zngl<(0RpK3{}^RXydP6p=1J^OBP5Ar21uwPF=k zd#Uz(b2B~``$qDipn>J&)qNQG_dMOB(JyagXXbG%rcpSa~M7B{PU79E`&zhxWpymE_&#A1*b{$n*%QXFA)!)0DR$Y5 ziCgy=s|b9&7;2MzJ)*z$I-&;fIHKfG-MseR$4GTMnz%LlGFVLX562yIo%Nq+5;T)y zNxNWU?l&}h#|Q5p4CG~UTb~Pkq)I<{F`mhgo<47Z_3>m_d?pF?mdboi_Gw4` zZa5-3I)3$tshv4Qs?5kXn(ko&k`DEM+Vp+%XZW8!q>r^Wk1m4Tdf2t%|L|-D?6sQ( zHBVl58-q4+r0IUmsV8s?s9n8?<1H<0lQcOSgV2oMBmnWMuJF+Yi7`|=#v&`Apf%px zIs(1`3xn@B7_XIcFR&-|96msYY;EO&ce9X}3X@JlVIXoV)o7x$0|%CrB`VvKrSUx| zLA$}R+p)I;rsT}ayeb6jH^z2kq6=Ex#Ysh}C8y`vwGq6@tfQ&jivhVEQfcaT{;weyvPR?;vp#{99u^Ag(Q|d#9g+u50U2 zV*P$Ax8pXHd6X((h&$~CiEUeBh26{d%pVkAeZyXZ0~+jo%X&dls8ZYS(K;ht}yLWcVQL6#j5Ypfj?QFzw@xitYMr z@AX@p3LY^$+hZhMs-zBq`+GyAVd+FGHxh8>?lbQJyI;4V)dX{j3I$kYWR)b_u85(|hV;bBc z>1Q}cf^TT#F1+I*Z`Qd}73fv1i6MwK8+fBOvF0;>{N#)90%!SXSA?BZo7ff#kVxjm zPq#~Os3%>3cX4rcfapdU=I2BsZ;pVw1nVIeQ7k9;yuf>EX$J#zs!&+0J9bQqx;Rd- zuQX0}ysWy7&eUANt;yhVIx}bR%*?95v@VLM!{;U*p{H%)-KV)!xs|XMeQomz?CZ=Y z*xr83{3@T*OX>{=sxFLgB+NEzV*nV!F-uvlOuue|z2fY$JYOR(gTewlckTI!uJ5R! zdJ<&EFCG4l{_uTKayro^F zagjTwu!?qCe!Si;g*asKQuWJt#9Ik`s*z^widg)ZY4S&rb9fG z|M(OD?lgPW@AW2a*S*H!gNfXQGCAb(mc2(w>etwMFWFS>mn;oR9iH!T_80T4e|E6J zu#{)31oiIsz}S+~LhFu#YDPQqrv|s(w$O&D!%a@bHP!MDQbR!EFA)QAN9f^Pg;o6P z+8k<+i(!}rYpI@R(7%iDhKmNmpVGhmj{CE#H*~i5i^I<%~%}BL|VV@#3T~H-`LDvRtuqI!z z59d_wR{5Qu({d>oY0d;xtk6;Vy)i60QA87Z+pcV~Fb-LDXl9K&uNMg%J_3-o=!8&u zWeyLFIdFI}X35cfj@k6p&Y8}viQ37}-mo-!<)2CsSle(dDKZKNtdh!`-3wx%4c~D{ z)ccKAc|Fd8eNP^4>ZTW&GuAl8Pw9SI?2#)s_Ot@M5r+`(#pznrT0=itiel;#PZxKc zj_S>3%VhmEWxy`MSBVfnk{HV}#cHR`^;b<@mD~JhM0sLL9^zF@q4OV##)gMAV=Bj{ zPJ7&^e=P9j-V_%EoS4u_=-cQUJ8PSpVJrJTq14bU2khGDfGf&b>!yD+a~<1rj=YGV zY#4^o;@XgHTlPR+lXxj_uGvF_=kQrfPEpN0&?{{V4q3L_k~7FCKIYRn+UsL(`*vbm zq%>z^ufaOvMwI!M=4;u>&HbB|6S##>1hSt$J--}VUjf&+{^*wfCnDRkhtO3d+B{u< z{#PR-p9FXe>^|hmbm}Ff??|^ll(;jbscGc=is4X--=V6W5c zOQErsl8p=@&;~yqVnElCgKE}0eGlVn5P0DOURXyfiB(_gqybh_7~X2b0>h*MrFcPJ zvRp>P=t6;`xT2Z)ioNnO`rssJ&biueTlDGE2duxQvk9};-rd6QAE%Guopd+a;sYV1 zMN?c*uK1UG*7wv?%0oe`ShXI^wAXXvX)9oy67hYK1(qs6ifX>Yk#zdhACp%mR0@kh ze?+7asx9q>hZDxS=w`sj0~bBL?<5?VMUs}=Ce}wk$V(dn54(i%Uvbm^=UBZ{N9_~^g@2A83%vchwYymV@~O|4d!b|VqwObIA4ev5Yoyj-KzEt^qo+!D7&~sK3d9R$pf7Hl%&g!n5Z~4Yos<=)^<={sP z=cV_zD(t<4mxpqA!y9EDPdzqu72WF(VH4Z_c?Z#xIP_k4OqTX1N`v!2z3hi8%&pxm z`XP^hp1c3w4W#VZjYq$R0V0Nuq;pj7Ur3iFTS8^wmXWboR?knMjUv#shKx46wfo zc%wZ1j1>`S^pwV((#9?#ux9cbKizUchj~PZ1$Q8vtM0=_Q8@}hP4raG>gW{ltg{l0To+a$XRUQyu)s z5pp><8G24n0zlUi*#SRv(M-6M_)B~X1`APH8N8^|op2>%EyeM#@m%~tbN(HN+cqcg zOi->p;IFAsZdySD$0tqD8XW5}DzuO@6izMMXb1p{aSCl4^L z)1slXNeSeg$RXqzElCbMnp5LBxRA<+X9rX#NIGEoy`}+PE0m-hCD3o6*jqSLgTVWkC_d@tCwhu;*w3;Y48?wsp zl$m6n+>q<6*z)QNWAOYZ(ouMEMsNhJy!_Ej_; z+hCO%wzkzmD^8;NW>Yn6WW0XH;{;O5B&!4_)W&eQ@^uloGCk8|?3rGw)UjR2n;FG2 zf#RCH`{<6y)-p}_UX+?=6Fbl*PlE(anW!zA`C^vh;w$dA@w$CPa@9>ubMhg%eHVP$ z;;wD}294rJ7Jv0^B6KA{>Q9^c_Vg)jQ}(kLRT=M1W;|yo&bjg$$c&yY(Ho)bk=rbs z{XZtNa2tIj;~J6;-;<-Ojb?DipJE#?&R>gkCc{;&yHF>+Ti=V)pQBH32Rl`-WpNAd z7+)q~Zpn*&cP;z-XyMI3^z3oPM#ld&NT!FdDCp_REH_}6)U4H_W7(bwwbL!=&$LB5 zIlbDG&Er(vvcQlzHJ99kLS6;Z`>Ks1oSWf*G1O%ges=qtXUz(={oG1L=6EvVGGEHR z;g4;wh~Yva+BeZU=7Sp6DQj*eO^u%_VlF!$LUyHDvo6lj%7Oa_#=@0B9nr76hm}e> zq$4_zK-(I&F?~$Kx}4o7Ki2P#_>!sobN(`GS_=3>!@G0apljsKiV@)oc}fHW6W+V= z?BQwk72vn3nJ-4+8fcKi#|sd`PM_uxXzusKiQTQ8BAjm&-~`>IEEaywarZc&Mf=VK z309tv$Ex^-gcvF4=L;FoZw-RVz!N1kt=-OQ(Pr^4O7duOT0srt^)wQ<)rV_WzeyF)9cU(8+@^ubtdY%$n&NLTVeq*(mA=XJ7=rUR@ufvj=GE}NoI0J=_7PGtG!Jgc)9Mq#e)k|DxG?9-d$Y)nD3Ks?Q?9Cv(5D- zuxxH zQHL-`fP2gcM!PnxA*2bZUnQop2hX%gK zS?3*-KC}|a&oB!2L=Md*9p9D{d7BbU(esOi*`uUSPieNd*fDNcUA&hX)u|p4++?IgmJ1>@N0p00B8C;n#>QEqQvCA`;=`PZVd^O)&bV!V zV!8T=VfIoV>t;o(Eo8~VlSP=JrYJ7YIP5~^P$_4cKRw=g)p1!b!>gPq;a@L6{1(?} zx*tDso%meA0!_Nr+dqv}R-O==?&CvQ6hq)ycBr3)zojgUi;u8kgwC##&)W5Z!e&*- zU~VCxi4^vmqrU2AY5;w{bmGM`53d@dPZQ};1Fld-&!)|tT{E$px@D&ay}-jBVE(T! zog_?+1dXBZvPq+;XT%8TSs+#T;4LFl(Wxeti5PH>Zv5Gej*-cy6j{-=6<1J!oX^q` zJ14jsJe8Ci;Q($z)l>-e3)lR}$z50TOctxn3M=v%1vc{zo!iCoXFZe0V-4dZ0t?hZ zG~@;!Q0v*A2^_TvBbAj9x%j9a|9*jN7J&K;59`gS?HZVHe3|jXi-EE895ijgK2)qw z9t*nHZ+=C#kW;=-ke)h7QCjrsQ~{by;4X#n=!o}2Ij`ID!0lecdTr2{zW7;${6i<&&8qURoT z4L!s+Ce9xC)N5glN&y9A)o42j4GS5z~C|!=MqB z^S@%H68{r#!U%C3eqX#v*qr?1%VGcNy8%VGrK%?(RQ9Na7gRKYzLF>$+NWOjJFus< zMxQlSEbgAw(?uu6ZN~rx{*FPrRnvu7C8aYX%IBd$t@e)gmE~=5U*%K z3VS=ORqH5=lA#N8*Lx*oEUz{d7LF_cD)!t{GW(P!baSs$&@MnXfEi7L`~ni8yV_On z>plLyP)0IOk|2%M=>;YV+<8?UOMgB>N1`3i^pEAHTM8gTPSQ)$FJL05{9sfdFN=WGG=X3&$b%f^MCdT1s9;;f$7cC z;hAeR5@Qc0FW^5P-<|~z0iRNg#>0o=j_ZS6vI8gz_LVc^q3#8qk7q;ytsk*KjNP{?bH9Rc?}!yzCpF}>cK0CzvG z5_ER7S|i5i9?nmmvf%__wnt+lA*R5c_lD7XIfY4gHjr(ZzkIz$IY1)Y_=*_DUDSgH zF!IcLjV70P&n3OKLjgGh%ms{$+z!1P);bG8{OiZr#CM< zZ$mIg(A=C2uGgHiMaU$cvT0=2;s_TA0oKR-$(s?hri=V70ffqUtQx?tazy-_zQ~no zMwSA%fo;DM)v3OIb1rN9xC22uUF9jfnS=VM07rd>w@fk6r;8)|$vb zbj+x!L(vUAIqB-0B$GG25Q=;D&-3rekqyGS5s#8E%SIHn|EXlbSaCtEmsC&rxep&z zTIVE699~msuEczkUh~MoMAIY{CAiVli(}q8j$^)iXM6}yG~U0i4+BF& z#Xz`mKvZ+lfi$w-$BPdgG{@3wo$~Zc9@05Ur6f3Q{~uj%6%c2%1Pua#;K4(H;1(

QtX*B448jasqUI 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 #H;&t%j(8 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%0AiVY6oPDMi(7cK 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

a(o}E9$wSH#|;0N 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


N%*nxntn0Q0-#*pU)zdkkT(jWs~!(?hjZ&LCnI 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 literal 0 HcmV?d00001 diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 7b0c2dc..581e48a 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -3,6 +3,7 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key}) : super(key: key); @@ -26,8 +27,8 @@ class _FamilyDetailsState extends State { Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, - backgroundColor: Color(0xffEAE7FA), - appBar: AppBarBackButton('Add Family Member'), + backgroundColor: Colors.white, + appBar: AppBarBackButton('Family Details'), body: SizedBox( height: MediaQuery.of(context).size.height - MediaQuery.of(context).viewInsets.bottom * 1.1, diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 3f90fd7..f108848 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gender_picker/gender_picker.dart'; import 'package:gender_picker/source/enums.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePicker.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; @@ -33,7 +34,7 @@ class _FamilyMemberAddState extends State { Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, - backgroundColor: Color(0xffEAE7FA), + backgroundColor: Colors.white, appBar: AppBarBackButton('Add Family Member'), body: SizedBox( height: MediaQuery.of(context).size.height - diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 4302b07..67c9104 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -6,6 +6,7 @@ import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Login.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class Home extends StatefulWidget { const Home({Key? key}) : super(key: key); @@ -22,12 +23,12 @@ class _HomeWidgetState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Color(0xffEAE7FA), + backgroundColor: colors.darkScaffoldColor, appBar: AppBar( elevation: 0, title: Text( 'Hello, ' + userName + '!', - style: GoogleFonts.montserrat(fontSize: 20, color: Colors.black), + style: GoogleFonts.montserrat(fontSize: 20, color: colors.darkPrimaryTextColor), ), backgroundColor: Colors.transparent, actions: [ @@ -35,7 +36,7 @@ class _HomeWidgetState extends State { splashRadius: 20, icon: Icon( Icons.person, - color: Colors.black, + color: colors.darkAccentColor, ), onPressed: () async { await storage.delete(key: 'jwt'); @@ -49,7 +50,7 @@ class _HomeWidgetState extends State { splashRadius: 20, icon: Icon( Icons.settings, - color: Colors.black, + color: colors.darkAccentColor, ), onPressed: () {}, )), @@ -63,22 +64,22 @@ class _HomeWidgetState extends State { 'Individual data entry for everyone in home', 'assets/svg/female.svg', FamilyHomeScreen(), - Color(0xFFF700FF), - Color(0xff3D2C8D)), + colors.darkSecondAccentColor, + colors.darkSecondAccentColor), DataCard( 'Community Details', 'Data entry for communities', 'assets/svg/house.svg', CommunityDataCollection(), - Color(0xFF2E2FFF), - Color(0xFF4FD586)), + colors.darkSecondAccentColor, + colors.darkSecondAccentColor), DataCard( 'View saved data', 'View all data saved in local storage', 'assets/svg/storage_image.svg', IndividualDataCollection(), - Color(0xFFFFA200), - Color(0xFFBA0000)), + colors.darkSecondAccentColor, + colors.darkSecondAccentColor), ], ), ), diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 69bb91e..0036347 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -104,13 +104,13 @@ class _MyAppState extends State { padding: EdgeInsets.all(2.0), decoration: BoxDecoration( shape: BoxShape.circle, - border: Border.all(width: 2.0, color: Colors.white)), + border: Border.all(width: 2.0, color: Color(0xffe29662))), child: isSelected ? Container( width: double.infinity, height: double.infinity, decoration: - BoxDecoration(shape: BoxShape.circle, color: Colors.white), + BoxDecoration(shape: BoxShape.circle, color: Color(0xffe29662)), ) : Container(), ); @@ -128,13 +128,13 @@ class _MyAppState extends State { Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, - backgroundColor: Colors.black, + backgroundColor: Color(0xff19100F), body: Stack( fit: StackFit.expand, children: [ Container( - padding: EdgeInsets.only(top: MediaQuery.of(context).size.height*0.6), - child: Image(image: AssetImage("assets/image_01.png"),), + padding: EdgeInsets.only(top: MediaQuery.of(context).size.height*0.62), + child: Image(image: AssetImage("assets/Illustration.png"),), ), SingleChildScrollView( child: Padding( @@ -142,10 +142,13 @@ class _MyAppState extends State { child: Column( children: [ SizedBox( - height: MediaQuery.of(context).size.height * 0.25, + height: MediaQuery.of(context).size.height * 0.23, ), FormCard(_usernameController, _passwordController, _nameError, _passwordError), + SizedBox( + height: 10, + ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -163,7 +166,7 @@ class _MyAppState extends State { ), Text("Remember me", style: GoogleFonts.poppins( - color: Colors.white, fontSize: 14.0)) + color: Color(0xffE9AA4C), fontSize: 14.0)) ], ), InkWell( @@ -172,19 +175,22 @@ class _MyAppState extends State { height: 45, decoration: BoxDecoration( gradient: LinearGradient(colors: [ - Color(0xff37786a), - Color(0xff00fdcd), + Color(0xffe29662), + Color(0xffefc1a9), ]), borderRadius: BorderRadius.circular(30.0), ), child: Material( color: Colors.transparent, child: InkWell( - onTap: _login, + onTap: (){ Navigator.push( + context, + MaterialPageRoute(builder: (context) => Home()), + );}, child: Center( child: Text("SIGN IN", style: GoogleFonts.poppins( - color: Colors.black, + color: Colors.white, fontSize: 18, letterSpacing: 1.0)), ), diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart new file mode 100644 index 0000000..4871d46 --- /dev/null +++ b/lib/Utils/Colors.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +var darkScaffoldColor = Color(0xff19100F); +var darkAccentColor = Color(0xffE9AA4C); +var darkPrimaryTextColor = Colors.white; +var darkSecondAccentColor = Color(0xffFADDB6); +var lightPrimaryTextColor = Colors.black; \ No newline at end of file diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 1aac38d..ec6f6b7 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -19,7 +19,7 @@ class darkTheme{ side: BorderSide(color: Color(0xff43282C),width: 2,style: BorderStyle.solid), padding: EdgeInsets.all(10), ) - ) + ), ); } } \ No newline at end of file diff --git a/lib/Widgets/DataCard.dart b/lib/Widgets/DataCard.dart index bc7d6f7..7eff442 100644 --- a/lib/Widgets/DataCard.dart +++ b/lib/Widgets/DataCard.dart @@ -1,6 +1,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class DataCard extends StatelessWidget { DataCard(this.heading, this.subHeading, this.imageUrl, this.route, @@ -63,10 +64,10 @@ class DataCard extends StatelessWidget { children: [ Text(heading, style: GoogleFonts.montserrat( - fontSize: 25, color: Colors.white)), + fontSize: 25, color: colors.lightPrimaryTextColor)), Text(subHeading, style: GoogleFonts.montserrat( - fontSize: 15, color: Color(0xFFDCDCDC))) + fontSize: 15, color: colors.lightPrimaryTextColor)) ], ), ), @@ -77,7 +78,7 @@ class DataCard extends StatelessWidget { padding: EdgeInsets.only(top: 8.0, bottom: 8.0, right: 8.0), child: SvgPicture.asset('assets/svg/right-icon-arrow.svg', - color: Colors.white), + color: colors.lightPrimaryTextColor), ), flex: 1, ), diff --git a/lib/Widgets/FormCard.dart b/lib/Widgets/FormCard.dart index 192b911..7f88dda 100644 --- a/lib/Widgets/FormCard.dart +++ b/lib/Widgets/FormCard.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; class FormCard extends StatelessWidget { FormCard(this._usernameController, this._passwordController, this._nameError, @@ -21,8 +22,8 @@ class FormCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("Login", - style: GoogleFonts.poppins( - fontSize: 35, color: Color(0xff00fdcd))), + style: GoogleFonts.poppins(fontWeight: FontWeight.w200, + fontSize: 40, color: Color(0xffE9AA4C))), SizedBox( height: 10, ), @@ -30,32 +31,51 @@ class FormCard extends StatelessWidget { controller: _usernameController, decoration: InputDecoration( hintText: "Enter username here", - hintStyle: GoogleFonts.poppins(color: Colors.white), + hintStyle: GoogleFonts.poppins(color: Color(0xffcec7c3)), label: Text("Username", - style: GoogleFonts.poppins(color: Colors.white)), + style: GoogleFonts.poppins(color: Color(0xffE9AA4C))), + enabledBorder: UnderlineInputBorder( + borderSide: const BorderSide( + color: Color(0xffE9AA4C), width: 1.0)), focusedBorder: UnderlineInputBorder( borderSide: const BorderSide( - color: Colors.greenAccent, width: 1.0)), + color: Color(0xffE9AA4C), width: 1.0)), + border: UnderlineInputBorder( + borderSide: const BorderSide( + color: Color(0xffE9AA4C), width: 1.0 + ), + ), floatingLabelStyle: - GoogleFonts.poppins(color: Colors.greenAccent), + GoogleFonts.poppins(color: Color(0xffE9AA4C)), errorText: _nameError, labelStyle: GoogleFonts.poppins(fontSize: 14)), - cursorColor: Colors.greenAccent, + cursorColor: Color(0xffE9AA4C), + ), + SizedBox( + height: 20, ), TextField( controller: _passwordController, obscureText: true, decoration: InputDecoration( hintText: "Enter password here", - hintStyle: GoogleFonts.poppins(color: Colors.white), - focusColor: Colors.greenAccent, + hintStyle: GoogleFonts.poppins(color: Color(0xffcec7c3)), + focusColor: Color(0xffE9AA4C), + enabledBorder: UnderlineInputBorder( + borderSide: const BorderSide( + color: Color(0xffE9AA4C), width: 1.0)), focusedBorder: UnderlineInputBorder( borderSide: const BorderSide( - color: Colors.greenAccent, width: 1.0)), + color: Color(0xffE9AA4C), width: 1.0)), + border: UnderlineInputBorder( + borderSide: const BorderSide( + color: Color(0xffE9AA4C), width: 1.0 + ), + ), label: Text("Password", - style: GoogleFonts.poppins(color: Colors.white)), + style: GoogleFonts.poppins(color: Color(0xffE9AA4C))), floatingLabelStyle: - GoogleFonts.poppins(color: Colors.greenAccent), + GoogleFonts.poppins(color: Color(0xffE9AA4C)), errorText: _passwordError, labelStyle: GoogleFonts.poppins(fontSize: 14.0), )), diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 5776770..2be9106 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; import 'PageViewContentBox.dart'; @@ -88,24 +89,26 @@ class _FormPageViewState extends State { @override Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - StepCounterWidget(widgetLength, count, formErrorTile, controller), - SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: Container( - height: MediaQuery.of(context).size.height * 0.82, - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: controller, - children: widgetList, + return Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + StepCounterWidget(widgetLength, count, formErrorTile, controller), + SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: Container( + height: MediaQuery.of(context).size.height * 0.82, + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: controller, + children: widgetList, + ), ), ), - ), - ], + ], + ), ); } } diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index c36c195..4eda1d3 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; class PageViewContentBox extends StatelessWidget { const PageViewContentBox(this.centerWidget, {Key? key}) : super(key: key); @@ -10,14 +11,14 @@ class PageViewContentBox extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.all(10), + padding: EdgeInsets.all(12), child: Container( decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(20), + color: darkTheme.DarkTheme.scaffoldBackgroundColor, + borderRadius: BorderRadius.circular(0), boxShadow: [ BoxShadow( - color: Color(0xBC674E6F), + color: Color(0xBC252426), blurRadius: 8.0, ), ], diff --git a/lib/main.dart b/lib/main.dart index 5813b0c..966215b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Screens/Background.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Home.dart'; From f848b5ce36e8ed2173ced3adc41a14fae598bc32 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 20 Nov 2021 20:22:20 +0530 Subject: [PATCH 048/264] Theming changes --- lib/Screens/FamilyHomeScreen.dart | 9 +++++--- lib/Screens/FamilyMemberAdd.dart | 3 ++- lib/Screens/Login.dart | 2 +- lib/Utils/Colors.dart | 2 +- lib/Widgets/AppBarBackButtonWidget.dart | 5 +++-- lib/Widgets/FormCard.dart | 28 ++++++++++++------------- lib/Widgets/PageViewContentBox.dart | 10 ++++----- 7 files changed, 32 insertions(+), 27 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 38c3fc2..d0e55aa 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -1,24 +1,27 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Widgets/DataCard.dart'; class FamilyHomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: colors.darkScaffoldColor, body: SafeArea( child: Column( children: [ TextButton(onPressed: (){ Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); }, child: Text('Add member')), - TextButton(onPressed: (){ - Navigator.push(context, MaterialPageRoute(builder: (context)=>FamilyDetails())); - }, child: Text('Get common details')), + DataCard("Collect common details","","",FamilyDetails(),colors.darkSecondAccentColor,colors.darkSecondAccentColor) + , ], ), ), ); } } + diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index f108848..289b238 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -8,6 +8,7 @@ import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -34,7 +35,7 @@ class _FamilyMemberAddState extends State { Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, - backgroundColor: Colors.white, + backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Add Family Member'), body: SizedBox( height: MediaQuery.of(context).size.height - diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 0036347..e7aa659 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -128,7 +128,7 @@ class _MyAppState extends State { Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, - backgroundColor: Color(0xff19100F), + backgroundColor: Color(0xff333034), body: Stack( fit: StackFit.expand, children: [ diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index 4871d46..cfaad92 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -var darkScaffoldColor = Color(0xff19100F); +var darkScaffoldColor = Color(0xff333034); var darkAccentColor = Color(0xffE9AA4C); var darkPrimaryTextColor = Colors.white; var darkSecondAccentColor = Color(0xffFADDB6); diff --git a/lib/Widgets/AppBarBackButtonWidget.dart b/lib/Widgets/AppBarBackButtonWidget.dart index 35dd3c1..03a72da 100644 --- a/lib/Widgets/AppBarBackButtonWidget.dart +++ b/lib/Widgets/AppBarBackButtonWidget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart'as colors; class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { const AppBarBackButton(this.title); @@ -28,7 +29,7 @@ class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { splashRadius: 20, icon: Icon( Icons.arrow_back, - color: Colors.black, + color: colors.darkAccentColor, ), onPressed: () { Navigator.pop(context); @@ -37,7 +38,7 @@ class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { centerTitle: true, title: Text( title, - style: GoogleFonts.montserrat(fontSize: 20, color: Colors.black), + style: GoogleFonts.montserrat(fontSize: 20, color: colors.darkPrimaryTextColor), ), ); } diff --git a/lib/Widgets/FormCard.dart b/lib/Widgets/FormCard.dart index 7f88dda..c5c7a41 100644 --- a/lib/Widgets/FormCard.dart +++ b/lib/Widgets/FormCard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:geo_spatial/Utils/DarkTheme.dart'; + class FormCard extends StatelessWidget { FormCard(this._usernameController, this._passwordController, this._nameError, @@ -23,7 +23,7 @@ class FormCard extends StatelessWidget { children: [ Text("Login", style: GoogleFonts.poppins(fontWeight: FontWeight.w200, - fontSize: 40, color: Color(0xffE9AA4C))), + fontSize: 40, color: Color(0xffF5A06D))), SizedBox( height: 10, ), @@ -33,23 +33,23 @@ class FormCard extends StatelessWidget { hintText: "Enter username here", hintStyle: GoogleFonts.poppins(color: Color(0xffcec7c3)), label: Text("Username", - style: GoogleFonts.poppins(color: Color(0xffE9AA4C))), + style: GoogleFonts.poppins(color: Color(0xffF5A06D))), enabledBorder: UnderlineInputBorder( borderSide: const BorderSide( - color: Color(0xffE9AA4C), width: 1.0)), + color: Color(0xffF5A06D), width: 1.0)), focusedBorder: UnderlineInputBorder( borderSide: const BorderSide( - color: Color(0xffE9AA4C), width: 1.0)), + color: Color(0xffF5A06D), width: 1.0)), border: UnderlineInputBorder( borderSide: const BorderSide( - color: Color(0xffE9AA4C), width: 1.0 + color: Color(0xffF5A06D), width: 1.0 ), ), floatingLabelStyle: - GoogleFonts.poppins(color: Color(0xffE9AA4C)), + GoogleFonts.poppins(color: Color(0xffF5A06D)), errorText: _nameError, labelStyle: GoogleFonts.poppins(fontSize: 14)), - cursorColor: Color(0xffE9AA4C), + cursorColor: Color(0xffF5A06D), ), SizedBox( height: 20, @@ -60,22 +60,22 @@ class FormCard extends StatelessWidget { decoration: InputDecoration( hintText: "Enter password here", hintStyle: GoogleFonts.poppins(color: Color(0xffcec7c3)), - focusColor: Color(0xffE9AA4C), + focusColor: Color(0xffF5A06D), enabledBorder: UnderlineInputBorder( borderSide: const BorderSide( - color: Color(0xffE9AA4C), width: 1.0)), + color: Color(0xffF5A06D), width: 1.0)), focusedBorder: UnderlineInputBorder( borderSide: const BorderSide( - color: Color(0xffE9AA4C), width: 1.0)), + color: Color(0xffF5A06D), width: 1.0)), border: UnderlineInputBorder( borderSide: const BorderSide( - color: Color(0xffE9AA4C), width: 1.0 + color: Color(0xffF5A06D), width: 1.0 ), ), label: Text("Password", - style: GoogleFonts.poppins(color: Color(0xffE9AA4C))), + style: GoogleFonts.poppins(color: Color(0xffF5A06D))), floatingLabelStyle: - GoogleFonts.poppins(color: Color(0xffE9AA4C)), + GoogleFonts.poppins(color: Color(0xffF5A06D)), errorText: _passwordError, labelStyle: GoogleFonts.poppins(fontSize: 14.0), )), diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index 4eda1d3..f4af2bb 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:geo_spatial/Utils/DarkTheme.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class PageViewContentBox extends StatelessWidget { const PageViewContentBox(this.centerWidget, {Key? key}) : super(key: key); @@ -14,8 +14,8 @@ class PageViewContentBox extends StatelessWidget { padding: EdgeInsets.all(12), child: Container( decoration: BoxDecoration( - color: darkTheme.DarkTheme.scaffoldBackgroundColor, - borderRadius: BorderRadius.circular(0), + color: colors.darkSecondAccentColor, + borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: Color(0xBC252426), @@ -26,8 +26,8 @@ class PageViewContentBox extends StatelessWidget { child: Padding( padding: EdgeInsets.all(12), child: centerWidget, - ), ), - ); + ), + ); } } From 31a4fd394435d52fb14ee9024fd28050857c260b Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Wed, 24 Nov 2021 22:00:47 +0530 Subject: [PATCH 049/264] UX changes --- lib/Screens/CommunityDataCollection.dart | 3 ++- lib/Screens/FamilyMemberAdd.dart | 11 +++++------ lib/Utils/DarkTheme.dart | 8 ++++++++ lib/Widgets/DropDownFormField.dart | 2 +- lib/Widgets/OptionsFormWidget.dart | 17 +++++++++-------- lib/Widgets/PageViewContentBox.dart | 2 +- lib/Widgets/StepCounterWidget.dart | 20 ++++++-------------- 7 files changed, 32 insertions(+), 31 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 65d4a59..767bab0 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -4,6 +4,7 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/LocationWidget.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class CommunityDataCollection extends StatefulWidget { CommunityDataCollection({Key? key}) : super(key: key); @@ -49,7 +50,7 @@ class _CommunityDataCollectionState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Color(0xffEAE7FA), + backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Community Data'), body: FormPageView([ DropDownFormField( diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 289b238..3769a3e 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,14 +1,13 @@ import 'package:flutter/material.dart'; import 'package:gender_picker/gender_picker.dart'; import 'package:gender_picker/source/enums.dart'; -import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/Widgets/DatePicker.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:google_fonts/google_fonts.dart'; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -49,7 +48,7 @@ class _FamilyMemberAddState extends State { children: [ TextFormField( decoration: InputDecoration( - label: Text("Name"), + label: Text("Name",style: GoogleFonts.poppins(color: Colors.black87),), ), validator: (value) { if (value == "") { @@ -72,9 +71,9 @@ class _FamilyMemberAddState extends State { verticalAlignedText: false, selectedGender: Gender.Male, selectedGenderTextStyle: TextStyle( - color: Color(0xFF8b32a8), fontWeight: FontWeight.bold), + color: colors.darkScaffoldColor, fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( - color: Colors.black, fontWeight: FontWeight.normal), + color: colors.lightPrimaryTextColor, fontWeight: FontWeight.normal), onChanged: (Gender? gender) { print(gender); }, @@ -82,7 +81,7 @@ class _FamilyMemberAddState extends State { animationDuration: Duration(milliseconds: 300), isCircular: true, // default : true, - opacityOfGradient: 0.4, + opacityOfGradient: 0.7, padding: const EdgeInsets.all(3), size: 70, //default : 40 ), diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index ec6f6b7..0b713dd 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class darkTheme{ static ThemeData get DarkTheme{ @@ -20,6 +21,13 @@ class darkTheme{ padding: EdgeInsets.all(10), ) ), + inputDecorationTheme: InputDecorationTheme( + contentPadding: EdgeInsets.all(10), + labelStyle: GoogleFonts.poppins(), + floatingLabelStyle: GoogleFonts.poppins(color: colors.darkScaffoldColor), + focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: colors.darkAccentColor)), + hintStyle: GoogleFonts.poppins(), + ), ); } } \ No newline at end of file diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 14cf00d..9740849 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -35,7 +35,7 @@ class DropDownFormField extends FormField { fontSize: 25, color: Colors.black)), ), Card( - elevation: 2, + elevation: 10, margin: EdgeInsets.only(bottom: 4), child: DropdownButtonHideUnderline( child: DropdownButton( diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 9d2a520..9580e3e 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -1,6 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; /** @@ -30,7 +32,7 @@ class OptionsWidget extends FormField { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(title,style: TextStyle(fontSize: 15),), + Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.lightPrimaryTextColor ),), Wrap( children: options .map((e) => new OptionButton( @@ -77,13 +79,13 @@ class OptionButton extends StatelessWidget { child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(isSelected - ? Colors.blue + ? Colors.greenAccent : isError - ? Color.fromARGB(255, 255, 185, 185) - : Colors.grey), + ? Color(0xffF1D8B8) + : Color(0xfff6a1a1)), shape: MaterialStateProperty.all( RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(4)), + borderRadius: BorderRadius.all(Radius.circular(20)), side: isError ? BorderSide(color: Colors.red) : BorderSide.none))), @@ -91,10 +93,9 @@ class OptionButton extends StatelessWidget { state.didChange(optionKey); }, child: Padding( - padding: EdgeInsets.all(10), + padding: EdgeInsets.all(5), child: Text(text), )), ); } -} - +} \ No newline at end of file diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index f4af2bb..b3a160c 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -11,7 +11,7 @@ class PageViewContentBox extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.all(12), + padding: EdgeInsets.all(20), child: Container( decoration: BoxDecoration( color: colors.darkSecondAccentColor, diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 9802ab3..bf60383 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; /** * Widget for steps count in registration pages @@ -76,44 +77,35 @@ class CheckBox extends StatelessWidget { IconData icon; Color iconColor; Color backgroundColor; - Border border; if (iconType == 0) { icon = Icons.close; backgroundColor = Color.fromARGB(255, 255, 167, 167); iconColor = Colors.red; - border = Border.all(width: 1.5, color: Colors.red); } else if (iconType == 1) { icon = Icons.check; iconColor = Colors.white; - backgroundColor = Color.fromARGB(250, 157, 133, 244); - border = Border.all(width: 0, color: backgroundColor); + backgroundColor = Color(0xff7bde27); } else if (iconType == 2) { icon = Icons.remove; iconColor = Color.fromARGB(255, 255, 255, 255); - backgroundColor = Color.fromARGB(250, 182, 170, 255); - border = - Border.all(width: 2.5, color: Color.fromARGB(250, 157, 133, 244)); + backgroundColor = colors.darkAccentColor; } else if (iconType == 3) { icon = Icons.remove; iconColor = Color.fromARGB(255, 0, 0, 0); - backgroundColor = Color.fromARGB(250, 213, 201, 255); - border = Border.all(width: 0, color: backgroundColor); + backgroundColor = colors.darkSecondAccentColor; } else if (iconType == 4) { icon = Icons.upload_rounded; iconColor = Color.fromARGB(255, 255, 255, 255); - backgroundColor = Color.fromARGB(250, 182, 170, 255); - border = Border.all(width: 0, color: backgroundColor); + backgroundColor = colors.darkSecondAccentColor; } else { icon = Icons.upload_rounded; iconColor = Color.fromARGB(255, 255, 255, 255); - backgroundColor = Color.fromARGB(250, 126, 94, 255); - border = Border.all(width: 2, color: backgroundColor); + backgroundColor = colors.darkSecondAccentColor; } return Expanded( child: Container( decoration: BoxDecoration( - border: border, ), margin: EdgeInsets.only(left: 3.0, right: 3.0), child: Material( From 697c116c9ff3b9a1bb6f6edac39ff8d06298bcaa Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 25 Nov 2021 08:37:38 +0530 Subject: [PATCH 050/264] Added textfield tags, UI improvements --- lib/Screens/FamilyMemberAdd.dart | 110 +++++++++++++++++++---------- lib/Utils/Colors.dart | 5 +- lib/Widgets/OptionsFormWidget.dart | 4 +- pubspec.yaml | 1 + 4 files changed, 78 insertions(+), 42 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 3769a3e..b4427a9 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -48,8 +48,12 @@ class _FamilyMemberAddState extends State { children: [ TextFormField( decoration: InputDecoration( - label: Text("Name",style: GoogleFonts.poppins(color: Colors.black87),), - ), + //isDense: true, + label: Text("Name",style: GoogleFonts.poppins(color: colors.darkHintColor),), + hintText: "Please enter name", + hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + contentPadding: EdgeInsets.all(0.0), + ), validator: (value) { if (value == "") { return "Please enter a name"; @@ -81,7 +85,7 @@ class _FamilyMemberAddState extends State { animationDuration: Duration(milliseconds: 300), isCircular: true, // default : true, - opacityOfGradient: 0.7, + opacityOfGradient: 0.3, padding: const EdgeInsets.all(3), size: 70, //default : 40 ), @@ -101,7 +105,10 @@ class _FamilyMemberAddState extends State { TextFormField( keyboardType: TextInputType.number, decoration: InputDecoration( - label: Text("Phone Number: "), + label: Text("Phone Number",style: GoogleFonts.poppins(color: colors.darkHintColor),), + hintText: "Please enter 10 digit phone", + hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + contentPadding: EdgeInsets.all(0.0), ), validator: (value) { if (value == "") { @@ -121,7 +128,10 @@ class _FamilyMemberAddState extends State { children: [ TextFormField( decoration: InputDecoration( - label: Text('Aadhaar Number'), + label: Text("Aadhaar Number",style: GoogleFonts.poppins(color: colors.darkHintColor),), + hintText: "Please enter 12 digit Aadhaar", + hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + contentPadding: EdgeInsets.all(0.0), ), validator: (value) { if (value == "") { @@ -138,7 +148,7 @@ class _FamilyMemberAddState extends State { list: [ 'Widower', 'Divorcee', - 'Differently abled', + 'Differently Abled', 'Pregnant Woman', 'Lactating Mother', 'Elderly (>60 years)', @@ -182,7 +192,12 @@ class _FamilyMemberAddState extends State { }, ), TextFormField( - decoration: InputDecoration(label: Text('Income/day')), + decoration: InputDecoration( + label: Text("Income/Day",style: GoogleFonts.poppins(color: colors.darkHintColor),), + hintText: "Please enter income per day", + hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + contentPadding: EdgeInsets.all(0.0), + ), validator: (value) { if (value == "") { return "Enter Income/Day"; @@ -194,24 +209,28 @@ class _FamilyMemberAddState extends State { Column(children: [ //TODO: Add work timings TextFormField( - decoration: InputDecoration(label: Text('Income/month')), + decoration: InputDecoration( + label: Text("Income/Month",style: GoogleFonts.poppins(color: colors.darkHintColor),), + hintText: "Please enter income per month", + hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + contentPadding: EdgeInsets.all(0.0), + ), validator: (value) { if (value == "") { - return "Enter Income/Day"; + return "Enter Income/Month"; } }, ), - Column( - children: [ - OptionsWidget( - options: [ - ["Eligible", "eligible"], - ["Eligible, receiving", "eligible_receiving"], - ["Not eligible", "not_eligible"] - ], - title: 'Old age pension', - ), - ], + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + options: [ + ["Eligible", "eligible"], + ["Eligible, receiving", "eligible_receiving"], + ["Not eligible", "not_eligible"] + ], + title: 'Old age pension', + ), ), OptionsWidget( options: [ @@ -220,12 +239,15 @@ class _FamilyMemberAddState extends State { ], title: 'Doing/Did business', ), - OptionsWidget( - options: [ - ["Married", "married"], - ["Unmarried", "unmarried"], - ], - title: 'Marital Status', + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + options: [ + ["Married", "married"], + ["Unmarried", "unmarried"], + ], + title: 'Marital Status', + ), ), TextFormField( //TODO: Replace with a custom widget @@ -238,22 +260,31 @@ class _FamilyMemberAddState extends State { //TODO: Replace with a custom widget decoration: InputDecoration(label: Text('Frequent ailments')), ), + SizedBox( + height: 20, + ), TextFormField( //TODO: Replace with a custom widget decoration: InputDecoration(label: Text('Communicable Diseases')), ), + SizedBox( + height: 20, + ), TextFormField( //TODO? Replace with a custom widget decoration: InputDecoration(label: Text('Non Communicable Diseases')), ), - OptionsWidget( - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - title: 'Surgeries', + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Surgeries', + ), ), OptionsWidget( options: [ @@ -262,12 +293,15 @@ class _FamilyMemberAddState extends State { ], title: 'Aware about Anganwadi services?', ), - OptionsWidget( - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - title: 'Using any Anganwadi services?', + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Using any Anganwadi services?', + ), ), //TODO: Display next widget only if the previous widget is true //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index cfaad92..3857f0d 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; var darkScaffoldColor = Color(0xff333034); -var darkAccentColor = Color(0xffE9AA4C); +var darkAccentColor = Color(0xffe9644c); var darkPrimaryTextColor = Colors.white; var darkSecondAccentColor = Color(0xffFADDB6); -var lightPrimaryTextColor = Colors.black; \ No newline at end of file +var lightPrimaryTextColor = Colors.black; +var darkHintColor = Colors.black87; \ No newline at end of file diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 9580e3e..b5ac2ec 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -32,7 +32,7 @@ class OptionsWidget extends FormField { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.lightPrimaryTextColor ),), + Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.lightPrimaryTextColor),), Wrap( children: options .map((e) => new OptionButton( @@ -75,7 +75,7 @@ class OptionButton extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.all(5), + padding: EdgeInsets.only(left: 5,right: 5,top: 10), child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(isSelected diff --git a/pubspec.yaml b/pubspec.yaml index 7f2b969..438d756 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,6 +37,7 @@ dependencies: table_calendar: gender_picker: ^1.1.0 flutter_keyboard_visibility: ^5.1.0 + textfield_tags: dev_dependencies: flutter_test: From e66fd8784bbbef0efe1cd0bb0f02df9fcd8f9633 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 25 Nov 2021 08:59:24 +0530 Subject: [PATCH 051/264] Added textFieldTag widget --- lib/Screens/FamilyMemberAdd.dart | 100 ++++++++++++++++++++++++------- pubspec.lock | 7 +++ 2 files changed, 87 insertions(+), 20 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index b4427a9..85fac1e 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; import 'package:gender_picker/gender_picker.dart'; import 'package:gender_picker/source/enums.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; -import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; +import 'package:textfield_tags/textfield_tags.dart'; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -49,11 +50,14 @@ class _FamilyMemberAddState extends State { TextFormField( decoration: InputDecoration( //isDense: true, - label: Text("Name",style: GoogleFonts.poppins(color: colors.darkHintColor),), + label: Text( + "Name", + style: GoogleFonts.poppins(color: colors.darkHintColor), + ), hintText: "Please enter name", hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), contentPadding: EdgeInsets.all(0.0), - ), + ), validator: (value) { if (value == "") { return "Please enter a name"; @@ -67,7 +71,7 @@ class _FamilyMemberAddState extends State { title: "Date of Birth", hint: "Choose a date", autoValidateMode: AutovalidateMode.always, - onSaved: (data){ + onSaved: (data) { print(data); }, ), @@ -75,9 +79,11 @@ class _FamilyMemberAddState extends State { verticalAlignedText: false, selectedGender: Gender.Male, selectedGenderTextStyle: TextStyle( - color: colors.darkScaffoldColor, fontWeight: FontWeight.bold), + color: colors.darkScaffoldColor, + fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( - color: colors.lightPrimaryTextColor, fontWeight: FontWeight.normal), + color: colors.lightPrimaryTextColor, + fontWeight: FontWeight.normal), onChanged: (Gender? gender) { print(gender); }, @@ -105,7 +111,10 @@ class _FamilyMemberAddState extends State { TextFormField( keyboardType: TextInputType.number, decoration: InputDecoration( - label: Text("Phone Number",style: GoogleFonts.poppins(color: colors.darkHintColor),), + label: Text( + "Phone Number", + style: GoogleFonts.poppins(color: colors.darkHintColor), + ), hintText: "Please enter 10 digit phone", hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), contentPadding: EdgeInsets.all(0.0), @@ -128,7 +137,10 @@ class _FamilyMemberAddState extends State { children: [ TextFormField( decoration: InputDecoration( - label: Text("Aadhaar Number",style: GoogleFonts.poppins(color: colors.darkHintColor),), + label: Text( + "Aadhaar Number", + style: GoogleFonts.poppins(color: colors.darkHintColor), + ), hintText: "Please enter 12 digit Aadhaar", hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), contentPadding: EdgeInsets.all(0.0), @@ -193,7 +205,10 @@ class _FamilyMemberAddState extends State { ), TextFormField( decoration: InputDecoration( - label: Text("Income/Day",style: GoogleFonts.poppins(color: colors.darkHintColor),), + label: Text( + "Income/Day", + style: GoogleFonts.poppins(color: colors.darkHintColor), + ), hintText: "Please enter income per day", hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), contentPadding: EdgeInsets.all(0.0), @@ -210,7 +225,10 @@ class _FamilyMemberAddState extends State { //TODO: Add work timings TextFormField( decoration: InputDecoration( - label: Text("Income/Month",style: GoogleFonts.poppins(color: colors.darkHintColor),), + label: Text( + "Income/Month", + style: GoogleFonts.poppins(color: colors.darkHintColor), + ), hintText: "Please enter income per month", hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), contentPadding: EdgeInsets.all(0.0), @@ -224,13 +242,13 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( - options: [ - ["Eligible", "eligible"], - ["Eligible, receiving", "eligible_receiving"], - ["Not eligible", "not_eligible"] - ], - title: 'Old age pension', - ), + options: [ + ["Eligible", "eligible"], + ["Eligible, receiving", "eligible_receiving"], + ["Not eligible", "not_eligible"] + ], + title: 'Old age pension', + ), ), OptionsWidget( options: [ @@ -249,9 +267,51 @@ class _FamilyMemberAddState extends State { title: 'Marital Status', ), ), - TextFormField( - //TODO: Replace with a custom widget - decoration: InputDecoration(label: Text('Special Skills')), + TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), + ), + textFieldStyler: TextFieldStyler( + hintText: "Tags", + isDense: false, + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.length > 15) { + return "hey that is too much"; + } else if (tag.isEmpty) { + return "enter something"; + } + + return null; + }, ), ]), Column( diff --git a/pubspec.lock b/pubspec.lock index 16a9195..2d735d3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -371,6 +371,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.2" + textfield_tags: + dependency: "direct main" + description: + name: textfield_tags + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.2" typed_data: dependency: transitive description: From f92f2229a51c84908764a8b029347b5dc9d79b33 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 27 Nov 2021 06:03:50 +0530 Subject: [PATCH 052/264] Theme updates --- lib/Screens/FamilyMemberAdd.dart | 35 ++++++++++++++++------------- lib/Utils/Colors.dart | 3 ++- lib/Utils/DarkTheme.dart | 10 ++++++--- lib/Widgets/DropDownFormField.dart | 15 ++++++++----- lib/Widgets/OptionsFormWidget.dart | 2 +- lib/Widgets/PageViewContentBox.dart | 2 +- 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 85fac1e..edc50d7 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:gender_picker/gender_picker.dart'; import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; @@ -48,14 +49,15 @@ class _FamilyMemberAddState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( //isDense: true, label: Text( "Name", - style: GoogleFonts.poppins(color: colors.darkHintColor), + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), hintText: "Please enter name", - hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -109,14 +111,15 @@ class _FamilyMemberAddState extends State { errorField: "Please choose a qualification", ), TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, keyboardType: TextInputType.number, decoration: InputDecoration( label: Text( "Phone Number", - style: GoogleFonts.poppins(color: colors.darkHintColor), + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), hintText: "Please enter 10 digit phone", - hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -136,13 +139,14 @@ class _FamilyMemberAddState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( "Aadhaar Number", - style: GoogleFonts.poppins(color: colors.darkHintColor), + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), hintText: "Please enter 12 digit Aadhaar", - hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -204,13 +208,14 @@ class _FamilyMemberAddState extends State { }, ), TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( "Income/Day", - style: GoogleFonts.poppins(color: colors.darkHintColor), + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), hintText: "Please enter income per day", - hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -224,13 +229,14 @@ class _FamilyMemberAddState extends State { Column(children: [ //TODO: Add work timings TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( "Income/Month", - style: GoogleFonts.poppins(color: colors.darkHintColor), + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), hintText: "Please enter income per month", - hintStyle: GoogleFonts.poppins(color: colors.darkHintColor), + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -291,8 +297,8 @@ class _FamilyMemberAddState extends State { fontWeight: FontWeight.normal, color: Colors.black), ), textFieldStyler: TextFieldStyler( - hintText: "Tags", - isDense: false, + hintText: "Special Skills", + isDense: true, textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), @@ -304,12 +310,9 @@ class _FamilyMemberAddState extends State { //create a list and store value to list }, validator: (String tag) { - if (tag.length > 15) { - return "hey that is too much"; - } else if (tag.isEmpty) { + if (tag.isEmpty) { return "enter something"; } - return null; }, ), diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index 3857f0d..642a8c4 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -5,4 +5,5 @@ var darkAccentColor = Color(0xffe9644c); var darkPrimaryTextColor = Colors.white; var darkSecondAccentColor = Color(0xffFADDB6); var lightPrimaryTextColor = Colors.black; -var darkHintColor = Colors.black87; \ No newline at end of file +var darkHintColor = Colors.black87; +var darkSecondBackgroundColor = Color(0xff38363b); \ No newline at end of file diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 0b713dd..3a28be8 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -1,10 +1,12 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:textfield_tags/textfield_tags.dart'; class darkTheme{ static ThemeData get DarkTheme{ return ThemeData( + fontFamily: 'Poppins', primaryColor: Colors.white, scaffoldBackgroundColor: Color(0xff1B0000), textTheme: TextTheme( @@ -23,11 +25,13 @@ class darkTheme{ ), inputDecorationTheme: InputDecorationTheme( contentPadding: EdgeInsets.all(10), - labelStyle: GoogleFonts.poppins(), - floatingLabelStyle: GoogleFonts.poppins(color: colors.darkScaffoldColor), + labelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + floatingLabelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: colors.darkAccentColor)), - hintStyle: GoogleFonts.poppins(), + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), + ); + } } \ No newline at end of file diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 9740849..2291be4 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class DropDownFormField extends FormField { DropDownFormField( @@ -32,19 +33,22 @@ class DropDownFormField extends FormField { padding: EdgeInsets.only(bottom: 20), child: Text(title, style: GoogleFonts.montserrat( - fontSize: 25, color: Colors.black)), + fontSize: 25, color: colors.darkPrimaryTextColor)), ), Card( + color: colors.darkScaffoldColor, elevation: 10, margin: EdgeInsets.only(bottom: 4), child: DropdownButtonHideUnderline( child: DropdownButton( + dropdownColor: colors.darkScaffoldColor, value: state.value, isExpanded: true, items: list.map((value) { return DropdownMenuItem( value: value, child: Container( + color: colors.darkScaffoldColor, child: Text( value, overflow: TextOverflow.ellipsis, @@ -57,19 +61,20 @@ class DropDownFormField extends FormField { state.didChange(newValue); }, hint: Container( + color: colors.darkScaffoldColor, padding: EdgeInsets.all(8), child: Text( hint, overflow: TextOverflow.ellipsis, - style: TextStyle( + style: GoogleFonts.poppins( color: state.hasError ? Colors.red : Colors.grey), textAlign: TextAlign.end, ), ), - style: TextStyle( - color: Colors.black, decorationColor: Colors.red), + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor, decorationColor: Colors.red), ), ), ), @@ -78,7 +83,7 @@ class DropDownFormField extends FormField { padding: EdgeInsets.all(10), child: Text( state.errorText ?? "error", - style: TextStyle(color: Colors.red, fontSize: 10), + style: GoogleFonts.poppins(color: Colors.red, fontSize: 10), ), ) : Container() diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index b5ac2ec..7fbd406 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -47,7 +47,7 @@ class OptionsWidget extends FormField { child: state.hasError ? Text( state.errorText ?? "error", - style: TextStyle(color: Colors.red, fontSize: 10), + style: GoogleFonts.poppins(color: Colors.red, fontSize: 10), ) : Container(), ) diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index b3a160c..c34e5d2 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -14,7 +14,7 @@ class PageViewContentBox extends StatelessWidget { padding: EdgeInsets.all(20), child: Container( decoration: BoxDecoration( - color: colors.darkSecondAccentColor, + color: colors.darkSecondBackgroundColor, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( From 323418ad0f6af334a37fddeafdc1c9b5fc56dec0 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 27 Nov 2021 06:13:46 +0530 Subject: [PATCH 053/264] Fixed black text on dark background issues --- lib/Widgets/DatePickerWidget.dart | 4 +++- lib/Widgets/DropDownFormField.dart | 2 +- lib/Widgets/OptionsFormWidget.dart | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index dc1da69..0a60fae 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class DatePickerWidget extends FormField { DatePickerWidget( @@ -42,9 +43,10 @@ class DatePickerWidget extends FormField { padding: EdgeInsets.only(bottom: 8), child: Text(title ?? 'Choose date', style: GoogleFonts.montserrat( - fontSize: 20, color: Colors.black)), + fontSize: 20, color: Colors.white)), ), Card( + color: colors.darkScaffoldColor, elevation: 6, margin: EdgeInsets.only(bottom: 4), child: InkWell( diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 2291be4..2aa0641 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -33,7 +33,7 @@ class DropDownFormField extends FormField { padding: EdgeInsets.only(bottom: 20), child: Text(title, style: GoogleFonts.montserrat( - fontSize: 25, color: colors.darkPrimaryTextColor)), + fontSize: 15, color: colors.darkPrimaryTextColor)), ), Card( color: colors.darkScaffoldColor, diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 7fbd406..cb84642 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -32,7 +32,7 @@ class OptionsWidget extends FormField { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.lightPrimaryTextColor),), + Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.darkPrimaryTextColor),), Wrap( children: options .map((e) => new OptionButton( From 09bfd55b3b929df75d3bd50b5e46b3ba6a42b960 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 27 Nov 2021 06:58:15 +0530 Subject: [PATCH 054/264] Replaced textfields with tagtextfields --- lib/Screens/FamilyMemberAdd.dart | 160 +++++++++++++++++++++++++++---- 1 file changed, 140 insertions(+), 20 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index edc50d7..3160821 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -81,10 +81,10 @@ class _FamilyMemberAddState extends State { verticalAlignedText: false, selectedGender: Gender.Male, selectedGenderTextStyle: TextStyle( - color: colors.darkScaffoldColor, + color: colors.darkAccentColor, fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( - color: colors.lightPrimaryTextColor, + color: colors.darkPrimaryTextColor, fontWeight: FontWeight.normal), onChanged: (Gender? gender) { print(gender); @@ -276,6 +276,7 @@ class _FamilyMemberAddState extends State { TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), tagsStyler: TagsStyler( showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), @@ -311,7 +312,7 @@ class _FamilyMemberAddState extends State { }, validator: (String tag) { if (tag.isEmpty) { - return "enter something"; + return "Enter a value"; } return null; }, @@ -319,25 +320,143 @@ class _FamilyMemberAddState extends State { ]), Column( children: [ - TextFormField( - //TODO: Replace with a custom widget - decoration: InputDecoration(label: Text('Frequent ailments')), + TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), + ), + textFieldStyler: TextFieldStyler( + hintText: "Frequent Ailments", + isDense: true, + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, ), SizedBox( height: 20, ), - TextFormField( - //TODO: Replace with a custom widget - decoration: - InputDecoration(label: Text('Communicable Diseases')), + TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), + ), + textFieldStyler: TextFieldStyler( + hintText: "Communicable diseases", + isDense: true, + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, ), SizedBox( height: 20, ), - TextFormField( - //TODO? Replace with a custom widget - decoration: - InputDecoration(label: Text('Non Communicable Diseases')), + TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), + ), + textFieldStyler: TextFieldStyler( + hintText: "Non communicable diseases", + isDense: true, + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, ), Padding( padding: const EdgeInsets.all(20.0), @@ -356,6 +475,13 @@ class _FamilyMemberAddState extends State { ], title: 'Aware about Anganwadi services?', ), + + //TODO: Display next widget only if the previous widget is true + //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog + ], + ), + Column( + children: [ Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( @@ -366,12 +492,6 @@ class _FamilyMemberAddState extends State { title: 'Using any Anganwadi services?', ), ), - //TODO: Display next widget only if the previous widget is true - //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog - ], - ), - Column( - children: [ //TODO: Add a checkbox dialog for PHC services utilised //TODO: Add a checkbox dialog for private heath clinic facilities used TextFormField( From 1da422bf0bed869bf344c02a1f0a7892d4a865c4 Mon Sep 17 00:00:00 2001 From: nirmal Date: Fri, 17 Dec 2021 10:46:03 +0530 Subject: [PATCH 055/264] Changed textcolor in textfieldtags widgets --- lib/Screens/FamilyMemberAdd.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 3160821..b072ddc 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -300,10 +300,12 @@ class _FamilyMemberAddState extends State { textFieldStyler: TextFieldStyler( hintText: "Special Skills", isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), ), + onDelete: (tag) { //remove value from list }, @@ -347,6 +349,7 @@ class _FamilyMemberAddState extends State { textFieldStyler: TextFieldStyler( hintText: "Frequent Ailments", isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), @@ -394,6 +397,7 @@ class _FamilyMemberAddState extends State { textFieldStyler: TextFieldStyler( hintText: "Communicable diseases", isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), @@ -441,6 +445,7 @@ class _FamilyMemberAddState extends State { textFieldStyler: TextFieldStyler( hintText: "Non communicable diseases", isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), From 979fd27698744ca643052a3b09c31d4feba60772 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Wed, 22 Dec 2021 00:01:06 +0530 Subject: [PATCH 056/264] Added widget for adding/removing content called AddRemoveBoxWidget --- ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- lib/Widgets/AddRemoveBoxWidget.dart | 86 +++++++++++++++++++ pubspec.lock | 10 +-- 4 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 lib/Widgets/AddRemoveBoxWidget.dart diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 16e112c..2a2ed1b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ @@ -127,7 +127,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140c..3db53b6 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ _AddRemoveBoxWidgetState(); +} + +class _AddRemoveBoxWidgetState extends State { + var listOfElements = []; + + @override + Widget build(BuildContext context) { + + return + Card( + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Add New User Information", + style: GoogleFonts.montserrat( + fontSize: 18, color: Colors.black)), + IconButton(onPressed: (){ + setState(() { + listOfElements.add(new IndividualUserData()); + }); + }, icon: Icon( + Icons.add + )) + ], + ), + ListView.builder( + itemCount: listOfElements.length, + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Card( + child: ListTile( + onTap: (){ + var obj = listOfElements[index]; //Modify this object + }, //Pass a function which is called onSaved in the next page and add data to the class object + leading: Icon(Icons.person), + title: Text("User ${index + 1}"), + trailing: IconButton( + color: Colors.red, + icon: Icon(Icons.close), + onPressed: () { + setState(() { + listOfElements.removeAt(index); + }); + }, + ), + ), + ); + }), + ], + ), + ), + ), + ); + } +} + + diff --git a/pubspec.lock b/pubspec.lock index 2d735d3..7074eab 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -21,7 +21,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -211,7 +211,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -370,7 +370,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" textfield_tags: dependency: "direct main" description: @@ -391,7 +391,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" win32: dependency: transitive description: From 1b652722e5aad71a9230147e11fc6308092bcbbc Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Wed, 22 Dec 2021 23:01:22 +0530 Subject: [PATCH 057/264] Fixed scrollview in AddRemoveBoxWidget.dart --- lib/Screens/FamilyHomeScreen.dart | 2 + lib/Screens/FamilyMemberAdd.dart | 2 +- lib/Widgets/AddRemoveBoxWidget.dart | 107 +++++++++++++++------------- test/widget_test.dart | 3 +- 4 files changed, 63 insertions(+), 51 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index d0e55aa..b92f67b 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; class FamilyHomeScreen extends StatelessWidget { @@ -13,6 +14,7 @@ class FamilyHomeScreen extends StatelessWidget { body: SafeArea( child: Column( children: [ + AddRemoveBoxWidget(), TextButton(onPressed: (){ Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); }, child: Text('Add member')), diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index b072ddc..065eae2 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -81,7 +81,7 @@ class _FamilyMemberAddState extends State { verticalAlignedText: false, selectedGender: Gender.Male, selectedGenderTextStyle: TextStyle( - color: colors.darkAccentColor, + color: Colors.greenAccent, fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( color: colors.darkPrimaryTextColor, diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 7479d27..ebc87c5 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; /** @@ -27,58 +28,66 @@ class _AddRemoveBoxWidgetState extends State { Widget build(BuildContext context) { return - Card( - child: SingleChildScrollView( - child: Padding( + Container( + height: MediaQuery.of(context).size.height*0.70, + color: colors.darkScaffoldColor, + child: Padding( padding: EdgeInsets.all(10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("Add New User Information", - style: GoogleFonts.montserrat( - fontSize: 18, color: Colors.black)), - IconButton(onPressed: (){ - setState(() { - listOfElements.add(new IndividualUserData()); - }); - }, icon: Icon( - Icons.add - )) - ], - ), - ListView.builder( - itemCount: listOfElements.length, - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return Card( - child: ListTile( - onTap: (){ - var obj = listOfElements[index]; //Modify this object - }, //Pass a function which is called onSaved in the next page and add data to the class object - leading: Icon(Icons.person), - title: Text("User ${index + 1}"), - trailing: IconButton( - color: Colors.red, - icon: Icon(Icons.close), - onPressed: () { - setState(() { - listOfElements.removeAt(index); - }); - }, - ), - ), - ); - }), - ], + child: Container( + color: colors.darkScaffoldColor, + height: MediaQuery.of(context).size.height*0.46, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Add New User Information", + style: GoogleFonts.poppins( + fontSize: 18, color: colors.darkSecondAccentColor)), + IconButton(onPressed: (){ + setState(() { + listOfElements.add(new IndividualUserData()); + }); + }, icon: Icon( + Icons.add, + color: colors.darkAccentColor, + )) + ], + ), + Container( + height: MediaQuery.of(context).size.height*0.60, + child: ListView.builder( + itemCount: listOfElements.length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Card( + color: colors.darkSecondAccentColor, + child: ListTile( + onTap: (){ + var obj = listOfElements[index]; //Modify this object + }, //Pass a function which is called onSaved in the next page and add data to the class object + leading: Icon(Icons.person), + title: Text("User ${index + 1}"), + trailing: IconButton( + color: Colors.red, + icon: Icon(Icons.close), + onPressed: () { + setState(() { + listOfElements.removeAt(index); + }); + }, + ), + ), + ); + }), + ), + ], ), + ), ), - ), ); } } diff --git a/test/widget_test.dart b/test/widget_test.dart index b2262ff..591231f 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -7,13 +7,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); + await tester.pumpWidget((Login())); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); From 07538285e23b1ffa4ce1c642a8b40e28f59187ca Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 24 Dec 2021 10:23:23 +0530 Subject: [PATCH 058/264] Updated themes, added roundedDatePicker --- lib/Screens/FamilyDetails.dart | 4 ++-- lib/Screens/FamilyHomeScreen.dart | 5 +++-- lib/Screens/FamilyMemberAdd.dart | 1 + lib/Screens/Home.dart | 12 ++++++------ lib/Utils/Colors.dart | 9 +++++---- lib/Widgets/AddRemoveBoxWidget.dart | 9 +++++---- lib/Widgets/DataCard.dart | 10 +++++----- lib/Widgets/DatePicker.dart | 4 +++- lib/Widgets/DatePickerWidget.dart | 4 +++- lib/Widgets/FormPageView.dart | 3 ++- lib/Widgets/OptionsFormWidget.dart | 8 ++++---- pubspec.lock | 17 ++++++++++++----- pubspec.yaml | 1 + 13 files changed, 52 insertions(+), 35 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 581e48a..36a14ed 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -3,7 +3,7 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; -import 'package:geo_spatial/Utils/DarkTheme.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key}) : super(key: key); @@ -27,7 +27,7 @@ class _FamilyDetailsState extends State { Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, - backgroundColor: Colors.white, + backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Family Details'), body: SizedBox( height: MediaQuery.of(context).size.height - diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index b92f67b..e1eedc8 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -17,8 +17,9 @@ class FamilyHomeScreen extends StatelessWidget { AddRemoveBoxWidget(), TextButton(onPressed: (){ Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); - }, child: Text('Add member')), - DataCard("Collect common details","","",FamilyDetails(),colors.darkSecondAccentColor,colors.darkSecondAccentColor) + }, child: Text('Add Member')), + DataCard("\nCollect Common Details","","",FamilyDetails(),Color(0xfff54b64), + Color(0xfff78361)) , ], ), diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 065eae2..5b01ce8 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -4,6 +4,7 @@ import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/DatePicker.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 67c9104..800694c 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -64,22 +64,22 @@ class _HomeWidgetState extends State { 'Individual data entry for everyone in home', 'assets/svg/female.svg', FamilyHomeScreen(), - colors.darkSecondAccentColor, - colors.darkSecondAccentColor), + Color(0xfff54b64), + Color(0xfff78361)), DataCard( 'Community Details', 'Data entry for communities', 'assets/svg/house.svg', CommunityDataCollection(), - colors.darkSecondAccentColor, - colors.darkSecondAccentColor), + Color(0xfff54b64), + Color(0xfff78361)), DataCard( 'View saved data', 'View all data saved in local storage', 'assets/svg/storage_image.svg', IndividualDataCollection(), - colors.darkSecondAccentColor, - colors.darkSecondAccentColor), + Color(0xfff54b64), + Color(0xfff78361)), ], ), ), diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index 642a8c4..237b995 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; -var darkScaffoldColor = Color(0xff333034); -var darkAccentColor = Color(0xffe9644c); +var darkScaffoldColor = Color(0xff202330); +var darkAccentColor = Color(0xffFF7D7E); var darkPrimaryTextColor = Colors.white; -var darkSecondAccentColor = Color(0xffFADDB6); +var darkSecondAccentColor = Color(0xff4E596F); var lightPrimaryTextColor = Colors.black; var darkHintColor = Colors.black87; -var darkSecondBackgroundColor = Color(0xff38363b); \ No newline at end of file +var darkSecondBackgroundColor = Color(0xff34384c); + diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index ebc87c5..cc83875 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -46,7 +46,7 @@ class _AddRemoveBoxWidgetState extends State { children: [ Text("Add New User Information", style: GoogleFonts.poppins( - fontSize: 18, color: colors.darkSecondAccentColor)), + fontSize: 18, color: colors.darkAccentColor)), IconButton(onPressed: (){ setState(() { listOfElements.add(new IndividualUserData()); @@ -57,6 +57,7 @@ class _AddRemoveBoxWidgetState extends State { )) ], ), + SizedBox(height: 15,), Container( height: MediaQuery.of(context).size.height*0.60, child: ListView.builder( @@ -64,15 +65,15 @@ class _AddRemoveBoxWidgetState extends State { shrinkWrap: true, itemBuilder: (BuildContext context, int index) { return Card( - color: colors.darkSecondAccentColor, + color: colors.darkAccentColor, child: ListTile( onTap: (){ var obj = listOfElements[index]; //Modify this object }, //Pass a function which is called onSaved in the next page and add data to the class object leading: Icon(Icons.person), - title: Text("User ${index + 1}"), + title: Text("User ${index + 1}",style: GoogleFonts.poppins(color: Colors.white,fontWeight: FontWeight.w400,fontSize: 20),), trailing: IconButton( - color: Colors.red, + color: colors.darkSecondAccentColor, icon: Icon(Icons.close), onPressed: () { setState(() { diff --git a/lib/Widgets/DataCard.dart b/lib/Widgets/DataCard.dart index 7eff442..7eced43 100644 --- a/lib/Widgets/DataCard.dart +++ b/lib/Widgets/DataCard.dart @@ -24,8 +24,8 @@ class DataCard extends StatelessWidget { borderRadius: BorderRadius.circular(20), gradient: LinearGradient( colors: [startingColor, endingColor], - begin: Alignment.centerLeft, - end: Alignment.centerRight, + begin: Alignment.bottomLeft, + end: Alignment.topRight, ), boxShadow: [ BoxShadow( @@ -64,10 +64,10 @@ class DataCard extends StatelessWidget { children: [ Text(heading, style: GoogleFonts.montserrat( - fontSize: 25, color: colors.lightPrimaryTextColor)), + fontSize: 25, color: colors.darkPrimaryTextColor)), Text(subHeading, style: GoogleFonts.montserrat( - fontSize: 15, color: colors.lightPrimaryTextColor)) + fontSize: 15, color: colors.darkPrimaryTextColor)) ], ), ), @@ -78,7 +78,7 @@ class DataCard extends StatelessWidget { padding: EdgeInsets.only(top: 8.0, bottom: 8.0, right: 8.0), child: SvgPicture.asset('assets/svg/right-icon-arrow.svg', - color: colors.lightPrimaryTextColor), + color: colors.darkPrimaryTextColor), ), flex: 1, ), diff --git a/lib/Widgets/DatePicker.dart b/lib/Widgets/DatePicker.dart index 732957d..85fcb29 100644 --- a/lib/Widgets/DatePicker.dart +++ b/lib/Widgets/DatePicker.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:table_calendar/table_calendar.dart'; +import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart'; class DatePicker extends StatefulWidget { @@ -53,11 +54,12 @@ class _DatePickerState extends State { Future pickDate(BuildContext context) async { final initialDate = DateTime.now(); - final newDate = await showDatePicker( + final newDate = await showRoundedDatePicker( context: context, initialDate: initialDate, firstDate: DateTime(1900), lastDate: DateTime.now(), initialDatePickerMode: DatePickerMode.year, + borderRadius: 16 ); if (newDate == null) return; diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index 0a60fae..e8dbcae 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart'; class DatePickerWidget extends FormField { DatePickerWidget( @@ -24,12 +25,13 @@ class DatePickerWidget extends FormField { builder: (FormFieldState state) { Future pickDate(BuildContext context) async { final initialDate = state.value ?? DateTime.now(); - final newDate = await showDatePicker( + final newDate = await showRoundedDatePicker( context: context, initialDate: initialDate, firstDate: DateTime(1900), lastDate: DateTime.now(), initialDatePickerMode: DatePickerMode.year, + borderRadius: 16 ); if (newDate != null) state.didChange(newDate); diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 2be9106..3742978 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:geo_spatial/Utils/DarkTheme.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; import 'PageViewContentBox.dart'; @@ -90,6 +90,7 @@ class _FormPageViewState extends State { @override Widget build(BuildContext context) { return Container( + color: colors.darkScaffoldColor, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index cb84642..2d03b5f 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -29,8 +29,8 @@ class OptionsWidget extends FormField { autovalidateMode: autoValidateMode, builder: (FormFieldState state) { return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.darkPrimaryTextColor),), Wrap( @@ -82,10 +82,10 @@ class OptionButton extends StatelessWidget { ? Colors.greenAccent : isError ? Color(0xffF1D8B8) - : Color(0xfff6a1a1)), + : Color(0xffE25963)), shape: MaterialStateProperty.all( RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20)), + borderRadius: BorderRadius.all(Radius.circular(5)), side: isError ? BorderSide(color: Colors.red) : BorderSide.none))), diff --git a/pubspec.lock b/pubspec.lock index 7074eab..9c14bec 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.8.1" boolean_selector: dependency: transitive description: @@ -21,7 +21,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.1.0" charcode: dependency: transitive description: @@ -104,6 +104,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + flutter_rounded_date_picker: + dependency: "direct main" + description: + name: flutter_rounded_date_picker + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" flutter_secure_storage: dependency: "direct main" description: @@ -211,7 +218,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.10" meta: dependency: transitive description: @@ -370,7 +377,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.2" textfield_tags: dependency: "direct main" description: @@ -391,7 +398,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.0" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 438d756..e93e3e6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,6 +37,7 @@ dependencies: table_calendar: gender_picker: ^1.1.0 flutter_keyboard_visibility: ^5.1.0 + flutter_rounded_date_picker: textfield_tags: dev_dependencies: From 72acd0aa4c83076301765e64ef7a19d63fd3fba0 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 24 Dec 2021 12:36:07 +0530 Subject: [PATCH 059/264] UI fixes --- lib/Widgets/DatePickerWidget.dart | 20 +++++++++++--------- lib/Widgets/DropDownFormField.dart | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index e8dbcae..794f42a 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -24,14 +24,16 @@ class DatePickerWidget extends FormField { autovalidateMode: autoValidateMode, builder: (FormFieldState state) { Future pickDate(BuildContext context) async { - final initialDate = state.value ?? DateTime.now(); - final newDate = await showRoundedDatePicker( - context: context, - initialDate: initialDate, - firstDate: DateTime(1900), - lastDate: DateTime.now(), - initialDatePickerMode: DatePickerMode.year, - borderRadius: 16 + + final newDate = await CupertinoRoundedDatePicker.show( + context, + background: colors.darkSecondBackgroundColor, + textColor: colors.darkAccentColor, + minimumYear: 1900, + maximumDate: DateTime.now(), + maximumYear: DateTime.now().year, + initialDatePickerMode: CupertinoDatePickerMode.date, + borderRadius: 16, ); if (newDate != null) state.didChange(newDate); @@ -45,7 +47,7 @@ class DatePickerWidget extends FormField { padding: EdgeInsets.only(bottom: 8), child: Text(title ?? 'Choose date', style: GoogleFonts.montserrat( - fontSize: 20, color: Colors.white)), + fontSize: 15, color: Colors.white)), ), Card( color: colors.darkScaffoldColor, diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 2aa0641..e5e14de 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -30,7 +30,7 @@ class DropDownFormField extends FormField { mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.only(bottom: 20), + padding: EdgeInsets.only(bottom: 8), child: Text(title, style: GoogleFonts.montserrat( fontSize: 15, color: colors.darkPrimaryTextColor)), From ebb0b02a348fe00496cecbe1f74764d3fcf34a55 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 24 Dec 2021 15:24:11 +0530 Subject: [PATCH 060/264] UI fixes --- lib/Screens/FamilyMemberAdd.dart | 454 ++++++++++++++++-------------- lib/Utils/DarkTheme.dart | 5 +- lib/Widgets/DatePickerWidget.dart | 108 +++---- 3 files changed, 301 insertions(+), 266 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 5b01ce8..f645be5 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -49,25 +49,28 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - TextFormField( - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - //isDense: true, - label: Text( - "Name", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + //isDense: true, + label: Text( + "Name", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + hintText: "Please enter name", + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + contentPadding: EdgeInsets.all(0.0), ), - hintText: "Please enter name", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - contentPadding: EdgeInsets.all(0.0), + validator: (value) { + if (value == "") { + return "Please enter a name"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, ), - validator: (value) { - if (value == "") { - return "Please enter a name"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, ), DatePickerWidget( context: context, @@ -111,27 +114,30 @@ class _FamilyMemberAddState extends State { title: "Educational qualification", errorField: "Please choose a qualification", ), - TextFormField( - style: darkTheme.DarkTheme.textTheme.bodyText2, - keyboardType: TextInputType.number, - decoration: InputDecoration( - label: Text( - "Phone Number", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, + keyboardType: TextInputType.number, + decoration: InputDecoration( + label: Text( + "Phone Number", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + hintText: "Please enter 10 digit phone", + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + contentPadding: EdgeInsets.all(0.0), ), - hintText: "Please enter 10 digit phone", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - contentPadding: EdgeInsets.all(0.0), + validator: (value) { + if (value == "") { + return "Please enter a value"; + } else if (value!.length != 10) { + return "Enter a valid number"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, ), - validator: (value) { - if (value == "") { - return "Please enter a value"; - } else if (value!.length != 10) { - return "Enter a valid number"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, ), ], ), @@ -139,26 +145,29 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - TextFormField( - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Aadhaar Number", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Aadhaar Number", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + hintText: "Please enter 12 digit Aadhaar", + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + contentPadding: EdgeInsets.all(0.0), ), - hintText: "Please enter 12 digit Aadhaar", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - contentPadding: EdgeInsets.all(0.0), + validator: (value) { + if (value == "") { + return "Enter 12 digit Aadhaar"; + } else if (value!.length != 12) { + return "Enter a valid Aadhaar"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.always, ), - validator: (value) { - if (value == "") { - return "Enter 12 digit Aadhaar"; - } else if (value!.length != 12) { - return "Enter a valid Aadhaar"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.always, ), DropDownFormField( //TODO: Replace with a CheckBoxListTile @@ -208,43 +217,49 @@ class _FamilyMemberAddState extends State { print(val.toString()); }, ), - TextFormField( + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Income/Day", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + hintText: "Please enter income per day", + hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + contentPadding: EdgeInsets.all(0.0), + ), + validator: (value) { + if (value == "") { + return "Enter Income/Day"; + } + }, + ), + ) + ], + ), + Column(children: [ + //TODO: Add work timings + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( - "Income/Day", + "Income/Month", style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - hintText: "Please enter income per day", + hintText: "Please enter income per month", hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { if (value == "") { - return "Enter Income/Day"; + return "Enter Income/Month"; } }, - ) - ], - ), - Column(children: [ - //TODO: Add work timings - TextFormField( - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Month", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - ), - hintText: "Please enter income per month", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - contentPadding: EdgeInsets.all(0.0), ), - validator: (value) { - if (value == "") { - return "Enter Income/Month"; - } - }, ), Padding( padding: const EdgeInsets.all(20.0), @@ -274,56 +289,9 @@ class _FamilyMemberAddState extends State { title: 'Marital Status', ), ), - TextFieldTags( - //initialTags: ["better", "lovely"], - textSeparators: [" ", ".", ","], - scrollableTagsPadding: EdgeInsets.all(10), - tagsStyler: TagsStyler( - showHashtag: false, - tagMargin: const EdgeInsets.only(right: 4.0), - tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), - tagPadding: EdgeInsets.only( - top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), - tagDecoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.grey.shade300, - ), - borderRadius: const BorderRadius.all( - Radius.circular(20.0), - ), - ), - tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: Colors.black), - ), - textFieldStyler: TextFieldStyler( - hintText: "Special Skills", - isDense: true, - textStyle: GoogleFonts.poppins(color: Colors.white), - textFieldBorder: UnderlineInputBorder( - borderSide: BorderSide(color: Colors.black, width: 1.0), - ), - ), - - onDelete: (tag) { - //remove value from list - }, - onTag: (tag) { - //create a list and store value to list - }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, - ), - ]), - Column( - children: [ - TextFieldTags( + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], scrollableTagsPadding: EdgeInsets.all(10), @@ -331,7 +299,7 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), + Icon(Icons.cancel, size: 15.0, color: Colors.black), tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), @@ -348,13 +316,14 @@ class _FamilyMemberAddState extends State { fontWeight: FontWeight.normal, color: Colors.black), ), textFieldStyler: TextFieldStyler( - hintText: "Frequent Ailments", + hintText: "Special Skills", isDense: true, textStyle: GoogleFonts.poppins(color: Colors.white), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), ), + onDelete: (tag) { //remove value from list }, @@ -368,101 +337,159 @@ class _FamilyMemberAddState extends State { return null; }, ), + ), + ]), + Column( + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), + ), + textFieldStyler: TextFieldStyler( + hintText: "Frequent Ailments", + isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, + ), + ), SizedBox( height: 20, ), - TextFieldTags( - //initialTags: ["better", "lovely"], - textSeparators: [" ", ".", ","], - scrollableTagsPadding: EdgeInsets.all(10), - tagsStyler: TagsStyler( - showHashtag: false, - tagMargin: const EdgeInsets.only(right: 4.0), - tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), - tagPadding: EdgeInsets.only( - top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), - tagDecoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.grey.shade300, - ), - borderRadius: const BorderRadius.all( - Radius.circular(20.0), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), ), - tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: Colors.black), - ), - textFieldStyler: TextFieldStyler( - hintText: "Communicable diseases", - isDense: true, - textStyle: GoogleFonts.poppins(color: Colors.white), - textFieldBorder: UnderlineInputBorder( - borderSide: BorderSide(color: Colors.black, width: 1.0), + textFieldStyler: TextFieldStyler( + hintText: "Communicable diseases", + isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, ), - onDelete: (tag) { - //remove value from list - }, - onTag: (tag) { - //create a list and store value to list - }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, ), SizedBox( height: 20, ), - TextFieldTags( - //initialTags: ["better", "lovely"], - textSeparators: [" ", ".", ","], - scrollableTagsPadding: EdgeInsets.all(10), - tagsStyler: TagsStyler( - showHashtag: false, - tagMargin: const EdgeInsets.only(right: 4.0), - tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), - tagPadding: EdgeInsets.only( - top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), - tagDecoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.grey.shade300, - ), - borderRadius: const BorderRadius.all( - Radius.circular(20.0), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), ), - tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: Colors.black), - ), - textFieldStyler: TextFieldStyler( - hintText: "Non communicable diseases", - isDense: true, - textStyle: GoogleFonts.poppins(color: Colors.white), - textFieldBorder: UnderlineInputBorder( - borderSide: BorderSide(color: Colors.black, width: 1.0), + textFieldStyler: TextFieldStyler( + hintText: "Non communicable diseases", + isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, ), - onDelete: (tag) { - //remove value from list - }, - onTag: (tag) { - //create a list and store value to list - }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, ), Padding( padding: const EdgeInsets.all(20.0), @@ -500,8 +527,11 @@ class _FamilyMemberAddState extends State { ), //TODO: Add a checkbox dialog for PHC services utilised //TODO: Add a checkbox dialog for private heath clinic facilities used - TextFormField( - decoration: InputDecoration(label: Text('Why private?')), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + decoration: InputDecoration(label: Text('Why private?')), + ), ), OptionsWidget(options: [ ['Yes', 'yes'], diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 3a28be8..2e89120 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -1,14 +1,13 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; -import 'package:textfield_tags/textfield_tags.dart'; class darkTheme{ static ThemeData get DarkTheme{ return ThemeData( fontFamily: 'Poppins', primaryColor: Colors.white, - scaffoldBackgroundColor: Color(0xff1B0000), + scaffoldBackgroundColor: colors.darkScaffoldColor, textTheme: TextTheme( headline1: GoogleFonts.poppins(color: Colors.white, fontSize: 40,fontWeight: FontWeight.w200), bodyText1: GoogleFonts.poppins(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w100), @@ -24,7 +23,7 @@ class darkTheme{ ) ), inputDecorationTheme: InputDecorationTheme( - contentPadding: EdgeInsets.all(10), + contentPadding: EdgeInsets.only(left:10,right:10), labelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), floatingLabelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: colors.darkAccentColor)), diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index 794f42a..d6fcf3e 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -34,65 +34,71 @@ class DatePickerWidget extends FormField { maximumYear: DateTime.now().year, initialDatePickerMode: CupertinoDatePickerMode.date, borderRadius: 16, + onDateTimeChanged: (date){ + + } ); if (newDate != null) state.didChange(newDate); } - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.only(bottom: 8), - child: Text(title ?? 'Choose date', - style: GoogleFonts.montserrat( - fontSize: 15, color: Colors.white)), - ), - Card( - color: colors.darkScaffoldColor, - elevation: 6, - margin: EdgeInsets.only(bottom: 4), - child: InkWell( - onTap: () { - pickDate(context); - }, - child: Padding( - padding: EdgeInsets.only( - left: 8, right: 8, top: 15, bottom: 15), - child: Row( - children: [ - Padding( - padding: EdgeInsets.only(right: 20, left: 10), - child: Icon(Icons.calendar_today), - ), - Expanded( - flex: 1, - child: Text( - state.value == null - ? hint - : '${state.value!.day} / ${state.value!.month} / ${state.value!.year}', - style: GoogleFonts.montserrat( - fontSize: 17, - color: state.hasError - ? Colors.red - : Colors.grey)), - ) - ], + return Padding( + padding: const EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 8), + child: Text(title ?? 'Choose date', + style: GoogleFonts.montserrat( + fontSize: 15, color: Colors.white)), + ), + Card( + color: colors.darkScaffoldColor, + elevation: 6, + margin: EdgeInsets.only(bottom: 4), + child: InkWell( + onTap: () { + pickDate(context); + }, + child: Padding( + padding: EdgeInsets.only( + left: 8, right: 8, top: 15, bottom: 15), + child: Row( + children: [ + Padding( + padding: EdgeInsets.only(right: 20, left: 10), + child: Icon(Icons.calendar_today), + ), + Expanded( + flex: 1, + child: Text( + state.value == null + ? hint + : '${state.value!.day} / ${state.value!.month} / ${state.value!.year}', + style: GoogleFonts.montserrat( + fontSize: 15, + color: state.hasError + ? Colors.red + : Colors.grey)), + ) + ], + ), ), ), ), - ), - state.hasError - ? Container( - padding: EdgeInsets.all(7), - child: Text( - state.errorText ?? "error", - style: TextStyle(color: Colors.red, fontSize: 10), - ), - ) - : Container() - ], + state.hasError + ? Container( + padding: EdgeInsets.all(7), + child: Text( + state.errorText ?? "error", + style: TextStyle(color: Colors.red, fontSize: 10), + ), + ) + : Container() + ], + ), ); }); } From a8d7b6d018fbefb9236ce70fed415920c461f86f Mon Sep 17 00:00:00 2001 From: Soorya S Date: Fri, 24 Dec 2021 15:51:36 +0530 Subject: [PATCH 061/264] Made changes to a few stuff --- lib/Screens/FamilyHomeScreen.dart | 2 ++ lib/Utils/DarkTheme.dart | 1 - lib/Widgets/OptionsFormWidget.dart | 18 ++++++++---------- lib/Widgets/StepCounterWidget.dart | 1 + pubspec.lock | 10 +++++----- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index e1eedc8..acc6acb 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -3,6 +3,7 @@ import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; class FamilyHomeScreen extends StatelessWidget { @@ -10,6 +11,7 @@ class FamilyHomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( + appBar: AppBarBackButton('Individual Data'), backgroundColor: colors.darkScaffoldColor, body: SafeArea( child: Column( diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 2e89120..eb41d68 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -18,7 +18,6 @@ class darkTheme{ primary: Color(0xffE9C9CC), elevation: 10.0, onPrimary: Color(0xff43282C), - side: BorderSide(color: Color(0xff43282C),width: 2,style: BorderStyle.solid), padding: EdgeInsets.all(10), ) ), diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 2d03b5f..6dc2b2e 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -29,11 +29,12 @@ class OptionsWidget extends FormField { autovalidateMode: autoValidateMode, builder: (FormFieldState state) { return Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.darkPrimaryTextColor),), Wrap( + alignment: WrapAlignment.center, children: options .map((e) => new OptionButton( text: e[0], @@ -75,27 +76,24 @@ class OptionButton extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(left: 5,right: 5,top: 10), + padding: EdgeInsets.only(left: 3, right: 3, top: 1, bottom: 1), child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(isSelected ? Colors.greenAccent : isError - ? Color(0xffF1D8B8) - : Color(0xffE25963)), + ? Color(0xffE25963) + : Color(0xffF1D8B8)), shape: MaterialStateProperty.all( RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(5)), + borderRadius: BorderRadius.all(Radius.circular(50)), side: isError ? BorderSide(color: Colors.red) : BorderSide.none))), onPressed: () { state.didChange(optionKey); }, - child: Padding( - padding: EdgeInsets.all(5), - child: Text(text), - )), + child: Text(text)), ); } } \ No newline at end of file diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index bf60383..844d0ab 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -109,6 +109,7 @@ class CheckBox extends StatelessWidget { ), margin: EdgeInsets.only(left: 3.0, right: 3.0), child: Material( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20))), color: backgroundColor, child: InkWell( onTap: () { diff --git a/pubspec.lock b/pubspec.lock index 9c14bec..c3925fd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -21,7 +21,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -218,7 +218,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -377,7 +377,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" textfield_tags: dependency: "direct main" description: @@ -398,7 +398,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" win32: dependency: transitive description: From d54e38b94adce5473a7ba551b60f169783fe80a9 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Fri, 24 Dec 2021 16:22:32 +0530 Subject: [PATCH 062/264] Added a new page for editing data --- lib/Screens/FamilyHomeScreen.dart | 6 +- lib/Screens/Home.dart | 11 +- lib/Screens/IndividualDataCollection.dart | 49 -------- lib/Widgets/AddRemoveBoxWidget.dart | 144 ++++++++++++---------- 4 files changed, 89 insertions(+), 121 deletions(-) delete mode 100644 lib/Screens/IndividualDataCollection.dart diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index acc6acb..fccde96 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -17,9 +17,9 @@ class FamilyHomeScreen extends StatelessWidget { child: Column( children: [ AddRemoveBoxWidget(), - TextButton(onPressed: (){ - Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); - }, child: Text('Add Member')), + // TextButton(onPressed: (){ + // Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); + // }, child: Text('Add Member')), DataCard("\nCollect Common Details","","",FamilyDetails(),Color(0xfff54b64), Color(0xfff78361)) , diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 800694c..1380436 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; -import 'package:geo_spatial/Screens/IndividualDataCollection.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; @@ -73,13 +72,21 @@ class _HomeWidgetState extends State { CommunityDataCollection(), Color(0xfff54b64), Color(0xfff78361)), + DataCard( + 'Edit Existing Record', + 'Edit information of an existing person', + 'assets/svg/male.svg', + CommunityDataCollection(), + Color(0xfff54b64), + Color(0xfff78361)), DataCard( 'View saved data', 'View all data saved in local storage', 'assets/svg/storage_image.svg', - IndividualDataCollection(), + CommunityDataCollection(), Color(0xfff54b64), Color(0xfff78361)), + ], ), ), diff --git a/lib/Screens/IndividualDataCollection.dart b/lib/Screens/IndividualDataCollection.dart deleted file mode 100644 index c22a5ba..0000000 --- a/lib/Screens/IndividualDataCollection.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; -import 'package:geo_spatial/Screens/FamilyMemberEdit.dart'; -import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/Widgets/DataCard.dart'; - -class IndividualDataCollection extends StatefulWidget { - IndividualDataCollection({Key? key}) : super(key: key); - - @override - _IndividualDataCollectionState createState() => - _IndividualDataCollectionState(); -} - -class _IndividualDataCollectionState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBarBackButton('Personal Data'), - body: SingleChildScrollView( - child: SizedBox( - height: MediaQuery.of(context).size.height * 0.85, - width: MediaQuery.of(context).size.width, - child: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - DataCard( - 'Add new person', - 'Enter details of a new family member', - 'assets/svg/female.svg', - FamilyMemberAdd(), - Color(0xFFF700FF), - Color(0xff3D2C8D)), - DataCard( - 'Edit existing person', - 'Edit details of an existing family member', - 'assets/svg/male.svg', - FamilyMemberEdit(), - Color(0xFF2E2FFF), - Color(0xFF4FD586)), - ], - ), - ), - ), - )); - } -} diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index cc83875..3f33f6d 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -1,18 +1,16 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; - /** * Added a dataclass * To be modified later * Add required data fields to this class */ -class IndividualUserData { - -} +class IndividualUserData {} class AddRemoveBoxWidget extends StatefulWidget { const AddRemoveBoxWidget({Key? key}) : super(key: key); @@ -26,71 +24,83 @@ class _AddRemoveBoxWidgetState extends State { @override Widget build(BuildContext context) { - - return - Container( - height: MediaQuery.of(context).size.height*0.70, - color: colors.darkScaffoldColor, - child: Padding( - padding: EdgeInsets.all(10), - child: Container( - color: colors.darkScaffoldColor, - height: MediaQuery.of(context).size.height*0.46, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text("Add New User Information", + return Container( + height: MediaQuery.of(context).size.height * 0.6, + color: colors.darkScaffoldColor, + child: Padding( + padding: EdgeInsets.all(10), + child: Container( + color: colors.darkScaffoldColor, + height: MediaQuery.of(context).size.height * 0.6, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Add New User Information", style: GoogleFonts.poppins( fontSize: 18, color: colors.darkAccentColor)), - IconButton(onPressed: (){ - setState(() { - listOfElements.add(new IndividualUserData()); - }); - }, icon: Icon( - Icons.add, - color: colors.darkAccentColor, - )) - ], - ), - SizedBox(height: 15,), - Container( - height: MediaQuery.of(context).size.height*0.60, - child: ListView.builder( - itemCount: listOfElements.length, - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return Card( - color: colors.darkAccentColor, - child: ListTile( - onTap: (){ - var obj = listOfElements[index]; //Modify this object - }, //Pass a function which is called onSaved in the next page and add data to the class object - leading: Icon(Icons.person), - title: Text("User ${index + 1}",style: GoogleFonts.poppins(color: Colors.white,fontWeight: FontWeight.w400,fontSize: 20),), - trailing: IconButton( - color: colors.darkSecondAccentColor, - icon: Icon(Icons.close), - onPressed: () { - setState(() { - listOfElements.removeAt(index); - }); - }, - ), - ), - ); - }), - ), - ], - ), - ), + IconButton( + onPressed: () { + setState(() { + listOfElements.add(new IndividualUserData()); + }); + }, + icon: Icon( + Icons.add, + color: colors.darkAccentColor, + )) + ], + ), + SizedBox( + height: 15, + ), + Container( + height: MediaQuery.of(context).size.height * 0.5, + child: ListView.builder( + itemCount: listOfElements.length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Card( + color: colors.darkAccentColor, + child: ListTile( + onTap: () { + var obj = + listOfElements[index]; //Modify this object + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FamilyMemberAdd())); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + leading: Icon(Icons.person), + title: Text( + "User ${index + 1}", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + trailing: IconButton( + color: colors.darkSecondAccentColor, + icon: Icon(Icons.close), + onPressed: () { + setState(() { + listOfElements.removeAt(index); + }); + }, + ), + ), + ); + }), + ), + ], ), - ); + ), + ), + ); } } - - From b4e331d4d521c95e48a5f9cc751ff9f3693ee4f1 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 24 Dec 2021 17:14:02 +0530 Subject: [PATCH 063/264] UI fixes --- lib/Screens/FamilyMemberAdd.dart | 168 +++++++++++++++-------------- lib/Utils/Colors.dart | 3 +- lib/Widgets/OptionsFormWidget.dart | 59 +++++----- 3 files changed, 119 insertions(+), 111 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index f645be5..cf1f559 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -4,7 +4,6 @@ import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/Widgets/DatePicker.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; @@ -57,10 +56,10 @@ class _FamilyMemberAddState extends State { //isDense: true, label: Text( "Name", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), ), hintText: "Please enter name", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -101,19 +100,6 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.all(3), size: 70, //default : 40 ), - DropDownFormField( - list: [ - 'None', - 'Elementary', - 'Secondary', - 'Higher Secondary', - 'Bachelor\'s', - 'Master\'s' - ], - hint: "Select the highest", - title: "Educational qualification", - errorField: "Please choose a qualification", - ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( @@ -122,10 +108,10 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Phone Number", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), ), hintText: "Please enter 10 digit phone", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -139,6 +125,19 @@ class _FamilyMemberAddState extends State { autovalidateMode: AutovalidateMode.always, ), ), + DropDownFormField( + list: [ + 'None', + 'Elementary', + 'Secondary', + 'Higher Secondary', + 'Bachelor\'s', + 'Master\'s' + ], + hint: "Select the highest", + title: "Educational qualification", + errorField: "Please choose a qualification", + ), ], ), Column( @@ -152,10 +151,10 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Aadhaar Number", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), ), hintText: "Please enter 12 digit Aadhaar", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -224,10 +223,10 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Income/Day", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), ), hintText: "Please enter income per day", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -248,10 +247,10 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Income/Month", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), ), hintText: "Please enter income per month", - hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -288,61 +287,61 @@ class _FamilyMemberAddState extends State { ], title: 'Marital Status', ), + ),] ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFieldTags( - //initialTags: ["better", "lovely"], - textSeparators: [" ", ".", ","], - scrollableTagsPadding: EdgeInsets.all(10), - tagsStyler: TagsStyler( - showHashtag: false, - tagMargin: const EdgeInsets.only(right: 4.0), - tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), - tagPadding: EdgeInsets.only( - top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), - tagDecoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.grey.shade300, - ), - borderRadius: const BorderRadius.all( - Radius.circular(20.0), + Column( + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), + child: TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, color: Colors.black), ), - tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: Colors.black), - ), - textFieldStyler: TextFieldStyler( - hintText: "Special Skills", - isDense: true, - textStyle: GoogleFonts.poppins(color: Colors.white), - textFieldBorder: UnderlineInputBorder( - borderSide: BorderSide(color: Colors.black, width: 1.0), + textFieldStyler: TextFieldStyler( + hintText: "Special Skills", + isDense: true, + textStyle: GoogleFonts.poppins(color: Colors.white), + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), ), - ), - onDelete: (tag) { - //remove value from list - }, - onTag: (tag) { - //create a list and store value to list - }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, + ), ), - ), - ]), - Column( - children: [ Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], @@ -393,7 +392,7 @@ class _FamilyMemberAddState extends State { height: 20, ), Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], @@ -444,7 +443,7 @@ class _FamilyMemberAddState extends State { height: 20, ), Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], @@ -501,13 +500,7 @@ class _FamilyMemberAddState extends State { title: 'Surgeries', ), ), - OptionsWidget( - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - title: 'Aware about Anganwadi services?', - ), + //TODO: Display next widget only if the previous widget is true //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog @@ -515,6 +508,13 @@ class _FamilyMemberAddState extends State { ), Column( children: [ + OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Aware about Anganwadi services?', + ), Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( @@ -528,7 +528,7 @@ class _FamilyMemberAddState extends State { //TODO: Add a checkbox dialog for PHC services utilised //TODO: Add a checkbox dialog for private heath clinic facilities used Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: const EdgeInsets.only(left: 10.0, right: 10.0,bottom: 20.0), child: TextFormField( decoration: InputDecoration(label: Text('Why private?')), ), @@ -537,6 +537,10 @@ class _FamilyMemberAddState extends State { ['Yes', 'yes'], ['No', 'no'] ], title: "Do you use any tobacco based products?"), + ], + ), + Column( + children: [ OptionsWidget(options: [ ['Yes', 'yes'], ['No', 'no'] diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index 237b995..b809c73 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -3,8 +3,9 @@ import 'package:flutter/material.dart'; var darkScaffoldColor = Color(0xff202330); var darkAccentColor = Color(0xffFF7D7E); var darkPrimaryTextColor = Colors.white; +var darkSecondaryTextColor = Colors.white24; var darkSecondAccentColor = Color(0xff4E596F); var lightPrimaryTextColor = Colors.black; var darkHintColor = Colors.black87; var darkSecondBackgroundColor = Color(0xff34384c); - +var errorColor = Color(0xfffa5a5a); //modify later diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 6dc2b2e..2944f01 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -28,31 +28,34 @@ class OptionsWidget extends FormField { initialValue: setDefaultValue ? options[0][1] : null, autovalidateMode: autoValidateMode, builder: (FormFieldState state) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.darkPrimaryTextColor),), - Wrap( - alignment: WrapAlignment.center, - children: options - .map((e) => new OptionButton( - text: e[0], - optionKey: e[1], - state: state, - isError: state.hasError, - isSelected: state.value == e[1])) - .toList()), - Padding( - padding: EdgeInsets.all(5), - child: state.hasError - ? Text( - state.errorText ?? "error", - style: GoogleFonts.poppins(color: Colors.red, fontSize: 10), - ) - : Container(), - ) - ], + return Padding( + padding: const EdgeInsets.only(top: 40.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.darkPrimaryTextColor),), + Wrap( + alignment: WrapAlignment.center, + children: options + .map((e) => new OptionButton( + text: e[0], + optionKey: e[1], + state: state, + isError: state.hasError, + isSelected: state.value == e[1])) + .toList()), + Padding( + padding: EdgeInsets.all(5), + child: state.hasError + ? Text( + state.errorText ?? "error", + style: GoogleFonts.poppins(color: Colors.red, fontSize: 10), + ) + : Container(), + ) + ], + ), ); }); } @@ -82,8 +85,8 @@ class OptionButton extends StatelessWidget { backgroundColor: MaterialStateProperty.all(isSelected ? Colors.greenAccent : isError - ? Color(0xffE25963) - : Color(0xffF1D8B8)), + ? colors.darkScaffoldColor + : colors.errorColor), shape: MaterialStateProperty.all( RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(50)), @@ -93,7 +96,7 @@ class OptionButton extends StatelessWidget { onPressed: () { state.didChange(optionKey); }, - child: Text(text)), + child: Text(text,style: GoogleFonts.poppins(color: Colors.white70),)), ); } } \ No newline at end of file From 7a7ff31af74053618b6f08f3b892041bd212b85a Mon Sep 17 00:00:00 2001 From: Soorya S Date: Fri, 24 Dec 2021 17:22:19 +0530 Subject: [PATCH 064/264] Tinyyyyy changes --- lib/Model/CommunityDataModel.dart | 11 ++++ lib/Screens/CommunityDataCollection.dart | 27 ++++++---- lib/Screens/Home.dart | 4 +- lib/Screens/SavedData.dart | 68 ++++++++++++++++++++++++ lib/Utils/DarkTheme.dart | 1 + lib/Widgets/FormPageView.dart | 43 ++++++++------- 6 files changed, 124 insertions(+), 30 deletions(-) create mode 100644 lib/Model/CommunityDataModel.dart create mode 100644 lib/Screens/SavedData.dart diff --git a/lib/Model/CommunityDataModel.dart b/lib/Model/CommunityDataModel.dart new file mode 100644 index 0000000..42c1e5c --- /dev/null +++ b/lib/Model/CommunityDataModel.dart @@ -0,0 +1,11 @@ +class CommunityDataModel{ + + + +var resourceType; +var locationTopLeft; +var locationTopRight; +var locationBottomLeft; +var locationBottomRight; +var villageCode; +} \ No newline at end of file diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 767bab0..1fce5b4 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -31,6 +31,12 @@ class CommunityDataCollection extends StatefulWidget { 'Food processing units' ]; + final List _villageCodeName = [ + 'Temple', + 'Church', + 'Mosque', + ]; + @override _CommunityDataCollectionState createState() => _CommunityDataCollectionState(); @@ -44,6 +50,7 @@ class _CommunityDataCollectionState extends State { List.generate(3, (index) => GlobalObjectKey(index)); _onSubmit(bool isValid) { + print("All data valid"); print(isValid.toString()); } @@ -55,6 +62,9 @@ class _CommunityDataCollectionState extends State { body: FormPageView([ DropDownFormField( list: widget._publicResourceList, + onSaved: (data){ + print(data); + }, title: "Choose type of resource to tag", hint: "Select resource type", errorField: "Please choose a resource to tag"), @@ -86,15 +96,14 @@ class _CommunityDataCollectionState extends State { print(data); }, autoValidateMode: AutovalidateMode.disabled), - TextFormField( - decoration: InputDecoration(), - validator: (str) { - if (str == '') - return 'Enter field lmao'; - else - return null; - }, - ), + DropDownFormField( + list: widget._villageCodeName, + onSaved: (data) { + print(data); + }, + title: "Choose Village Code", + hint: "Select Village Code", + errorField: "Please choose a village code"), ], _onSubmit), ); } diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 1380436..dfa89da 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -7,6 +7,8 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'SavedData.dart'; + class Home extends StatefulWidget { const Home({Key? key}) : super(key: key); @@ -83,7 +85,7 @@ class _HomeWidgetState extends State { 'View saved data', 'View all data saved in local storage', 'assets/svg/storage_image.svg', - CommunityDataCollection(), + SavedDataPage(), Color(0xfff54b64), Color(0xfff78361)), diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart new file mode 100644 index 0000000..a03ebe4 --- /dev/null +++ b/lib/Screens/SavedData.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:google_fonts/google_fonts.dart'; + +class SavedDataPage extends StatelessWidget { + const SavedDataPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 2, + child: Scaffold( + appBar: AppBar( + bottom: TabBar( + tabs: [ + Tab(icon: Icon(Icons.person)), + Tab(icon: Icon(Icons.people)), + ], + ), + backgroundColor: Colors.transparent, + leading: IconButton( + splashRadius: 20, + icon: Icon( + Icons.arrow_back, + color: colors.darkAccentColor, + ), + onPressed: () { + Navigator.pop(context); + }), + elevation: 0, + centerTitle: true, + title: Text( + "Saved Data", + style: GoogleFonts.montserrat(fontSize: 20, color: colors.darkPrimaryTextColor), + ), + ), + backgroundColor: colors.darkScaffoldColor, + body: SafeArea( + child: const TabBarView( + children: [ + SavedListWidget(list: [],), + SavedListWidget(list: ['Hye', 'hey', 'sad'],), + ], + ), + ), + ), + ); + } +} + +class SavedListWidget extends StatelessWidget { + const SavedListWidget({Key? key, required this.list}) : super(key: key); + + final list; + + @override + Widget build(BuildContext context) { + return list.isEmpty ? Center(child: Text('No Saved Items')) : ListView.builder( + itemCount: list.length, + itemBuilder: (context, index) { + return ListTile(title: Text(list[index]),); + }, + ); + } +} + diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index eb41d68..36191b9 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -8,6 +8,7 @@ class darkTheme{ fontFamily: 'Poppins', primaryColor: Colors.white, scaffoldBackgroundColor: colors.darkScaffoldColor, + textTheme: TextTheme( headline1: GoogleFonts.poppins(color: Colors.white, fontSize: 40,fontWeight: FontWeight.w200), bodyText1: GoogleFonts.poppins(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w100), diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 3742978..bded344 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -47,28 +47,31 @@ class _FormPageViewState extends State { formKeyList[index], ))); widgetList.add(PageViewContentBox(Center( - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all(Colors.white), - backgroundColor: MaterialStateProperty.all(Colors.red), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.zero, - side: BorderSide(color: Colors.red)))), - onPressed: () { - bool isValid = true; - for (int i = 0; i < widgetLength - 1; i++) { - var isDataValid = formKeyList[i].currentState!.validate(); - isValid &= isDataValid; - - if (isDataValid) { - formKeyList[i].currentState!.save(); + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all(Colors.red), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.red)))), + onPressed: () { + bool isValid = true; + for (int i = 0; i < widgetLength - 1; i++) { + var isDataValid = formKeyList[i].currentState!.validate(); + isValid &= isDataValid; + + if (isDataValid) { + formKeyList[i].currentState!.save(); + } } - } - widget.onSubmit(isValid); - }), + widget.onSubmit(isValid); + }), + ), ))); } From f288ad87de5ce0e51212302f4ac9c4fbd35f850c Mon Sep 17 00:00:00 2001 From: Soorya S Date: Fri, 24 Dec 2021 17:59:30 +0530 Subject: [PATCH 065/264] Added model for CommunityDataCollection --- lib/Model/CommunityDataModel.dart | 24 ++++++++----- lib/Screens/CommunityDataCollection.dart | 44 +++++++++++++++++++++--- lib/Screens/Home.dart | 5 ++- lib/Widgets/DropDownFormField.dart | 12 ++++--- lib/Widgets/LocationWidget.dart | 3 +- 5 files changed, 68 insertions(+), 20 deletions(-) diff --git a/lib/Model/CommunityDataModel.dart b/lib/Model/CommunityDataModel.dart index 42c1e5c..16ffe04 100644 --- a/lib/Model/CommunityDataModel.dart +++ b/lib/Model/CommunityDataModel.dart @@ -1,11 +1,17 @@ -class CommunityDataModel{ +class CommunityDataModel { + var resourceType; + var locationTopLeft; + var locationTopRight; + var locationBottomLeft; + var locationBottomRight; + var villageCode; + CommunityDataModel( + {this.locationBottomLeft, + this.locationBottomRight, + this.locationTopLeft, + this.locationTopRight, + this.resourceType, + this.villageCode}); - -var resourceType; -var locationTopLeft; -var locationTopRight; -var locationBottomLeft; -var locationBottomRight; -var villageCode; -} \ No newline at end of file +} diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 1fce5b4..3f2b228 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:geo_spatial/Model/CommunityDataModel.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; @@ -7,8 +8,9 @@ import 'package:geo_spatial/Widgets/LocationWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; class CommunityDataCollection extends StatefulWidget { - CommunityDataCollection({Key? key}) : super(key: key); + CommunityDataCollection({Key? key, CommunityDataModel? this.modelData}) : super(key: key); + final modelData; final List _publicResourceList = [ 'Temple', 'Church', @@ -49,57 +51,89 @@ class _CommunityDataCollectionState extends State { final List> formKeyList = List.generate(3, (index) => GlobalObjectKey(index)); - _onSubmit(bool isValid) { - print("All data valid"); - print(isValid.toString()); - } + @override Widget build(BuildContext context) { + CommunityDataModel modelData = widget.modelData ?? CommunityDataModel(); + + _onSubmit(bool isValid) { + print("All data valid"); + print(isValid.toString()); + + if(isValid){ + print("Valid!"); + print(modelData.villageCode); + print(modelData.locationBottomRight); + print(modelData.locationBottomLeft); + print(modelData.locationTopRight); + print(modelData.locationTopLeft); + print(modelData.resourceType); + + //TODO: Send data to server from here + } + } + return Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Community Data'), body: FormPageView([ DropDownFormField( + defaultValue: modelData.resourceType, list: widget._publicResourceList, onSaved: (data){ print(data); + modelData.resourceType = data; }, title: "Choose type of resource to tag", hint: "Select resource type", errorField: "Please choose a resource to tag"), LocationWidgetField( title: "Record location at top left part of the facility", + defaultValue: modelData.locationTopLeft, context: context, onSaved: (data) { print(data); + modelData.locationTopLeft = data; }, autoValidateMode: AutovalidateMode.disabled), LocationWidgetField( title: "Record location at top right part of the facility", + defaultValue: modelData.locationTopRight, context: context, onSaved: (data) { print(data); + modelData.locationTopRight = data; + }, autoValidateMode: AutovalidateMode.disabled), LocationWidgetField( title: "Record location at bottom left part of the facility", + defaultValue: modelData.locationBottomLeft, context: context, onSaved: (data) { print(data); + modelData.locationBottomLeft = data; + }, autoValidateMode: AutovalidateMode.disabled), LocationWidgetField( title: "Record location at bottom right part of the facility", + defaultValue: modelData.locationBottomRight, context: context, onSaved: (data) { print(data); + modelData.locationBottomRight = data; + }, autoValidateMode: AutovalidateMode.disabled), DropDownFormField( + defaultValue: modelData.villageCode, list: widget._villageCodeName, onSaved: (data) { print(data); + modelData.villageCode = data; + }, title: "Choose Village Code", hint: "Select Village Code", diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index dfa89da..d61ebdc 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Model/CommunityDataModel.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Login.dart'; @@ -71,7 +73,8 @@ class _HomeWidgetState extends State { 'Community Details', 'Data entry for communities', 'assets/svg/house.svg', - CommunityDataCollection(), + CommunityDataCollection(modelData: CommunityDataModel(resourceType: "Bakeries", locationBottomLeft: + new Position(latitude: 1.2, longitude: 2.4, accuracy: 32, heading: 21, speedAccuracy: 32, altitude: 23, speed: 32, timestamp: null ))), Color(0xfff54b64), Color(0xfff78361)), DataCard( diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index e5e14de..053c4cf 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -10,6 +10,7 @@ class DropDownFormField extends FormField { required list, required title, required hint, + String? defaultValue, errorField, AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) : super( @@ -20,7 +21,7 @@ class DropDownFormField extends FormField { return errorField ?? "Please select a value"; return null; }, - initialValue: null, + initialValue: defaultValue, autovalidateMode: autoValidateMode, builder: (FormFieldState state) { return Padding( @@ -33,7 +34,8 @@ class DropDownFormField extends FormField { padding: EdgeInsets.only(bottom: 8), child: Text(title, style: GoogleFonts.montserrat( - fontSize: 15, color: colors.darkPrimaryTextColor)), + fontSize: 15, + color: colors.darkPrimaryTextColor)), ), Card( color: colors.darkScaffoldColor, @@ -74,7 +76,8 @@ class DropDownFormField extends FormField { ), ), style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor, decorationColor: Colors.red), + color: colors.darkPrimaryTextColor, + decorationColor: Colors.red), ), ), ), @@ -83,7 +86,8 @@ class DropDownFormField extends FormField { padding: EdgeInsets.all(10), child: Text( state.errorText ?? "error", - style: GoogleFonts.poppins(color: Colors.red, fontSize: 10), + style: GoogleFonts.poppins( + color: Colors.red, fontSize: 10), ), ) : Container() diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index 082c486..6940adf 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -11,6 +11,7 @@ class LocationWidgetField extends FormField { LocationWidgetField( {FormFieldSetter? onSaved, FormFieldValidator? validator, + Position? defaultValue, required BuildContext context, required String title, AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) @@ -21,7 +22,7 @@ class LocationWidgetField extends FormField { if (data == null) return "Location field empty"; return null; }, - initialValue: null, + initialValue: defaultValue, autovalidateMode: autoValidateMode, builder: (FormFieldState state) { return Padding( From d70f38dcffa271c806c83a4873254ead54d34ede Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 24 Dec 2021 17:22:15 +0530 Subject: [PATCH 066/264] UI fixes --- lib/Screens/FamilyMemberAdd.dart | 10 +++++----- lib/Utils/Colors.dart | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index cf1f559..44e8c41 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -415,12 +415,12 @@ class _FamilyMemberAddState extends State { ), ), tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: Colors.black), + fontWeight: FontWeight.normal, color: colors.darkAccentColor), ), textFieldStyler: TextFieldStyler( hintText: "Communicable diseases", isDense: true, - textStyle: GoogleFonts.poppins(color: Colors.white), + textStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), @@ -457,7 +457,7 @@ class _FamilyMemberAddState extends State { tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( - color: Colors.white, + color: colors.darkScaffoldColor, border: Border.all( color: Colors.grey.shade300, ), @@ -466,12 +466,12 @@ class _FamilyMemberAddState extends State { ), ), tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: Colors.black), + fontWeight: FontWeight.normal, color: colors.darkAccentColor), ), textFieldStyler: TextFieldStyler( hintText: "Non communicable diseases", isDense: true, - textStyle: GoogleFonts.poppins(color: Colors.white), + textStyle: GoogleFonts.poppins(color: colors.darkSecondAccentColor), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index b809c73..bfcb6c8 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; var darkScaffoldColor = Color(0xff202330); var darkAccentColor = Color(0xffFF7D7E); var darkPrimaryTextColor = Colors.white; -var darkSecondaryTextColor = Colors.white24; +var darkSecondaryTextColor = Colors.white60; var darkSecondAccentColor = Color(0xff4E596F); var lightPrimaryTextColor = Colors.black; var darkHintColor = Colors.black87; From 3e21edcdd98f5f5bf72a52b19eeff32877d0bacc Mon Sep 17 00:00:00 2001 From: Soorya S Date: Fri, 24 Dec 2021 18:04:35 +0530 Subject: [PATCH 067/264] Added a screen for editing user data --- lib/Screens/EditExistingRecordsPage.dart | 14 ++++++++++++++ lib/Screens/Home.dart | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 lib/Screens/EditExistingRecordsPage.dart diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart new file mode 100644 index 0000000..235f49d --- /dev/null +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; + +class EditRecordsScreen extends StatelessWidget { + const EditRecordsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBarBackButton('Edit Existing Data'), + body: Container(), + ); + } +} diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index d61ebdc..6674d64 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -9,6 +9,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'EditExistingRecordsPage.dart'; import 'SavedData.dart'; class Home extends StatefulWidget { @@ -81,7 +82,7 @@ class _HomeWidgetState extends State { 'Edit Existing Record', 'Edit information of an existing person', 'assets/svg/male.svg', - CommunityDataCollection(), + EditRecordsScreen(), Color(0xfff54b64), Color(0xfff78361)), DataCard( From e6aeff2ea777b3f540938c8f346d0e8ce7fe35a2 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Sat, 25 Dec 2021 16:30:59 +0530 Subject: [PATCH 068/264] Fixed overflowing issues using slivers, made columns fill page, fixed color issues in location widget --- lib/Screens/FamilyDetails.dart | 4 ++ lib/Screens/FamilyHomeScreen.dart | 61 ++++++++++++++----- lib/Screens/FamilyMemberAdd.dart | 92 ++++++++++++++++++----------- lib/Utils/DarkTheme.dart | 2 +- lib/Widgets/AddRemoveBoxWidget.dart | 81 +++++++++++++------------ lib/Widgets/FormPageView.dart | 17 +++--- lib/Widgets/LocationWidget.dart | 10 +++- lib/Widgets/PageViewContentBox.dart | 6 +- 8 files changed, 171 insertions(+), 102 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 36a14ed..a46fea8 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -36,6 +36,7 @@ class _FamilyDetailsState extends State { physics: ClampingScrollPhysics(), child: FormPageView([ Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ OptionsWidget(options: [ ['Yes', 'yes'], @@ -61,6 +62,7 @@ class _FamilyDetailsState extends State { ], ), Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ DropDownFormField( list: ['1', '2', '3', '4', '5', 'More'], @@ -84,6 +86,7 @@ class _FamilyDetailsState extends State { ], ), Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ //TODO: Add brands of four wheelers OptionsWidget(options: [ @@ -127,6 +130,7 @@ class _FamilyDetailsState extends State { ], ), Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ TextFormField( decoration: InputDecoration( diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index fccde96..b0da7b3 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -7,26 +7,59 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; class FamilyHomeScreen extends StatelessWidget { - @override Widget build(BuildContext context) { return Scaffold( appBar: AppBarBackButton('Individual Data'), backgroundColor: colors.darkScaffoldColor, - body: SafeArea( - child: Column( - children: [ - AddRemoveBoxWidget(), - // TextButton(onPressed: (){ - // Navigator.push(context, MaterialPageRoute(builder: (context) => FamilyMemberAdd())); - // }, child: Text('Add Member')), - DataCard("\nCollect Common Details","","",FamilyDetails(),Color(0xfff54b64), - Color(0xfff78361)) - , - ], - ), + body: SafeArea( + child: Column( + children: [ + AddRemoveBoxWidget(), + DataCard("\nCollect Common Details", "", "assets/svg/house.svg", + FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), + Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: + MaterialStateProperty.all(Colors.red), + shape: + MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.red)))), + onPressed: () {}), + ), + ), + Padding( + padding: EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 10), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + child: Text("Save", + style: TextStyle(fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: + MaterialStateProperty.all(Colors.white), + shape: + MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white)))), + onPressed: () {}), + ), + ) + ], ), + ), ); } } - diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 44e8c41..30e1392 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -40,12 +40,12 @@ class _FamilyMemberAddState extends State { appBar: AppBarBackButton('Add Family Member'), body: SizedBox( height: MediaQuery.of(context).size.height - - MediaQuery.of(context).viewInsets.bottom * 1.1, + MediaQuery.of(context).viewInsets.bottom * 1.3, child: SingleChildScrollView( physics: ClampingScrollPhysics(), child: FormPageView([ Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( @@ -56,10 +56,12 @@ class _FamilyMemberAddState extends State { //isDense: true, label: Text( "Name", - style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), hintText: "Please enter name", - hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -84,8 +86,7 @@ class _FamilyMemberAddState extends State { verticalAlignedText: false, selectedGender: Gender.Male, selectedGenderTextStyle: TextStyle( - color: Colors.greenAccent, - fontWeight: FontWeight.bold), + color: Colors.greenAccent, fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( color: colors.darkPrimaryTextColor, fontWeight: FontWeight.normal), @@ -108,10 +109,12 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Phone Number", - style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), hintText: "Please enter 10 digit phone", - hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -151,10 +154,12 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Aadhaar Number", - style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), hintText: "Please enter 12 digit Aadhaar", - hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -223,10 +228,12 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Income/Day", - style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), hintText: "Please enter income per day", - hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -238,7 +245,7 @@ class _FamilyMemberAddState extends State { ) ], ), - Column(children: [ + Column(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ //TODO: Add work timings Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), @@ -247,10 +254,12 @@ class _FamilyMemberAddState extends State { decoration: InputDecoration( label: Text( "Income/Month", - style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), hintText: "Please enter income per month", - hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(0.0), ), validator: (value) { @@ -287,12 +296,14 @@ class _FamilyMemberAddState extends State { ], title: 'Marital Status', ), - ),] ), + ]), Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], @@ -301,8 +312,9 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: + EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( @@ -341,7 +353,8 @@ class _FamilyMemberAddState extends State { ), ), Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], @@ -350,8 +363,9 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: + EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( @@ -392,7 +406,8 @@ class _FamilyMemberAddState extends State { height: 20, ), Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], @@ -401,8 +416,9 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: + EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( @@ -415,12 +431,14 @@ class _FamilyMemberAddState extends State { ), ), tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: colors.darkAccentColor), + fontWeight: FontWeight.normal, + color: colors.darkAccentColor), ), textFieldStyler: TextFieldStyler( hintText: "Communicable diseases", isDense: true, - textStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + textStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), @@ -443,7 +461,8 @@ class _FamilyMemberAddState extends State { height: 20, ), Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0,top: 30), + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TextFieldTags( //initialTags: ["better", "lovely"], textSeparators: [" ", ".", ","], @@ -452,8 +471,9 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: + EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( @@ -466,12 +486,14 @@ class _FamilyMemberAddState extends State { ), ), tagTextStyle: TextStyle( - fontWeight: FontWeight.normal, color: colors.darkAccentColor), + fontWeight: FontWeight.normal, + color: colors.darkAccentColor), ), textFieldStyler: TextFieldStyler( hintText: "Non communicable diseases", isDense: true, - textStyle: GoogleFonts.poppins(color: colors.darkSecondAccentColor), + textStyle: GoogleFonts.poppins( + color: colors.darkSecondAccentColor), textFieldBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.black, width: 1.0), ), @@ -501,12 +523,12 @@ class _FamilyMemberAddState extends State { ), ), - //TODO: Display next widget only if the previous widget is true //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog ], ), Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ OptionsWidget( options: [ @@ -528,7 +550,8 @@ class _FamilyMemberAddState extends State { //TODO: Add a checkbox dialog for PHC services utilised //TODO: Add a checkbox dialog for private heath clinic facilities used Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0,bottom: 20.0), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 20.0), child: TextFormField( decoration: InputDecoration(label: Text('Why private?')), ), @@ -540,6 +563,7 @@ class _FamilyMemberAddState extends State { ], ), Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ OptionsWidget(options: [ ['Yes', 'yes'], diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 36191b9..77a9ecf 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -16,7 +16,7 @@ class darkTheme{ button: GoogleFonts.poppins(color: Color(0xff43282C))), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( - primary: Color(0xffE9C9CC), + primary: Color(0xffc1c1c1), elevation: 10.0, onPrimary: Color(0xff43282C), padding: EdgeInsets.all(10), diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 3f33f6d..8d5108c 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -25,13 +25,13 @@ class _AddRemoveBoxWidgetState extends State { @override Widget build(BuildContext context) { return Container( - height: MediaQuery.of(context).size.height * 0.6, + height: MediaQuery.of(context).size.height * 0.3, color: colors.darkScaffoldColor, child: Padding( padding: EdgeInsets.all(10), child: Container( color: colors.darkScaffoldColor, - height: MediaQuery.of(context).size.height * 0.6, + height: MediaQuery.of(context).size.height * 0.3, child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, @@ -59,43 +59,46 @@ class _AddRemoveBoxWidgetState extends State { height: 15, ), Container( - height: MediaQuery.of(context).size.height * 0.5, - child: ListView.builder( - itemCount: listOfElements.length, - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return Card( - color: colors.darkAccentColor, - child: ListTile( - onTap: () { - var obj = - listOfElements[index]; //Modify this object - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FamilyMemberAdd())); - }, - //Pass a function which is called onSaved in the next page and add data to the class object - leading: Icon(Icons.person), - title: Text( - "User ${index + 1}", - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 20), - ), - trailing: IconButton( - color: colors.darkSecondAccentColor, - icon: Icon(Icons.close), - onPressed: () { - setState(() { - listOfElements.removeAt(index); - }); - }, - ), - ), - ); - }), + height: MediaQuery.of(context).size.height * 0.2, + child: listOfElements.isEmpty + ? Center(child: Text('No Members Added')) + : ListView.builder( + itemCount: listOfElements.length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Card( + color: colors.darkAccentColor, + child: ListTile( + onTap: () { + var obj = + listOfElements[index]; //Modify this object + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + FamilyMemberAdd())); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + leading: Icon(Icons.person), + title: Text( + "User ${index + 1}", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + trailing: IconButton( + color: colors.darkSecondAccentColor, + icon: Icon(Icons.close), + onPressed: () { + setState(() { + listOfElements.removeAt(index); + }); + }, + ), + ), + ); + }), ), ], ), diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index bded344..14ea18a 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -99,16 +99,13 @@ class _FormPageViewState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ StepCounterWidget(widgetLength, count, formErrorTile, controller), - SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: Container( - height: MediaQuery.of(context).size.height * 0.82, - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: controller, - children: widgetList, - ), + Container( + height: MediaQuery.of(context).size.height * 0.86, + child: PageView( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + controller: controller, + children: widgetList, ), ), ], diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index 6940adf..2c60dfb 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -36,7 +36,7 @@ class LocationWidgetField extends FormField { padding: EdgeInsets.only(bottom: 30), child: Text(title, style: GoogleFonts.montserrat( - fontSize: 25, color: Colors.black)), + fontSize: 25, color: Colors.white)), ), Container( decoration: BoxDecoration( @@ -64,7 +64,8 @@ class LocationWidgetField extends FormField { state.value != null ? state.value.toString() : "Please fetch your location", - style: TextStyle(fontSize: 12)), + style: TextStyle( + fontSize: 12, color: Colors.black)), ), ), ), @@ -134,7 +135,10 @@ Future _determinePosition(context) async { padding: EdgeInsets.only(right: 20), child: CircularProgressIndicator(), ), - new Text("Fetching Location"), + new Text( + "Fetching Location", + style: TextStyle(color: Colors.black), + ), ], ), ), diff --git a/lib/Widgets/PageViewContentBox.dart b/lib/Widgets/PageViewContentBox.dart index c34e5d2..17d13ae 100644 --- a/lib/Widgets/PageViewContentBox.dart +++ b/lib/Widgets/PageViewContentBox.dart @@ -25,7 +25,11 @@ class PageViewContentBox extends StatelessWidget { ), child: Padding( padding: EdgeInsets.all(12), - child: centerWidget, + child: CustomScrollView( + slivers: [ + SliverFillRemaining(hasScrollBody: false, child: centerWidget), + ], + ), ), ), ); From 8c4feed9b60c06766586934c9dcfb27cd6bcd0a5 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 25 Dec 2021 20:08:28 +0530 Subject: [PATCH 069/264] Added last questions --- lib/Screens/FamilyMemberAdd.dart | 151 ++++++++++++++++++++++++++++- lib/Utils/DarkTheme.dart | 16 ++- lib/Widgets/DropDownFormField.dart | 2 +- 3 files changed, 161 insertions(+), 8 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 30e1392..8b8aebe 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -523,9 +523,8 @@ class _FamilyMemberAddState extends State { ), ), - //TODO: Display next widget only if the previous widget is true - //TODO: Find out list of Anganwadi services, list em in a checkerbox dialog - ], + + ], ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -547,8 +546,150 @@ class _FamilyMemberAddState extends State { title: 'Using any Anganwadi services?', ), ), - //TODO: Add a checkbox dialog for PHC services utilised - //TODO: Add a checkbox dialog for private heath clinic facilities used + TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: + EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, + color: colors.darkAccentColor), + ), + textFieldStyler: TextFieldStyler( + hintText: "Anganwadi Services used", + isDense: true, + textStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, + ), + TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: + EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, + color: colors.darkAccentColor), + ), + textFieldStyler: TextFieldStyler( + hintText: "PHC Services used", + isDense: true, + textStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, + ), + TextFieldTags( + //initialTags: ["better", "lovely"], + textSeparators: [" ", ".", ","], + scrollableTagsPadding: EdgeInsets.all(10), + tagsStyler: TagsStyler( + showHashtag: false, + tagMargin: const EdgeInsets.only(right: 4.0), + tagCancelIcon: + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: + EdgeInsets.only(left: 4.0, top: 2.0), + tagPadding: EdgeInsets.only( + top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), + tagDecoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey.shade300, + ), + borderRadius: const BorderRadius.all( + Radius.circular(20.0), + ), + ), + tagTextStyle: TextStyle( + fontWeight: FontWeight.normal, + color: colors.darkAccentColor), + ), + textFieldStyler: TextFieldStyler( + hintText: "Private Clinic services used", + isDense: true, + textStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + textFieldBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black, width: 1.0), + ), + ), + onDelete: (tag) { + //remove value from list + }, + onTag: (tag) { + //create a list and store value to list + }, + validator: (String tag) { + if (tag.isEmpty) { + return "Enter a value"; + } + return null; + }, + ), Padding( padding: const EdgeInsets.only( left: 10.0, right: 10.0, bottom: 20.0), diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 77a9ecf..d01d10b 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -23,10 +23,22 @@ class darkTheme{ ) ), inputDecorationTheme: InputDecorationTheme( - contentPadding: EdgeInsets.only(left:10,right:10), + filled: true, + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: colors.darkAccentColor, width: 1.0)), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: colors.darkAccentColor, width: 1.0)), + border: UnderlineInputBorder( + borderSide: BorderSide( + color: colors.darkAccentColor, width: 1.0 + ), + ), + contentPadding: EdgeInsets.all(20.0), + fillColor: colors.darkScaffoldColor, labelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), floatingLabelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: colors.darkAccentColor)), hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 053c4cf..b03adcf 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -95,4 +95,4 @@ class DropDownFormField extends FormField { ), ); }); -} +} \ No newline at end of file From f94dd2d02cc667b97ea94774a583a315b40043d5 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Sat, 25 Dec 2021 20:28:36 +0530 Subject: [PATCH 070/264] Made theme changes --- lib/Utils/Colors.dart | 2 +- lib/Widgets/LocationWidget.dart | 3 ++- lib/Widgets/OptionsFormWidget.dart | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index bfcb6c8..79f04fb 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -8,4 +8,4 @@ var darkSecondAccentColor = Color(0xff4E596F); var lightPrimaryTextColor = Colors.black; var darkHintColor = Colors.black87; var darkSecondBackgroundColor = Color(0xff34384c); -var errorColor = Color(0xfffa5a5a); //modify later +var errorColor = Color.fromARGB(255, 255, 167, 167); //modify later diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index 2c60dfb..ec7c436 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; /** * Form Widget to get current location with validation @@ -47,7 +48,7 @@ class LocationWidgetField extends FormField { width: 1, color: Color.fromARGB(255, 194, 194, 194)), color: state.hasError - ? Color.fromARGB(255, 255, 216, 216) + ? colors.errorColor : Color.fromARGB(255, 238, 238, 238), ), width: double.infinity, diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 2944f01..db48a94 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -83,10 +83,10 @@ class OptionButton extends StatelessWidget { child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(isSelected - ? Colors.greenAccent + ? Color.fromRGBO(148, 182, 111, 1.0) : isError - ? colors.darkScaffoldColor - : colors.errorColor), + ? colors.errorColor + : colors.darkScaffoldColor), shape: MaterialStateProperty.all( RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(50)), @@ -96,7 +96,7 @@ class OptionButton extends StatelessWidget { onPressed: () { state.didChange(optionKey); }, - child: Text(text,style: GoogleFonts.poppins(color: Colors.white70),)), + child: Text(text,style: GoogleFonts.poppins(color: Colors.white),)), ); } } \ No newline at end of file From 6b61cb5362bbe2aeb7f9f2dd514157984faf0194 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 25 Dec 2021 21:00:27 +0530 Subject: [PATCH 071/264] UI fixes --- lib/Screens/FamilyHomeScreen.dart | 86 ++++++++++++++++------------- lib/Screens/FamilyMemberAdd.dart | 55 +++++++++--------- lib/Widgets/AddRemoveBoxWidget.dart | 8 +-- 3 files changed, 83 insertions(+), 66 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index b0da7b3..c8f09ec 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; -import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; @@ -19,44 +19,56 @@ class FamilyHomeScreen extends StatelessWidget { DataCard("\nCollect Common Details", "", "assets/svg/house.svg", FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), Padding( - padding: EdgeInsets.only(left: 10, right: 10), - child: SizedBox( - width: double.infinity, - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all(Colors.white), - backgroundColor: - MaterialStateProperty.all(Colors.red), - shape: - MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.red)))), - onPressed: () {}), + padding: EdgeInsets.only(bottom: 10.0,left: 10.0,right: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: SizedBox( + width: MediaQuery.of(context).size.width*0.4, + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkSecondBackgroundColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () {}), + ), + ), + Padding( + padding: + EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 10), + child: SizedBox( + width: MediaQuery.of(context).size.width*0.4, + child: ElevatedButton( + child: Text("Save", + style: + TextStyle(fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: + MaterialStateProperty.all(Colors.white), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white)))), + onPressed: () {}), + ), + ) + ], ), ), - Padding( - padding: EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 10), - child: SizedBox( - width: double.infinity, - child: ElevatedButton( - child: Text("Save", - style: TextStyle(fontSize: 14, color: Colors.black)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all(Colors.white), - backgroundColor: - MaterialStateProperty.all(Colors.white), - shape: - MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.white)))), - onPressed: () {}), - ), - ) ], ), ), diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 8b8aebe..ca1ec73 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -62,7 +62,7 @@ class _FamilyMemberAddState extends State { hintText: "Please enter name", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(0.0), + contentPadding: EdgeInsets.all(7.0), ), validator: (value) { if (value == "") { @@ -115,7 +115,7 @@ class _FamilyMemberAddState extends State { hintText: "Please enter 10 digit phone", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(0.0), + contentPadding: EdgeInsets.all(7.0), ), validator: (value) { if (value == "") { @@ -160,7 +160,7 @@ class _FamilyMemberAddState extends State { hintText: "Please enter 12 digit Aadhaar", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(0.0), + contentPadding: EdgeInsets.all(7.0), ), validator: (value) { if (value == "") { @@ -234,7 +234,7 @@ class _FamilyMemberAddState extends State { hintText: "Please enter income per day", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(0.0), + contentPadding: EdgeInsets.all(7.0), ), validator: (value) { if (value == "") { @@ -260,7 +260,7 @@ class _FamilyMemberAddState extends State { hintText: "Please enter income per month", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(0.0), + contentPadding: EdgeInsets.all(7.0), ), validator: (value) { if (value == "") { @@ -522,9 +522,7 @@ class _FamilyMemberAddState extends State { title: 'Surgeries', ), ), - - - ], + ], ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -554,9 +552,8 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: - EdgeInsets.only(left: 4.0, top: 2.0), + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( @@ -602,9 +599,8 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: - EdgeInsets.only(left: 4.0, top: 2.0), + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( @@ -650,9 +646,8 @@ class _FamilyMemberAddState extends State { showHashtag: false, tagMargin: const EdgeInsets.only(right: 4.0), tagCancelIcon: - Icon(Icons.cancel, size: 15.0, color: Colors.black), - tagCancelIconPadding: - EdgeInsets.only(left: 4.0, top: 2.0), + Icon(Icons.cancel, size: 15.0, color: Colors.black), + tagCancelIconPadding: EdgeInsets.only(left: 4.0, top: 2.0), tagPadding: EdgeInsets.only( top: 2.0, bottom: 4.0, left: 8.0, right: 4.0), tagDecoration: BoxDecoration( @@ -690,22 +685,32 @@ class _FamilyMemberAddState extends State { return null; }, ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 20.0), + padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( - decoration: InputDecoration(label: Text('Why private?')), + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Why private?", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter reason", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), ), ), OptionsWidget(options: [ ['Yes', 'yes'], ['No', 'no'] ], title: "Do you use any tobacco based products?"), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ OptionsWidget(options: [ ['Yes', 'yes'], ['No', 'no'] diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 8d5108c..16ee625 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -25,13 +25,13 @@ class _AddRemoveBoxWidgetState extends State { @override Widget build(BuildContext context) { return Container( - height: MediaQuery.of(context).size.height * 0.3, + height: MediaQuery.of(context).size.height * 0.45, color: colors.darkScaffoldColor, child: Padding( padding: EdgeInsets.all(10), child: Container( color: colors.darkScaffoldColor, - height: MediaQuery.of(context).size.height * 0.3, + height: MediaQuery.of(context).size.height * 0.45, child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, @@ -59,7 +59,7 @@ class _AddRemoveBoxWidgetState extends State { height: 15, ), Container( - height: MediaQuery.of(context).size.height * 0.2, + height: MediaQuery.of(context).size.height * 0.35, child: listOfElements.isEmpty ? Center(child: Text('No Members Added')) : ListView.builder( @@ -67,7 +67,7 @@ class _AddRemoveBoxWidgetState extends State { shrinkWrap: true, itemBuilder: (BuildContext context, int index) { return Card( - color: colors.darkAccentColor, + color: colors.darkSecondBackgroundColor, child: ListTile( onTap: () { var obj = From 6d025094b6eac3d9e33daf0b4d96160a17818fd9 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 25 Dec 2021 22:53:21 +0530 Subject: [PATCH 072/264] Fixed overflow issues --- lib/Screens/FamilyHomeScreen.dart | 4 +++- lib/Screens/SavedData.dart | 4 ++-- lib/Widgets/FormPageView.dart | 13 +++++-------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index c8f09ec..e247bb8 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -18,8 +18,10 @@ class FamilyHomeScreen extends StatelessWidget { AddRemoveBoxWidget(), DataCard("\nCollect Common Details", "", "assets/svg/house.svg", FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), + DataCard("Record GPS Data", "Make sure GPS is enabled", "assets/svg/map.svg", + FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), Padding( - padding: EdgeInsets.only(bottom: 10.0,left: 10.0,right: 10.0), + padding: EdgeInsets.only(bottom: 10.0,left: 10.0,right: 10.0,top: 10), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart index a03ebe4..e42ab16 100644 --- a/lib/Screens/SavedData.dart +++ b/lib/Screens/SavedData.dart @@ -15,8 +15,8 @@ class SavedDataPage extends StatelessWidget { appBar: AppBar( bottom: TabBar( tabs: [ - Tab(icon: Icon(Icons.person)), - Tab(icon: Icon(Icons.people)), + Tab(icon: Icon(Icons.person,color: colors.darkPrimaryTextColor,)), + Tab(icon: Icon(Icons.people,color: colors.darkPrimaryTextColor,)), ], ), backgroundColor: Colors.transparent, diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 14ea18a..10b429e 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -49,15 +49,16 @@ class _FormPageViewState extends State { widgetList.add(PageViewContentBox(Center( child: SizedBox( width: double.infinity, + height: 70, child: ElevatedButton( child: Text("Submit", style: TextStyle(fontSize: 14)), style: ButtonStyle( foregroundColor: MaterialStateProperty.all(Colors.white), - backgroundColor: MaterialStateProperty.all(Colors.red), + backgroundColor: MaterialStateProperty.all(colors.darkScaffoldColor), shape: MaterialStateProperty.all( RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.red)))), + side: BorderSide(color: colors.darkScaffoldColor)))), onPressed: () { bool isValid = true; for (int i = 0; i < widgetLength - 1; i++) { @@ -68,7 +69,6 @@ class _FormPageViewState extends State { formKeyList[i].currentState!.save(); } } - widget.onSubmit(isValid); }), ), @@ -100,7 +100,7 @@ class _FormPageViewState extends State { children: [ StepCounterWidget(widgetLength, count, formErrorTile, controller), Container( - height: MediaQuery.of(context).size.height * 0.86, + height: MediaQuery.of(context).size.height * 0.85, child: PageView( onPageChanged: _onPageViewChange, scrollDirection: Axis.horizontal, @@ -133,10 +133,7 @@ class _FormKeepAliveState extends State return Form( child: widget.childWidget, key: widget._formKey, - onChanged: () { - if (widget._formKey.currentState!.validate()) - widget._formKey.currentState!.save(); - }); + ); } @override From 897861726a749cea93f9e63f3bea1a70f3f467d2 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Sun, 26 Dec 2021 01:19:43 +0530 Subject: [PATCH 073/264] Added custom tag widget --- lib/Screens/FamilyMemberAdd.dart | 70 +++---- lib/Utils/DarkTheme.dart | 12 +- lib/Utils/tag_model.dart | 110 +++++++++++ lib/Widgets/DatePickerWidget.dart | 26 +-- lib/Widgets/LocationWidget.dart | 2 +- lib/Widgets/OptionsFormWidget.dart | 2 +- lib/Widgets/TagTextWidget.dart | 129 +++++++++++++ lib/Widgets/TextInputWidget.dart | 3 - lib/Widgets/TextTagsWidget.dart | 300 +++++++++++++++++++++++++++++ 9 files changed, 581 insertions(+), 73 deletions(-) create mode 100644 lib/Utils/tag_model.dart create mode 100644 lib/Widgets/TagTextWidget.dart delete mode 100644 lib/Widgets/TextInputWidget.dart create mode 100644 lib/Widgets/TextTagsWidget.dart diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index ca1ec73..0c7ef29 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -3,13 +3,15 @@ import 'package:gender_picker/gender_picker.dart'; import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; +import 'package:geo_spatial/Utils/tag_model.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; +import 'package:geo_spatial/Widgets/TagTextWidget.dart'; +import 'package:geo_spatial/Widgets/TextTagsWidget.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:textfield_tags/textfield_tags.dart'; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd({Key? key}) : super(key: key); @@ -48,6 +50,12 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ + TagTextWidget(label: "Enter something", hint: "Enter something please", onSaved: (data){ + for(var i in data!){ + print(i); + } + + } ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( @@ -344,12 +352,8 @@ class _FamilyMemberAddState extends State { onTag: (tag) { //create a list and store value to list }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, + + onList: (List list) {}, ), ), Padding( @@ -394,12 +398,7 @@ class _FamilyMemberAddState extends State { onTag: (tag) { //create a list and store value to list }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, + onList: (List list) {}, ), ), SizedBox( @@ -439,9 +438,6 @@ class _FamilyMemberAddState extends State { isDense: true, textStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - textFieldBorder: UnderlineInputBorder( - borderSide: BorderSide(color: Colors.black, width: 1.0), - ), ), onDelete: (tag) { //remove value from list @@ -449,12 +445,8 @@ class _FamilyMemberAddState extends State { onTag: (tag) { //create a list and store value to list }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, + + onList: (List list) {}, ), ), SizedBox( @@ -501,15 +493,9 @@ class _FamilyMemberAddState extends State { onDelete: (tag) { //remove value from list }, - onTag: (tag) { + onTag: (tag) {}, //create a list and store value to list - }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, + onList: (List list) {}, ), ), Padding( @@ -584,12 +570,8 @@ class _FamilyMemberAddState extends State { onTag: (tag) { //create a list and store value to list }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, + + onList: (List list) {}, ), TextFieldTags( //initialTags: ["better", "lovely"], @@ -631,12 +613,7 @@ class _FamilyMemberAddState extends State { onTag: (tag) { //create a list and store value to list }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; - } - return null; - }, + onList: (List list) {}, ), TextFieldTags( //initialTags: ["better", "lovely"], @@ -678,11 +655,12 @@ class _FamilyMemberAddState extends State { onTag: (tag) { //create a list and store value to list }, - validator: (String tag) { - if (tag.isEmpty) { - return "Enter a value"; + + onList: (List list) { + print("TAGS: "); + for(var i in list){ + print(i); } - return null; }, ), ], diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index d01d10b..865ccdb 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -24,18 +24,18 @@ class darkTheme{ ), inputDecorationTheme: InputDecorationTheme( filled: true, - enabledBorder: UnderlineInputBorder( + enabledBorder: OutlineInputBorder( borderSide: BorderSide( - color: colors.darkAccentColor, width: 1.0)), - focusedBorder: UnderlineInputBorder( + color: colors.darkScaffoldColor, width: 1.0)), + focusedBorder: OutlineInputBorder( borderSide: BorderSide( - color: colors.darkAccentColor, width: 1.0)), - border: UnderlineInputBorder( + color: colors.darkPrimaryTextColor, width: 1.0)), + border: OutlineInputBorder( borderSide: BorderSide( color: colors.darkAccentColor, width: 1.0 ), ), - contentPadding: EdgeInsets.all(20.0), + contentPadding: EdgeInsets.all(7.0), fillColor: colors.darkScaffoldColor, labelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), floatingLabelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), diff --git a/lib/Utils/tag_model.dart b/lib/Utils/tag_model.dart new file mode 100644 index 0000000..d926879 --- /dev/null +++ b/lib/Utils/tag_model.dart @@ -0,0 +1,110 @@ +//Models +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; + +///[TagsStyler] allows you to design the exact style you want for your tag by using its properties. It must not be [null] + +class TagsStyler { + ///[tagPadding] allows you to apply padding inside tag + final EdgeInsets tagPadding; + + ///[tagMargin] allows you to apply margin inside tag + final EdgeInsets tagMargin; + + ///[tagMargin] apply decoration to the container containing the tag. Should specify the color to set tag color, otherwise its white by default + final BoxDecoration tagDecoration; + + ///[tagTextStyle] style the text inside tag + final TextStyle? tagTextStyle; + + /// Styles the padding of the tag text + final EdgeInsets tagTextPadding; + + /// Styles the padding of the tag cancel icon + final EdgeInsets tagCancelIconPadding; + + ///[tagCancelIcon] apply your own icon, if you want, to delete the icon + final Widget tagCancelIcon; + + ///Enable or disable the # prefix icon + final bool showHashtag; + + TagsStyler({ + this.tagTextPadding = const EdgeInsets.all(0.0), + this.tagCancelIconPadding = const EdgeInsets.only(left: 1.0), + this.tagPadding = const EdgeInsets.all(4.0), + this.tagMargin = const EdgeInsets.symmetric(horizontal: 4.0), + this.tagDecoration = + const BoxDecoration(color: Color.fromARGB(255, 74, 137, 92)), + this.tagTextStyle, + this.showHashtag = false, + this.tagCancelIcon = const Icon( + Icons.cancel, + size: 18.0, + color: Colors.green, + ), + }); +} + +///[TextFieldStyler] allows you to design the exact style you want for your textfield by using its properties. It must not be [null] +class TextFieldStyler { + /// The color of the decoration inside the textfield + final Color? textFieldFilledColor; + + ///[textFieldFilled] If true the decoration's container is filled with [textFieldFilledColor]. + final bool textFieldFilled; + + ///The padding for the input decoration's container. Adjust this to using EdgeInsets if you make textFieldBorder [null] or borderless to have the right customized style + final EdgeInsets? contentPadding; + + /// The text style of the text input + final TextStyle? textStyle; + + ///The color of the cursor blinking + final Color? cursorColor; + + ///Whether the input [child] is part of a dense form (i.e., uses less vertical space). + final bool isDense; + + ///Text that provides context about the input [child]'s value, such as how the value will be used. + final String helperText; + + ///Style helperText + final TextStyle? helperStyle; + + ///Text that suggests what sort of input the field accepts. + final String hintText; + + ///Styles hint text + final TextStyle? hintStyle; + + ///Enable or disable the textfield + final bool textFieldEnabled; + + /// The icon that displays side of the text field + final Icon? icon; + + final InputBorder? textFieldBorder; + final InputBorder? textFieldFocusedBorder; + final InputBorder? textFieldDisabledBorder; + final InputBorder? textFieldEnabledBorder; + + TextFieldStyler({ + this.contentPadding = const EdgeInsets.all(15), + this.textFieldFilled = false, + this.helperText = '', + this.helperStyle, + this.textStyle, + this.cursorColor, + this.hintText = '', + this.hintStyle = const TextStyle(color: Colors.white60), + this.textFieldFilledColor, + this.isDense = true, + this.textFieldEnabled = true, + this.icon, + this.textFieldBorder = const OutlineInputBorder(), + this.textFieldFocusedBorder, + this.textFieldDisabledBorder, + this.textFieldEnabledBorder, + }); +} diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index d6fcf3e..e609faa 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -24,22 +24,16 @@ class DatePickerWidget extends FormField { autovalidateMode: autoValidateMode, builder: (FormFieldState state) { Future pickDate(BuildContext context) async { - - final newDate = await CupertinoRoundedDatePicker.show( - context, - background: colors.darkSecondBackgroundColor, - textColor: colors.darkAccentColor, - minimumYear: 1900, - maximumDate: DateTime.now(), - maximumYear: DateTime.now().year, - initialDatePickerMode: CupertinoDatePickerMode.date, - borderRadius: 16, - onDateTimeChanged: (date){ - - } - ); - - if (newDate != null) state.didChange(newDate); + await CupertinoRoundedDatePicker.show(context, + background: colors.darkSecondBackgroundColor, + textColor: colors.darkAccentColor, + minimumYear: 1900, + maximumDate: DateTime.now(), + maximumYear: DateTime.now().year, + initialDatePickerMode: CupertinoDatePickerMode.date, + borderRadius: 16, onDateTimeChanged: (date) { + state.didChange(date); + }); } return Padding( diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index ec7c436..393b8a9 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -15,7 +15,7 @@ class LocationWidgetField extends FormField { Position? defaultValue, required BuildContext context, required String title, - AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) : super( onSaved: onSaved, validator: validator ?? diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index db48a94..4fc9da3 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -17,7 +17,7 @@ class OptionsWidget extends FormField { required List options, required String title, bool setDefaultValue = false, - AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) : super( onSaved: onSaved, validator: validator ?? diff --git a/lib/Widgets/TagTextWidget.dart b/lib/Widgets/TagTextWidget.dart new file mode 100644 index 0000000..5939664 --- /dev/null +++ b/lib/Widgets/TagTextWidget.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; + +class TagTextWidget extends FormField> { + TagTextWidget( + {FormFieldSetter>? onSaved, + FormFieldValidator>? validator, + list, + required label, + required hint, + emptyListMessage, + errorField, + AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) + : super( + onSaved: onSaved, + validator: validator ?? + (data) { + if (data == null || data.isEmpty) + return errorField ?? "Please enter a value"; + return null; + }, + initialValue: [], + autovalidateMode: autoValidateMode, + builder: (FormFieldState> state) { + final TextEditingController _contentEditingController = + TextEditingController(); + + ScrollController _scrollController = new ScrollController(); + + return Padding( + padding: EdgeInsets.only(left: 10, right: 10, bottom: 10), + child: Column( + children: [ + Padding( + padding: EdgeInsets.only(bottom: 10), + child: TextField( + controller: _contentEditingController, + onSubmitted: (string) { + if (!string.isEmpty) { + _contentEditingController.clear(); + List? list = state.value; + list?.add(string); + state.didChange(list); + } + }, + style: GoogleFonts.poppins(color: Colors.white), + decoration: InputDecoration( + errorText: state.hasError ? state.errorText : null, + label: Text( + label, + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: hint, + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + ), + ), + Container( + height: 35.0, + width: double.infinity, + child: state.value!.isEmpty + ? Center( + child: Text(emptyListMessage ?? "List is empty"), + ) + : ListView.builder( + controller: _scrollController, + scrollDirection: Axis.horizontal, + itemCount: state.value?.length, + itemBuilder: (BuildContext context, int index) { + return TagBox( + text: state.value![index], + delete: () { + List? list = state.value; + list?.removeAt(index); + state.didChange(list); + }); + }, + ), + ) + ], + ), + ); + }); +} + +class TagBox extends StatelessWidget { + const TagBox({Key? key, this.text, Function? this.delete}) : super(key: key); + + final text; + final delete; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 4.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.only(left: 7, right: 2, top: 2, bottom: 2), + child: Text( + text, + style: TextStyle(color: Colors.black, fontSize: 15), + ), + ), + Padding( + padding: EdgeInsets.all(4), + child: GestureDetector( + onTap: () { + delete(); + }, + child: Icon( + Icons.cancel, + size: 15, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/Widgets/TextInputWidget.dart b/lib/Widgets/TextInputWidget.dart deleted file mode 100644 index d10255e..0000000 --- a/lib/Widgets/TextInputWidget.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:flutter/material.dart'; - - diff --git a/lib/Widgets/TextTagsWidget.dart b/lib/Widgets/TextTagsWidget.dart new file mode 100644 index 0000000..2e56bb3 --- /dev/null +++ b/lib/Widgets/TextTagsWidget.dart @@ -0,0 +1,300 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Utils/tag_model.dart'; + + +//To Be Deleted + +typedef String? Validator(String tag); + +class TextFieldTags extends StatefulWidget { + ///[tagsStyler] must not be [null] + final TagsStyler tagsStyler; + + ///[textFieldStyler] must not be [null] + final TextFieldStyler textFieldStyler; + + ///[onTag] must not be [null] and should be implemented + final void Function(String tag) onTag; + final void Function(List list) onList; + + ///[onDelete] must not be [null] + final void Function(String tag) onDelete; + + ///[validator] allows you to validate the tag that has been entered + final Validator? validator; + + ///[initialTags] are optional initial tags you can enter + final List? initialTags; + + ///Padding for the scrollable + final EdgeInsets scrollableTagsPadding; + + ///Margin for the scrollable + final EdgeInsets? scrollableTagsMargin; + + ///[tagsDistanceFromBorder] sets the distance of the tags from the border + final double tagsDistanceFromBorderEnd; + + ///Enter optional String separators to split tags. Default is [","," "] + final List? textSeparators; + + TextFieldTags({ + Key? key, + this.tagsDistanceFromBorderEnd = 0.725, + required this.onList, + this.scrollableTagsPadding = const EdgeInsets.symmetric(horizontal: 4.0), + this.scrollableTagsMargin, + this.validator, + this.initialTags = const [], + this.textSeparators = const [" ", ","], + required this.tagsStyler, + required this.textFieldStyler, + required this.onTag, + required this.onDelete, + }); + + @override + _TextFieldTagsState createState() => _TextFieldTagsState(); +} + +class _TextFieldTagsState extends State { + Set? _tagsStringContents; + TextEditingController? _textEditingController; + ScrollController? _scrollController; + late bool _showPrefixIcon; + late double _deviceWidth; + late bool _showValidator; + late String _validatorMessage; + final List listItems = []; + + @override + void initState() { + super.initState(); + _showValidator = false; + _tagsStringContents = Set.from(widget.initialTags!); + _showPrefixIcon = _tagsStringContents!.length > 0 ? true : false; + _textEditingController = TextEditingController(); + _scrollController = ScrollController(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _deviceWidth = MediaQuery.of(context).size.width; + } + + var _errorMessage = null; + + @override + void dispose() { + super.dispose(); + _textEditingController!.dispose(); + _scrollController!.dispose(); + _tagsStringContents = null; + _textEditingController = null; + _scrollController = null; + } + + List get _getTags { + List _tags = []; + for (var i = 0; i < _tagsStringContents!.length; i++) { + final String stringContent = _tagsStringContents!.elementAt(i); + final String stringContentWithHash = + widget.tagsStyler.showHashtag ? "#$stringContent" : stringContent; + final Container tag = Container( + padding: widget.tagsStyler.tagPadding, + decoration: widget.tagsStyler.tagDecoration, + margin: widget.tagsStyler.tagMargin, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: widget.tagsStyler.tagTextPadding, + child: Text( + stringContentWithHash, + style: widget.tagsStyler.tagTextStyle, + ), + ), + Padding( + padding: widget.tagsStyler.tagCancelIconPadding, + child: GestureDetector( + onTap: () { + widget.onDelete(stringContent); + listItems.remove(stringContent); + widget.onList(listItems); + if( listItems.isEmpty){ + setState(() { + _errorMessage = "Please enter something"; + }); + } + if (_tagsStringContents!.length <= 1 && _showPrefixIcon) { + setState(() { + _tagsStringContents!.remove(stringContent); + _showPrefixIcon = false; + }); + } else { + setState(() { + _tagsStringContents!.remove(stringContent); + }); + } + }, + child: widget.tagsStyler.tagCancelIcon, + ), + ), + ], + ), + ); + _tags.add(tag); + } + return _tags; + } + + void _animateTransition() { + WidgetsBinding.instance!.addPostFrameCallback((_) { + if (_scrollController!.hasClients) { + _scrollController!.animateTo( + _scrollController!.position.maxScrollExtent, + duration: const Duration(milliseconds: 300), + curve: Curves.linear, + ); + } + }); + } + + @override + Widget build(BuildContext context) { + + + return TextField( + controller: _textEditingController, + autocorrect: false, + cursorColor: widget.textFieldStyler.cursorColor, + style: widget.textFieldStyler.textStyle, + decoration: InputDecoration( + errorText: _errorMessage, + icon: widget.textFieldStyler.icon, + contentPadding: widget.textFieldStyler.contentPadding, + isDense: widget.textFieldStyler.isDense, + helperText: _showValidator + ? _validatorMessage + : widget.textFieldStyler.helperText, + helperStyle: _showValidator + ? const TextStyle(color: Colors.red) + : widget.textFieldStyler.helperStyle, + hintText: !_showPrefixIcon ? widget.textFieldStyler.hintText : null, + hintStyle: !_showPrefixIcon ? widget.textFieldStyler.hintStyle : null, + filled: true, + fillColor: Color(0xff202330), + enabled: widget.textFieldStyler.textFieldEnabled, + border: widget.textFieldStyler.textFieldBorder, + focusedBorder: widget.textFieldStyler.textFieldFocusedBorder, + disabledBorder: widget.textFieldStyler.textFieldDisabledBorder, + enabledBorder: widget.textFieldStyler.textFieldEnabledBorder, + prefixIcon: _showPrefixIcon + ? ConstrainedBox( + constraints: BoxConstraints( + maxWidth: _deviceWidth * widget.tagsDistanceFromBorderEnd, + ), + child: Container( + margin: widget.scrollableTagsMargin, + padding: widget.scrollableTagsPadding, + child: SingleChildScrollView( + controller: _scrollController, + scrollDirection: Axis.horizontal, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: _getTags, + ), + ), + ), + ) + : null, + ), + onSubmitted: (value) { + if (_showValidator == false) { + final String val = value.trim().toLowerCase(); + _textEditingController!.clear(); + if (widget.validator == null || widget.validator!(val) == null) { + widget.onTag(val); + listItems.add(val); + widget.onList(listItems); + if( listItems.isEmpty){ + setState(() { + _errorMessage = "Please enter something"; + }); + } + + if (!_showPrefixIcon) { + setState(() { + _tagsStringContents!.add(val); + _showPrefixIcon = true; + }); + } else { + setState(() { + _tagsStringContents!.add(val); + }); + } + this._animateTransition(); + } else { + setState(() { + _showValidator = true; + _validatorMessage = widget.validator!(val)!; + }); + } + } + }, + onChanged: (value) { + if (_showValidator == false) { + final containedSeparator = widget.textSeparators! + .cast() + .firstWhere( + (element) => + value.contains(element!) && value.indexOf(element) != 0, + orElse: () => null); + if (containedSeparator != null) { + final splits = value.split(containedSeparator); + final int indexer = + splits.length > 1 ? splits.length - 2 : splits.length - 1; + final String lastLastTag = + splits.elementAt(indexer).trim().toLowerCase(); + + _textEditingController!.clear(); + + if (widget.validator == null || + widget.validator!(lastLastTag) == null) { + widget.onTag(lastLastTag); + listItems.add(lastLastTag); + widget.onList(listItems); + if( listItems.isEmpty){ + setState(() { + _errorMessage = "Please enter something"; + }); + } + if (!_showPrefixIcon) { + setState(() { + _tagsStringContents!.add(lastLastTag); + _showPrefixIcon = true; + }); + } else { + setState(() { + _tagsStringContents!.add(lastLastTag); + }); + } + this._animateTransition(); + } else { + setState(() { + _showValidator = true; + _validatorMessage = widget.validator!(lastLastTag)!; + }); + } + } + } else { + setState(() { + _showValidator = false; + }); + } + }, + ); + } +} From daa4610cfbab3934f7f6e4d62701d20351027cee Mon Sep 17 00:00:00 2001 From: Soorya S Date: Sun, 26 Dec 2021 19:51:29 +0530 Subject: [PATCH 074/264] Changed autovalidate always to onUserInteraction --- lib/Screens/FamilyMemberAdd.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 0c7ef29..50a7b0f 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -78,14 +78,14 @@ class _FamilyMemberAddState extends State { } else return null; }, - autovalidateMode: AutovalidateMode.always, + autovalidateMode: AutovalidateMode.onUserInteraction, ), ), DatePickerWidget( context: context, title: "Date of Birth", hint: "Choose a date", - autoValidateMode: AutovalidateMode.always, + autoValidateMode: AutovalidateMode.onUserInteraction, onSaved: (data) { print(data); }, @@ -133,7 +133,7 @@ class _FamilyMemberAddState extends State { } else return null; }, - autovalidateMode: AutovalidateMode.always, + autovalidateMode: AutovalidateMode.onUserInteraction, ), ), DropDownFormField( @@ -178,7 +178,7 @@ class _FamilyMemberAddState extends State { } else return null; }, - autovalidateMode: AutovalidateMode.always, + autovalidateMode: AutovalidateMode.onUserInteraction, ), ), DropDownFormField( From 960f87fee3578799b5d317da44e813e51db07638 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Mon, 27 Dec 2021 18:01:45 +0530 Subject: [PATCH 075/264] Added local storage option for Communinty Data Collection --- android/app/src/main/AndroidManifest.xml | 2 + lib/Model/CommunityDataModel.dart | 138 +++++++++- lib/Screens/CommunityDataCollection.dart | 153 ++++++----- lib/Screens/Home.dart | 49 +++- lib/Screens/SavedData.dart | 140 ++++++++-- lib/Utils/StoreInstance.dart | 21 ++ lib/Widgets/FormPageView.dart | 116 +++++++-- lib/objectbox-model.json | 67 +++++ lib/objectbox.g.dart | 205 +++++++++++++++ pubspec.lock | 312 ++++++++++++++++++++++- pubspec.yaml | 4 + 11 files changed, 1072 insertions(+), 135 deletions(-) create mode 100644 lib/Utils/StoreInstance.dart create mode 100644 lib/objectbox-model.json create mode 100644 lib/objectbox.g.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3637f14..d037258 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,6 +4,8 @@ + + data = locationTopLeft!.toJson(); + var encodedData = json.encode(data); + print(encodedData); + return encodedData; + } + } + + set dbLocationTopLeft(String? value) { + if (value == null) { + locationTopLeft = null; + } else { + final body = json.decode(value.trim()); + ; + locationTopLeft = new Position( + longitude: body['longitude'] ?? 0, + latitude: body['latitude'] ?? 0, + timestamp: DateTime.fromMicrosecondsSinceEpoch(body['timestamp']), + accuracy: body['accuracy'] ?? 0, + altitude: body['altitude'] ?? 0, + heading: body['heading'] ?? 0, + speed: body['speed'] ?? 0, + speedAccuracy: body['speedAccuracy'] ?? 0); + } + } + + String? get dbLocationTopRight { + if (locationTopRight == null) { + return null; + } else { + Map data = locationTopRight!.toJson(); + var encodedData = json.encode(data); + print(encodedData); + return encodedData; + } + } + + set dbLocationTopRight(String? value) { + if (value == null) { + locationTopRight = null; + } else { + final body = json.decode(value.trim()); + ; + locationTopRight = new Position( + longitude: body['longitude'] ?? 0, + latitude: body['latitude'] ?? 0, + timestamp: DateTime.fromMicrosecondsSinceEpoch(body['timestamp']), + accuracy: body['accuracy'] ?? 0, + altitude: body['altitude'] ?? 0, + heading: body['heading'] ?? 0, + speed: body['speed'] ?? 0, + speedAccuracy: body['speedAccuracy'] ?? 0); + } + } + + String? get dbLocationBottomLeft { + if (locationBottomLeft == null) { + return null; + } else { + Map data = locationBottomLeft!.toJson(); + var encodedData = json.encode(data); + print(encodedData); + return encodedData; + } + } + + set dbLocationBottomLeft(String? value) { + if (value == null) { + locationBottomLeft = null; + } else { + final body = json.decode(value.trim()); + ; + locationBottomLeft = new Position( + longitude: body['longitude'] ?? 0, + latitude: body['latitude'] ?? 0, + timestamp: DateTime.fromMicrosecondsSinceEpoch(body['timestamp']), + accuracy: body['accuracy'] ?? 0, + altitude: body['altitude'] ?? 0, + heading: body['heading'] ?? 0, + speed: body['speed'] ?? 0, + speedAccuracy: body['speedAccuracy'] ?? 0); + } + } + + String? get dbLocationBottomRight { + if (locationBottomRight == null) { + return null; + } else { + Map data = locationBottomRight!.toJson(); + var encodedData = json.encode(data); + print(encodedData); + return encodedData; + } + } + + set dbLocationBottomRight(String? value) { + if (value == null) { + locationBottomRight = null; + } else { + final body = json.decode(value.trim()); + ; + print(body); + locationBottomRight = new Position( + longitude: body['longitude'] ?? 0, + latitude: body['latitude'] ?? 0, + timestamp: DateTime.fromMicrosecondsSinceEpoch(body['timestamp']), + accuracy: body['accuracy'] ?? 0, + altitude: body['altitude'] ?? 0, + heading: body['heading'] ?? 0, + speed: body['speed'] ?? 0, + speedAccuracy: body['speedAccuracy'] ?? 0); + } + } CommunityDataModel( {this.locationBottomLeft, diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 3f2b228..c6415f1 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,14 +1,18 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; +import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/LocationWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/objectbox.g.dart'; +import 'package:geolocator/geolocator.dart'; class CommunityDataCollection extends StatefulWidget { - CommunityDataCollection({Key? key, CommunityDataModel? this.modelData}) : super(key: key); + CommunityDataCollection({Key? key, CommunityDataModel? this.modelData}) + : super(key: key); final modelData; final List _publicResourceList = [ @@ -51,17 +55,18 @@ class _CommunityDataCollectionState extends State { final List> formKeyList = List.generate(3, (index) => GlobalObjectKey(index)); - + late CommunityDataModel modelData; + var store; @override Widget build(BuildContext context) { - CommunityDataModel modelData = widget.modelData ?? CommunityDataModel(); + modelData = widget.modelData ?? new CommunityDataModel(); - _onSubmit(bool isValid) { + _onSubmit(bool isValid) async { print("All data valid"); print(isValid.toString()); - if(isValid){ + if (isValid) { print("Valid!"); print(modelData.villageCode); print(modelData.locationBottomRight); @@ -74,71 +79,85 @@ class _CommunityDataCollectionState extends State { } } + _onSave() async { + print("CLICKED"); + store = await StoreInstance.getInstance(); + final box = store.box(); + print("Entering data at id ${await box.putAsync(modelData)}"); + } + return Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Community Data'), - body: FormPageView([ - DropDownFormField( - defaultValue: modelData.resourceType, - list: widget._publicResourceList, - onSaved: (data){ - print(data); - modelData.resourceType = data; - }, - title: "Choose type of resource to tag", - hint: "Select resource type", - errorField: "Please choose a resource to tag"), - LocationWidgetField( - title: "Record location at top left part of the facility", - defaultValue: modelData.locationTopLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopLeft = data; - }, - autoValidateMode: AutovalidateMode.disabled), - LocationWidgetField( - title: "Record location at top right part of the facility", - defaultValue: modelData.locationTopRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopRight = data; - - }, - autoValidateMode: AutovalidateMode.disabled), - LocationWidgetField( - title: "Record location at bottom left part of the facility", - defaultValue: modelData.locationBottomLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomLeft = data; - - }, - autoValidateMode: AutovalidateMode.disabled), - LocationWidgetField( - title: "Record location at bottom right part of the facility", - defaultValue: modelData.locationBottomRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomRight = data; - - }, - autoValidateMode: AutovalidateMode.disabled), - DropDownFormField( - defaultValue: modelData.villageCode, - list: widget._villageCodeName, - onSaved: (data) { - print(data); - modelData.villageCode = data; - - }, - title: "Choose Village Code", - hint: "Select Village Code", - errorField: "Please choose a village code"), - ], _onSubmit), + body: FormPageView( + [ + DropDownFormField( + defaultValue: modelData.resourceType, + list: widget._publicResourceList, + onSaved: (data) { + print(data); + modelData.resourceType = data; + }, + title: "Choose type of resource to tag", + hint: "Select resource type", + errorField: "Please choose a resource to tag"), + LocationWidgetField( + title: "Record location at top left part of the facility", + defaultValue: modelData.locationTopLeft, + context: context, + onSaved: (data) { + print(data); + modelData.locationTopLeft = data; + }, + autoValidateMode: AutovalidateMode.disabled), + LocationWidgetField( + title: "Record location at top right part of the facility", + defaultValue: modelData.locationTopRight, + context: context, + onSaved: (data) { + print(data); + modelData.locationTopRight = data; + }, + autoValidateMode: AutovalidateMode.disabled), + LocationWidgetField( + title: "Record location at bottom left part of the facility", + defaultValue: modelData.locationBottomLeft, + context: context, + onSaved: (data) { + print(data); + modelData.locationBottomLeft = data; + }, + autoValidateMode: AutovalidateMode.disabled), + LocationWidgetField( + title: "Record location at bottom right part of the facility", + defaultValue: modelData.locationBottomRight, + context: context, + onSaved: (data) { + print(data); + modelData.locationBottomRight = data; + }, + autoValidateMode: AutovalidateMode.disabled), + DropDownFormField( + defaultValue: modelData.villageCode, + list: widget._villageCodeName, + onSaved: (data) { + print(data); + modelData.villageCode = data; + }, + title: "Choose Village Code", + hint: "Select Village Code", + errorField: "Please choose a village code"), + ], + _onSubmit, + submitMessage: "Submit record to server or Save record locally for later editing", + saveData: _onSave, + note: "Note: Saving existing records will over write the record and not create new one", + ), ); } + + @override + void dispose() { + super.dispose(); + } } diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 6674d64..4de0874 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -32,7 +32,8 @@ class _HomeWidgetState extends State { elevation: 0, title: Text( 'Hello, ' + userName + '!', - style: GoogleFonts.montserrat(fontSize: 20, color: colors.darkPrimaryTextColor), + style: GoogleFonts.montserrat( + fontSize: 20, color: colors.darkPrimaryTextColor), ), backgroundColor: Colors.transparent, actions: [ @@ -69,13 +70,52 @@ class _HomeWidgetState extends State { 'assets/svg/female.svg', FamilyHomeScreen(), Color(0xfff54b64), - Color(0xfff78361)), + Color(0xfff78361)), DataCard( 'Community Details', 'Data entry for communities', 'assets/svg/house.svg', - CommunityDataCollection(modelData: CommunityDataModel(resourceType: "Bakeries", locationBottomLeft: - new Position(latitude: 1.2, longitude: 2.4, accuracy: 32, heading: 21, speedAccuracy: 32, altitude: 23, speed: 32, timestamp: null ))), + CommunityDataCollection( + /* + modelData: new CommunityDataModel( + resourceType: "Bakeries", + locationBottomLeft: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + locationBottomRight: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + locationTopRight: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + locationTopLeft: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + villageCode: "Temple")*/), Color(0xfff54b64), Color(0xfff78361)), DataCard( @@ -92,7 +132,6 @@ class _HomeWidgetState extends State { SavedDataPage(), Color(0xfff54b64), Color(0xfff78361)), - ], ), ), diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart index e42ab16..d3091d4 100644 --- a/lib/Screens/SavedData.dart +++ b/lib/Screens/SavedData.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Model/CommunityDataModel.dart'; +import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; +import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; @@ -15,8 +17,16 @@ class SavedDataPage extends StatelessWidget { appBar: AppBar( bottom: TabBar( tabs: [ - Tab(icon: Icon(Icons.person,color: colors.darkPrimaryTextColor,)), - Tab(icon: Icon(Icons.people,color: colors.darkPrimaryTextColor,)), + Tab( + icon: Icon( + Icons.person, + color: colors.darkPrimaryTextColor, + )), + Tab( + icon: Icon( + Icons.people, + color: colors.darkPrimaryTextColor, + )), ], ), backgroundColor: Colors.transparent, @@ -33,36 +43,126 @@ class SavedDataPage extends StatelessWidget { centerTitle: true, title: Text( "Saved Data", - style: GoogleFonts.montserrat(fontSize: 20, color: colors.darkPrimaryTextColor), + style: GoogleFonts.montserrat( + fontSize: 20, color: colors.darkPrimaryTextColor), ), ), backgroundColor: colors.darkScaffoldColor, body: SafeArea( - child: const TabBarView( - children: [ - SavedListWidget(list: [],), - SavedListWidget(list: ['Hye', 'hey', 'sad'],), - ], - ), + child: TabBarView( + children: [ + SavedListWidget(), + MaterialButton( + onPressed: () async { + var store = await StoreInstance.getInstance(); + final box = store.box(); + List? list = await box.getAll(); + for (var i in list) { + print(i.id); + print(i.resourceType); + print(i.villageCode); + print(i.locationTopLeft); + print(i.locationTopRight); + print(i.locationBottomLeft); + print(i.locationBottomRight); + print(i.resourceType); + } + }, + child: Text("Click me"), + ) + ], + ), ), ), ); } } -class SavedListWidget extends StatelessWidget { - const SavedListWidget({Key? key, required this.list}) : super(key: key); +class SavedListWidget extends StatefulWidget { + const SavedListWidget({Key? key}) : super(key: key); - final list; + @override + State createState() => _SavedListWidgetState(); +} + +class _SavedListWidgetState extends State { + Future getList() async { + var store = await StoreInstance.getInstance(); + final box = store.box(); + List? list = await box.getAll(); + return await list; + } @override Widget build(BuildContext context) { - return list.isEmpty ? Center(child: Text('No Saved Items')) : ListView.builder( - itemCount: list.length, - itemBuilder: (context, index) { - return ListTile(title: Text(list[index]),); - }, - ); + return FutureBuilder( + future: getList(), + builder: (context, AsyncSnapshot data) { + if (data.data != null) { + print("HAS DATA"); + List? list = data.data; + if (list != null) { + if (list.isEmpty) { + return Center(child: Text('No Saved Items')); + } else { + list = list.reversed.toList(); + return ListView.builder( + itemCount: list.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.all(3), + child: Card( + color: colors.darkSecondBackgroundColor, + child: ListTile( + title: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + list![index].resourceType ?? "Empty Resource", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + Text( + list[index].savedTime ?? "", + style: GoogleFonts.poppins( + color: Colors.white30, + fontWeight: FontWeight.w400, + fontSize: 12), + ) + ], + ), + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => CommunityDataCollection( + modelData: list![index], + ))); + }, + trailing: IconButton( + color: colors.darkSecondAccentColor, + icon: Icon(Icons.close), + onPressed: () async { + var store = await StoreInstance.getInstance(); + final box = store.box(); + await box.remove(list![index].id); + setState(() { + + }); + }, + ), + ), + ), + ); + }, + ); + } + } else { + return Center(child: Text('No Saved Items')); + } + } else + return Center(child: Text('No Saved Items')); + }); } } - diff --git a/lib/Utils/StoreInstance.dart b/lib/Utils/StoreInstance.dart new file mode 100644 index 0000000..ab7f40d --- /dev/null +++ b/lib/Utils/StoreInstance.dart @@ -0,0 +1,21 @@ +import 'package:geo_spatial/objectbox.g.dart'; + +class StoreInstance { + static var store = null; + static var box = null; + + static Future getInstance() async { + if (store == null) { + try { + store = await openStore(); + } catch (error) { + print(error); + store.close(); + store = await openStore(); + } + print("NULL"); + } + return store; + } + +} diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 10b429e..65c11e9 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -2,15 +2,20 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; +import 'package:google_fonts/google_fonts.dart'; import 'PageViewContentBox.dart'; class FormPageView extends StatefulWidget { - const FormPageView(this.pageWidgetList, this.onSubmit, {Key? key}) + const FormPageView(this.pageWidgetList, this.onSubmit, + {Key? key, this.saveData, this.submitMessage, this.note}) : super(key: key); final List pageWidgetList; final Function(bool) onSubmit; + final saveData; + final submitMessage; + final note; @override _FormPageViewState createState() => _FormPageViewState(); @@ -47,30 +52,85 @@ class _FormPageViewState extends State { formKeyList[index], ))); widgetList.add(PageViewContentBox(Center( - child: SizedBox( - width: double.infinity, - height: 70, - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all(Colors.white), - backgroundColor: MaterialStateProperty.all(colors.darkScaffoldColor), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: colors.darkScaffoldColor)))), - onPressed: () { - bool isValid = true; - for (int i = 0; i < widgetLength - 1; i++) { - var isDataValid = formKeyList[i].currentState!.validate(); - isValid &= isDataValid; - - if (isDataValid) { - formKeyList[i].currentState!.save(); - } - } - widget.onSubmit(isValid); - }), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + widget.submitMessage ?? "", + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + color: Colors.white, fontWeight: FontWeight.w400, fontSize: 25), + ), + Padding( + padding: EdgeInsets.only(top: 10), + child: SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkScaffoldColor), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors.darkScaffoldColor)))), + onPressed: () { + bool isValid = true; + for (int i = 0; i < widgetLength - 1; i++) { + var isDataValid = formKeyList[i].currentState!.validate(); + isValid &= isDataValid; + + if (isDataValid) { + formKeyList[i].currentState!.save(); + } + } + widget.onSubmit(isValid); + }), + ), + ), + widget.saveData != null + ? Padding( + padding: EdgeInsets.only(top: 10), + child: SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + child: Text("Save Data", + style: + TextStyle(fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: + MaterialStateProperty.all(Colors.white), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white)))), + onPressed: () { + widget.saveData(); + }), + ), + ) + : Container(), + Padding( + padding: EdgeInsets.only(top: 20, left: 10, right: 10), + child: Text( + widget.note ?? "", + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + color: Colors.white38, + fontWeight: FontWeight.w400, + fontSize: 13), + ), + ) + ], ), ))); } @@ -131,9 +191,9 @@ class _FormKeepAliveState extends State Widget build(BuildContext context) { super.build(context); return Form( - child: widget.childWidget, - key: widget._formKey, - ); + child: widget.childWidget, + key: widget._formKey, + ); } @override diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json new file mode 100644 index 0000000..8a080cd --- /dev/null +++ b/lib/objectbox-model.json @@ -0,0 +1,67 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:8881235461456447261", + "lastPropertyId": "8:2203659096246358776", + "name": "CommunityDataModel", + "properties": [ + { + "id": "1:8191075196018249341", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:8796057529052012615", + "name": "resourceType", + "type": 9 + }, + { + "id": "3:3649664257574360958", + "name": "villageCode", + "type": 9 + }, + { + "id": "4:6797539933900877027", + "name": "dbLocationTopLeft", + "type": 9 + }, + { + "id": "5:8489064245075560644", + "name": "dbLocationTopRight", + "type": 9 + }, + { + "id": "6:4981340637280440404", + "name": "dbLocationBottomLeft", + "type": 9 + }, + { + "id": "7:8742277346966043541", + "name": "dbLocationBottomRight", + "type": 9 + }, + { + "id": "8:2203659096246358776", + "name": "savedTime", + "type": 9 + } + ], + "relations": [] + } + ], + "lastEntityId": "1:8881235461456447261", + "lastIndexId": "0:0", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart new file mode 100644 index 0000000..9d8eb47 --- /dev/null +++ b/lib/objectbox.g.dart @@ -0,0 +1,205 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ignore_for_file: camel_case_types + +import 'dart:typed_data'; + +import 'package:objectbox/flatbuffers/flat_buffers.dart' as fb; +import 'package:objectbox/internal.dart'; // generated code can access "internal" functionality +import 'package:objectbox/objectbox.dart'; +import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; + +import 'Model/CommunityDataModel.dart'; + +export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file + +final _entities = [ + ModelEntity( + id: const IdUid(1, 8881235461456447261), + name: 'CommunityDataModel', + lastPropertyId: const IdUid(8, 2203659096246358776), + flags: 0, + properties: [ + ModelProperty( + id: const IdUid(1, 8191075196018249341), + name: 'id', + type: 6, + flags: 1), + ModelProperty( + id: const IdUid(2, 8796057529052012615), + name: 'resourceType', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(3, 3649664257574360958), + name: 'villageCode', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(4, 6797539933900877027), + name: 'dbLocationTopLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(5, 8489064245075560644), + name: 'dbLocationTopRight', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(6, 4981340637280440404), + name: 'dbLocationBottomLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(7, 8742277346966043541), + name: 'dbLocationBottomRight', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(8, 2203659096246358776), + name: 'savedTime', + type: 9, + flags: 0) + ], + relations: [], + backlinks: []) +]; + +/// Open an ObjectBox store with the model declared in this file. +Future openStore( + {String? directory, + int? maxDBSizeInKB, + int? fileMode, + int? maxReaders, + bool queriesCaseSensitiveDefault = true, + String? macosApplicationGroup}) async => + Store(getObjectBoxModel(), + directory: directory ?? (await defaultStoreDirectory()).path, + maxDBSizeInKB: maxDBSizeInKB, + fileMode: fileMode, + maxReaders: maxReaders, + queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, + macosApplicationGroup: macosApplicationGroup); + +/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel()) +ModelDefinition getObjectBoxModel() { + final model = ModelInfo( + entities: _entities, + lastEntityId: const IdUid(1, 8881235461456447261), + lastIndexId: const IdUid(0, 0), + lastRelationId: const IdUid(0, 0), + lastSequenceId: const IdUid(0, 0), + retiredEntityUids: const [], + retiredIndexUids: const [], + retiredPropertyUids: const [], + retiredRelationUids: const [], + modelVersion: 5, + modelVersionParserMinimum: 5, + version: 1); + + final bindings = { + CommunityDataModel: EntityDefinition( + model: _entities[0], + toOneRelations: (CommunityDataModel object) => [], + toManyRelations: (CommunityDataModel object) => {}, + getId: (CommunityDataModel object) => object.id, + setId: (CommunityDataModel object, int id) { + object.id = id; + }, + objectToFB: (CommunityDataModel object, fb.Builder fbb) { + final resourceTypeOffset = object.resourceType == null + ? null + : fbb.writeString(object.resourceType!); + final villageCodeOffset = object.villageCode == null + ? null + : fbb.writeString(object.villageCode!); + final dbLocationTopLeftOffset = object.dbLocationTopLeft == null + ? null + : fbb.writeString(object.dbLocationTopLeft!); + final dbLocationTopRightOffset = object.dbLocationTopRight == null + ? null + : fbb.writeString(object.dbLocationTopRight!); + final dbLocationBottomLeftOffset = object.dbLocationBottomLeft == null + ? null + : fbb.writeString(object.dbLocationBottomLeft!); + final dbLocationBottomRightOffset = + object.dbLocationBottomRight == null + ? null + : fbb.writeString(object.dbLocationBottomRight!); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); + fbb.startTable(9); + fbb.addInt64(0, object.id); + fbb.addOffset(1, resourceTypeOffset); + fbb.addOffset(2, villageCodeOffset); + fbb.addOffset(3, dbLocationTopLeftOffset); + fbb.addOffset(4, dbLocationTopRightOffset); + fbb.addOffset(5, dbLocationBottomLeftOffset); + fbb.addOffset(6, dbLocationBottomRightOffset); + fbb.addOffset(7, savedTimeOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + + final object = CommunityDataModel( + resourceType: const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 6), + villageCode: const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 8)) + ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) + ..dbLocationTopLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 10) + ..dbLocationTopRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 12) + ..dbLocationBottomLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 14) + ..dbLocationBottomRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 16) + ..savedTime = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 18); + + return object; + }) + }; + + return ModelDefinition(model, bindings); +} + +/// [CommunityDataModel] entity fields to define ObjectBox queries. +class CommunityDataModel_ { + /// see [CommunityDataModel.id] + static final id = + QueryIntegerProperty(_entities[0].properties[0]); + + /// see [CommunityDataModel.resourceType] + static final resourceType = + QueryStringProperty(_entities[0].properties[1]); + + /// see [CommunityDataModel.villageCode] + static final villageCode = + QueryStringProperty(_entities[0].properties[2]); + + /// see [CommunityDataModel.dbLocationTopLeft] + static final dbLocationTopLeft = + QueryStringProperty(_entities[0].properties[3]); + + /// see [CommunityDataModel.dbLocationTopRight] + static final dbLocationTopRight = + QueryStringProperty(_entities[0].properties[4]); + + /// see [CommunityDataModel.dbLocationBottomLeft] + static final dbLocationBottomLeft = + QueryStringProperty(_entities[0].properties[5]); + + /// see [CommunityDataModel.dbLocationBottomRight] + static final dbLocationBottomRight = + QueryStringProperty(_entities[0].properties[6]); + + /// see [CommunityDataModel.savedTime] + static final savedTime = + QueryStringProperty(_entities[0].properties[7]); +} diff --git a/pubspec.lock b/pubspec.lock index c3925fd..bb5f8aa 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,27 @@ # 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: "31.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" async: dependency: transitive description: @@ -15,6 +36,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.7" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.3" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "8.1.3" characters: dependency: transitive description: @@ -29,6 +106,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" clock: dependency: transitive description: @@ -36,6 +127,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.0" collection: dependency: transitive description: @@ -43,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" crypto: dependency: transitive description: @@ -56,7 +161,14 @@ packages: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.4" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" fake_async: dependency: transitive description: @@ -78,6 +190,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" flutter: dependency: "direct main" description: flutter @@ -135,6 +254,13 @@ packages: description: flutter source: sdk version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" gender_picker: dependency: "direct main" description: @@ -177,12 +303,26 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.6" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" google_fonts: dependency: "direct main" description: name: google_fonts url: "https://pub.dartlang.org" source: hosted + version: "2.1.1" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted version: "2.1.0" http: dependency: "direct main" @@ -191,6 +331,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.13.4" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" http_parser: dependency: transitive description: @@ -205,6 +352,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.17.0" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" js: dependency: transitive description: @@ -212,6 +366,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.3" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" matcher: dependency: transitive description: @@ -226,6 +394,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + objectbox: + dependency: "direct main" + description: + name: objectbox + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + objectbox_flutter_libs: + dependency: "direct main" + description: + name: objectbox_flutter_libs + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + objectbox_generator: + dependency: "direct dev" + description: + name: objectbox_generator + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" path: dependency: transitive description: @@ -253,21 +456,35 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.8" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.4" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.4" path_provider_platform_interface: dependency: transitive description: @@ -281,7 +498,7 @@ packages: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" petitparser: dependency: transitive description: @@ -295,7 +512,7 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: @@ -303,13 +520,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.2" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.2.4" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" simple_gesture_detector: dependency: transitive description: @@ -322,6 +574,13 @@ packages: description: flutter source: sdk version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" source_span: dependency: transitive description: @@ -350,6 +609,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" string_scanner: dependency: transitive description: @@ -363,7 +629,7 @@ packages: name: table_calendar url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.0.3" term_glyph: dependency: transitive description: @@ -385,6 +651,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.4.2" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" typed_data: dependency: transitive description: @@ -399,13 +672,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.1" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.2.9" + version: "2.3.3" xdg_directories: dependency: transitive description: @@ -420,6 +707,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.3.1" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" sdks: dart: ">=2.14.0 <3.0.0" flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index e93e3e6..56354f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,8 @@ environment: sdk: ">=2.12.0 <3.0.0" dependencies: + objectbox: ^1.3.0 + objectbox_flutter_libs: any flutter_svg: 0.23.0 geolocator: ^7.7.1 http: 0.13.4 @@ -41,6 +43,8 @@ dependencies: textfield_tags: dev_dependencies: + build_runner: ^2.0.0 + objectbox_generator: any flutter_test: sdk: flutter From fadb327b08e089b37361aa975ed92e120f28d9be Mon Sep 17 00:00:00 2001 From: Soorya S Date: Mon, 27 Dec 2021 22:35:39 +0530 Subject: [PATCH 076/264] Added model for Family data and implemented save features, remaining values has to be implemented --- android/app/src/main/AndroidManifest.xml | 2 +- lib/Model/FamilyMembersCommomDataModel.dart | 143 +++++++++++ lib/Screens/CollectLocationWidget.dart | 82 ++++++ lib/Screens/CommunityDataCollection.dart | 49 +++- lib/Screens/FamilyHomeScreen.dart | 80 ++++-- lib/Screens/FamilyMemberAdd.dart | 21 +- lib/Screens/SavedData.dart | 138 ++++++++--- lib/Widgets/AddRemoveBoxWidget.dart | 99 ++++---- lib/Widgets/FormPageView.dart | 4 +- lib/main.dart | 3 +- lib/objectbox-model.json | 92 ++++++- lib/objectbox.g.dart | 260 +++++++++++++++++++- 12 files changed, 845 insertions(+), 128 deletions(-) create mode 100644 lib/Model/FamilyMembersCommomDataModel.dart create mode 100644 lib/Screens/CollectLocationWidget.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d037258..b1f16c8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" - android:windowSoftInputMode="adjustResize"> + android:windowSoftInputMode="stateVisible"> P@$9>!U4X(_sJKT;q3t~lvYAkb_u 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 diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 9a78543..66c2087 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -35,6 +35,8 @@ class CommunityDataCollection extends StatefulWidget { 'Food processing units' ]; + //TODO: Replace with list of village codes + final List _villageCodeName = [ 'Temple', 'Church', @@ -78,7 +80,7 @@ class _CommunityDataCollectionState extends State { } else{ ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text("Please fill all fields!", style: TextStyle(color: Colors.red),), + content: Text("Please fill all fields!", style: TextStyle(color: colors.errorColor),), )); } } diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index e7aa659..eb375cd 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -1,12 +1,13 @@ import 'dart:convert'; - +import 'package:geo_spatial/Utils/colors.dart' as colors; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/Home.dart'; -import 'package:geo_spatial/Widgets/FormCard.dart'; +import 'package:geo_spatial/Widgets/LoginFormCard.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import 'package:geo_spatial/Utils/Globals.dart' as globals; final storage = FlutterSecureStorage(); @@ -104,13 +105,13 @@ class _MyAppState extends State { padding: EdgeInsets.all(2.0), decoration: BoxDecoration( shape: BoxShape.circle, - border: Border.all(width: 2.0, color: Color(0xffe29662))), + border: Border.all(width: 2.0, color: colors.darkAccentColor)), child: isSelected ? Container( width: double.infinity, height: double.infinity, decoration: - BoxDecoration(shape: BoxShape.circle, color: Color(0xffe29662)), + BoxDecoration(shape: BoxShape.circle, color: colors.darkAccentColor), ) : Container(), ); @@ -128,13 +129,14 @@ class _MyAppState extends State { Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, - backgroundColor: Color(0xff333034), + backgroundColor: colors.darkScaffoldColor, body: Stack( fit: StackFit.expand, children: [ Container( - padding: EdgeInsets.only(top: MediaQuery.of(context).size.height*0.62), - child: Image(image: AssetImage("assets/Illustration.png"),), + decoration: BoxDecoration( + image: DecorationImage(image: AssetImage("assets/Illustration.png"),fit: BoxFit.cover) + ), ), SingleChildScrollView( child: Padding( @@ -142,7 +144,7 @@ class _MyAppState extends State { child: Column( children: [ SizedBox( - height: MediaQuery.of(context).size.height * 0.23, + height: MediaQuery.of(context).size.height * 0.48, ), FormCard(_usernameController, _passwordController, _nameError, _passwordError), @@ -166,7 +168,7 @@ class _MyAppState extends State { ), Text("Remember me", style: GoogleFonts.poppins( - color: Color(0xffE9AA4C), fontSize: 14.0)) + color: colors.darkAccentColor, fontSize: 14.0)) ], ), InkWell( @@ -175,8 +177,8 @@ class _MyAppState extends State { height: 45, decoration: BoxDecoration( gradient: LinearGradient(colors: [ - Color(0xffe29662), - Color(0xffefc1a9), + Color(0xfff54b64), + Color(0xfff78361), ]), borderRadius: BorderRadius.circular(30.0), ), diff --git a/lib/Utils/Colors.dart b/lib/Utils/Colors.dart index 79f04fb..bb1ec45 100644 --- a/lib/Utils/Colors.dart +++ b/lib/Utils/Colors.dart @@ -8,4 +8,5 @@ var darkSecondAccentColor = Color(0xff4E596F); var lightPrimaryTextColor = Colors.black; var darkHintColor = Colors.black87; var darkSecondBackgroundColor = Color(0xff34384c); -var errorColor = Color.fromARGB(255, 255, 167, 167); //modify later +var errorColor = Color.fromARGB(255, 255, 167, 167); +var successColor = Color(0xff72de6f);//modify later diff --git a/lib/Utils/Globals.dart b/lib/Utils/Globals.dart new file mode 100644 index 0000000..3da90ef --- /dev/null +++ b/lib/Utils/Globals.dart @@ -0,0 +1,4 @@ +import 'package:flutter/material.dart'; + + +var userName = ""; \ No newline at end of file diff --git a/lib/Widgets/CheckBoxAddExtraDialog.dart b/lib/Widgets/CheckBoxAddExtraDialog.dart index 25dd91d..ad5da57 100644 --- a/lib/Widgets/CheckBoxAddExtraDialog.dart +++ b/lib/Widgets/CheckBoxAddExtraDialog.dart @@ -110,7 +110,7 @@ class CheckBoxAddExtraAlertDialog extends FormField { }, child: Padding( padding: EdgeInsets.only( - left: 10, right: 10, top: 12, bottom: 12), + left: 20, right: 10, top: 12, bottom: 12), child: Row( children: [ Expanded( diff --git a/lib/Widgets/FormCard.dart b/lib/Widgets/FormCard.dart deleted file mode 100644 index c5c7a41..0000000 --- a/lib/Widgets/FormCard.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; - - -class FormCard extends StatelessWidget { - FormCard(this._usernameController, this._passwordController, this._nameError, - this._passwordError); - - final TextEditingController _usernameController; - final TextEditingController _passwordController; - final _nameError; - final _passwordError; - - @override - Widget build(BuildContext context) { - return new Container( - width: double.infinity, - padding: EdgeInsets.only(bottom: 1), - child: Padding( - padding: EdgeInsets.only(left: 8.0, right: 8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("Login", - style: GoogleFonts.poppins(fontWeight: FontWeight.w200, - fontSize: 40, color: Color(0xffF5A06D))), - SizedBox( - height: 10, - ), - TextField( - controller: _usernameController, - decoration: InputDecoration( - hintText: "Enter username here", - hintStyle: GoogleFonts.poppins(color: Color(0xffcec7c3)), - label: Text("Username", - style: GoogleFonts.poppins(color: Color(0xffF5A06D))), - enabledBorder: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0xffF5A06D), width: 1.0)), - focusedBorder: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0xffF5A06D), width: 1.0)), - border: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0xffF5A06D), width: 1.0 - ), - ), - floatingLabelStyle: - GoogleFonts.poppins(color: Color(0xffF5A06D)), - errorText: _nameError, - labelStyle: GoogleFonts.poppins(fontSize: 14)), - cursorColor: Color(0xffF5A06D), - ), - SizedBox( - height: 20, - ), - TextField( - controller: _passwordController, - obscureText: true, - decoration: InputDecoration( - hintText: "Enter password here", - hintStyle: GoogleFonts.poppins(color: Color(0xffcec7c3)), - focusColor: Color(0xffF5A06D), - enabledBorder: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0xffF5A06D), width: 1.0)), - focusedBorder: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0xffF5A06D), width: 1.0)), - border: UnderlineInputBorder( - borderSide: const BorderSide( - color: Color(0xffF5A06D), width: 1.0 - ), - ), - label: Text("Password", - style: GoogleFonts.poppins(color: Color(0xffF5A06D))), - floatingLabelStyle: - GoogleFonts.poppins(color: Color(0xffF5A06D)), - errorText: _passwordError, - labelStyle: GoogleFonts.poppins(fontSize: 14.0), - )), - SizedBox( - height: 20, - ), - ], - ), - ), - ); - } -} diff --git a/lib/Widgets/LoginFormCard.dart b/lib/Widgets/LoginFormCard.dart new file mode 100644 index 0000000..4433dc7 --- /dev/null +++ b/lib/Widgets/LoginFormCard.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; + + +class FormCard extends StatelessWidget { + FormCard(this._usernameController, this._passwordController, this._nameError, + this._passwordError); + + final TextEditingController _usernameController; + final TextEditingController _passwordController; + final _nameError; + final _passwordError; + + @override + Widget build(BuildContext context) { + return new Container( + width: double.infinity, + padding: EdgeInsets.only(bottom: 1), + child: Padding( + padding: EdgeInsets.only(left: 8.0, right: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Login", + textAlign: TextAlign.center, + style: GoogleFonts.montserrat( + fontSize: 40, color: colors.darkAccentColor)), + SizedBox( + height: 30, + ), + TextField( + controller: _usernameController, + decoration: InputDecoration( + hintText: "Enter username here", + hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + label: Text("Username", + style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor)), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, width: 1.0)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0)), + // border: OutlineInputBorder( + // borderSide: BorderSide( + // color: colors.darkSecondaryTextColor, width: 1.0 + // ), + // ), + floatingLabelStyle: + GoogleFonts.poppins(color: colors.darkAccentColor), + errorText: _nameError, + labelStyle: GoogleFonts.poppins(fontSize: 14)), + cursorColor: colors.darkPrimaryTextColor, + ), + SizedBox( + height: 40, + ), + TextField( + controller: _passwordController, + obscureText: true, + decoration: InputDecoration( + hintText: "Enter password here", + hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + focusColor: Color(0xffF5A06D), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, width: 1.0)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0)), + border: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0 + ), + ), + label: Text("Password", + style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor)), + floatingLabelStyle: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + errorText: _passwordError, + labelStyle: GoogleFonts.poppins(fontSize: 14.0,color: colors.darkAccentColor), + )), + SizedBox( + height: 30, + ), + ], + ), + ), + ); + } +} From 574df0507005b5cdedd56c993121dd808cf363e1 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sun, 2 Jan 2022 11:48:26 +0530 Subject: [PATCH 097/264] Completed login screen --- lib/Screens/Login.dart | 174 +++++++++++++++++++++++------------------ 1 file changed, 98 insertions(+), 76 deletions(-) diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index eb375cd..872d591 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -1,13 +1,13 @@ import 'dart:convert'; -import 'package:geo_spatial/Utils/colors.dart' as colors; + import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/Home.dart'; +import 'package:geo_spatial/Utils/colors.dart' as colors; import 'package:geo_spatial/Widgets/LoginFormCard.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; -import 'package:geo_spatial/Utils/Globals.dart' as globals; final storage = FlutterSecureStorage(); @@ -110,8 +110,8 @@ class _MyAppState extends State { ? Container( width: double.infinity, height: double.infinity, - decoration: - BoxDecoration(shape: BoxShape.circle, color: colors.darkAccentColor), + decoration: BoxDecoration( + shape: BoxShape.circle, color: colors.darkAccentColor), ) : Container(), ); @@ -131,83 +131,105 @@ class _MyAppState extends State { resizeToAvoidBottomInset: false, backgroundColor: colors.darkScaffoldColor, body: Stack( - fit: StackFit.expand, - children: [ - Container( - decoration: BoxDecoration( - image: DecorationImage(image: AssetImage("assets/Illustration.png"),fit: BoxFit.cover) - ), - ), - SingleChildScrollView( - child: Padding( - padding: EdgeInsets.only(left: 20.0, right: 20.0), - child: Column( - children: [ - SizedBox( - height: MediaQuery.of(context).size.height * 0.48, - ), - FormCard(_usernameController, _passwordController, - _nameError, _passwordError), - SizedBox( - height: 10, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - SizedBox( - width: 12.0, - ), - GestureDetector( - onTap: _radio, - child: radioButton(_isSelected), - ), - SizedBox( - width: 8.0, - ), - Text("Remember me", - style: GoogleFonts.poppins( - color: colors.darkAccentColor, fontSize: 14.0)) - ], - ), - InkWell( - child: Container( - width: 100, - height: 45, - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Color(0xfff54b64), - Color(0xfff78361), - ]), - borderRadius: BorderRadius.circular(30.0), - ), - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: (){ Navigator.push( + fit: StackFit.expand, + children: [ + Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/Illustration.png"), + fit: BoxFit.cover)), + ), + SingleChildScrollView( + child: Padding( + padding: EdgeInsets.only(left: 20.0, right: 20.0), + child: Column( + children: [ + SizedBox( + height: MediaQuery.of(context).size.height * 0.48, + ), + FormCard(_usernameController, _passwordController, _nameError, + _passwordError), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + SizedBox( + width: 12.0, + ), + GestureDetector( + onTap: _radio, + child: radioButton(_isSelected), + ), + SizedBox( + width: 8.0, + ), + Text("Remember me", + style: GoogleFonts.poppins( + color: colors.darkAccentColor, + fontSize: 14.0)) + ], + ), + InkWell( + child: Container( + width: 100, + height: 45, + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + Color(0xfff54b64), + Color(0xfff78361), + ]), + borderRadius: BorderRadius.circular(30.0), + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + Navigator.push( context, - MaterialPageRoute(builder: (context) => Home()), - );}, - child: Center( - child: Text("SIGN IN", - style: GoogleFonts.poppins( - color: Colors.white, - fontSize: 18, - letterSpacing: 1.0)), - ), + MaterialPageRoute( + builder: (context) => Home()), + ); + }, + child: Center( + child: Text("SIGN IN", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 18, + letterSpacing: 1.0)), ), ), ), - ) - ], - ), - ], - ), + ), + ), + ], + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + ), + Padding( + padding: EdgeInsets.only( + right: MediaQuery.of(context).size.width * 0.125, + bottom: 30), + child: IconButton( + onPressed: () {}, + icon: Icon( + Icons.fingerprint_rounded, + size: 80, + color: colors.darkAccentColor, + ), + splashColor: colors.darkSecondAccentColor, + enableFeedback: true,), + ) + ], ), ), - ], - ), - ); + ), + ], + ), + ); } } From 296abeb578e26b850b6da9b0cd27dd18b9a6e430 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sun, 2 Jan 2022 16:32:24 +0530 Subject: [PATCH 098/264] Started adding biometrics --- lib/Screens/Login.dart | 101 ++++++++++++++++++++++++++++++++++++++++- pubspec.lock | 14 ++++++ pubspec.yaml | 1 + 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 872d591..8d6b8b0 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -1,5 +1,6 @@ import 'dart:convert'; - +import 'package:flutter/services.dart'; +import 'package:local_auth/local_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; @@ -15,6 +16,11 @@ class Login extends StatefulWidget { @override _MyAppState createState() => new _MyAppState(); } +enum _SupportState { + unknown, + supported, + unsupported, +} class _MyAppState extends State { final TextEditingController _usernameController = TextEditingController(); @@ -24,9 +30,97 @@ class _MyAppState extends State { var _passwordError = null; bool _isSelected = false; + + final LocalAuthentication auth = LocalAuthentication(); + _SupportState _supportState = _SupportState.unknown; + bool? _canCheckBiometrics; + List? _availableBiometrics; + String _authorized = 'Not Authorized'; + bool _isAuthenticating = false; + + @override void initState() { super.initState(); + auth.isDeviceSupported().then( + (bool isSupported) => setState(() => _supportState = isSupported + ? _SupportState.supported + : _SupportState.unsupported), + ); + } + + Future _checkBiometrics() async { + late bool canCheckBiometrics; + try { + canCheckBiometrics = await auth.canCheckBiometrics; + } on PlatformException catch (e) { + canCheckBiometrics = false; + print(e); + } + if (!mounted) { + return; + } + + setState(() { + _canCheckBiometrics = canCheckBiometrics; + }); + } + + Future _getAvailableBiometrics() async { + late List availableBiometrics; + try { + availableBiometrics = await auth.getAvailableBiometrics(); + } on PlatformException catch (e) { + availableBiometrics = []; + print(e); + } + if (!mounted) { + return; + } + + setState(() { + _availableBiometrics = availableBiometrics; + }); + } + + Future _authenticateWithBiometrics() async { + bool authenticated = false; + try { + setState(() { + _isAuthenticating = true; + _authorized = 'Authenticating'; + }); + authenticated = await auth.authenticate( + localizedReason: + 'Scan your fingerprint (or face or whatever) to authenticate', + useErrorDialogs: true, + stickyAuth: true, + biometricOnly: true); + setState(() { + _isAuthenticating = false; + _authorized = 'Authenticating'; + }); + } on PlatformException catch (e) { + print(e); + setState(() { + _isAuthenticating = false; + _authorized = 'Error - ${e.message}'; + }); + return; + } + if (!mounted) { + return; + } + + final String message = authenticated ? 'Authorized' : 'Not Authorized'; + setState(() { + _authorized = message; + }); + } + + Future _cancelAuthentication() async { + await auth.stopAuthentication(); + setState(() => _isAuthenticating = false); } void _radio() { @@ -215,7 +309,10 @@ class _MyAppState extends State { right: MediaQuery.of(context).size.width * 0.125, bottom: 30), child: IconButton( - onPressed: () {}, + onPressed: () async { + //bool canCheckBiometrics = + //await localAuth.canCheckBiometrics; + }, icon: Icon( Icons.fingerprint_rounded, size: 80, diff --git a/pubspec.lock b/pubspec.lock index e8b59ce..ed607c5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -223,6 +223,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" flutter_rounded_date_picker: dependency: "direct main" description: @@ -380,6 +387,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.4.0" + local_auth: + dependency: "direct main" + description: + name: local_auth + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.9" logging: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b6876f8..b72f3ea 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,6 +23,7 @@ environment: dependencies: flutter_typeahead: ^3.2.4 objectbox: ^1.3.0 + local_auth: objectbox_flutter_libs: any flutter_svg: 0.23.0 geolocator: ^7.7.1 From 1f85f9d77ab6a02114eebb351527311c8057a11e Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 3 Jan 2022 23:37:20 +0530 Subject: [PATCH 099/264] Replaced checkboxalertdialog with checkboxalert with add element option --- lib/Screens/FamilyMemberAdd.dart | 9 +++++---- pubspec.lock | 10 +++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 581437c..e35e882 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -6,6 +6,7 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; @@ -51,13 +52,13 @@ class _FamilyMemberAddState extends State { 'Clerical support worker': false, 'Services and sales worker': false, 'Agricultural, forestry, fishery worker': false, - 'Unemployed': false, 'Professional': false, 'Technician and associate professionals': false, 'Craft and related trades workers': false, 'Plant/Machine Operators and Assemblers': false, 'Elementary occupations': false, - 'Armed Forces occupations' : false + 'Armed Forces occupations' : false, + 'Unemployed': false, }; @override @@ -209,7 +210,7 @@ class _FamilyMemberAddState extends State { autovalidateMode: AutovalidateMode.onUserInteraction, ), ), - CheckBoxAlertDialog( + CheckBoxAddExtraAlertDialog( title: 'Vulnerabilities', hint: 'Please choose a vulnerability', dataMap: vulnerabilities, @@ -221,7 +222,7 @@ class _FamilyMemberAddState extends State { errorField: "Please choose a vulnerability", autoValidateMode: AutovalidateMode.onUserInteraction, ), - CheckBoxAlertDialog( + CheckBoxAddExtraAlertDialog( title: 'Occupation', hint: 'Select applicable', dataMap: occupations, diff --git a/pubspec.lock b/pubspec.lock index ed607c5..d8a61e6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -28,7 +28,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -98,7 +98,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -407,7 +407,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -664,7 +664,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" timing: dependency: transitive description: @@ -685,7 +685,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" watcher: dependency: transitive description: From e42167880e99fb3b5f4f5c0c9944556986b190e7 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 3 Jan 2022 23:40:42 +0530 Subject: [PATCH 100/264] Fixed textfield and datepicker error colors --- lib/Utils/DarkTheme.dart | 4 ++++ lib/Widgets/DatePickerWidget.dart | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 865ccdb..21606a4 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -35,11 +35,15 @@ class darkTheme{ color: colors.darkAccentColor, width: 1.0 ), ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.errorColor, width: 1.0)), contentPadding: EdgeInsets.all(7.0), fillColor: colors.darkScaffoldColor, labelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), floatingLabelStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), hintStyle: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + errorStyle: GoogleFonts.poppins(color: colors.errorColor) ), ); diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index e609faa..3639469 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -74,7 +74,7 @@ class DatePickerWidget extends FormField { style: GoogleFonts.montserrat( fontSize: 15, color: state.hasError - ? Colors.red + ? colors.errorColor : Colors.grey)), ) ], @@ -87,7 +87,7 @@ class DatePickerWidget extends FormField { padding: EdgeInsets.all(7), child: Text( state.errorText ?? "error", - style: TextStyle(color: Colors.red, fontSize: 10), + style: TextStyle(color: colors.errorColor, fontSize: 10), ), ) : Container() From 77f2b87bd03e0dfe2f243facfced0344d011c22f Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 00:00:34 +0530 Subject: [PATCH 101/264] Added validators --- lib/Screens/FamilyMemberAdd.dart | 93 +++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 18 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index e35e882..5d472fa 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -7,7 +7,6 @@ import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; -import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; @@ -34,8 +33,8 @@ class _FamilyMemberAddState extends State { bool dailyWageWorker = false; int count = 0; - var vulnerabilities = { - 'Widower':false, + var vulnerabilities = { + 'Widower': false, 'Divorcee': false, 'Differently Abled': false, 'Pregnant Woman': false, @@ -48,7 +47,7 @@ class _FamilyMemberAddState extends State { 'None': false }; - var occupations = { + var occupations = { 'Clerical support worker': false, 'Services and sales worker': false, 'Agricultural, forestry, fishery worker': false, @@ -57,7 +56,7 @@ class _FamilyMemberAddState extends State { 'Craft and related trades workers': false, 'Plant/Machine Operators and Assemblers': false, 'Elementary occupations': false, - 'Armed Forces occupations' : false, + 'Armed Forces occupations': false, 'Unemployed': false, }; @@ -156,7 +155,7 @@ class _FamilyMemberAddState extends State { ), validator: (value) { if (value == "") { - return "Please enter a value"; + return "Please enter a value / 0 if no phone"; } else if (value!.length != 10) { return "Enter a valid number"; } else @@ -187,6 +186,7 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( + keyboardType: TextInputType.number, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( @@ -201,7 +201,7 @@ class _FamilyMemberAddState extends State { ), validator: (value) { if (value == "") { - return "Enter 12 digit Aadhaar"; + return "Enter 12 digit Aadhaar / 0 if absent"; } else if (value!.length != 12) { return "Enter a valid Aadhaar"; } else @@ -219,7 +219,7 @@ class _FamilyMemberAddState extends State { onSaved: (map) { print(map); }, - errorField: "Please choose a vulnerability", + errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), CheckBoxAddExtraAlertDialog( @@ -231,10 +231,11 @@ class _FamilyMemberAddState extends State { onSaved: (map) { print(map); }, - errorField: "Please choose an occupation", + errorField: "Please choose an occupation / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Yes", true], ["No", false] @@ -248,6 +249,8 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( @@ -262,7 +265,7 @@ class _FamilyMemberAddState extends State { ), validator: (value) { if (value == "") { - return "Enter Income/Day"; + return "Enter Income/Day / 0"; } }, ), @@ -274,6 +277,8 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( @@ -288,7 +293,7 @@ class _FamilyMemberAddState extends State { ), validator: (value) { if (value == "") { - return "Enter Income/Month"; + return "Enter Income/Month / 0"; } }, ), @@ -296,6 +301,7 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Eligible", "eligible"], ["Eligible, receiving", "eligible_receiving"], @@ -305,6 +311,7 @@ class _FamilyMemberAddState extends State { ), ), OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Yes", "yes"], ["No", "no"], @@ -314,6 +321,7 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Married", "married"], ["Unmarried", "unmarried"], @@ -325,13 +333,20 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.only(left: 10.0, right: 10.0, top: 20), child: TagTextWidget( - label: "Special Skills", - hint: "Enter skills here", - onSaved: (data) { - for (var i in data!) { - print(i); - } - }), + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Special Skills", + hint: "Enter skills here", + onSaved: (data) { + for (var i in data!) { + print(i); + } + }, + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } + }, + ), ), ]), Column( @@ -341,12 +356,18 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Frequent ailments", hint: "Enter ailments here", onSaved: (data) { for (var i in data!) { print(i); } + }, + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } }), ), SizedBox( @@ -356,12 +377,18 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Communicable Diseases", hint: "Enter diseases here", onSaved: (data) { for (var i in data!) { print(i); } + }, + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } }), ), SizedBox( @@ -371,12 +398,18 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Non-communicable diseases", hint: "Enter diseases here", onSaved: (data) { for (var i in data!) { print(i); } + }, + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } }), ), Padding( @@ -412,28 +445,46 @@ class _FamilyMemberAddState extends State { ), ), TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Anganwadi services utilised", hint: "Enter services here", onSaved: (data) { for (var i in data!) { print(i); } + }, + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } }), TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, label: "PHC services utilised", hint: "Enter services here", onSaved: (data) { for (var i in data!) { print(i); } + }, + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } }), TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Private Clinic services utilised", hint: "Enter services here", onSaved: (data) { for (var i in data!) { print(i); } + }, + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } }), ], ), @@ -443,6 +494,7 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( + autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( @@ -455,6 +507,11 @@ class _FamilyMemberAddState extends State { color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(7.0), ), + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } + } ), ), OptionsWidget(options: [ From 1b1a84db7970542dced40fefdb96a91e1e99699b Mon Sep 17 00:00:00 2001 From: Soorya S Date: Tue, 4 Jan 2022 10:26:19 +0530 Subject: [PATCH 102/264] Changed Text Tag Field error validation to return null on no error --- lib/Screens/FamilyMemberAdd.dart | 71 +++++++++++++++++--------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 5d472fa..c3e2fb6 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -13,7 +13,6 @@ import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:geo_spatial/Widgets/TagTextWidget.dart'; import 'package:google_fonts/google_fonts.dart'; - import '../objectbox.g.dart'; class FamilyMemberAdd extends StatefulWidget { @@ -342,9 +341,10 @@ class _FamilyMemberAddState extends State { } }, validator: (value) { - if (value == "") { + if (value == null || value.isEmpty) { return "Enter a value / NA"; - } + } else + return null; }, ), ), @@ -365,9 +365,10 @@ class _FamilyMemberAddState extends State { } }, validator: (value) { - if (value == "") { + if (value == null || value.isEmpty) { return "Enter a value / NA"; - } + } else + return null; }), ), SizedBox( @@ -377,7 +378,7 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Communicable Diseases", hint: "Enter diseases here", onSaved: (data) { @@ -386,9 +387,10 @@ class _FamilyMemberAddState extends State { } }, validator: (value) { - if (value == "") { + if (value == null || value.isEmpty) { return "Enter a value / NA"; - } + } else + return null; }), ), SizedBox( @@ -398,7 +400,7 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Non-communicable diseases", hint: "Enter diseases here", onSaved: (data) { @@ -407,9 +409,10 @@ class _FamilyMemberAddState extends State { } }, validator: (value) { - if (value == "") { + if (value == null || value.isEmpty) { return "Enter a value / NA"; - } + } else + return null; }), ), Padding( @@ -445,7 +448,7 @@ class _FamilyMemberAddState extends State { ), ), TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Anganwadi services utilised", hint: "Enter services here", onSaved: (data) { @@ -454,12 +457,13 @@ class _FamilyMemberAddState extends State { } }, validator: (value) { - if (value == "") { + if (value == null || value.isEmpty) { return "Enter a value / NA"; - } + } else + return null; }), TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, + autoValidateMode: AutovalidateMode.onUserInteraction, label: "PHC services utilised", hint: "Enter services here", onSaved: (data) { @@ -468,12 +472,13 @@ class _FamilyMemberAddState extends State { } }, validator: (value) { - if (value == "") { + if (value == null || value.isEmpty) { return "Enter a value / NA"; - } + } else + return null; }), TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, + autoValidateMode: AutovalidateMode.onUserInteraction, label: "Private Clinic services utilised", hint: "Enter services here", onSaved: (data) { @@ -482,9 +487,10 @@ class _FamilyMemberAddState extends State { } }, validator: (value) { - if (value == "") { + if (value == null || value.isEmpty) { return "Enter a value / NA"; - } + } else + return null; }), ], ), @@ -494,25 +500,24 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Why private?", - style: GoogleFonts.poppins( + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Why private?", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter reason", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter reason", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), validator: (value) { if (value == "") { return "Enter a value / NA"; } - } - ), + }), ), OptionsWidget(options: [ ['Yes', 'yes'], From b8bef4f3d5e5444c1a2bcc4a2417c6ead6abd6b3 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 11:47:49 +0530 Subject: [PATCH 103/264] Completed NavigationDrawer.dart, changed gender images in FamilyMemberAdd.dart --- assets/avatar_man.png | Bin 0 -> 8346 bytes assets/avatar_woman.png | Bin 0 -> 7094 bytes lib/Screens/FamilyMemberAdd.dart | 6 ++- lib/Screens/Login.dart | 10 +---- lib/Utils/Globals.dart | 3 +- lib/Widgets/DatePickerWidget.dart | 12 ++++-- lib/Widgets/NavigationDrawer.dart | 62 +++++++++++++++++++++--------- 7 files changed, 60 insertions(+), 33 deletions(-) create mode 100644 assets/avatar_man.png create mode 100644 assets/avatar_woman.png diff --git a/assets/avatar_man.png b/assets/avatar_man.png new file mode 100644 index 0000000000000000000000000000000000000000..93c7099617f5fb034941c3a87554034f4acc1104 GIT binary patch literal 8346 zcmZ{J2UJtdw{H?cZz0MD2uKG(LhsUh3(`dq>C$`X9VsFmLX|2_ib(kk(u4F4f*=AC zdWRsrzj)t!YyIzC>#lR=%sDf^y{DW#d-mQFtE;0%PV#^R0059{s4MH^^02>&hyeHO zlC>PdWneo6xB>uBmqdDPiI4kcwpQ1N0{{V>I9wzEaQPR%2>^Ht007$-0Dx2$06^oO z+pH&zt01t_Qd0)p{k;m?%F}Qq#O~_Py#Ro`z`qG7UEte|DK=(*kSw|4W zsQ|#k`x?p$hJL^H^8Ax+o_Vi_p0#E2pH*`>Emj3Aihr3RCo-zyhy<`@(2?5{uqD*d zkwp_*MRaED)saK}I6;Iz-;nnLqYq8uyO;+oMSilefYo7nzV_f&nsM?CU%A|+q@9X>vNa;g#0w(1~ z0l>n+i2>$@vEA5_ssjWeg3S1-2MjrnPHKlp#HoR@Q+qv(-qxgZED#tvz=Erm$sWHo zEc-TqgfEAj6+s>rPzgL~ z{A&h@H{)d~IPMSlPekGp>$%WfzTlJxL>g?^g78H^gund@kT6;g(}MPr=eJnYbo@|F zoE)+PoCbvwGw_aQ!7!kAL{FI|W4?;Mbr*&d5}Z?D_gN7R#m_FoCs z7Ei4JKRlvea=^r(J?I6i7FJEQ+NSWnGWekU04QL`n_r8W4=9jQ0i;;B@Hza*u!%+& z&mOVqa|s~`_X+K1x;33JGjs=kg9pjfw3iGv1e2(&7*E`Z88vqEv}@~JD)Ou7`|50u zn|HXZthhTrmJ%(V>{%tCy|)xBTKaINUT>e$54tuA^F0r{14zT7t{Hm06E3|gR1*!=bWLQ6KY?yI4Lu%EzGwLv77nPlwnDF4_|dCT7cH3 zF6)rkM*hs0tFJb0vt3sa>R`|;FzDVn__6Py!kR!3#Yc#3$&}^?kZkj3PPPE4@D76g zjrEz6Aq7UP6m~sPm0yiO>obWaD-aAdEIFt`%an!?T|^+CiT-ItcQNNG@>9O4-2|)C z2f1R7(1DsafIs*#MFv}E_3^d~#Pv;6DwnYZ?S*Hi*}@(OzHhGqiquLk6+h%(=~7L5CTm^KqgSgi(a+% z`Ion?N+1-h&c*a5(7S7Ia8E;{bgT;{x;OjK$7Rz->)B3vi9F1f6&ROoPyF5I!}r#A z6vXPL%RbrvicVpCq=?n5yO)Vo%N5xTDt26bl>&vo7-e?1&)Irfj2Zvl-Qvn0o^{3F zeq=h(rqII?Hi*jOdmW>%SprTPDk-i=++Q%Aotlm48rLZ0g;v}jYdwE3*8Zp0`-|D$ znTPv<7@64^R9@4*f>PgruFwqua;ezp8-Z~Fk@#7FTRJ~;maB}9Jyb+IL9d!~cAC64 zIH$jeEqmrLb3n)8olj6J3b9Q$^LzY;f#FWVvF@$jMoAwUEpk<}`?#+!Z_@H-GXGD32UR`tL z327j>9eFYCp-9G0vLe-b5IIFU1qDO>wN&|J?Kns7AC$ai_u1M`nnUmSexGD4?9Mgk zH*b?@#{{&`Sgp($8P(RcWt*@LIJ2v=W_P3Z@NXOyYui7?x;V{gl?~xvp`tkJ`#HNCtG=qG`1YW96tgh&!NtKls^D^) z#E}P2WZKY@R%*g;Ikhh8ZzF>j;Z)IFWrurRB!g=o zhEleT+Svb7&^OXNt%_S`B~7RYaH8HaJO7(0f1MKw0cw(?-N$OPP3><^qkqwR9+N%Q zJ{peud@m;sf^B}j_`AF2#7qSISOMMNE%G_98I2P`?UB*L6{VP26e=OwB0UFLRz%z{ z)ydzfm{Pd-lqy4KDB}Ix#6XOpI{v-4~0UP2p4_$8j_6 zIRw99(H-&Q1|1uRImzi_3Ghhr9t64HU0F1RBOQnbK%O<@a zjwnx8s985a4uofVvV^@+c{+$H{eGq{&6gIl-;##3UGm6QuV8gQdS)^yGTkUTF|A9g zo=ef^xqOrvg@ktWji@ayB*0web-08Y-e=8J*El&ppX|-aAc%xyQLweZTR~9ytp?s!QcWU=A9yuaL1Voo@ z=Lw&3H8e!)KNf9rwVipMwQXuoY7(3U{weDH`#e1OMawW3(r&bbq zx%An(0keB0#i(~ANu*|z$@)+Yb~@6it%BU8`Av3jAd?e)#JQPxz721fI_p4GoyH}X zoq$LJNm5+d_Jbh4@;@TKQfEza4`&7J)Ho$%q*YDf)UoPhLnxZ+4rFRZbK%C>!wbw6 znORZ@4MDgt$OX#2j%Uuh9dIAU#&UaHye$e90TqB{K~p<9uNkC#UR;k%jyX0R@1o#N z&pXQUrY-PYI(g>H!pmYglrr^W*Xne$8oE~4_5XSQV%wpTWPY5z&#sGMhrTx>b+p+r zhX+rBQB_C04#sh4^RB1@BC}#}OrGGm`OJ;?5FCP2bQhyHEzT933<|a+cih;|@`D#> z>z)@G%j#j>ayKmBQS#%_ns^cTx!Y*8whJ%L--~;bJhb`zyX&}ffzo+{O*H@Yvbz*wLPnp!bjj_ z6h05Z?P8cO@A>;koN~=^tdy9MOVxRxc}E^wvGZK7-K3NhD5I1neVE3kY(@NV_xEVV zC_!%YXhufBOA5krf<6K7y!GvO94qyu!&^fCpwC}Mit|xS=x*6*X~{&F1>Gp3n>vZx z@6y=1q1=DT*Ap-Ot&OoQxl@XkdJfwyD_dQ~#AhCx zvMp?E8fNv~&3Ij7qQuW9w74#o&+^xn`;Vclv-(gHwSV4*nrcR*hXg&GSqr*PjQH!XCB#_O!}HW)jOEZz~73&-W+9J3f}0xa2eC4vr|UNo<<0EC@q-b ziClb*18sBfMUh4bw!!*2bW5=o)lLvobO7D2q7UlH{FJo%y%AXYq-wiW8jURe4k4fgfuR z|L;wfFCWKNWZ0CKHClDlPOtPe#eDw7W`~}+67+Iz6=ZS7T8x#6J`1#={-`e;9QBI+ zQ9cReBYXej5H^OV7Q~%3Ul?&4M8gO1XVwEY@0Kc>R61xPi;0&t9`Aff(T5)U3m_80 zD|C%zHgiw+fD?w$BGTwGrRR0?;(`e?4$ESUqyt<=SrVBtR`wt>o6|>eoO~P^ z$ghkPxV3H-1ds z9EI>#RQ*}@;3ESQvwS@DmynYhh`mjzo}fwK5_m~a9@FoQlwL>FA&?5hY%xZ7$_f|C+-CwFDrmI~a?QdnoRZ!EOgFs0a~SDyMb;<5X(C7(AG@UU zC*43fGG-d5>zj%nHu_&gz2!{Z%;`0J^sS@y52rx`)&4w6b!&f^R)oCV67sH_Z!Qtc z&^#KAsydToLcy|Ql?549e_0H(66dP?P`_jYA5znh0^DV>w1-?w_zA`84;3Y)_f-~7 zOG#OrV`_e=-5c=jHpu95avajxYW|hjS?|*Ox=TBX_4?}>JMeSdmFuFiS-M;2GF?ug z7{=BwAOmS@z4^=gtcjNRagU*dBjJ1vjR^b+f9aGi!6JWnLBuYe-oLc+1ROF2&UZJZ z1GgtmWA_kO)9QY%YNpnvYGy{SmM;|1FL^sjxyFPgq(`F5UYxo*_pQCm5#o%r2of9q zJbKp9SQS;cm{u-Gq-wV=fk64P+s+>3zKf;|4H^sIot%-qwijf&0wG0MY;L>FZ-22F z`Y*iMP~%$MWGrxWsw7#R_cDK664_Y+IaDTb&}en#$}mikhPC}jJ6fg$Hs1R@xq7|H zZuIJ`KH>Xg7Tek5#HXp+v;3r;6+DeJdqv-2mqAFlV6TkX2*V!ZJD(}Tn@1Vi6T-6I zT`nXnSrlqb0#XC((*dW|Zfl!Oz>xEARIj9c!t<9j$~IWp4KlC!%8D9Lvi;}ISt;2~ zRUE#rg2~YR!@Rgn_a1WxiSpj}nW+8`FZI6({611y55f8~G~YJc&J}sF-3t$!(@=`K zYyRF66{arTS$AuB?aF25tq`x8Fxtypex=$ZA=Hz7D=4pTy0x;uu#M4AOTi;uv!jo%h&GfMj18yK&D6Xm!xZsL8*TRmJH+GSAwlfx$b_E=lB?7(ZoZBOy5dF7XuuXO4D#V-uJMAO^ZFg85q@oU$zM(semU}ZNHK&BUx>Y~kA}^?mKMqMzS!TlALVP`Rtol{ zl`;yUGzuAuSbW2pGiO;_)fU^;rqt?Llaw&xjWar_HA-5YlSx=`yE0D0wn|E9M)mb% ztVb6c0T(N5{#;fj--p_A0GZ#5G~=Js3}wJ&tkZIt@^H&r%Bia2)Zbl_jJh43^t;|j z*5c8FVz;22x>r89o33HpY$q;^Ap^&E296RTY{= z!KEDp8DqZ-iw!vQ>S%d$?9e+dmvx=PxYv9|;h6I;%bdY{PBm+hI187x6M~h~^~D#a zPw;X@M8wVtppaS7;frhCTLS8{VoN5u>a4LYTGxDBW+y+U2!gagQnMQ6Y`&5l8ZUxN z^u>Umd6rp9ZEzDj-wzf}p)LGAe&fnTVaAnRpOw%PTe^tl`TQQI<9XU#!L1R^n*psq z1FzQ#cZmScxohc+bjsM$GMTj4vtzqy$w#Q*>~+qu89pq}uI9nPucUSEDRo?D1GqWv z6$$9XD9FQfr%#-<2F|s!XcBWdXtCH+MkgAEGnBK2NQ#Xo-#460`+e6>k%8k(f1F*3 zTX=rjggH`~5T%8{a~Sd0!DN7~E#Aur`N=P7DBBxJY`H^hSRdlA4`6u7e{s;X+7%Pk z!|sVwG_PcS^!+?$Fl~8I@tFi8AcEV3Z|fX%PALqQyc>eyM{=R zt@5<2deRa;^29tNj?$I~$ov@JQEy}OV8m|DYeGV8lw$meP!pOEBg9zkQe&xQw_>z% zHH3y#u6K@g^1X21c%jz|J`es*-!T_<_l5^nP@qvhMya}@fpcoOhm0+)GAk&8Yp-D& zw#k6@M@xc0m9qo$$%aQKfSSmk21(1iWGP=Eeh}}{K%?JW9rD8)YXU{!cFI31%!+HR z=envjn3wJ{SlU=pU>Fl1R5}0Y)azwHc7gPgKgNq$F@yJo*4Z4mudAJ9kf`0w68lma#Yo5@Kn$M~n0q z#KfYTH?U)nVTCkXST9@+fb+dNVuZ|X0N$`2F1_!CCSq`g^z~aVMXWG)-QdEn z4hC0EkWDg*6g;SgEeNChu>XM15I78WXE0j95W^eGt4qRnZldIR%^uB9f%}=^U`8XK zb)}D<$Mm{AG_Ht5Xcj23s5SK|3CCrre_H#=Q5`E$vH~lNszl1Ng?u2UcF$amh)Iz* z6h&v(4(r-no+CPx!Lau~2W;RaWd>CGcfDgp2X(h!Jr5(`-Ya14Rz-x5dyk7|(MS)< zzy4>TzOz0#1I!&*!f^m~pSWS_c(Kh*4YqwiK8(j#3b55rNFLD2m&{HBHoZs@e?ard zsrn`8rORx_%4PcFXNs?Dt%#YY9L!?>b#c(D-CN6qP%Bmt!+)yliBln*@iG z|786{Py*|$M~~Vh*uC6W zvr8udcsXT1h*%zky=Lha!!+vlWFEzaE3+PMDNBd2rfb4SM@B|lPpiy(ZbIbbg8mSe zhOo~hypI4ZESxbblX1giT*@meE8l#&TKt1@(J4O)D|2`f3Gx02NRIoaA!@2gm!?0e z$<3u-vHBb$2lN-Recq;oho|&Z?!x9{Td~sZak(7#37e_dUn0<~PodjO|PgML9h6uX?n7Ja78c4w) z0Vvea5FOmyCiwmS_NB@%`*i(fpTMs!2YXZEBCEosS2>n*Vq8xdHjXRAg;(Bw(7|T} zg%B|SFP%+$Mc~-$qcxT2)O&?3SA3D~%%y7zj6`iresbeI)KIAsBp3udo%eatnUj;6 zjEka-=E-y&TKCoN<=O#K(L_AKyTpcd!wQg!je^jc&6Sa;R4N=JMtKl-lort`u!EdI zxovCcK_)U)UIo9!cTpAY;xeJm9Lb!n>9M~{r;{&{Xbal`sDr)|NfTeQxd+_@1fF&i z=M~(wB5WQJ1J}3CaDJj*%%jIOuicM23)r-@o&BIC9j-d>J)=xDW=E*nDhgFgQIvUJc%TrZ_<~zCg~%NGQK` zG6qa4mUa>+V*#UF1Z8D=kEiZGOd`yjOYq5?>Em}bB~sx1XT{2mQjMaccXid~)i&XW z)_D5xGa>~BiQm6}XK(K94XDixDe4i8PaG1ZryCXK3Y)8%#jo-yn|pbAk&#nCV~3Xz z%>wXyW;37tJB1dL`mD&vDLsz+caC3vm1j-qpIIJ@q5Mk!kt!lnN=mA@Cl##1f*#E? zDnwjohAoza3BHXN$;!#GvUd;LsyK#OhV(c$4>u_y?}`|$ZfT)s$yLwx zgPi|^;oo$w3A-Se3*t@=chRzGjuyCo3^%7>{kSk84t%Z-y|0ZQwDy=#!dnwC9WXU} zyB;xOMVH0DZfR*rB*`!5E-0u8CLBDukrtSrn9zJW))Rp+6aaOvE3kEnhw@|LP z9k$+MHj5OLPpn#g=3xdwFBJNdq@3Kx77DJ%&N_zm~6ghh|=NwAH9kWmG>g>^V5&cHm`1F;^ zKSnuaI~SuqJjy1l#MW z|9kHG|Bqlj(w6S<@|ZFa8or5axFcf@go+8m#u8yGW$kH;%K$>A()_~p`d`2 zun6vcEFd5yAfQO!Q~ciuT-;=`R%wvI98;jpxSv4-~EE>==f%5K))F1D@+DJfkX)C(Y3e%HePKQJ19 zxkyQ=+dA0UBLJd;LP-e*;W!MZVfh9JCo9E9#aAaDm4TZF&6E#SX; z#qaKFCs%K*^FR2&4RI)dpqQYrxUhhPxX8*3uPY96??3n$I0WD(P+VM8P*Jh1pJ)zO z?erhjM*13n*AC9MxZ(5hd%HWkS=xB^Gk`R^TxAd_@SbCbjwzRf2 zcd>Lew{r70clUJrOK0xof_wU#+grN3;|guv+;L?N)^4umf)avaqLO^LjxXi3n&O%T NXsGBY*C<*<{2#ZKZi4^- literal 0 HcmV?d00001 diff --git a/assets/avatar_woman.png b/assets/avatar_woman.png new file mode 100644 index 0000000000000000000000000000000000000000..3264d554b79ad3a533af6f5b2b04dc53902f6bdf GIT binary patch literal 7094 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 literal 0 HcmV?d00001 diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index c3e2fb6..4854aef 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -120,6 +120,10 @@ class _FamilyMemberAddState extends State { GenderPickerWithImage( verticalAlignedText: false, selectedGender: Gender.Male, + maleImage: AssetImage("assets/avatar_man.png"), + linearGradient: LinearGradient( + colors: [Color(0xfff54b64), Color(0xfff78361)]), + femaleImage: AssetImage("assets/avatar_woman.png"), selectedGenderTextStyle: TextStyle( color: Colors.greenAccent, fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( @@ -132,7 +136,7 @@ class _FamilyMemberAddState extends State { animationDuration: Duration(milliseconds: 300), isCircular: true, // default : true, - opacityOfGradient: 0.3, + opacityOfGradient: 0.2, padding: const EdgeInsets.all(3), size: 70, //default : 40 ), diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 8d6b8b0..7cb6e52 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -210,19 +210,11 @@ class _MyAppState extends State { : Container(), ); - Widget horizontalLine() => Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0), - child: Container( - width: 120, - height: 1.0, - color: Colors.white70.withOpacity(.2), - ), - ); @override Widget build(BuildContext context) { return Scaffold( - resizeToAvoidBottomInset: false, + resizeToAvoidBottomInset: true, backgroundColor: colors.darkScaffoldColor, body: Stack( fit: StackFit.expand, diff --git a/lib/Utils/Globals.dart b/lib/Utils/Globals.dart index 3da90ef..0476a1c 100644 --- a/lib/Utils/Globals.dart +++ b/lib/Utils/Globals.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; -var userName = ""; \ No newline at end of file +var userName = "cyberwizard1001"; +var Name = "Nirmal Karthikeyan"; \ No newline at end of file diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index 3639469..1b9a7ad 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -1,8 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:google_fonts/google_fonts.dart'; class DatePickerWidget extends FormField { DatePickerWidget( @@ -63,7 +63,10 @@ class DatePickerWidget extends FormField { children: [ Padding( padding: EdgeInsets.only(right: 20, left: 10), - child: Icon(Icons.calendar_today), + child: Icon( + Icons.calendar_today, + color: colors.darkPrimaryTextColor, + ), ), Expanded( flex: 1, @@ -87,7 +90,8 @@ class DatePickerWidget extends FormField { padding: EdgeInsets.all(7), child: Text( state.errorText ?? "error", - style: TextStyle(color: colors.errorColor, fontSize: 10), + style: TextStyle( + color: colors.errorColor, fontSize: 10), ), ) : Container() diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index a406a4f..3df0d9c 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; - +import 'package:geo_spatial/Utils/Globals.dart' as globals; +import 'package:google_fonts/google_fonts.dart'; class NavigationDrawer extends StatelessWidget { NavigationDrawer({Key? key}) : super(key: key); @@ -13,19 +13,37 @@ class NavigationDrawer extends StatelessWidget { child: Material( color: colors.darkScaffoldColor, child: ListView( - padding: padding, + padding: EdgeInsets.zero, children: [ - const SizedBox(height: 50,), - buildMenuItem( - text: 'Home', - icon: Icons.home, - onTap: (){} - ), - buildMenuItem( - text: 'Profile', - icon: Icons.person, - onTap: (){} + UserAccountsDrawerHeader( + currentAccountPicture: CircleAvatar( + child: ClipOval( + child: Image( + image: AssetImage("assets/avatar_man.png"), + ), + ), + ), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage("assets/Illustration.png"))), + accountName: Text( + globals.Name, + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor, fontSize: 18), ), + accountEmail: Text( + globals.userName, + style: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + ), + ), + buildMenuItem(text: 'Home', icon: Icons.home, onTap: () {}), + buildMenuItem(text: 'Profile', icon: Icons.person, onTap: () {}), + SizedBox( + height: MediaQuery.of(context).size.height * 0.6, + ), + buildMenuItem(text: 'Sign Out', icon: Icons.logout, onTap: () {}), ], ), ), @@ -33,14 +51,22 @@ class NavigationDrawer extends StatelessWidget { } Widget buildMenuItem({ - required String text, + required String text, required IconData icon, Function? onTap, -}){ + }) { return Padding( - padding: const EdgeInsets.symmetric(vertical: 10.0), - child: ListTile(leading: Icon(icon,color: colors.darkPrimaryTextColor,), - title: Text(text,style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), + padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), + child: ListTile( + selectedTileColor: colors.darkAccentColor, + leading: Icon( + icon, + color: colors.darkPrimaryTextColor, + ), + title: Text( + text, + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), onTap: onTap!(), ), ); From cd66ba2415ab1577ce4ca5dbf9c0507d71561c87 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Tue, 4 Jan 2022 12:04:52 +0530 Subject: [PATCH 104/264] Fixed toMany realtion saving in FamilyMember data saving --- lib/Model/FamilyMembersCommomDataModel.dart | 36 +- lib/Screens/FamilyHomeScreen.dart | 5 +- lib/Screens/FamilyMemberAdd.dart | 910 +++++++++++--------- lib/Widgets/AddRemoveBoxWidget.dart | 88 +- lib/objectbox-model.json | 163 +++- lib/objectbox.g.dart | 530 +++++++++++- 6 files changed, 1218 insertions(+), 514 deletions(-) diff --git a/lib/Model/FamilyMembersCommomDataModel.dart b/lib/Model/FamilyMembersCommomDataModel.dart index ef7dae5..8364533 100644 --- a/lib/Model/FamilyMembersCommomDataModel.dart +++ b/lib/Model/FamilyMembersCommomDataModel.dart @@ -7,6 +7,35 @@ import 'package:intl/intl.dart'; class FamilyMemberIndividualDataModel { int id = 0; String? userName; + String? dateOfBirth; + String? gender; + String? phoneNumber; + String? educationQualification; + String? aadhaarNumber; + List? vulnerabilities; + List? occupation; + String? dailyWageWorker; + String? incomePerDay; + String? incomePerMonth; + String? pension; + String? businessStatus; + String? maritalStatus; + List? specialSkills; + List? frequentAilments; + List? commutableDisease; + List? nonCommutableDisease; + String? surgeries; + String? anganwadiServicesAware; + String? anganwadiServicesUsing; + List? anganwadiServicesUsedList; + List? PHCServicesUsedList; + List? privateClinicServicesUsedList; + String? privateServiceReason; + String? useOfTobacco; + String? useOfAlcohol; + String? aarogyaSetuInstalled; + String? vizhithiruInstalled; + String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); FamilyMemberIndividualDataModel({this.userName}); @@ -19,12 +48,9 @@ class FamilyMembersCommonDataModel { Position? locationTopRight; Position? locationBottomLeft; Position? locationBottomRight; - - @Property(type: PropertyType.byteVector) - List? keys; + final individualDataList = ToMany(); String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); - String? get dbLocationTopLeft { if (locationTopLeft == null) { return null; @@ -135,7 +161,7 @@ class FamilyMembersCommonDataModel { } FamilyMembersCommonDataModel({ - this.keys, + //this.keys, this.locationBottomLeft, this.locationBottomRight, this.locationTopLeft, diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 57347a1..331fe39 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -6,7 +6,6 @@ import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; -import 'package:geo_spatial/Widgets/NavigationDrawer.dart'; import '../objectbox.g.dart'; import 'CollectLocationWidget.dart'; @@ -31,7 +30,7 @@ class _FamilyHomeScreenState extends State if (modelData == null) modelData = - widget.modelData ?? new FamilyMembersCommonDataModel(keys: []); + widget.modelData ?? new FamilyMembersCommonDataModel(); return Scaffold( appBar: AppBarBackButton('Individual Data'), @@ -100,7 +99,7 @@ class _FamilyHomeScreenState extends State onPressed: () async { store = await StoreInstance.getInstance(); Box box = store.box(); - int id = await box.put(modelData); + await box.put(modelData); }), ), ) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 4854aef..93aa35e 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -70,303 +70,455 @@ class _FamilyMemberAddState extends State { MediaQuery.of(context).viewInsets.bottom * 1.45, child: SingleChildScrollView( physics: ClampingScrollPhysics(), - child: FormPageView([ - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.userName, - onSaved: (String? data) async { - widget.familyMemberIndividualDataModel?.userName = data; - var store = await StoreInstance.getInstance(); - Box box = store.box(); - box.put(widget.familyMemberIndividualDataModel); - }, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - //isDense: true, - label: Text( - "Name", - style: GoogleFonts.poppins( + child: FormPageView( + [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.userName, + onSaved: (String? data) async { + widget.familyMemberIndividualDataModel!.userName = data; + }, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + //isDense: true, + label: Text( + "Name", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter name", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter name", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Please enter a name"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - validator: (value) { - if (value == "") { - return "Please enter a name"; - } else - return null; + ), + DatePickerWidget( + //TODO: Add initial value + context: context, + title: "Date of Birth", + hint: "Choose a date", + autoValidateMode: AutovalidateMode.onUserInteraction, + onSaved: (data) { + // widget.familyMemberIndividualDataModel!.dateOfBirth = + // "${data!.day}/${data.month}/${data.year}"; + // print(data); }, - autovalidateMode: AutovalidateMode.onUserInteraction, ), - ), - DatePickerWidget( - context: context, - title: "Date of Birth", - hint: "Choose a date", - autoValidateMode: AutovalidateMode.onUserInteraction, - onSaved: (data) { - print(data); - }, - ), - GenderPickerWithImage( - verticalAlignedText: false, - selectedGender: Gender.Male, - maleImage: AssetImage("assets/avatar_man.png"), - linearGradient: LinearGradient( - colors: [Color(0xfff54b64), Color(0xfff78361)]), - femaleImage: AssetImage("assets/avatar_woman.png"), - selectedGenderTextStyle: TextStyle( - color: Colors.greenAccent, fontWeight: FontWeight.bold), - unSelectedGenderTextStyle: TextStyle( - color: colors.darkPrimaryTextColor, - fontWeight: FontWeight.normal), - onChanged: (Gender? gender) { - print(gender); - }, - equallyAligned: true, - animationDuration: Duration(milliseconds: 300), - isCircular: true, - // default : true, - opacityOfGradient: 0.2, - padding: const EdgeInsets.all(3), - size: 70, //default : 40 - ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - style: darkTheme.DarkTheme.textTheme.bodyText2, - keyboardType: TextInputType.number, - decoration: InputDecoration( - label: Text( - "Phone Number", - style: GoogleFonts.poppins( + GenderPickerWithImage( + verticalAlignedText: false, + selectedGender: Gender.Male, + selectedGenderTextStyle: TextStyle( + color: Colors.greenAccent, fontWeight: FontWeight.bold), + unSelectedGenderTextStyle: TextStyle( + color: colors.darkPrimaryTextColor, + fontWeight: FontWeight.normal), + onChanged: (Gender? gender) { + print(gender); + widget.familyMemberIndividualDataModel!.gender = + gender.toString(); + }, + equallyAligned: true, + animationDuration: Duration(milliseconds: 300), + isCircular: true, + opacityOfGradient: 0.3, + padding: const EdgeInsets.all(3), + size: 70, //default : 40 + ), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.phoneNumber, + style: darkTheme.DarkTheme.textTheme.bodyText2, + keyboardType: TextInputType.number, + decoration: InputDecoration( + label: Text( + "Phone Number", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter 10 digit phone", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter 10 digit phone", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Please enter a value / 0 if no phone"; + } else if (value!.length != 10) { + return "Enter a valid number"; + } else + return null; + }, + onSaved: (data) { + widget.familyMemberIndividualDataModel!.phoneNumber = + data; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - validator: (value) { - if (value == "") { - return "Please enter a value / 0 if no phone"; - } else if (value!.length != 10) { - return "Enter a valid number"; - } else - return null; + ), + DropDownFormField( + defaultValue: widget.familyMemberIndividualDataModel! + .educationQualification, + list: [ + 'None', + 'Elementary', + 'Secondary', + 'Higher Secondary', + 'Bachelor\'s', + 'Master\'s' + ], + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .educationQualification = data; }, - autovalidateMode: AutovalidateMode.onUserInteraction, + hint: "Select the highest", + title: "Educational qualification", + errorField: "Please choose a qualification", ), - ), - DropDownFormField( - list: [ - 'None', - 'Elementary', - 'Secondary', - 'Higher Secondary', - 'Bachelor\'s', - 'Master\'s' - ], - hint: "Select the highest", - title: "Educational qualification", - errorField: "Please choose a qualification", - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - keyboardType: TextInputType.number, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Aadhaar Number", - style: GoogleFonts.poppins( + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.aadhaarNumber, + keyboardType: TextInputType.number, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Aadhaar Number", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter 12 digit Aadhaar", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter 12 digit Aadhaar", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Enter 12 digit Aadhaar / 0 if absent"; + } else if (value!.length != 12) { + return "Enter a valid Aadhaar"; + } else + return null; + }, + onSaved: (data) { + widget.familyMemberIndividualDataModel!.aadhaarNumber = + data; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - validator: (value) { - if (value == "") { - return "Enter 12 digit Aadhaar / 0 if absent"; - } else if (value!.length != 12) { - return "Enter a valid Aadhaar"; - } else - return null; + ), + CheckBoxAddExtraAlertDialog( + title: 'Vulnerabilities', + hint: 'Please choose a vulnerability', + dataMap: vulnerabilities, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + errorField: "Please choose a vulnerability / None", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + CheckBoxAddExtraAlertDialog( + title: 'Occupation', + hint: 'Select applicable', + dataMap: occupations, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + errorField: "Please choose an occupation / None", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Yes", true], + ["No", false] + ], + title: "Daily wage worker?", + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel!.dailyWageWorker = + val; }, - autovalidateMode: AutovalidateMode.onUserInteraction, ), - ), - CheckBoxAddExtraAlertDialog( - title: 'Vulnerabilities', - hint: 'Please choose a vulnerability', - dataMap: vulnerabilities, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - errorField: "Please choose a vulnerability / None", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - CheckBoxAddExtraAlertDialog( - title: 'Occupation', - hint: 'Select applicable', - dataMap: occupations, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - errorField: "Please choose an occupation / None", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - OptionsWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Yes", true], - ["No", false] - ], - title: "Daily wage worker?", - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - }, - ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Day", - style: GoogleFonts.poppins( + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.incomePerDay, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Income/Day", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter income per day", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter income per day", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Enter Income/Day / 0"; + } + }, + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel!.incomePerDay = + val; + }, ), - validator: (value) { - if (value == "") { - return "Enter Income/Day / 0"; - } - }, + ) + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + //TODO: Add work timings + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: widget + .familyMemberIndividualDataModel?.incomePerMonth, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Income/Month", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter income per month", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value == "") { + return "Enter Income/Month / 0"; + } + }, + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel! + .incomePerMonth = val; + }, + ), + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Eligible", "eligible"], + ["Eligible, receiving", "eligible_receiving"], + ["Not eligible", "not_eligible"] + ], + title: 'Old age pension', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel!.pension = val; + }, + ), + ), + OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + title: 'Doing/Did business', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel!.businessStatus = + val; + }, + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Married", "married"], + ["Unmarried", "unmarried"], + ], + title: 'Marital Status', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel! + .maritalStatus = val; + }, + ), + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Special Skills", + hint: "Enter skills here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .specialSkills = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }, + ), + ), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Frequent ailments", + hint: "Enter ailments here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .frequentAilments = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ), + SizedBox( + height: 20, + ), + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Communicable Diseases", + hint: "Enter diseases here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .commutableDisease = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ), + SizedBox( + height: 20, + ), + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Non-communicable diseases", + hint: "Enter diseases here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .nonCommutableDisease = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), ), - ) - ], - ), - Column(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - //TODO: Add work timings - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Month", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + onSaved: (data) { + widget.familyMemberIndividualDataModel!.surgeries = + data; + }, + title: 'Surgeries', ), - hintText: "Please enter income per month", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), - validator: (value) { - if (value == "") { - return "Enter Income/Month / 0"; - } - }, - ), - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Eligible", "eligible"], - ["Eligible, receiving", "eligible_receiving"], - ["Not eligible", "not_eligible"] - ], - title: 'Old age pension', - ), - ), - OptionsWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Yes", "yes"], - ["No", "no"], ], - title: 'Doing/Did business', - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Married", "married"], - ["Unmarried", "unmarried"], - ], - title: 'Marital Status', - ), ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 20), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Special Skills", - hint: "Enter skills here", - onSaved: (data) { - for (var i in data!) { - print(i); - } - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }, - ), - ), - ]), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .anganwadiServicesAware = data; + }, + title: 'Aware about Anganwadi services?', + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .anganwadiServicesUsing = data; + }, + title: 'Using any Anganwadi services?', + ), + ), + TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Frequent ailments", - hint: "Enter ailments here", + label: "Anganwadi services utilised", + hint: "Enter services here", onSaved: (data) { - for (var i in data!) { - print(i); - } + widget.familyMemberIndividualDataModel! + .anganwadiServicesUsedList = data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -374,21 +526,13 @@ class _FamilyMemberAddState extends State { } else return null; }), - ), - SizedBox( - height: 20, - ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( + TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Communicable Diseases", - hint: "Enter diseases here", + label: "PHC services utilised", + hint: "Enter services here", onSaved: (data) { - for (var i in data!) { - print(i); - } + widget.familyMemberIndividualDataModel! + .PHCServicesUsedList = data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -396,21 +540,13 @@ class _FamilyMemberAddState extends State { } else return null; }), - ), - SizedBox( - height: 20, - ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( + TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Non-communicable diseases", - hint: "Enter diseases here", + label: "Private Clinic services utilised", + hint: "Enter services here", onSaved: (data) { - for (var i in data!) { - print(i); - } + widget.familyMemberIndividualDataModel! + .privateClinicServicesUsedList = data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -418,92 +554,16 @@ class _FamilyMemberAddState extends State { } else return null; }), - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - title: 'Surgeries', - ), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OptionsWidget( - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - title: 'Aware about Anganwadi services?', - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - title: 'Using any Anganwadi services?', - ), - ), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Anganwadi services utilised", - hint: "Enter services here", - onSaved: (data) { - for (var i in data!) { - print(i); - } - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "PHC services utilised", - hint: "Enter services here", - onSaved: (data) { - for (var i in data!) { - print(i); - } - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Private Clinic services utilised", - hint: "Enter services here", - onSaved: (data) { - for (var i in data!) { - print(i); - } - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: widget.familyMemberIndividualDataModel + ?.privateServiceReason, autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( @@ -521,27 +581,67 @@ class _FamilyMemberAddState extends State { if (value == "") { return "Enter a value / NA"; } - }), - ), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you use any tobacco based products?"), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you consume alcohol?"), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have Aarogya Setu installed?"), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have the Vizhithiru app installed?"), - ], - ) - ], _onSubmit), + }, + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .privateServiceReason = data; + }, + ), + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you use any tobacco based products?", + onSaved: (data) { + widget.familyMemberIndividualDataModel!.useOfTobacco = + data; + }, + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you consume alcohol?", + onSaved: (data) { + widget.familyMemberIndividualDataModel!.useOfAlcohol = + data; + }, + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have Aarogya Setu installed?", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .aarogyaSetuInstalled = data; + }, + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have the Vizhithiru app installed?", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .vizhithiruInstalled = data; + }, + ), + ], + ) + ], + _onSubmit, + saveData: () async { + var store = await StoreInstance.getInstance(); + Box box = store.box(); + await box.put(widget.familyMemberIndividualDataModel); + }, + ), ), ), ); diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index e675be7..5ac45e2 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -1,52 +1,24 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/FamilyMembersCommomDataModel.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; -import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; -import '../objectbox.g.dart'; - /** * Added a dataclass * To be modified later * Add required data fields to this class */ -class IndividualUserData {} - class AddRemoveBoxWidget extends StatefulWidget { const AddRemoveBoxWidget({Key? key, this.modelData}) : super(key: key); - final modelData; + final FamilyMembersCommonDataModel? modelData; @override _AddRemoveBoxWidgetState createState() => _AddRemoveBoxWidgetState(); } class _AddRemoveBoxWidgetState extends State { - var listOfObjects = []; - - getElementFromDb() async { - var store = await StoreInstance.getInstance(); - Box box = store.box(); - for (int i in widget.modelData.keys) { - listOfObjects.add(await box.get(i)); - setState(() {}); - } - } - - @protected - @mustCallSuper - void initState() { - super.initState(); - getElementFromDb().whenComplete(() { - setState(() {}); - print("success"); - }).catchError((error, stackTrace) { - print("outer: $error"); - }); - } - @override Widget build(BuildContext context) { return Container( @@ -65,32 +37,22 @@ class _AddRemoveBoxWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - TextButton(onPressed: () async { - var store = await StoreInstance.getInstance(); - Box box = store.box(); - var object = new FamilyMemberIndividualDataModel(); - - int id = await box.put(object); - - setState(() { - listOfObjects.add(object); - widget.modelData.keys?.add(id); - }); - }, - child: Text("Add New User Information", - style: GoogleFonts.poppins( - fontSize: 18, color: colors.darkAccentColor)),), + TextButton( + onPressed: () { + setState(() { + widget.modelData?.individualDataList + .add(FamilyMemberIndividualDataModel()); + }); + }, + child: Text("Add New User Information", + style: GoogleFonts.poppins( + fontSize: 18, color: colors.darkAccentColor)), + ), IconButton( - onPressed: () async { - var store = await StoreInstance.getInstance(); - Box box = store.box(); - var object = new FamilyMemberIndividualDataModel(); - - int id = await box.put(object); - + onPressed: () { setState(() { - listOfObjects.add(object); - widget.modelData.keys?.add(id); + widget.modelData?.individualDataList + .add(FamilyMemberIndividualDataModel()); }); }, icon: Icon( @@ -104,10 +66,10 @@ class _AddRemoveBoxWidgetState extends State { ), Container( height: MediaQuery.of(context).size.height * 0.35, - child: listOfObjects.isEmpty + child: widget.modelData!.individualDataList.isEmpty ? Center(child: Text('No Members Added')) : ListView.builder( - itemCount: listOfObjects.length, + itemCount: widget.modelData!.individualDataList.length, shrinkWrap: true, itemBuilder: (BuildContext context, int index) { return Card( @@ -116,8 +78,9 @@ class _AddRemoveBoxWidgetState extends State { onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => FamilyMemberAdd( - familyMemberIndividualDataModel: - listOfObjects.elementAt(index)))); + familyMemberIndividualDataModel: widget + .modelData!.individualDataList + .elementAt(index)))); }, //Pass a function which is called onSaved in the next page and add data to the class object leading: Icon(Icons.person), @@ -132,16 +95,9 @@ class _AddRemoveBoxWidgetState extends State { color: colors.darkSecondAccentColor, icon: Icon(Icons.close), onPressed: () async { - int id = listOfObjects.elementAt(index).id; - - var store = await StoreInstance.getInstance(); - Box box = store - .box(); - box.remove(id); - - widget.modelData.keys?.remove(id); setState(() { - listOfObjects.removeAt(index); + widget.modelData!.individualDataList + .removeAt(index); }); }, ), diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 27d17fa..5fcf7e5 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -54,7 +54,7 @@ }, { "id": "2:1860532570098563020", - "lastPropertyId": "9:7198889010838595583", + "lastPropertyId": "10:2008589073662093950", "name": "FamilyMembersCommonDataModel", "properties": [ { @@ -87,18 +87,19 @@ "id": "8:4682325687318046173", "name": "dbLocationBottomRight", "type": 9 - }, - { - "id": "9:7198889010838595583", - "name": "keys", - "type": 23 } ], - "relations": [] + "relations": [ + { + "id": "3:371184347085100722", + "name": "individualDataList", + "targetId": "4:8671447701453785879" + } + ] }, { "id": "4:8671447701453785879", - "lastPropertyId": "3:4526862708267238768", + "lastPropertyId": "31:1397399115057201044", "name": "FamilyMemberIndividualDataModel", "properties": [ { @@ -116,6 +117,146 @@ "id": "3:4526862708267238768", "name": "savedTime", "type": 9 + }, + { + "id": "4:3085664632559939021", + "name": "dateOfBirth", + "type": 9 + }, + { + "id": "5:4089981874949227093", + "name": "gender", + "type": 9 + }, + { + "id": "6:8147924758541863603", + "name": "phoneNumber", + "type": 9 + }, + { + "id": "7:8362247275532978895", + "name": "educationQualification", + "type": 9 + }, + { + "id": "8:5679091799904005563", + "name": "aadhaarNumber", + "type": 9 + }, + { + "id": "9:93176754199097596", + "name": "vulnerabilities", + "type": 30 + }, + { + "id": "10:6683743346766211386", + "name": "occupation", + "type": 30 + }, + { + "id": "11:7674773686375268308", + "name": "dailyWageWorker", + "type": 9 + }, + { + "id": "12:3825178531183591336", + "name": "incomePerDay", + "type": 9 + }, + { + "id": "13:6800080566226023846", + "name": "incomePerMonth", + "type": 9 + }, + { + "id": "14:6682636002341351132", + "name": "pension", + "type": 9 + }, + { + "id": "15:5889517609383333513", + "name": "businessStatus", + "type": 9 + }, + { + "id": "16:1551885345947737655", + "name": "maritalStatus", + "type": 9 + }, + { + "id": "17:7362378614402948609", + "name": "specialSkills", + "type": 30 + }, + { + "id": "18:8079660499990560077", + "name": "frequentAilments", + "type": 30 + }, + { + "id": "19:4413374908120023856", + "name": "commutableDisease", + "type": 30 + }, + { + "id": "20:4250702923463112078", + "name": "nonCommutableDisease", + "type": 30 + }, + { + "id": "21:1237433258990716055", + "name": "surgeries", + "type": 9 + }, + { + "id": "22:6965476731638035450", + "name": "anganwadiServicesAware", + "type": 9 + }, + { + "id": "23:4550221857104463869", + "name": "anganwadiServicesUsing", + "type": 9 + }, + { + "id": "24:9085531839818427243", + "name": "anganwadiServicesUsedList", + "type": 30 + }, + { + "id": "25:6866114763519136439", + "name": "PHCServicesUsedList", + "type": 30 + }, + { + "id": "26:4835734038831150727", + "name": "privateClinicServicesUsedList", + "type": 30 + }, + { + "id": "27:4667157897046339139", + "name": "privateServiceReason", + "type": 9 + }, + { + "id": "28:3779166862225991045", + "name": "useOfTobacco", + "type": 9 + }, + { + "id": "29:3268788816803461695", + "name": "useOfAlcohol", + "type": 9 + }, + { + "id": "30:4255114771534059896", + "name": "aarogyaSetuInstalled", + "type": 9 + }, + { + "id": "31:1397399115057201044", + "name": "vizhithiruInstalled", + "type": 9 } ], "relations": [] @@ -123,7 +264,7 @@ ], "lastEntityId": "4:8671447701453785879", "lastIndexId": "2:3780641643474411567", - "lastRelationId": "2:991746608797753194", + "lastRelationId": "3:371184347085100722", "lastSequenceId": "0:0", "modelVersion": 5, "modelVersionParserMinimum": 5, @@ -142,7 +283,9 @@ 2435262721668243080, 5992078344277508825, 2398616950182668401, - 635977564128467162 + 635977564128467162, + 7198889010838595583, + 2008589073662093950 ], "retiredRelationUids": [ 7533083279143375120, diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index c846fa8..c7f858e 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -67,7 +67,7 @@ final _entities = [ ModelEntity( id: const IdUid(2, 1860532570098563020), name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(9, 7198889010838595583), + lastPropertyId: const IdUid(10, 2008589073662093950), flags: 0, properties: [ ModelProperty( @@ -99,19 +99,19 @@ final _entities = [ id: const IdUid(8, 4682325687318046173), name: 'dbLocationBottomRight', type: 9, - flags: 0), - ModelProperty( - id: const IdUid(9, 7198889010838595583), - name: 'keys', - type: 23, flags: 0) ], - relations: [], + relations: [ + ModelRelation( + id: const IdUid(3, 371184347085100722), + name: 'individualDataList', + targetId: const IdUid(4, 8671447701453785879)) + ], backlinks: []), ModelEntity( id: const IdUid(4, 8671447701453785879), name: 'FamilyMemberIndividualDataModel', - lastPropertyId: const IdUid(3, 4526862708267238768), + lastPropertyId: const IdUid(31, 1397399115057201044), flags: 0, properties: [ ModelProperty( @@ -128,6 +128,146 @@ final _entities = [ id: const IdUid(3, 4526862708267238768), name: 'savedTime', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(4, 3085664632559939021), + name: 'dateOfBirth', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(5, 4089981874949227093), + name: 'gender', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(6, 8147924758541863603), + name: 'phoneNumber', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(7, 8362247275532978895), + name: 'educationQualification', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(8, 5679091799904005563), + name: 'aadhaarNumber', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(9, 93176754199097596), + name: 'vulnerabilities', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(10, 6683743346766211386), + name: 'occupation', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(11, 7674773686375268308), + name: 'dailyWageWorker', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(12, 3825178531183591336), + name: 'incomePerDay', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(13, 6800080566226023846), + name: 'incomePerMonth', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(14, 6682636002341351132), + name: 'pension', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(15, 5889517609383333513), + name: 'businessStatus', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(16, 1551885345947737655), + name: 'maritalStatus', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(17, 7362378614402948609), + name: 'specialSkills', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(18, 8079660499990560077), + name: 'frequentAilments', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(19, 4413374908120023856), + name: 'commutableDisease', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(20, 4250702923463112078), + name: 'nonCommutableDisease', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(21, 1237433258990716055), + name: 'surgeries', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(22, 6965476731638035450), + name: 'anganwadiServicesAware', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(23, 4550221857104463869), + name: 'anganwadiServicesUsing', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(24, 9085531839818427243), + name: 'anganwadiServicesUsedList', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(25, 6866114763519136439), + name: 'PHCServicesUsedList', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(26, 4835734038831150727), + name: 'privateClinicServicesUsedList', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(27, 4667157897046339139), + name: 'privateServiceReason', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(28, 3779166862225991045), + name: 'useOfTobacco', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(29, 3268788816803461695), + name: 'useOfAlcohol', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(30, 4255114771534059896), + name: 'aarogyaSetuInstalled', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(31, 1397399115057201044), + name: 'vizhithiruInstalled', + type: 9, flags: 0) ], relations: [], @@ -156,7 +296,7 @@ ModelDefinition getObjectBoxModel() { entities: _entities, lastEntityId: const IdUid(4, 8671447701453785879), lastIndexId: const IdUid(2, 3780641643474411567), - lastRelationId: const IdUid(2, 991746608797753194), + lastRelationId: const IdUid(3, 371184347085100722), lastSequenceId: const IdUid(0, 0), retiredEntityUids: const [2384522976899313648], retiredIndexUids: const [8834613087270691234, 3780641643474411567], @@ -168,7 +308,9 @@ ModelDefinition getObjectBoxModel() { 2435262721668243080, 5992078344277508825, 2398616950182668401, - 635977564128467162 + 635977564128467162, + 7198889010838595583, + 2008589073662093950 ], retiredRelationUids: const [7533083279143375120, 991746608797753194], modelVersion: 5, @@ -246,7 +388,10 @@ ModelDefinition getObjectBoxModel() { EntityDefinition( model: _entities[1], toOneRelations: (FamilyMembersCommonDataModel object) => [], - toManyRelations: (FamilyMembersCommonDataModel object) => {}, + toManyRelations: (FamilyMembersCommonDataModel object) => { + RelInfo.toMany(3, object.id): + object.individualDataList + }, getId: (FamilyMembersCommonDataModel object) => object.id, setId: (FamilyMembersCommonDataModel object, int id) { object.id = id; @@ -269,16 +414,13 @@ ModelDefinition getObjectBoxModel() { object.dbLocationBottomRight == null ? null : fbb.writeString(object.dbLocationBottomRight!); - final keysOffset = - object.keys == null ? null : fbb.writeListInt8(object.keys!); - fbb.startTable(10); + fbb.startTable(11); fbb.addInt64(0, object.id); fbb.addOffset(3, savedTimeOffset); fbb.addOffset(4, dbLocationTopLeftOffset); fbb.addOffset(5, dbLocationTopRightOffset); fbb.addOffset(6, dbLocationBottomLeftOffset); fbb.addOffset(7, dbLocationBottomRightOffset); - fbb.addOffset(8, keysOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -286,9 +428,7 @@ ModelDefinition getObjectBoxModel() { final buffer = fb.BufferContext(fbData); final rootOffset = buffer.derefObject(0); - final object = FamilyMembersCommonDataModel( - keys: const fb.ListReader(fb.Int8Reader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 20)) + final object = FamilyMembersCommonDataModel() ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) ..savedTime = const fb.StringReader() @@ -301,7 +441,11 @@ ModelDefinition getObjectBoxModel() { .vTableGetNullable(buffer, rootOffset, 16) ..dbLocationBottomRight = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 18); - + InternalToManyAccess.setRelInfo( + object.individualDataList, + store, + RelInfo.toMany(3, object.id), + store.box()); return object; }), FamilyMemberIndividualDataModel: EntityDefinition< @@ -320,10 +464,143 @@ ModelDefinition getObjectBoxModel() { final savedTimeOffset = object.savedTime == null ? null : fbb.writeString(object.savedTime!); - fbb.startTable(4); + final dateOfBirthOffset = object.dateOfBirth == null + ? null + : fbb.writeString(object.dateOfBirth!); + final genderOffset = + object.gender == null ? null : fbb.writeString(object.gender!); + final phoneNumberOffset = object.phoneNumber == null + ? null + : fbb.writeString(object.phoneNumber!); + final educationQualificationOffset = + object.educationQualification == null + ? null + : fbb.writeString(object.educationQualification!); + final aadhaarNumberOffset = object.aadhaarNumber == null + ? null + : fbb.writeString(object.aadhaarNumber!); + final vulnerabilitiesOffset = object.vulnerabilities == null + ? null + : fbb.writeList(object.vulnerabilities! + .map(fbb.writeString) + .toList(growable: false)); + final occupationOffset = object.occupation == null + ? null + : fbb.writeList(object.occupation! + .map(fbb.writeString) + .toList(growable: false)); + final dailyWageWorkerOffset = object.dailyWageWorker == null + ? null + : fbb.writeString(object.dailyWageWorker!); + final incomePerDayOffset = object.incomePerDay == null + ? null + : fbb.writeString(object.incomePerDay!); + final incomePerMonthOffset = object.incomePerMonth == null + ? null + : fbb.writeString(object.incomePerMonth!); + final pensionOffset = + object.pension == null ? null : fbb.writeString(object.pension!); + final businessStatusOffset = object.businessStatus == null + ? null + : fbb.writeString(object.businessStatus!); + final maritalStatusOffset = object.maritalStatus == null + ? null + : fbb.writeString(object.maritalStatus!); + final specialSkillsOffset = object.specialSkills == null + ? null + : fbb.writeList(object.specialSkills! + .map(fbb.writeString) + .toList(growable: false)); + final frequentAilmentsOffset = object.frequentAilments == null + ? null + : fbb.writeList(object.frequentAilments! + .map(fbb.writeString) + .toList(growable: false)); + final commutableDiseaseOffset = object.commutableDisease == null + ? null + : fbb.writeList(object.commutableDisease! + .map(fbb.writeString) + .toList(growable: false)); + final nonCommutableDiseaseOffset = object.nonCommutableDisease == null + ? null + : fbb.writeList(object.nonCommutableDisease! + .map(fbb.writeString) + .toList(growable: false)); + final surgeriesOffset = object.surgeries == null + ? null + : fbb.writeString(object.surgeries!); + final anganwadiServicesAwareOffset = + object.anganwadiServicesAware == null + ? null + : fbb.writeString(object.anganwadiServicesAware!); + final anganwadiServicesUsingOffset = + object.anganwadiServicesUsing == null + ? null + : fbb.writeString(object.anganwadiServicesUsing!); + final anganwadiServicesUsedListOffset = + object.anganwadiServicesUsedList == null + ? null + : fbb.writeList(object.anganwadiServicesUsedList! + .map(fbb.writeString) + .toList(growable: false)); + final PHCServicesUsedListOffset = object.PHCServicesUsedList == null + ? null + : fbb.writeList(object.PHCServicesUsedList! + .map(fbb.writeString) + .toList(growable: false)); + final privateClinicServicesUsedListOffset = + object.privateClinicServicesUsedList == null + ? null + : fbb.writeList(object.privateClinicServicesUsedList! + .map(fbb.writeString) + .toList(growable: false)); + final privateServiceReasonOffset = object.privateServiceReason == null + ? null + : fbb.writeString(object.privateServiceReason!); + final useOfTobaccoOffset = object.useOfTobacco == null + ? null + : fbb.writeString(object.useOfTobacco!); + final useOfAlcoholOffset = object.useOfAlcohol == null + ? null + : fbb.writeString(object.useOfAlcohol!); + final aarogyaSetuInstalledOffset = object.aarogyaSetuInstalled == null + ? null + : fbb.writeString(object.aarogyaSetuInstalled!); + final vizhithiruInstalledOffset = object.vizhithiruInstalled == null + ? null + : fbb.writeString(object.vizhithiruInstalled!); + fbb.startTable(32); fbb.addInt64(0, object.id); fbb.addOffset(1, userNameOffset); fbb.addOffset(2, savedTimeOffset); + fbb.addOffset(3, dateOfBirthOffset); + fbb.addOffset(4, genderOffset); + fbb.addOffset(5, phoneNumberOffset); + fbb.addOffset(6, educationQualificationOffset); + fbb.addOffset(7, aadhaarNumberOffset); + fbb.addOffset(8, vulnerabilitiesOffset); + fbb.addOffset(9, occupationOffset); + fbb.addOffset(10, dailyWageWorkerOffset); + fbb.addOffset(11, incomePerDayOffset); + fbb.addOffset(12, incomePerMonthOffset); + fbb.addOffset(13, pensionOffset); + fbb.addOffset(14, businessStatusOffset); + fbb.addOffset(15, maritalStatusOffset); + fbb.addOffset(16, specialSkillsOffset); + fbb.addOffset(17, frequentAilmentsOffset); + fbb.addOffset(18, commutableDiseaseOffset); + fbb.addOffset(19, nonCommutableDiseaseOffset); + fbb.addOffset(20, surgeriesOffset); + fbb.addOffset(21, anganwadiServicesAwareOffset); + fbb.addOffset(22, anganwadiServicesUsingOffset); + fbb.addOffset(23, anganwadiServicesUsedListOffset); + fbb.addOffset(24, PHCServicesUsedListOffset); + fbb.addOffset(25, privateClinicServicesUsedListOffset); + fbb.addOffset(26, privateServiceReasonOffset); + fbb.addOffset(27, useOfTobaccoOffset); + fbb.addOffset(28, useOfAlcoholOffset); + fbb.addOffset(29, aarogyaSetuInstalledOffset); + fbb.addOffset(30, vizhithiruInstalledOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -335,8 +612,73 @@ ModelDefinition getObjectBoxModel() { userName: const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 6)) ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) - ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 8); + ..savedTime = + const fb.StringReader().vTableGetNullable(buffer, rootOffset, 8) + ..dateOfBirth = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 10) + ..gender = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 12) + ..phoneNumber = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 14) + ..educationQualification = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 16) + ..aadhaarNumber = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 18) + ..vulnerabilities = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 20) + ..occupation = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 22) + ..dailyWageWorker = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 24) + ..incomePerDay = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 26) + ..incomePerMonth = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 28) + ..pension = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 30) + ..businessStatus = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 32) + ..maritalStatus = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 34) + ..specialSkills = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 36) + ..frequentAilments = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 38) + ..commutableDisease = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 40) + ..nonCommutableDisease = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 42) + ..surgeries = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 44) + ..anganwadiServicesAware = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 46) + ..anganwadiServicesUsing = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 48) + ..anganwadiServicesUsedList = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 50) + ..PHCServicesUsedList = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 52) + ..privateClinicServicesUsedList = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 54) + ..privateServiceReason = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 56) + ..useOfTobacco = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 58) + ..useOfAlcohol = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 60) + ..aarogyaSetuInstalled = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 62) + ..vizhithiruInstalled = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 64); return object; }) @@ -410,9 +752,10 @@ class FamilyMembersCommonDataModel_ { QueryStringProperty( _entities[1].properties[5]); - /// see [FamilyMembersCommonDataModel.keys] - static final keys = QueryByteVectorProperty( - _entities[1].properties[6]); + /// see [FamilyMembersCommonDataModel.individualDataList] + static final individualDataList = QueryRelationToMany< + FamilyMembersCommonDataModel, + FamilyMemberIndividualDataModel>(_entities[1].relations[0]); } /// [FamilyMemberIndividualDataModel] entity fields to define ObjectBox queries. @@ -428,4 +771,141 @@ class FamilyMemberIndividualDataModel_ { /// see [FamilyMemberIndividualDataModel.savedTime] static final savedTime = QueryStringProperty( _entities[2].properties[2]); + + /// see [FamilyMemberIndividualDataModel.dateOfBirth] + static final dateOfBirth = + QueryStringProperty( + _entities[2].properties[3]); + + /// see [FamilyMemberIndividualDataModel.gender] + static final gender = QueryStringProperty( + _entities[2].properties[4]); + + /// see [FamilyMemberIndividualDataModel.phoneNumber] + static final phoneNumber = + QueryStringProperty( + _entities[2].properties[5]); + + /// see [FamilyMemberIndividualDataModel.educationQualification] + static final educationQualification = + QueryStringProperty( + _entities[2].properties[6]); + + /// see [FamilyMemberIndividualDataModel.aadhaarNumber] + static final aadhaarNumber = + QueryStringProperty( + _entities[2].properties[7]); + + /// see [FamilyMemberIndividualDataModel.vulnerabilities] + static final vulnerabilities = + QueryStringVectorProperty( + _entities[2].properties[8]); + + /// see [FamilyMemberIndividualDataModel.occupation] + static final occupation = + QueryStringVectorProperty( + _entities[2].properties[9]); + + /// see [FamilyMemberIndividualDataModel.dailyWageWorker] + static final dailyWageWorker = + QueryStringProperty( + _entities[2].properties[10]); + + /// see [FamilyMemberIndividualDataModel.incomePerDay] + static final incomePerDay = + QueryStringProperty( + _entities[2].properties[11]); + + /// see [FamilyMemberIndividualDataModel.incomePerMonth] + static final incomePerMonth = + QueryStringProperty( + _entities[2].properties[12]); + + /// see [FamilyMemberIndividualDataModel.pension] + static final pension = QueryStringProperty( + _entities[2].properties[13]); + + /// see [FamilyMemberIndividualDataModel.businessStatus] + static final businessStatus = + QueryStringProperty( + _entities[2].properties[14]); + + /// see [FamilyMemberIndividualDataModel.maritalStatus] + static final maritalStatus = + QueryStringProperty( + _entities[2].properties[15]); + + /// see [FamilyMemberIndividualDataModel.specialSkills] + static final specialSkills = + QueryStringVectorProperty( + _entities[2].properties[16]); + + /// see [FamilyMemberIndividualDataModel.frequentAilments] + static final frequentAilments = + QueryStringVectorProperty( + _entities[2].properties[17]); + + /// see [FamilyMemberIndividualDataModel.commutableDisease] + static final commutableDisease = + QueryStringVectorProperty( + _entities[2].properties[18]); + + /// see [FamilyMemberIndividualDataModel.nonCommutableDisease] + static final nonCommutableDisease = + QueryStringVectorProperty( + _entities[2].properties[19]); + + /// see [FamilyMemberIndividualDataModel.surgeries] + static final surgeries = QueryStringProperty( + _entities[2].properties[20]); + + /// see [FamilyMemberIndividualDataModel.anganwadiServicesAware] + static final anganwadiServicesAware = + QueryStringProperty( + _entities[2].properties[21]); + + /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsing] + static final anganwadiServicesUsing = + QueryStringProperty( + _entities[2].properties[22]); + + /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsedList] + static final anganwadiServicesUsedList = + QueryStringVectorProperty( + _entities[2].properties[23]); + + /// see [FamilyMemberIndividualDataModel.PHCServicesUsedList] + static final PHCServicesUsedList = + QueryStringVectorProperty( + _entities[2].properties[24]); + + /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsedList] + static final privateClinicServicesUsedList = + QueryStringVectorProperty( + _entities[2].properties[25]); + + /// see [FamilyMemberIndividualDataModel.privateServiceReason] + static final privateServiceReason = + QueryStringProperty( + _entities[2].properties[26]); + + /// see [FamilyMemberIndividualDataModel.useOfTobacco] + static final useOfTobacco = + QueryStringProperty( + _entities[2].properties[27]); + + /// see [FamilyMemberIndividualDataModel.useOfAlcohol] + static final useOfAlcohol = + QueryStringProperty( + _entities[2].properties[28]); + + /// see [FamilyMemberIndividualDataModel.aarogyaSetuInstalled] + static final aarogyaSetuInstalled = + QueryStringProperty( + _entities[2].properties[29]); + + /// see [FamilyMemberIndividualDataModel.vizhithiruInstalled] + static final vizhithiruInstalled = + QueryStringProperty( + _entities[2].properties[30]); } From 18b794e2e8633c4849bb62149f6e110b7922519e Mon Sep 17 00:00:00 2001 From: Soorya S Date: Tue, 4 Jan 2022 12:18:01 +0530 Subject: [PATCH 105/264] Resolved merge conflict in FamilyMemberAdd --- lib/Screens/FamilyMemberAdd.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 93aa35e..dda5860 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -121,6 +121,10 @@ class _FamilyMemberAddState extends State { GenderPickerWithImage( verticalAlignedText: false, selectedGender: Gender.Male, + maleImage: AssetImage("assets/avatar_man.png"), + linearGradient: LinearGradient( + colors: [Color(0xfff54b64), Color(0xfff78361)]), + femaleImage: AssetImage("assets/avatar_woman.png"), selectedGenderTextStyle: TextStyle( color: Colors.greenAccent, fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( @@ -134,7 +138,7 @@ class _FamilyMemberAddState extends State { equallyAligned: true, animationDuration: Duration(milliseconds: 300), isCircular: true, - opacityOfGradient: 0.3, + opacityOfGradient: 0.2, padding: const EdgeInsets.all(3), size: 70, //default : 40 ), From 5abd8b2e5ec44e119e1a2b970050f6eea650f70e Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 19:19:24 +0530 Subject: [PATCH 106/264] Added VillageSelection.dart, moved sign out function [DOES NOT WORK] --- lib/Screens/Home.dart | 10 ++-- lib/Screens/VillageSelection.dart | 82 +++++++++++++++++++++++++++++++ lib/Widgets/NavigationDrawer.dart | 24 +++++++-- 3 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 lib/Screens/VillageSelection.dart diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index ddb4525..f4efd87 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; +import 'package:geo_spatial/Screens/VillageSelection.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:geo_spatial/Widgets/NavigationDrawer.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'EditExistingRecordsPage.dart'; import 'SavedData.dart'; @@ -21,7 +23,6 @@ class Home extends StatefulWidget { final storage = FlutterSecureStorage(); class _HomeWidgetState extends State { - String userName = ''; @override Widget build(BuildContext context) { @@ -29,11 +30,11 @@ class _HomeWidgetState extends State { drawer: NavigationDrawer(), backgroundColor: colors.darkScaffoldColor, appBar: AppBar( - elevation: 0, + elevation: 40, title: Text( - 'Hello, ' + userName + '!', + 'Hello, ' + globals.Name + '!', style: GoogleFonts.montserrat( - fontSize: 20, color: colors.darkPrimaryTextColor), + fontSize: 18, color: colors.darkPrimaryTextColor), ), backgroundColor: Colors.transparent, actions: [ @@ -62,6 +63,7 @@ class _HomeWidgetState extends State { 'Individual data entry for everyone in home', 'assets/svg/female.svg', FamilyHomeScreen(), + //VillageSelectionScreen(), Color(0xfff54b64), Color(0xfff78361)), DataCard( diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart new file mode 100644 index 0000000..e5e7ec7 --- /dev/null +++ b/lib/Screens/VillageSelection.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class VillageSelectionScreen extends StatefulWidget { + VillageSelectionScreen({Key? key}) : super(key: key); + + @override + _VillageSelectionScreenState createState() => _VillageSelectionScreenState(); + + var villages = { + 'ID1':false, + 'ID2':false, + 'ID3':false + }; + + var isGenerated = false; + +} + + +class _VillageSelectionScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton('Generate UID'), + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.all(Radius.circular(20)) + ), + height: MediaQuery.of(context).size.height*0.80, + width: MediaQuery.of(context).size.width*0.9, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CheckBoxAlertDialog( + title: "Choose Village Code", + context: context, + hint: 'Choose here', + dataMap: widget.villages, + ), + Padding( + padding: const EdgeInsets.all(25.0), + child: SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + child: Text("Generate UID", style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkScaffoldColor), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors.darkScaffoldColor)))), + onPressed: () { + widget.isGenerated = true; + }), + ), + ), + ], + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index 3df0d9c..9b01179 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:google_fonts/google_fonts.dart'; @@ -40,10 +41,27 @@ class NavigationDrawer extends StatelessWidget { ), buildMenuItem(text: 'Home', icon: Icons.home, onTap: () {}), buildMenuItem(text: 'Profile', icon: Icons.person, onTap: () {}), - SizedBox( - height: MediaQuery.of(context).size.height * 0.6, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Container( + height: 1, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide(color: Colors.grey), + ), + ), + ), + ), + buildMenuItem( + text: 'Sign Out', + icon: Icons.logout, + onTap: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false); + }, ), - buildMenuItem(text: 'Sign Out', icon: Icons.logout, onTap: () {}), ], ), ), From f2b1c16be39229c7cc8fe9e4624bc2cdabd60e0d Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 19:37:34 +0530 Subject: [PATCH 107/264] Fixed spelling mistakes --- ...rsCommomDataModel.dart => FamilyMembersCommonDataModel.dart} | 0 lib/Screens/FamilyHomeScreen.dart | 2 +- lib/Screens/FamilyMemberAdd.dart | 2 +- lib/Screens/SavedData.dart | 2 +- lib/Screens/VillageSelection.dart | 2 ++ lib/Widgets/AddRemoveBoxWidget.dart | 2 +- lib/objectbox.g.dart | 2 +- 7 files changed, 7 insertions(+), 5 deletions(-) rename lib/Model/{FamilyMembersCommomDataModel.dart => FamilyMembersCommonDataModel.dart} (100%) diff --git a/lib/Model/FamilyMembersCommomDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart similarity index 100% rename from lib/Model/FamilyMembersCommomDataModel.dart rename to lib/Model/FamilyMembersCommonDataModel.dart diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 331fe39..d0828de 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommomDataModel.dart'; +import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/StoreInstance.dart'; diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index dda5860..e8c4830 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:gender_picker/gender_picker.dart'; import 'package:gender_picker/source/enums.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommomDataModel.dart'; +import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Utils/StoreInstance.dart'; diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart index a170fcf..f1fcecf 100644 --- a/lib/Screens/SavedData.dart +++ b/lib/Screens/SavedData.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommomDataModel.dart'; +import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/StoreInstance.dart'; diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index e5e7ec7..461b238 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -70,6 +70,8 @@ class _VillageSelectionScreenState extends State { }), ), ), + if(widget.isGenerated) + Card(), ], ), ), diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 5ac45e2..7fd4b97 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommomDataModel.dart'; +import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index c7f858e..4dc15e4 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -10,7 +10,7 @@ import 'package:objectbox/objectbox.dart'; import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; import 'Model/CommunityDataModel.dart'; -import 'Model/FamilyMembersCommomDataModel.dart'; +import 'Model/FamilyMembersCommonDataModel.dart'; export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file From 37d7cd32d95bac5db25665f1050f4e8fe77853a4 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 20:40:49 +0530 Subject: [PATCH 108/264] Implemented VillageSelection.dart --- lib/Screens/Home.dart | 4 +- lib/Screens/VillageSelection.dart | 152 ++++++++++++++++++++---------- 2 files changed, 104 insertions(+), 52 deletions(-) diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index f4efd87..8054544 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -62,8 +62,8 @@ class _HomeWidgetState extends State { 'Individual data', 'Individual data entry for everyone in home', 'assets/svg/female.svg', - FamilyHomeScreen(), - //VillageSelectionScreen(), + //FamilyHomeScreen(), + VillageSelectionScreen(), Color(0xfff54b64), Color(0xfff78361)), DataCard( diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index 461b238..5b97768 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; @@ -10,17 +11,11 @@ class VillageSelectionScreen extends StatefulWidget { @override _VillageSelectionScreenState createState() => _VillageSelectionScreenState(); - var villages = { - 'ID1':false, - 'ID2':false, - 'ID3':false - }; + var villages = {'ID1': false, 'ID2': false, 'ID3': false}; var isGenerated = false; - } - class _VillageSelectionScreenState extends State { @override Widget build(BuildContext context) { @@ -30,54 +25,111 @@ class _VillageSelectionScreenState extends State { body: SafeArea( child: Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ - Center( - child: Container( - decoration: BoxDecoration( - color: colors.darkSecondBackgroundColor, - borderRadius: BorderRadius.all(Radius.circular(20)) - ), - height: MediaQuery.of(context).size.height*0.80, - width: MediaQuery.of(context).size.width*0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CheckBoxAlertDialog( - title: "Choose Village Code", - context: context, - hint: 'Choose here', - dataMap: widget.villages, + children: [ + Center( + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.all(Radius.circular(20))), + height: MediaQuery.of(context).size.height * 0.80, + width: MediaQuery.of(context).size.width * 0.9, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CheckBoxAlertDialog( + title: "Choose Village Code", + context: context, + hint: 'Choose here', + dataMap: widget.villages, + ), + Padding( + padding: const EdgeInsets.only( + top: 25.0, bottom: 75, right: 15.0, left: 25.0), + child: SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + child: Text("Generate UID", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + Colors.white), + backgroundColor: + MaterialStateProperty.all( + colors.darkScaffoldColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors.darkScaffoldColor)))), + onPressed: () { + setState(() { + widget.isGenerated = true; + }); + }), ), - Padding( - padding: const EdgeInsets.all(25.0), + ), + if (widget.isGenerated) + Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20)), + elevation: 10, + color: colors.darkScaffoldColor, child: SizedBox( - width: double.infinity, - height: 50, - child: ElevatedButton( - child: Text("Generate UID", style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all(Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkScaffoldColor), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors.darkScaffoldColor)))), - onPressed: () { - widget.isGenerated = true; - }), + height: MediaQuery.of(context).size.height * 0.16, + width: MediaQuery.of(context).size.width * 0.7, + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(vertical: 20.0), + child: Text( + 'Sample UIN', + style: GoogleFonts.poppins(fontWeight: FontWeight.w600, fontSize: 20, + color: colors.darkPrimaryTextColor), + ), + ), + ElevatedButton.icon( + label: Text("Continue", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + colors.lightPrimaryTextColor), + backgroundColor: + MaterialStateProperty.all( + colors.darkPrimaryTextColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkScaffoldColor)))), + onPressed: () { + Navigator.of(context) + .push(MaterialPageRoute(builder: (context) => FamilyHomeScreen())); + }, + icon: Icon(Icons.arrow_right_alt_sharp), + ), + ], + ), ), ), - if(widget.isGenerated) - Card(), - ], - ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.1, + ), + TextButton( + onPressed: () {}, child: Text("Generate UIN later")) + ], ), - ) - ], - ), + ), + ) + ], + ), ), ); } From 22f711e3c7a40a2051b96d8b33af49d116b7210b Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 20:51:37 +0530 Subject: [PATCH 109/264] Added Are you Sure dialog to FamilyMemberAdd.dart --- lib/Screens/FamilyMemberAdd.dart | 954 ++++++++++++++++--------------- 1 file changed, 492 insertions(+), 462 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index e8c4830..d902598 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -61,367 +61,511 @@ class _FamilyMemberAddState extends State { @override Widget build(BuildContext context) { - return Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: colors.darkScaffoldColor, - appBar: AppBarBackButton('Add Family Member'), - body: SizedBox( - height: MediaQuery.of(context).size.height - - MediaQuery.of(context).viewInsets.bottom * 1.45, - child: SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: FormPageView( - [ - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.userName, - onSaved: (String? data) async { - widget.familyMemberIndividualDataModel!.userName = data; - }, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - //isDense: true, - label: Text( - "Name", - style: GoogleFonts.poppins( + return WillPopScope( + onWillPop: () async { + //TODO: Add condition here to check if page has been filled + if (false) { + return true; + } + final result = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text("Are you sure?"), + content: Text("All unsaved changes would be lost"), + actions: [ + TextButton( + child: Text('No'), + onPressed: () { + Navigator.pop(context, false); + }, + ), + TextButton( + child: Text('Yes', style: TextStyle(color: Colors.red)), + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ), + ); + return result; + }, + child: Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton('Add Family Member'), + body: SizedBox( + height: MediaQuery.of(context).size.height - + MediaQuery.of(context).viewInsets.bottom * 1.45, + child: SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: FormPageView( + [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.userName, + onSaved: (String? data) async { + widget.familyMemberIndividualDataModel!.userName = data; + }, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + //isDense: true, + label: Text( + "Name", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter name", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter name", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Please enter a name"; + } else + return null; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - validator: (value) { - if (value == "") { - return "Please enter a name"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, ), - ), - DatePickerWidget( - //TODO: Add initial value - context: context, - title: "Date of Birth", - hint: "Choose a date", - autoValidateMode: AutovalidateMode.onUserInteraction, - onSaved: (data) { - // widget.familyMemberIndividualDataModel!.dateOfBirth = - // "${data!.day}/${data.month}/${data.year}"; - // print(data); - }, - ), - GenderPickerWithImage( - verticalAlignedText: false, - selectedGender: Gender.Male, - maleImage: AssetImage("assets/avatar_man.png"), - linearGradient: LinearGradient( - colors: [Color(0xfff54b64), Color(0xfff78361)]), - femaleImage: AssetImage("assets/avatar_woman.png"), - selectedGenderTextStyle: TextStyle( - color: Colors.greenAccent, fontWeight: FontWeight.bold), - unSelectedGenderTextStyle: TextStyle( - color: colors.darkPrimaryTextColor, - fontWeight: FontWeight.normal), - onChanged: (Gender? gender) { - print(gender); - widget.familyMemberIndividualDataModel!.gender = - gender.toString(); - }, - equallyAligned: true, - animationDuration: Duration(milliseconds: 300), - isCircular: true, - opacityOfGradient: 0.2, - padding: const EdgeInsets.all(3), - size: 70, //default : 40 - ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.phoneNumber, - style: darkTheme.DarkTheme.textTheme.bodyText2, - keyboardType: TextInputType.number, - decoration: InputDecoration( - label: Text( - "Phone Number", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter 10 digit phone", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Please enter a value / 0 if no phone"; - } else if (value!.length != 10) { - return "Enter a valid number"; - } else - return null; - }, + DatePickerWidget( + //TODO: Add initial value + context: context, + title: "Date of Birth", + hint: "Choose a date", + autoValidateMode: AutovalidateMode.onUserInteraction, onSaved: (data) { - widget.familyMemberIndividualDataModel!.phoneNumber = - data; + // widget.familyMemberIndividualDataModel!.dateOfBirth = + // "${data!.day}/${data.month}/${data.year}"; + // print(data); }, - autovalidateMode: AutovalidateMode.onUserInteraction, ), - ), - DropDownFormField( - defaultValue: widget.familyMemberIndividualDataModel! - .educationQualification, - list: [ - 'None', - 'Elementary', - 'Secondary', - 'Higher Secondary', - 'Bachelor\'s', - 'Master\'s' - ], - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .educationQualification = data; - }, - hint: "Select the highest", - title: "Educational qualification", - errorField: "Please choose a qualification", - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.aadhaarNumber, - keyboardType: TextInputType.number, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Aadhaar Number", - style: GoogleFonts.poppins( + GenderPickerWithImage( + verticalAlignedText: false, + selectedGender: Gender.Male, + maleImage: AssetImage("assets/avatar_man.png"), + linearGradient: LinearGradient( + colors: [Color(0xfff54b64), Color(0xfff78361)]), + femaleImage: AssetImage("assets/avatar_woman.png"), + selectedGenderTextStyle: TextStyle( + color: Colors.greenAccent, fontWeight: FontWeight.bold), + unSelectedGenderTextStyle: TextStyle( + color: colors.darkPrimaryTextColor, + fontWeight: FontWeight.normal), + onChanged: (Gender? gender) { + print(gender); + widget.familyMemberIndividualDataModel!.gender = + gender.toString(); + }, + equallyAligned: true, + animationDuration: Duration(milliseconds: 300), + isCircular: true, + opacityOfGradient: 0.2, + padding: const EdgeInsets.all(3), + size: 70, //default : 40 + ), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.phoneNumber, + style: darkTheme.DarkTheme.textTheme.bodyText2, + keyboardType: TextInputType.number, + decoration: InputDecoration( + label: Text( + "Phone Number", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter 10 digit phone", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter 12 digit Aadhaar", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Please enter a value / 0 if no phone"; + } else if (value!.length != 10) { + return "Enter a valid number"; + } else + return null; + }, + onSaved: (data) { + widget.familyMemberIndividualDataModel!.phoneNumber = + data; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - validator: (value) { - if (value == "") { - return "Enter 12 digit Aadhaar / 0 if absent"; - } else if (value!.length != 12) { - return "Enter a valid Aadhaar"; - } else - return null; - }, + ), + DropDownFormField( + defaultValue: widget.familyMemberIndividualDataModel! + .educationQualification, + list: [ + 'None', + 'Elementary', + 'Secondary', + 'Higher Secondary', + 'Bachelor\'s', + 'Master\'s' + ], onSaved: (data) { - widget.familyMemberIndividualDataModel!.aadhaarNumber = - data; + widget.familyMemberIndividualDataModel! + .educationQualification = data; }, - autovalidateMode: AutovalidateMode.onUserInteraction, + hint: "Select the highest", + title: "Educational qualification", + errorField: "Please choose a qualification", ), - ), - CheckBoxAddExtraAlertDialog( - title: 'Vulnerabilities', - hint: 'Please choose a vulnerability', - dataMap: vulnerabilities, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - errorField: "Please choose a vulnerability / None", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - CheckBoxAddExtraAlertDialog( - title: 'Occupation', - hint: 'Select applicable', - dataMap: occupations, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - errorField: "Please choose an occupation / None", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - OptionsWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Yes", true], - ["No", false] - ], - title: "Daily wage worker?", - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - widget.familyMemberIndividualDataModel!.dailyWageWorker = - val; - }, - ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.incomePerDay, - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Day", - style: GoogleFonts.poppins( + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.aadhaarNumber, + keyboardType: TextInputType.number, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Aadhaar Number", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter 12 digit Aadhaar", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter income per day", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Enter 12 digit Aadhaar / 0 if absent"; + } else if (value!.length != 12) { + return "Enter a valid Aadhaar"; + } else + return null; + }, + onSaved: (data) { + widget.familyMemberIndividualDataModel!.aadhaarNumber = + data; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - validator: (value) { - if (value == "") { - return "Enter Income/Day / 0"; - } + ), + CheckBoxAddExtraAlertDialog( + title: 'Vulnerabilities', + hint: 'Please choose a vulnerability', + dataMap: vulnerabilities, + singleOption: false, + context: context, + onSaved: (map) { + print(map); }, + errorField: "Please choose a vulnerability / None", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + CheckBoxAddExtraAlertDialog( + title: 'Occupation', + hint: 'Select applicable', + dataMap: occupations, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + errorField: "Please choose an occupation / None", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Yes", true], + ["No", false] + ], + title: "Daily wage worker?", onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); - widget.familyMemberIndividualDataModel!.incomePerDay = + widget.familyMemberIndividualDataModel!.dailyWageWorker = val; }, ), - ) - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - //TODO: Add work timings Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( - initialValue: widget - .familyMemberIndividualDataModel?.incomePerMonth, + initialValue: + widget.familyMemberIndividualDataModel?.incomePerDay, keyboardType: TextInputType.number, autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( - "Income/Month", + "Income/Day", style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), ), - hintText: "Please enter income per month", + hintText: "Please enter income per day", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(7.0), ), validator: (value) { if (value == "") { - return "Enter Income/Month / 0"; + return "Enter Income/Day / 0"; } }, onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); - widget.familyMemberIndividualDataModel! - .incomePerMonth = val; + widget.familyMemberIndividualDataModel!.incomePerDay = + val; }, ), - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( + ) + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + //TODO: Add work timings + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: widget + .familyMemberIndividualDataModel?.incomePerMonth, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Income/Month", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter income per month", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value == "") { + return "Enter Income/Month / 0"; + } + }, + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel! + .incomePerMonth = val; + }, + ), + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Eligible", "eligible"], + ["Eligible, receiving", "eligible_receiving"], + ["Not eligible", "not_eligible"] + ], + title: 'Old age pension', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel!.pension = val; + }, + ), + ), + OptionsWidget( autoValidateMode: AutovalidateMode.onUserInteraction, options: [ - ["Eligible", "eligible"], - ["Eligible, receiving", "eligible_receiving"], - ["Not eligible", "not_eligible"] + ["Yes", "yes"], + ["No", "no"], ], - title: 'Old age pension', + title: 'Doing/Did business', onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); - widget.familyMemberIndividualDataModel!.pension = val; + widget.familyMemberIndividualDataModel!.businessStatus = + val; }, ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Married", "married"], + ["Unmarried", "unmarried"], + ], + title: 'Marital Status', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel! + .maritalStatus = val; + }, + ), + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Special Skills", + hint: "Enter skills here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .specialSkills = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }, + ), + ), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Frequent ailments", + hint: "Enter ailments here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .frequentAilments = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ), + SizedBox( + height: 20, ), + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Communicable Diseases", + hint: "Enter diseases here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .commutableDisease = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ), + SizedBox( + height: 20, + ), + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Non-communicable diseases", + hint: "Enter diseases here", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .nonCommutableDisease = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + onSaved: (data) { + widget.familyMemberIndividualDataModel!.surgeries = + data; + }, + title: 'Surgeries', + ), + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ OptionsWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Yes", "yes"], ["No", "no"], ], - title: 'Doing/Did business', - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - widget.familyMemberIndividualDataModel!.businessStatus = - val; + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .anganwadiServicesAware = data; }, + title: 'Aware about Anganwadi services?', ), Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, options: [ - ["Married", "married"], - ["Unmarried", "unmarried"], + ["Yes", "yes"], + ["No", "no"], ], - title: 'Marital Status', - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); + onSaved: (data) { widget.familyMemberIndividualDataModel! - .maritalStatus = val; + .anganwadiServicesUsing = data; }, + title: 'Using any Anganwadi services?', ), ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20), - child: TagTextWidget( + TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Special Skills", - hint: "Enter skills here", + label: "Anganwadi services utilised", + hint: "Enter services here", onSaved: (data) { widget.familyMemberIndividualDataModel! - .specialSkills = data; + .anganwadiServicesUsedList = data; }, validator: (value) { if (value == null || value.isEmpty) { return "Enter a value / NA"; } else return null; - }, - ), - ), - ]), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( + }), + TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Frequent ailments", - hint: "Enter ailments here", + label: "PHC services utilised", + hint: "Enter services here", onSaved: (data) { widget.familyMemberIndividualDataModel! - .frequentAilments = data; + .PHCServicesUsedList = data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -429,20 +573,13 @@ class _FamilyMemberAddState extends State { } else return null; }), - ), - SizedBox( - height: 20, - ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( + TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Communicable Diseases", - hint: "Enter diseases here", + label: "Private Clinic services utilised", + hint: "Enter services here", onSaved: (data) { widget.familyMemberIndividualDataModel! - .commutableDisease = data; + .privateClinicServicesUsedList = data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -450,201 +587,94 @@ class _FamilyMemberAddState extends State { } else return null; }), - ), - SizedBox( - height: 20, - ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Non-communicable diseases", - hint: "Enter diseases here", + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: widget.familyMemberIndividualDataModel + ?.privateServiceReason, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Why private?", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter reason", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } + }, onSaved: (data) { widget.familyMemberIndividualDataModel! - .nonCommutableDisease = data; + .privateServiceReason = data; }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( + ), + ), + OptionsWidget( options: [ - ["Yes", "yes"], - ["No", "no"], + ['Yes', 'yes'], + ['No', 'no'] ], + title: "Do you use any tobacco based products?", onSaved: (data) { - widget.familyMemberIndividualDataModel!.surgeries = + widget.familyMemberIndividualDataModel!.useOfTobacco = data; }, - title: 'Surgeries', ), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OptionsWidget( - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .anganwadiServicesAware = data; - }, - title: 'Aware about Anganwadi services?', - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( + OptionsWidget( options: [ - ["Yes", "yes"], - ["No", "no"], + ['Yes', 'yes'], + ['No', 'no'] ], + title: "Do you consume alcohol?", onSaved: (data) { - widget.familyMemberIndividualDataModel! - .anganwadiServicesUsing = data; + widget.familyMemberIndividualDataModel!.useOfAlcohol = + data; }, - title: 'Using any Anganwadi services?', ), - ), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Anganwadi services utilised", - hint: "Enter services here", - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .anganwadiServicesUsedList = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "PHC services utilised", - hint: "Enter services here", - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .PHCServicesUsedList = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Private Clinic services utilised", - hint: "Enter services here", + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have Aarogya Setu installed?", onSaved: (data) { widget.familyMemberIndividualDataModel! - .privateClinicServicesUsedList = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: widget.familyMemberIndividualDataModel - ?.privateServiceReason, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Why private?", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter reason", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter a value / NA"; - } + .aarogyaSetuInstalled = data; }, + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have the Vizhithiru app installed?", onSaved: (data) { widget.familyMemberIndividualDataModel! - .privateServiceReason = data; + .vizhithiruInstalled = data; }, ), - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - title: "Do you use any tobacco based products?", - onSaved: (data) { - widget.familyMemberIndividualDataModel!.useOfTobacco = - data; - }, - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - title: "Do you consume alcohol?", - onSaved: (data) { - widget.familyMemberIndividualDataModel!.useOfAlcohol = - data; - }, - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - title: "Do you have Aarogya Setu installed?", - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .aarogyaSetuInstalled = data; - }, - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - title: "Do you have the Vizhithiru app installed?", - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .vizhithiruInstalled = data; - }, - ), - ], - ) - ], - _onSubmit, - saveData: () async { - var store = await StoreInstance.getInstance(); - Box box = store.box(); - await box.put(widget.familyMemberIndividualDataModel); - }, + ], + ) + ], + _onSubmit, + saveData: () async { + var store = await StoreInstance.getInstance(); + Box box = store.box(); + await box.put(widget.familyMemberIndividualDataModel); + }, + ), ), ), ), From 72fb90e585e58f2f7950d4d38a88ab6a22acd0f5 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 20:53:35 +0530 Subject: [PATCH 110/264] Added Are you sure dialog to CommunityDataCollection.dart --- lib/Screens/CommunityDataCollection.dart | 164 ++++++++++++++--------- 1 file changed, 97 insertions(+), 67 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 66c2087..4f11a61 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -104,7 +104,7 @@ class _CommunityDataCollectionState extends State { onPressed: () { Navigator.of(context, rootNavigator: true).pop('dialog'); }, - child: Text('Ok'), + child: Text('OK'), ) ], ); @@ -113,74 +113,104 @@ class _CommunityDataCollectionState extends State { context: context, builder: (BuildContext context) => alertDialog); } - return Scaffold( - backgroundColor: colors.darkScaffoldColor, - appBar: AppBarBackButton('Community Data'), - body: FormPageView( - [ - DropDownFormField( - defaultValue: modelData.resourceType, - list: widget._publicResourceList, - onSaved: (data) { - print(data); - modelData.resourceType = data; - }, - title: "Choose type of resource to tag", - hint: "Select resource type", - errorField: "Please choose a resource to tag"), - LocationWidgetField( - title: "Record location at top left part of the facility", - defaultValue: modelData.locationTopLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopLeft = data; - }, + return WillPopScope( + onWillPop: () async { + //TODO: Add condition here to check if page has been filled + if (false) { + return true; + } + final result = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text("Are you sure?"), + content: Text("All unsaved changes would be lost"), + actions: [ + TextButton( + child: Text('No'), + onPressed: () { + Navigator.pop(context, false); + }, ), - LocationWidgetField( - title: "Record location at top right part of the facility", - defaultValue: modelData.locationTopRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopRight = data; - }, + TextButton( + child: Text('Yes', style: TextStyle(color: Colors.red)), + onPressed: () { + Navigator.pop(context, true); + }, ), - LocationWidgetField( - title: "Record location at bottom left part of the facility", - defaultValue: modelData.locationBottomLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom right part of the facility", - defaultValue: modelData.locationBottomRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomRight = data; - }, - ), - DropDownFormField( - defaultValue: modelData.villageCode, - list: widget._villageCodeName, - onSaved: (data) { - print(data); - modelData.villageCode = data; - }, - title: "Choose Village Code", - hint: "Select Village Code", - errorField: "Please choose a village code"), - ], - _onSubmit, - submitMessage: - "Submit record to server or Save record locally for later editing", - saveData: _onSave, - note: - "Note: Saving existing records will over-write the record and not create new one", + ], + ), + ); + return result; + }, + child: Scaffold( + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton('Community Data'), + body: FormPageView( + [ + DropDownFormField( + defaultValue: modelData.resourceType, + list: widget._publicResourceList, + onSaved: (data) { + print(data); + modelData.resourceType = data; + }, + title: "Choose type of resource to tag", + hint: "Select resource type", + errorField: "Please choose a resource to tag"), + LocationWidgetField( + title: "Record location at top left part of the facility", + defaultValue: modelData.locationTopLeft, + context: context, + onSaved: (data) { + print(data); + modelData.locationTopLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at top right part of the facility", + defaultValue: modelData.locationTopRight, + context: context, + onSaved: (data) { + print(data); + modelData.locationTopRight = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom left part of the facility", + defaultValue: modelData.locationBottomLeft, + context: context, + onSaved: (data) { + print(data); + modelData.locationBottomLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom right part of the facility", + defaultValue: modelData.locationBottomRight, + context: context, + onSaved: (data) { + print(data); + modelData.locationBottomRight = data; + }, + ), + DropDownFormField( + defaultValue: modelData.villageCode, + list: widget._villageCodeName, + onSaved: (data) { + print(data); + modelData.villageCode = data; + }, + title: "Choose Village Code", + hint: "Select Village Code", + errorField: "Please choose a village code"), + ], + _onSubmit, + submitMessage: + "Submit record to server or Save record locally for later editing", + saveData: _onSave, + note: + "Note: Saving existing records will over-write the record and not create new one", + ), ), ); } From 4e3f2d29599055ea7992835f77267451bdbdc196 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 20:54:58 +0530 Subject: [PATCH 111/264] Added Are you sure dialog to FamilyDetails.dart --- lib/Screens/FamilyDetails.dart | 530 +++++++++++++++++---------------- 1 file changed, 280 insertions(+), 250 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 60552e7..e5ddd11 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -81,276 +81,306 @@ class _FamilyDetailsState extends State { @override Widget build(BuildContext context) { - return Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: colors.darkScaffoldColor, - appBar: AppBarBackButton('Family Details'), - body: SizedBox( - height: MediaQuery.of(context).size.height - - MediaQuery.of(context).viewInsets.bottom * 1.1, - child: SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: FormPageView([ - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have drinking water available?"), - DropDownFormField( - list: [ - 'None', - 'Lake', - 'Pond', - 'Groundwater', - 'Well', - 'Tap', - 'Water supply', - 'Lorry/Van' - ], - hint: "Select source", - title: "Source of Water", - errorField: "Please choose an option", - ), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have toilet facilities?"), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "If not toilet, community toilet?"), - OptionsWidget(options: [ - ['Clean', 'clean'], - ['Unclean', 'unclean'] - ], title: "Environmental sanitation level: "), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Is running water available?"), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No of two wheelers", - errorField: "Please choose a valid number", - ), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No of three wheelers", - errorField: "Please choose a valid number", - ), - CheckBoxAlertDialog( - title: 'Two/Three wheeler manufacturer', - hint: 'Please choose manufacturers', - dataMap: two_three_mfg, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - errorField: "Please choose a manufacturer", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No of four wheelers", - errorField: "Please choose a valid number", - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - CheckBoxAlertDialog( - title: 'Four wheeler manufacturer', - hint: 'Please choose manufacturers', - dataMap: four_mfg, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - errorField: "Please choose a manufacturer", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you own cattle?"), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20.0), - child: TextFormField( - decoration: InputDecoration( - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - hintText: "Enter income in Rupees", - label: Text( - 'Income from cattle', - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - )), - autovalidateMode: AutovalidateMode.always, - keyboardType: TextInputType.number, + return WillPopScope( + onWillPop: () async { + //TODO: Add condition here to check if page has been filled + if (false) { + return true; + } + final result = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text("Are you sure?"), + content: Text("All unsaved changes would be lost"), + actions: [ + TextButton( + child: Text('No'), + onPressed: () { + Navigator.pop(context, false); + }, + ), + TextButton( + child: Text('Yes', style: TextStyle(color: Colors.red)), + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ), + ); + return result; + }, + child: Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton('Family Details'), + body: SizedBox( + height: MediaQuery.of(context).size.height - + MediaQuery.of(context).viewInsets.bottom * 1.1, + child: SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: FormPageView([ + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Do you have drinking water available?"), + DropDownFormField( + list: [ + 'None', + 'Lake', + 'Pond', + 'Groundwater', + 'Well', + 'Tap', + 'Water supply', + 'Lorry/Van' + ], + hint: "Select source", + title: "Source of Water", + errorField: "Please choose an option", ), - ), - OptionsWidget( - options: [ + OptionsWidget(options: [ ['Yes', 'yes'], ['No', 'no'] - ], - title: "Do you own farmland?", - ), - OptionsWidget( - options: [ + ], title: "Do you have toilet facilities?"), + OptionsWidget(options: [ ['Yes', 'yes'], ['No', 'no'] - ], - title: "Do you preserve seeds?", - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - //TODO: Display if answer to previous question is yes - CheckBoxAddExtraAlertDialog( - title: 'Seeds Preserved', - hint: 'Choose preserved seeds', - dataMap: seeds_preserved, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - ), - CheckBoxAddExtraAlertDialog( - title: 'Trees owned', - hint: 'Choose trees owned', - dataMap: trees_owned, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - ), - CheckBoxAddExtraAlertDialog( - title: 'Choose resource', - hint: 'Choose your resource', - dataMap: local_food, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - ), - - //TODO: Add autosuggest text widget for locally consumed food - //TODO: Add autosuggest text widget for trees owned - OptionsWidget( - options: [ + ], title: "If not toilet, community toilet?"), + OptionsWidget(options: [ + ['Clean', 'clean'], + ['Unclean', 'unclean'] + ], title: "Environmental sanitation level: "), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OptionsWidget(options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], title: "Is running water available?"), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of two wheelers", + errorField: "Please choose a valid number", + ), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of three wheelers", + errorField: "Please choose a valid number", + ), + CheckBoxAlertDialog( + title: 'Two/Three wheeler manufacturer', + hint: 'Please choose manufacturers', + dataMap: two_three_mfg, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + errorField: "Please choose a manufacturer", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of four wheelers", + errorField: "Please choose a valid number", + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + CheckBoxAlertDialog( + title: 'Four wheeler manufacturer', + hint: 'Please choose manufacturers', + dataMap: four_mfg, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + errorField: "Please choose a manufacturer", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + OptionsWidget(options: [ ['Yes', 'yes'], ['No', 'no'] - ], - title: "Do you have a kitchen garden?", - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - CheckBoxAddExtraAlertDialog( - title: 'Kitchen Garden plants', - hint: 'Choose garden plants', - dataMap: garden_plants, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - }, - ), - //TODO: Add autosuggest text widget for kitchen garden crops - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Align( - alignment: Alignment.topLeft, - child: Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 15.0), - child: Text( - "Address", - style: GoogleFonts.montserrat( - fontSize: 15.0, - color: colors.darkPrimaryTextColor), + ], title: "Do you own cattle?"), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20.0), + child: TextFormField( + decoration: InputDecoration( + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + hintText: "Enter income in Rupees", + label: Text( + 'Income from cattle', + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + )), + autovalidateMode: AutovalidateMode.always, + keyboardType: TextInputType.number, + ), + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you own farmland?", + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you preserve seeds?", + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + //TODO: Display if answer to previous question is yes + CheckBoxAddExtraAlertDialog( + title: 'Seeds Preserved', + hint: 'Choose preserved seeds', + dataMap: seeds_preserved, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + ), + CheckBoxAddExtraAlertDialog( + title: 'Trees owned', + hint: 'Choose trees owned', + dataMap: trees_owned, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + ), + CheckBoxAddExtraAlertDialog( + title: 'Choose resource', + hint: 'Choose your resource', + dataMap: local_food, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + ), + + //TODO: Add autosuggest text widget for locally consumed food + //TODO: Add autosuggest text widget for trees owned + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have a kitchen garden?", + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + CheckBoxAddExtraAlertDialog( + title: 'Kitchen Garden plants', + hint: 'Choose garden plants', + dataMap: garden_plants, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + }, + ), + //TODO: Add autosuggest text widget for kitchen garden crops + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Align( + alignment: Alignment.topLeft, + child: Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 15.0), + child: Text( + "Address", + style: GoogleFonts.montserrat( + fontSize: 15.0, + color: colors.darkPrimaryTextColor), + ), ), ), - ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - decoration: InputDecoration( - label: Text( - "First Line", - style: GoogleFonts.poppins( + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + decoration: InputDecoration( + label: Text( + "First Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter first line", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter first line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Enter First Line"; + } + }, ), - validator: (value) { - if (value == "") { - return "Enter First Line"; - } - }, ), - ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - decoration: InputDecoration( - label: Text( - "Second Line", - style: GoogleFonts.poppins( + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + decoration: InputDecoration( + label: Text( + "Second Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter second line", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter second line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), ), - ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - decoration: InputDecoration( - label: Text( - "City", - style: GoogleFonts.poppins( + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + decoration: InputDecoration( + label: Text( + "City", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter city", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter city", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), ), - ), - ], - ), - ], - ) - ], _onSubmit)))); + ], + ), + ], + ) + ], _onSubmit)))), + ); } } From 15a070783e9bde329c637da74b8c383a582b4976 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 4 Jan 2022 20:55:57 +0530 Subject: [PATCH 112/264] Added Are you sure dialog to CollectLocationWidget.dart --- lib/Screens/CollectLocationWidget.dart | 122 +++++++++++++++---------- 1 file changed, 76 insertions(+), 46 deletions(-) diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index 34d3cc4..e269496 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -32,51 +32,81 @@ class _CollectLocationWidgetState extends State { } } - return Scaffold( - backgroundColor: colors.darkScaffoldColor, - appBar: AppBarBackButton('Get Location'), - body: FormPageView( - [ - LocationWidgetField( - title: "Record location at top left part of the facility", - context: context, - defaultValue: widget.modelData.locationTopLeft, - onSaved: (data) { - print(data); - widget.modelData.locationTopLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at top right part of the facility", - context: context, - defaultValue: widget.modelData.locationTopRight, - onSaved: (data) { - print(data); - widget.modelData.locationTopRight = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom left part of the facility", - context: context, - defaultValue: widget.modelData.locationBottomLeft, - onSaved: (data) { - print(data); - widget.modelData.locationBottomLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom right part of the facility", - context: context, - defaultValue: widget.modelData.locationBottomRight, - onSaved: (data) { - print(data); - widget.modelData.locationBottomRight = data; - }, - ), - ], - _onSubmit, - submitMessage: - "Submit to Continue or go back to re-record location data", - )); + return WillPopScope( + onWillPop: () async { + //TODO: Add condition here to check if page has been filled + if (false) { + return true; + } + final result = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text("Are you sure?"), + content: Text("All unsaved changes would be lost"), + actions: [ + TextButton( + child: Text('No'), + onPressed: () { + Navigator.pop(context, false); + }, + ), + TextButton( + child: Text('Yes', style: TextStyle(color: Colors.red)), + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ), + ); + return result; + }, + child: Scaffold( + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton('Get Location'), + body: FormPageView( + [ + LocationWidgetField( + title: "Record location at top left part of the facility", + context: context, + defaultValue: widget.modelData.locationTopLeft, + onSaved: (data) { + print(data); + widget.modelData.locationTopLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at top right part of the facility", + context: context, + defaultValue: widget.modelData.locationTopRight, + onSaved: (data) { + print(data); + widget.modelData.locationTopRight = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom left part of the facility", + context: context, + defaultValue: widget.modelData.locationBottomLeft, + onSaved: (data) { + print(data); + widget.modelData.locationBottomLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom right part of the facility", + context: context, + defaultValue: widget.modelData.locationBottomRight, + onSaved: (data) { + print(data); + widget.modelData.locationBottomRight = data; + }, + ), + ], + _onSubmit, + submitMessage: + "Submit to Continue or go back to re-record location data", + )), + ); } } From a07d5ce7c97f9206ddd1e5be438dad302f7c4e9d Mon Sep 17 00:00:00 2001 From: Soorya S Date: Tue, 4 Jan 2022 22:04:08 +0530 Subject: [PATCH 113/264] Resolved merge conflict --- lib/Model/FamilyMembersCommonDataModel.dart | 55 +- lib/Screens/FamilyHomeScreen.dart | 4 +- lib/Screens/FamilyMemberAdd.dart | 125 ++- lib/Utils/StoreInstance.dart | 1 - lib/Widgets/CheckBoxAddExtraDialog.dart | 10 +- lib/Widgets/DropDownFormField.dart | 2 +- lib/Widgets/OptionsFormWidget.dart | 23 +- lib/Widgets/TagTextWidget.dart | 3 +- lib/objectbox-model.json | 318 ++++--- lib/objectbox.g.dart | 982 ++++++++++++-------- 10 files changed, 980 insertions(+), 543 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 8364533..daa2cd8 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -7,13 +7,14 @@ import 'package:intl/intl.dart'; class FamilyMemberIndividualDataModel { int id = 0; String? userName; - String? dateOfBirth; + @Property(type: PropertyType.date) + DateTime? dateOfBirth; String? gender; String? phoneNumber; String? educationQualification; String? aadhaarNumber; - List? vulnerabilities; - List? occupation; + Map? vulnerabilities; + Map? occupation; String? dailyWageWorker; String? incomePerDay; String? incomePerMonth; @@ -39,6 +40,30 @@ class FamilyMemberIndividualDataModel { String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); FamilyMemberIndividualDataModel({this.userName}); + + String? get dbVulnerabilities => + vulnerabilities == null ? null : json.encode(vulnerabilities); + + set dbVulnerabilities(String? value) { + if (value == null) { + vulnerabilities = null; + } else { + vulnerabilities = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbOccupation => + occupation == null ? null : json.encode(vulnerabilities); + + set dbOccupation(String? value) { + if (value == null) { + occupation = null; + } else { + occupation = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } } @Entity() @@ -48,6 +73,30 @@ class FamilyMembersCommonDataModel { Position? locationTopRight; Position? locationBottomLeft; Position? locationBottomRight; + String? drinkingWater; + String? sourceOfDrinkingWater; + String? toiletFacility; + String? communityToilet; + String? environmentSanitationLevel; + String? runningWaterAvailable; + String? noOfTwoWheelers; + String? noOfThreeWheelers; + String? noOfFourWheelers; + Map? twoThreeWheelManufacturer; + Map? twoFourManufacturer; + String? isCattleOwned; + String? incomeFromCattle; + String? isFarmLandOwned; + String? isSeedsPreserved; + Map? preservedSeedsMap; + Map? treesOwnedMap; + String? isKitchenGardenOwned; + Map? kitchenGardenPlants; + String? addressOne; + String? addressTwo; + String? addressThree; + + final individualDataList = ToMany(); String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index d0828de..18d7c0f 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -29,8 +29,8 @@ class _FamilyHomeScreenState extends State super.build(context); if (modelData == null) - modelData = - widget.modelData ?? new FamilyMembersCommonDataModel(); + modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); + return Scaffold( appBar: AppBarBackButton('Individual Data'), diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index d902598..553ffb9 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -16,9 +16,15 @@ import 'package:google_fonts/google_fonts.dart'; import '../objectbox.g.dart'; class FamilyMemberAdd extends StatefulWidget { - const FamilyMemberAdd({Key? key, this.familyMemberIndividualDataModel}) + const FamilyMemberAdd( + {Key? key, + this.familyMemberIndividualDataModel, + this.dataModel, + this.index}) : super(key: key); final FamilyMemberIndividualDataModel? familyMemberIndividualDataModel; + final FamilyMembersCommonDataModel? dataModel; + final int? index; @override _FamilyMemberAddState createState() => _FamilyMemberAddState(); @@ -61,6 +67,8 @@ class _FamilyMemberAddState extends State { @override Widget build(BuildContext context) { + print( + "${widget.familyMemberIndividualDataModel!.vulnerabilities} vulnerabilities"); return WillPopScope( onWillPop: () async { //TODO: Add condition here to check if page has been filled @@ -69,7 +77,7 @@ class _FamilyMemberAddState extends State { } final result = await showDialog( context: context, - builder: (context) => AlertDialog( + builder: (context) => AlertDialog( title: Text("Are you sure?"), content: Text("All unsaved changes would be lost"), actions: [ @@ -96,7 +104,7 @@ class _FamilyMemberAddState extends State { appBar: AppBarBackButton('Add Family Member'), body: SizedBox( height: MediaQuery.of(context).size.height - - MediaQuery.of(context).viewInsets.bottom * 1.45, + MediaQuery.of(context).viewInsets.bottom * 1.1, child: SingleChildScrollView( physics: ClampingScrollPhysics(), child: FormPageView( @@ -111,7 +119,8 @@ class _FamilyMemberAddState extends State { initialValue: widget.familyMemberIndividualDataModel?.userName, onSaved: (String? data) async { - widget.familyMemberIndividualDataModel!.userName = data; + widget.familyMemberIndividualDataModel!.userName = + data; }, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( @@ -136,15 +145,16 @@ class _FamilyMemberAddState extends State { ), ), DatePickerWidget( - //TODO: Add initial value + defaultDate: + widget.familyMemberIndividualDataModel?.dateOfBirth, context: context, title: "Date of Birth", hint: "Choose a date", autoValidateMode: AutovalidateMode.onUserInteraction, onSaved: (data) { - // widget.familyMemberIndividualDataModel!.dateOfBirth = - // "${data!.day}/${data.month}/${data.year}"; - // print(data); + widget.familyMemberIndividualDataModel!.dateOfBirth = + data; + print(data); }, ), GenderPickerWithImage( @@ -155,7 +165,8 @@ class _FamilyMemberAddState extends State { colors: [Color(0xfff54b64), Color(0xfff78361)]), femaleImage: AssetImage("assets/avatar_woman.png"), selectedGenderTextStyle: TextStyle( - color: Colors.greenAccent, fontWeight: FontWeight.bold), + color: Colors.greenAccent, + fontWeight: FontWeight.bold), unSelectedGenderTextStyle: TextStyle( color: colors.darkPrimaryTextColor, fontWeight: FontWeight.normal), @@ -232,8 +243,8 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.aadhaarNumber, + initialValue: widget + .familyMemberIndividualDataModel?.aadhaarNumber, keyboardType: TextInputType.number, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( @@ -256,8 +267,8 @@ class _FamilyMemberAddState extends State { return null; }, onSaved: (data) { - widget.familyMemberIndividualDataModel!.aadhaarNumber = - data; + widget.familyMemberIndividualDataModel! + .aadhaarNumber = data; }, autovalidateMode: AutovalidateMode.onUserInteraction, ), @@ -265,11 +276,14 @@ class _FamilyMemberAddState extends State { CheckBoxAddExtraAlertDialog( title: 'Vulnerabilities', hint: 'Please choose a vulnerability', - dataMap: vulnerabilities, + dataMap: widget.familyMemberIndividualDataModel! + .vulnerabilities ?? + vulnerabilities, singleOption: false, context: context, onSaved: (map) { - print(map); + widget.familyMemberIndividualDataModel! + .vulnerabilities = map; }, errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, @@ -277,34 +291,40 @@ class _FamilyMemberAddState extends State { CheckBoxAddExtraAlertDialog( title: 'Occupation', hint: 'Select applicable', - dataMap: occupations, + dataMap: + widget.familyMemberIndividualDataModel!.occupation ?? + occupations, singleOption: false, context: context, onSaved: (map) { print(map); + widget.familyMemberIndividualDataModel!.occupation = + map; }, errorField: "Please choose an occupation / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), OptionsWidget( + defaultValue: widget + .familyMemberIndividualDataModel!.dailyWageWorker, autoValidateMode: AutovalidateMode.onUserInteraction, options: [ - ["Yes", true], - ["No", false] + ["Yes", "true"], + ["No", "false"] ], title: "Daily wage worker?", onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - widget.familyMemberIndividualDataModel!.dailyWageWorker = - val; + print("Value recorded: $val"); + widget.familyMemberIndividualDataModel! + .dailyWageWorker = val; }, ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.incomePerDay, + initialValue: widget + .familyMemberIndividualDataModel?.incomePerDay, keyboardType: TextInputType.number, autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, @@ -336,10 +356,12 @@ class _FamilyMemberAddState extends State { ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, children: [ //TODO: Add work timings Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 10.0), child: TextFormField( initialValue: widget .familyMemberIndividualDataModel?.incomePerMonth, @@ -373,6 +395,8 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( + defaultValue: + widget.familyMemberIndividualDataModel!.pension, autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Eligible", "eligible"], @@ -383,11 +407,14 @@ class _FamilyMemberAddState extends State { onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); - widget.familyMemberIndividualDataModel!.pension = val; + widget.familyMemberIndividualDataModel!.pension = + val; }, ), ), OptionsWidget( + defaultValue: widget + .familyMemberIndividualDataModel!.businessStatus, autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Yes", "yes"], @@ -397,13 +424,15 @@ class _FamilyMemberAddState extends State { onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); - widget.familyMemberIndividualDataModel!.businessStatus = - val; + widget.familyMemberIndividualDataModel! + .businessStatus = val; }, ), Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( + defaultValue: widget + .familyMemberIndividualDataModel!.maritalStatus, autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Married", "married"], @@ -425,6 +454,8 @@ class _FamilyMemberAddState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, label: "Special Skills", hint: "Enter skills here", + initialValue: widget + .familyMemberIndividualDataModel!.specialSkills, onSaved: (data) { widget.familyMemberIndividualDataModel! .specialSkills = data; @@ -442,12 +473,14 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 30), child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, label: "Frequent ailments", hint: "Enter ailments here", + initialValue: widget.familyMemberIndividualDataModel! + .frequentAilments, onSaved: (data) { widget.familyMemberIndividualDataModel! .frequentAilments = data; @@ -463,12 +496,14 @@ class _FamilyMemberAddState extends State { height: 20, ), Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 30), child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, label: "Communicable Diseases", hint: "Enter diseases here", + initialValue: widget.familyMemberIndividualDataModel! + .commutableDisease, onSaved: (data) { widget.familyMemberIndividualDataModel! .commutableDisease = data; @@ -484,12 +519,14 @@ class _FamilyMemberAddState extends State { height: 20, ), Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 30), child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, label: "Non-communicable diseases", hint: "Enter diseases here", + initialValue: widget.familyMemberIndividualDataModel! + .nonCommutableDisease, onSaved: (data) { widget.familyMemberIndividualDataModel! .nonCommutableDisease = data; @@ -504,6 +541,8 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( + defaultValue: + widget.familyMemberIndividualDataModel!.surgeries, options: [ ["Yes", "yes"], ["No", "no"], @@ -521,6 +560,8 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ OptionsWidget( + defaultValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesAware, options: [ ["Yes", "yes"], ["No", "no"], @@ -534,6 +575,8 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( + defaultValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesUsing, options: [ ["Yes", "yes"], ["No", "no"], @@ -549,6 +592,8 @@ class _FamilyMemberAddState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, label: "Anganwadi services utilised", hint: "Enter services here", + initialValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesUsedList, onSaved: (data) { widget.familyMemberIndividualDataModel! .anganwadiServicesUsedList = data; @@ -563,6 +608,8 @@ class _FamilyMemberAddState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, label: "PHC services utilised", hint: "Enter services here", + initialValue: widget.familyMemberIndividualDataModel! + .PHCServicesUsedList, onSaved: (data) { widget.familyMemberIndividualDataModel! .PHCServicesUsedList = data; @@ -577,6 +624,8 @@ class _FamilyMemberAddState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, label: "Private Clinic services utilised", hint: "Enter services here", + initialValue: widget.familyMemberIndividualDataModel! + .privateClinicServicesUsedList, onSaved: (data) { widget.familyMemberIndividualDataModel! .privateClinicServicesUsedList = data; @@ -622,6 +671,8 @@ class _FamilyMemberAddState extends State { ), ), OptionsWidget( + defaultValue: + widget.familyMemberIndividualDataModel!.useOfTobacco, options: [ ['Yes', 'yes'], ['No', 'no'] @@ -633,6 +684,8 @@ class _FamilyMemberAddState extends State { }, ), OptionsWidget( + defaultValue: + widget.familyMemberIndividualDataModel!.useOfAlcohol, options: [ ['Yes', 'yes'], ['No', 'no'] @@ -644,6 +697,8 @@ class _FamilyMemberAddState extends State { }, ), OptionsWidget( + defaultValue: widget.familyMemberIndividualDataModel! + .aarogyaSetuInstalled, options: [ ['Yes', 'yes'], ['No', 'no'] @@ -655,6 +710,8 @@ class _FamilyMemberAddState extends State { }, ), OptionsWidget( + defaultValue: widget + .familyMemberIndividualDataModel!.vizhithiruInstalled, options: [ ['Yes', 'yes'], ['No', 'no'] @@ -673,6 +730,8 @@ class _FamilyMemberAddState extends State { var store = await StoreInstance.getInstance(); Box box = store.box(); await box.put(widget.familyMemberIndividualDataModel); + widget.dataModel!.individualDataList[widget.index!] = + widget.familyMemberIndividualDataModel!; }, ), ), diff --git a/lib/Utils/StoreInstance.dart b/lib/Utils/StoreInstance.dart index ab7f40d..10cde41 100644 --- a/lib/Utils/StoreInstance.dart +++ b/lib/Utils/StoreInstance.dart @@ -13,7 +13,6 @@ class StoreInstance { store.close(); store = await openStore(); } - print("NULL"); } return store; } diff --git a/lib/Widgets/CheckBoxAddExtraDialog.dart b/lib/Widgets/CheckBoxAddExtraDialog.dart index ad5da57..a68fd87 100644 --- a/lib/Widgets/CheckBoxAddExtraDialog.dart +++ b/lib/Widgets/CheckBoxAddExtraDialog.dart @@ -23,13 +23,13 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; ), */ -class CheckBoxAddExtraAlertDialog extends FormField { +class CheckBoxAddExtraAlertDialog extends FormField> { CheckBoxAddExtraAlertDialog( - {FormFieldSetter? onSaved, - FormFieldValidator? validator, + {FormFieldSetter>? onSaved, + FormFieldValidator>? validator, required title, required hint, - required Map dataMap, + required Map dataMap, errorField, singleOption = false, showAddNewBox = true, @@ -51,7 +51,7 @@ class CheckBoxAddExtraAlertDialog extends FormField { }, initialValue: dataMap, autovalidateMode: autoValidateMode, - builder: (FormFieldState state) { + builder: (FormFieldState> state) { getDisplayOptions() { if (state.hasError) { return Text( diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index ba5318c..3fe8880 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -12,7 +12,7 @@ class DropDownFormField extends FormField { required hint, String? defaultValue, errorField, - AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) : super( onSaved: onSaved, validator: validator ?? diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 3d2fee0..e4ebc70 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -4,7 +4,6 @@ import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; - /** * Implementation: *OptionsWidget(options: [["Yes", "yes"], ["No", "no"]], setDefaultValue: false, onSaved: (data){print(data);}), @@ -15,8 +14,8 @@ class OptionsWidget extends FormField { {FormFieldSetter? onSaved, FormFieldValidator? validator, required List options, - required String title, - bool setDefaultValue = false, + required String title, + String? defaultValue, AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) : super( onSaved: onSaved, @@ -25,7 +24,7 @@ class OptionsWidget extends FormField { if (data == null) return "Please choose an option"; return null; }, - initialValue: setDefaultValue ? options[0][1] : null, + initialValue: defaultValue, autovalidateMode: autoValidateMode, builder: (FormFieldState state) { return Padding( @@ -34,7 +33,11 @@ class OptionsWidget extends FormField { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(title,style: GoogleFonts.poppins(fontSize: 15.0,color: colors.darkPrimaryTextColor),), + Text( + title, + style: GoogleFonts.poppins( + fontSize: 15.0, color: colors.darkPrimaryTextColor), + ), Wrap( alignment: WrapAlignment.center, children: options @@ -50,7 +53,8 @@ class OptionsWidget extends FormField { child: state.hasError ? Text( state.errorText ?? "error", - style: GoogleFonts.poppins(color: colors.errorColor, fontSize: 10), + style: GoogleFonts.poppins( + color: colors.errorColor, fontSize: 10), ) : Container(), ) @@ -96,7 +100,10 @@ class OptionButton extends StatelessWidget { onPressed: () { state.didChange(optionKey); }, - child: Text(text,style: GoogleFonts.poppins(color: Colors.white),)), + child: Text( + text, + style: GoogleFonts.poppins(color: Colors.white), + )), ); } -} \ No newline at end of file +} diff --git a/lib/Widgets/TagTextWidget.dart b/lib/Widgets/TagTextWidget.dart index 5f65a3c..1f33e25 100644 --- a/lib/Widgets/TagTextWidget.dart +++ b/lib/Widgets/TagTextWidget.dart @@ -15,6 +15,7 @@ class TagTextWidget extends FormField> { errorField, autofillHints, search = const [], + initialValue, AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) : super( onSaved: onSaved, @@ -24,7 +25,7 @@ class TagTextWidget extends FormField> { return errorField ?? "Please enter a value"; return null; }, - initialValue: [], + initialValue: initialValue ?? [], autovalidateMode: autoValidateMode, builder: (FormFieldState> state) { final TextEditingController _contentEditingController = diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 5fcf7e5..508c7ac 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -4,292 +4,362 @@ "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", "entities": [ { - "id": "1:8881235461456447261", - "lastPropertyId": "8:2203659096246358776", + "id": "1:3950518272510391200", + "lastPropertyId": "8:3170409840351111096", "name": "CommunityDataModel", "properties": [ { - "id": "1:8191075196018249341", + "id": "1:8140527551961172548", "name": "id", "type": 6, "flags": 1 }, { - "id": "2:8796057529052012615", + "id": "2:3159495043814331513", "name": "resourceType", "type": 9 }, { - "id": "3:3649664257574360958", + "id": "3:4690970104335964894", "name": "villageCode", "type": 9 }, { - "id": "4:6797539933900877027", - "name": "dbLocationTopLeft", - "type": 9 - }, - { - "id": "5:8489064245075560644", - "name": "dbLocationTopRight", - "type": 9 - }, - { - "id": "6:4981340637280440404", - "name": "dbLocationBottomLeft", - "type": 9 - }, - { - "id": "7:8742277346966043541", - "name": "dbLocationBottomRight", - "type": 9 - }, - { - "id": "8:2203659096246358776", - "name": "savedTime", - "type": 9 - } - ], - "relations": [] - }, - { - "id": "2:1860532570098563020", - "lastPropertyId": "10:2008589073662093950", - "name": "FamilyMembersCommonDataModel", - "properties": [ - { - "id": "1:3824533233190172585", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "4:681931444274282409", + "id": "4:5259334423703613736", "name": "savedTime", "type": 9 }, { - "id": "5:6877689796308970604", + "id": "5:5523993525315213267", "name": "dbLocationTopLeft", "type": 9 }, { - "id": "6:6532623860122744430", + "id": "6:9064650214124194157", "name": "dbLocationTopRight", "type": 9 }, { - "id": "7:5378615026726072333", + "id": "7:2961799903689622576", "name": "dbLocationBottomLeft", "type": 9 }, { - "id": "8:4682325687318046173", + "id": "8:3170409840351111096", "name": "dbLocationBottomRight", "type": 9 } ], - "relations": [ - { - "id": "3:371184347085100722", - "name": "individualDataList", - "targetId": "4:8671447701453785879" - } - ] + "relations": [] }, { - "id": "4:8671447701453785879", - "lastPropertyId": "31:1397399115057201044", + "id": "2:6685214565457365230", + "lastPropertyId": "32:5375503589039401181", "name": "FamilyMemberIndividualDataModel", "properties": [ { - "id": "1:5357433056362681420", + "id": "1:8723352508613304168", "name": "id", "type": 6, "flags": 1 }, { - "id": "2:8011747133305154139", + "id": "2:7604499542143584605", "name": "userName", "type": 9 }, { - "id": "3:4526862708267238768", - "name": "savedTime", - "type": 9 - }, - { - "id": "4:3085664632559939021", + "id": "3:6647327136270420131", "name": "dateOfBirth", - "type": 9 + "type": 10 }, { - "id": "5:4089981874949227093", + "id": "4:7394015767332678427", "name": "gender", "type": 9 }, { - "id": "6:8147924758541863603", + "id": "5:3884159339096887518", "name": "phoneNumber", "type": 9 }, { - "id": "7:8362247275532978895", + "id": "6:3761785743139786223", "name": "educationQualification", "type": 9 }, { - "id": "8:5679091799904005563", + "id": "7:2912550153076040514", "name": "aadhaarNumber", "type": 9 }, { - "id": "9:93176754199097596", - "name": "vulnerabilities", - "type": 30 - }, - { - "id": "10:6683743346766211386", - "name": "occupation", - "type": 30 - }, - { - "id": "11:7674773686375268308", + "id": "8:6501390621116148247", "name": "dailyWageWorker", "type": 9 }, { - "id": "12:3825178531183591336", + "id": "9:8692285643353019146", "name": "incomePerDay", "type": 9 }, { - "id": "13:6800080566226023846", + "id": "10:2510858921793217570", "name": "incomePerMonth", "type": 9 }, { - "id": "14:6682636002341351132", + "id": "11:3831022645838678395", "name": "pension", "type": 9 }, { - "id": "15:5889517609383333513", + "id": "12:1404325505572824726", "name": "businessStatus", "type": 9 }, { - "id": "16:1551885345947737655", + "id": "13:7080052757140045670", "name": "maritalStatus", "type": 9 }, { - "id": "17:7362378614402948609", + "id": "14:4439637978014416112", "name": "specialSkills", "type": 30 }, { - "id": "18:8079660499990560077", + "id": "15:4636181569648235734", "name": "frequentAilments", "type": 30 }, { - "id": "19:4413374908120023856", + "id": "16:4851875690128697657", "name": "commutableDisease", "type": 30 }, { - "id": "20:4250702923463112078", + "id": "17:7484660082837778600", "name": "nonCommutableDisease", "type": 30 }, { - "id": "21:1237433258990716055", + "id": "18:5729780143757895259", "name": "surgeries", "type": 9 }, { - "id": "22:6965476731638035450", + "id": "19:2532110693984905492", "name": "anganwadiServicesAware", "type": 9 }, { - "id": "23:4550221857104463869", + "id": "20:7268786638343194491", "name": "anganwadiServicesUsing", "type": 9 }, { - "id": "24:9085531839818427243", + "id": "21:6352333255560290159", "name": "anganwadiServicesUsedList", "type": 30 }, { - "id": "25:6866114763519136439", + "id": "22:3293166845575984244", "name": "PHCServicesUsedList", "type": 30 }, { - "id": "26:4835734038831150727", + "id": "23:2397114879954340884", "name": "privateClinicServicesUsedList", "type": 30 }, { - "id": "27:4667157897046339139", + "id": "24:3237947682147741066", "name": "privateServiceReason", "type": 9 }, { - "id": "28:3779166862225991045", + "id": "25:2630658762586974548", "name": "useOfTobacco", "type": 9 }, { - "id": "29:3268788816803461695", + "id": "26:1662798223273329088", "name": "useOfAlcohol", "type": 9 }, { - "id": "30:4255114771534059896", + "id": "27:3258249527595452242", "name": "aarogyaSetuInstalled", "type": 9 }, { - "id": "31:1397399115057201044", + "id": "28:8168820643425503335", "name": "vizhithiruInstalled", "type": 9 + }, + { + "id": "30:3074524065493072391", + "name": "savedTime", + "type": 9 + }, + { + "id": "31:7256338567008476068", + "name": "dbVulnerabilities", + "type": 9 + }, + { + "id": "32:5375503589039401181", + "name": "dbOccupation", + "type": 9 } ], "relations": [] + }, + { + "id": "3:5004688671325240296", + "lastPropertyId": "23:6516827898200627863", + "name": "FamilyMembersCommonDataModel", + "properties": [ + { + "id": "1:406597506935878482", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5933268951084276983", + "name": "drinkingWater", + "type": 9 + }, + { + "id": "3:7714255537633512426", + "name": "sourceOfDrinkingWater", + "type": 9 + }, + { + "id": "4:2415808930190145187", + "name": "toiletFacility", + "type": 9 + }, + { + "id": "5:4950161314722702905", + "name": "communityToilet", + "type": 9 + }, + { + "id": "6:8384486349887445986", + "name": "environmentSanitationLevel", + "type": 9 + }, + { + "id": "7:2392963229872898504", + "name": "runningWaterAvailable", + "type": 9 + }, + { + "id": "8:3952912803449147993", + "name": "noOfTwoWheelers", + "type": 9 + }, + { + "id": "9:1669417226997886200", + "name": "noOfThreeWheelers", + "type": 9 + }, + { + "id": "10:5011624990870736391", + "name": "noOfFourWheelers", + "type": 9 + }, + { + "id": "11:8805489678700516176", + "name": "isCattleOwned", + "type": 9 + }, + { + "id": "12:8435942014491427702", + "name": "incomeFromCattle", + "type": 9 + }, + { + "id": "13:1694052736194978877", + "name": "isFarmLandOwned", + "type": 9 + }, + { + "id": "14:5615515454180248444", + "name": "isSeedsPreserved", + "type": 9 + }, + { + "id": "15:7655049526662030931", + "name": "isKitchenGardenOwned", + "type": 9 + }, + { + "id": "16:6193242875372395353", + "name": "addressOne", + "type": 9 + }, + { + "id": "17:1686900574402451883", + "name": "addressTwo", + "type": 9 + }, + { + "id": "18:5524724872707357697", + "name": "addressThree", + "type": 9 + }, + { + "id": "19:1423273990910471875", + "name": "savedTime", + "type": 9 + }, + { + "id": "20:5507268764564482947", + "name": "dbLocationTopLeft", + "type": 9 + }, + { + "id": "21:4582363172019587389", + "name": "dbLocationTopRight", + "type": 9 + }, + { + "id": "22:69678934293790881", + "name": "dbLocationBottomLeft", + "type": 9 + }, + { + "id": "23:6516827898200627863", + "name": "dbLocationBottomRight", + "type": 9 + } + ], + "relations": [ + { + "id": "1:1791331254757937694", + "name": "individualDataList", + "targetId": "2:6685214565457365230" + } + ] } ], - "lastEntityId": "4:8671447701453785879", - "lastIndexId": "2:3780641643474411567", - "lastRelationId": "3:371184347085100722", + "lastEntityId": "3:5004688671325240296", + "lastIndexId": "1:7346081088137941172", + "lastRelationId": "1:1791331254757937694", "lastSequenceId": "0:0", "modelVersion": 5, "modelVersionParserMinimum": 5, - "retiredEntityUids": [ - 2384522976899313648 - ], + "retiredEntityUids": [], "retiredIndexUids": [ - 8834613087270691234, - 3780641643474411567 + 7346081088137941172 ], "retiredPropertyUids": [ - 1796312536826265865, - 4138361640658468836, - 4718953437214788922, - 8052215135369744546, - 2435262721668243080, - 5992078344277508825, - 2398616950182668401, - 635977564128467162, - 7198889010838595583, - 2008589073662093950 - ], - "retiredRelationUids": [ - 7533083279143375120, - 991746608797753194 + 1969777098633351831 ], + "retiredRelationUids": [], "version": 1 } \ No newline at end of file diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 4dc15e4..e24474d 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -16,261 +16,346 @@ export 'package:objectbox/objectbox.dart'; // so that callers only have to impor final _entities = [ ModelEntity( - id: const IdUid(1, 8881235461456447261), + id: const IdUid(1, 3950518272510391200), name: 'CommunityDataModel', - lastPropertyId: const IdUid(8, 2203659096246358776), + lastPropertyId: const IdUid(8, 3170409840351111096), flags: 0, properties: [ ModelProperty( - id: const IdUid(1, 8191075196018249341), + id: const IdUid(1, 8140527551961172548), name: 'id', type: 6, flags: 1), ModelProperty( - id: const IdUid(2, 8796057529052012615), + id: const IdUid(2, 3159495043814331513), name: 'resourceType', type: 9, flags: 0), ModelProperty( - id: const IdUid(3, 3649664257574360958), + id: const IdUid(3, 4690970104335964894), name: 'villageCode', type: 9, flags: 0), ModelProperty( - id: const IdUid(4, 6797539933900877027), - name: 'dbLocationTopLeft', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(5, 8489064245075560644), - name: 'dbLocationTopRight', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(6, 4981340637280440404), - name: 'dbLocationBottomLeft', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(7, 8742277346966043541), - name: 'dbLocationBottomRight', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(8, 2203659096246358776), - name: 'savedTime', - type: 9, - flags: 0) - ], - relations: [], - backlinks: []), - ModelEntity( - id: const IdUid(2, 1860532570098563020), - name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(10, 2008589073662093950), - flags: 0, - properties: [ - ModelProperty( - id: const IdUid(1, 3824533233190172585), - name: 'id', - type: 6, - flags: 1), - ModelProperty( - id: const IdUid(4, 681931444274282409), + id: const IdUid(4, 5259334423703613736), name: 'savedTime', type: 9, flags: 0), ModelProperty( - id: const IdUid(5, 6877689796308970604), + id: const IdUid(5, 5523993525315213267), name: 'dbLocationTopLeft', type: 9, flags: 0), ModelProperty( - id: const IdUid(6, 6532623860122744430), + id: const IdUid(6, 9064650214124194157), name: 'dbLocationTopRight', type: 9, flags: 0), ModelProperty( - id: const IdUid(7, 5378615026726072333), + id: const IdUid(7, 2961799903689622576), name: 'dbLocationBottomLeft', type: 9, flags: 0), ModelProperty( - id: const IdUid(8, 4682325687318046173), + id: const IdUid(8, 3170409840351111096), name: 'dbLocationBottomRight', type: 9, flags: 0) ], - relations: [ - ModelRelation( - id: const IdUid(3, 371184347085100722), - name: 'individualDataList', - targetId: const IdUid(4, 8671447701453785879)) - ], + relations: [], backlinks: []), ModelEntity( - id: const IdUid(4, 8671447701453785879), + id: const IdUid(2, 6685214565457365230), name: 'FamilyMemberIndividualDataModel', - lastPropertyId: const IdUid(31, 1397399115057201044), + lastPropertyId: const IdUid(32, 5375503589039401181), flags: 0, properties: [ ModelProperty( - id: const IdUid(1, 5357433056362681420), + id: const IdUid(1, 8723352508613304168), name: 'id', type: 6, flags: 1), ModelProperty( - id: const IdUid(2, 8011747133305154139), + id: const IdUid(2, 7604499542143584605), name: 'userName', type: 9, flags: 0), ModelProperty( - id: const IdUid(3, 4526862708267238768), - name: 'savedTime', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(4, 3085664632559939021), + id: const IdUid(3, 6647327136270420131), name: 'dateOfBirth', - type: 9, + type: 10, flags: 0), ModelProperty( - id: const IdUid(5, 4089981874949227093), + id: const IdUid(4, 7394015767332678427), name: 'gender', type: 9, flags: 0), ModelProperty( - id: const IdUid(6, 8147924758541863603), + id: const IdUid(5, 3884159339096887518), name: 'phoneNumber', type: 9, flags: 0), ModelProperty( - id: const IdUid(7, 8362247275532978895), + id: const IdUid(6, 3761785743139786223), name: 'educationQualification', type: 9, flags: 0), ModelProperty( - id: const IdUid(8, 5679091799904005563), + id: const IdUid(7, 2912550153076040514), name: 'aadhaarNumber', type: 9, flags: 0), ModelProperty( - id: const IdUid(9, 93176754199097596), - name: 'vulnerabilities', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(10, 6683743346766211386), - name: 'occupation', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(11, 7674773686375268308), + id: const IdUid(8, 6501390621116148247), name: 'dailyWageWorker', type: 9, flags: 0), ModelProperty( - id: const IdUid(12, 3825178531183591336), + id: const IdUid(9, 8692285643353019146), name: 'incomePerDay', type: 9, flags: 0), ModelProperty( - id: const IdUid(13, 6800080566226023846), + id: const IdUid(10, 2510858921793217570), name: 'incomePerMonth', type: 9, flags: 0), ModelProperty( - id: const IdUid(14, 6682636002341351132), + id: const IdUid(11, 3831022645838678395), name: 'pension', type: 9, flags: 0), ModelProperty( - id: const IdUid(15, 5889517609383333513), + id: const IdUid(12, 1404325505572824726), name: 'businessStatus', type: 9, flags: 0), ModelProperty( - id: const IdUid(16, 1551885345947737655), + id: const IdUid(13, 7080052757140045670), name: 'maritalStatus', type: 9, flags: 0), ModelProperty( - id: const IdUid(17, 7362378614402948609), + id: const IdUid(14, 4439637978014416112), name: 'specialSkills', type: 30, flags: 0), ModelProperty( - id: const IdUid(18, 8079660499990560077), + id: const IdUid(15, 4636181569648235734), name: 'frequentAilments', type: 30, flags: 0), ModelProperty( - id: const IdUid(19, 4413374908120023856), + id: const IdUid(16, 4851875690128697657), name: 'commutableDisease', type: 30, flags: 0), ModelProperty( - id: const IdUid(20, 4250702923463112078), + id: const IdUid(17, 7484660082837778600), name: 'nonCommutableDisease', type: 30, flags: 0), ModelProperty( - id: const IdUid(21, 1237433258990716055), + id: const IdUid(18, 5729780143757895259), name: 'surgeries', type: 9, flags: 0), ModelProperty( - id: const IdUid(22, 6965476731638035450), + id: const IdUid(19, 2532110693984905492), name: 'anganwadiServicesAware', type: 9, flags: 0), ModelProperty( - id: const IdUid(23, 4550221857104463869), + id: const IdUid(20, 7268786638343194491), name: 'anganwadiServicesUsing', type: 9, flags: 0), ModelProperty( - id: const IdUid(24, 9085531839818427243), + id: const IdUid(21, 6352333255560290159), name: 'anganwadiServicesUsedList', type: 30, flags: 0), ModelProperty( - id: const IdUid(25, 6866114763519136439), + id: const IdUid(22, 3293166845575984244), name: 'PHCServicesUsedList', type: 30, flags: 0), ModelProperty( - id: const IdUid(26, 4835734038831150727), + id: const IdUid(23, 2397114879954340884), name: 'privateClinicServicesUsedList', type: 30, flags: 0), ModelProperty( - id: const IdUid(27, 4667157897046339139), + id: const IdUid(24, 3237947682147741066), name: 'privateServiceReason', type: 9, flags: 0), ModelProperty( - id: const IdUid(28, 3779166862225991045), + id: const IdUid(25, 2630658762586974548), name: 'useOfTobacco', type: 9, flags: 0), ModelProperty( - id: const IdUid(29, 3268788816803461695), + id: const IdUid(26, 1662798223273329088), name: 'useOfAlcohol', type: 9, flags: 0), ModelProperty( - id: const IdUid(30, 4255114771534059896), + id: const IdUid(27, 3258249527595452242), name: 'aarogyaSetuInstalled', type: 9, flags: 0), ModelProperty( - id: const IdUid(31, 1397399115057201044), + id: const IdUid(28, 8168820643425503335), name: 'vizhithiruInstalled', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(30, 3074524065493072391), + name: 'savedTime', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(31, 7256338567008476068), + name: 'dbVulnerabilities', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(32, 5375503589039401181), + name: 'dbOccupation', + type: 9, flags: 0) ], relations: [], + backlinks: []), + ModelEntity( + id: const IdUid(3, 5004688671325240296), + name: 'FamilyMembersCommonDataModel', + lastPropertyId: const IdUid(23, 6516827898200627863), + flags: 0, + properties: [ + ModelProperty( + id: const IdUid(1, 406597506935878482), + name: 'id', + type: 6, + flags: 1), + ModelProperty( + id: const IdUid(2, 5933268951084276983), + name: 'drinkingWater', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(3, 7714255537633512426), + name: 'sourceOfDrinkingWater', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(4, 2415808930190145187), + name: 'toiletFacility', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(5, 4950161314722702905), + name: 'communityToilet', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(6, 8384486349887445986), + name: 'environmentSanitationLevel', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(7, 2392963229872898504), + name: 'runningWaterAvailable', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(8, 3952912803449147993), + name: 'noOfTwoWheelers', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(9, 1669417226997886200), + name: 'noOfThreeWheelers', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(10, 5011624990870736391), + name: 'noOfFourWheelers', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(11, 8805489678700516176), + name: 'isCattleOwned', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(12, 8435942014491427702), + name: 'incomeFromCattle', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(13, 1694052736194978877), + name: 'isFarmLandOwned', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(14, 5615515454180248444), + name: 'isSeedsPreserved', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(15, 7655049526662030931), + name: 'isKitchenGardenOwned', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(16, 6193242875372395353), + name: 'addressOne', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(17, 1686900574402451883), + name: 'addressTwo', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(18, 5524724872707357697), + name: 'addressThree', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(19, 1423273990910471875), + name: 'savedTime', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(20, 5507268764564482947), + name: 'dbLocationTopLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(21, 4582363172019587389), + name: 'dbLocationTopRight', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(22, 69678934293790881), + name: 'dbLocationBottomLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(23, 6516827898200627863), + name: 'dbLocationBottomRight', + type: 9, + flags: 0) + ], + relations: [ + ModelRelation( + id: const IdUid(1, 1791331254757937694), + name: 'individualDataList', + targetId: const IdUid(2, 6685214565457365230)) + ], backlinks: []) ]; @@ -294,25 +379,14 @@ Future openStore( ModelDefinition getObjectBoxModel() { final model = ModelInfo( entities: _entities, - lastEntityId: const IdUid(4, 8671447701453785879), - lastIndexId: const IdUid(2, 3780641643474411567), - lastRelationId: const IdUid(3, 371184347085100722), + lastEntityId: const IdUid(3, 5004688671325240296), + lastIndexId: const IdUid(1, 7346081088137941172), + lastRelationId: const IdUid(1, 1791331254757937694), lastSequenceId: const IdUid(0, 0), - retiredEntityUids: const [2384522976899313648], - retiredIndexUids: const [8834613087270691234, 3780641643474411567], - retiredPropertyUids: const [ - 1796312536826265865, - 4138361640658468836, - 4718953437214788922, - 8052215135369744546, - 2435262721668243080, - 5992078344277508825, - 2398616950182668401, - 635977564128467162, - 7198889010838595583, - 2008589073662093950 - ], - retiredRelationUids: const [7533083279143375120, 991746608797753194], + retiredEntityUids: const [], + retiredIndexUids: const [7346081088137941172], + retiredPropertyUids: const [1969777098633351831], + retiredRelationUids: const [], modelVersion: 5, modelVersionParserMinimum: 5, version: 1); @@ -333,6 +407,9 @@ ModelDefinition getObjectBoxModel() { final villageCodeOffset = object.villageCode == null ? null : fbb.writeString(object.villageCode!); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); final dbLocationTopLeftOffset = object.dbLocationTopLeft == null ? null : fbb.writeString(object.dbLocationTopLeft!); @@ -346,18 +423,15 @@ ModelDefinition getObjectBoxModel() { object.dbLocationBottomRight == null ? null : fbb.writeString(object.dbLocationBottomRight!); - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); fbb.startTable(9); fbb.addInt64(0, object.id); fbb.addOffset(1, resourceTypeOffset); fbb.addOffset(2, villageCodeOffset); - fbb.addOffset(3, dbLocationTopLeftOffset); - fbb.addOffset(4, dbLocationTopRightOffset); - fbb.addOffset(5, dbLocationBottomLeftOffset); - fbb.addOffset(6, dbLocationBottomRightOffset); - fbb.addOffset(7, savedTimeOffset); + fbb.addOffset(3, savedTimeOffset); + fbb.addOffset(4, dbLocationTopLeftOffset); + fbb.addOffset(5, dbLocationTopRightOffset); + fbb.addOffset(6, dbLocationBottomLeftOffset); + fbb.addOffset(7, dbLocationBottomRightOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -371,86 +445,22 @@ ModelDefinition getObjectBoxModel() { villageCode: const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 8)) ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) - ..dbLocationTopLeft = const fb.StringReader() + ..savedTime = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 10) - ..dbLocationTopRight = const fb.StringReader() + ..dbLocationTopLeft = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 12) - ..dbLocationBottomLeft = const fb.StringReader() + ..dbLocationTopRight = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 14) - ..dbLocationBottomRight = const fb.StringReader() + ..dbLocationBottomLeft = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 16) - ..savedTime = const fb.StringReader() + ..dbLocationBottomRight = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 18); return object; }), - FamilyMembersCommonDataModel: - EntityDefinition( - model: _entities[1], - toOneRelations: (FamilyMembersCommonDataModel object) => [], - toManyRelations: (FamilyMembersCommonDataModel object) => { - RelInfo.toMany(3, object.id): - object.individualDataList - }, - getId: (FamilyMembersCommonDataModel object) => object.id, - setId: (FamilyMembersCommonDataModel object, int id) { - object.id = id; - }, - objectToFB: (FamilyMembersCommonDataModel object, fb.Builder fbb) { - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); - final dbLocationTopLeftOffset = object.dbLocationTopLeft == null - ? null - : fbb.writeString(object.dbLocationTopLeft!); - final dbLocationTopRightOffset = object.dbLocationTopRight == null - ? null - : fbb.writeString(object.dbLocationTopRight!); - final dbLocationBottomLeftOffset = - object.dbLocationBottomLeft == null - ? null - : fbb.writeString(object.dbLocationBottomLeft!); - final dbLocationBottomRightOffset = - object.dbLocationBottomRight == null - ? null - : fbb.writeString(object.dbLocationBottomRight!); - fbb.startTable(11); - fbb.addInt64(0, object.id); - fbb.addOffset(3, savedTimeOffset); - fbb.addOffset(4, dbLocationTopLeftOffset); - fbb.addOffset(5, dbLocationTopRightOffset); - fbb.addOffset(6, dbLocationBottomLeftOffset); - fbb.addOffset(7, dbLocationBottomRightOffset); - fbb.finish(fbb.endTable()); - return object.id; - }, - objectFromFB: (Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - - final object = FamilyMembersCommonDataModel() - ..id = - const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) - ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 10) - ..dbLocationTopLeft = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 12) - ..dbLocationTopRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 14) - ..dbLocationBottomLeft = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 16) - ..dbLocationBottomRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 18); - InternalToManyAccess.setRelInfo( - object.individualDataList, - store, - RelInfo.toMany(3, object.id), - store.box()); - return object; - }), FamilyMemberIndividualDataModel: EntityDefinition< FamilyMemberIndividualDataModel>( - model: _entities[2], + model: _entities[1], toOneRelations: (FamilyMemberIndividualDataModel object) => [], toManyRelations: (FamilyMemberIndividualDataModel object) => {}, getId: (FamilyMemberIndividualDataModel object) => object.id, @@ -461,12 +471,6 @@ ModelDefinition getObjectBoxModel() { final userNameOffset = object.userName == null ? null : fbb.writeString(object.userName!); - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); - final dateOfBirthOffset = object.dateOfBirth == null - ? null - : fbb.writeString(object.dateOfBirth!); final genderOffset = object.gender == null ? null : fbb.writeString(object.gender!); final phoneNumberOffset = object.phoneNumber == null @@ -479,16 +483,6 @@ ModelDefinition getObjectBoxModel() { final aadhaarNumberOffset = object.aadhaarNumber == null ? null : fbb.writeString(object.aadhaarNumber!); - final vulnerabilitiesOffset = object.vulnerabilities == null - ? null - : fbb.writeList(object.vulnerabilities! - .map(fbb.writeString) - .toList(growable: false)); - final occupationOffset = object.occupation == null - ? null - : fbb.writeList(object.occupation! - .map(fbb.writeString) - .toList(growable: false)); final dailyWageWorkerOffset = object.dailyWageWorker == null ? null : fbb.writeString(object.dailyWageWorker!); @@ -569,118 +563,294 @@ ModelDefinition getObjectBoxModel() { final vizhithiruInstalledOffset = object.vizhithiruInstalled == null ? null : fbb.writeString(object.vizhithiruInstalled!); - fbb.startTable(32); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); + final dbVulnerabilitiesOffset = object.dbVulnerabilities == null + ? null + : fbb.writeString(object.dbVulnerabilities!); + final dbOccupationOffset = object.dbOccupation == null + ? null + : fbb.writeString(object.dbOccupation!); + fbb.startTable(33); fbb.addInt64(0, object.id); fbb.addOffset(1, userNameOffset); - fbb.addOffset(2, savedTimeOffset); - fbb.addOffset(3, dateOfBirthOffset); - fbb.addOffset(4, genderOffset); - fbb.addOffset(5, phoneNumberOffset); - fbb.addOffset(6, educationQualificationOffset); - fbb.addOffset(7, aadhaarNumberOffset); - fbb.addOffset(8, vulnerabilitiesOffset); - fbb.addOffset(9, occupationOffset); - fbb.addOffset(10, dailyWageWorkerOffset); - fbb.addOffset(11, incomePerDayOffset); - fbb.addOffset(12, incomePerMonthOffset); - fbb.addOffset(13, pensionOffset); - fbb.addOffset(14, businessStatusOffset); - fbb.addOffset(15, maritalStatusOffset); - fbb.addOffset(16, specialSkillsOffset); - fbb.addOffset(17, frequentAilmentsOffset); - fbb.addOffset(18, commutableDiseaseOffset); - fbb.addOffset(19, nonCommutableDiseaseOffset); - fbb.addOffset(20, surgeriesOffset); - fbb.addOffset(21, anganwadiServicesAwareOffset); - fbb.addOffset(22, anganwadiServicesUsingOffset); - fbb.addOffset(23, anganwadiServicesUsedListOffset); - fbb.addOffset(24, PHCServicesUsedListOffset); - fbb.addOffset(25, privateClinicServicesUsedListOffset); - fbb.addOffset(26, privateServiceReasonOffset); - fbb.addOffset(27, useOfTobaccoOffset); - fbb.addOffset(28, useOfAlcoholOffset); - fbb.addOffset(29, aarogyaSetuInstalledOffset); - fbb.addOffset(30, vizhithiruInstalledOffset); + fbb.addInt64(2, object.dateOfBirth?.millisecondsSinceEpoch); + fbb.addOffset(3, genderOffset); + fbb.addOffset(4, phoneNumberOffset); + fbb.addOffset(5, educationQualificationOffset); + fbb.addOffset(6, aadhaarNumberOffset); + fbb.addOffset(7, dailyWageWorkerOffset); + fbb.addOffset(8, incomePerDayOffset); + fbb.addOffset(9, incomePerMonthOffset); + fbb.addOffset(10, pensionOffset); + fbb.addOffset(11, businessStatusOffset); + fbb.addOffset(12, maritalStatusOffset); + fbb.addOffset(13, specialSkillsOffset); + fbb.addOffset(14, frequentAilmentsOffset); + fbb.addOffset(15, commutableDiseaseOffset); + fbb.addOffset(16, nonCommutableDiseaseOffset); + fbb.addOffset(17, surgeriesOffset); + fbb.addOffset(18, anganwadiServicesAwareOffset); + fbb.addOffset(19, anganwadiServicesUsingOffset); + fbb.addOffset(20, anganwadiServicesUsedListOffset); + fbb.addOffset(21, PHCServicesUsedListOffset); + fbb.addOffset(22, privateClinicServicesUsedListOffset); + fbb.addOffset(23, privateServiceReasonOffset); + fbb.addOffset(24, useOfTobaccoOffset); + fbb.addOffset(25, useOfAlcoholOffset); + fbb.addOffset(26, aarogyaSetuInstalledOffset); + fbb.addOffset(27, vizhithiruInstalledOffset); + fbb.addOffset(29, savedTimeOffset); + fbb.addOffset(30, dbVulnerabilitiesOffset); + fbb.addOffset(31, dbOccupationOffset); fbb.finish(fbb.endTable()); return object.id; }, objectFromFB: (Store store, ByteData fbData) { final buffer = fb.BufferContext(fbData); final rootOffset = buffer.derefObject(0); - + final dateOfBirthValue = + const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 8); final object = FamilyMemberIndividualDataModel( userName: const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 6)) ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) - ..savedTime = - const fb.StringReader().vTableGetNullable(buffer, rootOffset, 8) - ..dateOfBirth = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 10) + ..dateOfBirth = dateOfBirthValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateOfBirthValue) ..gender = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 12) + .vTableGetNullable(buffer, rootOffset, 10) ..phoneNumber = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 14) + .vTableGetNullable(buffer, rootOffset, 12) ..educationQualification = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 16) + .vTableGetNullable(buffer, rootOffset, 14) ..aadhaarNumber = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 18) - ..vulnerabilities = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 20) - ..occupation = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 22) + .vTableGetNullable(buffer, rootOffset, 16) ..dailyWageWorker = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 24) + .vTableGetNullable(buffer, rootOffset, 18) ..incomePerDay = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 26) + .vTableGetNullable(buffer, rootOffset, 20) ..incomePerMonth = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 28) + .vTableGetNullable(buffer, rootOffset, 22) ..pension = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 30) + .vTableGetNullable(buffer, rootOffset, 24) ..businessStatus = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 32) + .vTableGetNullable(buffer, rootOffset, 26) ..maritalStatus = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 34) + .vTableGetNullable(buffer, rootOffset, 28) ..specialSkills = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 36) + .vTableGetNullable(buffer, rootOffset, 30) ..frequentAilments = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 38) + .vTableGetNullable(buffer, rootOffset, 32) ..commutableDisease = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 40) + .vTableGetNullable(buffer, rootOffset, 34) ..nonCommutableDisease = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 42) + .vTableGetNullable(buffer, rootOffset, 36) ..surgeries = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 44) + .vTableGetNullable(buffer, rootOffset, 38) ..anganwadiServicesAware = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 46) + .vTableGetNullable(buffer, rootOffset, 40) ..anganwadiServicesUsing = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 48) + .vTableGetNullable(buffer, rootOffset, 42) ..anganwadiServicesUsedList = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 50) + .vTableGetNullable(buffer, rootOffset, 44) ..PHCServicesUsedList = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 52) + .vTableGetNullable(buffer, rootOffset, 46) ..privateClinicServicesUsedList = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 54) + .vTableGetNullable(buffer, rootOffset, 48) ..privateServiceReason = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 56) + .vTableGetNullable(buffer, rootOffset, 50) ..useOfTobacco = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 58) + .vTableGetNullable(buffer, rootOffset, 52) ..useOfAlcohol = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 60) + .vTableGetNullable(buffer, rootOffset, 54) ..aarogyaSetuInstalled = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 62) + .vTableGetNullable(buffer, rootOffset, 56) ..vizhithiruInstalled = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 64); + .vTableGetNullable(buffer, rootOffset, 58) + ..savedTime = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 62) + ..dbVulnerabilities = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 64) + ..dbOccupation = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 66); return object; + }), + FamilyMembersCommonDataModel: EntityDefinition< + FamilyMembersCommonDataModel>( + model: _entities[2], + toOneRelations: (FamilyMembersCommonDataModel object) => [], + toManyRelations: (FamilyMembersCommonDataModel object) => { + RelInfo.toMany(1, object.id): + object.individualDataList + }, + getId: (FamilyMembersCommonDataModel object) => object.id, + setId: (FamilyMembersCommonDataModel object, int id) { + object.id = id; + }, + objectToFB: (FamilyMembersCommonDataModel object, fb.Builder fbb) { + final drinkingWaterOffset = object.drinkingWater == null + ? null + : fbb.writeString(object.drinkingWater!); + final sourceOfDrinkingWaterOffset = + object.sourceOfDrinkingWater == null + ? null + : fbb.writeString(object.sourceOfDrinkingWater!); + final toiletFacilityOffset = object.toiletFacility == null + ? null + : fbb.writeString(object.toiletFacility!); + final communityToiletOffset = object.communityToilet == null + ? null + : fbb.writeString(object.communityToilet!); + final environmentSanitationLevelOffset = + object.environmentSanitationLevel == null + ? null + : fbb.writeString(object.environmentSanitationLevel!); + final runningWaterAvailableOffset = + object.runningWaterAvailable == null + ? null + : fbb.writeString(object.runningWaterAvailable!); + final noOfTwoWheelersOffset = object.noOfTwoWheelers == null + ? null + : fbb.writeString(object.noOfTwoWheelers!); + final noOfThreeWheelersOffset = object.noOfThreeWheelers == null + ? null + : fbb.writeString(object.noOfThreeWheelers!); + final noOfFourWheelersOffset = object.noOfFourWheelers == null + ? null + : fbb.writeString(object.noOfFourWheelers!); + final isCattleOwnedOffset = object.isCattleOwned == null + ? null + : fbb.writeString(object.isCattleOwned!); + final incomeFromCattleOffset = object.incomeFromCattle == null + ? null + : fbb.writeString(object.incomeFromCattle!); + final isFarmLandOwnedOffset = object.isFarmLandOwned == null + ? null + : fbb.writeString(object.isFarmLandOwned!); + final isSeedsPreservedOffset = object.isSeedsPreserved == null + ? null + : fbb.writeString(object.isSeedsPreserved!); + final isKitchenGardenOwnedOffset = object.isKitchenGardenOwned == null + ? null + : fbb.writeString(object.isKitchenGardenOwned!); + final addressOneOffset = object.addressOne == null + ? null + : fbb.writeString(object.addressOne!); + final addressTwoOffset = object.addressTwo == null + ? null + : fbb.writeString(object.addressTwo!); + final addressThreeOffset = object.addressThree == null + ? null + : fbb.writeString(object.addressThree!); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); + final dbLocationTopLeftOffset = object.dbLocationTopLeft == null + ? null + : fbb.writeString(object.dbLocationTopLeft!); + final dbLocationTopRightOffset = object.dbLocationTopRight == null + ? null + : fbb.writeString(object.dbLocationTopRight!); + final dbLocationBottomLeftOffset = object.dbLocationBottomLeft == null + ? null + : fbb.writeString(object.dbLocationBottomLeft!); + final dbLocationBottomRightOffset = + object.dbLocationBottomRight == null + ? null + : fbb.writeString(object.dbLocationBottomRight!); + fbb.startTable(24); + fbb.addInt64(0, object.id); + fbb.addOffset(1, drinkingWaterOffset); + fbb.addOffset(2, sourceOfDrinkingWaterOffset); + fbb.addOffset(3, toiletFacilityOffset); + fbb.addOffset(4, communityToiletOffset); + fbb.addOffset(5, environmentSanitationLevelOffset); + fbb.addOffset(6, runningWaterAvailableOffset); + fbb.addOffset(7, noOfTwoWheelersOffset); + fbb.addOffset(8, noOfThreeWheelersOffset); + fbb.addOffset(9, noOfFourWheelersOffset); + fbb.addOffset(10, isCattleOwnedOffset); + fbb.addOffset(11, incomeFromCattleOffset); + fbb.addOffset(12, isFarmLandOwnedOffset); + fbb.addOffset(13, isSeedsPreservedOffset); + fbb.addOffset(14, isKitchenGardenOwnedOffset); + fbb.addOffset(15, addressOneOffset); + fbb.addOffset(16, addressTwoOffset); + fbb.addOffset(17, addressThreeOffset); + fbb.addOffset(18, savedTimeOffset); + fbb.addOffset(19, dbLocationTopLeftOffset); + fbb.addOffset(20, dbLocationTopRightOffset); + fbb.addOffset(21, dbLocationBottomLeftOffset); + fbb.addOffset(22, dbLocationBottomRightOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + + final object = FamilyMembersCommonDataModel() + ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) + ..drinkingWater = + const fb.StringReader().vTableGetNullable(buffer, rootOffset, 6) + ..sourceOfDrinkingWater = + const fb.StringReader().vTableGetNullable(buffer, rootOffset, 8) + ..toiletFacility = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 10) + ..communityToilet = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 12) + ..environmentSanitationLevel = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 14) + ..runningWaterAvailable = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 16) + ..noOfTwoWheelers = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 18) + ..noOfThreeWheelers = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 20) + ..noOfFourWheelers = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 22) + ..isCattleOwned = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 24) + ..incomeFromCattle = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 26) + ..isFarmLandOwned = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 28) + ..isSeedsPreserved = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 30) + ..isKitchenGardenOwned = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 32) + ..addressOne = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 34) + ..addressTwo = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 36) + ..addressThree = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 38) + ..savedTime = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 40) + ..dbLocationTopLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 42) + ..dbLocationTopRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 44) + ..dbLocationBottomLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 46) + ..dbLocationBottomRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 48); + InternalToManyAccess.setRelInfo( + object.individualDataList, + store, + RelInfo.toMany(1, object.id), + store.box()); + return object; }) }; @@ -701,211 +871,293 @@ class CommunityDataModel_ { static final villageCode = QueryStringProperty(_entities[0].properties[2]); + /// see [CommunityDataModel.savedTime] + static final savedTime = + QueryStringProperty(_entities[0].properties[3]); + /// see [CommunityDataModel.dbLocationTopLeft] static final dbLocationTopLeft = - QueryStringProperty(_entities[0].properties[3]); + QueryStringProperty(_entities[0].properties[4]); /// see [CommunityDataModel.dbLocationTopRight] static final dbLocationTopRight = - QueryStringProperty(_entities[0].properties[4]); + QueryStringProperty(_entities[0].properties[5]); /// see [CommunityDataModel.dbLocationBottomLeft] static final dbLocationBottomLeft = - QueryStringProperty(_entities[0].properties[5]); + QueryStringProperty(_entities[0].properties[6]); /// see [CommunityDataModel.dbLocationBottomRight] static final dbLocationBottomRight = - QueryStringProperty(_entities[0].properties[6]); - - /// see [CommunityDataModel.savedTime] - static final savedTime = QueryStringProperty(_entities[0].properties[7]); } -/// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. -class FamilyMembersCommonDataModel_ { - /// see [FamilyMembersCommonDataModel.id] - static final id = QueryIntegerProperty( - _entities[1].properties[0]); - - /// see [FamilyMembersCommonDataModel.savedTime] - static final savedTime = QueryStringProperty( - _entities[1].properties[1]); - - /// see [FamilyMembersCommonDataModel.dbLocationTopLeft] - static final dbLocationTopLeft = - QueryStringProperty( - _entities[1].properties[2]); - - /// see [FamilyMembersCommonDataModel.dbLocationTopRight] - static final dbLocationTopRight = - QueryStringProperty( - _entities[1].properties[3]); - - /// see [FamilyMembersCommonDataModel.dbLocationBottomLeft] - static final dbLocationBottomLeft = - QueryStringProperty( - _entities[1].properties[4]); - - /// see [FamilyMembersCommonDataModel.dbLocationBottomRight] - static final dbLocationBottomRight = - QueryStringProperty( - _entities[1].properties[5]); - - /// see [FamilyMembersCommonDataModel.individualDataList] - static final individualDataList = QueryRelationToMany< - FamilyMembersCommonDataModel, - FamilyMemberIndividualDataModel>(_entities[1].relations[0]); -} - /// [FamilyMemberIndividualDataModel] entity fields to define ObjectBox queries. class FamilyMemberIndividualDataModel_ { /// see [FamilyMemberIndividualDataModel.id] static final id = QueryIntegerProperty( - _entities[2].properties[0]); + _entities[1].properties[0]); /// see [FamilyMemberIndividualDataModel.userName] static final userName = QueryStringProperty( - _entities[2].properties[1]); - - /// see [FamilyMemberIndividualDataModel.savedTime] - static final savedTime = QueryStringProperty( - _entities[2].properties[2]); + _entities[1].properties[1]); /// see [FamilyMemberIndividualDataModel.dateOfBirth] static final dateOfBirth = - QueryStringProperty( - _entities[2].properties[3]); + QueryIntegerProperty( + _entities[1].properties[2]); /// see [FamilyMemberIndividualDataModel.gender] static final gender = QueryStringProperty( - _entities[2].properties[4]); + _entities[1].properties[3]); /// see [FamilyMemberIndividualDataModel.phoneNumber] static final phoneNumber = QueryStringProperty( - _entities[2].properties[5]); + _entities[1].properties[4]); /// see [FamilyMemberIndividualDataModel.educationQualification] static final educationQualification = QueryStringProperty( - _entities[2].properties[6]); + _entities[1].properties[5]); /// see [FamilyMemberIndividualDataModel.aadhaarNumber] static final aadhaarNumber = QueryStringProperty( - _entities[2].properties[7]); - - /// see [FamilyMemberIndividualDataModel.vulnerabilities] - static final vulnerabilities = - QueryStringVectorProperty( - _entities[2].properties[8]); - - /// see [FamilyMemberIndividualDataModel.occupation] - static final occupation = - QueryStringVectorProperty( - _entities[2].properties[9]); + _entities[1].properties[6]); /// see [FamilyMemberIndividualDataModel.dailyWageWorker] static final dailyWageWorker = QueryStringProperty( - _entities[2].properties[10]); + _entities[1].properties[7]); /// see [FamilyMemberIndividualDataModel.incomePerDay] static final incomePerDay = QueryStringProperty( - _entities[2].properties[11]); + _entities[1].properties[8]); /// see [FamilyMemberIndividualDataModel.incomePerMonth] static final incomePerMonth = QueryStringProperty( - _entities[2].properties[12]); + _entities[1].properties[9]); /// see [FamilyMemberIndividualDataModel.pension] static final pension = QueryStringProperty( - _entities[2].properties[13]); + _entities[1].properties[10]); /// see [FamilyMemberIndividualDataModel.businessStatus] static final businessStatus = QueryStringProperty( - _entities[2].properties[14]); + _entities[1].properties[11]); /// see [FamilyMemberIndividualDataModel.maritalStatus] static final maritalStatus = QueryStringProperty( - _entities[2].properties[15]); + _entities[1].properties[12]); /// see [FamilyMemberIndividualDataModel.specialSkills] static final specialSkills = QueryStringVectorProperty( - _entities[2].properties[16]); + _entities[1].properties[13]); /// see [FamilyMemberIndividualDataModel.frequentAilments] static final frequentAilments = QueryStringVectorProperty( - _entities[2].properties[17]); + _entities[1].properties[14]); /// see [FamilyMemberIndividualDataModel.commutableDisease] static final commutableDisease = QueryStringVectorProperty( - _entities[2].properties[18]); + _entities[1].properties[15]); /// see [FamilyMemberIndividualDataModel.nonCommutableDisease] static final nonCommutableDisease = QueryStringVectorProperty( - _entities[2].properties[19]); + _entities[1].properties[16]); /// see [FamilyMemberIndividualDataModel.surgeries] static final surgeries = QueryStringProperty( - _entities[2].properties[20]); + _entities[1].properties[17]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesAware] static final anganwadiServicesAware = QueryStringProperty( - _entities[2].properties[21]); + _entities[1].properties[18]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsing] static final anganwadiServicesUsing = QueryStringProperty( - _entities[2].properties[22]); + _entities[1].properties[19]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsedList] static final anganwadiServicesUsedList = QueryStringVectorProperty( - _entities[2].properties[23]); + _entities[1].properties[20]); /// see [FamilyMemberIndividualDataModel.PHCServicesUsedList] static final PHCServicesUsedList = QueryStringVectorProperty( - _entities[2].properties[24]); + _entities[1].properties[21]); /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsedList] static final privateClinicServicesUsedList = QueryStringVectorProperty( - _entities[2].properties[25]); + _entities[1].properties[22]); /// see [FamilyMemberIndividualDataModel.privateServiceReason] static final privateServiceReason = QueryStringProperty( - _entities[2].properties[26]); + _entities[1].properties[23]); /// see [FamilyMemberIndividualDataModel.useOfTobacco] static final useOfTobacco = QueryStringProperty( - _entities[2].properties[27]); + _entities[1].properties[24]); /// see [FamilyMemberIndividualDataModel.useOfAlcohol] static final useOfAlcohol = QueryStringProperty( - _entities[2].properties[28]); + _entities[1].properties[25]); /// see [FamilyMemberIndividualDataModel.aarogyaSetuInstalled] static final aarogyaSetuInstalled = QueryStringProperty( - _entities[2].properties[29]); + _entities[1].properties[26]); /// see [FamilyMemberIndividualDataModel.vizhithiruInstalled] static final vizhithiruInstalled = QueryStringProperty( - _entities[2].properties[30]); + _entities[1].properties[27]); + + /// see [FamilyMemberIndividualDataModel.savedTime] + static final savedTime = QueryStringProperty( + _entities[1].properties[28]); + + /// see [FamilyMemberIndividualDataModel.dbVulnerabilities] + static final dbVulnerabilities = + QueryStringProperty( + _entities[1].properties[29]); + + /// see [FamilyMemberIndividualDataModel.dbOccupation] + static final dbOccupation = + QueryStringProperty( + _entities[1].properties[30]); +} + +/// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. +class FamilyMembersCommonDataModel_ { + /// see [FamilyMembersCommonDataModel.id] + static final id = QueryIntegerProperty( + _entities[2].properties[0]); + + /// see [FamilyMembersCommonDataModel.drinkingWater] + static final drinkingWater = + QueryStringProperty( + _entities[2].properties[1]); + + /// see [FamilyMembersCommonDataModel.sourceOfDrinkingWater] + static final sourceOfDrinkingWater = + QueryStringProperty( + _entities[2].properties[2]); + + /// see [FamilyMembersCommonDataModel.toiletFacility] + static final toiletFacility = + QueryStringProperty( + _entities[2].properties[3]); + + /// see [FamilyMembersCommonDataModel.communityToilet] + static final communityToilet = + QueryStringProperty( + _entities[2].properties[4]); + + /// see [FamilyMembersCommonDataModel.environmentSanitationLevel] + static final environmentSanitationLevel = + QueryStringProperty( + _entities[2].properties[5]); + + /// see [FamilyMembersCommonDataModel.runningWaterAvailable] + static final runningWaterAvailable = + QueryStringProperty( + _entities[2].properties[6]); + + /// see [FamilyMembersCommonDataModel.noOfTwoWheelers] + static final noOfTwoWheelers = + QueryStringProperty( + _entities[2].properties[7]); + + /// see [FamilyMembersCommonDataModel.noOfThreeWheelers] + static final noOfThreeWheelers = + QueryStringProperty( + _entities[2].properties[8]); + + /// see [FamilyMembersCommonDataModel.noOfFourWheelers] + static final noOfFourWheelers = + QueryStringProperty( + _entities[2].properties[9]); + + /// see [FamilyMembersCommonDataModel.isCattleOwned] + static final isCattleOwned = + QueryStringProperty( + _entities[2].properties[10]); + + /// see [FamilyMembersCommonDataModel.incomeFromCattle] + static final incomeFromCattle = + QueryStringProperty( + _entities[2].properties[11]); + + /// see [FamilyMembersCommonDataModel.isFarmLandOwned] + static final isFarmLandOwned = + QueryStringProperty( + _entities[2].properties[12]); + + /// see [FamilyMembersCommonDataModel.isSeedsPreserved] + static final isSeedsPreserved = + QueryStringProperty( + _entities[2].properties[13]); + + /// see [FamilyMembersCommonDataModel.isKitchenGardenOwned] + static final isKitchenGardenOwned = + QueryStringProperty( + _entities[2].properties[14]); + + /// see [FamilyMembersCommonDataModel.addressOne] + static final addressOne = QueryStringProperty( + _entities[2].properties[15]); + + /// see [FamilyMembersCommonDataModel.addressTwo] + static final addressTwo = QueryStringProperty( + _entities[2].properties[16]); + + /// see [FamilyMembersCommonDataModel.addressThree] + static final addressThree = QueryStringProperty( + _entities[2].properties[17]); + + /// see [FamilyMembersCommonDataModel.savedTime] + static final savedTime = QueryStringProperty( + _entities[2].properties[18]); + + /// see [FamilyMembersCommonDataModel.dbLocationTopLeft] + static final dbLocationTopLeft = + QueryStringProperty( + _entities[2].properties[19]); + + /// see [FamilyMembersCommonDataModel.dbLocationTopRight] + static final dbLocationTopRight = + QueryStringProperty( + _entities[2].properties[20]); + + /// see [FamilyMembersCommonDataModel.dbLocationBottomLeft] + static final dbLocationBottomLeft = + QueryStringProperty( + _entities[2].properties[21]); + + /// see [FamilyMembersCommonDataModel.dbLocationBottomRight] + static final dbLocationBottomRight = + QueryStringProperty( + _entities[2].properties[22]); + + /// see [FamilyMembersCommonDataModel.individualDataList] + static final individualDataList = QueryRelationToMany< + FamilyMembersCommonDataModel, + FamilyMemberIndividualDataModel>(_entities[2].relations[0]); } From ba15822eea7d7ead5eee7ce834e8bc70c0ed9560 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Wed, 5 Jan 2022 08:26:30 +0530 Subject: [PATCH 114/264] Fixed VillageSelection.dart's reloading page --- lib/Screens/FamilyHomeScreen.dart | 149 +++++++++++++++--------------- lib/Screens/FamilyMemberAdd.dart | 2 +- lib/Screens/ProfilePage.dart | 29 ++++++ lib/Screens/VillageSelection.dart | 36 ++++++-- 4 files changed, 135 insertions(+), 81 deletions(-) create mode 100644 lib/Screens/ProfilePage.dart diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 18d7c0f..0ac4151 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -32,81 +32,84 @@ class _FamilyHomeScreenState extends State modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); - return Scaffold( - appBar: AppBarBackButton('Individual Data'), - backgroundColor: colors.darkScaffoldColor, - body: SafeArea( - child: Column( - children: [ - AddRemoveBoxWidget( - modelData: modelData, - ), - DataCard("\nCollect Common Details", "", "assets/svg/house.svg", - FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), - DataCard( - "Record GPS Data", - "Make sure GPS is enabled", - "assets/svg/map.svg", - CollectLocationWidget(modelData: modelData), - Color(0xfff54b64), - Color(0xfff78361)), - Padding( - padding: EdgeInsets.only( - bottom: 10.0, left: 10.0, right: 10.0, top: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: EdgeInsets.only(left: 10, right: 10), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.4, - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkSecondBackgroundColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors - .darkSecondBackgroundColor)))), - onPressed: () {}), - ), - ), - Padding( - padding: EdgeInsets.only( - left: 10, right: 10, top: 5, bottom: 10), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.4, - child: ElevatedButton( - child: Text("Save", - style: - TextStyle(fontSize: 14, color: Colors.black)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - Colors.white), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.white)))), - onPressed: () async { - store = await StoreInstance.getInstance(); - Box box = store.box(); - await box.put(modelData); - }), + return WillPopScope( + onWillPop: () async {Navigator.pop(context, true); return true;}, + child: Scaffold( + appBar: AppBarBackButton('Individual Data'), + backgroundColor: colors.darkScaffoldColor, + body: SafeArea( + child: Column( + children: [ + AddRemoveBoxWidget( + modelData: modelData, + ), + DataCard("\nCollect Common Details", "", "assets/svg/house.svg", + FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), + DataCard( + "Record GPS Data", + "Make sure GPS is enabled", + "assets/svg/map.svg", + CollectLocationWidget(modelData: modelData), + Color(0xfff54b64), + Color(0xfff78361)), + Padding( + padding: EdgeInsets.only( + bottom: 10.0, left: 10.0, right: 10.0, top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.4, + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkSecondBackgroundColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () {}), + ), ), - ) - ], + Padding( + padding: EdgeInsets.only( + left: 10, right: 10, top: 5, bottom: 10), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.4, + child: ElevatedButton( + child: Text("Save", + style: + TextStyle(fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + Colors.white), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white)))), + onPressed: () async { + store = await StoreInstance.getInstance(); + Box box = store.box(); + await box.put(modelData); + }), + ), + ) + ], + ), ), - ), - ], + ], + ), ), ), ); diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 553ffb9..8fd71a8 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -89,7 +89,7 @@ class _FamilyMemberAddState extends State { ), TextButton( child: Text('Yes', style: TextStyle(color: Colors.red)), - onPressed: () { + onPressed: () async { Navigator.pop(context, true); }, ), diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart new file mode 100644 index 0000000..3b03205 --- /dev/null +++ b/lib/Screens/ProfilePage.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Utils/Globals.dart' as globals; + + +class ProfilePage extends StatelessWidget { + const ProfilePage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + height: MediaQuery.of(context).size.height*0.3, + ), + Container( + height: MediaQuery.of(context).size.height*0.1, + ), + Text("Name goes here"), + Text("Username in smaller, less bright text"), + ], + ), + ); + } +} diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index 5b97768..d2b309b 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -1,5 +1,8 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; +import 'package:geo_spatial/Screens/Home.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; @@ -16,7 +19,21 @@ class VillageSelectionScreen extends StatefulWidget { var isGenerated = false; } + class _VillageSelectionScreenState extends State { + void refreshData(){ + widget.isGenerated = false; + } + + FutureOr onGoBack(dynamic value){ + refreshData(); + setState(() {}); + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => + Home())); + } + + @override Widget build(BuildContext context) { return Scaffold( @@ -87,7 +104,9 @@ class _VillageSelectionScreenState extends State { const EdgeInsets.symmetric(vertical: 20.0), child: Text( 'Sample UIN', - style: GoogleFonts.poppins(fontWeight: FontWeight.w600, fontSize: 20, + style: GoogleFonts.poppins( + fontWeight: FontWeight.w600, + fontSize: 20, color: colors.darkPrimaryTextColor), ), ), @@ -107,11 +126,12 @@ class _VillageSelectionScreenState extends State { borderRadius: BorderRadius.circular(20), side: BorderSide( - color: colors - .darkScaffoldColor)))), + color: + colors.darkScaffoldColor)))), onPressed: () { - Navigator.of(context) - .push(MaterialPageRoute(builder: (context) => FamilyHomeScreen())); + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => + FamilyHomeScreen())).then(onGoBack); }, icon: Icon(Icons.arrow_right_alt_sharp), ), @@ -122,9 +142,11 @@ class _VillageSelectionScreenState extends State { SizedBox( height: MediaQuery.of(context).size.height * 0.1, ), - TextButton( - onPressed: () {}, child: Text("Generate UIN later")) + if (!widget.isGenerated) + TextButton( + onPressed: () {}, child: Text("Generate UIN later")) ], + ), ), ) From cf5511636c7866cb91fdb3d45f09710a698112d1 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Wed, 5 Jan 2022 22:06:46 +0530 Subject: [PATCH 115/264] Success! Fixed data saving in Individual Data --- lib/Model/FamilyMembersCommonDataModel.dart | 6 ++++- lib/Screens/FamilyHomeScreen.dart | 30 ++++++++++++++++++--- lib/Screens/FamilyMemberAdd.dart | 15 +++++------ lib/Widgets/AddRemoveBoxWidget.dart | 12 ++++----- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index daa2cd8..3c1a0e1 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -1,7 +1,8 @@ import 'dart:convert'; import 'package:geolocator/geolocator.dart'; -import 'package:objectbox/objectbox.dart'; import 'package:intl/intl.dart'; +import 'package:geo_spatial/objectbox.g.dart'; + @Entity() class FamilyMemberIndividualDataModel { @@ -97,7 +98,10 @@ class FamilyMembersCommonDataModel { String? addressThree; + @Transient() + final individualDataListTransient = []; final individualDataList = ToMany(); + String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); String? get dbLocationTopLeft { diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 0ac4151..0e13833 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -6,8 +6,7 @@ import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; - -import '../objectbox.g.dart'; +import 'package:geo_spatial/objectbox.g.dart'; import 'CollectLocationWidget.dart'; class FamilyHomeScreen extends StatefulWidget { @@ -24,12 +23,25 @@ class _FamilyHomeScreenState extends State with AutomaticKeepAliveClientMixin { var store; + + void initState(){ + super.initState(); + setState(() { + if (modelData == null) + modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); + + for(var i in modelData!.individualDataList){ + print(i); + modelData!.individualDataListTransient.add(i); + } + }); + } + @override Widget build(BuildContext context) { super.build(context); - if (modelData == null) - modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); + return WillPopScope( @@ -99,9 +111,19 @@ class _FamilyHomeScreenState extends State borderRadius: BorderRadius.circular(20), side: BorderSide(color: Colors.white)))), onPressed: () async { + + var store = await StoreInstance.getInstance(); + Box individualDataBox = store.box(); + + List i = await individualDataBox.putMany(modelData!.individualDataListTransient); + print("ID: $i"); + + modelData!.individualDataList.addAll(modelData!.individualDataListTransient); + store = await StoreInstance.getInstance(); Box box = store.box(); await box.put(modelData); + }), ), ) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 8fd71a8..a97276f 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -4,7 +4,6 @@ import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; -import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; @@ -13,7 +12,6 @@ import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:geo_spatial/Widgets/TagTextWidget.dart'; import 'package:google_fonts/google_fonts.dart'; -import '../objectbox.g.dart'; class FamilyMemberAdd extends StatefulWidget { const FamilyMemberAdd( @@ -31,11 +29,16 @@ class FamilyMemberAdd extends StatefulWidget { } class _FamilyMemberAddState extends State { + bool dailyWageWorker = false; + _onSubmit(bool isValid) { print(isValid.toString()); + setState(() { + isPageValid = isValid; + }); } - bool dailyWageWorker = false; + bool isPageValid = false; int count = 0; var vulnerabilities = { @@ -71,8 +74,7 @@ class _FamilyMemberAddState extends State { "${widget.familyMemberIndividualDataModel!.vulnerabilities} vulnerabilities"); return WillPopScope( onWillPop: () async { - //TODO: Add condition here to check if page has been filled - if (false) { + if (!isPageValid) { return true; } final result = await showDialog( @@ -727,9 +729,6 @@ class _FamilyMemberAddState extends State { ], _onSubmit, saveData: () async { - var store = await StoreInstance.getInstance(); - Box box = store.box(); - await box.put(widget.familyMemberIndividualDataModel); widget.dataModel!.individualDataList[widget.index!] = widget.familyMemberIndividualDataModel!; }, diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 7fd4b97..8144423 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -40,7 +40,7 @@ class _AddRemoveBoxWidgetState extends State { TextButton( onPressed: () { setState(() { - widget.modelData?.individualDataList + widget.modelData?.individualDataListTransient .add(FamilyMemberIndividualDataModel()); }); }, @@ -51,7 +51,7 @@ class _AddRemoveBoxWidgetState extends State { IconButton( onPressed: () { setState(() { - widget.modelData?.individualDataList + widget.modelData?.individualDataListTransient .add(FamilyMemberIndividualDataModel()); }); }, @@ -66,10 +66,10 @@ class _AddRemoveBoxWidgetState extends State { ), Container( height: MediaQuery.of(context).size.height * 0.35, - child: widget.modelData!.individualDataList.isEmpty + child: widget.modelData!.individualDataListTransient.isEmpty ? Center(child: Text('No Members Added')) : ListView.builder( - itemCount: widget.modelData!.individualDataList.length, + itemCount: widget.modelData!.individualDataListTransient.length, shrinkWrap: true, itemBuilder: (BuildContext context, int index) { return Card( @@ -79,7 +79,7 @@ class _AddRemoveBoxWidgetState extends State { Navigator.of(context).push(MaterialPageRoute( builder: (context) => FamilyMemberAdd( familyMemberIndividualDataModel: widget - .modelData!.individualDataList + .modelData!.individualDataListTransient .elementAt(index)))); }, //Pass a function which is called onSaved in the next page and add data to the class object @@ -96,7 +96,7 @@ class _AddRemoveBoxWidgetState extends State { icon: Icon(Icons.close), onPressed: () async { setState(() { - widget.modelData!.individualDataList + widget.modelData!.individualDataListTransient .removeAt(index); }); }, From a4428d610323ada999cd981d3264f1f52e0fc203 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Wed, 5 Jan 2022 22:13:43 +0530 Subject: [PATCH 116/264] FIxed logout button --- lib/Widgets/NavigationDrawer.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index 9b01179..f535d51 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -10,6 +10,7 @@ class NavigationDrawer extends StatelessWidget { @override Widget build(BuildContext context) { + return Drawer( child: Material( color: colors.darkScaffoldColor, @@ -59,7 +60,7 @@ class NavigationDrawer extends StatelessWidget { await storage.delete(key: 'jwt'); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); + (Route route) => false); }, ), ], @@ -71,7 +72,7 @@ class NavigationDrawer extends StatelessWidget { Widget buildMenuItem({ required String text, required IconData icon, - Function? onTap, + VoidCallback? onTap, }) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), @@ -85,7 +86,7 @@ class NavigationDrawer extends StatelessWidget { text, style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - onTap: onTap!(), + onTap: onTap, ), ); } From 7940dec990c38002c29ccd753f8c9995618eea2a Mon Sep 17 00:00:00 2001 From: Soorya S Date: Wed, 5 Jan 2022 22:59:01 +0530 Subject: [PATCH 117/264] Fixed stuff --- lib/Screens/EditExistingRecordsPage.dart | 10 +- lib/Screens/FamilyHomeScreen.dart | 178 +++++++++++------------ lib/Screens/Home.dart | 15 -- lib/Screens/VillageSelection.dart | 18 +-- lib/Widgets/AppBarBackButtonWidget.dart | 4 +- lib/Widgets/NavigationDrawer.dart | 4 +- 6 files changed, 107 insertions(+), 122 deletions(-) diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 1a90b7f..d4fd951 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; +import 'package:geo_spatial/Utils/Colors.dart'as colors; class EditRecordsScreen extends StatelessWidget { const EditRecordsScreen({Key? key}) : super(key: key); @@ -8,7 +9,14 @@ class EditRecordsScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBarBackButton('Edit Existing Data'), + appBar: AppBarBackButton('Edit Existing Data', actions: [IconButton( + splashRadius: 20, + icon: Icon( + Icons.search, + color: colors.darkAccentColor, + ), + onPressed: () { + })],), body: Container( child: CheckBoxAddExtraAlertDialog( onSaved: (data) { diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 0e13833..bbc4c6c 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -23,14 +23,13 @@ class _FamilyHomeScreenState extends State with AutomaticKeepAliveClientMixin { var store; - - void initState(){ + void initState() { super.initState(); setState(() { if (modelData == null) modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); - for(var i in modelData!.individualDataList){ + for (var i in modelData!.individualDataList) { print(i); modelData!.individualDataListTransient.add(i); } @@ -41,97 +40,92 @@ class _FamilyHomeScreenState extends State Widget build(BuildContext context) { super.build(context); - - - - return WillPopScope( - onWillPop: () async {Navigator.pop(context, true); return true;}, - child: Scaffold( - appBar: AppBarBackButton('Individual Data'), - backgroundColor: colors.darkScaffoldColor, - body: SafeArea( - child: Column( - children: [ - AddRemoveBoxWidget( - modelData: modelData, - ), - DataCard("\nCollect Common Details", "", "assets/svg/house.svg", - FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), - DataCard( - "Record GPS Data", - "Make sure GPS is enabled", - "assets/svg/map.svg", - CollectLocationWidget(modelData: modelData), - Color(0xfff54b64), - Color(0xfff78361)), - Padding( - padding: EdgeInsets.only( - bottom: 10.0, left: 10.0, right: 10.0, top: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: EdgeInsets.only(left: 10, right: 10), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.4, - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkSecondBackgroundColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors - .darkSecondBackgroundColor)))), - onPressed: () {}), - ), + return Scaffold( + appBar: AppBarBackButton('Individual Data'), + backgroundColor: colors.darkScaffoldColor, + body: SafeArea( + child: Column( + children: [ + AddRemoveBoxWidget( + modelData: modelData, + ), + DataCard("\nCollect Common Details", "", "assets/svg/house.svg", + FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), + DataCard( + "Record GPS Data", + "Make sure GPS is enabled", + "assets/svg/map.svg", + CollectLocationWidget(modelData: modelData), + Color(0xfff54b64), + Color(0xfff78361)), + Padding( + padding: EdgeInsets.only( + bottom: 10.0, left: 10.0, right: 10.0, top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.4, + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkSecondBackgroundColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () {}), ), - Padding( - padding: EdgeInsets.only( - left: 10, right: 10, top: 5, bottom: 10), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.4, - child: ElevatedButton( - child: Text("Save", - style: - TextStyle(fontSize: 14, color: Colors.black)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - Colors.white), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.white)))), - onPressed: () async { - - var store = await StoreInstance.getInstance(); - Box individualDataBox = store.box(); - - List i = await individualDataBox.putMany(modelData!.individualDataListTransient); - print("ID: $i"); - - modelData!.individualDataList.addAll(modelData!.individualDataListTransient); - - store = await StoreInstance.getInstance(); - Box box = store.box(); - await box.put(modelData); - - }), - ), - ) - ], - ), + ), + Padding( + padding: EdgeInsets.only( + left: 10, right: 10, top: 5, bottom: 10), + child: SizedBox( + width: MediaQuery.of(context).size.width * 0.4, + child: ElevatedButton( + child: Text("Save", + style: + TextStyle(fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + Colors.white), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white)))), + onPressed: () async { + var store = await StoreInstance.getInstance(); + Box individualDataBox = + store.box(); + + List i = await individualDataBox.putMany( + modelData!.individualDataListTransient); + print("ID: $i"); + + modelData!.individualDataList + .addAll(modelData!.individualDataListTransient); + + store = await StoreInstance.getInstance(); + Box box = store.box(); + await box.put(modelData); + }), + ), + ) + ], ), - ], - ), + ), + ], ), ), ); diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 8054544..e677dde 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -37,21 +37,6 @@ class _HomeWidgetState extends State { fontSize: 18, color: colors.darkPrimaryTextColor), ), backgroundColor: Colors.transparent, - actions: [ - IconButton( - splashRadius: 20, - icon: Icon( - Icons.person, - color: colors.darkAccentColor, - ), - onPressed: () async { - await storage.delete(key: 'jwt'); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); - }, - ) - ], ), body: SafeArea( child: Column( diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index d2b309b..81b17aa 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -21,21 +21,15 @@ class VillageSelectionScreen extends StatefulWidget { class _VillageSelectionScreenState extends State { - void refreshData(){ - widget.isGenerated = false; - } - FutureOr onGoBack(dynamic value){ - refreshData(); - setState(() {}); - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => - Home())); + initState(){ + super.initState(); + widget.isGenerated = false; } - @override Widget build(BuildContext context) { + return Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Generate UID'), @@ -129,9 +123,9 @@ class _VillageSelectionScreenState extends State { color: colors.darkScaffoldColor)))), onPressed: () { - Navigator.of(context).push(MaterialPageRoute( + Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => - FamilyHomeScreen())).then(onGoBack); + FamilyHomeScreen())); }, icon: Icon(Icons.arrow_right_alt_sharp), ), diff --git a/lib/Widgets/AppBarBackButtonWidget.dart b/lib/Widgets/AppBarBackButtonWidget.dart index 03a72da..b1aae77 100644 --- a/lib/Widgets/AppBarBackButtonWidget.dart +++ b/lib/Widgets/AppBarBackButtonWidget.dart @@ -4,9 +4,10 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart'as colors; class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { - const AppBarBackButton(this.title); + const AppBarBackButton(this.title, {this.actions}); final String title; + final List? actions; @override Size get preferredSize => const Size.fromHeight(kToolbarHeight); @@ -35,6 +36,7 @@ class AppBarBackButton extends StatelessWidget implements PreferredSizeWidget { Navigator.pop(context); }), elevation: 0, + actions: actions ?? [], centerTitle: true, title: Text( title, diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index f535d51..7f0374c 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -40,7 +40,9 @@ class NavigationDrawer extends StatelessWidget { GoogleFonts.poppins(color: colors.darkSecondaryTextColor), ), ), - buildMenuItem(text: 'Home', icon: Icons.home, onTap: () {}), + buildMenuItem(text: 'Home', icon: Icons.home, onTap: () { + Navigator.of(context).pop(); + }), buildMenuItem(text: 'Profile', icon: Icons.person, onTap: () {}), Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), From 688e36552f917a55abef787ae2d25d75b415bd8e Mon Sep 17 00:00:00 2001 From: Soorya S Date: Thu, 6 Jan 2022 00:03:06 +0530 Subject: [PATCH 118/264] Added search bar in editing records page --- lib/Screens/EditExistingRecordsPage.dart | 128 +++++++++++++++++++---- lib/Screens/FamilyMemberEdit.dart | 15 --- 2 files changed, 108 insertions(+), 35 deletions(-) delete mode 100644 lib/Screens/FamilyMemberEdit.dart diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index d4fd951..5dc73a4 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -1,32 +1,120 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; -import 'package:geo_spatial/Utils/Colors.dart'as colors; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:google_fonts/google_fonts.dart'; -class EditRecordsScreen extends StatelessWidget { +class EditRecordsScreen extends StatefulWidget { const EditRecordsScreen({Key? key}) : super(key: key); + @override + State createState() => _EditRecordsScreenState(); +} + +class _EditRecordsScreenState extends State { + bool isSearchOpen = false; + TextEditingController _textEditingController = new TextEditingController(); + + List _dataList = ["ONE", "TWO", "THREE"]; + late List _searchList; + + initState() { + super.initState(); + _searchList = _dataList; + } + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBarBackButton('Edit Existing Data', actions: [IconButton( - splashRadius: 20, - icon: Icon( - Icons.search, - color: colors.darkAccentColor, + appBar: AppBarBackButton( + 'Edit Existing Data', + actions: [ + IconButton( + splashRadius: 20, + icon: Icon( + Icons.search, + color: colors.darkAccentColor, + ), + onPressed: () { + setState(() { + isSearchOpen = !isSearchOpen; + _searchList = _dataList; + }); + }) + ], + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Visibility( + visible: isSearchOpen, + child: Padding( + padding: + EdgeInsets.only(top: 10, left: 15, right: 15, bottom: 10), + child: TextField( + onChanged: (text) { + print("INVOKED"); + setState(() { + _searchList = _dataList + .where( + (i) => i.toLowerCase().contains(text.toLowerCase())) + .toList(); + }); + }, + controller: _textEditingController, + style: TextStyle(color: Colors.white), + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, width: 1.0)), + contentPadding: EdgeInsets.only(left: 10, right: 10), + fillColor: colors.darkSecondBackgroundColor, + prefixIcon: Icon(Icons.search), + // suffixIcon: Material( + // borderRadius: BorderRadius.only( + // topRight: Radius.circular(4), + // bottomRight: Radius.circular(4)), + // child: IconButton( + // splashRadius: 16, + // icon: Icon( + // Icons.clear, + // color: colors.darkSecondAccentColor, + // ), + // onPressed: () { + // _textEditingController.text = ""; + // }, + // ), + // ), + label: Text( + "Search", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Search for records..."), + ), + ), ), - onPressed: () { - })],), - body: Container( - child: CheckBoxAddExtraAlertDialog( - onSaved: (data) { - }, - context: context, - showAddNewBox: true, //show or hide textbox to add new field - title: "Title", - hint: "hey", - dataMap: {"One": false, "Two": false}, - ), + ListView.builder( + itemCount: _searchList.length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Card( + color: colors.darkSecondBackgroundColor, + //TODO: Replace with better ListTile + child: ListTile( + onTap: () {}, + //Pass a function which is called onSaved in the next page and add data to the class object + leading: Icon(Icons.person), + title: Text( + _searchList[index], + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + ), + ); + }) + ], ), ); } diff --git a/lib/Screens/FamilyMemberEdit.dart b/lib/Screens/FamilyMemberEdit.dart deleted file mode 100644 index a192958..0000000 --- a/lib/Screens/FamilyMemberEdit.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; - -class FamilyMemberEdit extends StatefulWidget { - const FamilyMemberEdit({Key? key}) : super(key: key); - - @override - _FamilyMemberEditState createState() => _FamilyMemberEditState(); -} - -class _FamilyMemberEditState extends State { - @override - Widget build(BuildContext context) { - return Container(); - } -} From 5e1c91e9dbd3ee623803f6c4af00486e6d739815 Mon Sep 17 00:00:00 2001 From: Soorya S Date: Thu, 6 Jan 2022 00:03:50 +0530 Subject: [PATCH 119/264] Added search bar in editing records page --- lib/Screens/EditExistingRecordsPage.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 5dc73a4..63f87b6 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -103,7 +103,6 @@ class _EditRecordsScreenState extends State { child: ListTile( onTap: () {}, //Pass a function which is called onSaved in the next page and add data to the class object - leading: Icon(Icons.person), title: Text( _searchList[index], style: GoogleFonts.poppins( From 4746451ff274a22095e5582d02b64ebd19d9d681 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 10:16:03 +0530 Subject: [PATCH 120/264] Added all data fields to family common details --- lib/Model/FamilyMembersCommonDataModel.dart | 82 ++++- lib/Screens/FamilyDetails.dart | 330 +++++++++++++------- lib/Screens/FamilyHomeScreen.dart | 2 +- lib/Screens/FamilyMemberAdd.dart | 5 +- lib/Widgets/CheckBoxAlertDialog.dart | 10 +- lib/objectbox-model.json | 45 ++- lib/objectbox.g.dart | 146 +++++++-- 7 files changed, 471 insertions(+), 149 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 3c1a0e1..831a890 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -1,8 +1,7 @@ import 'dart:convert'; import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; -import 'package:geo_spatial/objectbox.g.dart'; - +import 'package:objectbox/objectbox.dart'; @Entity() class FamilyMemberIndividualDataModel { @@ -55,7 +54,7 @@ class FamilyMemberIndividualDataModel { } String? get dbOccupation => - occupation == null ? null : json.encode(vulnerabilities); + occupation == null ? null : json.encode(occupation); set dbOccupation(String? value) { if (value == null) { @@ -85,6 +84,7 @@ class FamilyMembersCommonDataModel { String? noOfFourWheelers; Map? twoThreeWheelManufacturer; Map? twoFourManufacturer; + Map? localFoodMap; String? isCattleOwned; String? incomeFromCattle; String? isFarmLandOwned; @@ -95,8 +95,7 @@ class FamilyMembersCommonDataModel { Map? kitchenGardenPlants; String? addressOne; String? addressTwo; - String? addressThree; - + String? city; @Transient() final individualDataListTransient = []; @@ -213,6 +212,79 @@ class FamilyMembersCommonDataModel { } } + String? get dbTwoThreeWheelManufacturer => twoThreeWheelManufacturer == null + ? null + : json.encode(twoThreeWheelManufacturer); + + set dbTwoThreeWheelManufacturer(String? value) { + if (value == null) { + twoThreeWheelManufacturer = null; + } else { + twoThreeWheelManufacturer = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbTwoFourManufacturer => + twoFourManufacturer == null ? null : json.encode(twoFourManufacturer); + + set dbTwoFourManufacturer(String? value) { + if (value == null) { + twoFourManufacturer = null; + } else { + twoFourManufacturer = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbLocalFoodMap => + localFoodMap == null ? null : json.encode(localFoodMap); + + set dbLocalFoodMap(String? value) { + if (value == null) { + localFoodMap = null; + } else { + localFoodMap = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbPreservedSeedsMap => + preservedSeedsMap == null ? null : json.encode(preservedSeedsMap); + + set dbPreservedSeedsMap(String? value) { + if (value == null) { + preservedSeedsMap = null; + } else { + preservedSeedsMap = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbTreesOwnedMap => + treesOwnedMap == null ? null : json.encode(treesOwnedMap); + + set dbTreesOwnedMap(String? value) { + if (value == null) { + treesOwnedMap = null; + } else { + treesOwnedMap = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbKitchenGardenPlants => + kitchenGardenPlants == null ? null : json.encode(kitchenGardenPlants); + + set dbKitchenGardenPlants(String? value) { + if (value == null) { + kitchenGardenPlants = null; + } else { + kitchenGardenPlants = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + FamilyMembersCommonDataModel({ //this.keys, this.locationBottomLeft, diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index e5ddd11..4f7392d 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; @@ -9,7 +10,8 @@ import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:google_fonts/google_fonts.dart'; class FamilyDetails extends StatefulWidget { - const FamilyDetails({Key? key}) : super(key: key); + const FamilyDetails({Key? key, this.modelData}) : super(key: key); + final FamilyMembersCommonDataModel? modelData; @override State createState() => _FamilyDetailsState(); @@ -89,7 +91,7 @@ class _FamilyDetailsState extends State { } final result = await showDialog( context: context, - builder: (context) => AlertDialog( + builder: (context) => AlertDialog( title: Text("Are you sure?"), content: Text("All unsaved changes would be lost"), actions: [ @@ -123,10 +125,17 @@ class _FamilyDetailsState extends State { Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have drinking water available?"), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.drinkingWater, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.drinkingWater = val; + }, + title: "Do you have drinking water available?"), DropDownFormField( list: [ 'None', @@ -138,51 +147,100 @@ class _FamilyDetailsState extends State { 'Water supply', 'Lorry/Van' ], + defaultValue: widget.modelData!.sourceOfDrinkingWater, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.sourceOfDrinkingWater = val; + }, hint: "Select source", title: "Source of Water", errorField: "Please choose an option", ), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you have toilet facilities?"), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "If not toilet, community toilet?"), - OptionsWidget(options: [ - ['Clean', 'clean'], - ['Unclean', 'unclean'] - ], title: "Environmental sanitation level: "), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.toiletFacility, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.toiletFacility = val; + }, + title: "Do you have toilet facilities?"), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.communityToilet, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.communityToilet = val; + }, + title: "If not toilet, community toilet?"), + OptionsWidget( + options: [ + ['Clean', 'clean'], + ['Unclean', 'unclean'] + ], + defaultValue: + widget.modelData!.environmentSanitationLevel, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.environmentSanitationLevel = + val; + }, + title: "Environmental sanitation level: "), ], ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Is running water available?"), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: + widget.modelData!.runningWaterAvailable, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.runningWaterAvailable = val; + }, + title: "Is running water available?"), DropDownFormField( list: ['1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No of two wheelers", + defaultValue: widget.modelData!.noOfTwoWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfTwoWheelers = val; + }, errorField: "Please choose a valid number", ), DropDownFormField( list: ['1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No of three wheelers", + defaultValue: widget.modelData!.noOfThreeWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfThreeWheelers = val; + }, errorField: "Please choose a valid number", ), CheckBoxAlertDialog( title: 'Two/Three wheeler manufacturer', hint: 'Please choose manufacturers', - dataMap: two_three_mfg, singleOption: false, context: context, - onSaved: (map) { - print(map); + dataMap: + widget.modelData!.twoThreeWheelManufacturer ?? + two_three_mfg, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.twoThreeWheelManufacturer = val; }, errorField: "Please choose a manufacturer", autoValidateMode: AutovalidateMode.onUserInteraction, @@ -192,6 +250,11 @@ class _FamilyDetailsState extends State { hint: "Select the highest", title: "No of four wheelers", errorField: "Please choose a valid number", + defaultValue: widget.modelData!.noOfFourWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfFourWheelers = val; + }, ), ], ), @@ -201,23 +264,37 @@ class _FamilyDetailsState extends State { CheckBoxAlertDialog( title: 'Four wheeler manufacturer', hint: 'Please choose manufacturers', - dataMap: four_mfg, singleOption: false, context: context, - onSaved: (map) { - print(map); + dataMap: + widget.modelData!.twoFourManufacturer ?? four_mfg, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.twoFourManufacturer = val; }, errorField: "Please choose a manufacturer", autoValidateMode: AutovalidateMode.onUserInteraction, ), - OptionsWidget(options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], title: "Do you own cattle?"), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.isCattleOwned, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isCattleOwned = val; + }, + title: "Do you own cattle?"), Padding( padding: const EdgeInsets.only( left: 10.0, right: 10.0, top: 20.0), child: TextFormField( + initialValue: widget.modelData!.incomeFromCattle, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.incomeFromCattle = val; + }, decoration: InputDecoration( hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), @@ -237,6 +314,11 @@ class _FamilyDetailsState extends State { ['Yes', 'yes'], ['No', 'no'] ], + defaultValue: widget.modelData!.isFarmLandOwned, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isFarmLandOwned = val; + }, title: "Do you own farmland?", ), OptionsWidget( @@ -244,6 +326,11 @@ class _FamilyDetailsState extends State { ['Yes', 'yes'], ['No', 'no'] ], + defaultValue: widget.modelData!.isSeedsPreserved, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isSeedsPreserved = val; + }, title: "Do you preserve seeds?", ), ], @@ -255,32 +342,39 @@ class _FamilyDetailsState extends State { CheckBoxAddExtraAlertDialog( title: 'Seeds Preserved', hint: 'Choose preserved seeds', - dataMap: seeds_preserved, singleOption: false, context: context, - onSaved: (map) { - print(map); + dataMap: widget.modelData!.preservedSeedsMap ?? + seeds_preserved, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.preservedSeedsMap = val; }, ), CheckBoxAddExtraAlertDialog( title: 'Trees owned', hint: 'Choose trees owned', - dataMap: trees_owned, singleOption: false, context: context, - onSaved: (map) { - print(map); + dataMap: + widget.modelData!.treesOwnedMap ?? trees_owned, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.treesOwnedMap = val; }, ), CheckBoxAddExtraAlertDialog( title: 'Choose resource', hint: 'Choose your resource', - dataMap: local_food, + //TODO: Change variable to local foood + + dataMap: widget.modelData!.localFoodMap ?? local_food, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.localFoodMap = val; + }, singleOption: false, context: context, - onSaved: (map) { - print(map); - }, ), //TODO: Add autosuggest text widget for locally consumed food @@ -290,6 +384,11 @@ class _FamilyDetailsState extends State { ['Yes', 'yes'], ['No', 'no'] ], + defaultValue: widget.modelData!.isKitchenGardenOwned, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isKitchenGardenOwned = val; + }, title: "Do you have a kitchen garden?", ), ], @@ -300,83 +399,104 @@ class _FamilyDetailsState extends State { CheckBoxAddExtraAlertDialog( title: 'Kitchen Garden plants', hint: 'Choose garden plants', - dataMap: garden_plants, singleOption: false, context: context, - onSaved: (map) { - print(map); + dataMap: widget.modelData!.kitchenGardenPlants ?? + garden_plants, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.kitchenGardenPlants = val; }, ), //TODO: Add autosuggest text widget for kitchen garden crops Column( mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Align( - alignment: Alignment.topLeft, - child: Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 15.0), - child: Text( - "Address", - style: GoogleFonts.montserrat( - fontSize: 15.0, - color: colors.darkPrimaryTextColor), - ), - ), + children: [ + Align( + alignment: Alignment.topLeft, + child: Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 15.0), + child: Text( + "Address", + style: GoogleFonts.montserrat( + fontSize: 15.0, + color: colors.darkPrimaryTextColor), ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - decoration: InputDecoration( - label: Text( - "First Line", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter first line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter First Line"; - } - }, + ), + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + initialValue: widget.modelData!.addressOne, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.addressOne = val; + }, + decoration: InputDecoration( + label: Text( + "First Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), + hintText: "Please enter first line", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - decoration: InputDecoration( - label: Text( - "Second Line", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter second line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), + validator: (value) { + if (value == "") { + return "Enter First Line"; + } + }, + ), + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + initialValue: widget.modelData!.addressTwo, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.addressTwo = val; + }, + decoration: InputDecoration( + label: Text( + "Second Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), + hintText: "Please enter second line", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - decoration: InputDecoration( - label: Text( - "City", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter city", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), + ), + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + initialValue: widget.modelData!.city, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.city = val; + }, + decoration: InputDecoration( + label: Text( + "City", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), + hintText: "Please enter city", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - ], + ), + ), + ], ), ], ) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index bbc4c6c..1f09e98 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -50,7 +50,7 @@ class _FamilyHomeScreenState extends State modelData: modelData, ), DataCard("\nCollect Common Details", "", "assets/svg/house.svg", - FamilyDetails(), Color(0xfff54b64), Color(0xfff78361)), + FamilyDetails(modelData: modelData,), Color(0xfff54b64), Color(0xfff78361)), DataCard( "Record GPS Data", "Make sure GPS is enabled", diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index a97276f..1b9e60d 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -729,8 +729,9 @@ class _FamilyMemberAddState extends State { ], _onSubmit, saveData: () async { - widget.dataModel!.individualDataList[widget.index!] = - widget.familyMemberIndividualDataModel!; + // print(widget.dataModel); + // widget.dataModel!.individualDataList[widget.index!] = + // widget.familyMemberIndividualDataModel!; }, ), ), diff --git a/lib/Widgets/CheckBoxAlertDialog.dart b/lib/Widgets/CheckBoxAlertDialog.dart index 9bd3426..af31e3d 100644 --- a/lib/Widgets/CheckBoxAlertDialog.dart +++ b/lib/Widgets/CheckBoxAlertDialog.dart @@ -23,13 +23,13 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; ), */ -class CheckBoxAlertDialog extends FormField { +class CheckBoxAlertDialog extends FormField> { CheckBoxAlertDialog( - {FormFieldSetter? onSaved, - FormFieldValidator? validator, + {FormFieldSetter>? onSaved, + FormFieldValidator>? validator, required title, required hint, - required Map dataMap, + required Map dataMap, errorField, singleOption = false, required context, @@ -50,7 +50,7 @@ class CheckBoxAlertDialog extends FormField { }, initialValue: dataMap, autovalidateMode: autoValidateMode, - builder: (FormFieldState state) { + builder: (FormFieldState> state) { getDisplayOptions() { if (state.hasError) { return Text( diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 508c7ac..bfd2afb 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -218,7 +218,7 @@ }, { "id": "3:5004688671325240296", - "lastPropertyId": "23:6516827898200627863", + "lastPropertyId": "30:4709957910567293326", "name": "FamilyMembersCommonDataModel", "properties": [ { @@ -307,11 +307,6 @@ "name": "addressTwo", "type": 9 }, - { - "id": "18:5524724872707357697", - "name": "addressThree", - "type": 9 - }, { "id": "19:1423273990910471875", "name": "savedTime", @@ -336,6 +331,41 @@ "id": "23:6516827898200627863", "name": "dbLocationBottomRight", "type": 9 + }, + { + "id": "24:614476397339919731", + "name": "city", + "type": 9 + }, + { + "id": "25:6573872590519653208", + "name": "dbTwoThreeWheelManufacturer", + "type": 9 + }, + { + "id": "26:697696816698768514", + "name": "dbTwoFourManufacturer", + "type": 9 + }, + { + "id": "27:4321042013916961622", + "name": "dbLocalFoodMap", + "type": 9 + }, + { + "id": "28:5736085922745483974", + "name": "dbPreservedSeedsMap", + "type": 9 + }, + { + "id": "29:8804761426863292202", + "name": "dbTreesOwnedMap", + "type": 9 + }, + { + "id": "30:4709957910567293326", + "name": "dbKitchenGardenPlants", + "type": 9 } ], "relations": [ @@ -358,7 +388,8 @@ 7346081088137941172 ], "retiredPropertyUids": [ - 1969777098633351831 + 1969777098633351831, + 5524724872707357697 ], "retiredRelationUids": [], "version": 1 diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index e24474d..b905ab0 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -231,7 +231,7 @@ final _entities = [ ModelEntity( id: const IdUid(3, 5004688671325240296), name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(23, 6516827898200627863), + lastPropertyId: const IdUid(30, 4709957910567293326), flags: 0, properties: [ ModelProperty( @@ -319,11 +319,6 @@ final _entities = [ name: 'addressTwo', type: 9, flags: 0), - ModelProperty( - id: const IdUid(18, 5524724872707357697), - name: 'addressThree', - type: 9, - flags: 0), ModelProperty( id: const IdUid(19, 1423273990910471875), name: 'savedTime', @@ -348,6 +343,41 @@ final _entities = [ id: const IdUid(23, 6516827898200627863), name: 'dbLocationBottomRight', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(24, 614476397339919731), + name: 'city', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(25, 6573872590519653208), + name: 'dbTwoThreeWheelManufacturer', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(26, 697696816698768514), + name: 'dbTwoFourManufacturer', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(27, 4321042013916961622), + name: 'dbLocalFoodMap', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(28, 5736085922745483974), + name: 'dbPreservedSeedsMap', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(29, 8804761426863292202), + name: 'dbTreesOwnedMap', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(30, 4709957910567293326), + name: 'dbKitchenGardenPlants', + type: 9, flags: 0) ], relations: [ @@ -385,7 +415,7 @@ ModelDefinition getObjectBoxModel() { lastSequenceId: const IdUid(0, 0), retiredEntityUids: const [], retiredIndexUids: const [7346081088137941172], - retiredPropertyUids: const [1969777098633351831], + retiredPropertyUids: const [1969777098633351831, 5524724872707357697], retiredRelationUids: const [], modelVersion: 5, modelVersionParserMinimum: 5, @@ -749,9 +779,6 @@ ModelDefinition getObjectBoxModel() { final addressTwoOffset = object.addressTwo == null ? null : fbb.writeString(object.addressTwo!); - final addressThreeOffset = object.addressThree == null - ? null - : fbb.writeString(object.addressThree!); final savedTimeOffset = object.savedTime == null ? null : fbb.writeString(object.savedTime!); @@ -768,7 +795,30 @@ ModelDefinition getObjectBoxModel() { object.dbLocationBottomRight == null ? null : fbb.writeString(object.dbLocationBottomRight!); - fbb.startTable(24); + final cityOffset = + object.city == null ? null : fbb.writeString(object.city!); + final dbTwoThreeWheelManufacturerOffset = + object.dbTwoThreeWheelManufacturer == null + ? null + : fbb.writeString(object.dbTwoThreeWheelManufacturer!); + final dbTwoFourManufacturerOffset = + object.dbTwoFourManufacturer == null + ? null + : fbb.writeString(object.dbTwoFourManufacturer!); + final dbLocalFoodMapOffset = object.dbLocalFoodMap == null + ? null + : fbb.writeString(object.dbLocalFoodMap!); + final dbPreservedSeedsMapOffset = object.dbPreservedSeedsMap == null + ? null + : fbb.writeString(object.dbPreservedSeedsMap!); + final dbTreesOwnedMapOffset = object.dbTreesOwnedMap == null + ? null + : fbb.writeString(object.dbTreesOwnedMap!); + final dbKitchenGardenPlantsOffset = + object.dbKitchenGardenPlants == null + ? null + : fbb.writeString(object.dbKitchenGardenPlants!); + fbb.startTable(31); fbb.addInt64(0, object.id); fbb.addOffset(1, drinkingWaterOffset); fbb.addOffset(2, sourceOfDrinkingWaterOffset); @@ -786,12 +836,18 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(14, isKitchenGardenOwnedOffset); fbb.addOffset(15, addressOneOffset); fbb.addOffset(16, addressTwoOffset); - fbb.addOffset(17, addressThreeOffset); fbb.addOffset(18, savedTimeOffset); fbb.addOffset(19, dbLocationTopLeftOffset); fbb.addOffset(20, dbLocationTopRightOffset); fbb.addOffset(21, dbLocationBottomLeftOffset); fbb.addOffset(22, dbLocationBottomRightOffset); + fbb.addOffset(23, cityOffset); + fbb.addOffset(24, dbTwoThreeWheelManufacturerOffset); + fbb.addOffset(25, dbTwoFourManufacturerOffset); + fbb.addOffset(26, dbLocalFoodMapOffset); + fbb.addOffset(27, dbPreservedSeedsMapOffset); + fbb.addOffset(28, dbTreesOwnedMapOffset); + fbb.addOffset(29, dbKitchenGardenPlantsOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -833,8 +889,6 @@ ModelDefinition getObjectBoxModel() { .vTableGetNullable(buffer, rootOffset, 34) ..addressTwo = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 36) - ..addressThree = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 38) ..savedTime = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 40) ..dbLocationTopLeft = const fb.StringReader() @@ -844,7 +898,21 @@ ModelDefinition getObjectBoxModel() { ..dbLocationBottomLeft = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 46) ..dbLocationBottomRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 48); + .vTableGetNullable(buffer, rootOffset, 48) + ..city = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 50) + ..dbTwoThreeWheelManufacturer = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 52) + ..dbTwoFourManufacturer = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 54) + ..dbLocalFoodMap = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 56) + ..dbPreservedSeedsMap = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 58) + ..dbTreesOwnedMap = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 60) + ..dbKitchenGardenPlants = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 62); InternalToManyAccess.setRelInfo( object.individualDataList, store, @@ -1128,33 +1196,63 @@ class FamilyMembersCommonDataModel_ { static final addressTwo = QueryStringProperty( _entities[2].properties[16]); - /// see [FamilyMembersCommonDataModel.addressThree] - static final addressThree = QueryStringProperty( - _entities[2].properties[17]); - /// see [FamilyMembersCommonDataModel.savedTime] static final savedTime = QueryStringProperty( - _entities[2].properties[18]); + _entities[2].properties[17]); /// see [FamilyMembersCommonDataModel.dbLocationTopLeft] static final dbLocationTopLeft = QueryStringProperty( - _entities[2].properties[19]); + _entities[2].properties[18]); /// see [FamilyMembersCommonDataModel.dbLocationTopRight] static final dbLocationTopRight = QueryStringProperty( - _entities[2].properties[20]); + _entities[2].properties[19]); /// see [FamilyMembersCommonDataModel.dbLocationBottomLeft] static final dbLocationBottomLeft = QueryStringProperty( - _entities[2].properties[21]); + _entities[2].properties[20]); /// see [FamilyMembersCommonDataModel.dbLocationBottomRight] static final dbLocationBottomRight = QueryStringProperty( - _entities[2].properties[22]); + _entities[2].properties[21]); + + /// see [FamilyMembersCommonDataModel.city] + static final city = QueryStringProperty( + _entities[2].properties[22]); + + /// see [FamilyMembersCommonDataModel.dbTwoThreeWheelManufacturer] + static final dbTwoThreeWheelManufacturer = + QueryStringProperty( + _entities[2].properties[23]); + + /// see [FamilyMembersCommonDataModel.dbTwoFourManufacturer] + static final dbTwoFourManufacturer = + QueryStringProperty( + _entities[2].properties[24]); + + /// see [FamilyMembersCommonDataModel.dbLocalFoodMap] + static final dbLocalFoodMap = + QueryStringProperty( + _entities[2].properties[25]); + + /// see [FamilyMembersCommonDataModel.dbPreservedSeedsMap] + static final dbPreservedSeedsMap = + QueryStringProperty( + _entities[2].properties[26]); + + /// see [FamilyMembersCommonDataModel.dbTreesOwnedMap] + static final dbTreesOwnedMap = + QueryStringProperty( + _entities[2].properties[27]); + + /// see [FamilyMembersCommonDataModel.dbKitchenGardenPlants] + static final dbKitchenGardenPlants = + QueryStringProperty( + _entities[2].properties[28]); /// see [FamilyMembersCommonDataModel.individualDataList] static final individualDataList = QueryRelationToMany< From f598b85ecd1b5af0efe028b931cb5ee58e951a5d Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 12:16:37 +0530 Subject: [PATCH 121/264] Profile page - WIP --- assets/profile_background.png | Bin 0 -> 12230 bytes assets/svg/profile_bg.svg | 11 +++++ lib/Screens/ProfilePage.dart | 90 +++++++++++++++++++++++++++------- lib/main.dart | 4 +- 4 files changed, 86 insertions(+), 19 deletions(-) create mode 100644 assets/profile_background.png create mode 100644 assets/svg/profile_bg.svg diff --git a/assets/profile_background.png b/assets/profile_background.png new file mode 100644 index 0000000000000000000000000000000000000000..d97fc772677a1e9e0e635da049c357da3793cf9a GIT binary patch literal 12230 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 literal 0 HcmV?d00001 diff --git a/assets/svg/profile_bg.svg b/assets/svg/profile_bg.svg new file mode 100644 index 0000000..47c56aa --- /dev/null +++ b/assets/svg/profile_bg.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 3b03205..1000f77 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -1,29 +1,83 @@ import 'package:flutter/material.dart'; -import 'package:google_fonts/google_fonts.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; - +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:google_fonts/google_fonts.dart'; class ProfilePage extends StatelessWidget { - const ProfilePage({Key? key}) : super(key: key); - @override Widget build(BuildContext context) { return Scaffold( - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - height: MediaQuery.of(context).size.height*0.3, - ), - Container( - height: MediaQuery.of(context).size.height*0.1, - ), - Text("Name goes here"), - Text("Username in smaller, less bright text"), - ], - ), + body: Stack(children: [ + SvgPicture.asset( + 'assets/svg/profile_bg.svg', + alignment: Alignment.center, + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppBarBackButton('Profile'), + SizedBox( + height: MediaQuery.of(context).size.height * 0.08, + ), + Center( + child: Column( + children: [ + Image(image: AssetImage("assets/avatar_woman.png")), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Text( + globals.Name, + style: GoogleFonts.poppins(fontSize: 20), + ), + ), + Text( + '@' + globals.userName, + style: GoogleFonts.poppins( + fontSize: 15, color: colors.darkSecondaryTextColor), + textAlign: TextAlign.start, + ), + ], + ), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20.0, vertical: 40.0), + child: Row( + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor.withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + }, + child: Text( + 'Change\nPassword', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 40), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Joined on: '), + Text('Records collected: '), + ], + ), + ) + ], + ), + ]), ); } } diff --git a/lib/main.dart b/lib/main.dart index 2f39c71..1a7b02e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:geo_spatial/Screens/Login.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Home.dart'; import 'package:flutter/services.dart'; +import 'package:geo_spatial/Screens/ProfilePage.dart'; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/LoadValidPageWidget.dart'; @@ -14,7 +15,8 @@ void main() { [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); runApp(MaterialApp( - home: LoadValidPageWidget(Login(), Home()), + home: ProfilePage(), + //LoadValidPageWidget(Login(), Home()), debugShowCheckedModeBanner: false, theme: darkTheme.DarkTheme )); From bcf753b1ae0c1e2127512442d0e76b4d57c00fd3 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 12:47:29 +0530 Subject: [PATCH 122/264] Completed ProfilePage.dart --- lib/Screens/ProfilePage.dart | 38 +++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 1000f77..4afc99b 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -47,6 +48,7 @@ class ProfilePage extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 40.0), child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ ElevatedButton( style: ElevatedButton.styleFrom( @@ -62,16 +64,46 @@ class ProfilePage extends StatelessWidget { textAlign: TextAlign.center, ), ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor.withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + }, + child: Text( + 'Change\nUsername', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), + ), ], ), ), Padding( padding: EdgeInsets.symmetric(horizontal: 40), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text('Joined on: '), - Text('Records collected: '), + Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Container( + padding: EdgeInsets.only(top: 15,left: 20.0), + decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(20)),color: Color(0xff34344B)), + height: 50, + width: MediaQuery.of(context).size.width*0.8, + child: Text('Joined on: '), + ), + ), + Container( + padding: EdgeInsets.only(top: 15,left: 20.0), + width: MediaQuery.of(context).size.width*0.8, + decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(20)),color: Color(0xff34344B)), + height: 50, + child: Text('Records collected: '), + ) + ], ), ) From 20f8948dd916d93d6b48b1e7c95305965e83182c Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 12:50:59 +0530 Subject: [PATCH 123/264] ProfilePage.dart improvements --- lib/Screens/ProfilePage.dart | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 4afc99b..f8741be 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; @@ -20,7 +21,22 @@ class ProfilePage extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - AppBarBackButton('Profile'), + AppBarBackButton( + 'Profile', + actions: [ + IconButton( + onPressed: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false); + }, + icon: Icon( + Icons.logout, + color: colors.darkAccentColor, + )) + ], + ), SizedBox( height: MediaQuery.of(context).size.height * 0.08, ), @@ -89,21 +105,24 @@ class ProfilePage extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 20), child: Container( - padding: EdgeInsets.only(top: 15,left: 20.0), - decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(20)),color: Color(0xff34344B)), + padding: EdgeInsets.only(top: 15, left: 20.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20)), + color: Color(0xff34344B)), height: 50, - width: MediaQuery.of(context).size.width*0.8, + width: MediaQuery.of(context).size.width * 0.8, child: Text('Joined on: '), ), ), Container( - padding: EdgeInsets.only(top: 15,left: 20.0), - width: MediaQuery.of(context).size.width*0.8, - decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(20)),color: Color(0xff34344B)), + padding: EdgeInsets.only(top: 15, left: 20.0), + width: MediaQuery.of(context).size.width * 0.8, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20)), + color: Color(0xff34344B)), height: 50, child: Text('Records collected: '), ) - ], ), ) From 3f8b858bf5e982df0de50e83deb96dc939692952 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 14:01:57 +0530 Subject: [PATCH 124/264] Attached profilepage to sidebar --- lib/Widgets/NavigationDrawer.dart | 21 +++++++++++++++------ lib/main.dart | 3 +-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index 7f0374c..607aca2 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/Login.dart'; +import 'package:geo_spatial/Screens/ProfilePage.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:google_fonts/google_fonts.dart'; @@ -10,7 +11,6 @@ class NavigationDrawer extends StatelessWidget { @override Widget build(BuildContext context) { - return Drawer( child: Material( color: colors.darkScaffoldColor, @@ -40,10 +40,19 @@ class NavigationDrawer extends StatelessWidget { GoogleFonts.poppins(color: colors.darkSecondaryTextColor), ), ), - buildMenuItem(text: 'Home', icon: Icons.home, onTap: () { - Navigator.of(context).pop(); - }), - buildMenuItem(text: 'Profile', icon: Icons.person, onTap: () {}), + buildMenuItem( + text: 'Home', + icon: Icons.home, + onTap: () { + Navigator.of(context).pop(); + }), + buildMenuItem( + text: 'Profile', + icon: Icons.person, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => ProfilePage())); + }), Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Container( @@ -62,7 +71,7 @@ class NavigationDrawer extends StatelessWidget { await storage.delete(key: 'jwt'); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); + (Route route) => false); }, ), ], diff --git a/lib/main.dart b/lib/main.dart index 1a7b02e..83f5eea 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,8 +15,7 @@ void main() { [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); runApp(MaterialApp( - home: ProfilePage(), - //LoadValidPageWidget(Login(), Home()), + home: LoadValidPageWidget(Login(), Home()), debugShowCheckedModeBanner: false, theme: darkTheme.DarkTheme )); From 6c90a74459a7c6ded0073b8f74990328d4b5c1d9 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 16:48:11 +0530 Subject: [PATCH 125/264] Added custom widget for picking gender with --- lib/Constants/Constants.dart | 3 + lib/Screens/FamilyMemberAdd.dart | 58 +++++++++++-------- lib/Widgets/GenderWidget.dart | 96 ++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 23 deletions(-) create mode 100644 lib/Widgets/GenderWidget.dart diff --git a/lib/Constants/Constants.dart b/lib/Constants/Constants.dart index 7901dc2..1ef3583 100644 --- a/lib/Constants/Constants.dart +++ b/lib/Constants/Constants.dart @@ -1,3 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding String NETWORK_ADDRESS = '192.168.29.156:3000'; String JWT_STORAGE_KEY = 'jwt'; +final String MALE = "Male"; +final String FEMALE = "Female"; +final String OTHER = "Other"; diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 1b9e60d..1c198ca 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -9,6 +9,7 @@ import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; +import 'package:geo_spatial/Widgets/GenderWidget.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:geo_spatial/Widgets/TagTextWidget.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -159,30 +160,41 @@ class _FamilyMemberAddState extends State { print(data); }, ), - GenderPickerWithImage( - verticalAlignedText: false, - selectedGender: Gender.Male, - maleImage: AssetImage("assets/avatar_man.png"), - linearGradient: LinearGradient( - colors: [Color(0xfff54b64), Color(0xfff78361)]), - femaleImage: AssetImage("assets/avatar_woman.png"), - selectedGenderTextStyle: TextStyle( - color: Colors.greenAccent, - fontWeight: FontWeight.bold), - unSelectedGenderTextStyle: TextStyle( - color: colors.darkPrimaryTextColor, - fontWeight: FontWeight.normal), - onChanged: (Gender? gender) { - print(gender); - widget.familyMemberIndividualDataModel!.gender = - gender.toString(); + // GenderPickerWithImage( + // verticalAlignedText: false, + // selectedGender: Gender.Male, + // maleImage: AssetImage("assets/avatar_man.png"), + // linearGradient: LinearGradient( + // colors: [Color(0xfff54b64), Color(0xfff78361)]), + // femaleImage: AssetImage("assets/avatar_woman.png"), + // selectedGenderTextStyle: TextStyle( + // color: Colors.greenAccent, + // fontWeight: FontWeight.bold), + // unSelectedGenderTextStyle: TextStyle( + // color: colors.darkPrimaryTextColor, + // fontWeight: FontWeight.normal), + // onChanged: (Gender? gender) { + // print(gender); + // widget.familyMemberIndividualDataModel!.gender = + // gender.toString(); + // }, + // equallyAligned: true, + // animationDuration: Duration(milliseconds: 300), + // isCircular: true, + // opacityOfGradient: 0.2, + // padding: const EdgeInsets.all(3), + // size: 70, //default : 40 + // ), + GenderPickerWidget( + initialGender: + widget.familyMemberIndividualDataModel?.gender, + onChanged: (val) { + widget.familyMemberIndividualDataModel?.gender = val; + print("GENDER: $val"); + }, + onSaved: (val) { + print("GENDER SAVED: $val"); }, - equallyAligned: true, - animationDuration: Duration(milliseconds: 300), - isCircular: true, - opacityOfGradient: 0.2, - padding: const EdgeInsets.all(3), - size: 70, //default : 40 ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), diff --git a/lib/Widgets/GenderWidget.dart b/lib/Widgets/GenderWidget.dart new file mode 100644 index 0000000..d3993d5 --- /dev/null +++ b/lib/Widgets/GenderWidget.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; + +class GenderPickerWidget extends FormField { + GenderPickerWidget( + {FormFieldSetter? onSaved, + Function(String)? onChanged, + String? initialGender, + title, + selectedColor, + AutovalidateMode autoValidateMode = AutovalidateMode.disabled}) + : super( + onSaved: onSaved, + validator: (data) { + if (data == null) return "Please choose date"; + return null; + }, + initialValue: initialGender ?? MALE, + autovalidateMode: autoValidateMode, + builder: (FormFieldState state) { + onChanged!(state.value ?? MALE); + return Wrap( + children: [ + GenderWidget( + gender: MALE, + assetPath: "assets/svg/male.svg", + state: state, + successColor: selectedColor, + onChanged: onChanged), + GenderWidget( + gender: FEMALE, + assetPath: "assets/svg/female.svg", + state: state, + successColor: selectedColor, + onChanged: onChanged), + GenderWidget( + gender: OTHER, + assetPath: "assets/svg/transgender.svg", + state: state, + successColor: selectedColor, + onChanged: onChanged), + ], + ); + }); +} + +//assets/avatar_man.png +//assets/avatar_woman.png +class GenderWidget extends StatelessWidget { + const GenderWidget({ + Key? key, + required this.state, + required this.gender, + required this.assetPath, + this.successColor, + this.onChanged, + }) : super(key: key); + + final state; + final gender; + final assetPath; + final successColor; + final Function(String)? onChanged; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + state.didChange(gender); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + CircleAvatar( + maxRadius: 25, + backgroundColor: state.value == gender + ? successColor ?? colors.successColor + : Colors.transparent, + child: ClipOval( + child: SvgPicture.asset(assetPath), + ), + ), + Padding( + padding: EdgeInsets.only(left: 4, right: 10), + child: Text( + gender, + style: TextStyle(fontSize: 13), + )) + ], + ), + ); + } +} +//"assets/avatar_woman.png" From 71f72b6b4c5f6b572e87ff23404fd2b71760cf94 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 17:21:27 +0530 Subject: [PATCH 126/264] Added messages and notes to submit page, added snack-bar messages and alert dialogs on save --- lib/Screens/CollectLocationWidget.dart | 119 ++-- lib/Screens/CommunityDataCollection.dart | 87 ++- lib/Screens/FamilyDetails.dart | 685 ++++++++++++----------- lib/Screens/FamilyHomeScreen.dart | 38 +- lib/Screens/FamilyMemberAdd.dart | 20 +- 5 files changed, 507 insertions(+), 442 deletions(-) diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index e269496..18895ef 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -40,24 +40,25 @@ class _CollectLocationWidgetState extends State { } final result = await showDialog( context: context, - builder: (context) => AlertDialog( - title: Text("Are you sure?"), - content: Text("All unsaved changes would be lost"), - actions: [ - TextButton( - child: Text('No'), - onPressed: () { - Navigator.pop(context, false); - }, + builder: (context) => + AlertDialog( + title: Text("Are you sure?"), + content: Text("All unsaved changes would be lost"), + actions: [ + TextButton( + child: Text('No'), + onPressed: () { + Navigator.pop(context, false); + }, + ), + TextButton( + child: Text('Yes', style: TextStyle(color: Colors.red)), + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], ), - TextButton( - child: Text('Yes', style: TextStyle(color: Colors.red)), - onPressed: () { - Navigator.pop(context, true); - }, - ), - ], - ), ); return result; }, @@ -65,47 +66,49 @@ class _CollectLocationWidgetState extends State { backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Get Location'), body: FormPageView( - [ - LocationWidgetField( - title: "Record location at top left part of the facility", - context: context, - defaultValue: widget.modelData.locationTopLeft, - onSaved: (data) { - print(data); - widget.modelData.locationTopLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at top right part of the facility", - context: context, - defaultValue: widget.modelData.locationTopRight, - onSaved: (data) { - print(data); - widget.modelData.locationTopRight = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom left part of the facility", - context: context, - defaultValue: widget.modelData.locationBottomLeft, - onSaved: (data) { - print(data); - widget.modelData.locationBottomLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom right part of the facility", - context: context, - defaultValue: widget.modelData.locationBottomRight, - onSaved: (data) { - print(data); - widget.modelData.locationBottomRight = data; - }, - ), - ], - _onSubmit, - submitMessage: - "Submit to Continue or go back to re-record location data", + [ + LocationWidgetField( + title: "Record location at top left part of the facility", + context: context, + defaultValue: widget.modelData.locationTopLeft, + onSaved: (data) { + print(data); + widget.modelData.locationTopLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at top right part of the facility", + context: context, + defaultValue: widget.modelData.locationTopRight, + onSaved: (data) { + print(data); + widget.modelData.locationTopRight = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom left part of the facility", + context: context, + defaultValue: widget.modelData.locationBottomLeft, + onSaved: (data) { + print(data); + widget.modelData.locationBottomLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom right part of the facility", + context: context, + defaultValue: widget.modelData.locationBottomRight, + onSaved: (data) { + print(data); + widget.modelData.locationBottomRight = data; + }, + ), + ], + _onSubmit, + submitMessage: + "Submit to Continue or go back to re-record location data", + note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", + )), ); } diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 4f11a61..b8e9768 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -62,25 +62,22 @@ class _CommunityDataCollectionState extends State { print(isValid.toString()); if (isValid) { - print("Valid!"); - print(modelData.villageCode); - print(modelData.locationBottomRight); - print(modelData.locationBottomLeft); - print(modelData.locationTopRight); - print(modelData.locationTopLeft); - print(modelData.resourceType); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text("Upload successful"), + content: Text( + "Upload successful", + style: TextStyle(color: Colors.red), + ), )); Navigator.pop(context); //TODO: Send data to server from here - } - else{ + } else { ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text("Please fill all fields!", style: TextStyle(color: colors.errorColor),), + content: Text( + "Please fill all fields!", + style: TextStyle(color: Colors.red), + ), )); } } @@ -121,7 +118,7 @@ class _CommunityDataCollectionState extends State { } final result = await showDialog( context: context, - builder: (context) => AlertDialog( + builder: (context) => AlertDialog( title: Text("Are you sure?"), content: Text("All unsaved changes would be lost"), actions: [ @@ -158,41 +155,41 @@ class _CommunityDataCollectionState extends State { hint: "Select resource type", errorField: "Please choose a resource to tag"), LocationWidgetField( - title: "Record location at top left part of the facility", - defaultValue: modelData.locationTopLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopLeft = data; - }, - ), + title: "Record location at top left part of the facility", + defaultValue: modelData.locationTopLeft, + context: context, + onSaved: (data) { + print(data); + modelData.locationTopLeft = data; + }, + ), LocationWidgetField( - title: "Record location at top right part of the facility", - defaultValue: modelData.locationTopRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopRight = data; - }, - ), + title: "Record location at top right part of the facility", + defaultValue: modelData.locationTopRight, + context: context, + onSaved: (data) { + print(data); + modelData.locationTopRight = data; + }, + ), LocationWidgetField( - title: "Record location at bottom left part of the facility", - defaultValue: modelData.locationBottomLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomLeft = data; - }, - ), + title: "Record location at bottom left part of the facility", + defaultValue: modelData.locationBottomLeft, + context: context, + onSaved: (data) { + print(data); + modelData.locationBottomLeft = data; + }, + ), LocationWidgetField( - title: "Record location at bottom right part of the facility", - defaultValue: modelData.locationBottomRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomRight = data; - }, - ), + title: "Record location at bottom right part of the facility", + defaultValue: modelData.locationBottomRight, + context: context, + onSaved: (data) { + print(data); + modelData.locationBottomRight = data; + }, + ), DropDownFormField( defaultValue: modelData.villageCode, list: widget._villageCodeName, diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 4f7392d..2fd19cd 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -20,6 +20,17 @@ class FamilyDetails extends StatefulWidget { class _FamilyDetailsState extends State { _onSubmit(bool isValid) { print(isValid.toString()); + if (isValid) { + print("Valid!"); + Navigator.pop(context); + } else { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + "Please fill all fields!", + style: TextStyle(color: Colors.red), + ), + )); + } } final PageController controller = PageController(initialPage: 0); @@ -121,386 +132,398 @@ class _FamilyDetailsState extends State { MediaQuery.of(context).viewInsets.bottom * 1.1, child: SingleChildScrollView( physics: ClampingScrollPhysics(), - child: FormPageView([ - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] + child: FormPageView( + [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.drinkingWater, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.drinkingWater = val; + }, + title: "Do you have drinking water available?"), + DropDownFormField( + list: [ + 'None', + 'Lake', + 'Pond', + 'Groundwater', + 'Well', + 'Tap', + 'Water supply', + 'Lorry/Van' ], - defaultValue: widget.modelData!.drinkingWater, + defaultValue: + widget.modelData!.sourceOfDrinkingWater, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.drinkingWater = val; + widget.modelData!.sourceOfDrinkingWater = val; }, - title: "Do you have drinking water available?"), - DropDownFormField( - list: [ - 'None', - 'Lake', - 'Pond', - 'Groundwater', - 'Well', - 'Tap', - 'Water supply', - 'Lorry/Van' - ], - defaultValue: widget.modelData!.sourceOfDrinkingWater, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.sourceOfDrinkingWater = val; - }, - hint: "Select source", - title: "Source of Water", - errorField: "Please choose an option", - ), - OptionsWidget( + hint: "Select source", + title: "Source of Water", + errorField: "Please choose an option", + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.toiletFacility, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.toiletFacility = val; + }, + title: "Do you have toilet facilities?"), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.communityToilet, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.communityToilet = val; + }, + title: "If not toilet, community toilet?"), + OptionsWidget( + options: [ + ['Clean', 'clean'], + ['Unclean', 'unclean'] + ], + defaultValue: + widget.modelData!.environmentSanitationLevel, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.environmentSanitationLevel = + val; + }, + title: "Environmental sanitation level: "), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: + widget.modelData!.runningWaterAvailable, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.runningWaterAvailable = val; + }, + title: "Is running water available?"), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of two wheelers", + defaultValue: widget.modelData!.noOfTwoWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfTwoWheelers = val; + }, + errorField: "Please choose a valid number", + ), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of three wheelers", + defaultValue: widget.modelData!.noOfThreeWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfThreeWheelers = val; + }, + errorField: "Please choose a valid number", + ), + CheckBoxAlertDialog( + title: 'Two/Three wheeler manufacturer', + hint: 'Please choose manufacturers', + singleOption: false, + context: context, + dataMap: + widget.modelData!.twoThreeWheelManufacturer ?? + two_three_mfg, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.twoThreeWheelManufacturer = val; + }, + errorField: "Please choose a manufacturer", + autoValidateMode: + AutovalidateMode.onUserInteraction, + ), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No of four wheelers", + errorField: "Please choose a valid number", + defaultValue: widget.modelData!.noOfFourWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfFourWheelers = val; + }, + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + CheckBoxAlertDialog( + title: 'Four wheeler manufacturer', + hint: 'Please choose manufacturers', + singleOption: false, + context: context, + dataMap: widget.modelData!.twoFourManufacturer ?? + four_mfg, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.twoFourManufacturer = val; + }, + errorField: "Please choose a manufacturer", + autoValidateMode: + AutovalidateMode.onUserInteraction, + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.isCattleOwned, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isCattleOwned = val; + }, + title: "Do you own cattle?"), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20.0), + child: TextFormField( + initialValue: widget.modelData!.incomeFromCattle, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.incomeFromCattle = val; + }, + decoration: InputDecoration( + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + hintText: "Enter income in Rupees", + label: Text( + 'Income from cattle', + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + )), + autovalidateMode: AutovalidateMode.always, + keyboardType: TextInputType.number, + ), + ), + OptionsWidget( options: [ ['Yes', 'yes'], ['No', 'no'] ], - defaultValue: widget.modelData!.toiletFacility, + defaultValue: widget.modelData!.isFarmLandOwned, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.toiletFacility = val; + widget.modelData!.isFarmLandOwned = val; }, - title: "Do you have toilet facilities?"), - OptionsWidget( + title: "Do you own farmland?", + ), + OptionsWidget( options: [ ['Yes', 'yes'], ['No', 'no'] ], - defaultValue: widget.modelData!.communityToilet, + defaultValue: widget.modelData!.isSeedsPreserved, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.communityToilet = val; + widget.modelData!.isSeedsPreserved = val; }, - title: "If not toilet, community toilet?"), - OptionsWidget( - options: [ - ['Clean', 'clean'], - ['Unclean', 'unclean'] - ], - defaultValue: - widget.modelData!.environmentSanitationLevel, + title: "Do you preserve seeds?", + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + //TODO: Display if answer to previous question is yes + CheckBoxAddExtraAlertDialog( + title: 'Seeds Preserved', + hint: 'Choose preserved seeds', + singleOption: false, + context: context, + dataMap: widget.modelData!.preservedSeedsMap ?? + seeds_preserved, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.environmentSanitationLevel = - val; + widget.modelData!.preservedSeedsMap = val; }, - title: "Environmental sanitation level: "), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: - widget.modelData!.runningWaterAvailable, + ), + CheckBoxAddExtraAlertDialog( + title: 'Trees owned', + hint: 'Choose trees owned', + singleOption: false, + context: context, + dataMap: + widget.modelData!.treesOwnedMap ?? trees_owned, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.runningWaterAvailable = val; + widget.modelData!.treesOwnedMap = val; }, - title: "Is running water available?"), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No of two wheelers", - defaultValue: widget.modelData!.noOfTwoWheelers, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.noOfTwoWheelers = val; - }, - errorField: "Please choose a valid number", - ), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No of three wheelers", - defaultValue: widget.modelData!.noOfThreeWheelers, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.noOfThreeWheelers = val; - }, - errorField: "Please choose a valid number", - ), - CheckBoxAlertDialog( - title: 'Two/Three wheeler manufacturer', - hint: 'Please choose manufacturers', - singleOption: false, - context: context, - dataMap: - widget.modelData!.twoThreeWheelManufacturer ?? - two_three_mfg, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData?.twoThreeWheelManufacturer = val; - }, - errorField: "Please choose a manufacturer", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No of four wheelers", - errorField: "Please choose a valid number", - defaultValue: widget.modelData!.noOfFourWheelers, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.noOfFourWheelers = val; - }, - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - CheckBoxAlertDialog( - title: 'Four wheeler manufacturer', - hint: 'Please choose manufacturers', - singleOption: false, - context: context, - dataMap: - widget.modelData!.twoFourManufacturer ?? four_mfg, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData?.twoFourManufacturer = val; - }, - errorField: "Please choose a manufacturer", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - OptionsWidget( + ), + CheckBoxAddExtraAlertDialog( + title: 'Choose resource', + hint: 'Choose your resource', + //TODO: Change variable to local foood + + dataMap: + widget.modelData!.localFoodMap ?? local_food, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.localFoodMap = val; + }, + singleOption: false, + context: context, + ), + + //TODO: Add autosuggest text widget for locally consumed food + //TODO: Add autosuggest text widget for trees owned + OptionsWidget( options: [ ['Yes', 'yes'], ['No', 'no'] ], - defaultValue: widget.modelData!.isCattleOwned, + defaultValue: + widget.modelData!.isKitchenGardenOwned, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.isCattleOwned = val; + widget.modelData!.isKitchenGardenOwned = val; }, - title: "Do you own cattle?"), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20.0), - child: TextFormField( - initialValue: widget.modelData!.incomeFromCattle, + title: "Do you have a kitchen garden?", + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + CheckBoxAddExtraAlertDialog( + title: 'Kitchen Garden plants', + hint: 'Choose garden plants', + singleOption: false, + context: context, + dataMap: widget.modelData!.kitchenGardenPlants ?? + garden_plants, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.incomeFromCattle = val; + widget.modelData!.kitchenGardenPlants = val; }, - decoration: InputDecoration( - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - hintText: "Enter income in Rupees", - label: Text( - 'Income from cattle', - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - )), - autovalidateMode: AutovalidateMode.always, - keyboardType: TextInputType.number, ), - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.isFarmLandOwned, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isFarmLandOwned = val; - }, - title: "Do you own farmland?", - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.isSeedsPreserved, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isSeedsPreserved = val; - }, - title: "Do you preserve seeds?", - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - //TODO: Display if answer to previous question is yes - CheckBoxAddExtraAlertDialog( - title: 'Seeds Preserved', - hint: 'Choose preserved seeds', - singleOption: false, - context: context, - dataMap: widget.modelData!.preservedSeedsMap ?? - seeds_preserved, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.preservedSeedsMap = val; - }, - ), - CheckBoxAddExtraAlertDialog( - title: 'Trees owned', - hint: 'Choose trees owned', - singleOption: false, - context: context, - dataMap: - widget.modelData!.treesOwnedMap ?? trees_owned, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.treesOwnedMap = val; - }, - ), - CheckBoxAddExtraAlertDialog( - title: 'Choose resource', - hint: 'Choose your resource', - //TODO: Change variable to local foood - - dataMap: widget.modelData!.localFoodMap ?? local_food, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.localFoodMap = val; - }, - singleOption: false, - context: context, - ), - - //TODO: Add autosuggest text widget for locally consumed food - //TODO: Add autosuggest text widget for trees owned - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.isKitchenGardenOwned, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isKitchenGardenOwned = val; - }, - title: "Do you have a kitchen garden?", - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - CheckBoxAddExtraAlertDialog( - title: 'Kitchen Garden plants', - hint: 'Choose garden plants', - singleOption: false, - context: context, - dataMap: widget.modelData!.kitchenGardenPlants ?? - garden_plants, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.kitchenGardenPlants = val; - }, - ), - //TODO: Add autosuggest text widget for kitchen garden crops - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Align( - alignment: Alignment.topLeft, - child: Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 15.0), - child: Text( - "Address", - style: GoogleFonts.montserrat( - fontSize: 15.0, - color: colors.darkPrimaryTextColor), + //TODO: Add autosuggest text widget for kitchen garden crops + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Align( + alignment: Alignment.topLeft, + child: Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 15.0), + child: Text( + "Address", + style: GoogleFonts.montserrat( + fontSize: 15.0, + color: colors.darkPrimaryTextColor), + ), ), ), - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - initialValue: widget.modelData!.addressOne, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.addressOne = val; - }, - decoration: InputDecoration( - label: Text( - "First Line", - style: GoogleFonts.poppins( + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + initialValue: widget.modelData!.addressOne, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.addressOne = val; + }, + decoration: InputDecoration( + label: Text( + "First Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter first line", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter first line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), + validator: (value) { + if (value == "") { + return "Enter First Line"; + } + }, ), - validator: (value) { - if (value == "") { - return "Enter First Line"; - } - }, ), - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - initialValue: widget.modelData!.addressTwo, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.addressTwo = val; - }, - decoration: InputDecoration( - label: Text( - "Second Line", - style: GoogleFonts.poppins( + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + initialValue: widget.modelData!.addressTwo, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.addressTwo = val; + }, + decoration: InputDecoration( + label: Text( + "Second Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter second line", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter second line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), ), - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - initialValue: widget.modelData!.city, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.city = val; - }, - decoration: InputDecoration( - label: Text( - "City", - style: GoogleFonts.poppins( + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + initialValue: widget.modelData!.city, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.city = val; + }, + decoration: InputDecoration( + label: Text( + "City", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter city", + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - hintText: "Please enter city", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), ), - ), - ], - ), - ], - ) - ], _onSubmit)))), + ], + ), + ], + ) + ], + _onSubmit, + submitMessage: + "Submit to Continue or go back to re-record data", + note: + "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", + )))), ); } } diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 1f09e98..62a8c8a 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -7,6 +7,7 @@ import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:geo_spatial/objectbox.g.dart'; +import 'package:google_fonts/google_fonts.dart'; import 'CollectLocationWidget.dart'; class FamilyHomeScreen extends StatefulWidget { @@ -49,8 +50,15 @@ class _FamilyHomeScreenState extends State AddRemoveBoxWidget( modelData: modelData, ), - DataCard("\nCollect Common Details", "", "assets/svg/house.svg", - FamilyDetails(modelData: modelData,), Color(0xfff54b64), Color(0xfff78361)), + DataCard( + "\nCollect Common Details", + "", + "assets/svg/house.svg", + FamilyDetails( + modelData: modelData, + ), + Color(0xfff54b64), + Color(0xfff78361)), DataCard( "Record GPS Data", "Make sure GPS is enabled", @@ -118,7 +126,31 @@ class _FamilyHomeScreenState extends State store = await StoreInstance.getInstance(); Box box = store.box(); - await box.put(modelData); + int id = await box.put(modelData); + + AlertDialog alertDialog = AlertDialog( + title: Text( + 'Record Saved', + style: GoogleFonts.poppins( + fontWeight: FontWeight.bold), + ), + content: Text( + 'The Record has been saved with record ID ${id}', + style: GoogleFonts.poppins()), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + }, + child: Text('OK'), + ) + ], + ); + + showDialog( + context: context, + builder: (BuildContext context) => alertDialog); }), ), ) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 1c198ca..ff41e88 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -37,6 +37,18 @@ class _FamilyMemberAddState extends State { setState(() { isPageValid = isValid; }); + + if (isValid) { + print("Valid!"); + Navigator.pop(context); + } else { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + "Please fill all fields!", + style: TextStyle(color: Colors.red), + ), + )); + } } bool isPageValid = false; @@ -740,11 +752,9 @@ class _FamilyMemberAddState extends State { ) ], _onSubmit, - saveData: () async { - // print(widget.dataModel); - // widget.dataModel!.individualDataList[widget.index!] = - // widget.familyMemberIndividualDataModel!; - }, + submitMessage: "Submit to Continue or go back to re-record data", + note: + "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", ), ), ), From 40870ec9f0edf110a31cfcd55f6e39aa87a6d3bd Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 18:09:16 +0530 Subject: [PATCH 127/264] Added option quit app --- lib/Screens/FamilyDetails.dart | 4 - lib/Screens/Home.dart | 212 ++++++++++++++++++++------------- lib/main.dart | 1 - 3 files changed, 127 insertions(+), 90 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 2fd19cd..cf0641d 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -96,10 +96,6 @@ class _FamilyDetailsState extends State { Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { - //TODO: Add condition here to check if page has been filled - if (false) { - return true; - } final result = await showDialog( context: context, builder: (context) => AlertDialog( diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index e677dde..d5f7bc5 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,14 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; -import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Screens/VillageSelection.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:geo_spatial/Widgets/NavigationDrawer.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Screens/Login.dart'; -import 'package:geo_spatial/Utils/Colors.dart' as colors; -import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'EditExistingRecordsPage.dart'; import 'SavedData.dart'; @@ -23,13 +22,54 @@ class Home extends StatefulWidget { final storage = FlutterSecureStorage(); class _HomeWidgetState extends State { - @override Widget build(BuildContext context) { - return Scaffold( - drawer: NavigationDrawer(), - backgroundColor: colors.darkScaffoldColor, - appBar: AppBar( + return WillPopScope( + onWillPop: () async { + + final result = await showDialog( + context: context, + builder: (_) => AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20))), + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure you want to quit?", + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor,fontSize: 15), + ), + actions: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(20)))), + onPressed: () { + SystemChannels.platform.invokeMethod('SystemNavigator.pop'); + + }, + child: Text( + 'Yes', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + )), + TextButton( + onPressed: (){ + Navigator.pop(context,true); + }, + child: Text( + 'No', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + )) + ], + )); + return result; + }, + child: Scaffold( + drawer: NavigationDrawer(), + backgroundColor: colors.darkScaffoldColor, + appBar: AppBar( elevation: 40, title: Text( 'Hello, ' + globals.Name + '!', @@ -37,82 +77,84 @@ class _HomeWidgetState extends State { fontSize: 18, color: colors.darkPrimaryTextColor), ), backgroundColor: Colors.transparent, + ), + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + DataCard( + 'Individual data', + 'Individual data entry for everyone in home', + 'assets/svg/female.svg', + //FamilyHomeScreen(), + VillageSelectionScreen(), + Color(0xfff54b64), + Color(0xfff78361)), + DataCard( + 'Community Details', + 'Data entry for communities', + 'assets/svg/house.svg', + CommunityDataCollection( + /* + modelData: new CommunityDataModel( + resourceType: "Bakeries", + locationBottomLeft: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + locationBottomRight: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + locationTopRight: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + locationTopLeft: new Position( + latitude: 1.2, + longitude: 2.4, + accuracy: 32, + heading: 21, + speedAccuracy: 32, + altitude: 23, + speed: 32, + timestamp: null), + villageCode: "Temple")*/ + ), + Color(0xfff54b64), + Color(0xfff78361)), + DataCard( + 'Edit Existing Record', + 'Edit information of an existing person', + 'assets/svg/male.svg', + EditRecordsScreen(), + Color(0xfff54b64), + Color(0xfff78361)), + DataCard( + 'View saved data', + 'View all data saved in local storage', + 'assets/svg/storage_image.svg', + SavedDataPage(), + Color(0xfff54b64), + Color(0xfff78361)), + ], ), - body: SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children:[ - DataCard( - 'Individual data', - 'Individual data entry for everyone in home', - 'assets/svg/female.svg', - //FamilyHomeScreen(), - VillageSelectionScreen(), - Color(0xfff54b64), - Color(0xfff78361)), - DataCard( - 'Community Details', - 'Data entry for communities', - 'assets/svg/house.svg', - CommunityDataCollection( - /* - modelData: new CommunityDataModel( - resourceType: "Bakeries", - locationBottomLeft: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - locationBottomRight: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - locationTopRight: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - locationTopLeft: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - villageCode: "Temple")*/), - Color(0xfff54b64), - Color(0xfff78361)), - DataCard( - 'Edit Existing Record', - 'Edit information of an existing person', - 'assets/svg/male.svg', - EditRecordsScreen(), - Color(0xfff54b64), - Color(0xfff78361)), - DataCard( - 'View saved data', - 'View all data saved in local storage', - 'assets/svg/storage_image.svg', - SavedDataPage(), - Color(0xfff54b64), - Color(0xfff78361)), - ], ), ), ); diff --git a/lib/main.dart b/lib/main.dart index 83f5eea..2f39c71 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,6 @@ import 'package:geo_spatial/Screens/Login.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Home.dart'; import 'package:flutter/services.dart'; -import 'package:geo_spatial/Screens/ProfilePage.dart'; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/LoadValidPageWidget.dart'; From fc49228809a06d56af75dc3b790ea817fd2d9b29 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 18:22:27 +0530 Subject: [PATCH 128/264] Added validation variable for family page --- lib/Model/FamilyMembersCommonDataModel.dart | 3 + lib/Screens/CollectLocationWidget.dart | 26 +- lib/Screens/FamilyDetails.dart | 5 + lib/Screens/FamilyHomeScreen.dart | 25 +- lib/Screens/FamilyMemberAdd.dart | 5 + lib/Widgets/FormPageView.dart | 19 +- lib/Widgets/StepCounterWidget.dart | 1 - lib/objectbox-model.json | 396 ------ lib/objectbox.g.dart | 1261 ------------------- 9 files changed, 52 insertions(+), 1689 deletions(-) delete mode 100644 lib/objectbox-model.json delete mode 100644 lib/objectbox.g.dart diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 831a890..665cb10 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -36,6 +36,7 @@ class FamilyMemberIndividualDataModel { String? useOfAlcohol; String? aarogyaSetuInstalled; String? vizhithiruInstalled; + bool? dataValid = false; String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); @@ -96,6 +97,8 @@ class FamilyMembersCommonDataModel { String? addressOne; String? addressTwo; String? city; + bool? locationPageValid = false; + bool? commonDetailsValid = false; @Transient() final individualDataListTransient = []; diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index 18895ef..db4f032 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; @@ -6,7 +7,7 @@ import 'package:geo_spatial/Widgets/LocationWidget.dart'; class CollectLocationWidget extends StatefulWidget { const CollectLocationWidget({Key? key, this.modelData}) : super(key: key); - final modelData; + final FamilyMembersCommonDataModel? modelData; @override _CollectLocationWidgetState createState() => _CollectLocationWidgetState(); @@ -16,9 +17,6 @@ class _CollectLocationWidgetState extends State { @override Widget build(BuildContext context) { _onSubmit(bool isValid) async { - print("All data valid"); - print(isValid.toString()); - if (isValid) { print("Valid!"); Navigator.pop(context); @@ -70,41 +68,45 @@ class _CollectLocationWidgetState extends State { LocationWidgetField( title: "Record location at top left part of the facility", context: context, - defaultValue: widget.modelData.locationTopLeft, + defaultValue: widget.modelData?.locationTopLeft, onSaved: (data) { print(data); - widget.modelData.locationTopLeft = data; + widget.modelData?.locationTopLeft = data; }, ), LocationWidgetField( title: "Record location at top right part of the facility", context: context, - defaultValue: widget.modelData.locationTopRight, + defaultValue: widget.modelData?.locationTopRight, onSaved: (data) { print(data); - widget.modelData.locationTopRight = data; + widget.modelData?.locationTopRight = data; }, ), LocationWidgetField( title: "Record location at bottom left part of the facility", context: context, - defaultValue: widget.modelData.locationBottomLeft, + defaultValue: widget.modelData?.locationBottomLeft, onSaved: (data) { print(data); - widget.modelData.locationBottomLeft = data; + widget.modelData?.locationBottomLeft = data; }, ), LocationWidgetField( title: "Record location at bottom right part of the facility", context: context, - defaultValue: widget.modelData.locationBottomRight, + defaultValue: widget.modelData?.locationBottomRight, onSaved: (data) { print(data); - widget.modelData.locationBottomRight = data; + widget.modelData?.locationBottomRight = data; }, ), ], _onSubmit, + onChange: (isValid){ + print("IS LOCATION VALID: ${widget.modelData?.locationPageValid}"); + widget.modelData?.locationPageValid = isValid; + }, submitMessage: "Submit to Continue or go back to re-record location data", note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index cf0641d..d48125a 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -515,6 +515,11 @@ class _FamilyDetailsState extends State { ) ], _onSubmit, + onChange: (isValid){ + print(isValid); + print("IS FAM VALID: ${widget.modelData?.commonDetailsValid}"); + widget.modelData?.commonDetailsValid = isValid; + }, submitMessage: "Submit to Continue or go back to re-record data", note: diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 62a8c8a..4861295 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -20,8 +20,7 @@ class FamilyHomeScreen extends StatefulWidget { FamilyMembersCommonDataModel? modelData; -class _FamilyHomeScreenState extends State - with AutomaticKeepAliveClientMixin { +class _FamilyHomeScreenState extends State { var store; void initState() { @@ -30,6 +29,7 @@ class _FamilyHomeScreenState extends State if (modelData == null) modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); + modelData!.individualDataListTransient.clear(); for (var i in modelData!.individualDataList) { print(i); modelData!.individualDataListTransient.add(i); @@ -39,8 +39,6 @@ class _FamilyHomeScreenState extends State @override Widget build(BuildContext context) { - super.build(context); - return Scaffold( appBar: AppBarBackButton('Individual Data'), backgroundColor: colors.darkScaffoldColor, @@ -90,7 +88,21 @@ class _FamilyHomeScreenState extends State side: BorderSide( color: colors .darkSecondBackgroundColor)))), - onPressed: () {}), + onPressed: () { + bool isValid = true; + print("Common ${modelData!.commonDetailsValid}"); + print("Location ${modelData!.locationPageValid}"); + isValid &= modelData!.commonDetailsValid! && + modelData!.locationPageValid!; + + for (var i + in modelData!.individualDataListTransient) { + isValid &= i.dataValid!; + print("Indv ${i.dataValid}"); + } + + print("Is Valid: $isValid"); + }), ), ), Padding( @@ -169,7 +181,4 @@ class _FamilyHomeScreenState extends State print("DISPOSED"); modelData = null; } - - @override - bool get wantKeepAlive => true; } diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index ff41e88..92181b0 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -752,6 +752,11 @@ class _FamilyMemberAddState extends State { ) ], _onSubmit, + onChange: (isValid){ + print(isValid); + print("IS FAM VALID: ${widget.familyMemberIndividualDataModel?.dataValid}"); + widget.familyMemberIndividualDataModel?.dataValid = isValid; + }, submitMessage: "Submit to Continue or go back to re-record data", note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index d867ea0..55583ac 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -8,11 +8,12 @@ import 'PageViewContentBox.dart'; class FormPageView extends StatefulWidget { const FormPageView(this.pageWidgetList, this.onSubmit, - {Key? key, this.saveData, this.submitMessage, this.note}) + {Key? key, this.saveData, this.submitMessage, this.note, this.onChange}) : super(key: key); final List pageWidgetList; final Function(bool) onSubmit; + final Function(bool)? onChange; final saveData; final submitMessage; final note; @@ -35,16 +36,10 @@ class _FormPageViewState extends State { super.initState(); widgetLength = widget.pageWidgetList.length + 1; - print(widgetLength); formErrorTile = List.generate(widgetLength - 1, (index) => false); - print(formErrorTile); - formKeyList = List.generate( widgetLength - 1, (index) => GlobalObjectKey(index)); - - print(formKeyList); - widgetList = List.generate( widgetLength - 1, (index) => PageViewContentBox(FormKeepAlive( @@ -86,8 +81,7 @@ class _FormPageViewState extends State { isValid &= isDataValid; formKeyList[i].currentState!.save(); - if (isDataValid) { - } + if (isDataValid) {} } widget.onSubmit(isValid); }), @@ -136,15 +130,17 @@ class _FormPageViewState extends State { } _onPageViewChange(int page) { + var isAllValid = true; for (int i = 0; i < page; i++) { setState(() { var isValid = formKeyList[i].currentState!.validate(); + isAllValid &= isValid; formKeyList[i].currentState!.save(); - if (isValid) { - } + if (isValid) {} formErrorTile[i] = !isValid; }); } + widget.onChange!(isAllValid); setState(() { count = page; }); @@ -193,6 +189,7 @@ class _FormKeepAliveState extends State return Form( child: widget.childWidget, key: widget._formKey, + onChanged: () {}, ); } diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 844d0ab..61a7465 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -45,7 +45,6 @@ class _StepCounterWidgetState extends State { widget.errorArray[i] ? checkBoxWidgetList.add(CheckBox(0, widget.controller, i)) : checkBoxWidgetList.add(CheckBox(1, widget.controller, i)); - print(widget.errorArray[i].toString() + " " + i.toString()); } catch (error) { checkBoxWidgetList.add(CheckBox(1, widget.controller, i)); } diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json deleted file mode 100644 index bfd2afb..0000000 --- a/lib/objectbox-model.json +++ /dev/null @@ -1,396 +0,0 @@ -{ - "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", - "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", - "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", - "entities": [ - { - "id": "1:3950518272510391200", - "lastPropertyId": "8:3170409840351111096", - "name": "CommunityDataModel", - "properties": [ - { - "id": "1:8140527551961172548", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "2:3159495043814331513", - "name": "resourceType", - "type": 9 - }, - { - "id": "3:4690970104335964894", - "name": "villageCode", - "type": 9 - }, - { - "id": "4:5259334423703613736", - "name": "savedTime", - "type": 9 - }, - { - "id": "5:5523993525315213267", - "name": "dbLocationTopLeft", - "type": 9 - }, - { - "id": "6:9064650214124194157", - "name": "dbLocationTopRight", - "type": 9 - }, - { - "id": "7:2961799903689622576", - "name": "dbLocationBottomLeft", - "type": 9 - }, - { - "id": "8:3170409840351111096", - "name": "dbLocationBottomRight", - "type": 9 - } - ], - "relations": [] - }, - { - "id": "2:6685214565457365230", - "lastPropertyId": "32:5375503589039401181", - "name": "FamilyMemberIndividualDataModel", - "properties": [ - { - "id": "1:8723352508613304168", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "2:7604499542143584605", - "name": "userName", - "type": 9 - }, - { - "id": "3:6647327136270420131", - "name": "dateOfBirth", - "type": 10 - }, - { - "id": "4:7394015767332678427", - "name": "gender", - "type": 9 - }, - { - "id": "5:3884159339096887518", - "name": "phoneNumber", - "type": 9 - }, - { - "id": "6:3761785743139786223", - "name": "educationQualification", - "type": 9 - }, - { - "id": "7:2912550153076040514", - "name": "aadhaarNumber", - "type": 9 - }, - { - "id": "8:6501390621116148247", - "name": "dailyWageWorker", - "type": 9 - }, - { - "id": "9:8692285643353019146", - "name": "incomePerDay", - "type": 9 - }, - { - "id": "10:2510858921793217570", - "name": "incomePerMonth", - "type": 9 - }, - { - "id": "11:3831022645838678395", - "name": "pension", - "type": 9 - }, - { - "id": "12:1404325505572824726", - "name": "businessStatus", - "type": 9 - }, - { - "id": "13:7080052757140045670", - "name": "maritalStatus", - "type": 9 - }, - { - "id": "14:4439637978014416112", - "name": "specialSkills", - "type": 30 - }, - { - "id": "15:4636181569648235734", - "name": "frequentAilments", - "type": 30 - }, - { - "id": "16:4851875690128697657", - "name": "commutableDisease", - "type": 30 - }, - { - "id": "17:7484660082837778600", - "name": "nonCommutableDisease", - "type": 30 - }, - { - "id": "18:5729780143757895259", - "name": "surgeries", - "type": 9 - }, - { - "id": "19:2532110693984905492", - "name": "anganwadiServicesAware", - "type": 9 - }, - { - "id": "20:7268786638343194491", - "name": "anganwadiServicesUsing", - "type": 9 - }, - { - "id": "21:6352333255560290159", - "name": "anganwadiServicesUsedList", - "type": 30 - }, - { - "id": "22:3293166845575984244", - "name": "PHCServicesUsedList", - "type": 30 - }, - { - "id": "23:2397114879954340884", - "name": "privateClinicServicesUsedList", - "type": 30 - }, - { - "id": "24:3237947682147741066", - "name": "privateServiceReason", - "type": 9 - }, - { - "id": "25:2630658762586974548", - "name": "useOfTobacco", - "type": 9 - }, - { - "id": "26:1662798223273329088", - "name": "useOfAlcohol", - "type": 9 - }, - { - "id": "27:3258249527595452242", - "name": "aarogyaSetuInstalled", - "type": 9 - }, - { - "id": "28:8168820643425503335", - "name": "vizhithiruInstalled", - "type": 9 - }, - { - "id": "30:3074524065493072391", - "name": "savedTime", - "type": 9 - }, - { - "id": "31:7256338567008476068", - "name": "dbVulnerabilities", - "type": 9 - }, - { - "id": "32:5375503589039401181", - "name": "dbOccupation", - "type": 9 - } - ], - "relations": [] - }, - { - "id": "3:5004688671325240296", - "lastPropertyId": "30:4709957910567293326", - "name": "FamilyMembersCommonDataModel", - "properties": [ - { - "id": "1:406597506935878482", - "name": "id", - "type": 6, - "flags": 1 - }, - { - "id": "2:5933268951084276983", - "name": "drinkingWater", - "type": 9 - }, - { - "id": "3:7714255537633512426", - "name": "sourceOfDrinkingWater", - "type": 9 - }, - { - "id": "4:2415808930190145187", - "name": "toiletFacility", - "type": 9 - }, - { - "id": "5:4950161314722702905", - "name": "communityToilet", - "type": 9 - }, - { - "id": "6:8384486349887445986", - "name": "environmentSanitationLevel", - "type": 9 - }, - { - "id": "7:2392963229872898504", - "name": "runningWaterAvailable", - "type": 9 - }, - { - "id": "8:3952912803449147993", - "name": "noOfTwoWheelers", - "type": 9 - }, - { - "id": "9:1669417226997886200", - "name": "noOfThreeWheelers", - "type": 9 - }, - { - "id": "10:5011624990870736391", - "name": "noOfFourWheelers", - "type": 9 - }, - { - "id": "11:8805489678700516176", - "name": "isCattleOwned", - "type": 9 - }, - { - "id": "12:8435942014491427702", - "name": "incomeFromCattle", - "type": 9 - }, - { - "id": "13:1694052736194978877", - "name": "isFarmLandOwned", - "type": 9 - }, - { - "id": "14:5615515454180248444", - "name": "isSeedsPreserved", - "type": 9 - }, - { - "id": "15:7655049526662030931", - "name": "isKitchenGardenOwned", - "type": 9 - }, - { - "id": "16:6193242875372395353", - "name": "addressOne", - "type": 9 - }, - { - "id": "17:1686900574402451883", - "name": "addressTwo", - "type": 9 - }, - { - "id": "19:1423273990910471875", - "name": "savedTime", - "type": 9 - }, - { - "id": "20:5507268764564482947", - "name": "dbLocationTopLeft", - "type": 9 - }, - { - "id": "21:4582363172019587389", - "name": "dbLocationTopRight", - "type": 9 - }, - { - "id": "22:69678934293790881", - "name": "dbLocationBottomLeft", - "type": 9 - }, - { - "id": "23:6516827898200627863", - "name": "dbLocationBottomRight", - "type": 9 - }, - { - "id": "24:614476397339919731", - "name": "city", - "type": 9 - }, - { - "id": "25:6573872590519653208", - "name": "dbTwoThreeWheelManufacturer", - "type": 9 - }, - { - "id": "26:697696816698768514", - "name": "dbTwoFourManufacturer", - "type": 9 - }, - { - "id": "27:4321042013916961622", - "name": "dbLocalFoodMap", - "type": 9 - }, - { - "id": "28:5736085922745483974", - "name": "dbPreservedSeedsMap", - "type": 9 - }, - { - "id": "29:8804761426863292202", - "name": "dbTreesOwnedMap", - "type": 9 - }, - { - "id": "30:4709957910567293326", - "name": "dbKitchenGardenPlants", - "type": 9 - } - ], - "relations": [ - { - "id": "1:1791331254757937694", - "name": "individualDataList", - "targetId": "2:6685214565457365230" - } - ] - } - ], - "lastEntityId": "3:5004688671325240296", - "lastIndexId": "1:7346081088137941172", - "lastRelationId": "1:1791331254757937694", - "lastSequenceId": "0:0", - "modelVersion": 5, - "modelVersionParserMinimum": 5, - "retiredEntityUids": [], - "retiredIndexUids": [ - 7346081088137941172 - ], - "retiredPropertyUids": [ - 1969777098633351831, - 5524724872707357697 - ], - "retiredRelationUids": [], - "version": 1 -} \ No newline at end of file diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart deleted file mode 100644 index b905ab0..0000000 --- a/lib/objectbox.g.dart +++ /dev/null @@ -1,1261 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -// ignore_for_file: camel_case_types - -import 'dart:typed_data'; - -import 'package:objectbox/flatbuffers/flat_buffers.dart' as fb; -import 'package:objectbox/internal.dart'; // generated code can access "internal" functionality -import 'package:objectbox/objectbox.dart'; -import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; - -import 'Model/CommunityDataModel.dart'; -import 'Model/FamilyMembersCommonDataModel.dart'; - -export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file - -final _entities = [ - ModelEntity( - id: const IdUid(1, 3950518272510391200), - name: 'CommunityDataModel', - lastPropertyId: const IdUid(8, 3170409840351111096), - flags: 0, - properties: [ - ModelProperty( - id: const IdUid(1, 8140527551961172548), - name: 'id', - type: 6, - flags: 1), - ModelProperty( - id: const IdUid(2, 3159495043814331513), - name: 'resourceType', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(3, 4690970104335964894), - name: 'villageCode', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(4, 5259334423703613736), - name: 'savedTime', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(5, 5523993525315213267), - name: 'dbLocationTopLeft', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(6, 9064650214124194157), - name: 'dbLocationTopRight', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(7, 2961799903689622576), - name: 'dbLocationBottomLeft', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(8, 3170409840351111096), - name: 'dbLocationBottomRight', - type: 9, - flags: 0) - ], - relations: [], - backlinks: []), - ModelEntity( - id: const IdUid(2, 6685214565457365230), - name: 'FamilyMemberIndividualDataModel', - lastPropertyId: const IdUid(32, 5375503589039401181), - flags: 0, - properties: [ - ModelProperty( - id: const IdUid(1, 8723352508613304168), - name: 'id', - type: 6, - flags: 1), - ModelProperty( - id: const IdUid(2, 7604499542143584605), - name: 'userName', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(3, 6647327136270420131), - name: 'dateOfBirth', - type: 10, - flags: 0), - ModelProperty( - id: const IdUid(4, 7394015767332678427), - name: 'gender', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(5, 3884159339096887518), - name: 'phoneNumber', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(6, 3761785743139786223), - name: 'educationQualification', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(7, 2912550153076040514), - name: 'aadhaarNumber', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(8, 6501390621116148247), - name: 'dailyWageWorker', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(9, 8692285643353019146), - name: 'incomePerDay', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(10, 2510858921793217570), - name: 'incomePerMonth', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(11, 3831022645838678395), - name: 'pension', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(12, 1404325505572824726), - name: 'businessStatus', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(13, 7080052757140045670), - name: 'maritalStatus', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(14, 4439637978014416112), - name: 'specialSkills', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(15, 4636181569648235734), - name: 'frequentAilments', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(16, 4851875690128697657), - name: 'commutableDisease', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(17, 7484660082837778600), - name: 'nonCommutableDisease', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(18, 5729780143757895259), - name: 'surgeries', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(19, 2532110693984905492), - name: 'anganwadiServicesAware', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(20, 7268786638343194491), - name: 'anganwadiServicesUsing', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(21, 6352333255560290159), - name: 'anganwadiServicesUsedList', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(22, 3293166845575984244), - name: 'PHCServicesUsedList', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(23, 2397114879954340884), - name: 'privateClinicServicesUsedList', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(24, 3237947682147741066), - name: 'privateServiceReason', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(25, 2630658762586974548), - name: 'useOfTobacco', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(26, 1662798223273329088), - name: 'useOfAlcohol', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(27, 3258249527595452242), - name: 'aarogyaSetuInstalled', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(28, 8168820643425503335), - name: 'vizhithiruInstalled', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(30, 3074524065493072391), - name: 'savedTime', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(31, 7256338567008476068), - name: 'dbVulnerabilities', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(32, 5375503589039401181), - name: 'dbOccupation', - type: 9, - flags: 0) - ], - relations: [], - backlinks: []), - ModelEntity( - id: const IdUid(3, 5004688671325240296), - name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(30, 4709957910567293326), - flags: 0, - properties: [ - ModelProperty( - id: const IdUid(1, 406597506935878482), - name: 'id', - type: 6, - flags: 1), - ModelProperty( - id: const IdUid(2, 5933268951084276983), - name: 'drinkingWater', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(3, 7714255537633512426), - name: 'sourceOfDrinkingWater', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(4, 2415808930190145187), - name: 'toiletFacility', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(5, 4950161314722702905), - name: 'communityToilet', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(6, 8384486349887445986), - name: 'environmentSanitationLevel', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(7, 2392963229872898504), - name: 'runningWaterAvailable', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(8, 3952912803449147993), - name: 'noOfTwoWheelers', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(9, 1669417226997886200), - name: 'noOfThreeWheelers', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(10, 5011624990870736391), - name: 'noOfFourWheelers', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(11, 8805489678700516176), - name: 'isCattleOwned', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(12, 8435942014491427702), - name: 'incomeFromCattle', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(13, 1694052736194978877), - name: 'isFarmLandOwned', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(14, 5615515454180248444), - name: 'isSeedsPreserved', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(15, 7655049526662030931), - name: 'isKitchenGardenOwned', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(16, 6193242875372395353), - name: 'addressOne', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(17, 1686900574402451883), - name: 'addressTwo', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(19, 1423273990910471875), - name: 'savedTime', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(20, 5507268764564482947), - name: 'dbLocationTopLeft', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(21, 4582363172019587389), - name: 'dbLocationTopRight', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(22, 69678934293790881), - name: 'dbLocationBottomLeft', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(23, 6516827898200627863), - name: 'dbLocationBottomRight', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(24, 614476397339919731), - name: 'city', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(25, 6573872590519653208), - name: 'dbTwoThreeWheelManufacturer', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(26, 697696816698768514), - name: 'dbTwoFourManufacturer', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(27, 4321042013916961622), - name: 'dbLocalFoodMap', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(28, 5736085922745483974), - name: 'dbPreservedSeedsMap', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(29, 8804761426863292202), - name: 'dbTreesOwnedMap', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(30, 4709957910567293326), - name: 'dbKitchenGardenPlants', - type: 9, - flags: 0) - ], - relations: [ - ModelRelation( - id: const IdUid(1, 1791331254757937694), - name: 'individualDataList', - targetId: const IdUid(2, 6685214565457365230)) - ], - backlinks: []) -]; - -/// Open an ObjectBox store with the model declared in this file. -Future openStore( - {String? directory, - int? maxDBSizeInKB, - int? fileMode, - int? maxReaders, - bool queriesCaseSensitiveDefault = true, - String? macosApplicationGroup}) async => - Store(getObjectBoxModel(), - directory: directory ?? (await defaultStoreDirectory()).path, - maxDBSizeInKB: maxDBSizeInKB, - fileMode: fileMode, - maxReaders: maxReaders, - queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, - macosApplicationGroup: macosApplicationGroup); - -/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel()) -ModelDefinition getObjectBoxModel() { - final model = ModelInfo( - entities: _entities, - lastEntityId: const IdUid(3, 5004688671325240296), - lastIndexId: const IdUid(1, 7346081088137941172), - lastRelationId: const IdUid(1, 1791331254757937694), - lastSequenceId: const IdUid(0, 0), - retiredEntityUids: const [], - retiredIndexUids: const [7346081088137941172], - retiredPropertyUids: const [1969777098633351831, 5524724872707357697], - retiredRelationUids: const [], - modelVersion: 5, - modelVersionParserMinimum: 5, - version: 1); - - final bindings = { - CommunityDataModel: EntityDefinition( - model: _entities[0], - toOneRelations: (CommunityDataModel object) => [], - toManyRelations: (CommunityDataModel object) => {}, - getId: (CommunityDataModel object) => object.id, - setId: (CommunityDataModel object, int id) { - object.id = id; - }, - objectToFB: (CommunityDataModel object, fb.Builder fbb) { - final resourceTypeOffset = object.resourceType == null - ? null - : fbb.writeString(object.resourceType!); - final villageCodeOffset = object.villageCode == null - ? null - : fbb.writeString(object.villageCode!); - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); - final dbLocationTopLeftOffset = object.dbLocationTopLeft == null - ? null - : fbb.writeString(object.dbLocationTopLeft!); - final dbLocationTopRightOffset = object.dbLocationTopRight == null - ? null - : fbb.writeString(object.dbLocationTopRight!); - final dbLocationBottomLeftOffset = object.dbLocationBottomLeft == null - ? null - : fbb.writeString(object.dbLocationBottomLeft!); - final dbLocationBottomRightOffset = - object.dbLocationBottomRight == null - ? null - : fbb.writeString(object.dbLocationBottomRight!); - fbb.startTable(9); - fbb.addInt64(0, object.id); - fbb.addOffset(1, resourceTypeOffset); - fbb.addOffset(2, villageCodeOffset); - fbb.addOffset(3, savedTimeOffset); - fbb.addOffset(4, dbLocationTopLeftOffset); - fbb.addOffset(5, dbLocationTopRightOffset); - fbb.addOffset(6, dbLocationBottomLeftOffset); - fbb.addOffset(7, dbLocationBottomRightOffset); - fbb.finish(fbb.endTable()); - return object.id; - }, - objectFromFB: (Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - - final object = CommunityDataModel( - resourceType: const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 6), - villageCode: const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 8)) - ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) - ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 10) - ..dbLocationTopLeft = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 12) - ..dbLocationTopRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 14) - ..dbLocationBottomLeft = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 16) - ..dbLocationBottomRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 18); - - return object; - }), - FamilyMemberIndividualDataModel: EntityDefinition< - FamilyMemberIndividualDataModel>( - model: _entities[1], - toOneRelations: (FamilyMemberIndividualDataModel object) => [], - toManyRelations: (FamilyMemberIndividualDataModel object) => {}, - getId: (FamilyMemberIndividualDataModel object) => object.id, - setId: (FamilyMemberIndividualDataModel object, int id) { - object.id = id; - }, - objectToFB: (FamilyMemberIndividualDataModel object, fb.Builder fbb) { - final userNameOffset = object.userName == null - ? null - : fbb.writeString(object.userName!); - final genderOffset = - object.gender == null ? null : fbb.writeString(object.gender!); - final phoneNumberOffset = object.phoneNumber == null - ? null - : fbb.writeString(object.phoneNumber!); - final educationQualificationOffset = - object.educationQualification == null - ? null - : fbb.writeString(object.educationQualification!); - final aadhaarNumberOffset = object.aadhaarNumber == null - ? null - : fbb.writeString(object.aadhaarNumber!); - final dailyWageWorkerOffset = object.dailyWageWorker == null - ? null - : fbb.writeString(object.dailyWageWorker!); - final incomePerDayOffset = object.incomePerDay == null - ? null - : fbb.writeString(object.incomePerDay!); - final incomePerMonthOffset = object.incomePerMonth == null - ? null - : fbb.writeString(object.incomePerMonth!); - final pensionOffset = - object.pension == null ? null : fbb.writeString(object.pension!); - final businessStatusOffset = object.businessStatus == null - ? null - : fbb.writeString(object.businessStatus!); - final maritalStatusOffset = object.maritalStatus == null - ? null - : fbb.writeString(object.maritalStatus!); - final specialSkillsOffset = object.specialSkills == null - ? null - : fbb.writeList(object.specialSkills! - .map(fbb.writeString) - .toList(growable: false)); - final frequentAilmentsOffset = object.frequentAilments == null - ? null - : fbb.writeList(object.frequentAilments! - .map(fbb.writeString) - .toList(growable: false)); - final commutableDiseaseOffset = object.commutableDisease == null - ? null - : fbb.writeList(object.commutableDisease! - .map(fbb.writeString) - .toList(growable: false)); - final nonCommutableDiseaseOffset = object.nonCommutableDisease == null - ? null - : fbb.writeList(object.nonCommutableDisease! - .map(fbb.writeString) - .toList(growable: false)); - final surgeriesOffset = object.surgeries == null - ? null - : fbb.writeString(object.surgeries!); - final anganwadiServicesAwareOffset = - object.anganwadiServicesAware == null - ? null - : fbb.writeString(object.anganwadiServicesAware!); - final anganwadiServicesUsingOffset = - object.anganwadiServicesUsing == null - ? null - : fbb.writeString(object.anganwadiServicesUsing!); - final anganwadiServicesUsedListOffset = - object.anganwadiServicesUsedList == null - ? null - : fbb.writeList(object.anganwadiServicesUsedList! - .map(fbb.writeString) - .toList(growable: false)); - final PHCServicesUsedListOffset = object.PHCServicesUsedList == null - ? null - : fbb.writeList(object.PHCServicesUsedList! - .map(fbb.writeString) - .toList(growable: false)); - final privateClinicServicesUsedListOffset = - object.privateClinicServicesUsedList == null - ? null - : fbb.writeList(object.privateClinicServicesUsedList! - .map(fbb.writeString) - .toList(growable: false)); - final privateServiceReasonOffset = object.privateServiceReason == null - ? null - : fbb.writeString(object.privateServiceReason!); - final useOfTobaccoOffset = object.useOfTobacco == null - ? null - : fbb.writeString(object.useOfTobacco!); - final useOfAlcoholOffset = object.useOfAlcohol == null - ? null - : fbb.writeString(object.useOfAlcohol!); - final aarogyaSetuInstalledOffset = object.aarogyaSetuInstalled == null - ? null - : fbb.writeString(object.aarogyaSetuInstalled!); - final vizhithiruInstalledOffset = object.vizhithiruInstalled == null - ? null - : fbb.writeString(object.vizhithiruInstalled!); - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); - final dbVulnerabilitiesOffset = object.dbVulnerabilities == null - ? null - : fbb.writeString(object.dbVulnerabilities!); - final dbOccupationOffset = object.dbOccupation == null - ? null - : fbb.writeString(object.dbOccupation!); - fbb.startTable(33); - fbb.addInt64(0, object.id); - fbb.addOffset(1, userNameOffset); - fbb.addInt64(2, object.dateOfBirth?.millisecondsSinceEpoch); - fbb.addOffset(3, genderOffset); - fbb.addOffset(4, phoneNumberOffset); - fbb.addOffset(5, educationQualificationOffset); - fbb.addOffset(6, aadhaarNumberOffset); - fbb.addOffset(7, dailyWageWorkerOffset); - fbb.addOffset(8, incomePerDayOffset); - fbb.addOffset(9, incomePerMonthOffset); - fbb.addOffset(10, pensionOffset); - fbb.addOffset(11, businessStatusOffset); - fbb.addOffset(12, maritalStatusOffset); - fbb.addOffset(13, specialSkillsOffset); - fbb.addOffset(14, frequentAilmentsOffset); - fbb.addOffset(15, commutableDiseaseOffset); - fbb.addOffset(16, nonCommutableDiseaseOffset); - fbb.addOffset(17, surgeriesOffset); - fbb.addOffset(18, anganwadiServicesAwareOffset); - fbb.addOffset(19, anganwadiServicesUsingOffset); - fbb.addOffset(20, anganwadiServicesUsedListOffset); - fbb.addOffset(21, PHCServicesUsedListOffset); - fbb.addOffset(22, privateClinicServicesUsedListOffset); - fbb.addOffset(23, privateServiceReasonOffset); - fbb.addOffset(24, useOfTobaccoOffset); - fbb.addOffset(25, useOfAlcoholOffset); - fbb.addOffset(26, aarogyaSetuInstalledOffset); - fbb.addOffset(27, vizhithiruInstalledOffset); - fbb.addOffset(29, savedTimeOffset); - fbb.addOffset(30, dbVulnerabilitiesOffset); - fbb.addOffset(31, dbOccupationOffset); - fbb.finish(fbb.endTable()); - return object.id; - }, - objectFromFB: (Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final dateOfBirthValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 8); - final object = FamilyMemberIndividualDataModel( - userName: const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 6)) - ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) - ..dateOfBirth = dateOfBirthValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateOfBirthValue) - ..gender = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 10) - ..phoneNumber = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 12) - ..educationQualification = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 14) - ..aadhaarNumber = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 16) - ..dailyWageWorker = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 18) - ..incomePerDay = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 20) - ..incomePerMonth = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 22) - ..pension = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 24) - ..businessStatus = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 26) - ..maritalStatus = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 28) - ..specialSkills = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 30) - ..frequentAilments = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 32) - ..commutableDisease = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 34) - ..nonCommutableDisease = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 36) - ..surgeries = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 38) - ..anganwadiServicesAware = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 40) - ..anganwadiServicesUsing = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 42) - ..anganwadiServicesUsedList = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 44) - ..PHCServicesUsedList = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 46) - ..privateClinicServicesUsedList = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 48) - ..privateServiceReason = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 50) - ..useOfTobacco = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 52) - ..useOfAlcohol = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 54) - ..aarogyaSetuInstalled = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 56) - ..vizhithiruInstalled = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 58) - ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 62) - ..dbVulnerabilities = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 64) - ..dbOccupation = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 66); - - return object; - }), - FamilyMembersCommonDataModel: EntityDefinition< - FamilyMembersCommonDataModel>( - model: _entities[2], - toOneRelations: (FamilyMembersCommonDataModel object) => [], - toManyRelations: (FamilyMembersCommonDataModel object) => { - RelInfo.toMany(1, object.id): - object.individualDataList - }, - getId: (FamilyMembersCommonDataModel object) => object.id, - setId: (FamilyMembersCommonDataModel object, int id) { - object.id = id; - }, - objectToFB: (FamilyMembersCommonDataModel object, fb.Builder fbb) { - final drinkingWaterOffset = object.drinkingWater == null - ? null - : fbb.writeString(object.drinkingWater!); - final sourceOfDrinkingWaterOffset = - object.sourceOfDrinkingWater == null - ? null - : fbb.writeString(object.sourceOfDrinkingWater!); - final toiletFacilityOffset = object.toiletFacility == null - ? null - : fbb.writeString(object.toiletFacility!); - final communityToiletOffset = object.communityToilet == null - ? null - : fbb.writeString(object.communityToilet!); - final environmentSanitationLevelOffset = - object.environmentSanitationLevel == null - ? null - : fbb.writeString(object.environmentSanitationLevel!); - final runningWaterAvailableOffset = - object.runningWaterAvailable == null - ? null - : fbb.writeString(object.runningWaterAvailable!); - final noOfTwoWheelersOffset = object.noOfTwoWheelers == null - ? null - : fbb.writeString(object.noOfTwoWheelers!); - final noOfThreeWheelersOffset = object.noOfThreeWheelers == null - ? null - : fbb.writeString(object.noOfThreeWheelers!); - final noOfFourWheelersOffset = object.noOfFourWheelers == null - ? null - : fbb.writeString(object.noOfFourWheelers!); - final isCattleOwnedOffset = object.isCattleOwned == null - ? null - : fbb.writeString(object.isCattleOwned!); - final incomeFromCattleOffset = object.incomeFromCattle == null - ? null - : fbb.writeString(object.incomeFromCattle!); - final isFarmLandOwnedOffset = object.isFarmLandOwned == null - ? null - : fbb.writeString(object.isFarmLandOwned!); - final isSeedsPreservedOffset = object.isSeedsPreserved == null - ? null - : fbb.writeString(object.isSeedsPreserved!); - final isKitchenGardenOwnedOffset = object.isKitchenGardenOwned == null - ? null - : fbb.writeString(object.isKitchenGardenOwned!); - final addressOneOffset = object.addressOne == null - ? null - : fbb.writeString(object.addressOne!); - final addressTwoOffset = object.addressTwo == null - ? null - : fbb.writeString(object.addressTwo!); - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); - final dbLocationTopLeftOffset = object.dbLocationTopLeft == null - ? null - : fbb.writeString(object.dbLocationTopLeft!); - final dbLocationTopRightOffset = object.dbLocationTopRight == null - ? null - : fbb.writeString(object.dbLocationTopRight!); - final dbLocationBottomLeftOffset = object.dbLocationBottomLeft == null - ? null - : fbb.writeString(object.dbLocationBottomLeft!); - final dbLocationBottomRightOffset = - object.dbLocationBottomRight == null - ? null - : fbb.writeString(object.dbLocationBottomRight!); - final cityOffset = - object.city == null ? null : fbb.writeString(object.city!); - final dbTwoThreeWheelManufacturerOffset = - object.dbTwoThreeWheelManufacturer == null - ? null - : fbb.writeString(object.dbTwoThreeWheelManufacturer!); - final dbTwoFourManufacturerOffset = - object.dbTwoFourManufacturer == null - ? null - : fbb.writeString(object.dbTwoFourManufacturer!); - final dbLocalFoodMapOffset = object.dbLocalFoodMap == null - ? null - : fbb.writeString(object.dbLocalFoodMap!); - final dbPreservedSeedsMapOffset = object.dbPreservedSeedsMap == null - ? null - : fbb.writeString(object.dbPreservedSeedsMap!); - final dbTreesOwnedMapOffset = object.dbTreesOwnedMap == null - ? null - : fbb.writeString(object.dbTreesOwnedMap!); - final dbKitchenGardenPlantsOffset = - object.dbKitchenGardenPlants == null - ? null - : fbb.writeString(object.dbKitchenGardenPlants!); - fbb.startTable(31); - fbb.addInt64(0, object.id); - fbb.addOffset(1, drinkingWaterOffset); - fbb.addOffset(2, sourceOfDrinkingWaterOffset); - fbb.addOffset(3, toiletFacilityOffset); - fbb.addOffset(4, communityToiletOffset); - fbb.addOffset(5, environmentSanitationLevelOffset); - fbb.addOffset(6, runningWaterAvailableOffset); - fbb.addOffset(7, noOfTwoWheelersOffset); - fbb.addOffset(8, noOfThreeWheelersOffset); - fbb.addOffset(9, noOfFourWheelersOffset); - fbb.addOffset(10, isCattleOwnedOffset); - fbb.addOffset(11, incomeFromCattleOffset); - fbb.addOffset(12, isFarmLandOwnedOffset); - fbb.addOffset(13, isSeedsPreservedOffset); - fbb.addOffset(14, isKitchenGardenOwnedOffset); - fbb.addOffset(15, addressOneOffset); - fbb.addOffset(16, addressTwoOffset); - fbb.addOffset(18, savedTimeOffset); - fbb.addOffset(19, dbLocationTopLeftOffset); - fbb.addOffset(20, dbLocationTopRightOffset); - fbb.addOffset(21, dbLocationBottomLeftOffset); - fbb.addOffset(22, dbLocationBottomRightOffset); - fbb.addOffset(23, cityOffset); - fbb.addOffset(24, dbTwoThreeWheelManufacturerOffset); - fbb.addOffset(25, dbTwoFourManufacturerOffset); - fbb.addOffset(26, dbLocalFoodMapOffset); - fbb.addOffset(27, dbPreservedSeedsMapOffset); - fbb.addOffset(28, dbTreesOwnedMapOffset); - fbb.addOffset(29, dbKitchenGardenPlantsOffset); - fbb.finish(fbb.endTable()); - return object.id; - }, - objectFromFB: (Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - - final object = FamilyMembersCommonDataModel() - ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) - ..drinkingWater = - const fb.StringReader().vTableGetNullable(buffer, rootOffset, 6) - ..sourceOfDrinkingWater = - const fb.StringReader().vTableGetNullable(buffer, rootOffset, 8) - ..toiletFacility = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 10) - ..communityToilet = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 12) - ..environmentSanitationLevel = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 14) - ..runningWaterAvailable = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 16) - ..noOfTwoWheelers = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 18) - ..noOfThreeWheelers = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 20) - ..noOfFourWheelers = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 22) - ..isCattleOwned = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 24) - ..incomeFromCattle = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 26) - ..isFarmLandOwned = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 28) - ..isSeedsPreserved = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 30) - ..isKitchenGardenOwned = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 32) - ..addressOne = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 34) - ..addressTwo = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 36) - ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 40) - ..dbLocationTopLeft = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 42) - ..dbLocationTopRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 44) - ..dbLocationBottomLeft = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 46) - ..dbLocationBottomRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 48) - ..city = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 50) - ..dbTwoThreeWheelManufacturer = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 52) - ..dbTwoFourManufacturer = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 54) - ..dbLocalFoodMap = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 56) - ..dbPreservedSeedsMap = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 58) - ..dbTreesOwnedMap = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 60) - ..dbKitchenGardenPlants = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 62); - InternalToManyAccess.setRelInfo( - object.individualDataList, - store, - RelInfo.toMany(1, object.id), - store.box()); - return object; - }) - }; - - return ModelDefinition(model, bindings); -} - -/// [CommunityDataModel] entity fields to define ObjectBox queries. -class CommunityDataModel_ { - /// see [CommunityDataModel.id] - static final id = - QueryIntegerProperty(_entities[0].properties[0]); - - /// see [CommunityDataModel.resourceType] - static final resourceType = - QueryStringProperty(_entities[0].properties[1]); - - /// see [CommunityDataModel.villageCode] - static final villageCode = - QueryStringProperty(_entities[0].properties[2]); - - /// see [CommunityDataModel.savedTime] - static final savedTime = - QueryStringProperty(_entities[0].properties[3]); - - /// see [CommunityDataModel.dbLocationTopLeft] - static final dbLocationTopLeft = - QueryStringProperty(_entities[0].properties[4]); - - /// see [CommunityDataModel.dbLocationTopRight] - static final dbLocationTopRight = - QueryStringProperty(_entities[0].properties[5]); - - /// see [CommunityDataModel.dbLocationBottomLeft] - static final dbLocationBottomLeft = - QueryStringProperty(_entities[0].properties[6]); - - /// see [CommunityDataModel.dbLocationBottomRight] - static final dbLocationBottomRight = - QueryStringProperty(_entities[0].properties[7]); -} - -/// [FamilyMemberIndividualDataModel] entity fields to define ObjectBox queries. -class FamilyMemberIndividualDataModel_ { - /// see [FamilyMemberIndividualDataModel.id] - static final id = QueryIntegerProperty( - _entities[1].properties[0]); - - /// see [FamilyMemberIndividualDataModel.userName] - static final userName = QueryStringProperty( - _entities[1].properties[1]); - - /// see [FamilyMemberIndividualDataModel.dateOfBirth] - static final dateOfBirth = - QueryIntegerProperty( - _entities[1].properties[2]); - - /// see [FamilyMemberIndividualDataModel.gender] - static final gender = QueryStringProperty( - _entities[1].properties[3]); - - /// see [FamilyMemberIndividualDataModel.phoneNumber] - static final phoneNumber = - QueryStringProperty( - _entities[1].properties[4]); - - /// see [FamilyMemberIndividualDataModel.educationQualification] - static final educationQualification = - QueryStringProperty( - _entities[1].properties[5]); - - /// see [FamilyMemberIndividualDataModel.aadhaarNumber] - static final aadhaarNumber = - QueryStringProperty( - _entities[1].properties[6]); - - /// see [FamilyMemberIndividualDataModel.dailyWageWorker] - static final dailyWageWorker = - QueryStringProperty( - _entities[1].properties[7]); - - /// see [FamilyMemberIndividualDataModel.incomePerDay] - static final incomePerDay = - QueryStringProperty( - _entities[1].properties[8]); - - /// see [FamilyMemberIndividualDataModel.incomePerMonth] - static final incomePerMonth = - QueryStringProperty( - _entities[1].properties[9]); - - /// see [FamilyMemberIndividualDataModel.pension] - static final pension = QueryStringProperty( - _entities[1].properties[10]); - - /// see [FamilyMemberIndividualDataModel.businessStatus] - static final businessStatus = - QueryStringProperty( - _entities[1].properties[11]); - - /// see [FamilyMemberIndividualDataModel.maritalStatus] - static final maritalStatus = - QueryStringProperty( - _entities[1].properties[12]); - - /// see [FamilyMemberIndividualDataModel.specialSkills] - static final specialSkills = - QueryStringVectorProperty( - _entities[1].properties[13]); - - /// see [FamilyMemberIndividualDataModel.frequentAilments] - static final frequentAilments = - QueryStringVectorProperty( - _entities[1].properties[14]); - - /// see [FamilyMemberIndividualDataModel.commutableDisease] - static final commutableDisease = - QueryStringVectorProperty( - _entities[1].properties[15]); - - /// see [FamilyMemberIndividualDataModel.nonCommutableDisease] - static final nonCommutableDisease = - QueryStringVectorProperty( - _entities[1].properties[16]); - - /// see [FamilyMemberIndividualDataModel.surgeries] - static final surgeries = QueryStringProperty( - _entities[1].properties[17]); - - /// see [FamilyMemberIndividualDataModel.anganwadiServicesAware] - static final anganwadiServicesAware = - QueryStringProperty( - _entities[1].properties[18]); - - /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsing] - static final anganwadiServicesUsing = - QueryStringProperty( - _entities[1].properties[19]); - - /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsedList] - static final anganwadiServicesUsedList = - QueryStringVectorProperty( - _entities[1].properties[20]); - - /// see [FamilyMemberIndividualDataModel.PHCServicesUsedList] - static final PHCServicesUsedList = - QueryStringVectorProperty( - _entities[1].properties[21]); - - /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsedList] - static final privateClinicServicesUsedList = - QueryStringVectorProperty( - _entities[1].properties[22]); - - /// see [FamilyMemberIndividualDataModel.privateServiceReason] - static final privateServiceReason = - QueryStringProperty( - _entities[1].properties[23]); - - /// see [FamilyMemberIndividualDataModel.useOfTobacco] - static final useOfTobacco = - QueryStringProperty( - _entities[1].properties[24]); - - /// see [FamilyMemberIndividualDataModel.useOfAlcohol] - static final useOfAlcohol = - QueryStringProperty( - _entities[1].properties[25]); - - /// see [FamilyMemberIndividualDataModel.aarogyaSetuInstalled] - static final aarogyaSetuInstalled = - QueryStringProperty( - _entities[1].properties[26]); - - /// see [FamilyMemberIndividualDataModel.vizhithiruInstalled] - static final vizhithiruInstalled = - QueryStringProperty( - _entities[1].properties[27]); - - /// see [FamilyMemberIndividualDataModel.savedTime] - static final savedTime = QueryStringProperty( - _entities[1].properties[28]); - - /// see [FamilyMemberIndividualDataModel.dbVulnerabilities] - static final dbVulnerabilities = - QueryStringProperty( - _entities[1].properties[29]); - - /// see [FamilyMemberIndividualDataModel.dbOccupation] - static final dbOccupation = - QueryStringProperty( - _entities[1].properties[30]); -} - -/// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. -class FamilyMembersCommonDataModel_ { - /// see [FamilyMembersCommonDataModel.id] - static final id = QueryIntegerProperty( - _entities[2].properties[0]); - - /// see [FamilyMembersCommonDataModel.drinkingWater] - static final drinkingWater = - QueryStringProperty( - _entities[2].properties[1]); - - /// see [FamilyMembersCommonDataModel.sourceOfDrinkingWater] - static final sourceOfDrinkingWater = - QueryStringProperty( - _entities[2].properties[2]); - - /// see [FamilyMembersCommonDataModel.toiletFacility] - static final toiletFacility = - QueryStringProperty( - _entities[2].properties[3]); - - /// see [FamilyMembersCommonDataModel.communityToilet] - static final communityToilet = - QueryStringProperty( - _entities[2].properties[4]); - - /// see [FamilyMembersCommonDataModel.environmentSanitationLevel] - static final environmentSanitationLevel = - QueryStringProperty( - _entities[2].properties[5]); - - /// see [FamilyMembersCommonDataModel.runningWaterAvailable] - static final runningWaterAvailable = - QueryStringProperty( - _entities[2].properties[6]); - - /// see [FamilyMembersCommonDataModel.noOfTwoWheelers] - static final noOfTwoWheelers = - QueryStringProperty( - _entities[2].properties[7]); - - /// see [FamilyMembersCommonDataModel.noOfThreeWheelers] - static final noOfThreeWheelers = - QueryStringProperty( - _entities[2].properties[8]); - - /// see [FamilyMembersCommonDataModel.noOfFourWheelers] - static final noOfFourWheelers = - QueryStringProperty( - _entities[2].properties[9]); - - /// see [FamilyMembersCommonDataModel.isCattleOwned] - static final isCattleOwned = - QueryStringProperty( - _entities[2].properties[10]); - - /// see [FamilyMembersCommonDataModel.incomeFromCattle] - static final incomeFromCattle = - QueryStringProperty( - _entities[2].properties[11]); - - /// see [FamilyMembersCommonDataModel.isFarmLandOwned] - static final isFarmLandOwned = - QueryStringProperty( - _entities[2].properties[12]); - - /// see [FamilyMembersCommonDataModel.isSeedsPreserved] - static final isSeedsPreserved = - QueryStringProperty( - _entities[2].properties[13]); - - /// see [FamilyMembersCommonDataModel.isKitchenGardenOwned] - static final isKitchenGardenOwned = - QueryStringProperty( - _entities[2].properties[14]); - - /// see [FamilyMembersCommonDataModel.addressOne] - static final addressOne = QueryStringProperty( - _entities[2].properties[15]); - - /// see [FamilyMembersCommonDataModel.addressTwo] - static final addressTwo = QueryStringProperty( - _entities[2].properties[16]); - - /// see [FamilyMembersCommonDataModel.savedTime] - static final savedTime = QueryStringProperty( - _entities[2].properties[17]); - - /// see [FamilyMembersCommonDataModel.dbLocationTopLeft] - static final dbLocationTopLeft = - QueryStringProperty( - _entities[2].properties[18]); - - /// see [FamilyMembersCommonDataModel.dbLocationTopRight] - static final dbLocationTopRight = - QueryStringProperty( - _entities[2].properties[19]); - - /// see [FamilyMembersCommonDataModel.dbLocationBottomLeft] - static final dbLocationBottomLeft = - QueryStringProperty( - _entities[2].properties[20]); - - /// see [FamilyMembersCommonDataModel.dbLocationBottomRight] - static final dbLocationBottomRight = - QueryStringProperty( - _entities[2].properties[21]); - - /// see [FamilyMembersCommonDataModel.city] - static final city = QueryStringProperty( - _entities[2].properties[22]); - - /// see [FamilyMembersCommonDataModel.dbTwoThreeWheelManufacturer] - static final dbTwoThreeWheelManufacturer = - QueryStringProperty( - _entities[2].properties[23]); - - /// see [FamilyMembersCommonDataModel.dbTwoFourManufacturer] - static final dbTwoFourManufacturer = - QueryStringProperty( - _entities[2].properties[24]); - - /// see [FamilyMembersCommonDataModel.dbLocalFoodMap] - static final dbLocalFoodMap = - QueryStringProperty( - _entities[2].properties[25]); - - /// see [FamilyMembersCommonDataModel.dbPreservedSeedsMap] - static final dbPreservedSeedsMap = - QueryStringProperty( - _entities[2].properties[26]); - - /// see [FamilyMembersCommonDataModel.dbTreesOwnedMap] - static final dbTreesOwnedMap = - QueryStringProperty( - _entities[2].properties[27]); - - /// see [FamilyMembersCommonDataModel.dbKitchenGardenPlants] - static final dbKitchenGardenPlants = - QueryStringProperty( - _entities[2].properties[28]); - - /// see [FamilyMembersCommonDataModel.individualDataList] - static final individualDataList = QueryRelationToMany< - FamilyMembersCommonDataModel, - FamilyMemberIndividualDataModel>(_entities[2].relations[0]); -} From 1e9ddae0e1d8b9505b758b02951272cabd4514bc Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 18:22:52 +0530 Subject: [PATCH 129/264] Added validation variable for family page --- lib/objectbox-model.json | 406 ++++++++++++ lib/objectbox.g.dart | 1300 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 1706 insertions(+) create mode 100644 lib/objectbox-model.json create mode 100644 lib/objectbox.g.dart diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json new file mode 100644 index 0000000..30ac7af --- /dev/null +++ b/lib/objectbox-model.json @@ -0,0 +1,406 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:6144760902505378968", + "lastPropertyId": "8:1374390598853638581", + "name": "CommunityDataModel", + "properties": [ + { + "id": "1:4748866847843651725", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:2932393208152434267", + "name": "resourceType", + "type": 9 + }, + { + "id": "3:1921952090063309092", + "name": "villageCode", + "type": 9 + }, + { + "id": "4:4458344485253850474", + "name": "savedTime", + "type": 9 + }, + { + "id": "5:7168925326320672943", + "name": "dbLocationTopLeft", + "type": 9 + }, + { + "id": "6:6976643051535550913", + "name": "dbLocationTopRight", + "type": 9 + }, + { + "id": "7:2527558881981362435", + "name": "dbLocationBottomLeft", + "type": 9 + }, + { + "id": "8:1374390598853638581", + "name": "dbLocationBottomRight", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:4604626538020621410", + "lastPropertyId": "32:1328642062638523745", + "name": "FamilyMemberIndividualDataModel", + "properties": [ + { + "id": "1:1615626269752887015", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:147960419452912546", + "name": "userName", + "type": 9 + }, + { + "id": "3:2641592509733256058", + "name": "dateOfBirth", + "type": 10 + }, + { + "id": "4:6282594208002927050", + "name": "gender", + "type": 9 + }, + { + "id": "5:4209209735115259461", + "name": "phoneNumber", + "type": 9 + }, + { + "id": "6:3962014586057530124", + "name": "educationQualification", + "type": 9 + }, + { + "id": "7:1340435734295744333", + "name": "aadhaarNumber", + "type": 9 + }, + { + "id": "8:8202265740818534316", + "name": "dailyWageWorker", + "type": 9 + }, + { + "id": "9:5611188519781040934", + "name": "incomePerDay", + "type": 9 + }, + { + "id": "10:1258910779661384685", + "name": "incomePerMonth", + "type": 9 + }, + { + "id": "11:742592545502650523", + "name": "pension", + "type": 9 + }, + { + "id": "12:7975675992055446810", + "name": "businessStatus", + "type": 9 + }, + { + "id": "13:747564586513409332", + "name": "maritalStatus", + "type": 9 + }, + { + "id": "14:5573484003127214285", + "name": "specialSkills", + "type": 30 + }, + { + "id": "15:1780571115080959247", + "name": "frequentAilments", + "type": 30 + }, + { + "id": "16:5383502869453245964", + "name": "commutableDisease", + "type": 30 + }, + { + "id": "17:2820386840249227222", + "name": "nonCommutableDisease", + "type": 30 + }, + { + "id": "18:2506597441281996495", + "name": "surgeries", + "type": 9 + }, + { + "id": "19:7773359300531977330", + "name": "anganwadiServicesAware", + "type": 9 + }, + { + "id": "20:9088237078871159207", + "name": "anganwadiServicesUsing", + "type": 9 + }, + { + "id": "21:591653671698069367", + "name": "anganwadiServicesUsedList", + "type": 30 + }, + { + "id": "22:8089710746679848906", + "name": "PHCServicesUsedList", + "type": 30 + }, + { + "id": "23:4567441488943246138", + "name": "privateClinicServicesUsedList", + "type": 30 + }, + { + "id": "24:1321911158882624161", + "name": "privateServiceReason", + "type": 9 + }, + { + "id": "25:515443054774028092", + "name": "useOfTobacco", + "type": 9 + }, + { + "id": "26:8707238561404829402", + "name": "useOfAlcohol", + "type": 9 + }, + { + "id": "27:3309599826830426346", + "name": "aarogyaSetuInstalled", + "type": 9 + }, + { + "id": "28:9084202418978987072", + "name": "vizhithiruInstalled", + "type": 9 + }, + { + "id": "29:7889719359007222937", + "name": "dataValid", + "type": 1 + }, + { + "id": "30:3511831625273329956", + "name": "savedTime", + "type": 9 + }, + { + "id": "31:4870102737459248754", + "name": "dbVulnerabilities", + "type": 9 + }, + { + "id": "32:1328642062638523745", + "name": "dbOccupation", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "3:4555229639046191310", + "lastPropertyId": "31:257396080593114234", + "name": "FamilyMembersCommonDataModel", + "properties": [ + { + "id": "1:8819136016483451605", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:3437476224699639583", + "name": "drinkingWater", + "type": 9 + }, + { + "id": "3:961043903550204529", + "name": "sourceOfDrinkingWater", + "type": 9 + }, + { + "id": "4:2341047533460923742", + "name": "toiletFacility", + "type": 9 + }, + { + "id": "5:111976571800950215", + "name": "communityToilet", + "type": 9 + }, + { + "id": "6:8175958428232054206", + "name": "environmentSanitationLevel", + "type": 9 + }, + { + "id": "7:7080507576734769781", + "name": "runningWaterAvailable", + "type": 9 + }, + { + "id": "8:3619777862295069103", + "name": "noOfTwoWheelers", + "type": 9 + }, + { + "id": "9:2220681223517389029", + "name": "noOfThreeWheelers", + "type": 9 + }, + { + "id": "10:5295960391830025761", + "name": "noOfFourWheelers", + "type": 9 + }, + { + "id": "11:3999230000658269584", + "name": "isCattleOwned", + "type": 9 + }, + { + "id": "12:8174000252850380247", + "name": "incomeFromCattle", + "type": 9 + }, + { + "id": "13:4187254125313827388", + "name": "isFarmLandOwned", + "type": 9 + }, + { + "id": "14:4007865345223693029", + "name": "isSeedsPreserved", + "type": 9 + }, + { + "id": "15:5799753283360608792", + "name": "isKitchenGardenOwned", + "type": 9 + }, + { + "id": "16:3272250098967751212", + "name": "addressOne", + "type": 9 + }, + { + "id": "17:5993366458798453696", + "name": "addressTwo", + "type": 9 + }, + { + "id": "18:8246574557213969028", + "name": "city", + "type": 9 + }, + { + "id": "19:5398790887074809282", + "name": "locationPageValid", + "type": 1 + }, + { + "id": "20:6657479069084504293", + "name": "commonDetailsValid", + "type": 1 + }, + { + "id": "21:6821885131227205219", + "name": "savedTime", + "type": 9 + }, + { + "id": "22:5541702793145940965", + "name": "dbLocationTopLeft", + "type": 9 + }, + { + "id": "23:4155729105605878928", + "name": "dbLocationTopRight", + "type": 9 + }, + { + "id": "24:176578608674560191", + "name": "dbLocationBottomLeft", + "type": 9 + }, + { + "id": "25:3352596760349944439", + "name": "dbLocationBottomRight", + "type": 9 + }, + { + "id": "26:8858146981830191665", + "name": "dbTwoThreeWheelManufacturer", + "type": 9 + }, + { + "id": "27:6657331618266238890", + "name": "dbTwoFourManufacturer", + "type": 9 + }, + { + "id": "28:2360124385132929587", + "name": "dbLocalFoodMap", + "type": 9 + }, + { + "id": "29:5230846993278344596", + "name": "dbPreservedSeedsMap", + "type": 9 + }, + { + "id": "30:2725907391283288263", + "name": "dbTreesOwnedMap", + "type": 9 + }, + { + "id": "31:257396080593114234", + "name": "dbKitchenGardenPlants", + "type": 9 + } + ], + "relations": [ + { + "id": "1:3641078863127427509", + "name": "individualDataList", + "targetId": "2:4604626538020621410" + } + ] + } + ], + "lastEntityId": "3:4555229639046191310", + "lastIndexId": "0:0", + "lastRelationId": "1:3641078863127427509", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart new file mode 100644 index 0000000..cd793a0 --- /dev/null +++ b/lib/objectbox.g.dart @@ -0,0 +1,1300 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ignore_for_file: camel_case_types + +import 'dart:typed_data'; + +import 'package:objectbox/flatbuffers/flat_buffers.dart' as fb; +import 'package:objectbox/internal.dart'; // generated code can access "internal" functionality +import 'package:objectbox/objectbox.dart'; +import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; + +import 'Model/CommunityDataModel.dart'; +import 'Model/FamilyMembersCommonDataModel.dart'; + +export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file + +final _entities = [ + ModelEntity( + id: const IdUid(1, 6144760902505378968), + name: 'CommunityDataModel', + lastPropertyId: const IdUid(8, 1374390598853638581), + flags: 0, + properties: [ + ModelProperty( + id: const IdUid(1, 4748866847843651725), + name: 'id', + type: 6, + flags: 1), + ModelProperty( + id: const IdUid(2, 2932393208152434267), + name: 'resourceType', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(3, 1921952090063309092), + name: 'villageCode', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(4, 4458344485253850474), + name: 'savedTime', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(5, 7168925326320672943), + name: 'dbLocationTopLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(6, 6976643051535550913), + name: 'dbLocationTopRight', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(7, 2527558881981362435), + name: 'dbLocationBottomLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(8, 1374390598853638581), + name: 'dbLocationBottomRight', + type: 9, + flags: 0) + ], + relations: [], + backlinks: []), + ModelEntity( + id: const IdUid(2, 4604626538020621410), + name: 'FamilyMemberIndividualDataModel', + lastPropertyId: const IdUid(32, 1328642062638523745), + flags: 0, + properties: [ + ModelProperty( + id: const IdUid(1, 1615626269752887015), + name: 'id', + type: 6, + flags: 1), + ModelProperty( + id: const IdUid(2, 147960419452912546), + name: 'userName', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(3, 2641592509733256058), + name: 'dateOfBirth', + type: 10, + flags: 0), + ModelProperty( + id: const IdUid(4, 6282594208002927050), + name: 'gender', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(5, 4209209735115259461), + name: 'phoneNumber', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(6, 3962014586057530124), + name: 'educationQualification', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(7, 1340435734295744333), + name: 'aadhaarNumber', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(8, 8202265740818534316), + name: 'dailyWageWorker', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(9, 5611188519781040934), + name: 'incomePerDay', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(10, 1258910779661384685), + name: 'incomePerMonth', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(11, 742592545502650523), + name: 'pension', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(12, 7975675992055446810), + name: 'businessStatus', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(13, 747564586513409332), + name: 'maritalStatus', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(14, 5573484003127214285), + name: 'specialSkills', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(15, 1780571115080959247), + name: 'frequentAilments', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(16, 5383502869453245964), + name: 'commutableDisease', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(17, 2820386840249227222), + name: 'nonCommutableDisease', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(18, 2506597441281996495), + name: 'surgeries', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(19, 7773359300531977330), + name: 'anganwadiServicesAware', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(20, 9088237078871159207), + name: 'anganwadiServicesUsing', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(21, 591653671698069367), + name: 'anganwadiServicesUsedList', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(22, 8089710746679848906), + name: 'PHCServicesUsedList', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(23, 4567441488943246138), + name: 'privateClinicServicesUsedList', + type: 30, + flags: 0), + ModelProperty( + id: const IdUid(24, 1321911158882624161), + name: 'privateServiceReason', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(25, 515443054774028092), + name: 'useOfTobacco', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(26, 8707238561404829402), + name: 'useOfAlcohol', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(27, 3309599826830426346), + name: 'aarogyaSetuInstalled', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(28, 9084202418978987072), + name: 'vizhithiruInstalled', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(29, 7889719359007222937), + name: 'dataValid', + type: 1, + flags: 0), + ModelProperty( + id: const IdUid(30, 3511831625273329956), + name: 'savedTime', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(31, 4870102737459248754), + name: 'dbVulnerabilities', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(32, 1328642062638523745), + name: 'dbOccupation', + type: 9, + flags: 0) + ], + relations: [], + backlinks: []), + ModelEntity( + id: const IdUid(3, 4555229639046191310), + name: 'FamilyMembersCommonDataModel', + lastPropertyId: const IdUid(31, 257396080593114234), + flags: 0, + properties: [ + ModelProperty( + id: const IdUid(1, 8819136016483451605), + name: 'id', + type: 6, + flags: 1), + ModelProperty( + id: const IdUid(2, 3437476224699639583), + name: 'drinkingWater', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(3, 961043903550204529), + name: 'sourceOfDrinkingWater', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(4, 2341047533460923742), + name: 'toiletFacility', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(5, 111976571800950215), + name: 'communityToilet', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(6, 8175958428232054206), + name: 'environmentSanitationLevel', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(7, 7080507576734769781), + name: 'runningWaterAvailable', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(8, 3619777862295069103), + name: 'noOfTwoWheelers', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(9, 2220681223517389029), + name: 'noOfThreeWheelers', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(10, 5295960391830025761), + name: 'noOfFourWheelers', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(11, 3999230000658269584), + name: 'isCattleOwned', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(12, 8174000252850380247), + name: 'incomeFromCattle', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(13, 4187254125313827388), + name: 'isFarmLandOwned', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(14, 4007865345223693029), + name: 'isSeedsPreserved', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(15, 5799753283360608792), + name: 'isKitchenGardenOwned', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(16, 3272250098967751212), + name: 'addressOne', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(17, 5993366458798453696), + name: 'addressTwo', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(18, 8246574557213969028), + name: 'city', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(19, 5398790887074809282), + name: 'locationPageValid', + type: 1, + flags: 0), + ModelProperty( + id: const IdUid(20, 6657479069084504293), + name: 'commonDetailsValid', + type: 1, + flags: 0), + ModelProperty( + id: const IdUid(21, 6821885131227205219), + name: 'savedTime', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(22, 5541702793145940965), + name: 'dbLocationTopLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(23, 4155729105605878928), + name: 'dbLocationTopRight', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(24, 176578608674560191), + name: 'dbLocationBottomLeft', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(25, 3352596760349944439), + name: 'dbLocationBottomRight', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(26, 8858146981830191665), + name: 'dbTwoThreeWheelManufacturer', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(27, 6657331618266238890), + name: 'dbTwoFourManufacturer', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(28, 2360124385132929587), + name: 'dbLocalFoodMap', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(29, 5230846993278344596), + name: 'dbPreservedSeedsMap', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(30, 2725907391283288263), + name: 'dbTreesOwnedMap', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(31, 257396080593114234), + name: 'dbKitchenGardenPlants', + type: 9, + flags: 0) + ], + relations: [ + ModelRelation( + id: const IdUid(1, 3641078863127427509), + name: 'individualDataList', + targetId: const IdUid(2, 4604626538020621410)) + ], + backlinks: []) +]; + +/// Open an ObjectBox store with the model declared in this file. +Future openStore( + {String? directory, + int? maxDBSizeInKB, + int? fileMode, + int? maxReaders, + bool queriesCaseSensitiveDefault = true, + String? macosApplicationGroup}) async => + Store(getObjectBoxModel(), + directory: directory ?? (await defaultStoreDirectory()).path, + maxDBSizeInKB: maxDBSizeInKB, + fileMode: fileMode, + maxReaders: maxReaders, + queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, + macosApplicationGroup: macosApplicationGroup); + +/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel()) +ModelDefinition getObjectBoxModel() { + final model = ModelInfo( + entities: _entities, + lastEntityId: const IdUid(3, 4555229639046191310), + lastIndexId: const IdUid(0, 0), + lastRelationId: const IdUid(1, 3641078863127427509), + lastSequenceId: const IdUid(0, 0), + retiredEntityUids: const [], + retiredIndexUids: const [], + retiredPropertyUids: const [], + retiredRelationUids: const [], + modelVersion: 5, + modelVersionParserMinimum: 5, + version: 1); + + final bindings = { + CommunityDataModel: EntityDefinition( + model: _entities[0], + toOneRelations: (CommunityDataModel object) => [], + toManyRelations: (CommunityDataModel object) => {}, + getId: (CommunityDataModel object) => object.id, + setId: (CommunityDataModel object, int id) { + object.id = id; + }, + objectToFB: (CommunityDataModel object, fb.Builder fbb) { + final resourceTypeOffset = object.resourceType == null + ? null + : fbb.writeString(object.resourceType!); + final villageCodeOffset = object.villageCode == null + ? null + : fbb.writeString(object.villageCode!); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); + final dbLocationTopLeftOffset = object.dbLocationTopLeft == null + ? null + : fbb.writeString(object.dbLocationTopLeft!); + final dbLocationTopRightOffset = object.dbLocationTopRight == null + ? null + : fbb.writeString(object.dbLocationTopRight!); + final dbLocationBottomLeftOffset = object.dbLocationBottomLeft == null + ? null + : fbb.writeString(object.dbLocationBottomLeft!); + final dbLocationBottomRightOffset = + object.dbLocationBottomRight == null + ? null + : fbb.writeString(object.dbLocationBottomRight!); + fbb.startTable(9); + fbb.addInt64(0, object.id); + fbb.addOffset(1, resourceTypeOffset); + fbb.addOffset(2, villageCodeOffset); + fbb.addOffset(3, savedTimeOffset); + fbb.addOffset(4, dbLocationTopLeftOffset); + fbb.addOffset(5, dbLocationTopRightOffset); + fbb.addOffset(6, dbLocationBottomLeftOffset); + fbb.addOffset(7, dbLocationBottomRightOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + + final object = CommunityDataModel( + resourceType: const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 6), + villageCode: const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 8)) + ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) + ..savedTime = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 10) + ..dbLocationTopLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 12) + ..dbLocationTopRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 14) + ..dbLocationBottomLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 16) + ..dbLocationBottomRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 18); + + return object; + }), + FamilyMemberIndividualDataModel: EntityDefinition< + FamilyMemberIndividualDataModel>( + model: _entities[1], + toOneRelations: (FamilyMemberIndividualDataModel object) => [], + toManyRelations: (FamilyMemberIndividualDataModel object) => {}, + getId: (FamilyMemberIndividualDataModel object) => object.id, + setId: (FamilyMemberIndividualDataModel object, int id) { + object.id = id; + }, + objectToFB: (FamilyMemberIndividualDataModel object, fb.Builder fbb) { + final userNameOffset = object.userName == null + ? null + : fbb.writeString(object.userName!); + final genderOffset = + object.gender == null ? null : fbb.writeString(object.gender!); + final phoneNumberOffset = object.phoneNumber == null + ? null + : fbb.writeString(object.phoneNumber!); + final educationQualificationOffset = + object.educationQualification == null + ? null + : fbb.writeString(object.educationQualification!); + final aadhaarNumberOffset = object.aadhaarNumber == null + ? null + : fbb.writeString(object.aadhaarNumber!); + final dailyWageWorkerOffset = object.dailyWageWorker == null + ? null + : fbb.writeString(object.dailyWageWorker!); + final incomePerDayOffset = object.incomePerDay == null + ? null + : fbb.writeString(object.incomePerDay!); + final incomePerMonthOffset = object.incomePerMonth == null + ? null + : fbb.writeString(object.incomePerMonth!); + final pensionOffset = + object.pension == null ? null : fbb.writeString(object.pension!); + final businessStatusOffset = object.businessStatus == null + ? null + : fbb.writeString(object.businessStatus!); + final maritalStatusOffset = object.maritalStatus == null + ? null + : fbb.writeString(object.maritalStatus!); + final specialSkillsOffset = object.specialSkills == null + ? null + : fbb.writeList(object.specialSkills! + .map(fbb.writeString) + .toList(growable: false)); + final frequentAilmentsOffset = object.frequentAilments == null + ? null + : fbb.writeList(object.frequentAilments! + .map(fbb.writeString) + .toList(growable: false)); + final commutableDiseaseOffset = object.commutableDisease == null + ? null + : fbb.writeList(object.commutableDisease! + .map(fbb.writeString) + .toList(growable: false)); + final nonCommutableDiseaseOffset = object.nonCommutableDisease == null + ? null + : fbb.writeList(object.nonCommutableDisease! + .map(fbb.writeString) + .toList(growable: false)); + final surgeriesOffset = object.surgeries == null + ? null + : fbb.writeString(object.surgeries!); + final anganwadiServicesAwareOffset = + object.anganwadiServicesAware == null + ? null + : fbb.writeString(object.anganwadiServicesAware!); + final anganwadiServicesUsingOffset = + object.anganwadiServicesUsing == null + ? null + : fbb.writeString(object.anganwadiServicesUsing!); + final anganwadiServicesUsedListOffset = + object.anganwadiServicesUsedList == null + ? null + : fbb.writeList(object.anganwadiServicesUsedList! + .map(fbb.writeString) + .toList(growable: false)); + final PHCServicesUsedListOffset = object.PHCServicesUsedList == null + ? null + : fbb.writeList(object.PHCServicesUsedList! + .map(fbb.writeString) + .toList(growable: false)); + final privateClinicServicesUsedListOffset = + object.privateClinicServicesUsedList == null + ? null + : fbb.writeList(object.privateClinicServicesUsedList! + .map(fbb.writeString) + .toList(growable: false)); + final privateServiceReasonOffset = object.privateServiceReason == null + ? null + : fbb.writeString(object.privateServiceReason!); + final useOfTobaccoOffset = object.useOfTobacco == null + ? null + : fbb.writeString(object.useOfTobacco!); + final useOfAlcoholOffset = object.useOfAlcohol == null + ? null + : fbb.writeString(object.useOfAlcohol!); + final aarogyaSetuInstalledOffset = object.aarogyaSetuInstalled == null + ? null + : fbb.writeString(object.aarogyaSetuInstalled!); + final vizhithiruInstalledOffset = object.vizhithiruInstalled == null + ? null + : fbb.writeString(object.vizhithiruInstalled!); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); + final dbVulnerabilitiesOffset = object.dbVulnerabilities == null + ? null + : fbb.writeString(object.dbVulnerabilities!); + final dbOccupationOffset = object.dbOccupation == null + ? null + : fbb.writeString(object.dbOccupation!); + fbb.startTable(33); + fbb.addInt64(0, object.id); + fbb.addOffset(1, userNameOffset); + fbb.addInt64(2, object.dateOfBirth?.millisecondsSinceEpoch); + fbb.addOffset(3, genderOffset); + fbb.addOffset(4, phoneNumberOffset); + fbb.addOffset(5, educationQualificationOffset); + fbb.addOffset(6, aadhaarNumberOffset); + fbb.addOffset(7, dailyWageWorkerOffset); + fbb.addOffset(8, incomePerDayOffset); + fbb.addOffset(9, incomePerMonthOffset); + fbb.addOffset(10, pensionOffset); + fbb.addOffset(11, businessStatusOffset); + fbb.addOffset(12, maritalStatusOffset); + fbb.addOffset(13, specialSkillsOffset); + fbb.addOffset(14, frequentAilmentsOffset); + fbb.addOffset(15, commutableDiseaseOffset); + fbb.addOffset(16, nonCommutableDiseaseOffset); + fbb.addOffset(17, surgeriesOffset); + fbb.addOffset(18, anganwadiServicesAwareOffset); + fbb.addOffset(19, anganwadiServicesUsingOffset); + fbb.addOffset(20, anganwadiServicesUsedListOffset); + fbb.addOffset(21, PHCServicesUsedListOffset); + fbb.addOffset(22, privateClinicServicesUsedListOffset); + fbb.addOffset(23, privateServiceReasonOffset); + fbb.addOffset(24, useOfTobaccoOffset); + fbb.addOffset(25, useOfAlcoholOffset); + fbb.addOffset(26, aarogyaSetuInstalledOffset); + fbb.addOffset(27, vizhithiruInstalledOffset); + fbb.addBool(28, object.dataValid); + fbb.addOffset(29, savedTimeOffset); + fbb.addOffset(30, dbVulnerabilitiesOffset); + fbb.addOffset(31, dbOccupationOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final dateOfBirthValue = + const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 8); + final object = FamilyMemberIndividualDataModel( + userName: const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 6)) + ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) + ..dateOfBirth = dateOfBirthValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateOfBirthValue) + ..gender = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 10) + ..phoneNumber = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 12) + ..educationQualification = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 14) + ..aadhaarNumber = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 16) + ..dailyWageWorker = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 18) + ..incomePerDay = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 20) + ..incomePerMonth = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 22) + ..pension = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 24) + ..businessStatus = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 26) + ..maritalStatus = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 28) + ..specialSkills = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 30) + ..frequentAilments = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 32) + ..commutableDisease = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 34) + ..nonCommutableDisease = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 36) + ..surgeries = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 38) + ..anganwadiServicesAware = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 40) + ..anganwadiServicesUsing = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 42) + ..anganwadiServicesUsedList = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 44) + ..PHCServicesUsedList = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 46) + ..privateClinicServicesUsedList = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 48) + ..privateServiceReason = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 50) + ..useOfTobacco = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 52) + ..useOfAlcohol = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 54) + ..aarogyaSetuInstalled = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 56) + ..vizhithiruInstalled = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 58) + ..dataValid = + const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 60) + ..savedTime = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 62) + ..dbVulnerabilities = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 64) + ..dbOccupation = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 66); + + return object; + }), + FamilyMembersCommonDataModel: EntityDefinition< + FamilyMembersCommonDataModel>( + model: _entities[2], + toOneRelations: (FamilyMembersCommonDataModel object) => [], + toManyRelations: (FamilyMembersCommonDataModel object) => { + RelInfo.toMany(1, object.id): + object.individualDataList + }, + getId: (FamilyMembersCommonDataModel object) => object.id, + setId: (FamilyMembersCommonDataModel object, int id) { + object.id = id; + }, + objectToFB: (FamilyMembersCommonDataModel object, fb.Builder fbb) { + final drinkingWaterOffset = object.drinkingWater == null + ? null + : fbb.writeString(object.drinkingWater!); + final sourceOfDrinkingWaterOffset = + object.sourceOfDrinkingWater == null + ? null + : fbb.writeString(object.sourceOfDrinkingWater!); + final toiletFacilityOffset = object.toiletFacility == null + ? null + : fbb.writeString(object.toiletFacility!); + final communityToiletOffset = object.communityToilet == null + ? null + : fbb.writeString(object.communityToilet!); + final environmentSanitationLevelOffset = + object.environmentSanitationLevel == null + ? null + : fbb.writeString(object.environmentSanitationLevel!); + final runningWaterAvailableOffset = + object.runningWaterAvailable == null + ? null + : fbb.writeString(object.runningWaterAvailable!); + final noOfTwoWheelersOffset = object.noOfTwoWheelers == null + ? null + : fbb.writeString(object.noOfTwoWheelers!); + final noOfThreeWheelersOffset = object.noOfThreeWheelers == null + ? null + : fbb.writeString(object.noOfThreeWheelers!); + final noOfFourWheelersOffset = object.noOfFourWheelers == null + ? null + : fbb.writeString(object.noOfFourWheelers!); + final isCattleOwnedOffset = object.isCattleOwned == null + ? null + : fbb.writeString(object.isCattleOwned!); + final incomeFromCattleOffset = object.incomeFromCattle == null + ? null + : fbb.writeString(object.incomeFromCattle!); + final isFarmLandOwnedOffset = object.isFarmLandOwned == null + ? null + : fbb.writeString(object.isFarmLandOwned!); + final isSeedsPreservedOffset = object.isSeedsPreserved == null + ? null + : fbb.writeString(object.isSeedsPreserved!); + final isKitchenGardenOwnedOffset = object.isKitchenGardenOwned == null + ? null + : fbb.writeString(object.isKitchenGardenOwned!); + final addressOneOffset = object.addressOne == null + ? null + : fbb.writeString(object.addressOne!); + final addressTwoOffset = object.addressTwo == null + ? null + : fbb.writeString(object.addressTwo!); + final cityOffset = + object.city == null ? null : fbb.writeString(object.city!); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); + final dbLocationTopLeftOffset = object.dbLocationTopLeft == null + ? null + : fbb.writeString(object.dbLocationTopLeft!); + final dbLocationTopRightOffset = object.dbLocationTopRight == null + ? null + : fbb.writeString(object.dbLocationTopRight!); + final dbLocationBottomLeftOffset = object.dbLocationBottomLeft == null + ? null + : fbb.writeString(object.dbLocationBottomLeft!); + final dbLocationBottomRightOffset = + object.dbLocationBottomRight == null + ? null + : fbb.writeString(object.dbLocationBottomRight!); + final dbTwoThreeWheelManufacturerOffset = + object.dbTwoThreeWheelManufacturer == null + ? null + : fbb.writeString(object.dbTwoThreeWheelManufacturer!); + final dbTwoFourManufacturerOffset = + object.dbTwoFourManufacturer == null + ? null + : fbb.writeString(object.dbTwoFourManufacturer!); + final dbLocalFoodMapOffset = object.dbLocalFoodMap == null + ? null + : fbb.writeString(object.dbLocalFoodMap!); + final dbPreservedSeedsMapOffset = object.dbPreservedSeedsMap == null + ? null + : fbb.writeString(object.dbPreservedSeedsMap!); + final dbTreesOwnedMapOffset = object.dbTreesOwnedMap == null + ? null + : fbb.writeString(object.dbTreesOwnedMap!); + final dbKitchenGardenPlantsOffset = + object.dbKitchenGardenPlants == null + ? null + : fbb.writeString(object.dbKitchenGardenPlants!); + fbb.startTable(32); + fbb.addInt64(0, object.id); + fbb.addOffset(1, drinkingWaterOffset); + fbb.addOffset(2, sourceOfDrinkingWaterOffset); + fbb.addOffset(3, toiletFacilityOffset); + fbb.addOffset(4, communityToiletOffset); + fbb.addOffset(5, environmentSanitationLevelOffset); + fbb.addOffset(6, runningWaterAvailableOffset); + fbb.addOffset(7, noOfTwoWheelersOffset); + fbb.addOffset(8, noOfThreeWheelersOffset); + fbb.addOffset(9, noOfFourWheelersOffset); + fbb.addOffset(10, isCattleOwnedOffset); + fbb.addOffset(11, incomeFromCattleOffset); + fbb.addOffset(12, isFarmLandOwnedOffset); + fbb.addOffset(13, isSeedsPreservedOffset); + fbb.addOffset(14, isKitchenGardenOwnedOffset); + fbb.addOffset(15, addressOneOffset); + fbb.addOffset(16, addressTwoOffset); + fbb.addOffset(17, cityOffset); + fbb.addBool(18, object.locationPageValid); + fbb.addBool(19, object.commonDetailsValid); + fbb.addOffset(20, savedTimeOffset); + fbb.addOffset(21, dbLocationTopLeftOffset); + fbb.addOffset(22, dbLocationTopRightOffset); + fbb.addOffset(23, dbLocationBottomLeftOffset); + fbb.addOffset(24, dbLocationBottomRightOffset); + fbb.addOffset(25, dbTwoThreeWheelManufacturerOffset); + fbb.addOffset(26, dbTwoFourManufacturerOffset); + fbb.addOffset(27, dbLocalFoodMapOffset); + fbb.addOffset(28, dbPreservedSeedsMapOffset); + fbb.addOffset(29, dbTreesOwnedMapOffset); + fbb.addOffset(30, dbKitchenGardenPlantsOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + + final object = FamilyMembersCommonDataModel() + ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) + ..drinkingWater = + const fb.StringReader().vTableGetNullable(buffer, rootOffset, 6) + ..sourceOfDrinkingWater = + const fb.StringReader().vTableGetNullable(buffer, rootOffset, 8) + ..toiletFacility = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 10) + ..communityToilet = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 12) + ..environmentSanitationLevel = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 14) + ..runningWaterAvailable = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 16) + ..noOfTwoWheelers = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 18) + ..noOfThreeWheelers = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 20) + ..noOfFourWheelers = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 22) + ..isCattleOwned = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 24) + ..incomeFromCattle = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 26) + ..isFarmLandOwned = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 28) + ..isSeedsPreserved = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 30) + ..isKitchenGardenOwned = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 32) + ..addressOne = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 34) + ..addressTwo = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 36) + ..city = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 38) + ..locationPageValid = + const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 40) + ..commonDetailsValid = + const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 42) + ..savedTime = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 44) + ..dbLocationTopLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 46) + ..dbLocationTopRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 48) + ..dbLocationBottomLeft = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 50) + ..dbLocationBottomRight = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 52) + ..dbTwoThreeWheelManufacturer = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 54) + ..dbTwoFourManufacturer = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 56) + ..dbLocalFoodMap = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 58) + ..dbPreservedSeedsMap = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 60) + ..dbTreesOwnedMap = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 62) + ..dbKitchenGardenPlants = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 64); + InternalToManyAccess.setRelInfo( + object.individualDataList, + store, + RelInfo.toMany(1, object.id), + store.box()); + return object; + }) + }; + + return ModelDefinition(model, bindings); +} + +/// [CommunityDataModel] entity fields to define ObjectBox queries. +class CommunityDataModel_ { + /// see [CommunityDataModel.id] + static final id = + QueryIntegerProperty(_entities[0].properties[0]); + + /// see [CommunityDataModel.resourceType] + static final resourceType = + QueryStringProperty(_entities[0].properties[1]); + + /// see [CommunityDataModel.villageCode] + static final villageCode = + QueryStringProperty(_entities[0].properties[2]); + + /// see [CommunityDataModel.savedTime] + static final savedTime = + QueryStringProperty(_entities[0].properties[3]); + + /// see [CommunityDataModel.dbLocationTopLeft] + static final dbLocationTopLeft = + QueryStringProperty(_entities[0].properties[4]); + + /// see [CommunityDataModel.dbLocationTopRight] + static final dbLocationTopRight = + QueryStringProperty(_entities[0].properties[5]); + + /// see [CommunityDataModel.dbLocationBottomLeft] + static final dbLocationBottomLeft = + QueryStringProperty(_entities[0].properties[6]); + + /// see [CommunityDataModel.dbLocationBottomRight] + static final dbLocationBottomRight = + QueryStringProperty(_entities[0].properties[7]); +} + +/// [FamilyMemberIndividualDataModel] entity fields to define ObjectBox queries. +class FamilyMemberIndividualDataModel_ { + /// see [FamilyMemberIndividualDataModel.id] + static final id = QueryIntegerProperty( + _entities[1].properties[0]); + + /// see [FamilyMemberIndividualDataModel.userName] + static final userName = QueryStringProperty( + _entities[1].properties[1]); + + /// see [FamilyMemberIndividualDataModel.dateOfBirth] + static final dateOfBirth = + QueryIntegerProperty( + _entities[1].properties[2]); + + /// see [FamilyMemberIndividualDataModel.gender] + static final gender = QueryStringProperty( + _entities[1].properties[3]); + + /// see [FamilyMemberIndividualDataModel.phoneNumber] + static final phoneNumber = + QueryStringProperty( + _entities[1].properties[4]); + + /// see [FamilyMemberIndividualDataModel.educationQualification] + static final educationQualification = + QueryStringProperty( + _entities[1].properties[5]); + + /// see [FamilyMemberIndividualDataModel.aadhaarNumber] + static final aadhaarNumber = + QueryStringProperty( + _entities[1].properties[6]); + + /// see [FamilyMemberIndividualDataModel.dailyWageWorker] + static final dailyWageWorker = + QueryStringProperty( + _entities[1].properties[7]); + + /// see [FamilyMemberIndividualDataModel.incomePerDay] + static final incomePerDay = + QueryStringProperty( + _entities[1].properties[8]); + + /// see [FamilyMemberIndividualDataModel.incomePerMonth] + static final incomePerMonth = + QueryStringProperty( + _entities[1].properties[9]); + + /// see [FamilyMemberIndividualDataModel.pension] + static final pension = QueryStringProperty( + _entities[1].properties[10]); + + /// see [FamilyMemberIndividualDataModel.businessStatus] + static final businessStatus = + QueryStringProperty( + _entities[1].properties[11]); + + /// see [FamilyMemberIndividualDataModel.maritalStatus] + static final maritalStatus = + QueryStringProperty( + _entities[1].properties[12]); + + /// see [FamilyMemberIndividualDataModel.specialSkills] + static final specialSkills = + QueryStringVectorProperty( + _entities[1].properties[13]); + + /// see [FamilyMemberIndividualDataModel.frequentAilments] + static final frequentAilments = + QueryStringVectorProperty( + _entities[1].properties[14]); + + /// see [FamilyMemberIndividualDataModel.commutableDisease] + static final commutableDisease = + QueryStringVectorProperty( + _entities[1].properties[15]); + + /// see [FamilyMemberIndividualDataModel.nonCommutableDisease] + static final nonCommutableDisease = + QueryStringVectorProperty( + _entities[1].properties[16]); + + /// see [FamilyMemberIndividualDataModel.surgeries] + static final surgeries = QueryStringProperty( + _entities[1].properties[17]); + + /// see [FamilyMemberIndividualDataModel.anganwadiServicesAware] + static final anganwadiServicesAware = + QueryStringProperty( + _entities[1].properties[18]); + + /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsing] + static final anganwadiServicesUsing = + QueryStringProperty( + _entities[1].properties[19]); + + /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsedList] + static final anganwadiServicesUsedList = + QueryStringVectorProperty( + _entities[1].properties[20]); + + /// see [FamilyMemberIndividualDataModel.PHCServicesUsedList] + static final PHCServicesUsedList = + QueryStringVectorProperty( + _entities[1].properties[21]); + + /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsedList] + static final privateClinicServicesUsedList = + QueryStringVectorProperty( + _entities[1].properties[22]); + + /// see [FamilyMemberIndividualDataModel.privateServiceReason] + static final privateServiceReason = + QueryStringProperty( + _entities[1].properties[23]); + + /// see [FamilyMemberIndividualDataModel.useOfTobacco] + static final useOfTobacco = + QueryStringProperty( + _entities[1].properties[24]); + + /// see [FamilyMemberIndividualDataModel.useOfAlcohol] + static final useOfAlcohol = + QueryStringProperty( + _entities[1].properties[25]); + + /// see [FamilyMemberIndividualDataModel.aarogyaSetuInstalled] + static final aarogyaSetuInstalled = + QueryStringProperty( + _entities[1].properties[26]); + + /// see [FamilyMemberIndividualDataModel.vizhithiruInstalled] + static final vizhithiruInstalled = + QueryStringProperty( + _entities[1].properties[27]); + + /// see [FamilyMemberIndividualDataModel.dataValid] + static final dataValid = + QueryBooleanProperty( + _entities[1].properties[28]); + + /// see [FamilyMemberIndividualDataModel.savedTime] + static final savedTime = QueryStringProperty( + _entities[1].properties[29]); + + /// see [FamilyMemberIndividualDataModel.dbVulnerabilities] + static final dbVulnerabilities = + QueryStringProperty( + _entities[1].properties[30]); + + /// see [FamilyMemberIndividualDataModel.dbOccupation] + static final dbOccupation = + QueryStringProperty( + _entities[1].properties[31]); +} + +/// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. +class FamilyMembersCommonDataModel_ { + /// see [FamilyMembersCommonDataModel.id] + static final id = QueryIntegerProperty( + _entities[2].properties[0]); + + /// see [FamilyMembersCommonDataModel.drinkingWater] + static final drinkingWater = + QueryStringProperty( + _entities[2].properties[1]); + + /// see [FamilyMembersCommonDataModel.sourceOfDrinkingWater] + static final sourceOfDrinkingWater = + QueryStringProperty( + _entities[2].properties[2]); + + /// see [FamilyMembersCommonDataModel.toiletFacility] + static final toiletFacility = + QueryStringProperty( + _entities[2].properties[3]); + + /// see [FamilyMembersCommonDataModel.communityToilet] + static final communityToilet = + QueryStringProperty( + _entities[2].properties[4]); + + /// see [FamilyMembersCommonDataModel.environmentSanitationLevel] + static final environmentSanitationLevel = + QueryStringProperty( + _entities[2].properties[5]); + + /// see [FamilyMembersCommonDataModel.runningWaterAvailable] + static final runningWaterAvailable = + QueryStringProperty( + _entities[2].properties[6]); + + /// see [FamilyMembersCommonDataModel.noOfTwoWheelers] + static final noOfTwoWheelers = + QueryStringProperty( + _entities[2].properties[7]); + + /// see [FamilyMembersCommonDataModel.noOfThreeWheelers] + static final noOfThreeWheelers = + QueryStringProperty( + _entities[2].properties[8]); + + /// see [FamilyMembersCommonDataModel.noOfFourWheelers] + static final noOfFourWheelers = + QueryStringProperty( + _entities[2].properties[9]); + + /// see [FamilyMembersCommonDataModel.isCattleOwned] + static final isCattleOwned = + QueryStringProperty( + _entities[2].properties[10]); + + /// see [FamilyMembersCommonDataModel.incomeFromCattle] + static final incomeFromCattle = + QueryStringProperty( + _entities[2].properties[11]); + + /// see [FamilyMembersCommonDataModel.isFarmLandOwned] + static final isFarmLandOwned = + QueryStringProperty( + _entities[2].properties[12]); + + /// see [FamilyMembersCommonDataModel.isSeedsPreserved] + static final isSeedsPreserved = + QueryStringProperty( + _entities[2].properties[13]); + + /// see [FamilyMembersCommonDataModel.isKitchenGardenOwned] + static final isKitchenGardenOwned = + QueryStringProperty( + _entities[2].properties[14]); + + /// see [FamilyMembersCommonDataModel.addressOne] + static final addressOne = QueryStringProperty( + _entities[2].properties[15]); + + /// see [FamilyMembersCommonDataModel.addressTwo] + static final addressTwo = QueryStringProperty( + _entities[2].properties[16]); + + /// see [FamilyMembersCommonDataModel.city] + static final city = QueryStringProperty( + _entities[2].properties[17]); + + /// see [FamilyMembersCommonDataModel.locationPageValid] + static final locationPageValid = + QueryBooleanProperty( + _entities[2].properties[18]); + + /// see [FamilyMembersCommonDataModel.commonDetailsValid] + static final commonDetailsValid = + QueryBooleanProperty( + _entities[2].properties[19]); + + /// see [FamilyMembersCommonDataModel.savedTime] + static final savedTime = QueryStringProperty( + _entities[2].properties[20]); + + /// see [FamilyMembersCommonDataModel.dbLocationTopLeft] + static final dbLocationTopLeft = + QueryStringProperty( + _entities[2].properties[21]); + + /// see [FamilyMembersCommonDataModel.dbLocationTopRight] + static final dbLocationTopRight = + QueryStringProperty( + _entities[2].properties[22]); + + /// see [FamilyMembersCommonDataModel.dbLocationBottomLeft] + static final dbLocationBottomLeft = + QueryStringProperty( + _entities[2].properties[23]); + + /// see [FamilyMembersCommonDataModel.dbLocationBottomRight] + static final dbLocationBottomRight = + QueryStringProperty( + _entities[2].properties[24]); + + /// see [FamilyMembersCommonDataModel.dbTwoThreeWheelManufacturer] + static final dbTwoThreeWheelManufacturer = + QueryStringProperty( + _entities[2].properties[25]); + + /// see [FamilyMembersCommonDataModel.dbTwoFourManufacturer] + static final dbTwoFourManufacturer = + QueryStringProperty( + _entities[2].properties[26]); + + /// see [FamilyMembersCommonDataModel.dbLocalFoodMap] + static final dbLocalFoodMap = + QueryStringProperty( + _entities[2].properties[27]); + + /// see [FamilyMembersCommonDataModel.dbPreservedSeedsMap] + static final dbPreservedSeedsMap = + QueryStringProperty( + _entities[2].properties[28]); + + /// see [FamilyMembersCommonDataModel.dbTreesOwnedMap] + static final dbTreesOwnedMap = + QueryStringProperty( + _entities[2].properties[29]); + + /// see [FamilyMembersCommonDataModel.dbKitchenGardenPlants] + static final dbKitchenGardenPlants = + QueryStringProperty( + _entities[2].properties[30]); + + /// see [FamilyMembersCommonDataModel.individualDataList] + static final individualDataList = QueryRelationToMany< + FamilyMembersCommonDataModel, + FamilyMemberIndividualDataModel>(_entities[2].relations[0]); +} From 4f08213cc08869c591d018997aa10c6af6d8f6a4 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 19:43:23 +0530 Subject: [PATCH 130/264] Added null check for onChanged method in FormPageView --- lib/Widgets/FormPageView.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 55583ac..ba5f487 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -140,7 +140,9 @@ class _FormPageViewState extends State { formErrorTile[i] = !isValid; }); } - widget.onChange!(isAllValid); + if(widget.onChange != null){ + widget.onChange!(isAllValid); + } setState(() { count = page; }); From 3998ba5a3106511d78a05a32679ec1aa17bd05fb Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 19:56:54 +0530 Subject: [PATCH 131/264] Modified profile page buttons --- lib/Screens/ProfilePage.dart | 66 +++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index f8741be..06c246d 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -66,32 +66,50 @@ class ProfilePage extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: colors.darkSecondaryTextColor.withOpacity(0.2), - ), - onPressed: () { - print('Button Clicked'); - }, - child: Text( - 'Change\nPassword', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - textAlign: TextAlign.center, + Expanded( + child: Padding( + padding: EdgeInsets.only(right: 6, left: 20), + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor.withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + }, + icon: Icon( + Icons.lock, + color: colors.darkAccentColor, + ), + label: Text( + 'Change\nPassword', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), + ), ), ), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: colors.darkSecondaryTextColor.withOpacity(0.2), - ), - onPressed: () { - print('Button Clicked'); - }, - child: Text( - 'Change\nUsername', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - textAlign: TextAlign.center, + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 6, right: 20), + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor.withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + }, + label: Text( + 'Change\nUsername', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), + icon: Icon( + Icons.person, + color: colors.darkAccentColor, + ), + ), ), ), ], From a5353d169fe207228993641f0351b13786fac828 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 20:38:44 +0530 Subject: [PATCH 132/264] Modified profile page buttons --- lib/Screens/ProfilePage.dart | 1 - lib/Widgets/StepCounterWidget.dart | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 06c246d..3dda6cf 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Screens/Login.dart'; diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 61a7465..83de53a 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -115,7 +115,7 @@ class CheckBox extends StatelessWidget { controller.animateToPage( tilePosition, curve: Curves.ease, - duration: Duration(milliseconds: 650), + duration: Duration(seconds: 1), ); }, child: Padding( From 4a0154c41cc6e3eb0c3f1c3260c10a9747038b39 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 20:40:11 +0530 Subject: [PATCH 133/264] Fixed bug in Step Counter Widget and Form Page View --- lib/Widgets/StepCounterWidget.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 83de53a..0de5fa0 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; /** From 2fff154287d41960fbb3b0082aa0179fe9abf195 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 21:15:18 +0530 Subject: [PATCH 134/264] Fixed rendering and animation issue in scrolling pages, which causes null point exception --- lib/Widgets/FormPageView.dart | 27 +++++++++++++++++++-------- lib/Widgets/StepCounterWidget.dart | 5 +++-- pubspec.lock | 7 +++++++ pubspec.yaml | 1 + 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index ba5f487..476e7ec 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -3,6 +3,7 @@ import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:preload_page_view/preload_page_view.dart'; import 'PageViewContentBox.dart'; @@ -28,7 +29,8 @@ class _FormPageViewState extends State { late int widgetLength; late final List> formKeyList; late final List formErrorTile; - final PageController controller = PageController(initialPage: 0); + final PreloadPageController controller = + PreloadPageController(initialPage: 0); late final List widgetList; @override @@ -140,7 +142,7 @@ class _FormPageViewState extends State { formErrorTile[i] = !isValid; }); } - if(widget.onChange != null){ + if (widget.onChange != null) { widget.onChange!(isAllValid); } setState(() { @@ -159,12 +161,21 @@ class _FormPageViewState extends State { StepCounterWidget(widgetLength, count, formErrorTile, controller), Container( height: MediaQuery.of(context).size.height * 0.85, - child: PageView( - onPageChanged: _onPageViewChange, - scrollDirection: Axis.horizontal, - controller: controller, - children: widgetList, - ), + // child: PageView( + // onPageChanged: _onPageViewChange, + // scrollDirection: Axis.horizontal, + // controller: controller, + // children: widgetList, + // ), + child: PreloadPageView.builder( + onPageChanged: _onPageViewChange, + scrollDirection: Axis.horizontal, + preloadPagesCount: widgetList.length - 1, + itemCount: widgetList.length, + controller: controller, + itemBuilder: (BuildContext context, int position) { + return widgetList[position]; + }), ), ], ), diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index 0de5fa0..acfa069 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:preload_page_view/preload_page_view.dart'; /** * Widget for steps count in registration pages @@ -21,7 +22,7 @@ class StepCounterWidget extends StatefulWidget { final int totalSteps; final int currentStep; final List errorArray; - final PageController controller; + final PreloadPageController controller; @override _StepCounterWidgetState createState() => _StepCounterWidgetState(); @@ -67,7 +68,7 @@ class CheckBox extends StatelessWidget { const CheckBox(this.iconType, this.controller, this.tilePosition, {Key? key}) : super(key: key); final int iconType; - final PageController controller; + final PreloadPageController controller; final int tilePosition; @override diff --git a/pubspec.lock b/pubspec.lock index d8a61e6..92efe01 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -548,6 +548,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.5.0" + preload_page_view: + dependency: "direct main" + description: + name: preload_page_view + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.6" process: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b72f3ea..2233265 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ environment: sdk: ">=2.12.0 <3.0.0" dependencies: + preload_page_view: ^0.1.6 flutter_typeahead: ^3.2.4 objectbox: ^1.3.0 local_auth: From e05cf8764ed9d0b23ce905d72d561e5e16c2c305 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 23:13:03 +0530 Subject: [PATCH 135/264] UI fixes --- assets/svg/background.svg | 11 ++ lib/Screens/Background.dart | 41 ----- lib/Screens/CollectLocationWidget.dart | 18 +- lib/Screens/FamilyDetails.dart | 49 ++++-- lib/Screens/FamilyHomeScreen.dart | 13 +- lib/Screens/FamilyMemberAdd.dart | 45 +++-- lib/Screens/Login.dart | 8 +- lib/Screens/ProfilePage.dart | 229 +++++++++++++------------ lib/Screens/VillageSelection.dart | 3 +- lib/Widgets/AddRemoveBoxWidget.dart | 98 ++++++++--- lib/Widgets/DataCard.dart | 7 +- pubspec.lock | 7 + pubspec.yaml | 1 + 13 files changed, 296 insertions(+), 234 deletions(-) create mode 100644 assets/svg/background.svg delete mode 100644 lib/Screens/Background.dart diff --git a/assets/svg/background.svg b/assets/svg/background.svg new file mode 100644 index 0000000..52b4921 --- /dev/null +++ b/assets/svg/background.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/Screens/Background.dart b/lib/Screens/Background.dart deleted file mode 100644 index d474e7a..0000000 --- a/lib/Screens/Background.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -class Background extends StatelessWidget { - final Widget child; - - const Background({ - Key? key, - required this.child, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - Size size = MediaQuery.of(context).size; - return Container( - width: double.infinity, - height: size.height, - child: Stack( - alignment: Alignment.center, - children: [ - Positioned( - top: 0, - left: 0, - child: Image.asset( - "assets/images/main_top.png", - width: size.width * 0.35, - ), - ), - Positioned( - bottom: 0, - right: 0, - child: Image.asset( - "assets/images/login_bottom.png", - width: size.width * 0.4, - ), - ), - child, - ], - ), - ); - } -} diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index db4f032..9230c25 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -1,9 +1,11 @@ +import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/LocationWidget.dart'; +import 'package:google_fonts/google_fonts.dart'; class CollectLocationWidget extends StatefulWidget { const CollectLocationWidget({Key? key, this.modelData}) : super(key: key); @@ -22,9 +24,9 @@ class _CollectLocationWidgetState extends State { Navigator.pop(context); } else { ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( + content: AutoSizeText( "Please fill all fields!", - style: TextStyle(color: Colors.red), + style: GoogleFonts.poppins(color: colors.errorColor), ), )); } @@ -32,25 +34,21 @@ class _CollectLocationWidgetState extends State { return WillPopScope( onWillPop: () async { - //TODO: Add condition here to check if page has been filled - if (false) { - return true; - } final result = await showDialog( context: context, builder: (context) => AlertDialog( - title: Text("Are you sure?"), - content: Text("All unsaved changes would be lost"), + title: AutoSizeText("Are you sure?"), + content: AutoSizeText("All unsaved changes would be lost"), actions: [ TextButton( - child: Text('No'), + child: AutoSizeText('No'), onPressed: () { Navigator.pop(context, false); }, ), TextButton( - child: Text('Yes', style: TextStyle(color: Colors.red)), + child: AutoSizeText('Yes', style: TextStyle(color: Colors.red)), onPressed: () { Navigator.pop(context, true); }, diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index d48125a..09637b5 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -1,3 +1,4 @@ +import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -25,7 +26,7 @@ class _FamilyDetailsState extends State { Navigator.pop(context); } else { ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( + content: AutoSizeText( "Please fill all fields!", style: TextStyle(color: Colors.red), ), @@ -99,17 +100,36 @@ class _FamilyDetailsState extends State { final result = await showDialog( context: context, builder: (context) => AlertDialog( - title: Text("Are you sure?"), - content: Text("All unsaved changes would be lost"), + backgroundColor: colors.darkScaffoldColor, + title: AutoSizeText( + "Are you sure?", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + content: AutoSizeText( + "All unsaved changes would be lost", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), actions: [ TextButton( - child: Text('No'), + child: AutoSizeText( + 'No', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), onPressed: () { Navigator.pop(context, false); }, ), - TextButton( - child: Text('Yes', style: TextStyle(color: Colors.red)), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: AutoSizeText( + 'Yes', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), onPressed: () { Navigator.pop(context, true); }, @@ -120,7 +140,7 @@ class _FamilyDetailsState extends State { return result; }, child: Scaffold( - resizeToAvoidBottomInset: false, + resizeToAvoidBottomInset: true, backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Family Details'), body: SizedBox( @@ -311,7 +331,7 @@ class _FamilyDetailsState extends State { color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(7.0), hintText: "Enter income in Rupees", - label: Text( + label: AutoSizeText( 'Income from cattle', style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), @@ -389,8 +409,8 @@ class _FamilyDetailsState extends State { context: context, ), - //TODO: Add autosuggest text widget for locally consumed food - //TODO: Add autosuggest text widget for trees owned + //TODO: Add autosuggest AutoSizeText widget for locally consumed food + //TODO: Add autosuggest AutoSizeText widget for trees owned OptionsWidget( options: [ ['Yes', 'yes'], @@ -421,7 +441,7 @@ class _FamilyDetailsState extends State { widget.modelData!.kitchenGardenPlants = val; }, ), - //TODO: Add autosuggest text widget for kitchen garden crops + //TODO: Add autosuggest AutoSizeText widget for kitchen garden crops Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -430,7 +450,7 @@ class _FamilyDetailsState extends State { child: Padding( padding: const EdgeInsets.only( left: 10.0, right: 10.0, bottom: 15.0), - child: Text( + child: AutoSizeText( "Address", style: GoogleFonts.montserrat( fontSize: 15.0, @@ -528,3 +548,8 @@ class _FamilyDetailsState extends State { ); } } + +//TODO: Check textbox colors +//TODO: Keyboard inset not working - clampingscroll issue? +//TODO: Source of water has to be changed +//TODO: Insert values to checkboxalertdialogs diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 4861295..ce8191f 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -141,21 +141,26 @@ class _FamilyHomeScreenState extends State { int id = await box.put(modelData); AlertDialog alertDialog = AlertDialog( + backgroundColor: colors.darkScaffoldColor, title: Text( 'Record Saved', style: GoogleFonts.poppins( - fontWeight: FontWeight.bold), + color: colors.darkPrimaryTextColor), ), content: Text( 'The Record has been saved with record ID ${id}', - style: GoogleFonts.poppins()), + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor)), actions: [ - TextButton( + ElevatedButton( onPressed: () { Navigator.of(context, rootNavigator: true) .pop('dialog'); }, - child: Text('OK'), + child: Text('OK',style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20)),), + primary: colors.darkAccentColor + ), ) ], ); diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 92181b0..31ff4c8 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:gender_picker/gender_picker.dart'; -import 'package:gender_picker/source/enums.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; @@ -45,7 +43,7 @@ class _FamilyMemberAddState extends State { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( "Please fill all fields!", - style: TextStyle(color: Colors.red), + style: GoogleFonts.poppins(color: colors.errorColor), ), )); } @@ -57,12 +55,10 @@ class _FamilyMemberAddState extends State { var vulnerabilities = { 'Widower': false, 'Divorcee': false, - 'Differently Abled': false, + 'Differently Able': false, 'Pregnant Woman': false, 'Lactating Mother': false, 'Elderly (>60 years)': false, - 'Widower': false, - 'Differently Abled': false, 'Children below 2 years': false, 'Others': false, 'None': false @@ -83,8 +79,6 @@ class _FamilyMemberAddState extends State { @override Widget build(BuildContext context) { - print( - "${widget.familyMemberIndividualDataModel!.vulnerabilities} vulnerabilities"); return WillPopScope( onWillPop: () async { if (!isPageValid) { @@ -93,17 +87,33 @@ class _FamilyMemberAddState extends State { final result = await showDialog( context: context, builder: (context) => AlertDialog( - title: Text("Are you sure?"), - content: Text("All unsaved changes would be lost"), + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + content: Text( + "All unsaved changes would be lost", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), actions: [ TextButton( - child: Text('No'), + child: Text( + 'No', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), onPressed: () { Navigator.pop(context, false); }, ), - TextButton( - child: Text('Yes', style: TextStyle(color: Colors.red)), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: Text('Yes', + style: TextStyle(color: colors.darkPrimaryTextColor)), onPressed: () async { Navigator.pop(context, true); }, @@ -114,7 +124,7 @@ class _FamilyMemberAddState extends State { return result; }, child: Scaffold( - resizeToAvoidBottomInset: false, + resizeToAvoidBottomInset: true, backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Add Family Member'), body: SizedBox( @@ -752,12 +762,13 @@ class _FamilyMemberAddState extends State { ) ], _onSubmit, - onChange: (isValid){ + onChange: (isValid) { print(isValid); - print("IS FAM VALID: ${widget.familyMemberIndividualDataModel?.dataValid}"); + print( + "IS FAM VALID: ${widget.familyMemberIndividualDataModel?.dataValid}"); widget.familyMemberIndividualDataModel?.dataValid = isValid; }, - submitMessage: "Submit to Continue or go back to re-record data", + submitMessage: "Submit to continue or go back to re-record data", note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", ), diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 7cb6e52..9e8c70b 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:flutter/services.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:local_auth/local_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; @@ -219,12 +220,7 @@ class _MyAppState extends State { body: Stack( fit: StackFit.expand, children: [ - Container( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/Illustration.png"), - fit: BoxFit.cover)), - ), + SvgPicture.asset("assets/svg/background.svg",fit: BoxFit.cover,), SingleChildScrollView( child: Padding( padding: EdgeInsets.only(left: 20.0, right: 20.0), diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 3dda6cf..3ab93e5 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -17,133 +17,136 @@ class ProfilePage extends StatelessWidget { width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppBarBackButton( - 'Profile', - actions: [ - IconButton( - onPressed: () async { - await storage.delete(key: 'jwt'); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); - }, - icon: Icon( - Icons.logout, - color: colors.darkAccentColor, - )) - ], - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.08, - ), - Center( - child: Column( - children: [ - Image(image: AssetImage("assets/avatar_woman.png")), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Text( - globals.Name, - style: GoogleFonts.poppins(fontSize: 20), - ), - ), - Text( - '@' + globals.userName, - style: GoogleFonts.poppins( - fontSize: 15, color: colors.darkSecondaryTextColor), - textAlign: TextAlign.start, - ), + SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppBarBackButton( + 'Profile', + actions: [ + IconButton( + onPressed: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false); + }, + icon: Icon( + Icons.logout, + color: colors.darkAccentColor, + )) ], ), - ), - Padding( - padding: - const EdgeInsets.symmetric(horizontal: 20.0, vertical: 40.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.only(right: 6, left: 20), - child: ElevatedButton.icon( - style: ElevatedButton.styleFrom( - primary: colors.darkSecondaryTextColor.withOpacity(0.2), - ), - onPressed: () { - print('Button Clicked'); - }, - icon: Icon( - Icons.lock, - color: colors.darkAccentColor, - ), - label: Text( - 'Change\nPassword', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - textAlign: TextAlign.center, - ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.08, + ), + Center( + child: Column( + children: [ + Image(image: AssetImage("assets/avatar_woman.png")), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Text( + globals.Name, + style: GoogleFonts.poppins(fontSize: 20), ), ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 6, right: 20), - child: ElevatedButton.icon( - style: ElevatedButton.styleFrom( - primary: colors.darkSecondaryTextColor.withOpacity(0.2), - ), - onPressed: () { - print('Button Clicked'); - }, - label: Text( - 'Change\nUsername', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - textAlign: TextAlign.center, + Text( + '@' + globals.userName, + style: GoogleFonts.poppins( + fontSize: 15, color: colors.darkSecondaryTextColor), + textAlign: TextAlign.start, + ), + ], + ), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20.0, vertical: 40.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.only(right: 6, left: 20), + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor.withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + }, + icon: Icon( + Icons.lock, + color: colors.darkAccentColor, + ), + label: Text( + 'Change\nPassword', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), ), - icon: Icon( - Icons.person, - color: colors.darkAccentColor, + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 6, right: 20), + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor.withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + }, + label: Text( + 'Change\nUsername', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), + icon: Icon( + Icons.person, + color: colors.darkAccentColor, + ), ), ), ), - ), - ], + ], + ), ), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 40), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 20), - child: Container( + Padding( + padding: EdgeInsets.symmetric(horizontal: 40), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Container( + padding: EdgeInsets.only(top: 15, left: 20.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20)), + color: Color(0xff34344B)), + height: 50, + width: MediaQuery.of(context).size.width * 0.8, + child: Text('Joined on: '), + ), + ), + Container( padding: EdgeInsets.only(top: 15, left: 20.0), + width: MediaQuery.of(context).size.width * 0.8, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), color: Color(0xff34344B)), height: 50, - width: MediaQuery.of(context).size.width * 0.8, - child: Text('Joined on: '), - ), - ), - Container( - padding: EdgeInsets.only(top: 15, left: 20.0), - width: MediaQuery.of(context).size.width * 0.8, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20)), - color: Color(0xff34344B)), - height: 50, - child: Text('Records collected: '), - ) - ], - ), - ) - ], + child: Text('Records collected: '), + ) + ], + ), + ) + ], + ), ), ]), ); diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index 81b17aa..e0c0e27 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -48,6 +48,7 @@ class _VillageSelectionScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ CheckBoxAlertDialog( + singleOption: true, title: "Choose Village Code", context: context, hint: 'Choose here', @@ -134,7 +135,7 @@ class _VillageSelectionScreenState extends State { ), ), SizedBox( - height: MediaQuery.of(context).size.height * 0.1, + height: MediaQuery.of(context).size.height * 0.2, ), if (!widget.isGenerated) TextButton( diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 8144423..d18c4eb 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; -import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:google_fonts/google_fonts.dart'; /** * Added a dataclass @@ -69,39 +69,36 @@ class _AddRemoveBoxWidgetState extends State { child: widget.modelData!.individualDataListTransient.isEmpty ? Center(child: Text('No Members Added')) : ListView.builder( - itemCount: widget.modelData!.individualDataListTransient.length, + itemCount: widget + .modelData!.individualDataListTransient.length, shrinkWrap: true, itemBuilder: (BuildContext context, int index) { return Card( color: colors.darkSecondBackgroundColor, child: ListTile( - onTap: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => FamilyMemberAdd( - familyMemberIndividualDataModel: widget - .modelData!.individualDataListTransient - .elementAt(index)))); - }, - //Pass a function which is called onSaved in the next page and add data to the class object - leading: Icon(Icons.person), - title: Text( - "User ${index + 1}", - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 20), - ), - trailing: IconButton( - color: colors.darkSecondAccentColor, - icon: Icon(Icons.close), - onPressed: () async { - setState(() { - widget.modelData!.individualDataListTransient - .removeAt(index); - }); + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => FamilyMemberAdd( + familyMemberIndividualDataModel: + widget.modelData! + .individualDataListTransient + .elementAt(index)))); }, - ), - ), + //Pass a function which is called onSaved in the next page and add data to the class object + leading: Icon(Icons.person), + title: Text( + "User ${index + 1}", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + trailing: IconButton( + color: colors.darkSecondAccentColor, + icon: Icon(Icons.close), + onPressed: () async { + Dialog(index); + })), ); }), ), @@ -111,4 +108,49 @@ class _AddRemoveBoxWidgetState extends State { ), ); } + + void Dialog(index) async { + final result = await showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + content: Text( + "All unsaved changes will be lost", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + actions: [ + TextButton( + child: Text( + 'No', + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: () { + Navigator.pop(context, false); + }, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: Text( + 'Yes', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: () { + setState(() { + widget.modelData!.individualDataListTransient + .removeAt(index); + }); + Navigator.pop(context); + }) + ]), + ); + return result; + } } diff --git a/lib/Widgets/DataCard.dart b/lib/Widgets/DataCard.dart index 7eced43..6be3c78 100644 --- a/lib/Widgets/DataCard.dart +++ b/lib/Widgets/DataCard.dart @@ -1,3 +1,4 @@ +import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -62,10 +63,12 @@ class DataCard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Text(heading, + AutoSizeText(heading, + maxLines: 3, style: GoogleFonts.montserrat( fontSize: 25, color: colors.darkPrimaryTextColor)), - Text(subHeading, + AutoSizeText(subHeading, + maxLines: 2, style: GoogleFonts.montserrat( fontSize: 15, color: colors.darkPrimaryTextColor)) ], diff --git a/pubspec.lock b/pubspec.lock index 92efe01..8dc0230 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -29,6 +29,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.8.2" + auto_size_text: + dependency: "direct main" + description: + name: auto_size_text + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" boolean_selector: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 2233265..f666bd9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,6 +28,7 @@ dependencies: objectbox_flutter_libs: any flutter_svg: 0.23.0 geolocator: ^7.7.1 + auto_size_text: ^3.0.0 http: 0.13.4 flutter_secure_storage: ^4.2.1 step_progress_indicator: ^1.0.1 From e9460f1c9c81a716f4f2e03952ae59e89e9da9df Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 23:40:44 +0530 Subject: [PATCH 136/264] UI fixes --- lib/Screens/CommunityDataCollection.dart | 3 +++ lib/Screens/VillageSelection.dart | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index b8e9768..1abdfbc 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -217,3 +217,6 @@ class _CommunityDataCollectionState extends State { super.dispose(); } } + + +//TODO: Fix colors of dialog \ No newline at end of file diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index e0c0e27..b69f854 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -90,7 +90,7 @@ class _VillageSelectionScreenState extends State { elevation: 10, color: colors.darkScaffoldColor, child: SizedBox( - height: MediaQuery.of(context).size.height * 0.16, + height: MediaQuery.of(context).size.height * 0.22, width: MediaQuery.of(context).size.width * 0.7, child: Column( children: [ From 3841ce419637e62cdefe796913e8ba146a671e5d Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Thu, 6 Jan 2022 23:46:36 +0530 Subject: [PATCH 137/264] UI fixes --- lib/Screens/VillageSelection.dart | 210 +++++++++++++++--------------- 1 file changed, 106 insertions(+), 104 deletions(-) diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index b69f854..00e0798 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -34,118 +34,120 @@ class _VillageSelectionScreenState extends State { backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Generate UID'), body: SafeArea( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Center( - child: Container( - decoration: BoxDecoration( - color: colors.darkSecondBackgroundColor, - borderRadius: BorderRadius.all(Radius.circular(20))), - height: MediaQuery.of(context).size.height * 0.80, - width: MediaQuery.of(context).size.width * 0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CheckBoxAlertDialog( - singleOption: true, - title: "Choose Village Code", - context: context, - hint: 'Choose here', - dataMap: widget.villages, - ), - Padding( - padding: const EdgeInsets.only( - top: 25.0, bottom: 75, right: 15.0, left: 25.0), - child: SizedBox( - width: double.infinity, - height: 50, - child: ElevatedButton( - child: Text("Generate UID", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all( - Colors.white), - backgroundColor: - MaterialStateProperty.all( - colors.darkScaffoldColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors.darkScaffoldColor)))), - onPressed: () { - setState(() { - widget.isGenerated = true; - }); - }), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Center( + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.all(Radius.circular(20))), + height: MediaQuery.of(context).size.height * 0.80, + width: MediaQuery.of(context).size.width * 0.9, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CheckBoxAlertDialog( + singleOption: true, + title: "Choose Village Code", + context: context, + hint: 'Choose here', + dataMap: widget.villages, ), - ), - if (widget.isGenerated) - Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20)), - elevation: 10, - color: colors.darkScaffoldColor, + Padding( + padding: const EdgeInsets.only( + top: 25.0, bottom: 75, right: 15.0, left: 25.0), child: SizedBox( - height: MediaQuery.of(context).size.height * 0.22, - width: MediaQuery.of(context).size.width * 0.7, - child: Column( - children: [ - Padding( - padding: - const EdgeInsets.symmetric(vertical: 20.0), - child: Text( - 'Sample UIN', - style: GoogleFonts.poppins( - fontWeight: FontWeight.w600, - fontSize: 20, - color: colors.darkPrimaryTextColor), + width: double.infinity, + height: 50, + child: ElevatedButton( + child: Text("Generate UID", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + Colors.white), + backgroundColor: + MaterialStateProperty.all( + colors.darkScaffoldColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors.darkScaffoldColor)))), + onPressed: () { + setState(() { + widget.isGenerated = true; + }); + }), + ), + ), + if (widget.isGenerated) + Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20)), + elevation: 10, + color: colors.darkScaffoldColor, + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.22, + width: MediaQuery.of(context).size.width * 0.7, + child: Column( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(vertical: 20.0), + child: Text( + 'Sample UIN', + style: GoogleFonts.poppins( + fontWeight: FontWeight.w600, + fontSize: 20, + color: colors.darkPrimaryTextColor), + ), + ), + ElevatedButton.icon( + label: Text("Continue", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + colors.lightPrimaryTextColor), + backgroundColor: + MaterialStateProperty.all( + colors.darkPrimaryTextColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(20), + side: BorderSide( + color: + colors.darkScaffoldColor)))), + onPressed: () { + Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: (context) => + FamilyHomeScreen())); + }, + icon: Icon(Icons.arrow_right_alt_sharp), ), - ), - ElevatedButton.icon( - label: Text("Continue", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all( - colors.lightPrimaryTextColor), - backgroundColor: - MaterialStateProperty.all( - colors.darkPrimaryTextColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(20), - side: BorderSide( - color: - colors.darkScaffoldColor)))), - onPressed: () { - Navigator.of(context).pushReplacement(MaterialPageRoute( - builder: (context) => - FamilyHomeScreen())); - }, - icon: Icon(Icons.arrow_right_alt_sharp), - ), - ], + ], + ), ), ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.2, ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.2, - ), - if (!widget.isGenerated) - TextButton( - onPressed: () {}, child: Text("Generate UIN later")) - ], + if (!widget.isGenerated) + TextButton( + onPressed: () {}, child: Text("Generate UIN later")) + ], + ), ), - ), - ) - ], + ) + ], + ), ), ), ); From 289f2bf9c91a280e5683fa3bd2a326bcb47e9eb0 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 6 Jan 2022 23:54:27 +0530 Subject: [PATCH 138/264] Fixed RenderFlex Issues --- lib/Model/CommunityDataModel.dart | 28 ++++- lib/Model/FamilyMembersCommonDataModel.dart | 27 +++++ lib/Screens/CollectLocationWidget.dart | 96 ++++++++-------- lib/Screens/CommunityDataCollection.dart | 120 ++++++++++---------- lib/Screens/FamilyDetails.dart | 8 +- lib/Screens/FamilyMemberAdd.dart | 7 +- lib/Widgets/AddRemoveBoxWidget.dart | 9 +- lib/Widgets/DataCard.dart | 4 +- 8 files changed, 170 insertions(+), 129 deletions(-) diff --git a/lib/Model/CommunityDataModel.dart b/lib/Model/CommunityDataModel.dart index 559f248..a982099 100644 --- a/lib/Model/CommunityDataModel.dart +++ b/lib/Model/CommunityDataModel.dart @@ -39,7 +39,7 @@ class CommunityDataModel { accuracy: body['accuracy'] ?? 0, altitude: body['altitude'] ?? 0, heading: body['heading'] ?? 0, - speed: body['speed'] ?? 0, + speed: body['speed'] ?? 0, speedAccuracy: body['speedAccuracy'] ?? 0); } } @@ -68,7 +68,7 @@ class CommunityDataModel { accuracy: body['accuracy'] ?? 0, altitude: body['altitude'] ?? 0, heading: body['heading'] ?? 0, - speed: body['speed'] ?? 0, + speed: body['speed'] ?? 0, speedAccuracy: body['speedAccuracy'] ?? 0); } } @@ -97,7 +97,7 @@ class CommunityDataModel { accuracy: body['accuracy'] ?? 0, altitude: body['altitude'] ?? 0, heading: body['heading'] ?? 0, - speed: body['speed'] ?? 0, + speed: body['speed'] ?? 0, speedAccuracy: body['speedAccuracy'] ?? 0); } } @@ -127,7 +127,7 @@ class CommunityDataModel { accuracy: body['accuracy'] ?? 0, altitude: body['altitude'] ?? 0, heading: body['heading'] ?? 0, - speed: body['speed'] ?? 0, + speed: body['speed'] ?? 0, speedAccuracy: body['speedAccuracy'] ?? 0); } } @@ -140,4 +140,24 @@ class CommunityDataModel { this.resourceType, this.villageCode}); + Map toJson() => { + 'resourceType': resourceType, + 'villageCode': villageCode, + 'locationTopLeft': [ + locationTopLeft!.latitude, + locationTopLeft!.longitude + ], + 'locationTopRight': [ + locationTopRight!.latitude, + locationTopRight!.longitude + ], + 'locationBottomLeft': [ + locationBottomLeft!.latitude, + locationBottomLeft!.longitude + ], + 'locationBottomRight': [ + locationBottomRight!.latitude, + locationBottomRight!.longitude + ], + }; } diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 665cb10..b013adc 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -104,6 +104,33 @@ class FamilyMembersCommonDataModel { final individualDataListTransient = []; final individualDataList = ToMany(); + Map toJson() => { + 'drinkingWater': drinkingWater, + 'sourceOfDrinkingWater': sourceOfDrinkingWater, + 'toiletFacility': toiletFacility, + 'communityToilet': communityToilet, + 'environmentSanitationLevel': environmentSanitationLevel, + 'runningWaterAvailable': runningWaterAvailable, + 'noOfTwoWheelers': noOfTwoWheelers, + 'noOfThreeWheelers': noOfThreeWheelers, + 'locationTopLeft': [ + locationTopLeft!.latitude, + locationTopLeft!.longitude + ], + 'locationTopRight': [ + locationTopRight!.latitude, + locationTopRight!.longitude + ], + 'locationBottomLeft': [ + locationBottomLeft!.latitude, + locationBottomLeft!.longitude + ], + 'locationBottomRight': [ + locationBottomRight!.latitude, + locationBottomRight!.longitude + ], + }; + String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); String? get dbLocationTopLeft { diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index 9230c25..4e8911e 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -61,54 +61,56 @@ class _CollectLocationWidgetState extends State { child: Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Get Location'), - body: FormPageView( - [ - LocationWidgetField( - title: "Record location at top left part of the facility", - context: context, - defaultValue: widget.modelData?.locationTopLeft, - onSaved: (data) { - print(data); - widget.modelData?.locationTopLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at top right part of the facility", - context: context, - defaultValue: widget.modelData?.locationTopRight, - onSaved: (data) { - print(data); - widget.modelData?.locationTopRight = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom left part of the facility", - context: context, - defaultValue: widget.modelData?.locationBottomLeft, - onSaved: (data) { - print(data); - widget.modelData?.locationBottomLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom right part of the facility", - context: context, - defaultValue: widget.modelData?.locationBottomRight, - onSaved: (data) { - print(data); - widget.modelData?.locationBottomRight = data; - }, - ), - ], - _onSubmit, - onChange: (isValid){ - print("IS LOCATION VALID: ${widget.modelData?.locationPageValid}"); - widget.modelData?.locationPageValid = isValid; - }, - submitMessage: - "Submit to Continue or go back to re-record location data", - note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", + body: SingleChildScrollView( + child: FormPageView( + [ + LocationWidgetField( + title: "Record location at top left part of the facility", + context: context, + defaultValue: widget.modelData?.locationTopLeft, + onSaved: (data) { + print(data); + widget.modelData?.locationTopLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at top right part of the facility", + context: context, + defaultValue: widget.modelData?.locationTopRight, + onSaved: (data) { + print(data); + widget.modelData?.locationTopRight = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom left part of the facility", + context: context, + defaultValue: widget.modelData?.locationBottomLeft, + onSaved: (data) { + print(data); + widget.modelData?.locationBottomLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom right part of the facility", + context: context, + defaultValue: widget.modelData?.locationBottomRight, + onSaved: (data) { + print(data); + widget.modelData?.locationBottomRight = data; + }, + ), + ], + _onSubmit, + onChange: (isValid){ + print("IS LOCATION VALID: ${widget.modelData?.locationPageValid}"); + widget.modelData?.locationPageValid = isValid; + }, + submitMessage: + "Submit to Continue or go back to re-record location data", + note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", + ), )), ); } diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 1abdfbc..eeb0009 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -142,71 +142,73 @@ class _CommunityDataCollectionState extends State { child: Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Community Data'), - body: FormPageView( - [ - DropDownFormField( - defaultValue: modelData.resourceType, - list: widget._publicResourceList, + body: SingleChildScrollView( + child: FormPageView( + [ + DropDownFormField( + defaultValue: modelData.resourceType, + list: widget._publicResourceList, + onSaved: (data) { + print(data); + modelData.resourceType = data; + }, + title: "Choose type of resource to tag", + hint: "Select resource type", + errorField: "Please choose a resource to tag"), + LocationWidgetField( + title: "Record location at top left part of the facility", + defaultValue: modelData.locationTopLeft, + context: context, onSaved: (data) { print(data); - modelData.resourceType = data; + modelData.locationTopLeft = data; }, - title: "Choose type of resource to tag", - hint: "Select resource type", - errorField: "Please choose a resource to tag"), - LocationWidgetField( - title: "Record location at top left part of the facility", - defaultValue: modelData.locationTopLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at top right part of the facility", - defaultValue: modelData.locationTopRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationTopRight = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom left part of the facility", - defaultValue: modelData.locationBottomLeft, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom right part of the facility", - defaultValue: modelData.locationBottomRight, - context: context, - onSaved: (data) { - print(data); - modelData.locationBottomRight = data; - }, - ), - DropDownFormField( - defaultValue: modelData.villageCode, - list: widget._villageCodeName, + ), + LocationWidgetField( + title: "Record location at top right part of the facility", + defaultValue: modelData.locationTopRight, + context: context, + onSaved: (data) { + print(data); + modelData.locationTopRight = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom left part of the facility", + defaultValue: modelData.locationBottomLeft, + context: context, + onSaved: (data) { + print(data); + modelData.locationBottomLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom right part of the facility", + defaultValue: modelData.locationBottomRight, + context: context, onSaved: (data) { print(data); - modelData.villageCode = data; + modelData.locationBottomRight = data; }, - title: "Choose Village Code", - hint: "Select Village Code", - errorField: "Please choose a village code"), - ], - _onSubmit, - submitMessage: - "Submit record to server or Save record locally for later editing", - saveData: _onSave, - note: - "Note: Saving existing records will over-write the record and not create new one", + ), + DropDownFormField( + defaultValue: modelData.villageCode, + list: widget._villageCodeName, + onSaved: (data) { + print(data); + modelData.villageCode = data; + }, + title: "Choose Village Code", + hint: "Select Village Code", + errorField: "Please choose a village code"), + ], + _onSubmit, + submitMessage: + "Submit record to server or Save record locally for later editing", + saveData: _onSave, + note: + "Note: Saving existing records will over-write the record and not create new one", + ), ), ), ); diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 09637b5..d827101 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -143,11 +143,7 @@ class _FamilyDetailsState extends State { resizeToAvoidBottomInset: true, backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Family Details'), - body: SizedBox( - height: MediaQuery.of(context).size.height - - MediaQuery.of(context).viewInsets.bottom * 1.1, - child: SingleChildScrollView( - physics: ClampingScrollPhysics(), + body: SingleChildScrollView( child: FormPageView( [ Column( @@ -544,7 +540,7 @@ class _FamilyDetailsState extends State { "Submit to Continue or go back to re-record data", note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", - )))), + ))) ); } } diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 31ff4c8..e38761a 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -127,11 +127,7 @@ class _FamilyMemberAddState extends State { resizeToAvoidBottomInset: true, backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Add Family Member'), - body: SizedBox( - height: MediaQuery.of(context).size.height - - MediaQuery.of(context).viewInsets.bottom * 1.1, - child: SingleChildScrollView( - physics: ClampingScrollPhysics(), + body: SingleChildScrollView( child: FormPageView( [ Column( @@ -774,7 +770,6 @@ class _FamilyMemberAddState extends State { ), ), ), - ), ); } } diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index d18c4eb..a1ea45f 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -22,16 +22,15 @@ class _AddRemoveBoxWidgetState extends State { @override Widget build(BuildContext context) { return Container( - height: MediaQuery.of(context).size.height * 0.45, + height: MediaQuery.of(context).size.height * 0.4, color: colors.darkScaffoldColor, child: Padding( padding: EdgeInsets.all(10), child: Container( color: colors.darkScaffoldColor, - height: MediaQuery.of(context).size.height * 0.45, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, + height: MediaQuery.of(context).size.height * 0.4, + child: Wrap( + children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/Widgets/DataCard.dart b/lib/Widgets/DataCard.dart index 6be3c78..9a7a368 100644 --- a/lib/Widgets/DataCard.dart +++ b/lib/Widgets/DataCard.dart @@ -64,11 +64,11 @@ class DataCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ AutoSizeText(heading, - maxLines: 3, + maxLines: 2, style: GoogleFonts.montserrat( fontSize: 25, color: colors.darkPrimaryTextColor)), AutoSizeText(subHeading, - maxLines: 2, + maxLines: 1, style: GoogleFonts.montserrat( fontSize: 15, color: colors.darkPrimaryTextColor)) ], From 904c873b4d7be6ddb8a09e6591516b34f0382446 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 7 Jan 2022 09:15:07 +0530 Subject: [PATCH 139/264] UI fixes, EditExistingRecordsPage.dart list tiles fixed --- assets/svg/user-id-icon.svg | 10 ++ lib/Screens/CommunityDataCollection.dart | 56 ++++--- lib/Screens/EditExistingRecordsPage.dart | 178 ++++++++++++++--------- 3 files changed, 156 insertions(+), 88 deletions(-) create mode 100644 assets/svg/user-id-icon.svg diff --git a/assets/svg/user-id-icon.svg b/assets/svg/user-id-icon.svg new file mode 100644 index 0000000..b3269d6 --- /dev/null +++ b/assets/svg/user-id-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index eeb0009..9d51722 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/LocationWidget.dart'; -import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; class CommunityDataCollection extends StatefulWidget { @@ -90,18 +90,26 @@ class _CommunityDataCollectionState extends State { print("Entering data at id ${id}"); AlertDialog alertDialog = AlertDialog( + backgroundColor: colors.darkScaffoldColor, title: Text( 'Record Saved', - style: GoogleFonts.poppins(fontWeight: FontWeight.bold), + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - content: Text('The Record has been saved with record ID ${id}', - style: GoogleFonts.poppins()), + content: Text('The record has been saved with record ID ${id}', + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor)), actions: [ - TextButton( + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), onPressed: () { Navigator.of(context, rootNavigator: true).pop('dialog'); }, - child: Text('OK'), + child: Text( + 'OK', + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), ) ], ); @@ -112,24 +120,39 @@ class _CommunityDataCollectionState extends State { return WillPopScope( onWillPop: () async { - //TODO: Add condition here to check if page has been filled - if (false) { - return true; - } final result = await showDialog( context: context, builder: (context) => AlertDialog( - title: Text("Are you sure?"), - content: Text("All unsaved changes would be lost"), + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + content: Text( + "All unsaved changes would be lost", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), actions: [ TextButton( - child: Text('No'), + child: Text( + 'No', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), onPressed: () { Navigator.pop(context, false); }, ), - TextButton( - child: Text('Yes', style: TextStyle(color: Colors.red)), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: Text( + 'Yes', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), onPressed: () { Navigator.pop(context, true); }, @@ -219,6 +242,3 @@ class _CommunityDataCollectionState extends State { super.dispose(); } } - - -//TODO: Fix colors of dialog \ No newline at end of file diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 63f87b6..718a05c 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; class EditRecordsScreen extends StatefulWidget { @@ -25,6 +26,7 @@ class _EditRecordsScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton( 'Edit Existing Data', actions: [ @@ -43,78 +45,114 @@ class _EditRecordsScreenState extends State { ], ), body: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Visibility( - visible: isSearchOpen, - child: Padding( - padding: - EdgeInsets.only(top: 10, left: 15, right: 15, bottom: 10), - child: TextField( - onChanged: (text) { - print("INVOKED"); - setState(() { - _searchList = _dataList - .where( - (i) => i.toLowerCase().contains(text.toLowerCase())) - .toList(); - }); - }, - controller: _textEditingController, - style: TextStyle(color: Colors.white), - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.darkSecondaryTextColor, width: 1.0)), - contentPadding: EdgeInsets.only(left: 10, right: 10), - fillColor: colors.darkSecondBackgroundColor, - prefixIcon: Icon(Icons.search), - // suffixIcon: Material( - // borderRadius: BorderRadius.only( - // topRight: Radius.circular(4), - // bottomRight: Radius.circular(4)), - // child: IconButton( - // splashRadius: 16, - // icon: Icon( - // Icons.clear, - // color: colors.darkSecondAccentColor, - // ), - // onPressed: () { - // _textEditingController.text = ""; - // }, - // ), - // ), - label: Text( - "Search", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Search for records..."), + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Visibility( + visible: isSearchOpen, + child: Padding( + padding: + EdgeInsets.only(top: 30, left: 15, right: 15, bottom: 30), + child: TextField( + onChanged: (text) { + print("INVOKED"); + setState(() { + _searchList = _dataList + .where( + (i) => i.toLowerCase().contains(text.toLowerCase())) + .toList(); + }); + }, + controller: _textEditingController, + style: TextStyle(color: Colors.white), + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, width: 1.0)), + contentPadding: EdgeInsets.symmetric(horizontal: 10.0), + fillColor: colors.darkScaffoldColor, + prefixIcon: Icon( + Icons.search, + color: colors.darkAccentColor, + ), + // suffixIcon: Material( + // borderRadius: BorderRadius.only( + // topRight: Radius.circular(4), + // bottomRight: Radius.circular(4)), + // child: IconButton( + // splashRadius: 16, + // icon: Icon( + // Icons.clear, + // color: colors.darkSecondAccentColor, + // ), + // onPressed: () { + // _textEditingController.text = ""; + // }, + // ), + // ), + label: Text( + "Search", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Search for records...", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor)), + ), ), ), - ), - ListView.builder( - itemCount: _searchList.length, - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return Card( - color: colors.darkSecondBackgroundColor, - //TODO: Replace with better ListTile - child: ListTile( - onTap: () {}, - //Pass a function which is called onSaved in the next page and add data to the class object - title: Text( - _searchList[index], - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 20), - ), + Padding( + padding: const EdgeInsets.all(10.0), + child: SizedBox( + height: MediaQuery.of(context).size.height*0.7, + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC252426), + blurRadius: 8.0, + ), + ], ), - ); - }) - ], - ), + child: Padding( + padding: const EdgeInsets.all(5.0), + child: ListView.builder( + itemCount: _searchList.length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0,vertical: 3.0), + child: Card( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(5))), + elevation: 10, + color: colors.darkScaffoldColor, + child: ListTile( + contentPadding: EdgeInsets.symmetric(vertical: 10,horizontal: 20.0), + minLeadingWidth: 30, + onTap: () {}, + //Pass a function which is called onSaved in the next page and add data to the class object + title: Text( + _searchList[index], + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + subtitle: Text('Click to edit',style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor),), + leading: SvgPicture.asset("assets/svg/user-id-icon.svg",fit: BoxFit.fill,), + isThreeLine: true, + trailing: Icon(Icons.chevron_right,color: colors.darkAccentColor,), + ), + ), + ); + }), + ), + ), + ), + ) + ], + ), ); } } From be23109f668b8c0f2dc60ea40dd80b999d6cd805 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 7 Jan 2022 10:11:51 +0530 Subject: [PATCH 140/264] UI fixes --- lib/Screens/CollectLocationWidget.dart | 8 ++-- lib/Screens/CommunityDataCollection.dart | 2 +- lib/Screens/FamilyDetails.dart | 54 +++++++++++++----------- lib/Screens/FamilyMemberAdd.dart | 2 +- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index 4e8911e..99c9881 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -38,17 +38,17 @@ class _CollectLocationWidgetState extends State { context: context, builder: (context) => AlertDialog( - title: AutoSizeText("Are you sure?"), - content: AutoSizeText("All unsaved changes would be lost"), + title: Text("Are you sure?"), + content: Text("All unsaved changes will be lost."), actions: [ TextButton( - child: AutoSizeText('No'), + child:Text('No'), onPressed: () { Navigator.pop(context, false); }, ), TextButton( - child: AutoSizeText('Yes', style: TextStyle(color: Colors.red)), + child: Text('Yes', style: TextStyle(color: Colors.red)), onPressed: () { Navigator.pop(context, true); }, diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 9d51722..58dd43c 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -129,7 +129,7 @@ class _CommunityDataCollectionState extends State { style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), content: Text( - "All unsaved changes would be lost", + "All unsaved changes will be lost.", style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), actions: [ diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index d827101..fc226a5 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -93,6 +93,17 @@ class _FamilyDetailsState extends State { 'no': false, }; + var water_sources = { + 'None':false, + 'Lake':false, + 'Pond':false, + 'Groundwater':false, + 'Well':false, + 'Tap':false, + 'Water supply':false, + 'Lorry/Van':false + }; + @override Widget build(BuildContext context) { return WillPopScope( @@ -101,17 +112,17 @@ class _FamilyDetailsState extends State { context: context, builder: (context) => AlertDialog( backgroundColor: colors.darkScaffoldColor, - title: AutoSizeText( + title: Text( "Are you sure?", style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - content: AutoSizeText( - "All unsaved changes would be lost", + content: Text( + "All unsaved changes will be lost.", style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), actions: [ TextButton( - child: AutoSizeText( + child:Text( 'No', style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), @@ -125,7 +136,7 @@ class _FamilyDetailsState extends State { primary: colors.darkAccentColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(20)))), - child: AutoSizeText( + child: Text( 'Yes', style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), @@ -160,26 +171,17 @@ class _FamilyDetailsState extends State { widget.modelData!.drinkingWater = val; }, title: "Do you have drinking water available?"), - DropDownFormField( - list: [ - 'None', - 'Lake', - 'Pond', - 'Groundwater', - 'Well', - 'Tap', - 'Water supply', - 'Lorry/Van' - ], - defaultValue: - widget.modelData!.sourceOfDrinkingWater, + CheckBoxAddExtraAlertDialog( + singleOption: false, + dataMap: water_sources, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.sourceOfDrinkingWater = val; + //widget.modelData!.sourceOfDrinkingWater = val; }, hint: "Select source", title: "Source of Water", errorField: "Please choose an option", + context: context, ), OptionsWidget( options: [ @@ -317,6 +319,7 @@ class _FamilyDetailsState extends State { padding: const EdgeInsets.only( left: 10.0, right: 10.0, top: 20.0), child: TextFormField( + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), initialValue: widget.modelData!.incomeFromCattle, onSaved: (val) { print("Value recorded: $val"); @@ -365,7 +368,6 @@ class _FamilyDetailsState extends State { Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - //TODO: Display if answer to previous question is yes CheckBoxAddExtraAlertDialog( title: 'Seeds Preserved', hint: 'Choose preserved seeds', @@ -391,7 +393,7 @@ class _FamilyDetailsState extends State { }, ), CheckBoxAddExtraAlertDialog( - title: 'Choose resource', + title: 'Local foods consumed', hint: 'Choose your resource', //TODO: Change variable to local foood @@ -446,7 +448,7 @@ class _FamilyDetailsState extends State { child: Padding( padding: const EdgeInsets.only( left: 10.0, right: 10.0, bottom: 15.0), - child: AutoSizeText( + child: Text( "Address", style: GoogleFonts.montserrat( fontSize: 15.0, @@ -458,6 +460,7 @@ class _FamilyDetailsState extends State { padding: const EdgeInsets.only( left: 10.0, right: 10.0, bottom: 70.0), child: TextFormField( + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), initialValue: widget.modelData!.addressOne, onSaved: (val) { print("Value recorded: $val"); @@ -485,6 +488,7 @@ class _FamilyDetailsState extends State { padding: const EdgeInsets.only( left: 10.0, right: 10.0, bottom: 70.0), child: TextFormField( + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), initialValue: widget.modelData!.addressTwo, onSaved: (val) { print("Value recorded: $val"); @@ -507,6 +511,7 @@ class _FamilyDetailsState extends State { padding: const EdgeInsets.only( left: 10.0, right: 10.0, bottom: 70.0), child: TextFormField( + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), initialValue: widget.modelData!.city, onSaved: (val) { print("Value recorded: $val"); @@ -545,7 +550,6 @@ class _FamilyDetailsState extends State { } } -//TODO: Check textbox colors -//TODO: Keyboard inset not working - clampingscroll issue? -//TODO: Source of water has to be changed + +//TODO: Source of water has to be changed in objectbox //TODO: Insert values to checkboxalertdialogs diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index e38761a..80871c3 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -93,7 +93,7 @@ class _FamilyMemberAddState extends State { style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), content: Text( - "All unsaved changes would be lost", + "All unsaved changes will be lost.", style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), actions: [ From 1a5e34c5155c248e5f1641b3c53ecd2b705a4aee Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 10:18:03 +0530 Subject: [PATCH 141/264] Fixed Village Code page and Edit existing records to avoid RenderFlex issues --- lib/Screens/EditExistingRecordsPage.dart | 59 ++++--- lib/Screens/VillageSelection.dart | 194 ++++++++++------------- 2 files changed, 112 insertions(+), 141 deletions(-) diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 718a05c..8c63d05 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -15,7 +15,7 @@ class _EditRecordsScreenState extends State { bool isSearchOpen = false; TextEditingController _textEditingController = new TextEditingController(); - List _dataList = ["ONE", "TWO", "THREE"]; + List _dataList = ["ONE", "TWO", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE"]; late List _searchList; initState() { @@ -50,8 +50,7 @@ class _EditRecordsScreenState extends State { Visibility( visible: isSearchOpen, child: Padding( - padding: - EdgeInsets.only(top: 30, left: 15, right: 15, bottom: 30), + padding: EdgeInsets.symmetric(horizontal: 20), child: TextField( onChanged: (text) { print("INVOKED"); @@ -100,28 +99,26 @@ class _EditRecordsScreenState extends State { ), ), ), - Padding( - padding: const EdgeInsets.all(10.0), - child: SizedBox( - height: MediaQuery.of(context).size.height*0.7, - child: Container( - decoration: BoxDecoration( - color: colors.darkSecondBackgroundColor, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Color(0xBC252426), - blurRadius: 8.0, - ), - ], - ), - child: Padding( - padding: const EdgeInsets.all(5.0), - child: ListView.builder( - itemCount: _searchList.length, - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return Padding( + Expanded( + child: Padding( + padding: EdgeInsets.all(20), + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC252426), + blurRadius: 8.0, + ), + ], + ), + child: Padding( + padding: EdgeInsets.all(12), + child: ListView.builder( + itemCount: _searchList.length, + itemBuilder: (BuildContext context, int index) { + return Padding( padding: const EdgeInsets.symmetric(horizontal: 10.0,vertical: 3.0), child: Card( shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(5))), @@ -145,12 +142,12 @@ class _EditRecordsScreenState extends State { trailing: Icon(Icons.chevron_right,color: colors.darkAccentColor,), ), ), - ); - }), - ), - ), - ), - ) + ); + }), + ), + ), + ), + ), ], ), ); diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index 00e0798..319f751 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -6,6 +6,7 @@ import 'package:geo_spatial/Screens/Home.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; +import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; import 'package:google_fonts/google_fonts.dart'; class VillageSelectionScreen extends StatefulWidget { @@ -19,133 +20,106 @@ class VillageSelectionScreen extends StatefulWidget { var isGenerated = false; } - class _VillageSelectionScreenState extends State { - - initState(){ + initState() { super.initState(); widget.isGenerated = false; } @override Widget build(BuildContext context) { - return Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Generate UID'), body: SafeArea( - child: SingleChildScrollView( - child: Column( + child: PageViewContentBox( + Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Center( - child: Container( - decoration: BoxDecoration( - color: colors.darkSecondBackgroundColor, - borderRadius: BorderRadius.all(Radius.circular(20))), - height: MediaQuery.of(context).size.height * 0.80, - width: MediaQuery.of(context).size.width * 0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CheckBoxAlertDialog( - singleOption: true, - title: "Choose Village Code", - context: context, - hint: 'Choose here', - dataMap: widget.villages, - ), - Padding( - padding: const EdgeInsets.only( - top: 25.0, bottom: 75, right: 15.0, left: 25.0), - child: SizedBox( - width: double.infinity, - height: 50, - child: ElevatedButton( - child: Text("Generate UID", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all( - Colors.white), - backgroundColor: - MaterialStateProperty.all( - colors.darkScaffoldColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors.darkScaffoldColor)))), - onPressed: () { - setState(() { - widget.isGenerated = true; - }); - }), - ), - ), - if (widget.isGenerated) - Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20)), - elevation: 10, - color: colors.darkScaffoldColor, - child: SizedBox( - height: MediaQuery.of(context).size.height * 0.22, - width: MediaQuery.of(context).size.width * 0.7, - child: Column( - children: [ - Padding( - padding: - const EdgeInsets.symmetric(vertical: 20.0), - child: Text( - 'Sample UIN', - style: GoogleFonts.poppins( - fontWeight: FontWeight.w600, - fontSize: 20, - color: colors.darkPrimaryTextColor), - ), - ), - ElevatedButton.icon( - label: Text("Continue", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all( - colors.lightPrimaryTextColor), - backgroundColor: - MaterialStateProperty.all( - colors.darkPrimaryTextColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(20), - side: BorderSide( - color: - colors.darkScaffoldColor)))), - onPressed: () { - Navigator.of(context).pushReplacement(MaterialPageRoute( - builder: (context) => - FamilyHomeScreen())); - }, - icon: Icon(Icons.arrow_right_alt_sharp), - ), - ], - ), + CheckBoxAlertDialog( + singleOption: true, + title: "Choose Village Code", + context: context, + hint: 'Choose here', + dataMap: widget.villages, + ), + Padding( + padding: const EdgeInsets.only( + top: 25.0, bottom: 75, right: 15.0, left: 25.0), + child: SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + child: Text("Generate UID", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkScaffoldColor), + shape: + MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors.darkScaffoldColor)))), + onPressed: () { + setState(() { + widget.isGenerated = true; + }); + }), + ), + ), + if (widget.isGenerated) + Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20)), + elevation: 10, + color: colors.darkScaffoldColor, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 20.0), + child: Text( + 'Sample UIN', + style: GoogleFonts.poppins( + fontWeight: FontWeight.w600, + fontSize: 20, + color: colors.darkPrimaryTextColor), ), ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.2, - ), - if (!widget.isGenerated) - TextButton( - onPressed: () {}, child: Text("Generate UIN later")) - ], - + ElevatedButton.icon( + label: Text("Continue", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + colors.lightPrimaryTextColor), + backgroundColor: MaterialStateProperty.all( + colors.darkPrimaryTextColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors.darkScaffoldColor)))), + onPressed: () { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => FamilyHomeScreen())); + }, + icon: Icon(Icons.arrow_right_alt_sharp), + ), + ], + ), ), ), - ) + SizedBox( + height: MediaQuery.of(context).size.height * 0.2, + ), + if (!widget.isGenerated) + TextButton(onPressed: () {}, child: Text("Generate UIN later")) ], ), ), From 79435b6ffb31decd803661ac05f586e4295d294d Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 10:59:03 +0530 Subject: [PATCH 142/264] Fixed Add Remove Widget overflow issues, got rid of mediaQueries and used Expanded widgets to use max space --- lib/Screens/EditExistingRecordsPage.dart | 10 +- lib/Widgets/AddRemoveBoxWidget.dart | 151 +++++++++++------------ lib/Widgets/DataCard.dart | 4 +- 3 files changed, 82 insertions(+), 83 deletions(-) diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 8c63d05..9ae14f8 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -25,7 +27,7 @@ class _EditRecordsScreenState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton( 'Edit Existing Data', @@ -115,7 +117,9 @@ class _EditRecordsScreenState extends State { ), child: Padding( padding: EdgeInsets.all(12), - child: ListView.builder( + child: + _searchList.isNotEmpty ? + ListView.builder( itemCount: _searchList.length, itemBuilder: (BuildContext context, int index) { return Padding( @@ -143,7 +147,7 @@ class _EditRecordsScreenState extends State { ), ), ); - }), + }) : Container(width: double.infinity, child: Text("No Results Found", textAlign: TextAlign.center,)), ), ), ), diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index a1ea45f..08a4c3d 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -21,91 +21,84 @@ class AddRemoveBoxWidget extends StatefulWidget { class _AddRemoveBoxWidgetState extends State { @override Widget build(BuildContext context) { - return Container( - height: MediaQuery.of(context).size.height * 0.4, - color: colors.darkScaffoldColor, - child: Padding( - padding: EdgeInsets.all(10), - child: Container( - color: colors.darkScaffoldColor, - height: MediaQuery.of(context).size.height * 0.4, - child: Wrap( - - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - TextButton( - onPressed: () { - setState(() { - widget.modelData?.individualDataListTransient - .add(FamilyMemberIndividualDataModel()); - }); - }, - child: Text("Add New User Information", - style: GoogleFonts.poppins( - fontSize: 18, color: colors.darkAccentColor)), - ), - IconButton( + return + Expanded( + flex: 2, + child: Padding( + padding: EdgeInsets.all(5), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TextButton( onPressed: () { setState(() { widget.modelData?.individualDataListTransient .add(FamilyMemberIndividualDataModel()); }); }, - icon: Icon( - Icons.add, - color: colors.darkAccentColor, - )) - ], - ), - SizedBox( - height: 15, - ), - Container( - height: MediaQuery.of(context).size.height * 0.35, - child: widget.modelData!.individualDataListTransient.isEmpty - ? Center(child: Text('No Members Added')) - : ListView.builder( - itemCount: widget - .modelData!.individualDataListTransient.length, - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return Card( - color: colors.darkSecondBackgroundColor, - child: ListTile( - onTap: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => FamilyMemberAdd( - familyMemberIndividualDataModel: - widget.modelData! - .individualDataListTransient - .elementAt(index)))); - }, - //Pass a function which is called onSaved in the next page and add data to the class object - leading: Icon(Icons.person), - title: Text( - "User ${index + 1}", - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 20), - ), - trailing: IconButton( - color: colors.darkSecondAccentColor, - icon: Icon(Icons.close), - onPressed: () async { - Dialog(index); - })), - ); - }), - ), - ], - ), - ), - ), - ); + child: Text("Add New User Information", + style: GoogleFonts.poppins( + fontSize: 18, color: colors.darkAccentColor)), + ), + IconButton( + onPressed: () { + setState(() { + widget.modelData?.individualDataListTransient + .add(FamilyMemberIndividualDataModel()); + }); + }, + icon: Icon( + Icons.add, + color: colors.darkAccentColor, + )) + ], + ), + Flexible( + child: Container( + child: widget.modelData!.individualDataListTransient.isEmpty + ? Center(child: Text('No Members Added')) + : ListView.builder( + itemCount: widget + .modelData!.individualDataListTransient.length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Card( + color: colors.darkSecondBackgroundColor, + child: ListTile( + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => FamilyMemberAdd( + familyMemberIndividualDataModel: + widget.modelData! + .individualDataListTransient + .elementAt(index)))); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + leading: Icon(Icons.person), + title: Text( + "User ${index + 1}", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + trailing: IconButton( + color: colors.darkSecondAccentColor, + icon: Icon(Icons.close), + onPressed: () async { + Dialog(index); + })), + ); + }), + ), + ), + ], + ), + ), + ); } void Dialog(index) async { diff --git a/lib/Widgets/DataCard.dart b/lib/Widgets/DataCard.dart index 9a7a368..1c6a9a5 100644 --- a/lib/Widgets/DataCard.dart +++ b/lib/Widgets/DataCard.dart @@ -64,11 +64,13 @@ class DataCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ AutoSizeText(heading, - maxLines: 2, + maxLines: 3, + overflow: TextOverflow.fade, style: GoogleFonts.montserrat( fontSize: 25, color: colors.darkPrimaryTextColor)), AutoSizeText(subHeading, maxLines: 1, + overflow: TextOverflow.fade, style: GoogleFonts.montserrat( fontSize: 15, color: colors.darkPrimaryTextColor)) ], From 3e0ab17a2e969232476fdb4b07073e2a3c24102d Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 11:15:59 +0530 Subject: [PATCH 143/264] Removed media query from family home page buttons --- lib/Screens/FamilyHomeScreen.dart | 178 +++++++++++++++--------------- lib/Widgets/FormPageView.dart | 6 - 2 files changed, 88 insertions(+), 96 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index ce8191f..241a83f 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -70,105 +70,103 @@ class _FamilyHomeScreenState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Padding( - padding: EdgeInsets.only(left: 10, right: 10), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.4, - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkSecondBackgroundColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors - .darkSecondBackgroundColor)))), - onPressed: () { - bool isValid = true; - print("Common ${modelData!.commonDetailsValid}"); - print("Location ${modelData!.locationPageValid}"); - isValid &= modelData!.commonDetailsValid! && - modelData!.locationPageValid!; + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkSecondBackgroundColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () { + bool isValid = true; + print("Common ${modelData!.commonDetailsValid}"); + print("Location ${modelData!.locationPageValid}"); + isValid &= modelData!.commonDetailsValid! && + modelData!.locationPageValid!; - for (var i - in modelData!.individualDataListTransient) { - isValid &= i.dataValid!; - print("Indv ${i.dataValid}"); - } + for (var i + in modelData!.individualDataListTransient) { + isValid &= i.dataValid!; + print("Indv ${i.dataValid}"); + } - print("Is Valid: $isValid"); - }), + print("Is Valid: $isValid"); + }), ), ), - Padding( - padding: EdgeInsets.only( - left: 10, right: 10, top: 5, bottom: 10), - child: SizedBox( - width: MediaQuery.of(context).size.width * 0.4, - child: ElevatedButton( - child: Text("Save", - style: - TextStyle(fontSize: 14, color: Colors.black)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - Colors.white), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.white)))), - onPressed: () async { - var store = await StoreInstance.getInstance(); - Box individualDataBox = - store.box(); + Expanded( + child: Padding( + padding: EdgeInsets.only( + left: 10, right: 10, top: 5, bottom: 10), + child: ElevatedButton( + child: Text("Save", + style: + TextStyle(fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + Colors.white), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white)))), + onPressed: () async { + var store = await StoreInstance.getInstance(); + Box individualDataBox = + store.box(); - List i = await individualDataBox.putMany( - modelData!.individualDataListTransient); - print("ID: $i"); + List i = await individualDataBox.putMany( + modelData!.individualDataListTransient); + print("ID: $i"); - modelData!.individualDataList - .addAll(modelData!.individualDataListTransient); + modelData!.individualDataList + .addAll(modelData!.individualDataListTransient); - store = await StoreInstance.getInstance(); - Box box = store.box(); - int id = await box.put(modelData); + store = await StoreInstance.getInstance(); + Box box = store.box(); + int id = await box.put(modelData); - AlertDialog alertDialog = AlertDialog( - backgroundColor: colors.darkScaffoldColor, - title: Text( - 'Record Saved', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - ), - content: Text( - 'The Record has been saved with record ID ${id}', - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor)), - actions: [ - ElevatedButton( - onPressed: () { - Navigator.of(context, rootNavigator: true) - .pop('dialog'); - }, - child: Text('OK',style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20)),), - primary: colors.darkAccentColor - ), - ) - ], - ); + AlertDialog alertDialog = AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + 'Record Saved', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + content: Text( + 'The Record has been saved with record ID ${id}', + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor)), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + }, + child: Text('OK',style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20)),), + primary: colors.darkAccentColor + ), + ) + ], + ); - showDialog( - context: context, - builder: (BuildContext context) => alertDialog); - }), + showDialog( + context: context, + builder: (BuildContext context) => alertDialog); + }), ), ) ], diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 476e7ec..af8e8a0 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -161,12 +161,6 @@ class _FormPageViewState extends State { StepCounterWidget(widgetLength, count, formErrorTile, controller), Container( height: MediaQuery.of(context).size.height * 0.85, - // child: PageView( - // onPageChanged: _onPageViewChange, - // scrollDirection: Axis.horizontal, - // controller: controller, - // children: widgetList, - // ), child: PreloadPageView.builder( onPageChanged: _onPageViewChange, scrollDirection: Axis.horizontal, From b8347d16ff5ef75054ebafe18946018764eafea5 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 11:18:33 +0530 Subject: [PATCH 144/264] Removed auto fade in text widget --- lib/Widgets/DataCard.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/Widgets/DataCard.dart b/lib/Widgets/DataCard.dart index 1c6a9a5..6332700 100644 --- a/lib/Widgets/DataCard.dart +++ b/lib/Widgets/DataCard.dart @@ -65,12 +65,10 @@ class DataCard extends StatelessWidget { children: [ AutoSizeText(heading, maxLines: 3, - overflow: TextOverflow.fade, style: GoogleFonts.montserrat( fontSize: 25, color: colors.darkPrimaryTextColor)), AutoSizeText(subHeading, maxLines: 1, - overflow: TextOverflow.fade, style: GoogleFonts.montserrat( fontSize: 15, color: colors.darkPrimaryTextColor)) ], From ac87145c4a430b8d54688190fff6ed10279bf3bf Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 12:11:35 +0530 Subject: [PATCH 145/264] Added parser to convert model to JSON --- lib/Model/FamilyMembersCommonDataModel.dart | 65 +++++++++++++- lib/Screens/FamilyDetails.dart | 4 +- lib/Screens/FamilyHomeScreen.dart | 4 +- lib/objectbox-model.json | 16 ++-- lib/objectbox.g.dart | 96 ++++++++++----------- 5 files changed, 126 insertions(+), 59 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index b013adc..6a7c6ad 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -40,6 +40,39 @@ class FamilyMemberIndividualDataModel { String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); + Map toJson() => { + 'userName': userName, + 'dateOfBirth': + "${dateOfBirth!.day}/${dateOfBirth!.month}/${dateOfBirth!.year}", + 'gender': gender, + 'phoneNumber': phoneNumber, + 'educationQualification': educationQualification, + 'aadhaarNumber': aadhaarNumber, + 'vulnerabilities': vulnerabilities, + 'occupation': occupation, + 'dailyWageWorker': dailyWageWorker, + 'incomePerDay': incomePerDay, + 'incomePerMonth': incomePerMonth, + 'pension': pension, + 'businessStatus': businessStatus, + 'maritalStatus': maritalStatus, + 'specialSkills': specialSkills, + 'frequentAilments': frequentAilments, + 'commutableDisease': commutableDisease, + 'nonCommutableDisease': nonCommutableDisease, + 'surgeries': surgeries, + 'anganwadiServicesAware': anganwadiServicesAware, + 'anganwadiServicesUsing': anganwadiServicesUsing, + 'anganwadiServicesUsedList': anganwadiServicesUsedList, + 'PHCServicesUsedList': PHCServicesUsedList, + 'privateClinicServicesUsedList': privateClinicServicesUsedList, + 'privateServiceReason': privateServiceReason, + 'useOfTobacco': useOfTobacco, + 'useOfAlcohol': useOfAlcohol, + 'aarogyaSetuInstalled': aarogyaSetuInstalled, + 'vizhithiruInstalled': vizhithiruInstalled + }; + FamilyMemberIndividualDataModel({this.userName}); String? get dbVulnerabilities => @@ -74,8 +107,9 @@ class FamilyMembersCommonDataModel { Position? locationTopRight; Position? locationBottomLeft; Position? locationBottomRight; + String? drinkingWater; - String? sourceOfDrinkingWater; + Map? sourceOfDrinkingWater; String? toiletFacility; String? communityToilet; String? environmentSanitationLevel; @@ -113,6 +147,23 @@ class FamilyMembersCommonDataModel { 'runningWaterAvailable': runningWaterAvailable, 'noOfTwoWheelers': noOfTwoWheelers, 'noOfThreeWheelers': noOfThreeWheelers, + 'noOfFourWheelers': noOfFourWheelers, + 'twoThreeWheelManufacturer': twoThreeWheelManufacturer, + 'twoFourManufacturer': twoFourManufacturer, + 'localFoodMap': localFoodMap, + 'isCattleOwned': isCattleOwned, + 'incomeFromCattle': incomeFromCattle, + 'isFarmLandOwned': isFarmLandOwned, + 'isSeedsPreserved': isSeedsPreserved, + 'preservedSeedsMap': preservedSeedsMap, + 'treesOwnedMap': treesOwnedMap, + 'isKitchenGardenOwned': isKitchenGardenOwned, + 'kitchenGardenPlants': kitchenGardenPlants, + 'addressOne': addressOne, + 'addressTwo': addressTwo, + 'city': city, + 'familyMemberData': + individualDataListTransient.map((item) => item.toJson()).toList(), 'locationTopLeft': [ locationTopLeft!.latitude, locationTopLeft!.longitude @@ -255,6 +306,18 @@ class FamilyMembersCommonDataModel { } } + String? get dbSourceOfDrinkingWater => + sourceOfDrinkingWater == null ? null : json.encode(sourceOfDrinkingWater); + + set dbSourceOfDrinkingWater(String? value) { + if (value == null) { + sourceOfDrinkingWater = null; + } else { + sourceOfDrinkingWater = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + String? get dbTwoFourManufacturer => twoFourManufacturer == null ? null : json.encode(twoFourManufacturer); diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index fc226a5..88c4294 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -173,10 +173,10 @@ class _FamilyDetailsState extends State { title: "Do you have drinking water available?"), CheckBoxAddExtraAlertDialog( singleOption: false, - dataMap: water_sources, + dataMap: widget.modelData!.sourceOfDrinkingWater ?? water_sources, onSaved: (val) { print("Value recorded: $val"); - //widget.modelData!.sourceOfDrinkingWater = val; + widget.modelData!.sourceOfDrinkingWater = val; }, hint: "Select source", title: "Source of Water", diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 241a83f..89eab8b 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -28,7 +28,6 @@ class _FamilyHomeScreenState extends State { setState(() { if (modelData == null) modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); - modelData!.individualDataListTransient.clear(); for (var i in modelData!.individualDataList) { print(i); @@ -99,6 +98,9 @@ class _FamilyHomeScreenState extends State { isValid &= i.dataValid!; print("Indv ${i.dataValid}"); } + if(isValid){ + print("MODEL JSON: ${widget.modelData.toJson()}"); + } print("Is Valid: $isValid"); }), diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 30ac7af..28e5403 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -223,7 +223,7 @@ }, { "id": "3:4555229639046191310", - "lastPropertyId": "31:257396080593114234", + "lastPropertyId": "32:2980984211940443041", "name": "FamilyMembersCommonDataModel", "properties": [ { @@ -237,11 +237,6 @@ "name": "drinkingWater", "type": 9 }, - { - "id": "3:961043903550204529", - "name": "sourceOfDrinkingWater", - "type": 9 - }, { "id": "4:2341047533460923742", "name": "toiletFacility", @@ -381,6 +376,11 @@ "id": "31:257396080593114234", "name": "dbKitchenGardenPlants", "type": 9 + }, + { + "id": "32:2980984211940443041", + "name": "dbSourceOfDrinkingWater", + "type": 9 } ], "relations": [ @@ -400,7 +400,9 @@ "modelVersionParserMinimum": 5, "retiredEntityUids": [], "retiredIndexUids": [], - "retiredPropertyUids": [], + "retiredPropertyUids": [ + 961043903550204529 + ], "retiredRelationUids": [], "version": 1 } \ No newline at end of file diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index cd793a0..8183c0f 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -236,7 +236,7 @@ final _entities = [ ModelEntity( id: const IdUid(3, 4555229639046191310), name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(31, 257396080593114234), + lastPropertyId: const IdUid(32, 2980984211940443041), flags: 0, properties: [ ModelProperty( @@ -249,11 +249,6 @@ final _entities = [ name: 'drinkingWater', type: 9, flags: 0), - ModelProperty( - id: const IdUid(3, 961043903550204529), - name: 'sourceOfDrinkingWater', - type: 9, - flags: 0), ModelProperty( id: const IdUid(4, 2341047533460923742), name: 'toiletFacility', @@ -393,6 +388,11 @@ final _entities = [ id: const IdUid(31, 257396080593114234), name: 'dbKitchenGardenPlants', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(32, 2980984211940443041), + name: 'dbSourceOfDrinkingWater', + type: 9, flags: 0) ], relations: [ @@ -430,7 +430,7 @@ ModelDefinition getObjectBoxModel() { lastSequenceId: const IdUid(0, 0), retiredEntityUids: const [], retiredIndexUids: const [], - retiredPropertyUids: const [], + retiredPropertyUids: const [961043903550204529], retiredRelationUids: const [], modelVersion: 5, modelVersionParserMinimum: 5, @@ -749,10 +749,6 @@ ModelDefinition getObjectBoxModel() { final drinkingWaterOffset = object.drinkingWater == null ? null : fbb.writeString(object.drinkingWater!); - final sourceOfDrinkingWaterOffset = - object.sourceOfDrinkingWater == null - ? null - : fbb.writeString(object.sourceOfDrinkingWater!); final toiletFacilityOffset = object.toiletFacility == null ? null : fbb.writeString(object.toiletFacility!); @@ -836,10 +832,13 @@ ModelDefinition getObjectBoxModel() { object.dbKitchenGardenPlants == null ? null : fbb.writeString(object.dbKitchenGardenPlants!); - fbb.startTable(32); + final dbSourceOfDrinkingWaterOffset = + object.dbSourceOfDrinkingWater == null + ? null + : fbb.writeString(object.dbSourceOfDrinkingWater!); + fbb.startTable(33); fbb.addInt64(0, object.id); fbb.addOffset(1, drinkingWaterOffset); - fbb.addOffset(2, sourceOfDrinkingWaterOffset); fbb.addOffset(3, toiletFacilityOffset); fbb.addOffset(4, communityToiletOffset); fbb.addOffset(5, environmentSanitationLevelOffset); @@ -868,6 +867,7 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(28, dbPreservedSeedsMapOffset); fbb.addOffset(29, dbTreesOwnedMapOffset); fbb.addOffset(30, dbKitchenGardenPlantsOffset); + fbb.addOffset(31, dbSourceOfDrinkingWaterOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -879,8 +879,6 @@ ModelDefinition getObjectBoxModel() { ..id = const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0) ..drinkingWater = const fb.StringReader().vTableGetNullable(buffer, rootOffset, 6) - ..sourceOfDrinkingWater = - const fb.StringReader().vTableGetNullable(buffer, rootOffset, 8) ..toiletFacility = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 10) ..communityToilet = const fb.StringReader() @@ -936,7 +934,9 @@ ModelDefinition getObjectBoxModel() { ..dbTreesOwnedMap = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 62) ..dbKitchenGardenPlants = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 64); + .vTableGetNullable(buffer, rootOffset, 64) + ..dbSourceOfDrinkingWater = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 66); InternalToManyAccess.setRelInfo( object.individualDataList, store, @@ -1152,144 +1152,144 @@ class FamilyMembersCommonDataModel_ { QueryStringProperty( _entities[2].properties[1]); - /// see [FamilyMembersCommonDataModel.sourceOfDrinkingWater] - static final sourceOfDrinkingWater = - QueryStringProperty( - _entities[2].properties[2]); - /// see [FamilyMembersCommonDataModel.toiletFacility] static final toiletFacility = QueryStringProperty( - _entities[2].properties[3]); + _entities[2].properties[2]); /// see [FamilyMembersCommonDataModel.communityToilet] static final communityToilet = QueryStringProperty( - _entities[2].properties[4]); + _entities[2].properties[3]); /// see [FamilyMembersCommonDataModel.environmentSanitationLevel] static final environmentSanitationLevel = QueryStringProperty( - _entities[2].properties[5]); + _entities[2].properties[4]); /// see [FamilyMembersCommonDataModel.runningWaterAvailable] static final runningWaterAvailable = QueryStringProperty( - _entities[2].properties[6]); + _entities[2].properties[5]); /// see [FamilyMembersCommonDataModel.noOfTwoWheelers] static final noOfTwoWheelers = QueryStringProperty( - _entities[2].properties[7]); + _entities[2].properties[6]); /// see [FamilyMembersCommonDataModel.noOfThreeWheelers] static final noOfThreeWheelers = QueryStringProperty( - _entities[2].properties[8]); + _entities[2].properties[7]); /// see [FamilyMembersCommonDataModel.noOfFourWheelers] static final noOfFourWheelers = QueryStringProperty( - _entities[2].properties[9]); + _entities[2].properties[8]); /// see [FamilyMembersCommonDataModel.isCattleOwned] static final isCattleOwned = QueryStringProperty( - _entities[2].properties[10]); + _entities[2].properties[9]); /// see [FamilyMembersCommonDataModel.incomeFromCattle] static final incomeFromCattle = QueryStringProperty( - _entities[2].properties[11]); + _entities[2].properties[10]); /// see [FamilyMembersCommonDataModel.isFarmLandOwned] static final isFarmLandOwned = QueryStringProperty( - _entities[2].properties[12]); + _entities[2].properties[11]); /// see [FamilyMembersCommonDataModel.isSeedsPreserved] static final isSeedsPreserved = QueryStringProperty( - _entities[2].properties[13]); + _entities[2].properties[12]); /// see [FamilyMembersCommonDataModel.isKitchenGardenOwned] static final isKitchenGardenOwned = QueryStringProperty( - _entities[2].properties[14]); + _entities[2].properties[13]); /// see [FamilyMembersCommonDataModel.addressOne] static final addressOne = QueryStringProperty( - _entities[2].properties[15]); + _entities[2].properties[14]); /// see [FamilyMembersCommonDataModel.addressTwo] static final addressTwo = QueryStringProperty( - _entities[2].properties[16]); + _entities[2].properties[15]); /// see [FamilyMembersCommonDataModel.city] static final city = QueryStringProperty( - _entities[2].properties[17]); + _entities[2].properties[16]); /// see [FamilyMembersCommonDataModel.locationPageValid] static final locationPageValid = QueryBooleanProperty( - _entities[2].properties[18]); + _entities[2].properties[17]); /// see [FamilyMembersCommonDataModel.commonDetailsValid] static final commonDetailsValid = QueryBooleanProperty( - _entities[2].properties[19]); + _entities[2].properties[18]); /// see [FamilyMembersCommonDataModel.savedTime] static final savedTime = QueryStringProperty( - _entities[2].properties[20]); + _entities[2].properties[19]); /// see [FamilyMembersCommonDataModel.dbLocationTopLeft] static final dbLocationTopLeft = QueryStringProperty( - _entities[2].properties[21]); + _entities[2].properties[20]); /// see [FamilyMembersCommonDataModel.dbLocationTopRight] static final dbLocationTopRight = QueryStringProperty( - _entities[2].properties[22]); + _entities[2].properties[21]); /// see [FamilyMembersCommonDataModel.dbLocationBottomLeft] static final dbLocationBottomLeft = QueryStringProperty( - _entities[2].properties[23]); + _entities[2].properties[22]); /// see [FamilyMembersCommonDataModel.dbLocationBottomRight] static final dbLocationBottomRight = QueryStringProperty( - _entities[2].properties[24]); + _entities[2].properties[23]); /// see [FamilyMembersCommonDataModel.dbTwoThreeWheelManufacturer] static final dbTwoThreeWheelManufacturer = QueryStringProperty( - _entities[2].properties[25]); + _entities[2].properties[24]); /// see [FamilyMembersCommonDataModel.dbTwoFourManufacturer] static final dbTwoFourManufacturer = QueryStringProperty( - _entities[2].properties[26]); + _entities[2].properties[25]); /// see [FamilyMembersCommonDataModel.dbLocalFoodMap] static final dbLocalFoodMap = QueryStringProperty( - _entities[2].properties[27]); + _entities[2].properties[26]); /// see [FamilyMembersCommonDataModel.dbPreservedSeedsMap] static final dbPreservedSeedsMap = QueryStringProperty( - _entities[2].properties[28]); + _entities[2].properties[27]); /// see [FamilyMembersCommonDataModel.dbTreesOwnedMap] static final dbTreesOwnedMap = QueryStringProperty( - _entities[2].properties[29]); + _entities[2].properties[28]); /// see [FamilyMembersCommonDataModel.dbKitchenGardenPlants] static final dbKitchenGardenPlants = + QueryStringProperty( + _entities[2].properties[29]); + + /// see [FamilyMembersCommonDataModel.dbSourceOfDrinkingWater] + static final dbSourceOfDrinkingWater = QueryStringProperty( _entities[2].properties[30]); From 065a97c9eeefe2d4c00b86562c7fdf8842b355fc Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 12:29:08 +0530 Subject: [PATCH 146/264] Center aligned gender wrap widget --- lib/Widgets/GenderWidget.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/Widgets/GenderWidget.dart b/lib/Widgets/GenderWidget.dart index d3993d5..dcae8b4 100644 --- a/lib/Widgets/GenderWidget.dart +++ b/lib/Widgets/GenderWidget.dart @@ -22,6 +22,10 @@ class GenderPickerWidget extends FormField { builder: (FormFieldState state) { onChanged!(state.value ?? MALE); return Wrap( + + crossAxisAlignment: WrapCrossAlignment.center, + alignment: WrapAlignment.center, + runSpacing: 4.0, children: [ GenderWidget( gender: MALE, From 904919b863313425f083e8080688b32930f9e9f2 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 13:06:37 +0530 Subject: [PATCH 147/264] Configured app to support iOS - 11 and above --- ios/Podfile | 2 +- ios/Runner.xcodeproj/project.pbxproj | 83 ++++++++++++++++++- .../contents.xcworkspacedata | 3 + 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 1e8c3c9..313ea4a 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, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2a2ed1b..f5b0ec6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4C9879DB498106CD77BAE52B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EF6C7081ECB6B5BB4E44D4A /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -32,9 +33,12 @@ 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 = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 5EF6C7081ECB6B5BB4E44D4A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 72598152D802005263DC75BC /* 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 = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 90682DB92518F3BC8CA0280D /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -42,6 +46,7 @@ 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 = ""; }; + FAD90254FE911E159AC2C5E3 /* 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 */ @@ -49,12 +54,24 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4C9879DB498106CD77BAE52B /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 343EDA05513D996852D25A5C /* Pods */ = { + isa = PBXGroup; + children = ( + 72598152D802005263DC75BC /* Pods-Runner.debug.xcconfig */, + 90682DB92518F3BC8CA0280D /* Pods-Runner.release.xcconfig */, + FAD90254FE911E159AC2C5E3 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -72,6 +89,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 343EDA05513D996852D25A5C /* Pods */, + D6A2D8873CBDEFEE806EF21B /* Frameworks */, ); sourceTree = ""; }; @@ -98,6 +117,14 @@ path = Runner; sourceTree = ""; }; + D6A2D8873CBDEFEE806EF21B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5EF6C7081ECB6B5BB4E44D4A /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,12 +132,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 55E1C451B26B8833402FF022 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + EF1296F45A0EDDE3599E6609 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -183,6 +212,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 55E1C451B26B8833402FF022 /* [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; @@ -197,6 +248,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + EF1296F45A0EDDE3599E6609 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + 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 */ @@ -290,7 +358,10 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.example.geoSpatial; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -414,7 +485,10 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.example.geoSpatial; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -433,7 +507,10 @@ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.example.geoSpatial; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 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 @@ + + From 37a766245935c381bfbe76189e945c354d2a9d7f Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 17:01:10 +0530 Subject: [PATCH 148/264] Port for iOS --- ios/Podfile.lock | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 ios/Podfile.lock diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..c99856b --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,59 @@ +PODS: + - Flutter (1.0.0) + - flutter_keyboard_visibility (0.0.1): + - Flutter + - flutter_secure_storage (3.3.1): + - Flutter + - geolocator_apple (1.2.0): + - Flutter + - local_auth (0.0.1): + - Flutter + - ObjectBox (1.6.0) + - objectbox_flutter_libs (0.0.1): + - Flutter + - ObjectBox (= 1.6.0) + - path_provider_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - Flutter (from `Flutter`) + - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`) + - local_auth (from `.symlinks/plugins/local_auth/ios`) + - objectbox_flutter_libs (from `.symlinks/plugins/objectbox_flutter_libs/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) + +SPEC REPOS: + trunk: + - ObjectBox + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + flutter_keyboard_visibility: + :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + geolocator_apple: + :path: ".symlinks/plugins/geolocator_apple/ios" + local_auth: + :path: ".symlinks/plugins/local_auth/ios" + objectbox_flutter_libs: + :path: ".symlinks/plugins/objectbox_flutter_libs/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" + +SPEC CHECKSUMS: + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 + flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec + geolocator_apple: b741765c55dc21950e3e106e8b3584e55cf81ce5 + local_auth: ef62030a2731330b95df7ef1331bd15f6a64b8a6 + ObjectBox: a181cc5fb47e0a6ec60754d34dc49f40dc17829e + objectbox_flutter_libs: 511c59b863bc45abc7f6f338499e4a50e9aa5f1d + path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 + +PODFILE CHECKSUM: 7368163408c647b7eb699d0d788ba6718e18fb8d + +COCOAPODS: 1.11.2 From c7f9224e9e9a6eb470ace91afe109ca4d6786290 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 19:42:49 +0530 Subject: [PATCH 149/264] Worked on models, added JSON parsers --- lib/Model/FamilyMembersCommonDataModel.dart | 217 +++++++++++++------- lib/Screens/FamilyDetails.dart | 14 ++ lib/Screens/FamilyMemberAdd.dart | 4 +- lib/Widgets/OptionsFormWidget.dart | 7 + lib/objectbox-model.json | 20 +- lib/objectbox.g.dart | 75 ++++--- 6 files changed, 221 insertions(+), 116 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 6a7c6ad..1c66e5e 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -3,6 +3,17 @@ import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:objectbox/objectbox.dart'; +List buildListForOptionWidget(Map mapData) { + var listData = []; + + mapData.forEach((key, value) { + if (value) { + listData.add(key); + } + }); + return listData; +} + @Entity() class FamilyMemberIndividualDataModel { int id = 0; @@ -38,40 +49,51 @@ class FamilyMemberIndividualDataModel { String? vizhithiruInstalled; bool? dataValid = false; - String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); - - Map toJson() => { - 'userName': userName, - 'dateOfBirth': - "${dateOfBirth!.day}/${dateOfBirth!.month}/${dateOfBirth!.year}", - 'gender': gender, - 'phoneNumber': phoneNumber, - 'educationQualification': educationQualification, - 'aadhaarNumber': aadhaarNumber, - 'vulnerabilities': vulnerabilities, - 'occupation': occupation, - 'dailyWageWorker': dailyWageWorker, - 'incomePerDay': incomePerDay, - 'incomePerMonth': incomePerMonth, - 'pension': pension, - 'businessStatus': businessStatus, - 'maritalStatus': maritalStatus, - 'specialSkills': specialSkills, - 'frequentAilments': frequentAilments, - 'commutableDisease': commutableDisease, - 'nonCommutableDisease': nonCommutableDisease, - 'surgeries': surgeries, - 'anganwadiServicesAware': anganwadiServicesAware, - 'anganwadiServicesUsing': anganwadiServicesUsing, - 'anganwadiServicesUsedList': anganwadiServicesUsedList, - 'PHCServicesUsedList': PHCServicesUsedList, - 'privateClinicServicesUsedList': privateClinicServicesUsedList, - 'privateServiceReason': privateServiceReason, - 'useOfTobacco': useOfTobacco, - 'useOfAlcohol': useOfAlcohol, - 'aarogyaSetuInstalled': aarogyaSetuInstalled, - 'vizhithiruInstalled': vizhithiruInstalled - }; + String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); + + Map toJson() { + return { + "UIN": "", + "username": "", + "timeStamp": savedTime, + "name": userName, + "date": "${dateOfBirth!.day}-${dateOfBirth!.month}-${dateOfBirth!.year}", + "gender": gender, + "educationalQualification": educationQualification, + "phoneNumber": phoneNumber, + "aadharNumber": aadhaarNumber, + "Vulnerabilities": vulnerabilities != null + ? buildListForOptionWidget(vulnerabilities!) + : [], + "oldAgePension": pension, + "occupation": + occupation != null ? buildListForOptionWidget(occupation!) : [], + "isADailyWageWorker": dailyWageWorker, + "incomePerDay": incomePerDay, + "incomePerMonth": incomePerMonth, + "workTimings": "", + //TODO:Add work timings + "maritalStatus": maritalStatus, + "specialSkills": specialSkills, + "frequentHealthAilments": frequentAilments, + "communicableDiseases": commutableDisease, + "nonCommunicableDiseases": nonCommutableDisease, + "surgeriesUndergone": surgeries, + "anganwadiServicesAware": anganwadiServicesAware, + //TODO:Remind shridhar to change name + "anganwadiServicesUsed": anganwadiServicesUsing, + //TODO:Remind shridhar to add + "anganwadiServicesUtilised": anganwadiServicesUsedList, + "phcServicesUtilised": PHCServicesUsedList, + "privateHealthClinicFacilitiesUsed": privateClinicServicesUsedList, + "reasonsForVisitingPrivateHealthClinic": privateServiceReason, + "tobaccoBasedProductsUsage": useOfTobacco, + "alcoholConsumption": useOfAlcohol, + "businessStatus": businessStatus, + "arogyaSethuAppInstallationStatus": aarogyaSetuInstalled, + "vizhithiruAppInstallationStatus": vizhithiruInstalled + }; + } FamilyMemberIndividualDataModel({this.userName}); @@ -124,6 +146,7 @@ class FamilyMembersCommonDataModel { String? incomeFromCattle; String? isFarmLandOwned; String? isSeedsPreserved; + Map? cropsCultivated; Map? preservedSeedsMap; Map? treesOwnedMap; String? isKitchenGardenOwned; @@ -131,6 +154,7 @@ class FamilyMembersCommonDataModel { String? addressOne; String? addressTwo; String? city; + String? villageCode; bool? locationPageValid = false; bool? commonDetailsValid = false; @@ -138,49 +162,88 @@ class FamilyMembersCommonDataModel { final individualDataListTransient = []; final individualDataList = ToMany(); - Map toJson() => { - 'drinkingWater': drinkingWater, - 'sourceOfDrinkingWater': sourceOfDrinkingWater, - 'toiletFacility': toiletFacility, - 'communityToilet': communityToilet, - 'environmentSanitationLevel': environmentSanitationLevel, - 'runningWaterAvailable': runningWaterAvailable, - 'noOfTwoWheelers': noOfTwoWheelers, - 'noOfThreeWheelers': noOfThreeWheelers, - 'noOfFourWheelers': noOfFourWheelers, - 'twoThreeWheelManufacturer': twoThreeWheelManufacturer, - 'twoFourManufacturer': twoFourManufacturer, - 'localFoodMap': localFoodMap, - 'isCattleOwned': isCattleOwned, - 'incomeFromCattle': incomeFromCattle, - 'isFarmLandOwned': isFarmLandOwned, - 'isSeedsPreserved': isSeedsPreserved, - 'preservedSeedsMap': preservedSeedsMap, - 'treesOwnedMap': treesOwnedMap, - 'isKitchenGardenOwned': isKitchenGardenOwned, - 'kitchenGardenPlants': kitchenGardenPlants, - 'addressOne': addressOne, - 'addressTwo': addressTwo, - 'city': city, - 'familyMemberData': - individualDataListTransient.map((item) => item.toJson()).toList(), - 'locationTopLeft': [ - locationTopLeft!.latitude, - locationTopLeft!.longitude - ], - 'locationTopRight': [ - locationTopRight!.latitude, - locationTopRight!.longitude - ], - 'locationBottomLeft': [ - locationBottomLeft!.latitude, - locationBottomLeft!.longitude - ], - 'locationBottomRight': [ - locationBottomRight!.latitude, - locationBottomRight!.longitude - ], - }; + //TODO: Add condition to set empty value to dependent fields + Map toJson() { + return { + 'familyMemberData': + individualDataListTransient.map((item) => item.toJson()).toList(), + 'locationTopLeft': [ + locationTopLeft!.latitude, + locationTopLeft!.longitude + ], + 'locationTopRight': [ + locationTopRight!.latitude, + locationTopRight!.longitude + ], + 'locationBottomLeft': [ + locationBottomLeft!.latitude, + locationBottomLeft!.longitude + ], + 'locationBottomRight': [ + locationBottomRight!.latitude, + locationBottomRight!.longitude + ], + "availabilityOfDrinkingWater": runningWaterAvailable, + + "drinkingWaterSource": sourceOfDrinkingWater != null + ? buildListForOptionWidget(sourceOfDrinkingWater!) + : [], + + "areToiletsAvailableInHouse": toiletFacility, + + "availabilityOfWaterInToilets": String, + + "alternativeForHouseholdToilet": String, + + "statusOfEnvironmentalSanitation": environmentSanitationLevel, + + "numberOfTwoWheelers": noOfTwoWheelers, + + "brandsOfTwoThreeWheelers": twoThreeWheelManufacturer != null + ? buildListForOptionWidget(twoThreeWheelManufacturer!) + : [], //TODO: Change field name in backend model + + "numberOfThreeWheelers": noOfThreeWheelers, + + //"brandsOfThreeWheelers": String, //TODO: Remove field + + "numberOfFourWheelers": noOfFourWheelers, + + "brandsOfFourWheelers": twoFourManufacturer != null + ? buildListForOptionWidget(twoFourManufacturer!) + : [], + + "doYouOwnCattle": isCattleOwned, + + "incomeFromCattle": isCattleOwned == 'yes' ? incomeFromCattle : '', + + "doYouOwnFarmLand": isFarmLandOwned, + + "cropsCultivated": cropsCultivated != null ? buildListForOptionWidget(cropsCultivated!) : [], + + "doYouPreserveSeeds": isSeedsPreserved, + + "typesOfSeedsPreserved": preservedSeedsMap != null + ? buildListForOptionWidget(preservedSeedsMap!) + : [], + + "locallyAvailableFoodsConsumed": + localFoodMap != null ? buildListForOptionWidget(localFoodMap!) : [], + + "treesOwnedIfAny": + treesOwnedMap != null ? buildListForOptionWidget(treesOwnedMap!) : [], + + "isKitchenGardenAvailable": isKitchenGardenOwned, + + "cropsInKitchenGarden": kitchenGardenPlants != null + ? buildListForOptionWidget(kitchenGardenPlants!) + : [], + + "address": "$addressOne\n$addressTwo\n$city", + + "villageCode": villageCode ?? "" + }; + } String? savedTime = DateFormat('kk:mm:ss, EEE d MMM').format(DateTime.now()); diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 88c4294..2ca9b6e 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -104,6 +104,8 @@ class _FamilyDetailsState extends State { 'Lorry/Van':false }; + var incomeFromCattleEnabled = false; + @override Widget build(BuildContext context) { return WillPopScope( @@ -351,6 +353,18 @@ class _FamilyDetailsState extends State { }, title: "Do you own farmland?", ), + CheckBoxAddExtraAlertDialog( + title: 'Crops Cultivated', + hint: 'Choose cultivated crops', + singleOption: false, + context: context, + dataMap: widget.modelData!.cropsCultivated ?? + seeds_preserved, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.cropsCultivated = val; + }, + ), OptionsWidget( options: [ ['Yes', 'yes'], diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 80871c3..a606734 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -341,8 +341,8 @@ class _FamilyMemberAddState extends State { .familyMemberIndividualDataModel!.dailyWageWorker, autoValidateMode: AutovalidateMode.onUserInteraction, options: [ - ["Yes", "true"], - ["No", "false"] + ["Yes", "yes"], + ["No", "no"] ], title: "Daily wage worker?", onSaved: (val) { diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index e4ebc70..ca43e58 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -13,6 +13,7 @@ class OptionsWidget extends FormField { OptionsWidget( {FormFieldSetter? onSaved, FormFieldValidator? validator, + Function(dynamic)? onChanged, required List options, required String title, String? defaultValue, @@ -42,6 +43,7 @@ class OptionsWidget extends FormField { alignment: WrapAlignment.center, children: options .map((e) => new OptionButton( + onChanged: onChanged, text: e[0], optionKey: e[1], state: state, @@ -71,6 +73,7 @@ class OptionButton extends StatelessWidget { required this.optionKey, required this.state, required this.isSelected, + this.onChanged, this.isError = false}) : super(key: key); @@ -79,6 +82,7 @@ class OptionButton extends StatelessWidget { final state; final isSelected; final isError; + final onChanged; @override Widget build(BuildContext context) { @@ -99,6 +103,9 @@ class OptionButton extends StatelessWidget { : BorderSide.none))), onPressed: () { state.didChange(optionKey); + if (onChanged != null) { + onChanged!(optionKey); + } }, child: Text( text, diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 28e5403..8639595 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -223,7 +223,7 @@ }, { "id": "3:4555229639046191310", - "lastPropertyId": "32:2980984211940443041", + "lastPropertyId": "34:938904163813263655", "name": "FamilyMembersCommonDataModel", "properties": [ { @@ -322,11 +322,6 @@ "name": "commonDetailsValid", "type": 1 }, - { - "id": "21:6821885131227205219", - "name": "savedTime", - "type": 9 - }, { "id": "22:5541702793145940965", "name": "dbLocationTopLeft", @@ -381,6 +376,16 @@ "id": "32:2980984211940443041", "name": "dbSourceOfDrinkingWater", "type": 9 + }, + { + "id": "33:2417488989427376885", + "name": "villageCode", + "type": 9 + }, + { + "id": "34:938904163813263655", + "name": "savedTime", + "type": 9 } ], "relations": [ @@ -401,7 +406,8 @@ "retiredEntityUids": [], "retiredIndexUids": [], "retiredPropertyUids": [ - 961043903550204529 + 961043903550204529, + 6821885131227205219 ], "retiredRelationUids": [], "version": 1 diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 8183c0f..b9038f6 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -236,7 +236,7 @@ final _entities = [ ModelEntity( id: const IdUid(3, 4555229639046191310), name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(32, 2980984211940443041), + lastPropertyId: const IdUid(34, 938904163813263655), flags: 0, properties: [ ModelProperty( @@ -334,11 +334,6 @@ final _entities = [ name: 'commonDetailsValid', type: 1, flags: 0), - ModelProperty( - id: const IdUid(21, 6821885131227205219), - name: 'savedTime', - type: 9, - flags: 0), ModelProperty( id: const IdUid(22, 5541702793145940965), name: 'dbLocationTopLeft', @@ -393,6 +388,16 @@ final _entities = [ id: const IdUid(32, 2980984211940443041), name: 'dbSourceOfDrinkingWater', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(33, 2417488989427376885), + name: 'villageCode', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(34, 938904163813263655), + name: 'savedTime', + type: 9, flags: 0) ], relations: [ @@ -430,7 +435,7 @@ ModelDefinition getObjectBoxModel() { lastSequenceId: const IdUid(0, 0), retiredEntityUids: const [], retiredIndexUids: const [], - retiredPropertyUids: const [961043903550204529], + retiredPropertyUids: const [961043903550204529, 6821885131227205219], retiredRelationUids: const [], modelVersion: 5, modelVersionParserMinimum: 5, @@ -795,9 +800,6 @@ ModelDefinition getObjectBoxModel() { : fbb.writeString(object.addressTwo!); final cityOffset = object.city == null ? null : fbb.writeString(object.city!); - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); final dbLocationTopLeftOffset = object.dbLocationTopLeft == null ? null : fbb.writeString(object.dbLocationTopLeft!); @@ -836,7 +838,13 @@ ModelDefinition getObjectBoxModel() { object.dbSourceOfDrinkingWater == null ? null : fbb.writeString(object.dbSourceOfDrinkingWater!); - fbb.startTable(33); + final villageCodeOffset = object.villageCode == null + ? null + : fbb.writeString(object.villageCode!); + final savedTimeOffset = object.savedTime == null + ? null + : fbb.writeString(object.savedTime!); + fbb.startTable(35); fbb.addInt64(0, object.id); fbb.addOffset(1, drinkingWaterOffset); fbb.addOffset(3, toiletFacilityOffset); @@ -856,7 +864,6 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(17, cityOffset); fbb.addBool(18, object.locationPageValid); fbb.addBool(19, object.commonDetailsValid); - fbb.addOffset(20, savedTimeOffset); fbb.addOffset(21, dbLocationTopLeftOffset); fbb.addOffset(22, dbLocationTopRightOffset); fbb.addOffset(23, dbLocationBottomLeftOffset); @@ -868,6 +875,8 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(29, dbTreesOwnedMapOffset); fbb.addOffset(30, dbKitchenGardenPlantsOffset); fbb.addOffset(31, dbSourceOfDrinkingWaterOffset); + fbb.addOffset(32, villageCodeOffset); + fbb.addOffset(33, savedTimeOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -913,8 +922,6 @@ ModelDefinition getObjectBoxModel() { const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 40) ..commonDetailsValid = const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 42) - ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 44) ..dbLocationTopLeft = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 46) ..dbLocationTopRight = const fb.StringReader() @@ -936,7 +943,11 @@ ModelDefinition getObjectBoxModel() { ..dbKitchenGardenPlants = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 64) ..dbSourceOfDrinkingWater = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 66); + .vTableGetNullable(buffer, rootOffset, 66) + ..villageCode = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 68) + ..savedTime = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 70); InternalToManyAccess.setRelInfo( object.individualDataList, store, @@ -1234,64 +1245,68 @@ class FamilyMembersCommonDataModel_ { QueryBooleanProperty( _entities[2].properties[18]); - /// see [FamilyMembersCommonDataModel.savedTime] - static final savedTime = QueryStringProperty( - _entities[2].properties[19]); - /// see [FamilyMembersCommonDataModel.dbLocationTopLeft] static final dbLocationTopLeft = QueryStringProperty( - _entities[2].properties[20]); + _entities[2].properties[19]); /// see [FamilyMembersCommonDataModel.dbLocationTopRight] static final dbLocationTopRight = QueryStringProperty( - _entities[2].properties[21]); + _entities[2].properties[20]); /// see [FamilyMembersCommonDataModel.dbLocationBottomLeft] static final dbLocationBottomLeft = QueryStringProperty( - _entities[2].properties[22]); + _entities[2].properties[21]); /// see [FamilyMembersCommonDataModel.dbLocationBottomRight] static final dbLocationBottomRight = QueryStringProperty( - _entities[2].properties[23]); + _entities[2].properties[22]); /// see [FamilyMembersCommonDataModel.dbTwoThreeWheelManufacturer] static final dbTwoThreeWheelManufacturer = QueryStringProperty( - _entities[2].properties[24]); + _entities[2].properties[23]); /// see [FamilyMembersCommonDataModel.dbTwoFourManufacturer] static final dbTwoFourManufacturer = QueryStringProperty( - _entities[2].properties[25]); + _entities[2].properties[24]); /// see [FamilyMembersCommonDataModel.dbLocalFoodMap] static final dbLocalFoodMap = QueryStringProperty( - _entities[2].properties[26]); + _entities[2].properties[25]); /// see [FamilyMembersCommonDataModel.dbPreservedSeedsMap] static final dbPreservedSeedsMap = QueryStringProperty( - _entities[2].properties[27]); + _entities[2].properties[26]); /// see [FamilyMembersCommonDataModel.dbTreesOwnedMap] static final dbTreesOwnedMap = QueryStringProperty( - _entities[2].properties[28]); + _entities[2].properties[27]); /// see [FamilyMembersCommonDataModel.dbKitchenGardenPlants] static final dbKitchenGardenPlants = QueryStringProperty( - _entities[2].properties[29]); + _entities[2].properties[28]); /// see [FamilyMembersCommonDataModel.dbSourceOfDrinkingWater] static final dbSourceOfDrinkingWater = QueryStringProperty( - _entities[2].properties[30]); + _entities[2].properties[29]); + + /// see [FamilyMembersCommonDataModel.villageCode] + static final villageCode = QueryStringProperty( + _entities[2].properties[30]); + + /// see [FamilyMembersCommonDataModel.savedTime] + static final savedTime = QueryStringProperty( + _entities[2].properties[31]); /// see [FamilyMembersCommonDataModel.individualDataList] static final individualDataList = QueryRelationToMany< From c8b3b6ea818f46e2d74634e6042f907c9b368c27 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 23:17:28 +0530 Subject: [PATCH 150/264] Added widget to pick starting and ending time --- lib/Screens/FamilyMemberAdd.dart | 1033 +++++++++++---------- lib/Widgets/StartingEndingTimeWidget.dart | 102 ++ lib/Widgets/TagTextWidget.dart | 1 - 3 files changed, 619 insertions(+), 517 deletions(-) create mode 100644 lib/Widgets/StartingEndingTimeWidget.dart diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index a606734..3f2b459 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -9,6 +9,7 @@ import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/GenderWidget.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; +import 'package:geo_spatial/Widgets/StartingEndingTimeWidget.dart'; import 'package:geo_spatial/Widgets/TagTextWidget.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -128,523 +129,394 @@ class _FamilyMemberAddState extends State { backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Add Family Member'), body: SingleChildScrollView( - child: FormPageView( - [ - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.userName, - onSaved: (String? data) async { - widget.familyMemberIndividualDataModel!.userName = - data; - }, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - //isDense: true, - label: Text( - "Name", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter name", - hintStyle: GoogleFonts.poppins( + child: FormPageView( + [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + StartingEndingTimeWidget( + onSaved: (List? timeList) {}, + ), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.userName, + onSaved: (String? data) async { + widget.familyMemberIndividualDataModel!.userName = data; + }, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + //isDense: true, + label: Text( + "Name", + style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), - validator: (value) { - if (value == "") { - return "Please enter a name"; - } else - return null; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, + hintText: "Please enter name", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - ), - DatePickerWidget( - defaultDate: - widget.familyMemberIndividualDataModel?.dateOfBirth, - context: context, - title: "Date of Birth", - hint: "Choose a date", - autoValidateMode: AutovalidateMode.onUserInteraction, - onSaved: (data) { - widget.familyMemberIndividualDataModel!.dateOfBirth = - data; - print(data); + validator: (value) { + if (value == "") { + return "Please enter a name"; + } else + return null; }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - // GenderPickerWithImage( - // verticalAlignedText: false, - // selectedGender: Gender.Male, - // maleImage: AssetImage("assets/avatar_man.png"), - // linearGradient: LinearGradient( - // colors: [Color(0xfff54b64), Color(0xfff78361)]), - // femaleImage: AssetImage("assets/avatar_woman.png"), - // selectedGenderTextStyle: TextStyle( - // color: Colors.greenAccent, - // fontWeight: FontWeight.bold), - // unSelectedGenderTextStyle: TextStyle( - // color: colors.darkPrimaryTextColor, - // fontWeight: FontWeight.normal), - // onChanged: (Gender? gender) { - // print(gender); - // widget.familyMemberIndividualDataModel!.gender = - // gender.toString(); - // }, - // equallyAligned: true, - // animationDuration: Duration(milliseconds: 300), - // isCircular: true, - // opacityOfGradient: 0.2, - // padding: const EdgeInsets.all(3), - // size: 70, //default : 40 - // ), - GenderPickerWidget( - initialGender: - widget.familyMemberIndividualDataModel?.gender, - onChanged: (val) { - widget.familyMemberIndividualDataModel?.gender = val; - print("GENDER: $val"); + ), + DatePickerWidget( + defaultDate: + widget.familyMemberIndividualDataModel?.dateOfBirth, + context: context, + title: "Date of Birth", + hint: "Choose a date", + autoValidateMode: AutovalidateMode.onUserInteraction, + onSaved: (data) { + widget.familyMemberIndividualDataModel!.dateOfBirth = + data; + print(data); + }, + ), + // GenderPickerWithImage( + // verticalAlignedText: false, + // selectedGender: Gender.Male, + // maleImage: AssetImage("assets/avatar_man.png"), + // linearGradient: LinearGradient( + // colors: [Color(0xfff54b64), Color(0xfff78361)]), + // femaleImage: AssetImage("assets/avatar_woman.png"), + // selectedGenderTextStyle: TextStyle( + // color: Colors.greenAccent, + // fontWeight: FontWeight.bold), + // unSelectedGenderTextStyle: TextStyle( + // color: colors.darkPrimaryTextColor, + // fontWeight: FontWeight.normal), + // onChanged: (Gender? gender) { + // print(gender); + // widget.familyMemberIndividualDataModel!.gender = + // gender.toString(); + // }, + // equallyAligned: true, + // animationDuration: Duration(milliseconds: 300), + // isCircular: true, + // opacityOfGradient: 0.2, + // padding: const EdgeInsets.all(3), + // size: 70, //default : 40 + // ), + GenderPickerWidget( + initialGender: + widget.familyMemberIndividualDataModel?.gender, + onChanged: (val) { + widget.familyMemberIndividualDataModel?.gender = val; + print("GENDER: $val"); + }, + onSaved: (val) { + print("GENDER SAVED: $val"); + }, + ), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.phoneNumber, + style: darkTheme.DarkTheme.textTheme.bodyText2, + keyboardType: TextInputType.number, + decoration: InputDecoration( + label: Text( + "Phone Number", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter 10 digit phone", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value == "") { + return "Please enter a value / 0 if no phone"; + } else if (value!.length != 10) { + return "Enter a valid number"; + } else + return null; }, - onSaved: (val) { - print("GENDER SAVED: $val"); + onSaved: (data) { + widget.familyMemberIndividualDataModel!.phoneNumber = + data; }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.phoneNumber, - style: darkTheme.DarkTheme.textTheme.bodyText2, - keyboardType: TextInputType.number, - decoration: InputDecoration( - label: Text( - "Phone Number", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter 10 digit phone", - hintStyle: GoogleFonts.poppins( + ), + DropDownFormField( + defaultValue: widget.familyMemberIndividualDataModel! + .educationQualification, + list: [ + 'None', + 'Elementary', + 'Secondary', + 'Higher Secondary', + 'Bachelor\'s', + 'Master\'s' + ], + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .educationQualification = data; + }, + hint: "Select the highest", + title: "Educational qualification", + errorField: "Please choose a qualification", + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.aadhaarNumber, + keyboardType: TextInputType.number, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Aadhaar Number", + style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), - validator: (value) { - if (value == "") { - return "Please enter a value / 0 if no phone"; - } else if (value!.length != 10) { - return "Enter a valid number"; - } else - return null; - }, - onSaved: (data) { - widget.familyMemberIndividualDataModel!.phoneNumber = - data; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, + hintText: "Please enter 12 digit Aadhaar", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - ), - DropDownFormField( - defaultValue: widget.familyMemberIndividualDataModel! - .educationQualification, - list: [ - 'None', - 'Elementary', - 'Secondary', - 'Higher Secondary', - 'Bachelor\'s', - 'Master\'s' - ], + validator: (value) { + if (value == "") { + return "Enter 12 digit Aadhaar / 0 if absent"; + } else if (value!.length != 12) { + return "Enter a valid Aadhaar"; + } else + return null; + }, onSaved: (data) { - widget.familyMemberIndividualDataModel! - .educationQualification = data; + widget.familyMemberIndividualDataModel!.aadhaarNumber = + data; }, - hint: "Select the highest", - title: "Educational qualification", - errorField: "Please choose a qualification", + autovalidateMode: AutovalidateMode.onUserInteraction, ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: widget - .familyMemberIndividualDataModel?.aadhaarNumber, - keyboardType: TextInputType.number, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Aadhaar Number", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter 12 digit Aadhaar", - hintStyle: GoogleFonts.poppins( + ), + CheckBoxAddExtraAlertDialog( + title: 'Vulnerabilities', + hint: 'Please choose a vulnerability', + dataMap: widget + .familyMemberIndividualDataModel!.vulnerabilities ?? + vulnerabilities, + singleOption: false, + context: context, + onSaved: (map) { + widget.familyMemberIndividualDataModel!.vulnerabilities = + map; + }, + errorField: "Please choose a vulnerability / None", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + CheckBoxAddExtraAlertDialog( + title: 'Occupation', + hint: 'Select applicable', + dataMap: + widget.familyMemberIndividualDataModel!.occupation ?? + occupations, + singleOption: false, + context: context, + onSaved: (map) { + print(map); + widget.familyMemberIndividualDataModel!.occupation = map; + }, + errorField: "Please choose an occupation / None", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + OptionsWidget( + defaultValue: + widget.familyMemberIndividualDataModel!.dailyWageWorker, + autoValidateMode: AutovalidateMode.onUserInteraction, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + title: "Daily wage worker?", + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print("Value recorded: $val"); + widget.familyMemberIndividualDataModel!.dailyWageWorker = + val; + }, + ), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.incomePerDay, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Income/Day", + style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), - validator: (value) { - if (value == "") { - return "Enter 12 digit Aadhaar / 0 if absent"; - } else if (value!.length != 12) { - return "Enter a valid Aadhaar"; - } else - return null; - }, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .aadhaarNumber = data; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, + hintText: "Please enter income per day", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - ), - CheckBoxAddExtraAlertDialog( - title: 'Vulnerabilities', - hint: 'Please choose a vulnerability', - dataMap: widget.familyMemberIndividualDataModel! - .vulnerabilities ?? - vulnerabilities, - singleOption: false, - context: context, - onSaved: (map) { - widget.familyMemberIndividualDataModel! - .vulnerabilities = map; - }, - errorField: "Please choose a vulnerability / None", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - CheckBoxAddExtraAlertDialog( - title: 'Occupation', - hint: 'Select applicable', - dataMap: - widget.familyMemberIndividualDataModel!.occupation ?? - occupations, - singleOption: false, - context: context, - onSaved: (map) { - print(map); - widget.familyMemberIndividualDataModel!.occupation = - map; + validator: (value) { + if (value == "") { + return "Enter Income/Day / 0"; + } }, - errorField: "Please choose an occupation / None", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - OptionsWidget( - defaultValue: widget - .familyMemberIndividualDataModel!.dailyWageWorker, - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Yes", "yes"], - ["No", "no"] - ], - title: "Daily wage worker?", onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; - print("Value recorded: $val"); - widget.familyMemberIndividualDataModel! - .dailyWageWorker = val; + print(val.toString()); + widget.familyMemberIndividualDataModel!.incomePerDay = + val; }, ), + ) + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + //TODO: Add work timings Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 10.0), child: TextFormField( initialValue: widget - .familyMemberIndividualDataModel?.incomePerDay, + .familyMemberIndividualDataModel?.incomePerMonth, keyboardType: TextInputType.number, autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( - "Income/Day", + "Income/Month", style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), ), - hintText: "Please enter income per day", + hintText: "Please enter income per month", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(7.0), ), validator: (value) { if (value == "") { - return "Enter Income/Day / 0"; + return "Enter Income/Month / 0"; } }, - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - widget.familyMemberIndividualDataModel!.incomePerDay = - val; - }, - ), - ) - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - //TODO: Add work timings - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 10.0), - child: TextFormField( - initialValue: widget - .familyMemberIndividualDataModel?.incomePerMonth, - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Month", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter income per month", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter Income/Month / 0"; - } - }, - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - widget.familyMemberIndividualDataModel! - .incomePerMonth = val; - }, - ), - ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( - defaultValue: - widget.familyMemberIndividualDataModel!.pension, - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Eligible", "eligible"], - ["Eligible, receiving", "eligible_receiving"], - ["Not eligible", "not_eligible"] - ], - title: 'Old age pension', - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - widget.familyMemberIndividualDataModel!.pension = - val; - }, - ), - ), - OptionsWidget( - defaultValue: widget - .familyMemberIndividualDataModel!.businessStatus, - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Yes", "yes"], - ["No", "no"], - ], - title: 'Doing/Did business', onSaved: (val) { //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); widget.familyMemberIndividualDataModel! - .businessStatus = val; + .incomePerMonth = val; }, ), - Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( - defaultValue: widget - .familyMemberIndividualDataModel!.maritalStatus, - autoValidateMode: AutovalidateMode.onUserInteraction, - options: [ - ["Married", "married"], - ["Unmarried", "unmarried"], - ], - title: 'Marital Status', - onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; - print(val.toString()); - widget.familyMemberIndividualDataModel! - .maritalStatus = val; - }, - ), - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Special Skills", - hint: "Enter skills here", - initialValue: widget - .familyMemberIndividualDataModel!.specialSkills, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .specialSkills = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }, - ), - ), - ]), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Frequent ailments", - hint: "Enter ailments here", - initialValue: widget.familyMemberIndividualDataModel! - .frequentAilments, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .frequentAilments = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - ), - SizedBox( - height: 20, - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Communicable Diseases", - hint: "Enter diseases here", - initialValue: widget.familyMemberIndividualDataModel! - .commutableDisease, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .commutableDisease = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - ), - SizedBox( - height: 20, - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Non-communicable diseases", - hint: "Enter diseases here", - initialValue: widget.familyMemberIndividualDataModel! - .nonCommutableDisease, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .nonCommutableDisease = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), ), Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( defaultValue: - widget.familyMemberIndividualDataModel!.surgeries, + widget.familyMemberIndividualDataModel!.pension, + autoValidateMode: AutovalidateMode.onUserInteraction, options: [ - ["Yes", "yes"], - ["No", "no"], + ["Eligible", "eligible"], + ["Eligible, receiving", "eligible_receiving"], + ["Not eligible", "not_eligible"] ], - onSaved: (data) { - widget.familyMemberIndividualDataModel!.surgeries = - data; + title: 'Old age pension', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel!.pension = val; }, - title: 'Surgeries', ), ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ OptionsWidget( - defaultValue: widget.familyMemberIndividualDataModel! - .anganwadiServicesAware, + defaultValue: widget + .familyMemberIndividualDataModel!.businessStatus, + autoValidateMode: AutovalidateMode.onUserInteraction, options: [ ["Yes", "yes"], ["No", "no"], ], - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .anganwadiServicesAware = data; + title: 'Doing/Did business', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); + widget.familyMemberIndividualDataModel!.businessStatus = + val; }, - title: 'Aware about Anganwadi services?', ), Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( - defaultValue: widget.familyMemberIndividualDataModel! - .anganwadiServicesUsing, + defaultValue: widget + .familyMemberIndividualDataModel!.maritalStatus, + autoValidateMode: AutovalidateMode.onUserInteraction, options: [ - ["Yes", "yes"], - ["No", "no"], + ["Married", "married"], + ["Unmarried", "unmarried"], ], - onSaved: (data) { + title: 'Marital Status', + onSaved: (val) { + //dailyWageWorker = value.toLowerCase() as bool; + print(val.toString()); widget.familyMemberIndividualDataModel! - .anganwadiServicesUsing = data; + .maritalStatus = val; }, - title: 'Using any Anganwadi services?', ), ), - TagTextWidget( + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20), + child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Anganwadi services utilised", - hint: "Enter services here", - initialValue: widget.familyMemberIndividualDataModel! - .anganwadiServicesUsedList, + label: "Special Skills", + hint: "Enter skills here", + initialValue: widget + .familyMemberIndividualDataModel!.specialSkills, onSaved: (data) { widget.familyMemberIndividualDataModel! - .anganwadiServicesUsedList = data; + .specialSkills = data; }, validator: (value) { if (value == null || value.isEmpty) { return "Enter a value / NA"; } else return null; - }), - TagTextWidget( + }, + ), + ), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "PHC services utilised", - hint: "Enter services here", - initialValue: widget.familyMemberIndividualDataModel! - .PHCServicesUsedList, + label: "Frequent ailments", + hint: "Enter ailments here", + initialValue: widget + .familyMemberIndividualDataModel!.frequentAilments, onSaved: (data) { widget.familyMemberIndividualDataModel! - .PHCServicesUsedList = data; + .frequentAilments = data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -652,15 +524,22 @@ class _FamilyMemberAddState extends State { } else return null; }), - TagTextWidget( + ), + SizedBox( + height: 20, + ), + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Private Clinic services utilised", - hint: "Enter services here", - initialValue: widget.familyMemberIndividualDataModel! - .privateClinicServicesUsedList, + label: "Communicable Diseases", + hint: "Enter diseases here", + initialValue: widget + .familyMemberIndividualDataModel!.commutableDisease, onSaved: (data) { widget.familyMemberIndividualDataModel! - .privateClinicServicesUsedList = data; + .commutableDisease = data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -668,108 +547,230 @@ class _FamilyMemberAddState extends State { } else return null; }), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: widget.familyMemberIndividualDataModel - ?.privateServiceReason, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Why private?", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter reason", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter a value / NA"; - } - }, + ), + SizedBox( + height: 20, + ), + Padding( + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Non-communicable diseases", + hint: "Enter diseases here", + initialValue: widget.familyMemberIndividualDataModel! + .nonCommutableDisease, onSaved: (data) { widget.familyMemberIndividualDataModel! - .privateServiceReason = data; + .nonCommutableDisease = data; }, - ), - ), - OptionsWidget( + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( defaultValue: - widget.familyMemberIndividualDataModel!.useOfTobacco, + widget.familyMemberIndividualDataModel!.surgeries, options: [ - ['Yes', 'yes'], - ['No', 'no'] + ["Yes", "yes"], + ["No", "no"], ], - title: "Do you use any tobacco based products?", onSaved: (data) { - widget.familyMemberIndividualDataModel!.useOfTobacco = + widget.familyMemberIndividualDataModel!.surgeries = data; }, + title: 'Surgeries', ), - OptionsWidget( - defaultValue: - widget.familyMemberIndividualDataModel!.useOfAlcohol, + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OptionsWidget( + defaultValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesAware, + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .anganwadiServicesAware = data; + }, + title: 'Aware about Anganwadi services?', + ), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + defaultValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesUsing, options: [ - ['Yes', 'yes'], - ['No', 'no'] + ["Yes", "yes"], + ["No", "no"], ], - title: "Do you consume alcohol?", onSaved: (data) { - widget.familyMemberIndividualDataModel!.useOfAlcohol = - data; + widget.familyMemberIndividualDataModel! + .anganwadiServicesUsing = data; }, + title: 'Using any Anganwadi services?', ), - OptionsWidget( - defaultValue: widget.familyMemberIndividualDataModel! - .aarogyaSetuInstalled, - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - title: "Do you have Aarogya Setu installed?", + ), + TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Anganwadi services utilised", + hint: "Enter services here", + initialValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesUsedList, onSaved: (data) { widget.familyMemberIndividualDataModel! - .aarogyaSetuInstalled = data; + .anganwadiServicesUsedList = data; }, - ), - OptionsWidget( - defaultValue: widget - .familyMemberIndividualDataModel!.vizhithiruInstalled, - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - title: "Do you have the Vizhithiru app installed?", + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "PHC services utilised", + hint: "Enter services here", + initialValue: widget + .familyMemberIndividualDataModel!.PHCServicesUsedList, onSaved: (data) { widget.familyMemberIndividualDataModel! - .vizhithiruInstalled = data; + .PHCServicesUsedList = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Private Clinic services utilised", + hint: "Enter services here", + initialValue: widget.familyMemberIndividualDataModel! + .privateClinicServicesUsedList, + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .privateClinicServicesUsedList = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: TextFormField( + initialValue: widget.familyMemberIndividualDataModel + ?.privateServiceReason, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Why private?", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter reason", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value == "") { + return "Enter a value / NA"; + } + }, + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .privateServiceReason = data; }, ), - ], - ) - ], - _onSubmit, - onChange: (isValid) { - print(isValid); - print( - "IS FAM VALID: ${widget.familyMemberIndividualDataModel?.dataValid}"); - widget.familyMemberIndividualDataModel?.dataValid = isValid; - }, - submitMessage: "Submit to continue or go back to re-record data", - note: - "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", - ), + ), + OptionsWidget( + defaultValue: + widget.familyMemberIndividualDataModel!.useOfTobacco, + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you use any tobacco based products?", + onSaved: (data) { + widget.familyMemberIndividualDataModel!.useOfTobacco = + data; + }, + ), + OptionsWidget( + defaultValue: + widget.familyMemberIndividualDataModel!.useOfAlcohol, + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you consume alcohol?", + onSaved: (data) { + widget.familyMemberIndividualDataModel!.useOfAlcohol = + data; + }, + ), + OptionsWidget( + defaultValue: widget + .familyMemberIndividualDataModel!.aarogyaSetuInstalled, + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have Aarogya Setu installed?", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .aarogyaSetuInstalled = data; + }, + ), + OptionsWidget( + defaultValue: widget + .familyMemberIndividualDataModel!.vizhithiruInstalled, + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + title: "Do you have the Vizhithiru app installed?", + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .vizhithiruInstalled = data; + }, + ), + ], + ) + ], + _onSubmit, + onChange: (isValid) { + print(isValid); + print( + "IS FAM VALID: ${widget.familyMemberIndividualDataModel?.dataValid}"); + widget.familyMemberIndividualDataModel?.dataValid = isValid; + }, + submitMessage: "Submit to continue or go back to re-record data", + note: + "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", ), ), + ), ); } } diff --git a/lib/Widgets/StartingEndingTimeWidget.dart b/lib/Widgets/StartingEndingTimeWidget.dart new file mode 100644 index 0000000..50f56dd --- /dev/null +++ b/lib/Widgets/StartingEndingTimeWidget.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; + +class StartingEndingTimeWidget extends FormField> { + StartingEndingTimeWidget( + {FormFieldSetter>? onSaved, + FormFieldValidator>? validator, + label, + initialValue, + AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) + : super( + onSaved: onSaved, + validator: validator ?? + (data) { + if (data == null || data.isEmpty) + return "Please enter a value"; + return null; + }, + initialValue: initialValue ?? [TimeOfDay.now(), TimeOfDay.now()], + autovalidateMode: autoValidateMode, + builder: (FormFieldState> state) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 8), + child: Text(label ?? "Choose Starting and Ending Time", + style: GoogleFonts.montserrat( + fontSize: 15, + color: colors.darkPrimaryTextColor)), + ), + Card( + color: colors.darkScaffoldColor, + elevation: 10, + margin: EdgeInsets.only(bottom: 4), + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: 15, vertical: 8), + child: Column( + children: [ + TimeBoxWidget( + timeMessage: "Starting Time: ", + state: state, + index: 0, + ), + TimeBoxWidget( + timeMessage: "Ending Time: ", + state: state, + index: 1, + ) + ], + ), + ), + ), + ]); + }); +} + +class TimeBoxWidget extends StatelessWidget { + const TimeBoxWidget( + {Key? key, + required this.timeMessage, + required this.state, + required this.index}) + : super(key: key); + + final String timeMessage; + final FormFieldState> state; + final int index; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded(flex: 1, child: Text(timeMessage)), + Expanded( + flex: 1, + child: ElevatedButton( + style: ElevatedButton.styleFrom(primary: colors.darkAccentColor), + onPressed: () async { + TimeOfDay? pickedTime = await showTimePicker( + context: context, + initialTime: state.value?.elementAt(index) ?? TimeOfDay.now(), + ); + var list = state.value; + list![index] = pickedTime!; + state.didChange(list); + }, + child: Text( + "${state.value![index].hour}:${state.value![index].minute} ${state.value![index].period == DayPeriod.am ? "AM" : "PM"}", + style: GoogleFonts.montserrat( + color: Colors.white, fontWeight: FontWeight.w400), + ), + ), + ) + ], + ); + } +} diff --git a/lib/Widgets/TagTextWidget.dart b/lib/Widgets/TagTextWidget.dart index 1f33e25..1955ac0 100644 --- a/lib/Widgets/TagTextWidget.dart +++ b/lib/Widgets/TagTextWidget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; From d625f267791c1d4e1161a3105ae94661627cab8c Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 7 Jan 2022 23:55:40 +0530 Subject: [PATCH 151/264] Added saving for time widget --- lib/Model/FamilyMembersCommonDataModel.dart | 5 ++- lib/Screens/FamilyMemberAdd.dart | 49 +++++++++++++++++---- lib/objectbox-model.json | 7 ++- lib/objectbox.g.dart | 25 +++++++++-- 4 files changed, 71 insertions(+), 15 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 1c66e5e..31f0ee6 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:objectbox/objectbox.dart'; @@ -36,6 +37,7 @@ class FamilyMemberIndividualDataModel { List? frequentAilments; List? commutableDisease; List? nonCommutableDisease; + List? workTimings; String? surgeries; String? anganwadiServicesAware; String? anganwadiServicesUsing; @@ -71,8 +73,7 @@ class FamilyMemberIndividualDataModel { "isADailyWageWorker": dailyWageWorker, "incomePerDay": incomePerDay, "incomePerMonth": incomePerMonth, - "workTimings": "", - //TODO:Add work timings + "workTimings": workTimings, "maritalStatus": maritalStatus, "specialSkills": specialSkills, "frequentHealthAilments": frequentAilments, diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 3f2b459..edaeee3 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -135,9 +135,6 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - StartingEndingTimeWidget( - onSaved: (List? timeList) {}, - ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( @@ -348,12 +345,51 @@ class _FamilyMemberAddState extends State { ], title: "Daily wage worker?", onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; print("Value recorded: $val"); widget.familyMemberIndividualDataModel!.dailyWageWorker = val; }, ), + Padding( + padding: EdgeInsets.all(15), + child: StartingEndingTimeWidget( + initialValue: + widget.familyMemberIndividualDataModel!.workTimings != + null + ? [ + TimeOfDay( + hour: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![0] + .split(":")[0]), + minute: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![0] + .split(":")[1] + .replaceAll(new RegExp(r"\D"), ""))), + TimeOfDay( + hour: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![1] + .split(":")[0]), + minute: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![1] + .split(":")[1] + .replaceAll(new RegExp(r"\D"), ""))) + ] + : null, + onSaved: (List? timeList) { + print(timeList); + var timeFinalString = [ + "${timeList![0].hour}:${timeList[0].minute} ${timeList[0].period == DayPeriod.am ? "AM" : "PM"}", + "${timeList[1].hour}:${timeList[1].minute} ${timeList[1].period == DayPeriod.am ? "AM" : "PM"}" + ]; + widget.familyMemberIndividualDataModel!.workTimings = + timeFinalString; + }, + ), + ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( @@ -379,7 +415,6 @@ class _FamilyMemberAddState extends State { } }, onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); widget.familyMemberIndividualDataModel!.incomePerDay = val; @@ -419,7 +454,6 @@ class _FamilyMemberAddState extends State { } }, onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); widget.familyMemberIndividualDataModel! .incomePerMonth = val; @@ -439,7 +473,6 @@ class _FamilyMemberAddState extends State { ], title: 'Old age pension', onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); widget.familyMemberIndividualDataModel!.pension = val; }, @@ -455,7 +488,6 @@ class _FamilyMemberAddState extends State { ], title: 'Doing/Did business', onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); widget.familyMemberIndividualDataModel!.businessStatus = val; @@ -473,7 +505,6 @@ class _FamilyMemberAddState extends State { ], title: 'Marital Status', onSaved: (val) { - //dailyWageWorker = value.toLowerCase() as bool; print(val.toString()); widget.familyMemberIndividualDataModel! .maritalStatus = val; diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 8639595..1534e25 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -54,7 +54,7 @@ }, { "id": "2:4604626538020621410", - "lastPropertyId": "32:1328642062638523745", + "lastPropertyId": "33:5419770240499089417", "name": "FamilyMemberIndividualDataModel", "properties": [ { @@ -217,6 +217,11 @@ "id": "32:1328642062638523745", "name": "dbOccupation", "type": 9 + }, + { + "id": "33:5419770240499089417", + "name": "workTimings", + "type": 30 } ], "relations": [] diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index b9038f6..273be2e 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -67,7 +67,7 @@ final _entities = [ ModelEntity( id: const IdUid(2, 4604626538020621410), name: 'FamilyMemberIndividualDataModel', - lastPropertyId: const IdUid(32, 1328642062638523745), + lastPropertyId: const IdUid(33, 5419770240499089417), flags: 0, properties: [ ModelProperty( @@ -229,6 +229,11 @@ final _entities = [ id: const IdUid(32, 1328642062638523745), name: 'dbOccupation', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(33, 5419770240499089417), + name: 'workTimings', + type: 30, flags: 0) ], relations: [], @@ -622,7 +627,12 @@ ModelDefinition getObjectBoxModel() { final dbOccupationOffset = object.dbOccupation == null ? null : fbb.writeString(object.dbOccupation!); - fbb.startTable(33); + final workTimingsOffset = object.workTimings == null + ? null + : fbb.writeList(object.workTimings! + .map(fbb.writeString) + .toList(growable: false)); + fbb.startTable(34); fbb.addInt64(0, object.id); fbb.addOffset(1, userNameOffset); fbb.addInt64(2, object.dateOfBirth?.millisecondsSinceEpoch); @@ -655,6 +665,7 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(29, savedTimeOffset); fbb.addOffset(30, dbVulnerabilitiesOffset); fbb.addOffset(31, dbOccupationOffset); + fbb.addOffset(32, workTimingsOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -734,7 +745,10 @@ ModelDefinition getObjectBoxModel() { ..dbVulnerabilities = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 64) ..dbOccupation = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 66); + .vTableGetNullable(buffer, rootOffset, 66) + ..workTimings = + const fb.ListReader(fb.StringReader(), lazy: false) + .vTableGetNullable(buffer, rootOffset, 68); return object; }), @@ -1150,6 +1164,11 @@ class FamilyMemberIndividualDataModel_ { static final dbOccupation = QueryStringProperty( _entities[1].properties[31]); + + /// see [FamilyMemberIndividualDataModel.workTimings] + static final workTimings = + QueryStringVectorProperty( + _entities[1].properties[32]); } /// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. From be358961f5cce9a9656b9a533d489012f360a659 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Fri, 7 Jan 2022 23:58:00 +0530 Subject: [PATCH 152/264] Clean up --- lib/Model/FamilyMembersCommonDataModel.dart | 13 ++++------ lib/Screens/FamilyDetails.dart | 5 ++-- lib/Screens/FamilyMemberAdd.dart | 27 ++------------------- lib/objectbox-model.json | 8 ++---- 4 files changed, 12 insertions(+), 41 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 31f0ee6..5640c80 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -51,13 +51,13 @@ class FamilyMemberIndividualDataModel { String? vizhithiruInstalled; bool? dataValid = false; - String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); + //String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); Map toJson() { return { "UIN": "", "username": "", - "timeStamp": savedTime, + //"timeStamp": savedTime, "name": userName, "date": "${dateOfBirth!.day}-${dateOfBirth!.month}-${dateOfBirth!.year}", "gender": gender, @@ -66,10 +66,10 @@ class FamilyMemberIndividualDataModel { "aadharNumber": aadhaarNumber, "Vulnerabilities": vulnerabilities != null ? buildListForOptionWidget(vulnerabilities!) - : [], + : ['None'], "oldAgePension": pension, "occupation": - occupation != null ? buildListForOptionWidget(occupation!) : [], + occupation != null ? buildListForOptionWidget(occupation!) : ['None'], "isADailyWageWorker": dailyWageWorker, "incomePerDay": incomePerDay, "incomePerMonth": incomePerMonth, @@ -81,9 +81,7 @@ class FamilyMemberIndividualDataModel { "nonCommunicableDiseases": nonCommutableDisease, "surgeriesUndergone": surgeries, "anganwadiServicesAware": anganwadiServicesAware, - //TODO:Remind shridhar to change name "anganwadiServicesUsed": anganwadiServicesUsing, - //TODO:Remind shridhar to add "anganwadiServicesUtilised": anganwadiServicesUsedList, "phcServicesUtilised": PHCServicesUsedList, "privateHealthClinicFacilitiesUsed": privateClinicServicesUsedList, @@ -202,11 +200,10 @@ class FamilyMembersCommonDataModel { "brandsOfTwoThreeWheelers": twoThreeWheelManufacturer != null ? buildListForOptionWidget(twoThreeWheelManufacturer!) - : [], //TODO: Change field name in backend model + : [], "numberOfThreeWheelers": noOfThreeWheelers, - //"brandsOfThreeWheelers": String, //TODO: Remove field "numberOfFourWheelers": noOfFourWheelers, diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 2ca9b6e..970e2ba 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -409,7 +409,7 @@ class _FamilyDetailsState extends State { CheckBoxAddExtraAlertDialog( title: 'Local foods consumed', hint: 'Choose your resource', - //TODO: Change variable to local foood + //TODO: Change variable to local food dataMap: widget.modelData!.localFoodMap ?? local_food, @@ -565,5 +565,6 @@ class _FamilyDetailsState extends State { } -//TODO: Source of water has to be changed in objectbox //TODO: Insert values to checkboxalertdialogs + + diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index edaeee3..0d8c682 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -178,31 +178,6 @@ class _FamilyMemberAddState extends State { print(data); }, ), - // GenderPickerWithImage( - // verticalAlignedText: false, - // selectedGender: Gender.Male, - // maleImage: AssetImage("assets/avatar_man.png"), - // linearGradient: LinearGradient( - // colors: [Color(0xfff54b64), Color(0xfff78361)]), - // femaleImage: AssetImage("assets/avatar_woman.png"), - // selectedGenderTextStyle: TextStyle( - // color: Colors.greenAccent, - // fontWeight: FontWeight.bold), - // unSelectedGenderTextStyle: TextStyle( - // color: colors.darkPrimaryTextColor, - // fontWeight: FontWeight.normal), - // onChanged: (Gender? gender) { - // print(gender); - // widget.familyMemberIndividualDataModel!.gender = - // gender.toString(); - // }, - // equallyAligned: true, - // animationDuration: Duration(milliseconds: 300), - // isCircular: true, - // opacityOfGradient: 0.2, - // padding: const EdgeInsets.all(3), - // size: 70, //default : 40 - // ), GenderPickerWidget( initialGender: widget.familyMemberIndividualDataModel?.gender, @@ -805,3 +780,5 @@ class _FamilyMemberAddState extends State { ); } } + +//TODO: Add tobacco products \ No newline at end of file diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 1534e25..921a1cd 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -203,11 +203,6 @@ "name": "dataValid", "type": 1 }, - { - "id": "30:3511831625273329956", - "name": "savedTime", - "type": 9 - }, { "id": "31:4870102737459248754", "name": "dbVulnerabilities", @@ -412,7 +407,8 @@ "retiredIndexUids": [], "retiredPropertyUids": [ 961043903550204529, - 6821885131227205219 + 6821885131227205219, + 3511831625273329956 ], "retiredRelationUids": [], "version": 1 From e78cd7d3f7d1512eda7e67a690bd3353abf40740 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 8 Jan 2022 00:08:48 +0530 Subject: [PATCH 153/264] Added isGenerated to FamilyHomeScreen.dart --- lib/Screens/FamilyHomeScreen.dart | 10 +++++++++- lib/Screens/VillageSelection.dart | 6 +++++- lib/objectbox.g.dart | 27 ++++++++------------------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 89eab8b..6f04602 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -11,7 +11,11 @@ import 'package:google_fonts/google_fonts.dart'; import 'CollectLocationWidget.dart'; class FamilyHomeScreen extends StatefulWidget { - const FamilyHomeScreen({Key? key, this.modelData}) : super(key: key); + + + FamilyHomeScreen({Key? key, this.modelData,this.isGenerated}) : super(key: key); + + var isGenerated; @override State createState() => _FamilyHomeScreenState(); @@ -187,3 +191,7 @@ class _FamilyHomeScreenState extends State { modelData = null; } } + + + +//TODO: send isGenerated, isEdited to the request \ No newline at end of file diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index 319f751..ad293f1 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -119,7 +119,11 @@ class _VillageSelectionScreenState extends State { height: MediaQuery.of(context).size.height * 0.2, ), if (!widget.isGenerated) - TextButton(onPressed: () {}, child: Text("Generate UIN later")) + TextButton(onPressed: () { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => FamilyHomeScreen(isGenerated: widget.isGenerated))); + }, child: Text("Generate UIN later")) ], ), ), diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 273be2e..d864f39 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -215,11 +215,6 @@ final _entities = [ name: 'dataValid', type: 1, flags: 0), - ModelProperty( - id: const IdUid(30, 3511831625273329956), - name: 'savedTime', - type: 9, - flags: 0), ModelProperty( id: const IdUid(31, 4870102737459248754), name: 'dbVulnerabilities', @@ -440,7 +435,11 @@ ModelDefinition getObjectBoxModel() { lastSequenceId: const IdUid(0, 0), retiredEntityUids: const [], retiredIndexUids: const [], - retiredPropertyUids: const [961043903550204529, 6821885131227205219], + retiredPropertyUids: const [ + 961043903550204529, + 6821885131227205219, + 3511831625273329956 + ], retiredRelationUids: const [], modelVersion: 5, modelVersionParserMinimum: 5, @@ -618,9 +617,6 @@ ModelDefinition getObjectBoxModel() { final vizhithiruInstalledOffset = object.vizhithiruInstalled == null ? null : fbb.writeString(object.vizhithiruInstalled!); - final savedTimeOffset = object.savedTime == null - ? null - : fbb.writeString(object.savedTime!); final dbVulnerabilitiesOffset = object.dbVulnerabilities == null ? null : fbb.writeString(object.dbVulnerabilities!); @@ -662,7 +658,6 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(26, aarogyaSetuInstalledOffset); fbb.addOffset(27, vizhithiruInstalledOffset); fbb.addBool(28, object.dataValid); - fbb.addOffset(29, savedTimeOffset); fbb.addOffset(30, dbVulnerabilitiesOffset); fbb.addOffset(31, dbOccupationOffset); fbb.addOffset(32, workTimingsOffset); @@ -740,8 +735,6 @@ ModelDefinition getObjectBoxModel() { .vTableGetNullable(buffer, rootOffset, 58) ..dataValid = const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 60) - ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 62) ..dbVulnerabilities = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 64) ..dbOccupation = const fb.StringReader() @@ -1151,24 +1144,20 @@ class FamilyMemberIndividualDataModel_ { QueryBooleanProperty( _entities[1].properties[28]); - /// see [FamilyMemberIndividualDataModel.savedTime] - static final savedTime = QueryStringProperty( - _entities[1].properties[29]); - /// see [FamilyMemberIndividualDataModel.dbVulnerabilities] static final dbVulnerabilities = QueryStringProperty( - _entities[1].properties[30]); + _entities[1].properties[29]); /// see [FamilyMemberIndividualDataModel.dbOccupation] static final dbOccupation = QueryStringProperty( - _entities[1].properties[31]); + _entities[1].properties[30]); /// see [FamilyMemberIndividualDataModel.workTimings] static final workTimings = QueryStringVectorProperty( - _entities[1].properties[32]); + _entities[1].properties[31]); } /// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. From df03a377a9854ea282144a356e43499196cb7436 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 8 Jan 2022 00:10:10 +0530 Subject: [PATCH 154/264] Made changes to facilitate record editing --- lib/Screens/EditExistingRecordsPage.dart | 12 +++++++++++- lib/Screens/FamilyHomeScreen.dart | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 9ae14f8..0730347 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/objectbox.g.dart'; import 'package:google_fonts/google_fonts.dart'; class EditRecordsScreen extends StatefulWidget { @@ -131,7 +133,15 @@ class _EditRecordsScreenState extends State { child: ListTile( contentPadding: EdgeInsets.symmetric(vertical: 10,horizontal: 20.0), minLeadingWidth: 30, - onTap: () {}, + onTap: () { + var modelData = FamilyMembersCommonDataModel(); + modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); + modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); + modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); + modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); + Navigator.of(context) + .push(MaterialPageRoute(builder: (context) => FamilyHomeScreen(modelData: modelData,))); + }, //Pass a function which is called onSaved in the next page and add data to the class object title: Text( _searchList[index], diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 6f04602..77d4e79 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -32,7 +32,6 @@ class _FamilyHomeScreenState extends State { setState(() { if (modelData == null) modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); - modelData!.individualDataListTransient.clear(); for (var i in modelData!.individualDataList) { print(i); modelData!.individualDataListTransient.add(i); @@ -188,6 +187,7 @@ class _FamilyHomeScreenState extends State { void dispose() { super.dispose(); print("DISPOSED"); + modelData!.individualDataListTransient.clear(); modelData = null; } } From 492106c69ba900bf46d5bc186240006bae8e1817 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 8 Jan 2022 00:22:59 +0530 Subject: [PATCH 155/264] Added api end points for login --- lib/Constants/Constants.dart | 2 +- lib/Screens/Login.dart | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/Constants/Constants.dart b/lib/Constants/Constants.dart index 1ef3583..4623f94 100644 --- a/lib/Constants/Constants.dart +++ b/lib/Constants/Constants.dart @@ -1,5 +1,5 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = '192.168.29.156:3000'; +String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; String JWT_STORAGE_KEY = 'jwt'; final String MALE = "Male"; final String FEMALE = "Female"; diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 9e8c70b..7bf49d2 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -133,8 +133,6 @@ class _MyAppState extends State { String _validateUserName(String username) { if (username.isEmpty) return 'Please enter username'; - else if (username.length != 16) - return 'Username has to be 16 characters long'; else return ''; } @@ -151,7 +149,7 @@ class _MyAppState extends State { String url = NETWORK_ADDRESS; var body = json.encode({"username": username, "password": password}); - var res = await http.post(Uri.http(url, '/api/login'), + var res = await http.post(Uri.https(url, '/api/login'), headers: {"Content-Type": "application/json"}, body: body); return res; } @@ -270,11 +268,12 @@ class _MyAppState extends State { color: Colors.transparent, child: InkWell( onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => Home()), - ); + _login(); + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => Home()), + // ); }, child: Center( child: Text("SIGN IN", From 8cc7818557fbd1a361f539ab7717390d813833ca Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 8 Jan 2022 00:29:29 +0530 Subject: [PATCH 156/264] Cleaned login --- lib/Screens/Login.dart | 111 --------------------------------- lib/Widgets/LoginFormCard.dart | 2 + 2 files changed, 2 insertions(+), 111 deletions(-) diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 7bf49d2..9010c5d 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -17,11 +17,6 @@ class Login extends StatefulWidget { @override _MyAppState createState() => new _MyAppState(); } -enum _SupportState { - unknown, - supported, - unsupported, -} class _MyAppState extends State { final TextEditingController _usernameController = TextEditingController(); @@ -32,96 +27,10 @@ class _MyAppState extends State { bool _isSelected = false; - final LocalAuthentication auth = LocalAuthentication(); - _SupportState _supportState = _SupportState.unknown; - bool? _canCheckBiometrics; - List? _availableBiometrics; - String _authorized = 'Not Authorized'; - bool _isAuthenticating = false; - @override void initState() { super.initState(); - auth.isDeviceSupported().then( - (bool isSupported) => setState(() => _supportState = isSupported - ? _SupportState.supported - : _SupportState.unsupported), - ); - } - - Future _checkBiometrics() async { - late bool canCheckBiometrics; - try { - canCheckBiometrics = await auth.canCheckBiometrics; - } on PlatformException catch (e) { - canCheckBiometrics = false; - print(e); - } - if (!mounted) { - return; - } - - setState(() { - _canCheckBiometrics = canCheckBiometrics; - }); - } - - Future _getAvailableBiometrics() async { - late List availableBiometrics; - try { - availableBiometrics = await auth.getAvailableBiometrics(); - } on PlatformException catch (e) { - availableBiometrics = []; - print(e); - } - if (!mounted) { - return; - } - - setState(() { - _availableBiometrics = availableBiometrics; - }); - } - - Future _authenticateWithBiometrics() async { - bool authenticated = false; - try { - setState(() { - _isAuthenticating = true; - _authorized = 'Authenticating'; - }); - authenticated = await auth.authenticate( - localizedReason: - 'Scan your fingerprint (or face or whatever) to authenticate', - useErrorDialogs: true, - stickyAuth: true, - biometricOnly: true); - setState(() { - _isAuthenticating = false; - _authorized = 'Authenticating'; - }); - } on PlatformException catch (e) { - print(e); - setState(() { - _isAuthenticating = false; - _authorized = 'Error - ${e.message}'; - }); - return; - } - if (!mounted) { - return; - } - - final String message = authenticated ? 'Authorized' : 'Not Authorized'; - setState(() { - _authorized = message; - }); - } - - Future _cancelAuthentication() async { - await auth.stopAuthentication(); - setState(() => _isAuthenticating = false); } void _radio() { @@ -288,26 +197,6 @@ class _MyAppState extends State { ), ], ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.04, - ), - Padding( - padding: EdgeInsets.only( - right: MediaQuery.of(context).size.width * 0.125, - bottom: 30), - child: IconButton( - onPressed: () async { - //bool canCheckBiometrics = - //await localAuth.canCheckBiometrics; - }, - icon: Icon( - Icons.fingerprint_rounded, - size: 80, - color: colors.darkAccentColor, - ), - splashColor: colors.darkSecondAccentColor, - enableFeedback: true,), - ) ], ), ), diff --git a/lib/Widgets/LoginFormCard.dart b/lib/Widgets/LoginFormCard.dart index 4433dc7..3ae9cf4 100644 --- a/lib/Widgets/LoginFormCard.dart +++ b/lib/Widgets/LoginFormCard.dart @@ -30,6 +30,7 @@ class FormCard extends StatelessWidget { height: 30, ), TextField( + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), controller: _usernameController, decoration: InputDecoration( hintText: "Enter username here", @@ -59,6 +60,7 @@ class FormCard extends StatelessWidget { TextField( controller: _passwordController, obscureText: true, + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), decoration: InputDecoration( hintText: "Enter password here", hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), From b12cc79bdddb9136d52a3432aeb56897cd6950b7 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 8 Jan 2022 01:50:09 +0530 Subject: [PATCH 157/264] Added Village Code Logic to get UID --- lib/Screens/CommunityDataCollection.dart | 18 +- lib/Screens/FamilyHomeScreen.dart | 21 +- lib/Screens/VillageSelection.dart | 263 +++++++++++++++-------- lib/Widgets/CheckBoxAlertDialog.dart | 46 +++- 4 files changed, 245 insertions(+), 103 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 58dd43c..519b70f 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,4 +1,7 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/StoreInstance.dart'; @@ -7,6 +10,7 @@ import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/LocationWidget.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; class CommunityDataCollection extends StatefulWidget { CommunityDataCollection({Key? key, CommunityDataModel? this.modelData}) @@ -53,6 +57,16 @@ class _CommunityDataCollectionState extends State { late CommunityDataModel modelData; var store; + Future _makeRequest( + var data, String node) async { + String url = NETWORK_ADDRESS; + var body = json.encode(data); + + var res = await http.post(Uri.https(url, '/api/$node'), + headers: {"Content-Type": "application/json"}, body: body); + return res; + } + @override Widget build(BuildContext context) { modelData = widget.modelData ?? new CommunityDataModel(); @@ -62,9 +76,11 @@ class _CommunityDataCollectionState extends State { print(isValid.toString()); if (isValid) { + //TODO: Change end point and check res for errors + http.Response res = await _makeRequest(modelData.toJson(), "communityData"); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( - "Upload successful", + res.body, style: TextStyle(color: Colors.red), ), )); diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 77d4e79..66c5f83 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -1,4 +1,7 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -9,13 +12,14 @@ import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:geo_spatial/objectbox.g.dart'; import 'package:google_fonts/google_fonts.dart'; import 'CollectLocationWidget.dart'; +import 'package:http/http.dart' as http; class FamilyHomeScreen extends StatefulWidget { FamilyHomeScreen({Key? key, this.modelData,this.isGenerated}) : super(key: key); - var isGenerated; + final isGenerated; @override State createState() => _FamilyHomeScreenState(); @@ -39,6 +43,16 @@ class _FamilyHomeScreenState extends State { }); } + Future _makeRequest( + var data, String node) async { + String url = NETWORK_ADDRESS; + var body = json.encode(data); + + var res = await http.post(Uri.https(url, '/api/$node'), + headers: {"Content-Type": "application/json"}, body: body); + return res; + } + @override Widget build(BuildContext context) { return Scaffold( @@ -89,7 +103,7 @@ class _FamilyHomeScreenState extends State { side: BorderSide( color: colors .darkSecondBackgroundColor)))), - onPressed: () { + onPressed: () async { bool isValid = true; print("Common ${modelData!.commonDetailsValid}"); print("Location ${modelData!.locationPageValid}"); @@ -101,8 +115,11 @@ class _FamilyHomeScreenState extends State { isValid &= i.dataValid!; print("Indv ${i.dataValid}"); } + + //TODO: Change end point and check res for errors if(isValid){ print("MODEL JSON: ${widget.modelData.toJson()}"); + http.Response res = await _makeRequest(modelData!.toJson(), "familyData"); } print("Is Valid: $isValid"); diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index ad293f1..bfd4d5c 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -1,6 +1,9 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Screens/Home.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -8,22 +11,32 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; + +final storage = FlutterSecureStorage(); +String UID = ""; +Map villages = {}; +List? villageData; class VillageSelectionScreen extends StatefulWidget { VillageSelectionScreen({Key? key}) : super(key: key); @override _VillageSelectionScreenState createState() => _VillageSelectionScreenState(); - - var villages = {'ID1': false, 'ID2': false, 'ID3': false}; - - var isGenerated = false; } class _VillageSelectionScreenState extends State { + Future _makeRequest(String node) async { + String url = NETWORK_ADDRESS; + + var jwt = await storage.read(key: JWT_STORAGE_KEY); + var res = await http.get(Uri.https(url, '/api/$node'), + headers: {"user-auth-token": jwt.toString()}); + return res; + } + initState() { super.initState(); - widget.isGenerated = false; } @override @@ -36,98 +49,168 @@ class _VillageSelectionScreenState extends State { Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - CheckBoxAlertDialog( - singleOption: true, - title: "Choose Village Code", - context: context, - hint: 'Choose here', - dataMap: widget.villages, - ), - Padding( - padding: const EdgeInsets.only( - top: 25.0, bottom: 75, right: 15.0, left: 25.0), - child: SizedBox( - width: double.infinity, - height: 50, - child: ElevatedButton( - child: Text("Generate UID", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all(Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkScaffoldColor), - shape: - MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors.darkScaffoldColor)))), - onPressed: () { + FutureBuilder( + future: _makeRequest("villageInfo/getVillageInfo"), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + print(snapshot.data?.body); + if (snapshot.data == null) + return Text( + "Can't load data, your network might be turned off or the server might be down, click on Generate UIN later to continue without UIN", + textAlign: TextAlign.center, + ); + else if (snapshot.data!.statusCode == 200) { + villageData = json.decode(snapshot.data!.body); + villageData?.forEach((element) { + villages[element["villageCode"]] = false; + }); + + return CheckBoxAlertDialog( + autoSave: true, + singleOption: true, + title: "Choose Village Code", + context: context, + hint: 'Choose here', + dataMap: villages, + onSaved: (data) { + data!.forEach((key, value) { + if (value) { + UID = key; + } + }); + print(UID); + }, + ); + } else { + return Text( + "Can't load data, your network might be turned off or the server might be down, click on Generate UIN later to continue without UIN", + textAlign: TextAlign.center); + } + }), + ContentChildWidget() + ], + ), + ), + ), + ); + } +} + +class ContentChildWidget extends StatefulWidget { + const ContentChildWidget({Key? key}) : super(key: key); + + @override + _ContentChildWidgetState createState() => _ContentChildWidgetState(); +} + +class _ContentChildWidgetState extends State { + late bool isGenerated; + String lastModifiedUIN = ""; + + initState() { + super.initState(); + isGenerated = false; + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only( + top: 25.0, bottom: 75, right: 15.0, left: 25.0), + child: SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + child: Text("Generate UID", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all(Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkScaffoldColor), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: + BorderSide(color: colors.darkScaffoldColor)))), + onPressed: () { + villageData?.forEach((element) { + if (UID != "") { + if (element["villageCode"] == UID) { setState(() { - widget.isGenerated = true; + lastModifiedUIN = element["LastModifiedUIN"]; + //TODO:Modify CODE + }); - }), - ), - ), - if (widget.isGenerated) - Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20)), - elevation: 10, - color: colors.darkScaffoldColor, - child: Padding( - padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 20.0), - child: Text( - 'Sample UIN', - style: GoogleFonts.poppins( - fontWeight: FontWeight.w600, - fontSize: 20, - color: colors.darkPrimaryTextColor), - ), - ), - ElevatedButton.icon( - label: Text("Continue", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - colors.lightPrimaryTextColor), - backgroundColor: MaterialStateProperty.all( - colors.darkPrimaryTextColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors.darkScaffoldColor)))), - onPressed: () { - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => FamilyHomeScreen())); - }, - icon: Icon(Icons.arrow_right_alt_sharp), - ), - ], + } + } else { + //TODO:Ask user to pick a code + } + }); + setState(() { + isGenerated = true; + }); + }), + ), + ), + if (isGenerated) + Card( + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + elevation: 10, + color: colors.darkScaffoldColor, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 20.0), + child: Text( + "UID: ${lastModifiedUIN}", + style: GoogleFonts.poppins( + fontWeight: FontWeight.w600, + fontSize: 20, + color: colors.darkPrimaryTextColor), ), ), - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.2, + ElevatedButton.icon( + label: Text("Continue", + style: GoogleFonts.poppins(fontSize: 15)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + colors.lightPrimaryTextColor), + backgroundColor: MaterialStateProperty.all( + colors.darkPrimaryTextColor), + shape: + MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors.darkScaffoldColor)))), + onPressed: () { + Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: (context) => FamilyHomeScreen())); + }, + icon: Icon(Icons.arrow_right_alt_sharp), + ), + ], ), - if (!widget.isGenerated) - TextButton(onPressed: () { - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (context) => FamilyHomeScreen(isGenerated: widget.isGenerated))); - }, child: Text("Generate UIN later")) - ], + ), ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.2, ), - ), + if (!isGenerated) + TextButton( + onPressed: () { + Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: (context) => + FamilyHomeScreen(isGenerated: isGenerated))); + }, + child: Text("Generate UIN later")) + ], ); } } diff --git a/lib/Widgets/CheckBoxAlertDialog.dart b/lib/Widgets/CheckBoxAlertDialog.dart index af31e3d..1993bbf 100644 --- a/lib/Widgets/CheckBoxAlertDialog.dart +++ b/lib/Widgets/CheckBoxAlertDialog.dart @@ -27,14 +27,17 @@ class CheckBoxAlertDialog extends FormField> { CheckBoxAlertDialog( {FormFieldSetter>? onSaved, FormFieldValidator>? validator, + Key? key, required title, required hint, required Map dataMap, errorField, singleOption = false, + autoSave = false, required context, AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) : super( + key: key, onSaved: onSaved, validator: validator ?? (data) { @@ -71,7 +74,8 @@ class CheckBoxAlertDialog extends FormField> { } return Text( displayValue, - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), textAlign: TextAlign.end, ); } else { @@ -94,15 +98,17 @@ class CheckBoxAlertDialog extends FormField> { padding: EdgeInsets.only(bottom: 20), child: Text(title, style: GoogleFonts.montserrat( - fontSize: 15, color: colors.darkPrimaryTextColor)), + fontSize: 15, + color: colors.darkPrimaryTextColor)), ), Card( color: colors.darkScaffoldColor, elevation: 5, - margin: EdgeInsets.only(top: 3,bottom: 3), + margin: EdgeInsets.only(top: 3, bottom: 3), child: InkWell( onTap: () { - _showMyDialog(context, title, state, singleOption); + _showMyDialog( + context, title, state, singleOption, autoSave); }, child: Padding( padding: EdgeInsets.only( @@ -118,7 +124,10 @@ class CheckBoxAlertDialog extends FormField> { ), Padding( padding: EdgeInsets.only(left: 5), - child: Icon(Icons.arrow_right,color: colors.darkSecondaryTextColor,), + child: Icon( + Icons.arrow_right, + color: colors.darkSecondaryTextColor, + ), ) ], ), @@ -130,7 +139,8 @@ class CheckBoxAlertDialog extends FormField> { padding: EdgeInsets.all(10), child: Text( state.errorText ?? "error", - style: TextStyle(color: colors.errorColor, fontSize: 10), + style: TextStyle( + color: colors.errorColor, fontSize: 10), ), ) : Container() @@ -140,11 +150,13 @@ class CheckBoxAlertDialog extends FormField> { }); } -Future _showMyDialog(context, dialogTitle, state, singleOption) async { +Future _showMyDialog( + context, dialogTitle, state, singleOption, autoSave) async { return showDialog( context: context, builder: (BuildContext context) { return AlertDialogWidget( + autoSave: autoSave, dialogTitle: dialogTitle, state: state, singleOption: singleOption, @@ -157,9 +169,11 @@ class AlertDialogWidget extends StatefulWidget { final dialogTitle; final state; final singleOption; + final autoSave; const AlertDialogWidget( {Key? key, + required this.autoSave, required this.dialogTitle, required this.state, required this.singleOption}) @@ -179,7 +193,10 @@ class _AlertDialogWidgetState extends State { dialogList.add(CheckboxListTile( checkColor: colors.darkPrimaryTextColor, activeColor: colors.darkAccentColor, - title: Text(k,style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), + title: Text( + k, + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), value: widget.state.value[k], onChanged: (value) { Map newPair = widget.state.value; @@ -199,13 +216,19 @@ class _AlertDialogWidgetState extends State { dataList = newPair; }); widget.state.didChange(newPair); + if (widget.autoSave) { + widget.state.save(); + } }, )) }); return AlertDialog( backgroundColor: colors.darkSecondBackgroundColor, - title: Text(widget.dialogTitle,style: GoogleFonts.poppins(color: colors.darkAccentColor),), + title: Text( + widget.dialogTitle, + style: GoogleFonts.poppins(color: colors.darkAccentColor), + ), content: SingleChildScrollView( child: Column( children: dialogList, @@ -213,7 +236,10 @@ class _AlertDialogWidgetState extends State { ), actions: [ TextButton( - child: Text('Choose',style: GoogleFonts.poppins(color: colors.darkAccentColor),), + child: Text( + 'Choose', + style: GoogleFonts.poppins(color: colors.darkAccentColor), + ), onPressed: () { Navigator.of(context).pop(); }, From 90af8c5f8dea6f0304cc7691845cac8e9d22256d Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 8 Jan 2022 02:15:26 +0530 Subject: [PATCH 158/264] Added ChangePassword.dart --- lib/Screens/ChangePassword.dart | 152 ++++++++++++++++++++++++++++++++ lib/Screens/ProfilePage.dart | 58 ++++++++++-- 2 files changed, 205 insertions(+), 5 deletions(-) create mode 100644 lib/Screens/ChangePassword.dart diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart new file mode 100644 index 0000000..70133ba --- /dev/null +++ b/lib/Screens/ChangePassword.dart @@ -0,0 +1,152 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class ChangePassword extends StatefulWidget { + ChangePassword({Key? key}) : super(key: key); + + @override + _ChangePasswordState createState() => _ChangePasswordState(); +} + +class _ChangePasswordState extends State { + var password = ""; + + @override + Widget build(BuildContext context) { + return Scaffold( + resizeToAvoidBottomInset: true, + appBar: AppBarBackButton('Change Password'), + body: Stack( + children: [ + SvgPicture.asset('assets/svg/profile_bg.svg', fit: BoxFit.cover), + Container( + height: MediaQuery.of(context).size.height * 0.6, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20))), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + child: SvgPicture.asset( + 'assets/svg/storage_image.svg', + ), + height: 200, + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.05, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: TextFormField( + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, + width: 1.0)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0)), + label: Text( + "Enter new password", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Enter password here", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value!.isNotEmpty) { + if (value.length <= 7) { + return "Password too small"; + } + } else + return null; + }, + onSaved: (data) { + password = data!; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: TextFormField( + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, + width: 1.0)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0)), + label: Text( + "Re-Enter new password", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Enter password here", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value!.isNotEmpty) { + if (value != password) { + return "Passwords do not match"; + } + } else + return null; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 40.0), + child: SizedBox( + width: double.infinity, + height: 55, + child: ElevatedButton( + child: Text("Change Password", + style: TextStyle(fontSize: 16)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + colors.lightPrimaryTextColor), + backgroundColor: MaterialStateProperty.all( + colors.darkPrimaryTextColor), + shape: + MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () {}, + ), + ), + ) + ], + ), + ) + ], + ), + ); + } +} diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 3ab93e5..a29d2f6 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -1,15 +1,22 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Screens/ChangePassword.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; -class ProfilePage extends StatelessWidget { +class ProfilePage extends StatefulWidget { + @override + State createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { @override Widget build(BuildContext context) { return Scaffold( + resizeToAvoidBottomInset: true, body: Stack(children: [ SvgPicture.asset( 'assets/svg/profile_bg.svg', @@ -62,8 +69,8 @@ class ProfilePage extends StatelessWidget { ), ), Padding( - padding: - const EdgeInsets.symmetric(horizontal: 20.0, vertical: 40.0), + padding: const EdgeInsets.symmetric( + horizontal: 20.0, vertical: 40.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -72,10 +79,13 @@ class ProfilePage extends StatelessWidget { padding: EdgeInsets.only(right: 6, left: 20), child: ElevatedButton.icon( style: ElevatedButton.styleFrom( - primary: colors.darkSecondaryTextColor.withOpacity(0.2), + primary: + colors.darkSecondaryTextColor.withOpacity(0.2), ), onPressed: () { print('Button Clicked'); + Route route = MaterialPageRoute(builder: (context) => ChangePassword()); + Navigator.push(context, route); }, icon: Icon( Icons.lock, @@ -95,10 +105,12 @@ class ProfilePage extends StatelessWidget { padding: EdgeInsets.only(left: 6, right: 20), child: ElevatedButton.icon( style: ElevatedButton.styleFrom( - primary: colors.darkSecondaryTextColor.withOpacity(0.2), + primary: + colors.darkSecondaryTextColor.withOpacity(0.2), ), onPressed: () { print('Button Clicked'); + _displayTextInputDialog(context); }, label: Text( 'Change\nUsername', @@ -152,3 +164,39 @@ class ProfilePage extends StatelessWidget { ); } } + +Future _displayTextInputDialog(BuildContext context) async { + return showDialog( + context: context, + builder: (context) { + var _textFieldController = TextEditingController(); + return AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text('Enter Name',style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), + content: TextField( + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + onChanged: (value) {}, + controller: _textFieldController = TextEditingController(), + decoration: InputDecoration(hintText: "Text Field in Dialog",hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor)), + ), + actions: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20))), + textStyle: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor)), + child: Text( + 'OK', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: () { + if(_textFieldController.text!=null) + globals.Name = _textFieldController.text; + Navigator.pop(context); + }) + ]); + }); +} From a9dc3148ab0aec199a08736484f6d8a51466522a Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 14 Jan 2022 23:41:39 +0530 Subject: [PATCH 159/264] Added a new widget to get nested data for options --- lib/Screens/Home.dart | 42 ++++++++-- lib/Screens/Login.dart | 5 -- lib/Screens/NestedOptionsWidget.dart | 107 ++++++++++++++++++++++++ lib/Widgets/CheckBoxAddExtraDialog.dart | 33 +++++--- 4 files changed, 162 insertions(+), 25 deletions(-) create mode 100644 lib/Screens/NestedOptionsWidget.dart diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index d5f7bc5..6cf496a 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; +import 'package:geo_spatial/Screens/NestedOptionsWidget.dart'; import 'package:geo_spatial/Screens/VillageSelection.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; @@ -26,16 +27,16 @@ class _HomeWidgetState extends State { Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { - final result = await showDialog( context: context, builder: (_) => AlertDialog( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20))), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20))), backgroundColor: colors.darkScaffoldColor, title: Text( "Are you sure you want to quit?", - style: - GoogleFonts.poppins(color: colors.darkPrimaryTextColor,fontSize: 15), + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor, fontSize: 15), ), actions: [ ElevatedButton( @@ -45,8 +46,8 @@ class _HomeWidgetState extends State { borderRadius: BorderRadius.all(Radius.circular(20)))), onPressed: () { - SystemChannels.platform.invokeMethod('SystemNavigator.pop'); - + SystemChannels.platform + .invokeMethod('SystemNavigator.pop'); }, child: Text( 'Yes', @@ -54,8 +55,8 @@ class _HomeWidgetState extends State { color: colors.darkPrimaryTextColor), )), TextButton( - onPressed: (){ - Navigator.pop(context,true); + onPressed: () { + Navigator.pop(context, true); }, child: Text( 'No', @@ -153,6 +154,31 @@ class _HomeWidgetState extends State { SavedDataPage(), Color(0xfff54b64), Color(0xfff78361)), + DataCard( + 'Debug Card', + 'Debug and test pages here', + 'assets/svg/houses.svg', + //FamilyHomeScreen(), + NestedOptionWidget( + title: "Select your options", + onChanged: (val){ + for(var i in val){ + print(i.boxName); + print(i.subOptionDataMap.toString()); + print(i.isSelected); + print("\n"); + } + print(val); + }, + nestedOptionData: [ + new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'One'), + new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Two'), + new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Three'), + new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Four') + ], + ), + Color(0xfff54b64), + Color(0xfff78361)), ], ), ), diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 9010c5d..8afdb1f 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -178,11 +178,6 @@ class _MyAppState extends State { child: InkWell( onTap: () { _login(); - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => Home()), - // ); }, child: Center( child: Text("SIGN IN", diff --git a/lib/Screens/NestedOptionsWidget.dart b/lib/Screens/NestedOptionsWidget.dart new file mode 100644 index 0000000..cc4042e --- /dev/null +++ b/lib/Screens/NestedOptionsWidget.dart @@ -0,0 +1,107 @@ +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class NestedOptionData { + bool isSelected = false; + late Map subOptionDataMap; + late String boxName; + + NestedOptionData({required this.subOptionDataMap, required this.boxName}); +} + +class NestedOptionWidget extends StatefulWidget { + const NestedOptionWidget( + {Key? key, required this.nestedOptionData, this.onChanged, this.title}) + : super(key: key); + + final List nestedOptionData; + final String? title; + final Function(List)? onChanged; + + @override + _NestedOptionWidgetState createState() => _NestedOptionWidgetState(); +} + +class _NestedOptionWidgetState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBarBackButton(widget.title ?? "Select Options"), + body: Padding( + padding: EdgeInsets.all(20), + child: Container( + child: Padding( + padding: EdgeInsets.all(0), + child: ListView.builder( + itemCount: widget.nestedOptionData.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.all(5), + child: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC252426), + blurRadius: 8.0, + ), + ], + ), + child: Column( + children: [ + Card( + elevation: 10, + color: colors.darkScaffoldColor, + child: CheckboxListTile( + value: + widget.nestedOptionData[index].isSelected, + title: Text( + widget.nestedOptionData[index].boxName, + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 18), + ), + onChanged: (val) { + setState(() { + // for (var i in widget.nestedOptionData) { + // i.isSelected = false; + // } + widget.nestedOptionData[index].isSelected = + val!; + }); + if (widget.onChanged != null) + widget.onChanged!(widget.nestedOptionData); + }), + ), + widget.nestedOptionData[index].isSelected + ? CheckBoxAddExtraAlertDialog( + hint: "hint", + autoSave: true, + onSaved: (map) { + widget.nestedOptionData[index] + .subOptionDataMap = map!; + if (widget.onChanged != null) + widget + .onChanged!(widget.nestedOptionData); + }, + dataMap: widget + .nestedOptionData[index].subOptionDataMap, + context: context) + : Container() + ], + ), + ), + ); + }), + ), + ), + ), + ); + } +} diff --git a/lib/Widgets/CheckBoxAddExtraDialog.dart b/lib/Widgets/CheckBoxAddExtraDialog.dart index a68fd87..a92de00 100644 --- a/lib/Widgets/CheckBoxAddExtraDialog.dart +++ b/lib/Widgets/CheckBoxAddExtraDialog.dart @@ -27,7 +27,8 @@ class CheckBoxAddExtraAlertDialog extends FormField> { CheckBoxAddExtraAlertDialog( {FormFieldSetter>? onSaved, FormFieldValidator>? validator, - required title, + autoSave = false, + title, required hint, required Map dataMap, errorField, @@ -92,13 +93,15 @@ class CheckBoxAddExtraAlertDialog extends FormField> { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding( - padding: EdgeInsets.only(bottom: 20), - child: Text(title, - style: GoogleFonts.montserrat( - fontSize: 15, - color: colors.darkPrimaryTextColor)), - ), + title != null + ? Padding( + padding: EdgeInsets.only(bottom: 20), + child: Text(title, + style: GoogleFonts.montserrat( + fontSize: 15, + color: colors.darkPrimaryTextColor)), + ) + : Container(), Card( color: colors.darkScaffoldColor, elevation: 5, @@ -106,7 +109,7 @@ class CheckBoxAddExtraAlertDialog extends FormField> { child: InkWell( onTap: () { _showMyDialog(context, title, state, singleOption, - showAddNewBox); + showAddNewBox, autoSave); }, child: Padding( padding: EdgeInsets.only( @@ -149,12 +152,13 @@ class CheckBoxAddExtraAlertDialog extends FormField> { } Future _showMyDialog( - context, dialogTitle, state, singleOption, showAddNewBox) async { + context, dialogTitle, state, singleOption, showAddNewBox, autoSave) async { return showDialog( context: context, builder: (BuildContext context) { return AlertDialogWidget( - dialogTitle: dialogTitle, + autoSave: autoSave, + dialogTitle: dialogTitle ?? "Choose an option", state: state, showAddNew: showAddNewBox, singleOption: singleOption, @@ -168,13 +172,15 @@ class AlertDialogWidget extends StatefulWidget { final state; final singleOption; final showAddNew; + final bool autoSave; const AlertDialogWidget( {Key? key, required this.dialogTitle, required this.state, required this.singleOption, - this.showAddNew}) + this.showAddNew, + required this.autoSave}) : super(key: key); @override @@ -256,6 +262,9 @@ class _AlertDialogWidgetState extends State { dataList = newPair; }); widget.state.didChange(newPair); + if (widget.autoSave) { + widget.state.save(); + } }, )) }); From e73f82fc98548cb89ba5ad629cd1038ec3730b47 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 17 Jan 2022 08:26:52 +0530 Subject: [PATCH 160/264] Altered NestedOptionsWidget.dart --- lib/Screens/Home.dart | 5 ++- lib/Screens/NestedOptionsWidget.dart | 60 +++++++++++++++++----------- lib/Widgets/CameraWidget.dart | 0 3 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 lib/Widgets/CameraWidget.dart diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 6cf496a..6be79cc 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -174,7 +174,10 @@ class _HomeWidgetState extends State { new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'One'), new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Two'), new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Three'), - new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Four') + new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Four'), + new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Five'), + new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Six'), + new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Seven') ], ), Color(0xfff54b64), diff --git a/lib/Screens/NestedOptionsWidget.dart b/lib/Screens/NestedOptionsWidget.dart index cc4042e..c0773f4 100644 --- a/lib/Screens/NestedOptionsWidget.dart +++ b/lib/Screens/NestedOptionsWidget.dart @@ -26,6 +26,9 @@ class NestedOptionWidget extends StatefulWidget { } class _NestedOptionWidgetState extends State { + + var selectedColor = Color(0xffffffff); + @override Widget build(BuildContext context) { return Scaffold( @@ -33,6 +36,16 @@ class _NestedOptionWidgetState extends State { body: Padding( padding: EdgeInsets.all(20), child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC252426), + blurRadius: 8.0, + ), + ], + ), child: Padding( padding: EdgeInsets.all(0), child: ListView.builder( @@ -42,28 +55,19 @@ class _NestedOptionWidgetState extends State { padding: EdgeInsets.all(5), child: Container( padding: EdgeInsets.all(10), - decoration: BoxDecoration( - color: colors.darkSecondBackgroundColor, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Color(0xBC252426), - blurRadius: 8.0, - ), - ], - ), child: Column( children: [ Card( elevation: 10, color: colors.darkScaffoldColor, child: CheckboxListTile( + activeColor: colors.darkAccentColor, value: widget.nestedOptionData[index].isSelected, title: Text( widget.nestedOptionData[index].boxName, style: GoogleFonts.poppins( - color: Colors.white, + color: selectedColor, fontWeight: FontWeight.w400, fontSize: 18), ), @@ -80,19 +84,27 @@ class _NestedOptionWidgetState extends State { }), ), widget.nestedOptionData[index].isSelected - ? CheckBoxAddExtraAlertDialog( - hint: "hint", - autoSave: true, - onSaved: (map) { - widget.nestedOptionData[index] - .subOptionDataMap = map!; - if (widget.onChanged != null) - widget - .onChanged!(widget.nestedOptionData); - }, - dataMap: widget - .nestedOptionData[index].subOptionDataMap, - context: context) + ? Container( + margin: EdgeInsets.symmetric(horizontal: 5), + decoration: BoxDecoration( + color: colors.darkSecondAccentColor, + borderRadius: BorderRadius.only(bottomLeft: Radius.circular(10),bottomRight: Radius.circular(10)) + ), + + child: CheckBoxAddExtraAlertDialog( + hint: "hint", + autoSave: true, + onSaved: (map) { + widget.nestedOptionData[index] + .subOptionDataMap = map!; + if (widget.onChanged != null) + widget + .onChanged!(widget.nestedOptionData); + }, + dataMap: widget + .nestedOptionData[index].subOptionDataMap, + context: context), + ) : Container() ], ), diff --git a/lib/Widgets/CameraWidget.dart b/lib/Widgets/CameraWidget.dart new file mode 100644 index 0000000..e69de29 From 70243ab02cf74bb9f65cb384ead2bb557fc72f3e Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 17 Jan 2022 08:29:56 +0530 Subject: [PATCH 161/264] Changed SavedData.dart icons --- lib/Screens/SavedData.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart index f1fcecf..9f39422 100644 --- a/lib/Screens/SavedData.dart +++ b/lib/Screens/SavedData.dart @@ -20,7 +20,7 @@ class SavedDataPage extends StatelessWidget { tabs: [ Tab( icon: Icon( - Icons.person, + Icons.apartment, color: colors.darkPrimaryTextColor, )), Tab( From 056e8e57a07805f956abb23a0d6be4dcc3c50118 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 17 Jan 2022 10:39:33 +0530 Subject: [PATCH 162/264] Added no of working days to FamilyMemberAdd.dart and DataModel, added head of family to FamilyDetails.dart --- lib/Model/FamilyMembersCommonDataModel.dart | 3 +- lib/Screens/FamilyDetails.dart | 13 +++++++++ lib/Screens/FamilyMemberAdd.dart | 31 +++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 5640c80..9b285dc 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:objectbox/objectbox.dart'; @@ -33,6 +32,7 @@ class FamilyMemberIndividualDataModel { String? pension; String? businessStatus; String? maritalStatus; + String? noOfDaysWorking; List? specialSkills; List? frequentAilments; List? commutableDisease; @@ -70,6 +70,7 @@ class FamilyMemberIndividualDataModel { "oldAgePension": pension, "occupation": occupation != null ? buildListForOptionWidget(occupation!) : ['None'], + "noOfDaysWorking": noOfDaysWorking, "isADailyWageWorker": dailyWageWorker, "incomePerDay": incomePerDay, "incomePerMonth": incomePerMonth, diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 970e2ba..c88293c 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -9,6 +9,7 @@ import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key, this.modelData}) : super(key: key); @@ -162,6 +163,18 @@ class _FamilyDetailsState extends State { Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: DropDownFormField( + //TODO: Fetch names from family member add saved objects and populate list + title: 'Head of family', + hint: 'Choose the head of family', + errorField: 'Please choose a head of family', + autoValidateMode: AutovalidateMode.onUserInteraction, + validator: (val){}, + list: [], + ) + ), OptionsWidget( options: [ ['Yes', 'yes'], diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 0d8c682..10d9fd5 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -365,6 +365,37 @@ class _FamilyMemberAddState extends State { }, ), ), + Padding(padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: TextFormField( + initialValue: widget.familyMemberIndividualDataModel!.noOfDaysWorking, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Number of work days", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter number of work days", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (int.parse(value!)< 1) { + return "Enter number of work days"; + } + else if(int.parse(value)>31){ + return "Enter a valid number of work days"; + } + }, + onSaved: (val) { + print(val.toString()); + widget.familyMemberIndividualDataModel!.noOfDaysWorking = + val; + }, + ),), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( From 022e03bf1957ad0e97dcb666d229932f2a54c3dd Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 17 Jan 2022 10:54:11 +0530 Subject: [PATCH 163/264] Replaced PHC, private hosp to yes/no questions, private reason to checkboxalertwithdialog, made changes in datamodel --- lib/Model/FamilyMembersCommonDataModel.dart | 10 +- lib/Screens/FamilyMemberAdd.dart | 217 ++++++++++---------- 2 files changed, 112 insertions(+), 115 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 9b285dc..491a0ba 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -42,9 +42,9 @@ class FamilyMemberIndividualDataModel { String? anganwadiServicesAware; String? anganwadiServicesUsing; List? anganwadiServicesUsedList; - List? PHCServicesUsedList; - List? privateClinicServicesUsedList; - String? privateServiceReason; + String? PHCServicesUsed; //TODO: Inform Change + String? privateClinicServicesUsed; //TODO: Inform Change + List? privateServiceReason; //TODO: Inform Change String? useOfTobacco; String? useOfAlcohol; String? aarogyaSetuInstalled; @@ -84,8 +84,8 @@ class FamilyMemberIndividualDataModel { "anganwadiServicesAware": anganwadiServicesAware, "anganwadiServicesUsed": anganwadiServicesUsing, "anganwadiServicesUtilised": anganwadiServicesUsedList, - "phcServicesUtilised": PHCServicesUsedList, - "privateHealthClinicFacilitiesUsed": privateClinicServicesUsedList, + "phcServicesUtilised": PHCServicesUsed, + "privateHealthClinicFacilitiesUsed": privateClinicServicesUsed, "reasonsForVisitingPrivateHealthClinic": privateServiceReason, "tobaccoBasedProductsUsage": useOfTobacco, "alcoholConsumption": useOfAlcohol, diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 10d9fd5..089216b 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -365,75 +365,74 @@ class _FamilyMemberAddState extends State { }, ), ), - Padding(padding: const EdgeInsets.symmetric(horizontal: 10.0), - child: TextFormField( - initialValue: widget.familyMemberIndividualDataModel!.noOfDaysWorking, - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Number of work days", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter number of work days", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (int.parse(value!)< 1) { - return "Enter number of work days"; - } - else if(int.parse(value)>31){ - return "Enter a valid number of work days"; - } - }, - onSaved: (val) { - print(val.toString()); - widget.familyMemberIndividualDataModel!.noOfDaysWorking = - val; - }, - ),), - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.incomePerDay, - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Day", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter income per day", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter Income/Day / 0"; - } - }, - onSaved: (val) { - print(val.toString()); - widget.familyMemberIndividualDataModel!.incomePerDay = - val; - }, - ), - ) ], ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - //TODO: Add work timings + Padding(padding: const EdgeInsets.symmetric(horizontal: 10.0,vertical: 20.0), + child: TextFormField( + initialValue: widget.familyMemberIndividualDataModel!.noOfDaysWorking, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Number of work days", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter number of work days", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (int.parse(value!)< 1) { + return "Enter number of work days"; + } + else if(int.parse(value)>31){ + return "Enter a valid number of work days"; + } + }, + onSaved: (val) { + print(val.toString()); + widget.familyMemberIndividualDataModel!.noOfDaysWorking = + val; + }, + ),), + Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0,bottom: 20.0,top: 10.0), + child: TextFormField( + initialValue: + widget.familyMemberIndividualDataModel?.incomePerDay, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Income/Day", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter income per day", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value == "") { + return "Enter Income/Day / 0"; + } + }, + onSaved: (val) { + print(val.toString()); + widget.familyMemberIndividualDataModel!.incomePerDay = + val; + }, + ), + ), Padding( padding: const EdgeInsets.only( left: 10.0, right: 10.0, top: 10.0), @@ -517,31 +516,31 @@ class _FamilyMemberAddState extends State { }, ), ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Special Skills", - hint: "Enter skills here", - initialValue: widget - .familyMemberIndividualDataModel!.specialSkills, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .specialSkills = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }, - ), - ), ]), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20), + child: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Special Skills", + hint: "Enter skills here", + initialValue: widget + .familyMemberIndividualDataModel!.specialSkills, + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .specialSkills = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }, + ), + ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), @@ -674,38 +673,36 @@ class _FamilyMemberAddState extends State { } else return null; }), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "PHC services utilised", - hint: "Enter services here", - initialValue: widget - .familyMemberIndividualDataModel!.PHCServicesUsedList, + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + defaultValue: widget.familyMemberIndividualDataModel! + .PHCServicesUsed, + options: [ + ["Yes", "yes"], + ["No", "no"], + ], onSaved: (data) { widget.familyMemberIndividualDataModel! - .PHCServicesUsedList = data; + .PHCServicesUsed = data; }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Private Clinic services utilised", - hint: "Enter services here", - initialValue: widget.familyMemberIndividualDataModel! - .privateClinicServicesUsedList, + title: 'Using any PHC services?', + ),), + Padding( + padding: const EdgeInsets.all(20.0), + child: OptionsWidget( + defaultValue: widget.familyMemberIndividualDataModel! + .privateClinicServicesUsed, + options: [ + ["Yes", "yes"], + ["No", "no"], + ], onSaved: (data) { widget.familyMemberIndividualDataModel! - .privateClinicServicesUsedList = data; + .privateClinicServicesUsed = data; }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), + title: 'Do you visit a private hospital?', + ),), ], ), Column( From 2ac04994c6c580d6deb1fe74883a1fc44393f71d Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 17 Jan 2022 11:21:58 +0530 Subject: [PATCH 164/264] Changed from checkboxalert to checkboxaddextraalert for two/three/four wheeler brands --- lib/Screens/FamilyDetails.dart | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index c88293c..c41146c 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -9,7 +9,7 @@ import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:geo_spatial/Utils/DarkTheme.dart'; + class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key, this.modelData}) : super(key: key); @@ -99,6 +99,7 @@ class _FamilyDetailsState extends State { 'Lake':false, 'Pond':false, 'Groundwater':false, + 'Borewell':false, 'Well':false, 'Tap':false, 'Water supply':false, @@ -272,9 +273,9 @@ class _FamilyDetailsState extends State { }, errorField: "Please choose a valid number", ), - CheckBoxAlertDialog( - title: 'Two/Three wheeler manufacturer', - hint: 'Please choose manufacturers', + CheckBoxAddExtraAlertDialog( + title: 'Two/Three wheeler brand', + hint: 'Please choose brands', singleOption: false, context: context, dataMap: @@ -284,7 +285,7 @@ class _FamilyDetailsState extends State { print("Value recorded: $val"); widget.modelData?.twoThreeWheelManufacturer = val; }, - errorField: "Please choose a manufacturer", + errorField: "Please choose a brand", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -304,9 +305,9 @@ class _FamilyDetailsState extends State { Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - CheckBoxAlertDialog( - title: 'Four wheeler manufacturer', - hint: 'Please choose manufacturers', + CheckBoxAddExtraAlertDialog( + title: 'Four wheeler brand', + hint: 'Please choose brand', singleOption: false, context: context, dataMap: widget.modelData!.twoFourManufacturer ?? @@ -315,7 +316,7 @@ class _FamilyDetailsState extends State { print("Value recorded: $val"); widget.modelData?.twoFourManufacturer = val; }, - errorField: "Please choose a manufacturer", + errorField: "Please choose a brand", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -346,7 +347,7 @@ class _FamilyDetailsState extends State { contentPadding: EdgeInsets.all(7.0), hintText: "Enter income in Rupees", label: AutoSizeText( - 'Income from cattle', + 'Income from cattle/month', style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), )), From 79649661f8e1286179ff0a69c084bb16d8ece750 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 17 Jan 2022 11:37:23 +0530 Subject: [PATCH 165/264] Switched Private hospital reasons to CheckBoxAddExtraDialog --- lib/Model/FamilyMembersCommonDataModel.dart | 2 +- lib/Screens/FamilyMemberAdd.dart | 48 +++++++++------------ 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 491a0ba..a4f9e68 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -44,7 +44,7 @@ class FamilyMemberIndividualDataModel { List? anganwadiServicesUsedList; String? PHCServicesUsed; //TODO: Inform Change String? privateClinicServicesUsed; //TODO: Inform Change - List? privateServiceReason; //TODO: Inform Change + Map? privateServiceReason; //TODO: Inform Change String? useOfTobacco; String? useOfAlcohol; String? aarogyaSetuInstalled; diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 089216b..86c1466 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -78,6 +78,12 @@ class _FamilyMemberAddState extends State { 'Unemployed': false, }; + var privateClinicReasons = { + 'Better treatment and personalised care' : false, + 'Easy to access' : false, + 'Less waiting time' : false + }; + @override Widget build(BuildContext context) { return WillPopScope( @@ -708,34 +714,20 @@ class _FamilyMemberAddState extends State { Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), - child: TextFormField( - initialValue: widget.familyMemberIndividualDataModel - ?.privateServiceReason, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Why private?", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter reason", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter a value / NA"; - } - }, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .privateServiceReason = data; - }, - ), + CheckBoxAddExtraAlertDialog( + title: 'Reasons for using a private clinic', + hint: 'Please choose a reason', + dataMap: widget + .familyMemberIndividualDataModel!.privateServiceReason ?? + privateClinicReasons, + singleOption: false, + context: context, + onSaved: (map) { + widget.familyMemberIndividualDataModel!.vulnerabilities = + map; + }, + errorField: "Please choose a vulnerability / None", + autoValidateMode: AutovalidateMode.onUserInteraction, ), OptionsWidget( defaultValue: From c84d171c7f6f5687766a47ca755ba73a0f60f8e2 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 17 Jan 2022 12:09:47 +0530 Subject: [PATCH 166/264] Added a new widget to get nested data for options --- lib/Screens/FamilyMemberAdd.dart | 14 ++++ lib/Screens/Home.dart | 5 +- lib/Widgets/NestedOptionWidgetFormField.dart | 70 ++++++++++++++++++++ lib/Widgets/OptionsFormWidget.dart | 1 - 4 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 lib/Widgets/NestedOptionWidgetFormField.dart diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 86c1466..29af638 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Screens/NestedOptionsWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; @@ -8,6 +9,7 @@ import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/GenderWidget.dart'; +import 'package:geo_spatial/Widgets/NestedOptionWidgetFormField.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:geo_spatial/Widgets/StartingEndingTimeWidget.dart'; import 'package:geo_spatial/Widgets/TagTextWidget.dart'; @@ -331,6 +333,18 @@ class _FamilyMemberAddState extends State { val; }, ), + NestedOptionWidgetFormField(nestedOptionData: [ + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, boxName: 'One'), + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, boxName: 'Two'), + new NestedOptionData(subOptionDataMap: {"yes": true, "no": true}, + boxName: 'Three'), + new NestedOptionData( + subOptionDataMap: {"yes": false, "no": false}, + boxName: 'Four') + ], title: 'Select some options', context: context,), + Padding( padding: EdgeInsets.all(15), child: StartingEndingTimeWidget( diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 6be79cc..6cf496a 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -174,10 +174,7 @@ class _HomeWidgetState extends State { new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'One'), new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Two'), new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Three'), - new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Four'), - new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Five'), - new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Six'), - new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Seven') + new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Four') ], ), Color(0xfff54b64), diff --git a/lib/Widgets/NestedOptionWidgetFormField.dart b/lib/Widgets/NestedOptionWidgetFormField.dart new file mode 100644 index 0000000..bf9286b --- /dev/null +++ b/lib/Widgets/NestedOptionWidgetFormField.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/NestedOptionsWidget.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:google_fonts/google_fonts.dart'; + +class NestedOptionWidgetFormField extends FormField> { + NestedOptionWidgetFormField( + {FormFieldSetter>? onSaved, + FormFieldValidator>? validator, + Function(List)? onChanged, + required context, + required String title, + required List nestedOptionData, + AutovalidateMode autoValidateMode = AutovalidateMode.onUserInteraction}) + : super( + initialValue: nestedOptionData, + onSaved: onSaved, + validator: validator ?? + (data) { + bool isSelected = false; + for (var i in data!) { + print(i.boxName); + print(i.isSelected); + isSelected |= i.isSelected; + } + if (!isSelected) { + return "Please choose an option"; + } + return null; + }, + builder: (state) { + return Card( + elevation: 5, + margin: EdgeInsets.only(top: 3, bottom: 3), + color: colors.darkScaffoldColor, + child: ListTile( + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => NestedOptionWidget( + title: "Select your options", + onChanged: (val) { + state.didChange(val); + state.validate(); + }, + nestedOptionData: state.value!, + ), + )); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + trailing: Icon( + Icons.arrow_right, + color: colors.darkSecondaryTextColor, + ), + title: state.hasError + ? Text( + state.errorText ?? "Please choose a value", + style: GoogleFonts.poppins(color: colors.errorColor), + ) + : Text( + "NO error", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 16), + ), + ), + ); + ; + }); +} diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index ca43e58..1c40698 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; From f2127b40e4454dde2d0bef7798e71628052b0384 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 17 Jan 2022 13:21:24 +0530 Subject: [PATCH 167/264] Added a new widget to get income with drop down to choose salary type - day, week, month --- lib/Screens/FamilyMemberAdd.dart | 101 +++++++++------ lib/Widgets/IncomeWithTypeTextField.dart | 117 +++++++++++++++++ lib/Widgets/NestedOptionWidgetFormField.dart | 113 +++++++++++----- lib/objectbox-model.json | 37 +++--- lib/objectbox.g.dart | 129 +++++++++---------- 5 files changed, 340 insertions(+), 157 deletions(-) create mode 100644 lib/Widgets/IncomeWithTypeTextField.dart diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 29af638..6bd35fd 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -9,6 +9,7 @@ import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/GenderWidget.dart'; +import 'package:geo_spatial/Widgets/IncomeWithTypeTextField.dart'; import 'package:geo_spatial/Widgets/NestedOptionWidgetFormField.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:geo_spatial/Widgets/StartingEndingTimeWidget.dart'; @@ -80,10 +81,10 @@ class _FamilyMemberAddState extends State { 'Unemployed': false, }; - var privateClinicReasons = { - 'Better treatment and personalised care' : false, - 'Easy to access' : false, - 'Less waiting time' : false + var privateClinicReasons = { + 'Better treatment and personalised care': false, + 'Easy to access': false, + 'Less waiting time': false }; @override @@ -143,6 +144,14 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ + IncomeWithTypeTextField( + onSaved: (textValue, option) { + print(textValue! + " " + option!); + }, + text: 'Income', + hintText: 'Enter income', + listOfOptions: ["Day", "Week", "Month"], + ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( @@ -333,18 +342,24 @@ class _FamilyMemberAddState extends State { val; }, ), - NestedOptionWidgetFormField(nestedOptionData: [ - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, boxName: 'One'), - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, boxName: 'Two'), - new NestedOptionData(subOptionDataMap: {"yes": true, "no": true}, - boxName: 'Three'), - new NestedOptionData( - subOptionDataMap: {"yes": false, "no": false}, - boxName: 'Four') - ], title: 'Select some options', context: context,), - + NestedOptionWidgetFormField( + nestedOptionData: [ + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, + boxName: 'One'), + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, + boxName: 'Two'), + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, + boxName: 'Three'), + new NestedOptionData( + subOptionDataMap: {"yes": false, "no": false}, + boxName: 'Four') + ], + title: 'Select some options', + context: context, + ), Padding( padding: EdgeInsets.all(15), child: StartingEndingTimeWidget( @@ -391,9 +406,12 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Padding(padding: const EdgeInsets.symmetric(horizontal: 10.0,vertical: 20.0), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 20.0), child: TextFormField( - initialValue: widget.familyMemberIndividualDataModel!.noOfDaysWorking, + initialValue: widget + .familyMemberIndividualDataModel!.noOfDaysWorking, keyboardType: TextInputType.number, autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, @@ -409,24 +427,25 @@ class _FamilyMemberAddState extends State { contentPadding: EdgeInsets.all(7.0), ), validator: (value) { - if (int.parse(value!)< 1) { + if (int.parse(value!) < 1) { return "Enter number of work days"; - } - else if(int.parse(value)>31){ + } else if (int.parse(value) > 31) { return "Enter a valid number of work days"; } }, onSaved: (val) { print(val.toString()); - widget.familyMemberIndividualDataModel!.noOfDaysWorking = - val; + widget.familyMemberIndividualDataModel! + .noOfDaysWorking = val; }, - ),), + ), + ), Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0,bottom: 20.0,top: 10.0), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 20.0, top: 10.0), child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.incomePerDay, + initialValue: widget + .familyMemberIndividualDataModel?.incomePerDay, keyboardType: TextInputType.number, autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, @@ -541,17 +560,17 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20), + padding: + const EdgeInsets.only(left: 10.0, right: 10.0, top: 20), child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, label: "Special Skills", hint: "Enter skills here", - initialValue: widget - .familyMemberIndividualDataModel!.specialSkills, + initialValue: + widget.familyMemberIndividualDataModel!.specialSkills, onSaved: (data) { - widget.familyMemberIndividualDataModel! - .specialSkills = data; + widget.familyMemberIndividualDataModel!.specialSkills = + data; }, validator: (value) { if (value == null || value.isEmpty) { @@ -696,8 +715,8 @@ class _FamilyMemberAddState extends State { Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( - defaultValue: widget.familyMemberIndividualDataModel! - .PHCServicesUsed, + defaultValue: widget + .familyMemberIndividualDataModel!.PHCServicesUsed, options: [ ["Yes", "yes"], ["No", "no"], @@ -707,7 +726,8 @@ class _FamilyMemberAddState extends State { .PHCServicesUsed = data; }, title: 'Using any PHC services?', - ),), + ), + ), Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( @@ -722,7 +742,8 @@ class _FamilyMemberAddState extends State { .privateClinicServicesUsed = data; }, title: 'Do you visit a private hospital?', - ),), + ), + ), ], ), Column( @@ -731,8 +752,8 @@ class _FamilyMemberAddState extends State { CheckBoxAddExtraAlertDialog( title: 'Reasons for using a private clinic', hint: 'Please choose a reason', - dataMap: widget - .familyMemberIndividualDataModel!.privateServiceReason ?? + dataMap: widget.familyMemberIndividualDataModel! + .privateServiceReason ?? privateClinicReasons, singleOption: false, context: context, @@ -815,4 +836,4 @@ class _FamilyMemberAddState extends State { } } -//TODO: Add tobacco products \ No newline at end of file +//TODO: Add tobacco products diff --git a/lib/Widgets/IncomeWithTypeTextField.dart b/lib/Widgets/IncomeWithTypeTextField.dart new file mode 100644 index 0000000..5d21c89 --- /dev/null +++ b/lib/Widgets/IncomeWithTypeTextField.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Utils/DarkTheme.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; + +class IncomeWithTypeTextField extends StatefulWidget { + IncomeWithTypeTextField({ + Key? key, + required this.onSaved, + this.initialValue, + required this.hintText, + required this.text, + this.validate, + required this.listOfOptions, + this.initialDropdownValue, + }) : super(key: key); + + final void Function(String?, String?) onSaved; + final initialValue; + final String hintText; + final String text; + final String Function(String?)? validate; + final List listOfOptions; + final String? initialDropdownValue; + + @override + State createState() => + _IncomeWithTypeTextFieldState(); +} + +class _IncomeWithTypeTextFieldState extends State { + late String chosenOption; + + initState() { + super.initState(); + chosenOption = widget.initialDropdownValue ?? widget.listOfOptions[0]; + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 10.0, right: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 3, + child: TextFormField( + initialValue: widget.initialValue, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + widget.text, + style: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + ), + hintText: widget.hintText, + hintStyle: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: widget.validate ?? + (value) { + if (value == "") { + return "Enter Income"; + } + }, + onSaved: (value) { + widget.onSaved(value, chosenOption); + }, + ), + ), + Expanded( + flex: 2, + child: Card( + color: colors.darkScaffoldColor, + elevation: 10, + child: DropdownButtonHideUnderline( + child: ButtonTheme( + alignedDropdown: true, + child: DropdownButton( + value: chosenOption, + dropdownColor: colors.darkScaffoldColor, + isExpanded: true, + items: widget.listOfOptions.map((value) { + return DropdownMenuItem( + value: value, + child: Container( + color: colors.darkScaffoldColor, + child: Text( + value, + overflow: TextOverflow.ellipsis, + ), + padding: EdgeInsets.only(left: 8), + ), + ); + }).toList(), + onChanged: (newValue) { + setState(() { + chosenOption = newValue; + }); + }, + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor, + decorationColor: colors.errorColor), + ), + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/Widgets/NestedOptionWidgetFormField.dart b/lib/Widgets/NestedOptionWidgetFormField.dart index bf9286b..210b69b 100644 --- a/lib/Widgets/NestedOptionWidgetFormField.dart +++ b/lib/Widgets/NestedOptionWidgetFormField.dart @@ -29,40 +29,85 @@ class NestedOptionWidgetFormField extends FormField> { return null; }, builder: (state) { - return Card( - elevation: 5, - margin: EdgeInsets.only(top: 3, bottom: 3), - color: colors.darkScaffoldColor, - child: ListTile( - onTap: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => NestedOptionWidget( - title: "Select your options", - onChanged: (val) { - state.didChange(val); - state.validate(); - }, - nestedOptionData: state.value!, - ), - )); - }, - //Pass a function which is called onSaved in the next page and add data to the class object - trailing: Icon( - Icons.arrow_right, - color: colors.darkSecondaryTextColor, - ), - title: state.hasError - ? Text( - state.errorText ?? "Please choose a value", - style: GoogleFonts.poppins(color: colors.errorColor), - ) - : Text( - "NO error", - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 16), - ), + getDisplayData() { + if (state.hasError) { + return Text( + state.errorText ?? "Please choose a value", + style: GoogleFonts.poppins(color: colors.errorColor), + ); + } else { + var selectedOptions = []; + for (var i in state.value!) { + if (i.isSelected) selectedOptions.add(i.boxName); + } + if (selectedOptions.isNotEmpty) { + return Text( + selectedOptions.join(", "), + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 16), + ); + } else { + return Text( + "Please choose a value", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 16), + ); + } + } + } + + return Padding( + padding: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 8), + child: Text(title, + style: GoogleFonts.montserrat( + fontSize: 15, + color: colors.darkPrimaryTextColor)), + ), + Card( + elevation: 5, + margin: EdgeInsets.only(top: 3, bottom: 3), + color: colors.darkScaffoldColor, + child: ListTile( + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => NestedOptionWidget( + title: title, + onChanged: (val) { + state.didChange(val); + state.validate(); + }, + nestedOptionData: state.value!, + ), + )); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + trailing: Icon( + Icons.arrow_right, + color: colors.darkSecondaryTextColor, + ), + title: getDisplayData()), + ), + state.hasError + ? Container( + padding: EdgeInsets.all(10), + child: Text( + state.errorText ?? "error", + style: GoogleFonts.poppins( + color: colors.errorColor, fontSize: 10), + ), + ) + : Container() + ], ), ); ; diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 921a1cd..14a1ddd 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -54,7 +54,7 @@ }, { "id": "2:4604626538020621410", - "lastPropertyId": "33:5419770240499089417", + "lastPropertyId": "36:6440758785035669475", "name": "FamilyMemberIndividualDataModel", "properties": [ { @@ -163,21 +163,6 @@ "name": "anganwadiServicesUsedList", "type": 30 }, - { - "id": "22:8089710746679848906", - "name": "PHCServicesUsedList", - "type": 30 - }, - { - "id": "23:4567441488943246138", - "name": "privateClinicServicesUsedList", - "type": 30 - }, - { - "id": "24:1321911158882624161", - "name": "privateServiceReason", - "type": 9 - }, { "id": "25:515443054774028092", "name": "useOfTobacco", @@ -217,6 +202,21 @@ "id": "33:5419770240499089417", "name": "workTimings", "type": 30 + }, + { + "id": "34:339180766123450759", + "name": "noOfDaysWorking", + "type": 9 + }, + { + "id": "35:239463832765470197", + "name": "PHCServicesUsed", + "type": 9 + }, + { + "id": "36:6440758785035669475", + "name": "privateClinicServicesUsed", + "type": 9 } ], "relations": [] @@ -408,7 +408,10 @@ "retiredPropertyUids": [ 961043903550204529, 6821885131227205219, - 3511831625273329956 + 3511831625273329956, + 8089710746679848906, + 4567441488943246138, + 1321911158882624161 ], "retiredRelationUids": [], "version": 1 diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index d864f39..d1d82d1 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -67,7 +67,7 @@ final _entities = [ ModelEntity( id: const IdUid(2, 4604626538020621410), name: 'FamilyMemberIndividualDataModel', - lastPropertyId: const IdUid(33, 5419770240499089417), + lastPropertyId: const IdUid(36, 6440758785035669475), flags: 0, properties: [ ModelProperty( @@ -175,21 +175,6 @@ final _entities = [ name: 'anganwadiServicesUsedList', type: 30, flags: 0), - ModelProperty( - id: const IdUid(22, 8089710746679848906), - name: 'PHCServicesUsedList', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(23, 4567441488943246138), - name: 'privateClinicServicesUsedList', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(24, 1321911158882624161), - name: 'privateServiceReason', - type: 9, - flags: 0), ModelProperty( id: const IdUid(25, 515443054774028092), name: 'useOfTobacco', @@ -229,6 +214,21 @@ final _entities = [ id: const IdUid(33, 5419770240499089417), name: 'workTimings', type: 30, + flags: 0), + ModelProperty( + id: const IdUid(34, 339180766123450759), + name: 'noOfDaysWorking', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(35, 239463832765470197), + name: 'PHCServicesUsed', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(36, 6440758785035669475), + name: 'privateClinicServicesUsed', + type: 9, flags: 0) ], relations: [], @@ -438,7 +438,10 @@ ModelDefinition getObjectBoxModel() { retiredPropertyUids: const [ 961043903550204529, 6821885131227205219, - 3511831625273329956 + 3511831625273329956, + 8089710746679848906, + 4567441488943246138, + 1321911158882624161 ], retiredRelationUids: const [], modelVersion: 5, @@ -591,20 +594,6 @@ ModelDefinition getObjectBoxModel() { : fbb.writeList(object.anganwadiServicesUsedList! .map(fbb.writeString) .toList(growable: false)); - final PHCServicesUsedListOffset = object.PHCServicesUsedList == null - ? null - : fbb.writeList(object.PHCServicesUsedList! - .map(fbb.writeString) - .toList(growable: false)); - final privateClinicServicesUsedListOffset = - object.privateClinicServicesUsedList == null - ? null - : fbb.writeList(object.privateClinicServicesUsedList! - .map(fbb.writeString) - .toList(growable: false)); - final privateServiceReasonOffset = object.privateServiceReason == null - ? null - : fbb.writeString(object.privateServiceReason!); final useOfTobaccoOffset = object.useOfTobacco == null ? null : fbb.writeString(object.useOfTobacco!); @@ -628,7 +617,17 @@ ModelDefinition getObjectBoxModel() { : fbb.writeList(object.workTimings! .map(fbb.writeString) .toList(growable: false)); - fbb.startTable(34); + final noOfDaysWorkingOffset = object.noOfDaysWorking == null + ? null + : fbb.writeString(object.noOfDaysWorking!); + final PHCServicesUsedOffset = object.PHCServicesUsed == null + ? null + : fbb.writeString(object.PHCServicesUsed!); + final privateClinicServicesUsedOffset = + object.privateClinicServicesUsed == null + ? null + : fbb.writeString(object.privateClinicServicesUsed!); + fbb.startTable(37); fbb.addInt64(0, object.id); fbb.addOffset(1, userNameOffset); fbb.addInt64(2, object.dateOfBirth?.millisecondsSinceEpoch); @@ -650,9 +649,6 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(18, anganwadiServicesAwareOffset); fbb.addOffset(19, anganwadiServicesUsingOffset); fbb.addOffset(20, anganwadiServicesUsedListOffset); - fbb.addOffset(21, PHCServicesUsedListOffset); - fbb.addOffset(22, privateClinicServicesUsedListOffset); - fbb.addOffset(23, privateServiceReasonOffset); fbb.addOffset(24, useOfTobaccoOffset); fbb.addOffset(25, useOfAlcoholOffset); fbb.addOffset(26, aarogyaSetuInstalledOffset); @@ -661,6 +657,9 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(30, dbVulnerabilitiesOffset); fbb.addOffset(31, dbOccupationOffset); fbb.addOffset(32, workTimingsOffset); + fbb.addOffset(33, noOfDaysWorkingOffset); + fbb.addOffset(34, PHCServicesUsedOffset); + fbb.addOffset(35, privateClinicServicesUsedOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -717,14 +716,6 @@ ModelDefinition getObjectBoxModel() { ..anganwadiServicesUsedList = const fb.ListReader(fb.StringReader(), lazy: false) .vTableGetNullable(buffer, rootOffset, 44) - ..PHCServicesUsedList = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 46) - ..privateClinicServicesUsedList = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 48) - ..privateServiceReason = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 50) ..useOfTobacco = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 52) ..useOfAlcohol = const fb.StringReader() @@ -741,7 +732,13 @@ ModelDefinition getObjectBoxModel() { .vTableGetNullable(buffer, rootOffset, 66) ..workTimings = const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 68); + .vTableGetNullable(buffer, rootOffset, 68) + ..noOfDaysWorking = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 70) + ..PHCServicesUsed = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 72) + ..privateClinicServicesUsed = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 74); return object; }), @@ -1104,59 +1101,59 @@ class FamilyMemberIndividualDataModel_ { QueryStringVectorProperty( _entities[1].properties[20]); - /// see [FamilyMemberIndividualDataModel.PHCServicesUsedList] - static final PHCServicesUsedList = - QueryStringVectorProperty( - _entities[1].properties[21]); - - /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsedList] - static final privateClinicServicesUsedList = - QueryStringVectorProperty( - _entities[1].properties[22]); - - /// see [FamilyMemberIndividualDataModel.privateServiceReason] - static final privateServiceReason = - QueryStringProperty( - _entities[1].properties[23]); - /// see [FamilyMemberIndividualDataModel.useOfTobacco] static final useOfTobacco = QueryStringProperty( - _entities[1].properties[24]); + _entities[1].properties[21]); /// see [FamilyMemberIndividualDataModel.useOfAlcohol] static final useOfAlcohol = QueryStringProperty( - _entities[1].properties[25]); + _entities[1].properties[22]); /// see [FamilyMemberIndividualDataModel.aarogyaSetuInstalled] static final aarogyaSetuInstalled = QueryStringProperty( - _entities[1].properties[26]); + _entities[1].properties[23]); /// see [FamilyMemberIndividualDataModel.vizhithiruInstalled] static final vizhithiruInstalled = QueryStringProperty( - _entities[1].properties[27]); + _entities[1].properties[24]); /// see [FamilyMemberIndividualDataModel.dataValid] static final dataValid = QueryBooleanProperty( - _entities[1].properties[28]); + _entities[1].properties[25]); /// see [FamilyMemberIndividualDataModel.dbVulnerabilities] static final dbVulnerabilities = QueryStringProperty( - _entities[1].properties[29]); + _entities[1].properties[26]); /// see [FamilyMemberIndividualDataModel.dbOccupation] static final dbOccupation = QueryStringProperty( - _entities[1].properties[30]); + _entities[1].properties[27]); /// see [FamilyMemberIndividualDataModel.workTimings] static final workTimings = QueryStringVectorProperty( + _entities[1].properties[28]); + + /// see [FamilyMemberIndividualDataModel.noOfDaysWorking] + static final noOfDaysWorking = + QueryStringProperty( + _entities[1].properties[29]); + + /// see [FamilyMemberIndividualDataModel.PHCServicesUsed] + static final PHCServicesUsed = + QueryStringProperty( + _entities[1].properties[30]); + + /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsed] + static final privateClinicServicesUsed = + QueryStringProperty( _entities[1].properties[31]); } From b2f07a8c70a7fb36edf93f71eba7d6048504c8fc Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 17 Jan 2022 13:22:11 +0530 Subject: [PATCH 168/264] Removed debug card --- lib/Screens/Home.dart | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 6cf496a..52b821b 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -154,31 +154,6 @@ class _HomeWidgetState extends State { SavedDataPage(), Color(0xfff54b64), Color(0xfff78361)), - DataCard( - 'Debug Card', - 'Debug and test pages here', - 'assets/svg/houses.svg', - //FamilyHomeScreen(), - NestedOptionWidget( - title: "Select your options", - onChanged: (val){ - for(var i in val){ - print(i.boxName); - print(i.subOptionDataMap.toString()); - print(i.isSelected); - print("\n"); - } - print(val); - }, - nestedOptionData: [ - new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'One'), - new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Two'), - new NestedOptionData(subOptionDataMap: {"yes" : true, "no" : true}, boxName: 'Three'), - new NestedOptionData(subOptionDataMap: {"yes" : false, "no" : false}, boxName: 'Four') - ], - ), - Color(0xfff54b64), - Color(0xfff78361)), ], ), ), From dd96c8a359b6c88e3bc71a7f490909639944fddc Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 17 Jan 2022 13:47:17 +0530 Subject: [PATCH 169/264] Fixed exception in Family Member Add and removed route to village page --- lib/Screens/FamilyMemberAdd.dart | 5 ++++- lib/Screens/Home.dart | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 6bd35fd..b3878a6 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -427,7 +427,10 @@ class _FamilyMemberAddState extends State { contentPadding: EdgeInsets.all(7.0), ), validator: (value) { - if (int.parse(value!) < 1) { + print(value); + print("value"); + if(value == null || value == "") return "Please enter number of work days"; + else if (int.parse(value) < 1) { return "Enter number of work days"; } else if (int.parse(value) > 31) { return "Enter a valid number of work days"; diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 52b821b..6fd2db2 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; +import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Screens/NestedOptionsWidget.dart'; import 'package:geo_spatial/Screens/VillageSelection.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -89,7 +90,7 @@ class _HomeWidgetState extends State { 'Individual data entry for everyone in home', 'assets/svg/female.svg', //FamilyHomeScreen(), - VillageSelectionScreen(), + FamilyHomeScreen(), Color(0xfff54b64), Color(0xfff78361)), DataCard( From 69269f223164da61650a7361faa1e183ed257de6 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 17 Jan 2022 14:09:42 +0530 Subject: [PATCH 170/264] Added a widget to conditionally render for options widget --- lib/Screens/FamilyMemberAdd.dart | 52 +++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index b3878a6..99b3b46 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -5,6 +5,7 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; +import 'package:geo_spatial/Widgets/ConditionalRenderWidget.dart'; import 'package:geo_spatial/Widgets/DatePickerWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; @@ -327,6 +328,45 @@ class _FamilyMemberAddState extends State { errorField: "Please choose an occupation / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), + /** + * Example widget for conditional rendering + */ + ConditionalRenderWidget( + title: "Select data", + defaultValue: + widget.familyMemberIndividualDataModel!.dailyWageWorker, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.familyMemberIndividualDataModel!.dailyWageWorker = + val; + }, + conditionalValue: 'yes', + conditionalWidget: NestedOptionWidgetFormField( + nestedOptionData: [ + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, + boxName: 'One'), + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, + boxName: 'Two'), + new NestedOptionData( + subOptionDataMap: {"yes": true, "no": true}, + boxName: 'Three'), + new NestedOptionData( + subOptionDataMap: {"yes": false, "no": false}, + boxName: 'Four') + ], + title: 'Select some options', + context: context, + ), + ), + /** + * Ends here + */ OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel!.dailyWageWorker, @@ -335,6 +375,15 @@ class _FamilyMemberAddState extends State { ["Yes", "yes"], ["No", "no"] ], + onChanged: (val) { + if (val == "yes") { + print("SELECTED TRUE VAL"); + } + + setState(() { + dailyWageWorker = val == "yes"; + }); + }, title: "Daily wage worker?", onSaved: (val) { print("Value recorded: $val"); @@ -429,7 +478,8 @@ class _FamilyMemberAddState extends State { validator: (value) { print(value); print("value"); - if(value == null || value == "") return "Please enter number of work days"; + if (value == null || value == "") + return "Please enter number of work days"; else if (int.parse(value) < 1) { return "Enter number of work days"; } else if (int.parse(value) > 31) { From 40cb5bb7e6b1f8902d2a98c75c4df8e4442e9c3c Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 17 Jan 2022 14:09:50 +0530 Subject: [PATCH 171/264] Added a widget to conditionally render for options widget --- lib/Widgets/ConditionalRenderWidget.dart | 55 ++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 lib/Widgets/ConditionalRenderWidget.dart diff --git a/lib/Widgets/ConditionalRenderWidget.dart b/lib/Widgets/ConditionalRenderWidget.dart new file mode 100644 index 0000000..9375e96 --- /dev/null +++ b/lib/Widgets/ConditionalRenderWidget.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; + +class ConditionalRenderWidget extends StatefulWidget { + const ConditionalRenderWidget( + {Key? key, + this.defaultValue, + this.onSaved, + required this.title, + required this.conditionalWidget, + required this.options, + required this.conditionalValue}) + : super(key: key); + + final defaultValue; + final String conditionalValue; + final String title; + final List options; + final Function(dynamic)? onSaved; + final Widget conditionalWidget; + + @override + _ConditionalRenderWidgetState createState() => + _ConditionalRenderWidgetState(); +} + +class _ConditionalRenderWidgetState extends State { + //(widget.defaultValue == widget.conditionalValue) + //TODO: Add a check condition to see if default value equals conditional value and update isVisible + bool isVisible = false; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + OptionsWidget( + defaultValue: widget.defaultValue, + autoValidateMode: AutovalidateMode.onUserInteraction, + options: widget.options, + onChanged: (val) { + setState(() { + isVisible = (val == widget.conditionalValue); + }); + }, + title: widget.title, + onSaved: widget.onSaved, + ), + Visibility( + child: widget.conditionalWidget, + visible: isVisible, + ) + ], + ); + } +} From 7c2c9ddaf2a58706cf44cfb11bbcdc11fa0712ea Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 18 Jan 2022 16:36:05 +0530 Subject: [PATCH 172/264] Added progress bar for login page --- lib/Screens/Login.dart | 69 +++++++++++++++++++++++----------------- lib/Utils/DarkTheme.dart | 2 +- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 8afdb1f..d29d27a 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -25,8 +25,7 @@ class _MyAppState extends State { var _nameError = null; var _passwordError = null; bool _isSelected = false; - - + bool _isLoading = false; @override void initState() { @@ -99,6 +98,9 @@ class _MyAppState extends State { (Route route) => false); } } + setState(() { + _isLoading = false; + }); } Widget radioButton(bool isSelected) => Container( @@ -118,7 +120,6 @@ class _MyAppState extends State { : Container(), ); - @override Widget build(BuildContext context) { return Scaffold( @@ -127,7 +128,10 @@ class _MyAppState extends State { body: Stack( fit: StackFit.expand, children: [ - SvgPicture.asset("assets/svg/background.svg",fit: BoxFit.cover,), + SvgPicture.asset( + "assets/svg/background.svg", + fit: BoxFit.cover, + ), SingleChildScrollView( child: Padding( padding: EdgeInsets.only(left: 20.0, right: 20.0), @@ -162,34 +166,39 @@ class _MyAppState extends State { fontSize: 14.0)) ], ), - InkWell( - child: Container( - width: 100, - height: 45, - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Color(0xfff54b64), - Color(0xfff78361), - ]), - borderRadius: BorderRadius.circular(30.0), - ), - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: () { - _login(); - }, - child: Center( - child: Text("SIGN IN", - style: GoogleFonts.poppins( - color: Colors.white, - fontSize: 18, - letterSpacing: 1.0)), + _isLoading + ? Padding(padding: EdgeInsets.only(right: 10) ,child: CircularProgressIndicator()) + : InkWell( + child: Container( + width: 100, + height: 45, + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + Color(0xfff54b64), + Color(0xfff78361), + ]), + borderRadius: BorderRadius.circular(30.0), + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + setState(() { + _isLoading = true; + }); + _login(); + }, + child: Center( + child: Text("SIGN IN", + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 18, + letterSpacing: 1.0)), + ), + ), + ), ), ), - ), - ), - ), ], ), ], diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 21606a4..60192da 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -8,7 +8,7 @@ class darkTheme{ fontFamily: 'Poppins', primaryColor: Colors.white, scaffoldBackgroundColor: colors.darkScaffoldColor, - + progressIndicatorTheme: ProgressIndicatorThemeData(color: colors.darkAccentColor), textTheme: TextTheme( headline1: GoogleFonts.poppins(color: Colors.white, fontSize: 40,fontWeight: FontWeight.w200), bodyText1: GoogleFonts.poppins(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w100), From 947dcb5a6d1e57fc0f129b9ee6c66131887bb915 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 18 Jan 2022 16:49:16 +0530 Subject: [PATCH 173/264] Added progress bar for login page, added icon button to show/hide password --- lib/Widgets/LoginFormCard.dart | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/lib/Widgets/LoginFormCard.dart b/lib/Widgets/LoginFormCard.dart index 3ae9cf4..d13e5c0 100644 --- a/lib/Widgets/LoginFormCard.dart +++ b/lib/Widgets/LoginFormCard.dart @@ -3,7 +3,7 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; -class FormCard extends StatelessWidget { +class FormCard extends StatefulWidget { FormCard(this._usernameController, this._passwordController, this._nameError, this._passwordError); @@ -12,6 +12,14 @@ class FormCard extends StatelessWidget { final _nameError; final _passwordError; + @override + State createState() => _FormCardState(); +} + +class _FormCardState extends State { + + var _showPassword = false; + @override Widget build(BuildContext context) { return new Container( @@ -31,7 +39,7 @@ class FormCard extends StatelessWidget { ), TextField( style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - controller: _usernameController, + controller: widget._usernameController, decoration: InputDecoration( hintText: "Enter username here", hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), @@ -50,7 +58,7 @@ class FormCard extends StatelessWidget { // ), floatingLabelStyle: GoogleFonts.poppins(color: colors.darkAccentColor), - errorText: _nameError, + errorText: widget._nameError, labelStyle: GoogleFonts.poppins(fontSize: 14)), cursorColor: colors.darkPrimaryTextColor, ), @@ -58,10 +66,21 @@ class FormCard extends StatelessWidget { height: 40, ), TextField( - controller: _passwordController, - obscureText: true, + controller: widget._passwordController, + obscureText: !_showPassword, style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), decoration: InputDecoration( + suffixIcon: IconButton(onPressed: () { + setState(() { + _showPassword = !_showPassword; + }); + }, + icon: Icon( + _showPassword ? Icons.visibility_off : Icons.visibility, + color: colors.darkAccentColor, + ), + + ), hintText: "Enter password here", hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), focusColor: Color(0xffF5A06D), @@ -80,7 +99,7 @@ class FormCard extends StatelessWidget { style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor)), floatingLabelStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), - errorText: _passwordError, + errorText: widget._passwordError, labelStyle: GoogleFonts.poppins(fontSize: 14.0,color: colors.darkAccentColor), )), SizedBox( From d7e277c4d5dde6b367726f5748c2f27748a2842a Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 18 Jan 2022 17:06:34 +0530 Subject: [PATCH 174/264] Added toast message to display on network errors while making request to login --- lib/Screens/Login.dart | 38 ++++++++++++++++++++++++++------------ lib/main.dart | 11 +++++++---- pubspec.lock | 7 +++++++ pubspec.yaml | 1 + 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index d29d27a..08c1f27 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -10,6 +10,7 @@ import 'package:geo_spatial/Utils/colors.dart' as colors; import 'package:geo_spatial/Widgets/LoginFormCard.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import 'package:oktoast/oktoast.dart'; final storage = FlutterSecureStorage(); @@ -59,6 +60,8 @@ class _MyAppState extends State { var res = await http.post(Uri.https(url, '/api/login'), headers: {"Content-Type": "application/json"}, body: body); + print("RES: ${res}"); + return res; } @@ -85,17 +88,26 @@ class _MyAppState extends State { }); if (_nameError == null && _passwordError == null) { - http.Response loginResponse = await _makeLoginRequest(username, password); - if (loginResponse.statusCode != 200) { - setState(() { - _nameError = loginResponse.body; - _passwordError = loginResponse.body; - }); - } else { - storage.write(key: "jwt", value: loginResponse.body); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Home()), - (Route route) => false); + try { + http.Response loginResponse = + await _makeLoginRequest(username, password); + if (loginResponse.statusCode != 200) { + setState(() { + _nameError = loginResponse.body; + _passwordError = loginResponse.body; + }); + } else { + storage.write(key: "jwt", value: loginResponse.body); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Home()), + (Route route) => false); + } + } catch (e) { + print(e); + showToast( + "Something went wrong, please check your network connection or try again later", + position: ToastPosition.center, + backgroundColor: colors.darkAccentColor); } } setState(() { @@ -167,7 +179,9 @@ class _MyAppState extends State { ], ), _isLoading - ? Padding(padding: EdgeInsets.only(right: 10) ,child: CircularProgressIndicator()) + ? Padding( + padding: EdgeInsets.only(right: 10), + child: CircularProgressIndicator()) : InkWell( child: Container( width: 100, diff --git a/lib/main.dart b/lib/main.dart index 2f39c71..e50ef4f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:geo_spatial/Screens/Home.dart'; import 'package:flutter/services.dart'; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/LoadValidPageWidget.dart'; +import 'package:oktoast/oktoast.dart'; final storage = FlutterSecureStorage(); @@ -13,10 +14,12 @@ void main() { SystemChrome.setPreferredOrientations( [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); - runApp(MaterialApp( - home: LoadValidPageWidget(Login(), Home()), - debugShowCheckedModeBanner: false, - theme: darkTheme.DarkTheme + runApp(OKToast( + child: MaterialApp( + home: LoadValidPageWidget(Login(), Home()), + debugShowCheckedModeBanner: false, + theme: darkTheme.DarkTheme + ), )); } diff --git a/pubspec.lock b/pubspec.lock index 8dc0230..087ccbc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -450,6 +450,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + oktoast: + dependency: "direct main" + description: + name: oktoast + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.5" package_config: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f666bd9..467fa6b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ environment: sdk: ">=2.12.0 <3.0.0" dependencies: + oktoast: ^3.1.5 preload_page_view: ^0.1.6 flutter_typeahead: ^3.2.4 objectbox: ^1.3.0 From 4aa1b037d7a301536b29bfb7d96be89c9f4c9f95 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 18 Jan 2022 19:05:40 +0530 Subject: [PATCH 175/264] Implemented all widgets --- lib/Model/FamilyMembersCommonDataModel.dart | 21 +-- lib/Screens/FamilyDetails.dart | 61 +++++++- lib/Screens/FamilyMemberAdd.dart | 136 ++++++++++-------- lib/Screens/Home.dart | 2 +- lib/Widgets/AddRemoveBoxWidget.dart | 2 +- lib/Widgets/GenderWidget.dart | 17 ++- lib/Widgets/NestedOptionWidgetFormField.dart | 3 +- .../NestedOptionsWidget.dart | 0 lib/objectbox-model.json | 20 +-- lib/objectbox.g.dart | 92 +++--------- 10 files changed, 177 insertions(+), 177 deletions(-) rename lib/{Screens => Widgets}/NestedOptionsWidget.dart (100%) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index a4f9e68..72b4a7e 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -32,11 +32,8 @@ class FamilyMemberIndividualDataModel { String? pension; String? businessStatus; String? maritalStatus; - String? noOfDaysWorking; + String? noOfDaysWorking; //TODO: Inform Change List? specialSkills; - List? frequentAilments; - List? commutableDisease; - List? nonCommutableDisease; List? workTimings; String? surgeries; String? anganwadiServicesAware; @@ -44,7 +41,10 @@ class FamilyMemberIndividualDataModel { List? anganwadiServicesUsedList; String? PHCServicesUsed; //TODO: Inform Change String? privateClinicServicesUsed; //TODO: Inform Change - Map? privateServiceReason; //TODO: Inform Change + Map? privateServiceReason; //TODO: Inform Change, write get set functions + Map? communicableDiseases; //TODO: Write get set functions + Map? frequentAilments; //TODO: Inform change, write functions + Map? nonCommunicableDiseases; //TODO: Inform change, write functions String? useOfTobacco; String? useOfAlcohol; String? aarogyaSetuInstalled; @@ -77,16 +77,16 @@ class FamilyMemberIndividualDataModel { "workTimings": workTimings, "maritalStatus": maritalStatus, "specialSkills": specialSkills, - "frequentHealthAilments": frequentAilments, - "communicableDiseases": commutableDisease, - "nonCommunicableDiseases": nonCommutableDisease, + "frequentHealthAilments": frequentAilments!= null ? buildListForOptionWidget(frequentAilments!) : [], + "communicableDiseases": communicableDiseases!= null ? buildListForOptionWidget(communicableDiseases!) : [], + "nonCommunicableDiseases": nonCommunicableDiseases!=null ? buildListForOptionWidget(nonCommunicableDiseases!) : [], "surgeriesUndergone": surgeries, "anganwadiServicesAware": anganwadiServicesAware, "anganwadiServicesUsed": anganwadiServicesUsing, "anganwadiServicesUtilised": anganwadiServicesUsedList, "phcServicesUtilised": PHCServicesUsed, "privateHealthClinicFacilitiesUsed": privateClinicServicesUsed, - "reasonsForVisitingPrivateHealthClinic": privateServiceReason, + "reasonsForVisitingPrivateHealthClinic": privateServiceReason!= null ? buildListForOptionWidget(privateServiceReason!) : [], "tobaccoBasedProductsUsage": useOfTobacco, "alcoholConsumption": useOfAlcohol, "businessStatus": businessStatus, @@ -142,6 +142,7 @@ class FamilyMembersCommonDataModel { Map? twoThreeWheelManufacturer; Map? twoFourManufacturer; Map? localFoodMap; + Map? noToiletsWhy; //TODO: Write set get functions String? isCattleOwned; String? incomeFromCattle; String? isFarmLandOwned; @@ -191,6 +192,8 @@ class FamilyMembersCommonDataModel { "areToiletsAvailableInHouse": toiletFacility, + "noToiletsWhy" : noToiletsWhy != null ? buildListForOptionWidget(noToiletsWhy!) : [], //TODO: Inform change + "availabilityOfWaterInToilets": String, "alternativeForHouseholdToilet": String, diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index c41146c..cd62d4d 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -4,7 +4,6 @@ import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; -import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; @@ -74,9 +73,17 @@ class _FamilyDetailsState extends State { 'None': false }; + var noToiletsWhy = { + 'Lack of space' : false, + 'Lack of money' : false, + 'Habit of open defecation' : false, + 'Using community toilets' : false + }; + var seeds_preserved = { - 'yes': false, - 'no': false, + 'Country Seeds': false, + 'Indigenous Seeds': false, + 'Hybrid Seeds' : false }; var local_food = { @@ -85,13 +92,28 @@ class _FamilyDetailsState extends State { }; var trees_owned = { - 'yes': false, - 'no': false, + 'Moringa Tree' : false, + 'Guava Tree' : false, + 'Papaya Tree' : false, + 'Pomegranate Tree' : false, + 'Custard Apple Tree' : false, + 'Banana' : false, + 'Indian Gooseberry': false }; var garden_plants = { - 'yes': false, - 'no': false, + 'Tapioca' : false, + 'Tomato' : false, + 'Brinjal' : false, + 'Ladies finger' : false, + 'Chili' : false, + 'Mint' : false, + 'Spinach' : false, + 'Ridge Guard' : false, + 'Bitter Guard' : false, + 'Cluster Beans' : false, + 'Long Beans' : false, + 'Snake Guard' : false }; var water_sources = { @@ -107,6 +129,7 @@ class _FamilyDetailsState extends State { }; var incomeFromCattleEnabled = false; + var toiletFacility = false; @override Widget build(BuildContext context) { @@ -204,12 +227,36 @@ class _FamilyDetailsState extends State { ['Yes', 'yes'], ['No', 'no'] ], + onChanged: (val){ + if(val=='yes') + toiletFacility = true; + }, defaultValue: widget.modelData!.toiletFacility, onSaved: (val) { print("Value recorded: $val"); widget.modelData!.toiletFacility = val; + setState(() { + + }); }, title: "Do you have toilet facilities?"), + if(!toiletFacility) + CheckBoxAddExtraAlertDialog( + title: 'Why do you not have a toilet?', + hint: 'Please choose reason', + singleOption: false, + context: context, + dataMap: + widget.modelData!.twoThreeWheelManufacturer ?? + two_three_mfg, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.twoThreeWheelManufacturer = val; + }, + errorField: "Please choose a reason", + autoValidateMode: + AutovalidateMode.onUserInteraction, + ), OptionsWidget( options: [ ['Yes', 'yes'], diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 99b3b46..e4e45b5 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; -import 'package:geo_spatial/Screens/NestedOptionsWidget.dart'; +import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; @@ -58,14 +58,14 @@ class _FamilyMemberAddState extends State { int count = 0; var vulnerabilities = { - 'Widower': false, + 'Widower (M)': false, + 'Widow (F)' : false, 'Divorcee': false, - 'Differently Able': false, + 'Differently Abled': false, 'Pregnant Woman': false, 'Lactating Mother': false, 'Elderly (>60 years)': false, 'Children below 2 years': false, - 'Others': false, 'None': false }; @@ -88,6 +88,28 @@ class _FamilyMemberAddState extends State { 'Less waiting time': false }; + var frequentAilments = { + 'Cold and Flu' : false, + 'Diarrhoea' : false, + 'Headaches' : false, + 'Fever' : false + }; + + var communicableDiseases = { + 'COVID' : false, + 'Typhoid' : false, + 'Dengue' : false, + 'Malaria' : false, + 'HIV/AIDS' : false + }; + + var nonCommunicableDiseases = { + 'Cardiovascular disease' : false, + 'Diabetes' : false, + 'Preventable cancers' : false, + 'Hypertension' : false + }; + @override Widget build(BuildContext context) { return WillPopScope( @@ -633,71 +655,59 @@ class _FamilyMemberAddState extends State { }, ), ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Frequent ailments", - hint: "Enter ailments here", - initialValue: widget - .familyMemberIndividualDataModel!.frequentAilments, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .frequentAilments = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), + CheckBoxAddExtraAlertDialog( + title: 'Frequent ailments', + hint: 'Please choose the applicable', + //TODO: Write db functions + dataMap: widget.familyMemberIndividualDataModel! + .frequentAilments ?? + frequentAilments, + singleOption: false, + context: context, + onSaved: (map) { + widget.familyMemberIndividualDataModel!.frequentAilments = + map; + }, + errorField: "Please choose ailments/None", + autoValidateMode: AutovalidateMode.onUserInteraction, ), SizedBox( height: 20, ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Communicable Diseases", - hint: "Enter diseases here", - initialValue: widget - .familyMemberIndividualDataModel!.commutableDisease, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .commutableDisease = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), + CheckBoxAddExtraAlertDialog( + title: 'Communicable diseases', + hint: 'Please choose the applicable', + //TODO: Write db functions + dataMap: widget.familyMemberIndividualDataModel! + .communicableDiseases?? + communicableDiseases, + singleOption: false, + context: context, + onSaved: (map) { + widget.familyMemberIndividualDataModel!.communicableDiseases = + map; + }, + errorField: "Please choose diseases/None", + autoValidateMode: AutovalidateMode.onUserInteraction, ), SizedBox( height: 20, ), - Padding( - padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 30), - child: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Non-communicable diseases", - hint: "Enter diseases here", - initialValue: widget.familyMemberIndividualDataModel! - .nonCommutableDisease, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .nonCommutableDisease = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), + CheckBoxAddExtraAlertDialog( + title: 'Non Communicable diseases', + hint: 'Please choose the applicable', + //TODO: Write db functions + dataMap: widget.familyMemberIndividualDataModel! + .nonCommunicableDiseases?? + nonCommunicableDiseases, + singleOption: false, + context: context, + onSaved: (map) { + widget.familyMemberIndividualDataModel!.nonCommunicableDiseases = + map; + }, + errorField: "Please choose diseases/None", + autoValidateMode: AutovalidateMode.onUserInteraction, ), Padding( padding: const EdgeInsets.all(20.0), @@ -811,10 +821,10 @@ class _FamilyMemberAddState extends State { singleOption: false, context: context, onSaved: (map) { - widget.familyMemberIndividualDataModel!.vulnerabilities = + widget.familyMemberIndividualDataModel!.privateServiceReason = map; }, - errorField: "Please choose a vulnerability / None", + errorField: "Please choose a reason", autoValidateMode: AutovalidateMode.onUserInteraction, ), OptionsWidget( diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 6fd2db2..4a8f2e9 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; -import 'package:geo_spatial/Screens/NestedOptionsWidget.dart'; +import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; import 'package:geo_spatial/Screens/VillageSelection.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 08a4c3d..459c6bd 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -76,8 +76,8 @@ class _AddRemoveBoxWidgetState extends State { .individualDataListTransient .elementAt(index)))); }, - //Pass a function which is called onSaved in the next page and add data to the class object leading: Icon(Icons.person), + //TODO: Replace User n with user's name title: Text( "User ${index + 1}", style: GoogleFonts.poppins( diff --git a/lib/Widgets/GenderWidget.dart b/lib/Widgets/GenderWidget.dart index dcae8b4..f889ff3 100644 --- a/lib/Widgets/GenderWidget.dart +++ b/lib/Widgets/GenderWidget.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:google_fonts/google_fonts.dart'; class GenderPickerWidget extends FormField { GenderPickerWidget( @@ -86,12 +88,15 @@ class GenderWidget extends StatelessWidget { child: SvgPicture.asset(assetPath), ), ), - Padding( - padding: EdgeInsets.only(left: 4, right: 10), - child: Text( - gender, - style: TextStyle(fontSize: 13), - )) + Container( + child: Padding( + padding: EdgeInsets.only(left: 4, right: 15), + child: Chip( + backgroundColor: state.value == gender ? successColor ?? colors.successColor : colors.darkScaffoldColor, + label: Text(gender), + labelStyle: GoogleFonts.poppins(fontSize: 13,color: colors.darkPrimaryTextColor,fontWeight: state.value == gender ? FontWeight.bold : FontWeight.normal), + )), + ) ], ), ); diff --git a/lib/Widgets/NestedOptionWidgetFormField.dart b/lib/Widgets/NestedOptionWidgetFormField.dart index 210b69b..2f5f848 100644 --- a/lib/Widgets/NestedOptionWidgetFormField.dart +++ b/lib/Widgets/NestedOptionWidgetFormField.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Screens/NestedOptionsWidget.dart'; +import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; + class NestedOptionWidgetFormField extends FormField> { NestedOptionWidgetFormField( {FormFieldSetter>? onSaved, diff --git a/lib/Screens/NestedOptionsWidget.dart b/lib/Widgets/NestedOptionsWidget.dart similarity index 100% rename from lib/Screens/NestedOptionsWidget.dart rename to lib/Widgets/NestedOptionsWidget.dart diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 14a1ddd..93732aa 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -128,21 +128,6 @@ "name": "specialSkills", "type": 30 }, - { - "id": "15:1780571115080959247", - "name": "frequentAilments", - "type": 30 - }, - { - "id": "16:5383502869453245964", - "name": "commutableDisease", - "type": 30 - }, - { - "id": "17:2820386840249227222", - "name": "nonCommutableDisease", - "type": 30 - }, { "id": "18:2506597441281996495", "name": "surgeries", @@ -411,7 +396,10 @@ 3511831625273329956, 8089710746679848906, 4567441488943246138, - 1321911158882624161 + 1321911158882624161, + 1780571115080959247, + 5383502869453245964, + 2820386840249227222 ], "retiredRelationUids": [], "version": 1 diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index d1d82d1..0728ea6 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -140,21 +140,6 @@ final _entities = [ name: 'specialSkills', type: 30, flags: 0), - ModelProperty( - id: const IdUid(15, 1780571115080959247), - name: 'frequentAilments', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(16, 5383502869453245964), - name: 'commutableDisease', - type: 30, - flags: 0), - ModelProperty( - id: const IdUid(17, 2820386840249227222), - name: 'nonCommutableDisease', - type: 30, - flags: 0), ModelProperty( id: const IdUid(18, 2506597441281996495), name: 'surgeries', @@ -441,7 +426,10 @@ ModelDefinition getObjectBoxModel() { 3511831625273329956, 8089710746679848906, 4567441488943246138, - 1321911158882624161 + 1321911158882624161, + 1780571115080959247, + 5383502869453245964, + 2820386840249227222 ], retiredRelationUids: const [], modelVersion: 5, @@ -562,21 +550,6 @@ ModelDefinition getObjectBoxModel() { : fbb.writeList(object.specialSkills! .map(fbb.writeString) .toList(growable: false)); - final frequentAilmentsOffset = object.frequentAilments == null - ? null - : fbb.writeList(object.frequentAilments! - .map(fbb.writeString) - .toList(growable: false)); - final commutableDiseaseOffset = object.commutableDisease == null - ? null - : fbb.writeList(object.commutableDisease! - .map(fbb.writeString) - .toList(growable: false)); - final nonCommutableDiseaseOffset = object.nonCommutableDisease == null - ? null - : fbb.writeList(object.nonCommutableDisease! - .map(fbb.writeString) - .toList(growable: false)); final surgeriesOffset = object.surgeries == null ? null : fbb.writeString(object.surgeries!); @@ -642,9 +615,6 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(11, businessStatusOffset); fbb.addOffset(12, maritalStatusOffset); fbb.addOffset(13, specialSkillsOffset); - fbb.addOffset(14, frequentAilmentsOffset); - fbb.addOffset(15, commutableDiseaseOffset); - fbb.addOffset(16, nonCommutableDiseaseOffset); fbb.addOffset(17, surgeriesOffset); fbb.addOffset(18, anganwadiServicesAwareOffset); fbb.addOffset(19, anganwadiServicesUsingOffset); @@ -698,15 +668,6 @@ ModelDefinition getObjectBoxModel() { ..specialSkills = const fb.ListReader(fb.StringReader(), lazy: false) .vTableGetNullable(buffer, rootOffset, 30) - ..frequentAilments = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 32) - ..commutableDisease = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 34) - ..nonCommutableDisease = - const fb.ListReader(fb.StringReader(), lazy: false) - .vTableGetNullable(buffer, rootOffset, 36) ..surgeries = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 38) ..anganwadiServicesAware = const fb.StringReader() @@ -1067,94 +1028,79 @@ class FamilyMemberIndividualDataModel_ { QueryStringVectorProperty( _entities[1].properties[13]); - /// see [FamilyMemberIndividualDataModel.frequentAilments] - static final frequentAilments = - QueryStringVectorProperty( - _entities[1].properties[14]); - - /// see [FamilyMemberIndividualDataModel.commutableDisease] - static final commutableDisease = - QueryStringVectorProperty( - _entities[1].properties[15]); - - /// see [FamilyMemberIndividualDataModel.nonCommutableDisease] - static final nonCommutableDisease = - QueryStringVectorProperty( - _entities[1].properties[16]); - /// see [FamilyMemberIndividualDataModel.surgeries] static final surgeries = QueryStringProperty( - _entities[1].properties[17]); + _entities[1].properties[14]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesAware] static final anganwadiServicesAware = QueryStringProperty( - _entities[1].properties[18]); + _entities[1].properties[15]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsing] static final anganwadiServicesUsing = QueryStringProperty( - _entities[1].properties[19]); + _entities[1].properties[16]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsedList] static final anganwadiServicesUsedList = QueryStringVectorProperty( - _entities[1].properties[20]); + _entities[1].properties[17]); /// see [FamilyMemberIndividualDataModel.useOfTobacco] static final useOfTobacco = QueryStringProperty( - _entities[1].properties[21]); + _entities[1].properties[18]); /// see [FamilyMemberIndividualDataModel.useOfAlcohol] static final useOfAlcohol = QueryStringProperty( - _entities[1].properties[22]); + _entities[1].properties[19]); /// see [FamilyMemberIndividualDataModel.aarogyaSetuInstalled] static final aarogyaSetuInstalled = QueryStringProperty( - _entities[1].properties[23]); + _entities[1].properties[20]); /// see [FamilyMemberIndividualDataModel.vizhithiruInstalled] static final vizhithiruInstalled = QueryStringProperty( - _entities[1].properties[24]); + _entities[1].properties[21]); /// see [FamilyMemberIndividualDataModel.dataValid] static final dataValid = QueryBooleanProperty( - _entities[1].properties[25]); + _entities[1].properties[22]); /// see [FamilyMemberIndividualDataModel.dbVulnerabilities] static final dbVulnerabilities = QueryStringProperty( - _entities[1].properties[26]); + _entities[1].properties[23]); /// see [FamilyMemberIndividualDataModel.dbOccupation] static final dbOccupation = QueryStringProperty( - _entities[1].properties[27]); + _entities[1].properties[24]); /// see [FamilyMemberIndividualDataModel.workTimings] static final workTimings = QueryStringVectorProperty( - _entities[1].properties[28]); + _entities[1].properties[25]); /// see [FamilyMemberIndividualDataModel.noOfDaysWorking] static final noOfDaysWorking = QueryStringProperty( - _entities[1].properties[29]); + _entities[1].properties[26]); /// see [FamilyMemberIndividualDataModel.PHCServicesUsed] static final PHCServicesUsed = QueryStringProperty( - _entities[1].properties[30]); + _entities[1].properties[27]); /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsed] static final privateClinicServicesUsed = QueryStringProperty( - _entities[1].properties[31]); + _entities[1].properties[28]); } /// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. From 4353edc7315f62039278be1df8e3488e94f71ddc Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Tue, 18 Jan 2022 23:45:57 +0530 Subject: [PATCH 176/264] Fixed TODOs --- lib/Model/FamilyMembersCommonDataModel.dart | 3 +- lib/Screens/CommunityDataCollection.dart | 2 +- lib/Screens/FamilyDetails.dart | 17 +- lib/Screens/FamilyHomeScreen.dart | 5 +- lib/Screens/FamilyMemberAdd.dart | 183 ++++++++------------ lib/Screens/VillageSelection.dart | 2 +- lib/Utils/Globals.dart | 2 +- 7 files changed, 87 insertions(+), 127 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 72b4a7e..6e64fb3 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -45,6 +45,7 @@ class FamilyMemberIndividualDataModel { Map? communicableDiseases; //TODO: Write get set functions Map? frequentAilments; //TODO: Inform change, write functions Map? nonCommunicableDiseases; //TODO: Inform change, write functions + Map? tobaccoProducts; //TODO: Inform change, write functions String? useOfTobacco; String? useOfAlcohol; String? aarogyaSetuInstalled; @@ -57,7 +58,6 @@ class FamilyMemberIndividualDataModel { return { "UIN": "", "username": "", - //"timeStamp": savedTime, "name": userName, "date": "${dateOfBirth!.day}-${dateOfBirth!.month}-${dateOfBirth!.year}", "gender": gender, @@ -88,6 +88,7 @@ class FamilyMemberIndividualDataModel { "privateHealthClinicFacilitiesUsed": privateClinicServicesUsed, "reasonsForVisitingPrivateHealthClinic": privateServiceReason!= null ? buildListForOptionWidget(privateServiceReason!) : [], "tobaccoBasedProductsUsage": useOfTobacco, + "tobaccoProductsUsed" : tobaccoProducts, "alcoholConsumption": useOfAlcohol, "businessStatus": businessStatus, "arogyaSethuAppInstallationStatus": aarogyaSetuInstalled, diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 519b70f..d6b2cde 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -92,7 +92,7 @@ class _CommunityDataCollectionState extends State { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( "Please fill all fields!", - style: TextStyle(color: Colors.red), + style: TextStyle(color: colors.errorColor), ), )); } diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index cd62d4d..6a292fc 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -28,7 +28,7 @@ class _FamilyDetailsState extends State { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: AutoSizeText( "Please fill all fields!", - style: TextStyle(color: Colors.red), + style: TextStyle(color: colors.errorColor), ), )); } @@ -68,7 +68,7 @@ class _FamilyDetailsState extends State { 'Force': false, 'Tempo': false, 'Renault': false, - 'Skodaa': false, + 'Skoda': false, 'Mitsubishi': false, 'None': false }; @@ -131,6 +131,7 @@ class _FamilyDetailsState extends State { var incomeFromCattleEnabled = false; var toiletFacility = false; + //TODO: Add village code @override Widget build(BuildContext context) { return WillPopScope( @@ -247,11 +248,11 @@ class _FamilyDetailsState extends State { singleOption: false, context: context, dataMap: - widget.modelData!.twoThreeWheelManufacturer ?? - two_three_mfg, + widget.modelData!.noToiletsWhy ?? + noToiletsWhy, onSaved: (val) { print("Value recorded: $val"); - widget.modelData?.twoThreeWheelManufacturer = val; + widget.modelData?.noToiletsWhy = val; }, errorField: "Please choose a reason", autoValidateMode: @@ -301,7 +302,7 @@ class _FamilyDetailsState extends State { DropDownFormField( list: ['1', '2', '3', '4', '5', 'More'], hint: "Select the highest", - title: "No of two wheelers", + title: "No. of two wheelers", defaultValue: widget.modelData!.noOfTwoWheelers, onSaved: (val) { print("Value recorded: $val"); @@ -312,7 +313,7 @@ class _FamilyDetailsState extends State { DropDownFormField( list: ['1', '2', '3', '4', '5', 'More'], hint: "Select the highest", - title: "No of three wheelers", + title: "No. of three wheelers", defaultValue: widget.modelData!.noOfThreeWheelers, onSaved: (val) { print("Value recorded: $val"); @@ -339,7 +340,7 @@ class _FamilyDetailsState extends State { DropDownFormField( list: ['1', '2', '3', '4', '5', 'More'], hint: "Select the highest", - title: "No of four wheelers", + title: "No. of four wheelers", errorField: "Please choose a valid number", defaultValue: widget.modelData!.noOfFourWheelers, onSaved: (val) { diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 66c5f83..1a96be7 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -17,9 +17,8 @@ import 'package:http/http.dart' as http; class FamilyHomeScreen extends StatefulWidget { - FamilyHomeScreen({Key? key, this.modelData,this.isGenerated}) : super(key: key); + FamilyHomeScreen({Key? key, this.modelData}) : super(key: key); - final isGenerated; @override State createState() => _FamilyHomeScreenState(); @@ -211,4 +210,4 @@ class _FamilyHomeScreenState extends State { -//TODO: send isGenerated, isEdited to the request \ No newline at end of file +//TODO: isEdited to the request \ No newline at end of file diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index e4e45b5..e937020 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; -import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; @@ -12,6 +11,7 @@ import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/GenderWidget.dart'; import 'package:geo_spatial/Widgets/IncomeWithTypeTextField.dart'; import 'package:geo_spatial/Widgets/NestedOptionWidgetFormField.dart'; +import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:geo_spatial/Widgets/StartingEndingTimeWidget.dart'; import 'package:geo_spatial/Widgets/TagTextWidget.dart'; @@ -59,7 +59,7 @@ class _FamilyMemberAddState extends State { var vulnerabilities = { 'Widower (M)': false, - 'Widow (F)' : false, + 'Widow (F)': false, 'Divorcee': false, 'Differently Abled': false, 'Pregnant Woman': false, @@ -88,26 +88,33 @@ class _FamilyMemberAddState extends State { 'Less waiting time': false }; - var frequentAilments = { - 'Cold and Flu' : false, - 'Diarrhoea' : false, - 'Headaches' : false, - 'Fever' : false + var frequentAilments = { + 'Cold and Flu': false, + 'Diarrhoea': false, + 'Headaches': false, + 'Fever': false }; - var communicableDiseases = { - 'COVID' : false, - 'Typhoid' : false, - 'Dengue' : false, - 'Malaria' : false, - 'HIV/AIDS' : false + var communicableDiseases = { + 'COVID': false, + 'Typhoid': false, + 'Dengue': false, + 'Malaria': false, + 'HIV/AIDS': false }; - var nonCommunicableDiseases = { - 'Cardiovascular disease' : false, - 'Diabetes' : false, - 'Preventable cancers' : false, - 'Hypertension' : false + var nonCommunicableDiseases = { + 'Cardiovascular disease': false, + 'Diabetes': false, + 'Treatable cancers': false, + 'Hypertension': false + }; + + var tobaccoProducts = { + 'Normal tobacco': false, + 'Hans': false, + 'Betel nuts': false, + 'Beedi': false }; @override @@ -167,14 +174,6 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - IncomeWithTypeTextField( - onSaved: (textValue, option) { - print(textValue! + " " + option!); - }, - text: 'Income', - hintText: 'Enter income', - listOfOptions: ["Day", "Week", "Month"], - ), Padding( padding: const EdgeInsets.only(left: 10.0, right: 10.0), child: TextFormField( @@ -217,6 +216,11 @@ class _FamilyMemberAddState extends State { data; print(data); }, + validator: (val) { + if (val!.isAfter(DateTime.now())) { + return 'Please choose a valid date'; + } + }, ), GenderPickerWidget( initialGender: @@ -248,9 +252,7 @@ class _FamilyMemberAddState extends State { contentPadding: EdgeInsets.all(7.0), ), validator: (value) { - if (value == "") { - return "Please enter a value / 0 if no phone"; - } else if (value!.length != 10) { + if (value!.length != 10 || value != "") { return "Enter a valid number"; } else return null; @@ -288,7 +290,8 @@ class _FamilyMemberAddState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 20.0), child: TextFormField( initialValue: widget.familyMemberIndividualDataModel?.aadhaarNumber, @@ -300,15 +303,16 @@ class _FamilyMemberAddState extends State { style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), ), - hintText: "Please enter 12 digit Aadhaar", + hintText: "Please enter 12 digit Aadhaar.", + helperText: "Enter 0 if person is not willing to share", + helperStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(7.0), ), validator: (value) { - if (value == "") { - return "Enter 12 digit Aadhaar / 0 if absent"; - } else if (value!.length != 12) { + if (value!.length != 12 || value != "") { return "Enter a valid Aadhaar"; } else return null; @@ -335,6 +339,7 @@ class _FamilyMemberAddState extends State { errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), + //TODO: Occupation widget replace CheckBoxAddExtraAlertDialog( title: 'Occupation', hint: 'Select applicable', @@ -515,69 +520,13 @@ class _FamilyMemberAddState extends State { }, ), ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 20.0, top: 10.0), - child: TextFormField( - initialValue: widget - .familyMemberIndividualDataModel?.incomePerDay, - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Day", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter income per day", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter Income/Day / 0"; - } - }, - onSaved: (val) { - print(val.toString()); - widget.familyMemberIndividualDataModel!.incomePerDay = - val; - }, - ), - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 10.0), - child: TextFormField( - initialValue: widget - .familyMemberIndividualDataModel?.incomePerMonth, - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Income/Month", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter income per month", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter Income/Month / 0"; - } - }, - onSaved: (val) { - print(val.toString()); - widget.familyMemberIndividualDataModel! - .incomePerMonth = val; - }, - ), + IncomeWithTypeTextField( + onSaved: (textValue, option) { + print(textValue! + " " + option!); + }, + text: 'Income', + hintText: 'Enter income', + listOfOptions: ["Day", "Week", "Month"], ), Padding( padding: const EdgeInsets.all(20.0), @@ -586,7 +535,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.pension, autoValidateMode: AutovalidateMode.onUserInteraction, options: [ - ["Eligible", "eligible"], + ["Eligible, not receiving", "eligible"], ["Eligible, receiving", "eligible_receiving"], ["Not eligible", "not_eligible"] ], @@ -658,9 +607,8 @@ class _FamilyMemberAddState extends State { CheckBoxAddExtraAlertDialog( title: 'Frequent ailments', hint: 'Please choose the applicable', - //TODO: Write db functions dataMap: widget.familyMemberIndividualDataModel! - .frequentAilments ?? + .frequentAilments ?? frequentAilments, singleOption: false, context: context, @@ -677,15 +625,14 @@ class _FamilyMemberAddState extends State { CheckBoxAddExtraAlertDialog( title: 'Communicable diseases', hint: 'Please choose the applicable', - //TODO: Write db functions dataMap: widget.familyMemberIndividualDataModel! - .communicableDiseases?? + .communicableDiseases ?? communicableDiseases, singleOption: false, context: context, onSaved: (map) { - widget.familyMemberIndividualDataModel!.communicableDiseases = - map; + widget.familyMemberIndividualDataModel! + .communicableDiseases = map; }, errorField: "Please choose diseases/None", autoValidateMode: AutovalidateMode.onUserInteraction, @@ -696,15 +643,14 @@ class _FamilyMemberAddState extends State { CheckBoxAddExtraAlertDialog( title: 'Non Communicable diseases', hint: 'Please choose the applicable', - //TODO: Write db functions dataMap: widget.familyMemberIndividualDataModel! - .nonCommunicableDiseases?? + .nonCommunicableDiseases ?? nonCommunicableDiseases, singleOption: false, context: context, onSaved: (map) { - widget.familyMemberIndividualDataModel!.nonCommunicableDiseases = - map; + widget.familyMemberIndividualDataModel! + .nonCommunicableDiseases = map; }, errorField: "Please choose diseases/None", autoValidateMode: AutovalidateMode.onUserInteraction, @@ -792,7 +738,7 @@ class _FamilyMemberAddState extends State { ), ), Padding( - padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.symmetric(horizontal: 20.0), child: OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel! .privateClinicServicesUsed, @@ -821,8 +767,8 @@ class _FamilyMemberAddState extends State { singleOption: false, context: context, onSaved: (map) { - widget.familyMemberIndividualDataModel!.privateServiceReason = - map; + widget.familyMemberIndividualDataModel! + .privateServiceReason = map; }, errorField: "Please choose a reason", autoValidateMode: AutovalidateMode.onUserInteraction, @@ -840,6 +786,19 @@ class _FamilyMemberAddState extends State { data; }, ), + CheckBoxAddExtraAlertDialog( + title: 'Tobacco products', + hint: 'Choose applicable products', + dataMap: widget.familyMemberIndividualDataModel! + .tobaccoProducts ?? + tobaccoProducts, + context: context, + errorField: 'Please choose at least one', + onSaved: (map) { + widget.familyMemberIndividualDataModel! + .tobaccoProducts = map; + }, + ), OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel!.useOfAlcohol, @@ -899,4 +858,4 @@ class _FamilyMemberAddState extends State { } } -//TODO: Add tobacco products + diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index bfd4d5c..b20e8a8 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -207,7 +207,7 @@ class _ContentChildWidgetState extends State { onPressed: () { Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => - FamilyHomeScreen(isGenerated: isGenerated))); + FamilyHomeScreen())); }, child: Text("Generate UIN later")) ], diff --git a/lib/Utils/Globals.dart b/lib/Utils/Globals.dart index 0476a1c..427bf84 100644 --- a/lib/Utils/Globals.dart +++ b/lib/Utils/Globals.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; - +//TODO: Update name and username from response var userName = "cyberwizard1001"; var Name = "Nirmal Karthikeyan"; \ No newline at end of file From 1be833c4acbc22d5d9af9bc59e1741d21d7dc79c Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 00:53:50 +0530 Subject: [PATCH 177/264] Added user data to storage and displayed int places --- lib/Screens/ChangePassword.dart | 327 +++++++++++------- lib/Screens/Home.dart | 35 +- lib/Screens/ProfilePage.dart | 329 +++++++++++-------- lib/Widgets/NavigationDrawer.dart | 161 +++++---- lib/Widgets/NestedOptionWidgetFormField.dart | 4 + lib/Widgets/NestedOptionsWidget.dart | 71 ++-- 6 files changed, 570 insertions(+), 357 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 70133ba..7994bde 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -1,8 +1,15 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; + +final storage = FlutterSecureStorage(); class ChangePassword extends StatefulWidget { ChangePassword({Key? key}) : super(key: key); @@ -11,8 +18,40 @@ class ChangePassword extends StatefulWidget { _ChangePasswordState createState() => _ChangePasswordState(); } +Future get jwtToken async { + var jwt = await storage.read(key: JWT_STORAGE_KEY); + print(JWT_STORAGE_KEY + jwt.toString()); + + if (jwt == null) return ""; + return jwt; +} + +Future _makeLoginRequest( + String username, String currentPassword, String newPassword) async { + String url = NETWORK_ADDRESS; + var body = json + .encode({"password": newPassword, "currentPassword": currentPassword}); + + String jwt = await jwtToken; + + var res = await http.post( + Uri.http(url, '/api/changeUserPassword/${username}'), + headers: {"Content-Type": "application/json", 'user-auth-token': jwt}, + body: body); + print("RES: ${res.body}"); + + return res; +} + class _ChangePasswordState extends State { var password = ""; + final _oldPasswordKey = GlobalKey(); + final _newPasswordKey = GlobalKey(); + final _newPasswordKeyRepeat = GlobalKey(); + + final TextEditingController _oldPasswordController = TextEditingController(); + final TextEditingController _newPasswordController = TextEditingController(); + @override Widget build(BuildContext context) { @@ -21,125 +60,185 @@ class _ChangePasswordState extends State { appBar: AppBarBackButton('Change Password'), body: Stack( children: [ - SvgPicture.asset('assets/svg/profile_bg.svg', fit: BoxFit.cover), + SvgPicture.asset('assets/svg/profile_bg.svg', fit: BoxFit.fill), Container( - height: MediaQuery.of(context).size.height * 0.6, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20))), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - child: SvgPicture.asset( - 'assets/svg/storage_image.svg', - ), - height: 200, - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.05, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), - child: TextFormField( - style: - GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - keyboardType: TextInputType.visiblePassword, - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.darkSecondaryTextColor, - width: 1.0)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.successColor, width: 1.0)), - label: Text( - "Enter new password", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), + child: CustomScrollView( + slivers: [ + SliverFillRemaining( + hasScrollBody: false, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + child: SvgPicture.asset( + 'assets/svg/storage_image.svg', + ), + height: 200, ), - hintText: "Enter password here", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value!.isNotEmpty) { - if (value.length <= 7) { - return "Password too small"; - } - } else - return null; - }, - onSaved: (data) { - password = data!; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, - ), - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.04, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), - child: TextFormField( - style: - GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - keyboardType: TextInputType.visiblePassword, - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.darkSecondaryTextColor, - width: 1.0)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.successColor, width: 1.0)), - label: Text( - "Re-Enter new password", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), + SizedBox( + height: MediaQuery.of(context).size.height * 0.05, ), - hintText: "Enter password here", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value!.isNotEmpty) { - if (value != password) { - return "Passwords do not match"; - } - } else - return null; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, - ), - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.04, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 40.0), - child: SizedBox( - width: double.infinity, - height: 55, - child: ElevatedButton( - child: Text("Change Password", - style: TextStyle(fontSize: 16)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - colors.lightPrimaryTextColor), - backgroundColor: MaterialStateProperty.all( - colors.darkPrimaryTextColor), - shape: - MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors - .darkSecondBackgroundColor)))), - onPressed: () {}, - ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: TextFormField( + key: _oldPasswordKey, + controller: _oldPasswordController, + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, + width: 1.0)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0)), + label: Text( + "Enter current password", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Enter password here", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value!.isNotEmpty) { + if (value.length <= 7) { + return "Password too small"; + } + } else + return null; + }, + onSaved: (data) { + password = data!; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.05, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: TextFormField( + controller: _newPasswordController, + key: _newPasswordKey, + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, + width: 1.0)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0)), + label: Text( + "Enter new password", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Enter password here", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value!.isNotEmpty) { + if (value.length <= 7) { + return "Password too small"; + } + } else + return null; + }, + onSaved: (data) { + password = data!; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: TextFormField( + key: _newPasswordKeyRepeat, + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + keyboardType: TextInputType.visiblePassword, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, + width: 1.0)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.successColor, width: 1.0)), + label: Text( + "Re-Enter new password", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Enter password here", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value!.isNotEmpty) { + if (value != password) { + return "Passwords do not match"; + } + } else + return null; + }, + autovalidateMode: AutovalidateMode.onUserInteraction, + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 40.0), + child: SizedBox( + width: double.infinity, + height: 55, + child: ElevatedButton( + child: Text("Change Password", + style: TextStyle(fontSize: 16)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + colors.lightPrimaryTextColor), + backgroundColor: + MaterialStateProperty.all( + colors.darkPrimaryTextColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () { + if (_oldPasswordKey.currentState!.validate() && + _newPasswordKey.currentState!.validate() && + _newPasswordKeyRepeat.currentState! + .validate()) { + } + }, + ), + ), + ) + ], ), ) ], diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 4a8f2e9..918b106 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,10 +1,10 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; -import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; -import 'package:geo_spatial/Screens/VillageSelection.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:geo_spatial/Widgets/DataCard.dart'; @@ -23,6 +23,14 @@ class Home extends StatefulWidget { final storage = FlutterSecureStorage(); +Future get _getUserName async { + var userName = await storage.read(key: "userData"); + print("userData " + userName.toString()); + + if (userName == null) return ""; + return userName; +} + class _HomeWidgetState extends State { @override Widget build(BuildContext context) { @@ -73,10 +81,25 @@ class _HomeWidgetState extends State { backgroundColor: colors.darkScaffoldColor, appBar: AppBar( elevation: 40, - title: Text( - 'Hello, ' + globals.Name + '!', - style: GoogleFonts.montserrat( - fontSize: 18, color: colors.darkPrimaryTextColor), + title: FutureBuilder( + future: _getUserName, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + var dataJson = json.decode(snapshot.requireData); + print("DATA: ${snapshot.requireData}"); + return Text( + 'Hello, ' + dataJson[0]["Name"] + '!', + style: GoogleFonts.montserrat( + fontSize: 18, color: colors.darkPrimaryTextColor), + ); + } else{ + return Text( + 'Geo Spatial Api!', + style: GoogleFonts.montserrat( + fontSize: 18, color: colors.darkPrimaryTextColor), + ); + } + }, ), backgroundColor: Colors.transparent, ), diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index a29d2f6..e5fea89 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -1,4 +1,7 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Screens/ChangePassword.dart'; import 'package:geo_spatial/Screens/Login.dart'; @@ -12,156 +15,186 @@ class ProfilePage extends StatefulWidget { State createState() => _ProfilePageState(); } +final storage = FlutterSecureStorage(); + +Future get _getUserData async { + var userData = await storage.read(key: "userData"); + print("userData " + userData.toString()); + + if (userData == null) return ""; + return userData; +} + class _ProfilePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - resizeToAvoidBottomInset: true, - body: Stack(children: [ - SvgPicture.asset( - 'assets/svg/profile_bg.svg', - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - ), - SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppBarBackButton( - 'Profile', - actions: [ - IconButton( - onPressed: () async { - await storage.delete(key: 'jwt'); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); - }, - icon: Icon( - Icons.logout, - color: colors.darkAccentColor, - )) - ], - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.08, - ), - Center( - child: Column( - children: [ - Image(image: AssetImage("assets/avatar_woman.png")), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Text( - globals.Name, - style: GoogleFonts.poppins(fontSize: 20), + return FutureBuilder( + future: _getUserData, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + var dataJson = json.decode(snapshot.requireData); + var gender = dataJson[0]["gender"]; + return Scaffold( + resizeToAvoidBottomInset: true, + body: Stack(children: [ + SvgPicture.asset('assets/svg/profile_bg.svg', + alignment: Alignment.center, fit: BoxFit.fill), + SingleChildScrollView( + physics: ClampingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppBarBackButton( + 'Profile', + actions: [ + IconButton( + onPressed: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute( + builder: (context) => Login()), + (Route route) => false); + }, + icon: Icon( + Icons.logout, + color: colors.darkAccentColor, + )) + ], ), - ), - Text( - '@' + globals.userName, - style: GoogleFonts.poppins( - fontSize: 15, color: colors.darkSecondaryTextColor), - textAlign: TextAlign.start, - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 20.0, vertical: 40.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.only(right: 6, left: 20), - child: ElevatedButton.icon( - style: ElevatedButton.styleFrom( - primary: - colors.darkSecondaryTextColor.withOpacity(0.2), - ), - onPressed: () { - print('Button Clicked'); - Route route = MaterialPageRoute(builder: (context) => ChangePassword()); - Navigator.push(context, route); - }, - icon: Icon( - Icons.lock, - color: colors.darkAccentColor, - ), - label: Text( - 'Change\nPassword', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - textAlign: TextAlign.center, - ), - ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.08, ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 6, right: 20), - child: ElevatedButton.icon( - style: ElevatedButton.styleFrom( - primary: - colors.darkSecondaryTextColor.withOpacity(0.2), - ), - onPressed: () { - print('Button Clicked'); - _displayTextInputDialog(context); - }, - label: Text( - 'Change\nUsername', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - textAlign: TextAlign.center, - ), - icon: Icon( - Icons.person, - color: colors.darkAccentColor, - ), + Center( + child: Column( + children: [ + Image( + image: gender == "Male" + ? AssetImage("assets/avatar_man.png") + : AssetImage("assets/avatar_woman.png"), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Text( + dataJson[0]["Name"], + style: GoogleFonts.poppins(fontSize: 20), + ), + ), + Text( + '@' + dataJson[0]["username"], + style: GoogleFonts.poppins( + fontSize: 15, + color: colors.darkSecondaryTextColor), + textAlign: TextAlign.start, + ), + ], ), ), - ), - ], - ), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 40), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 20), - child: Container( - padding: EdgeInsets.only(top: 15, left: 20.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20)), - color: Color(0xff34344B)), - height: 50, - width: MediaQuery.of(context).size.width * 0.8, - child: Text('Joined on: '), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20.0, vertical: 40.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.only(right: 6, left: 20), + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor + .withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + Route route = MaterialPageRoute( + builder: (context) => ChangePassword()); + Navigator.push(context, route); + }, + icon: Icon( + Icons.lock, + color: colors.darkAccentColor, + ), + label: Text( + 'Change\nPassword', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 6, right: 20), + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + primary: colors.darkSecondaryTextColor + .withOpacity(0.2), + ), + onPressed: () { + print('Button Clicked'); + _displayTextInputDialog(context); + }, + label: Text( + 'Change\nUsername', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + textAlign: TextAlign.center, + ), + icon: Icon( + Icons.person, + color: colors.darkAccentColor, + ), + ), + ), + ), + ], + ), ), - ), - Container( - padding: EdgeInsets.only(top: 15, left: 20.0), - width: MediaQuery.of(context).size.width * 0.8, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20)), - color: Color(0xff34344B)), - height: 50, - child: Text('Records collected: '), - ) - ], + Padding( + padding: EdgeInsets.symmetric(horizontal: 40), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 20), + child: Container( + padding: EdgeInsets.only(top: 15, left: 20.0), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(20)), + color: Color(0xff34344B)), + height: 50, + width: MediaQuery.of(context).size.width * 0.8, + child: Text( + 'Joined on: ${dataJson[0]["DateJoined"]}'), + ), + ), + Container( + padding: EdgeInsets.only(top: 15, left: 20.0), + width: MediaQuery.of(context).size.width * 0.8, + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(20)), + color: Color(0xff34344B)), + height: 50, + child: Text( + 'Records collected: ${dataJson[0]["NumberOfRecordsCollected"]}'), + ) + ], + ), + ) + ], + ), ), - ) - ], - ), - ), - ]), - ); + ]), + ); + } else { + return Scaffold( + body: Center( + child: CircularProgressIndicator(), + )); + } + }); } } @@ -171,13 +204,19 @@ Future _displayTextInputDialog(BuildContext context) async { builder: (context) { var _textFieldController = TextEditingController(); return AlertDialog( - backgroundColor: colors.darkScaffoldColor, - title: Text('Enter Name',style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), + backgroundColor: colors.darkScaffoldColor, + title: Text( + 'Enter Name', + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), content: TextField( style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), onChanged: (value) {}, controller: _textFieldController = TextEditingController(), - decoration: InputDecoration(hintText: "Text Field in Dialog",hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor)), + decoration: InputDecoration( + hintText: "Text Field in Dialog", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor)), ), actions: [ ElevatedButton( @@ -193,7 +232,7 @@ Future _displayTextInputDialog(BuildContext context) async { GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), onPressed: () { - if(_textFieldController.text!=null) + if (_textFieldController.text != null) globals.Name = _textFieldController.text; Navigator.pop(context); }) diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index 607aca2..58d0343 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -1,83 +1,112 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Screens/ProfilePage.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; -import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:google_fonts/google_fonts.dart'; +final storage = FlutterSecureStorage(); + +Future get _getUserData async { + var userData = await storage.read(key: "userData"); + print("userData " + userData.toString()); + + if (userData == null) return ""; + return userData; +} + class NavigationDrawer extends StatelessWidget { NavigationDrawer({Key? key}) : super(key: key); final padding = EdgeInsets.symmetric(horizontal: 20); @override Widget build(BuildContext context) { - return Drawer( - child: Material( - color: colors.darkScaffoldColor, - child: ListView( - padding: EdgeInsets.zero, - children: [ - UserAccountsDrawerHeader( - currentAccountPicture: CircleAvatar( - child: ClipOval( - child: Image( - image: AssetImage("assets/avatar_man.png"), - ), - ), - ), - decoration: BoxDecoration( - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage("assets/Illustration.png"))), - accountName: Text( - globals.Name, - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor, fontSize: 18), - ), - accountEmail: Text( - globals.userName, - style: - GoogleFonts.poppins(color: colors.darkSecondaryTextColor), - ), - ), - buildMenuItem( - text: 'Home', - icon: Icons.home, - onTap: () { - Navigator.of(context).pop(); - }), - buildMenuItem( - text: 'Profile', - icon: Icons.person, - onTap: () { - Navigator.of(context).push( - MaterialPageRoute(builder: (context) => ProfilePage())); - }), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), - child: Container( - height: 1, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide(color: Colors.grey), + return FutureBuilder( + future: _getUserData, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + { + var dataJson = json.decode(snapshot.requireData); + var gender = dataJson[0]["gender"]; + + return Drawer( + child: Material( + color: colors.darkScaffoldColor, + child: ListView( + padding: EdgeInsets.zero, + children: [ + UserAccountsDrawerHeader( + currentAccountPicture: CircleAvatar( + child: ClipOval( + child: Image( + image: gender == "Male" + ? AssetImage("assets/avatar_man.png") + : AssetImage("assets/avatar_woman.png"), + ), + ), + ), + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage("assets/Illustration.png"))), + accountName: Text( + dataJson[0]["Name"], + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor, fontSize: 18), + ), + accountEmail: Text( + dataJson[0]["username"], + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + ), + buildMenuItem( + text: 'Home', + icon: Icons.home, + onTap: () { + Navigator.of(context).pop(); + }), + buildMenuItem( + text: 'Profile', + icon: Icons.person, + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => ProfilePage())); + }), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Container( + height: 1, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide(color: Colors.grey), + ), + ), + ), + ), + buildMenuItem( + text: 'Sign Out', + icon: Icons.logout, + onTap: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false); + }, + ), + ], ), ), - ), - ), - buildMenuItem( - text: 'Sign Out', - icon: Icons.logout, - onTap: () async { - await storage.delete(key: 'jwt'); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); - }, - ), - ], - ), - ), - ); + ); + } + } else { + return Center( + child: CircularProgressIndicator(), + ); + } + }); } Widget buildMenuItem({ diff --git a/lib/Widgets/NestedOptionWidgetFormField.dart b/lib/Widgets/NestedOptionWidgetFormField.dart index 2f5f848..4e6d6a8 100644 --- a/lib/Widgets/NestedOptionWidgetFormField.dart +++ b/lib/Widgets/NestedOptionWidgetFormField.dart @@ -84,6 +84,10 @@ class NestedOptionWidgetFormField extends FormField> { builder: (context) => NestedOptionWidget( title: title, onChanged: (val) { + for(var i in val){ + print(i.toJsonString()); + var decodedVal = NestedOptionData.fromJson(i.toJsonString()); + } state.didChange(val); state.validate(); }, diff --git a/lib/Widgets/NestedOptionsWidget.dart b/lib/Widgets/NestedOptionsWidget.dart index c0773f4..7952335 100644 --- a/lib/Widgets/NestedOptionsWidget.dart +++ b/lib/Widgets/NestedOptionsWidget.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:flutter/material.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; @@ -6,10 +8,28 @@ import 'package:google_fonts/google_fonts.dart'; class NestedOptionData { bool isSelected = false; - late Map subOptionDataMap; - late String boxName; + Map? subOptionDataMap; + String? boxName; + + NestedOptionData({this.subOptionDataMap, this.boxName}); + + toJsonString() { + return json.encode({ + "isSelected": isSelected, + "boxName": boxName, + "selectedData": json.encode(subOptionDataMap), + }); + } - NestedOptionData({required this.subOptionDataMap, required this.boxName}); + factory NestedOptionData.fromJson(String jsonObject) { + var decodedJson = json.decode(jsonObject); + var nestedDataObject = NestedOptionData(); + nestedDataObject.boxName = decodedJson['boxName'] as String; + nestedDataObject.isSelected = decodedJson['isSelected'] as bool; + nestedDataObject.subOptionDataMap = + Map.from(json.decode(decodedJson["selectedData"])); + return nestedDataObject; + } } class NestedOptionWidget extends StatefulWidget { @@ -26,7 +46,6 @@ class NestedOptionWidget extends StatefulWidget { } class _NestedOptionWidgetState extends State { - var selectedColor = Color(0xffffffff); @override @@ -61,11 +80,11 @@ class _NestedOptionWidgetState extends State { elevation: 10, color: colors.darkScaffoldColor, child: CheckboxListTile( - activeColor: colors.darkAccentColor, + activeColor: colors.darkAccentColor, value: widget.nestedOptionData[index].isSelected, title: Text( - widget.nestedOptionData[index].boxName, + widget.nestedOptionData[index].boxName!, style: GoogleFonts.poppins( color: selectedColor, fontWeight: FontWeight.w400, @@ -85,26 +104,26 @@ class _NestedOptionWidgetState extends State { ), widget.nestedOptionData[index].isSelected ? Container( - margin: EdgeInsets.symmetric(horizontal: 5), - decoration: BoxDecoration( - color: colors.darkSecondAccentColor, - borderRadius: BorderRadius.only(bottomLeft: Radius.circular(10),bottomRight: Radius.circular(10)) - ), - - child: CheckBoxAddExtraAlertDialog( - hint: "hint", - autoSave: true, - onSaved: (map) { - widget.nestedOptionData[index] - .subOptionDataMap = map!; - if (widget.onChanged != null) - widget - .onChanged!(widget.nestedOptionData); - }, - dataMap: widget - .nestedOptionData[index].subOptionDataMap, - context: context), - ) + margin: EdgeInsets.symmetric(horizontal: 5), + decoration: BoxDecoration( + color: colors.darkSecondAccentColor, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(10), + bottomRight: Radius.circular(10))), + child: CheckBoxAddExtraAlertDialog( + hint: "hint", + autoSave: true, + onSaved: (map) { + widget.nestedOptionData[index] + .subOptionDataMap = map!; + if (widget.onChanged != null) + widget.onChanged!( + widget.nestedOptionData); + }, + dataMap: widget.nestedOptionData[index] + .subOptionDataMap!, + context: context), + ) : Container() ], ), From 50bdc32fe5ef5184845c2b477f50a1d43460024c Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 01:05:20 +0530 Subject: [PATCH 178/264] Added login page logic for saving user data and almost done change password --- lib/Screens/ChangePassword.dart | 48 ++++++++++++++++++--------------- lib/Screens/Login.dart | 38 ++++++++++++++++++++++---- lib/Screens/ProfilePage.dart | 3 ++- 3 files changed, 62 insertions(+), 27 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 7994bde..a6b036c 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -12,7 +12,8 @@ import 'package:http/http.dart' as http; final storage = FlutterSecureStorage(); class ChangePassword extends StatefulWidget { - ChangePassword({Key? key}) : super(key: key); + ChangePassword({Key? key, required this.userName}) : super(key: key); + final String userName; @override _ChangePasswordState createState() => _ChangePasswordState(); @@ -35,7 +36,7 @@ Future _makeLoginRequest( String jwt = await jwtToken; var res = await http.post( - Uri.http(url, '/api/changeUserPassword/${username}'), + Uri.https(url, '/api/changeUserPassword/${username}'), headers: {"Content-Type": "application/json", 'user-auth-token': jwt}, body: body); print("RES: ${res.body}"); @@ -44,15 +45,15 @@ Future _makeLoginRequest( } class _ChangePasswordState extends State { - var password = ""; - final _oldPasswordKey = GlobalKey(); - final _newPasswordKey = GlobalKey(); - final _newPasswordKeyRepeat = GlobalKey(); + var passwordOld = ""; + var passwordNew = ""; + final _oldPasswordKey = GlobalKey(); + final _newPasswordKey = GlobalKey(); + final _newPasswordKeyRepeat = GlobalKey(); final TextEditingController _oldPasswordController = TextEditingController(); final TextEditingController _newPasswordController = TextEditingController(); - @override Widget build(BuildContext context) { return Scaffold( @@ -111,14 +112,13 @@ class _ChangePasswordState extends State { if (value!.isNotEmpty) { if (value.length <= 7) { return "Password too small"; + } else { + return null; } } else - return null; - }, - onSaved: (data) { - password = data!; + return "Please enter password"; }, - autovalidateMode: AutovalidateMode.onUserInteraction, + autovalidateMode: AutovalidateMode.disabled, ), ), SizedBox( @@ -154,14 +154,13 @@ class _ChangePasswordState extends State { if (value!.isNotEmpty) { if (value.length <= 7) { return "Password too small"; + } else { + return null; } } else - return null; - }, - onSaved: (data) { - password = data!; + return "Please enter password"; }, - autovalidateMode: AutovalidateMode.onUserInteraction, + autovalidateMode: AutovalidateMode.disabled, ), ), SizedBox( @@ -194,13 +193,16 @@ class _ChangePasswordState extends State { ), validator: (value) { if (value!.isNotEmpty) { - if (value != password) { - return "Passwords do not match"; + if (value.length <= 7) { + return "Password too small"; + } else if (true) { + } else { + return null; } } else - return null; + return "Please enter password"; }, - autovalidateMode: AutovalidateMode.onUserInteraction, + autovalidateMode: AutovalidateMode.disabled, ), ), SizedBox( @@ -233,6 +235,10 @@ class _ChangePasswordState extends State { _newPasswordKey.currentState!.validate() && _newPasswordKeyRepeat.currentState! .validate()) { + _makeLoginRequest( + "", + _oldPasswordController.text, + _newPasswordController.text); } }, ), diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 08c1f27..29cd709 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -60,7 +60,17 @@ class _MyAppState extends State { var res = await http.post(Uri.https(url, '/api/login'), headers: {"Content-Type": "application/json"}, body: body); - print("RES: ${res}"); + print("RES: ${res.body}"); + + return res; + } + + Future _getUserDetails(String JWT) async { + String url = NETWORK_ADDRESS; + + var res = await http.get(Uri.https(url, '/api/getUserData'), + headers: {"Content-Type": "application/json", 'user-auth-token': JWT}); + print("RES: ${res.body}"); return res; } @@ -97,10 +107,28 @@ class _MyAppState extends State { _passwordError = loginResponse.body; }); } else { - storage.write(key: "jwt", value: loginResponse.body); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Home()), - (Route route) => false); + try { + http.Response userData = await _getUserDetails(loginResponse.body); + print("DATA: ${userData.body}"); + if (userData.statusCode != 200) { + showToast( + "Something went wrong, please check your network connection or try again later", + position: ToastPosition.center, + backgroundColor: colors.darkAccentColor); + } else { + storage.write(key: "userData", value: userData.body); + storage.write(key: "jwt", value: loginResponse.body); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Home()), + (Route route) => false); + } + } catch (e) { + print(e); + showToast( + "Something went wrong, please check your network connection or try again later", + position: ToastPosition.center, + backgroundColor: colors.darkAccentColor); + } } } catch (e) { print(e); diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index e5fea89..1ab531b 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -106,7 +106,8 @@ class _ProfilePageState extends State { onPressed: () { print('Button Clicked'); Route route = MaterialPageRoute( - builder: (context) => ChangePassword()); + builder: (context) => ChangePassword( + userName: dataJson[0]["username"])); Navigator.push(context, route); }, icon: Icon( From 4b040a09e5d285208f64bee79f505d3c33a2ea80 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 12:49:05 +0530 Subject: [PATCH 179/264] Added jwt validation in LoadValidPageWidget, added request code in Community Data to write data to server, completed save password. Changed everything from Https to Http for testing purpose. --- lib/Constants/Constants.dart | 3 +- lib/Screens/ChangePassword.dart | 197 +++++++++++++++++------ lib/Screens/CommunityDataCollection.dart | 81 +++++++--- lib/Screens/Login.dart | 8 +- lib/Widgets/LoadValidPageWidget.dart | 34 +++- lib/main.dart | 20 +-- 6 files changed, 243 insertions(+), 100 deletions(-) diff --git a/lib/Constants/Constants.dart b/lib/Constants/Constants.dart index 4623f94..8e2d797 100644 --- a/lib/Constants/Constants.dart +++ b/lib/Constants/Constants.dart @@ -1,5 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +//String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; final String MALE = "Male"; final String FEMALE = "Female"; diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index a6b036c..8936ca0 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -8,6 +8,7 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import 'package:oktoast/oktoast.dart'; final storage = FlutterSecureStorage(); @@ -27,32 +28,38 @@ Future get jwtToken async { return jwt; } -Future _makeLoginRequest( - String username, String currentPassword, String newPassword) async { - String url = NETWORK_ADDRESS; - var body = json - .encode({"password": newPassword, "currentPassword": currentPassword}); - - String jwt = await jwtToken; - - var res = await http.post( - Uri.https(url, '/api/changeUserPassword/${username}'), - headers: {"Content-Type": "application/json", 'user-auth-token': jwt}, - body: body); - print("RES: ${res.body}"); - - return res; -} - class _ChangePasswordState extends State { - var passwordOld = ""; - var passwordNew = ""; final _oldPasswordKey = GlobalKey(); final _newPasswordKey = GlobalKey(); final _newPasswordKeyRepeat = GlobalKey(); + var _showPasswordOld = false; + var _showPasswordNew = false; + var _showPasswordNewRepeat = false; + + var _showProgressBar = false; + final TextEditingController _oldPasswordController = TextEditingController(); final TextEditingController _newPasswordController = TextEditingController(); + final TextEditingController _newPasswordControllerRepeat = + TextEditingController(); + + Future _makeLoginRequest( + String username, String currentPassword, String newPassword) async { + String url = NETWORK_ADDRESS; + var body = json + .encode({"password": newPassword, "currentPassword": currentPassword}); + + String jwt = await jwtToken; + + var res = await http.put( + Uri.http(url, '/api/changeUserPassword/${username}'), + headers: {"Content-Type": "application/json", 'user-auth-token': jwt}, + body: body); + print("RES: ${res.body}"); + + return res; + } @override Widget build(BuildContext context) { @@ -85,12 +92,26 @@ class _ChangePasswordState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: TextFormField( + obscureText: !_showPasswordOld, key: _oldPasswordKey, controller: _oldPasswordController, style: GoogleFonts.poppins( color: colors.darkPrimaryTextColor), keyboardType: TextInputType.visiblePassword, decoration: InputDecoration( + suffixIcon: IconButton( + onPressed: () { + setState(() { + _showPasswordOld = !_showPasswordOld; + }); + }, + icon: Icon( + _showPasswordOld + ? Icons.visibility_off + : Icons.visibility, + color: colors.darkAccentColor, + ), + ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: colors.darkSecondaryTextColor, @@ -127,12 +148,26 @@ class _ChangePasswordState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: TextFormField( + obscureText: !_showPasswordNew, controller: _newPasswordController, key: _newPasswordKey, style: GoogleFonts.poppins( color: colors.darkPrimaryTextColor), keyboardType: TextInputType.visiblePassword, decoration: InputDecoration( + suffixIcon: IconButton( + onPressed: () { + setState(() { + _showPasswordNew = !_showPasswordNew; + }); + }, + icon: Icon( + _showPasswordNew + ? Icons.visibility_off + : Icons.visibility, + color: colors.darkAccentColor, + ), + ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: colors.darkSecondaryTextColor, @@ -154,6 +189,9 @@ class _ChangePasswordState extends State { if (value!.isNotEmpty) { if (value.length <= 7) { return "Password too small"; + } else if (value != + _newPasswordControllerRepeat.text) { + return "Password does not match"; } else { return null; } @@ -169,11 +207,27 @@ class _ChangePasswordState extends State { Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: TextFormField( + obscureText: !_showPasswordNewRepeat, + controller: _newPasswordControllerRepeat, key: _newPasswordKeyRepeat, style: GoogleFonts.poppins( color: colors.darkPrimaryTextColor), keyboardType: TextInputType.visiblePassword, decoration: InputDecoration( + suffixIcon: IconButton( + onPressed: () { + setState(() { + _showPasswordNewRepeat = + !_showPasswordNewRepeat; + }); + }, + icon: Icon( + _showPasswordNewRepeat + ? Icons.visibility_off + : Icons.visibility, + color: colors.darkAccentColor, + ), + ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: colors.darkSecondaryTextColor, @@ -195,7 +249,8 @@ class _ChangePasswordState extends State { if (value!.isNotEmpty) { if (value.length <= 7) { return "Password too small"; - } else if (true) { + } else if (value != _newPasswordController.text) { + return "Password does not match"; } else { return null; } @@ -210,39 +265,75 @@ class _ChangePasswordState extends State { ), Padding( padding: const EdgeInsets.symmetric(horizontal: 40.0), - child: SizedBox( - width: double.infinity, - height: 55, - child: ElevatedButton( - child: Text("Change Password", - style: TextStyle(fontSize: 16)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all( - colors.lightPrimaryTextColor), - backgroundColor: - MaterialStateProperty.all( - colors.darkPrimaryTextColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors - .darkSecondBackgroundColor)))), - onPressed: () { - if (_oldPasswordKey.currentState!.validate() && - _newPasswordKey.currentState!.validate() && - _newPasswordKeyRepeat.currentState! - .validate()) { - _makeLoginRequest( - "", - _oldPasswordController.text, - _newPasswordController.text); - } - }, - ), - ), + child: _showProgressBar + ? CircularProgressIndicator() + : SizedBox( + width: double.infinity, + height: 55, + child: ElevatedButton( + child: Text("Change Password", + style: TextStyle(fontSize: 16)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + colors.lightPrimaryTextColor), + backgroundColor: + MaterialStateProperty.all( + colors.darkPrimaryTextColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(20), + side: BorderSide( + color: + colors.darkSecondBackgroundColor)))), + onPressed: () async { + bool oldPassword = _oldPasswordKey + .currentState! + .validate(); + bool newPassword = _newPasswordKey + .currentState! + .validate(); + bool newPasswordRepeat = + _newPasswordKeyRepeat.currentState! + .validate(); + if (oldPassword && + newPassword && + newPasswordRepeat) { + try { + setState(() { + _showProgressBar = true; + }); + http.Response res = + await _makeLoginRequest( + widget.userName, + _oldPasswordController.text, + _newPasswordController.text); + + if (res.statusCode != 200) { + showToast(res.body); + } else { + showToast( + "Password changed successfully!"); + Navigator.pop(context); + } + + setState(() { + _showProgressBar = false; + }); + } catch (e) { + setState(() { + _showProgressBar = false; + }); + showToast( + "Something went wrong, please check your network connection or try again later", + ); + } + } + }, + ), + ), ) ], ), diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index d6b2cde..2b39f2c 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -11,6 +12,9 @@ import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/LocationWidget.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import 'package:oktoast/oktoast.dart'; + +final storage = FlutterSecureStorage(); class CommunityDataCollection extends StatefulWidget { CommunityDataCollection({Key? key, CommunityDataModel? this.modelData}) @@ -42,9 +46,14 @@ class CommunityDataCollection extends StatefulWidget { //TODO: Replace with list of village codes final List _villageCodeName = [ - 'Temple', - 'Church', - 'Mosque', + 'THC', + 'PGP', + 'AMC', + 'KUP', + 'KAP', + 'NEP', + 'CGP', + 'JJN' ]; @override @@ -57,13 +66,36 @@ class _CommunityDataCollectionState extends State { late CommunityDataModel modelData; var store; - Future _makeRequest( - var data, String node) async { + Future jwtToken() async { + var jwt = await storage.read(key: JWT_STORAGE_KEY); + print(JWT_STORAGE_KEY + jwt.toString()); + + if (jwt == null) return ""; + return jwt; + } + + Future _makeRequest(var data, String node) async { String url = NETWORK_ADDRESS; var body = json.encode(data); - var res = await http.post(Uri.https(url, '/api/$node'), - headers: {"Content-Type": "application/json"}, body: body); + var jwt = await jwtToken(); + + var res = await http + .post(Uri.http(url, node), + headers: { + "Content-Type": "application/json", + "user-auth-token": jwt + }, + body: body) + .timeout( + const Duration(seconds: 10), + onTimeout: () { + showToast("Server Timed out!"); + // Time has run out, do what you wanted to do. + return http.Response( + 'Error', 408); // Request Timeout response status code + }, + ); return res; } @@ -76,25 +108,24 @@ class _CommunityDataCollectionState extends State { print(isValid.toString()); if (isValid) { - //TODO: Change end point and check res for errors - http.Response res = await _makeRequest(modelData.toJson(), "communityData"); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - res.body, - style: TextStyle(color: Colors.red), - ), - )); - - Navigator.pop(context); - - //TODO: Send data to server from here + try { + http.Response res = await _makeRequest( + modelData.toJson(), "/api/addCommunityBuilding"); + if (res.statusCode != 201) { + showToast(res.body); + } else { + Navigator.pop(context); + showToast("Data entered successfully!"); + } + } catch (e) { + print(e); + showToast( + "Something went wrong, please check your network connection or save your records to upload later", + position: ToastPosition.center, + backgroundColor: colors.darkAccentColor); + } } else { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - "Please fill all fields!", - style: TextStyle(color: colors.errorColor), - ), - )); + showToast("Please fill all fields!"); } } diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 29cd709..dde1ce2 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -58,7 +58,7 @@ class _MyAppState extends State { String url = NETWORK_ADDRESS; var body = json.encode({"username": username, "password": password}); - var res = await http.post(Uri.https(url, '/api/login'), + var res = await http.post(Uri.http(url, '/api/login'), headers: {"Content-Type": "application/json"}, body: body); print("RES: ${res.body}"); @@ -68,7 +68,7 @@ class _MyAppState extends State { Future _getUserDetails(String JWT) async { String url = NETWORK_ADDRESS; - var res = await http.get(Uri.https(url, '/api/getUserData'), + var res = await http.get(Uri.http(url, '/api/getUserData'), headers: {"Content-Type": "application/json", 'user-auth-token': JWT}); print("RES: ${res.body}"); @@ -133,9 +133,7 @@ class _MyAppState extends State { } catch (e) { print(e); showToast( - "Something went wrong, please check your network connection or try again later", - position: ToastPosition.center, - backgroundColor: colors.darkAccentColor); + "Something went wrong, please check your network connection or try again later"); } } setState(() { diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index c7b8d7e..7a873e5 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -1,6 +1,9 @@ +import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:http/http.dart' as http; +import 'package:oktoast/oktoast.dart'; final storage = FlutterSecureStorage(); @@ -19,24 +22,44 @@ final storage = FlutterSecureStorage(); * LoadValidPageWidget(Login(), Home()); */ -class LoadValidPageWidget extends StatelessWidget{ - LoadValidPageWidget(this.DefaultPage, this.TargetPage, {Key? key}): super(key: key); +class LoadValidPageWidget extends StatelessWidget { + LoadValidPageWidget(this.DefaultPage, this.TargetPage, {Key? key}) + : super(key: key); final Widget DefaultPage; final Widget TargetPage; - Future get jwtToken async { + Future _validateToken(String JWT) async { + String url = NETWORK_ADDRESS; + + var res = await http.get(Uri.http(url, '/api/validateToken'), + headers: {"Content-Type": "application/json", 'user-auth-token': JWT}); + print("RES: ${res.body}"); + + return res; + } + + Future jwtToken(context) async { var jwt = await storage.read(key: JWT_STORAGE_KEY); print(JWT_STORAGE_KEY + jwt.toString()); if (jwt == null) return ""; + try { + var res = await _validateToken(jwt); + if (res.statusCode != 200) { + showToast(res.body); + return ""; + } + } catch (e) { + showToast("Couldn't validate token, continuing in offline mode!"); + } return jwt; } @override Widget build(BuildContext context) { return FutureBuilder( - future: jwtToken, + future: jwtToken(context), builder: (context, data) { if (!data.hasData) return DefaultPage; @@ -46,5 +69,4 @@ class LoadValidPageWidget extends StatelessWidget{ return TargetPage; }); } - -} \ No newline at end of file +} diff --git a/lib/main.dart b/lib/main.dart index e50ef4f..9133e98 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/LoadValidPageWidget.dart'; import 'package:oktoast/oktoast.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; final storage = FlutterSecureStorage(); @@ -14,13 +15,12 @@ void main() { SystemChrome.setPreferredOrientations( [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); - runApp(OKToast( - child: MaterialApp( - home: LoadValidPageWidget(Login(), Home()), - debugShowCheckedModeBanner: false, - theme: darkTheme.DarkTheme - ), - )); - } - - + runApp(OKToast( + position: ToastPosition.center, + backgroundColor: colors.darkAccentColor, + child: MaterialApp( + home: LoadValidPageWidget(Login(), Home()), + debugShowCheckedModeBanner: false, + theme: darkTheme.DarkTheme), + )); +} From 0f397387c4bafe8fb8c7025a0ff8ab0315a7d9cf Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 13:13:13 +0530 Subject: [PATCH 180/264] Removed media queries and aligned content in Change Password and Profile Page properly. --- lib/Screens/ChangePassword.dart | 23 +-- lib/Screens/ProfilePage.dart | 256 ++++++++++++-------------------- 2 files changed, 100 insertions(+), 179 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 8936ca0..275a704 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -86,11 +86,8 @@ class _ChangePasswordState extends State { ), height: 200, ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.05, - ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), + padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), child: TextFormField( obscureText: !_showPasswordOld, key: _oldPasswordKey, @@ -142,11 +139,9 @@ class _ChangePasswordState extends State { autovalidateMode: AutovalidateMode.disabled, ), ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.05, - ), + Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), + padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), child: TextFormField( obscureText: !_showPasswordNew, controller: _newPasswordController, @@ -201,11 +196,9 @@ class _ChangePasswordState extends State { autovalidateMode: AutovalidateMode.disabled, ), ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.04, - ), + Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), + padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), child: TextFormField( obscureText: !_showPasswordNewRepeat, controller: _newPasswordControllerRepeat, @@ -260,11 +253,9 @@ class _ChangePasswordState extends State { autovalidateMode: AutovalidateMode.disabled, ), ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.04, - ), + Padding( - padding: const EdgeInsets.symmetric(horizontal: 40.0), + padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), child: _showProgressBar ? CircularProgressIndicator() : SizedBox( diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 1ab531b..52d6e27 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -6,7 +6,6 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Screens/ChangePassword.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; -import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -35,69 +34,100 @@ class _ProfilePageState extends State { var dataJson = json.decode(snapshot.requireData); var gender = dataJson[0]["gender"]; return Scaffold( + appBar: AppBarBackButton( + 'Profile', + actions: [ + IconButton( + onPressed: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false); + }, + icon: Icon( + Icons.logout, + color: colors.darkAccentColor, + )) + ], + ), resizeToAvoidBottomInset: true, body: Stack(children: [ SvgPicture.asset('assets/svg/profile_bg.svg', alignment: Alignment.center, fit: BoxFit.fill), - SingleChildScrollView( - physics: ClampingScrollPhysics(), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppBarBackButton( - 'Profile', - actions: [ - IconButton( - onPressed: () async { - await storage.delete(key: 'jwt'); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute( - builder: (context) => Login()), - (Route route) => false); - }, - icon: Icon( - Icons.logout, - color: colors.darkAccentColor, - )) - ], - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.08, - ), - Center( - child: Column( - children: [ - Image( - image: gender == "Male" - ? AssetImage("assets/avatar_man.png") - : AssetImage("assets/avatar_woman.png"), - ), - Padding( - padding: const EdgeInsets.only(top: 15.0), - child: Text( - dataJson[0]["Name"], - style: GoogleFonts.poppins(fontSize: 20), - ), + CustomScrollView( + slivers: [ + SliverFillRemaining( + hasScrollBody: false, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: Column( + children: [ + Image( + image: gender == "Male" + ? AssetImage("assets/avatar_man.png") + : AssetImage("assets/avatar_woman.png"), + ), + Padding( + padding: const EdgeInsets.only(top: 15.0), + child: Text( + dataJson[0]["Name"], + style: GoogleFonts.poppins(fontSize: 20), + ), + ), + Text( + '@' + dataJson[0]["username"], + style: GoogleFonts.poppins( + fontSize: 15, + color: colors.darkSecondaryTextColor), + textAlign: TextAlign.start, + ), + ], ), - Text( - '@' + dataJson[0]["username"], - style: GoogleFonts.poppins( - fontSize: 15, - color: colors.darkSecondaryTextColor), - textAlign: TextAlign.start, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 40), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only( + bottom: 20, top: 50), + child: Container( + padding: + EdgeInsets.only(top: 15, left: 20.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(20)), + color: Color(0xff34344B)), + height: 50, + width: double.infinity, + child: Text( + 'Joined on: ${dataJson[0]["DateJoined"]}'), + ), + ), + Container( + padding: EdgeInsets.only(top: 15, left: 20.0), + width: double.infinity, + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(20)), + color: Color(0xff34344B)), + height: 50, + child: Text( + 'Records collected: ${dataJson[0]["NumberOfRecordsCollected"]}'), + ) + ], ), - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 20.0, vertical: 40.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.only(right: 6, left: 20), + ), + Center( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 40.0, vertical: 20.0), + child: SizedBox( + width: double.infinity, child: ElevatedButton.icon( style: ElevatedButton.styleFrom( primary: colors.darkSecondaryTextColor @@ -115,77 +145,19 @@ class _ProfilePageState extends State { color: colors.darkAccentColor, ), label: Text( - 'Change\nPassword', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - textAlign: TextAlign.center, - ), - ), - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 6, right: 20), - child: ElevatedButton.icon( - style: ElevatedButton.styleFrom( - primary: colors.darkSecondaryTextColor - .withOpacity(0.2), - ), - onPressed: () { - print('Button Clicked'); - _displayTextInputDialog(context); - }, - label: Text( - 'Change\nUsername', + 'Change Password', style: GoogleFonts.poppins( color: colors.darkPrimaryTextColor), textAlign: TextAlign.center, ), - icon: Icon( - Icons.person, - color: colors.darkAccentColor, - ), ), ), ), - ], - ), + ), + ], ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 40), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 20), - child: Container( - padding: EdgeInsets.only(top: 15, left: 20.0), - decoration: BoxDecoration( - borderRadius: - BorderRadius.all(Radius.circular(20)), - color: Color(0xff34344B)), - height: 50, - width: MediaQuery.of(context).size.width * 0.8, - child: Text( - 'Joined on: ${dataJson[0]["DateJoined"]}'), - ), - ), - Container( - padding: EdgeInsets.only(top: 15, left: 20.0), - width: MediaQuery.of(context).size.width * 0.8, - decoration: BoxDecoration( - borderRadius: - BorderRadius.all(Radius.circular(20)), - color: Color(0xff34344B)), - height: 50, - child: Text( - 'Records collected: ${dataJson[0]["NumberOfRecordsCollected"]}'), - ) - ], - ), - ) - ], - ), + ) + ], ), ]), ); @@ -198,45 +170,3 @@ class _ProfilePageState extends State { }); } } - -Future _displayTextInputDialog(BuildContext context) async { - return showDialog( - context: context, - builder: (context) { - var _textFieldController = TextEditingController(); - return AlertDialog( - backgroundColor: colors.darkScaffoldColor, - title: Text( - 'Enter Name', - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - ), - content: TextField( - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - onChanged: (value) {}, - controller: _textFieldController = TextEditingController(), - decoration: InputDecoration( - hintText: "Text Field in Dialog", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor)), - ), - actions: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: colors.darkAccentColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20))), - textStyle: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor)), - child: Text( - 'OK', - style: - GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - ), - onPressed: () { - if (_textFieldController.text != null) - globals.Name = _textFieldController.text; - Navigator.pop(context); - }) - ]); - }); -} From 31de03af47bcd03114073fed177bbcaebaecb4cd Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 15:07:28 +0530 Subject: [PATCH 181/264] Fixed tiny bugs --- lib/Screens/CollectLocationWidget.dart | 51 +++++++++++++++-------- lib/Screens/FamilyMemberAdd.dart | 25 ++++++------ lib/Screens/Home.dart | 2 +- lib/Screens/ProfilePage.dart | 52 +++++++++++++++++++++--- lib/Widgets/ConditionalRenderWidget.dart | 43 +++++++++++++++----- lib/Widgets/DatePickerWidget.dart | 1 + lib/Widgets/LoadValidPageWidget.dart | 2 +- lib/Widgets/NavigationDrawer.dart | 49 ++++++++++++++++++++-- 8 files changed, 173 insertions(+), 52 deletions(-) diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index 99c9881..a2e10dd 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -36,25 +36,40 @@ class _CollectLocationWidgetState extends State { onWillPop: () async { final result = await showDialog( context: context, - builder: (context) => - AlertDialog( - title: Text("Are you sure?"), - content: Text("All unsaved changes will be lost."), - actions: [ - TextButton( - child:Text('No'), - onPressed: () { - Navigator.pop(context, false); - }, - ), - TextButton( - child: Text('Yes', style: TextStyle(color: Colors.red)), - onPressed: () { - Navigator.pop(context, true); - }, - ), - ], + builder: (context) => AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + content: Text( + "All unsaved changes will be lost.", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + actions: [ + TextButton( + child: Text( + 'No', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: () { + Navigator.pop(context, false); + }, ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: Text('Yes', + style: TextStyle(color: colors.darkPrimaryTextColor)), + onPressed: () async { + Navigator.pop(context, true); + }, + ), + ], + ), ); return result; }, diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index e937020..718d3d6 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -121,9 +121,6 @@ class _FamilyMemberAddState extends State { Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { - if (!isPageValid) { - return true; - } final result = await showDialog( context: context, builder: (context) => AlertDialog( @@ -217,7 +214,7 @@ class _FamilyMemberAddState extends State { print(data); }, validator: (val) { - if (val!.isAfter(DateTime.now())) { + if (val != null) if (val.isAfter(DateTime.now())) { return 'Please choose a valid date'; } }, @@ -291,7 +288,7 @@ class _FamilyMemberAddState extends State { children: [ Padding( padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 20.0), + left: 10.0, right: 10.0, bottom: 20.0, top: 20.0), child: TextFormField( initialValue: widget.familyMemberIndividualDataModel?.aadhaarNumber, @@ -371,8 +368,9 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.dailyWageWorker = val; }, - conditionalValue: 'yes', - conditionalWidget: NestedOptionWidgetFormField( + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: NestedOptionWidgetFormField( nestedOptionData: [ new NestedOptionData( subOptionDataMap: {"yes": true, "no": true}, @@ -390,6 +388,9 @@ class _FamilyMemberAddState extends State { title: 'Select some options', context: context, ), + conditionalNegativeWidget: Column( + children: [Text("NOPE"), Text("NOPE"), Text("NOPE")], + ), ), /** * Ends here @@ -789,14 +790,14 @@ class _FamilyMemberAddState extends State { CheckBoxAddExtraAlertDialog( title: 'Tobacco products', hint: 'Choose applicable products', - dataMap: widget.familyMemberIndividualDataModel! - .tobaccoProducts ?? + dataMap: widget + .familyMemberIndividualDataModel!.tobaccoProducts ?? tobaccoProducts, context: context, errorField: 'Please choose at least one', onSaved: (map) { - widget.familyMemberIndividualDataModel! - .tobaccoProducts = map; + widget.familyMemberIndividualDataModel!.tobaccoProducts = + map; }, ), OptionsWidget( @@ -857,5 +858,3 @@ class _FamilyMemberAddState extends State { ); } } - - diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 918b106..3bdd3d6 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -65,7 +65,7 @@ class _HomeWidgetState extends State { )), TextButton( onPressed: () { - Navigator.pop(context, true); + Navigator.of(context).pop(); }, child: Text( 'No', diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 52d6e27..af453bd 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -38,14 +38,56 @@ class _ProfilePageState extends State { 'Profile', actions: [ IconButton( + splashRadius: 20, onPressed: () async { - await storage.delete(key: 'jwt'); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); + showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + content: Text( + "You will be logged out", + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + actions: [ + TextButton( + child: Text( + 'No', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(20)))), + child: Text('Yes', + style: TextStyle( + color: colors.darkPrimaryTextColor)), + onPressed: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute( + builder: (context) => Login()), + (Route route) => false); + }, + ), + ], + ), + ); }, icon: Icon( - Icons.logout, + Icons.login_outlined, color: colors.darkAccentColor, )) ], diff --git a/lib/Widgets/ConditionalRenderWidget.dart b/lib/Widgets/ConditionalRenderWidget.dart index 9375e96..2c36938 100644 --- a/lib/Widgets/ConditionalRenderWidget.dart +++ b/lib/Widgets/ConditionalRenderWidget.dart @@ -7,17 +7,21 @@ class ConditionalRenderWidget extends StatefulWidget { this.defaultValue, this.onSaved, required this.title, - required this.conditionalWidget, + required this.conditionalPositiveWidget, required this.options, - required this.conditionalValue}) + required this.conditionalPositiveValue, + required this.conditionalNegativeValue, + required this.conditionalNegativeWidget}) : super(key: key); final defaultValue; - final String conditionalValue; + final String conditionalPositiveValue; + final String conditionalNegativeValue; final String title; final List options; final Function(dynamic)? onSaved; - final Widget conditionalWidget; + final Widget conditionalPositiveWidget; + final Widget conditionalNegativeWidget; @override _ConditionalRenderWidgetState createState() => @@ -25,9 +29,23 @@ class ConditionalRenderWidget extends StatefulWidget { } class _ConditionalRenderWidgetState extends State { - //(widget.defaultValue == widget.conditionalValue) - //TODO: Add a check condition to see if default value equals conditional value and update isVisible - bool isVisible = false; + bool isPositiveVisible = false; + bool isNegativeVisible = false; + + @override + void initState() { + super.initState(); + initData(); + } + + initData() { + if (widget.defaultValue != null) { + isPositiveVisible = + (widget.defaultValue == widget.conditionalPositiveValue); + isNegativeVisible = + (widget.defaultValue == widget.conditionalNegativeValue); + } + } @override Widget build(BuildContext context) { @@ -39,15 +57,20 @@ class _ConditionalRenderWidgetState extends State { options: widget.options, onChanged: (val) { setState(() { - isVisible = (val == widget.conditionalValue); + isPositiveVisible = (val == widget.conditionalPositiveValue); + isNegativeVisible = (val == widget.conditionalNegativeValue); }); }, title: widget.title, onSaved: widget.onSaved, ), Visibility( - child: widget.conditionalWidget, - visible: isVisible, + child: widget.conditionalPositiveWidget, + visible: isPositiveVisible, + ), + Visibility( + child: widget.conditionalNegativeWidget, + visible: isNegativeVisible, ) ], ); diff --git a/lib/Widgets/DatePickerWidget.dart b/lib/Widgets/DatePickerWidget.dart index 1b9a7ad..d155e37 100644 --- a/lib/Widgets/DatePickerWidget.dart +++ b/lib/Widgets/DatePickerWidget.dart @@ -27,6 +27,7 @@ class DatePickerWidget extends FormField { await CupertinoRoundedDatePicker.show(context, background: colors.darkSecondBackgroundColor, textColor: colors.darkAccentColor, + initialDate: state.value ?? DateTime.now(), minimumYear: 1900, maximumDate: DateTime.now(), maximumYear: DateTime.now().year, diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index 7a873e5..a724956 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -62,7 +62,7 @@ class LoadValidPageWidget extends StatelessWidget { future: jwtToken(context), builder: (context, data) { if (!data.hasData) - return DefaultPage; + return CircularProgressIndicator(); else if (data.hasData && data.data == '') return DefaultPage; else diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index 58d0343..b398f0a 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -90,10 +90,51 @@ class NavigationDrawer extends StatelessWidget { text: 'Sign Out', icon: Icons.logout, onTap: () async { - await storage.delete(key: 'jwt'); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); + showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + content: Text( + "You will be logged out", + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + actions: [ + TextButton( + child: Text( + 'No', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(20)))), + child: Text('Yes', + style: TextStyle( + color: colors.darkPrimaryTextColor)), + onPressed: () async { + await storage.delete(key: 'jwt'); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute( + builder: (context) => Login()), + (Route route) => false); + }, + ), + ], + ), + ); }, ), ], From d44aa2f2fd2a74a3402de70a23bf4ea09de1c9a6 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 15:50:04 +0530 Subject: [PATCH 182/264] Added method to re render page to reflect user name when changed in Family Individual Data page --- lib/Widgets/AddRemoveBoxWidget.dart | 174 ++++++++++++++++------------ pubspec.lock | 7 ++ pubspec.yaml | 1 + 3 files changed, 107 insertions(+), 75 deletions(-) diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 459c6bd..7f92683 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -3,6 +3,7 @@ import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; +import 'package:visibility_detector/visibility_detector.dart'; /** * Added a dataclass @@ -18,87 +19,110 @@ class AddRemoveBoxWidget extends StatefulWidget { _AddRemoveBoxWidgetState createState() => _AddRemoveBoxWidgetState(); } -class _AddRemoveBoxWidgetState extends State { +class _AddRemoveBoxWidgetState extends State + with WidgetsBindingObserver { + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + super.didChangeAppLifecycleState(state); + + if (state == AppLifecycleState.resumed) { + setState(() {}); + } + } + @override Widget build(BuildContext context) { - return - Expanded( - flex: 2, - child: Padding( - padding: EdgeInsets.all(5), - child: Column( + return Expanded( + flex: 2, + child: Padding( + padding: EdgeInsets.all(5), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - TextButton( - onPressed: () { - setState(() { - widget.modelData?.individualDataListTransient - .add(FamilyMemberIndividualDataModel()); - }); - }, - child: Text("Add New User Information", - style: GoogleFonts.poppins( - fontSize: 18, color: colors.darkAccentColor)), - ), - IconButton( - onPressed: () { - setState(() { - widget.modelData?.individualDataListTransient - .add(FamilyMemberIndividualDataModel()); - }); - }, - icon: Icon( - Icons.add, - color: colors.darkAccentColor, - )) - ], - ), - Flexible( - child: Container( - child: widget.modelData!.individualDataListTransient.isEmpty - ? Center(child: Text('No Members Added')) - : ListView.builder( - itemCount: widget - .modelData!.individualDataListTransient.length, - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return Card( - color: colors.darkSecondBackgroundColor, - child: ListTile( - onTap: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => FamilyMemberAdd( - familyMemberIndividualDataModel: - widget.modelData! - .individualDataListTransient - .elementAt(index)))); - }, - leading: Icon(Icons.person), - //TODO: Replace User n with user's name - title: Text( - "User ${index + 1}", - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 20), - ), - trailing: IconButton( - color: colors.darkSecondAccentColor, - icon: Icon(Icons.close), - onPressed: () async { - Dialog(index); - })), - ); - }), - ), + TextButton( + onPressed: () { + setState(() { + widget.modelData?.individualDataListTransient + .add(FamilyMemberIndividualDataModel()); + }); + }, + child: Text("Add New User Information", + style: GoogleFonts.poppins( + fontSize: 18, color: colors.darkAccentColor)), ), + IconButton( + onPressed: () { + setState(() { + widget.modelData?.individualDataListTransient + .add(FamilyMemberIndividualDataModel()); + }); + }, + icon: Icon( + Icons.add, + color: colors.darkAccentColor, + )) ], ), - ), - ); + Flexible( + child: Container( + child: widget.modelData!.individualDataListTransient.isEmpty + ? Center(child: Text('No Members Added')) + : ListView.builder( + itemCount: widget + .modelData!.individualDataListTransient.length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Card( + color: colors.darkSecondBackgroundColor, + child: VisibilityDetector( + /** + * Re-renders tiles whenever visibility changed + * i.e, when user comes back from user page, + * page re rendered and user name is reflected + */ + onVisibilityChanged: (VisibilityInfo info) { + setState(() {}); + }, + key: Key('add-remove-widget-key'), + child: ListTile( + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => FamilyMemberAdd( + familyMemberIndividualDataModel: + widget.modelData! + .individualDataListTransient + .elementAt(index)))); + }, + leading: Icon(Icons.person), + title: Text( + widget.modelData! + .individualDataListTransient + .elementAt(index) + .userName ?? + "User ${index + 1}", + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + trailing: IconButton( + color: colors.darkSecondAccentColor, + icon: Icon(Icons.close), + onPressed: () async { + Dialog(index); + })), + ), + ); + }), + ), + ), + ], + ), + ), + ); } void Dialog(index) async { diff --git a/pubspec.lock b/pubspec.lock index 087ccbc..43b34a0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -707,6 +707,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.1" + visibility_detector: + dependency: "direct main" + description: + name: visibility_detector + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.2" watcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 467fa6b..5a7ca42 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ environment: sdk: ">=2.12.0 <3.0.0" dependencies: + visibility_detector: ^0.2.2 oktoast: ^3.1.5 preload_page_view: ^0.1.6 flutter_typeahead: ^3.2.4 From ee21dc784855235594cc5583f020c6c4c85d9052 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 15:54:17 +0530 Subject: [PATCH 183/264] Added method to re render page to reflect user name when changed in Family Individual Data page --- lib/Widgets/AddRemoveBoxWidget.dart | 38 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 7f92683..5367654 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -19,17 +19,7 @@ class AddRemoveBoxWidget extends StatefulWidget { _AddRemoveBoxWidgetState createState() => _AddRemoveBoxWidgetState(); } -class _AddRemoveBoxWidgetState extends State - with WidgetsBindingObserver { - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - super.didChangeAppLifecycleState(state); - - if (state == AppLifecycleState.resumed) { - setState(() {}); - } - } - +class _AddRemoveBoxWidgetState extends State { @override Widget build(BuildContext context) { return Expanded( @@ -77,14 +67,14 @@ class _AddRemoveBoxWidgetState extends State itemBuilder: (BuildContext context, int index) { return Card( color: colors.darkSecondBackgroundColor, + /** + * Re-renders tiles whenever visibility changed + * i.e, when user comes back from user page, + * page re rendered and user name is reflected + */ child: VisibilityDetector( - /** - * Re-renders tiles whenever visibility changed - * i.e, when user comes back from user page, - * page re rendered and user name is reflected - */ onVisibilityChanged: (VisibilityInfo info) { - setState(() {}); + setState(() {}); //Re-renders page }, key: Key('add-remove-widget-key'), child: ListTile( @@ -99,10 +89,20 @@ class _AddRemoveBoxWidgetState extends State leading: Icon(Icons.person), title: Text( widget.modelData! + .individualDataListTransient + .elementAt(index) + .userName != + null && + widget.modelData! + .individualDataListTransient + .elementAt(index) + .userName != + '' + ? widget.modelData! .individualDataListTransient .elementAt(index) - .userName ?? - "User ${index + 1}", + .userName! + : "User ${index + 1}", style: GoogleFonts.poppins( color: Colors.white, fontWeight: FontWeight.w400, From 831ca866fdcd9b2297e3a45c57d83c43cd01e02c Mon Sep 17 00:00:00 2001 From: nirmal Date: Wed, 19 Jan 2022 15:55:46 +0530 Subject: [PATCH 184/264] Completed FamilyMemberAdd.dart --- lib/Constants/Constants.dart | 4 +- lib/Screens/FamilyMemberAdd.dart | 253 +++++++++++++------------------ pubspec.lock | 17 +-- 3 files changed, 111 insertions(+), 163 deletions(-) diff --git a/lib/Constants/Constants.dart b/lib/Constants/Constants.dart index 8e2d797..065a857 100644 --- a/lib/Constants/Constants.dart +++ b/lib/Constants/Constants.dart @@ -1,6 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -//String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; -String NETWORK_ADDRESS = '192.168.29.126:2000'; +String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +//String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; final String MALE = "Male"; final String FEMALE = "Female"; diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 718d3d6..18a2f0a 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -336,65 +336,25 @@ class _FamilyMemberAddState extends State { errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), - //TODO: Occupation widget replace - CheckBoxAddExtraAlertDialog( + //TODO: Occupation widget db functions update + NestedOptionWidgetFormField( + nestedOptionData: [ + new NestedOptionData( + subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, + boxName: 'Category One'), + new NestedOptionData( + subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, + boxName: 'Category Two'), + new NestedOptionData( + subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, + boxName: 'Category Three'), + new NestedOptionData( + subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, + boxName: 'Category Four') + ], title: 'Occupation', - hint: 'Select applicable', - dataMap: - widget.familyMemberIndividualDataModel!.occupation ?? - occupations, - singleOption: false, context: context, - onSaved: (map) { - print(map); - widget.familyMemberIndividualDataModel!.occupation = map; - }, - errorField: "Please choose an occupation / None", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - /** - * Example widget for conditional rendering - */ - ConditionalRenderWidget( - title: "Select data", - defaultValue: - widget.familyMemberIndividualDataModel!.dailyWageWorker, - options: [ - ["Yes", "yes"], - ["No", "no"] - ], - onSaved: (val) { - print("Value recorded: $val"); - widget.familyMemberIndividualDataModel!.dailyWageWorker = - val; - }, - conditionalPositiveValue: 'yes', - conditionalNegativeValue: 'no', - conditionalPositiveWidget: NestedOptionWidgetFormField( - nestedOptionData: [ - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, - boxName: 'One'), - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, - boxName: 'Two'), - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, - boxName: 'Three'), - new NestedOptionData( - subOptionDataMap: {"yes": false, "no": false}, - boxName: 'Four') - ], - title: 'Select some options', - context: context, - ), - conditionalNegativeWidget: Column( - children: [Text("NOPE"), Text("NOPE"), Text("NOPE")], - ), ), - /** - * Ends here - */ OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel!.dailyWageWorker, @@ -419,24 +379,6 @@ class _FamilyMemberAddState extends State { val; }, ), - NestedOptionWidgetFormField( - nestedOptionData: [ - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, - boxName: 'One'), - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, - boxName: 'Two'), - new NestedOptionData( - subOptionDataMap: {"yes": true, "no": true}, - boxName: 'Three'), - new NestedOptionData( - subOptionDataMap: {"yes": false, "no": false}, - boxName: 'Four') - ], - title: 'Select some options', - context: context, - ), Padding( padding: EdgeInsets.all(15), child: StartingEndingTimeWidget( @@ -669,7 +611,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.surgeries = data; }, - title: 'Surgeries', + title: 'Any Surgeries?', ), ), ], @@ -691,37 +633,40 @@ class _FamilyMemberAddState extends State { title: 'Aware about Anganwadi services?', ), Padding( - padding: const EdgeInsets.all(20.0), - child: OptionsWidget( - defaultValue: widget.familyMemberIndividualDataModel! - .anganwadiServicesUsing, + padding: const EdgeInsets.all(20), + child: ConditionalRenderWidget( + title: 'Using any Anganwadi services?', + defaultValue: + widget.familyMemberIndividualDataModel!.anganwadiServicesUsing, options: [ ["Yes", "yes"], - ["No", "no"], + ["No", "no"] ], - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .anganwadiServicesUsing = data; + onSaved: (val) { + print("Value recorded: $val"); + widget.familyMemberIndividualDataModel!.anganwadiServicesUsing = + val; }, - title: 'Using any Anganwadi services?', + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: TagTextWidget( + autoValidateMode: AutovalidateMode.onUserInteraction, + label: "Anganwadi services utilised", + hint: "Enter services here", + initialValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesUsedList, + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .anganwadiServicesUsedList = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), conditionalNegativeWidget: Container(), ), ), - TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Anganwadi services utilised", - hint: "Enter services here", - initialValue: widget.familyMemberIndividualDataModel! - .anganwadiServicesUsedList, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .anganwadiServicesUsedList = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), Padding( padding: const EdgeInsets.all(20.0), child: OptionsWidget( @@ -739,66 +684,76 @@ class _FamilyMemberAddState extends State { ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), - child: OptionsWidget( - defaultValue: widget.familyMemberIndividualDataModel! - .privateClinicServicesUsed, + padding: const EdgeInsets.all(20), + child: ConditionalRenderWidget( + title: 'Do you visit a private hospital?', + defaultValue: + widget.familyMemberIndividualDataModel!.privateClinicServicesUsed, options: [ ["Yes", "yes"], - ["No", "no"], + ["No", "no"] ], - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .privateClinicServicesUsed = data; + onSaved: (val) { + print("Value recorded: $val"); + widget.familyMemberIndividualDataModel!.privateClinicServicesUsed = + val; }, - title: 'Do you visit a private hospital?', + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( + title: 'Reasons for using a private clinic', + hint: 'Please choose a reason', + dataMap: widget.familyMemberIndividualDataModel! + .privateServiceReason ?? + privateClinicReasons, + singleOption: false, + context: context, + onSaved: (map) { + widget.familyMemberIndividualDataModel! + .privateServiceReason = map; + }, + errorField: "Please choose a reason", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), conditionalNegativeWidget: Container(), ), - ), + ) ], ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - CheckBoxAddExtraAlertDialog( - title: 'Reasons for using a private clinic', - hint: 'Please choose a reason', - dataMap: widget.familyMemberIndividualDataModel! - .privateServiceReason ?? - privateClinicReasons, - singleOption: false, - context: context, - onSaved: (map) { - widget.familyMemberIndividualDataModel! - .privateServiceReason = map; - }, - errorField: "Please choose a reason", - autoValidateMode: AutovalidateMode.onUserInteraction, - ), - OptionsWidget( - defaultValue: - widget.familyMemberIndividualDataModel!.useOfTobacco, - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - title: "Do you use any tobacco based products?", - onSaved: (data) { - widget.familyMemberIndividualDataModel!.useOfTobacco = - data; - }, - ), - CheckBoxAddExtraAlertDialog( - title: 'Tobacco products', - hint: 'Choose applicable products', - dataMap: widget + Padding( + padding: const EdgeInsets.all(20), + child: ConditionalRenderWidget( + title: 'Do you use any tobacco based products?', + defaultValue: + widget.familyMemberIndividualDataModel!.useOfTobacco, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.familyMemberIndividualDataModel!.useOfTobacco = + val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget:CheckBoxAddExtraAlertDialog( + title: 'Tobacco products', + hint: 'Choose applicable products', + dataMap: widget .familyMemberIndividualDataModel!.tobaccoProducts ?? - tobaccoProducts, - context: context, - errorField: 'Please choose at least one', - onSaved: (map) { - widget.familyMemberIndividualDataModel!.tobaccoProducts = - map; - }, + tobaccoProducts, + context: context, + errorField: 'Please choose at least one', + onSaved: (map) { + widget.familyMemberIndividualDataModel!.tobaccoProducts = + map; + }, + ), + conditionalNegativeWidget: Container(), + ), ), OptionsWidget( defaultValue: diff --git a/pubspec.lock b/pubspec.lock index 43b34a0..ea07060 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -28,7 +28,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.8.1" auto_size_text: dependency: "direct main" description: @@ -105,7 +105,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.1.0" charcode: dependency: transitive description: @@ -414,7 +414,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.10" meta: dependency: transitive description: @@ -685,7 +685,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.2" timing: dependency: transitive description: @@ -706,14 +706,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" - visibility_detector: - dependency: "direct main" - description: - name: visibility_detector - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.2" + version: "2.1.0" watcher: dependency: transitive description: From f78158fef901ab60116b8ccc71f397c3eda77e0c Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 16:53:39 +0530 Subject: [PATCH 185/264] Added constant variable for storage keys --- lib/Constants/Constants.dart | 2 + lib/Screens/Home.dart | 3 +- lib/Screens/Login.dart | 5 +- lib/Screens/ProfilePage.dart | 5 +- lib/Widgets/LoadValidPageWidget.dart | 9 ++- lib/Widgets/LoginFormCard.dart | 63 +++++++++++++------- lib/Widgets/NavigationDrawer.dart | 5 +- lib/Widgets/NestedOptionWidgetFormField.dart | 8 ++- 8 files changed, 68 insertions(+), 32 deletions(-) diff --git a/lib/Constants/Constants.dart b/lib/Constants/Constants.dart index 065a857..5f90edd 100644 --- a/lib/Constants/Constants.dart +++ b/lib/Constants/Constants.dart @@ -2,6 +2,8 @@ String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; //String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; +String USER_ID_KEY = "userId"; +String USER_DATA_KEY = "userData"; final String MALE = "Male"; final String FEMALE = "Female"; final String OTHER = "Other"; diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 3bdd3d6..44b286c 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -24,7 +25,7 @@ class Home extends StatefulWidget { final storage = FlutterSecureStorage(); Future get _getUserName async { - var userName = await storage.read(key: "userData"); + var userName = await storage.read(key: USER_DATA_KEY); print("userData " + userName.toString()); if (userName == null) return ""; diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index dde1ce2..92637d1 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -116,8 +116,9 @@ class _MyAppState extends State { position: ToastPosition.center, backgroundColor: colors.darkAccentColor); } else { - storage.write(key: "userData", value: userData.body); - storage.write(key: "jwt", value: loginResponse.body); + storage.write(key: USER_DATA_KEY, value: userData.body); + storage.write(key: JWT_STORAGE_KEY, value: loginResponse.body); + storage.write(key: USER_ID_KEY, value: username); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => Home()), (Route route) => false); diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index af453bd..952afbd 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/ChangePassword.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -17,7 +18,7 @@ class ProfilePage extends StatefulWidget { final storage = FlutterSecureStorage(); Future get _getUserData async { - var userData = await storage.read(key: "userData"); + var userData = await storage.read(key: USER_DATA_KEY); print("userData " + userData.toString()); if (userData == null) return ""; @@ -75,7 +76,7 @@ class _ProfilePageState extends State { style: TextStyle( color: colors.darkPrimaryTextColor)), onPressed: () async { - await storage.delete(key: 'jwt'); + await storage.delete(key: JWT_STORAGE_KEY); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute( builder: (context) => Login()), diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index a724956..524ea4f 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -47,7 +47,8 @@ class LoadValidPageWidget extends StatelessWidget { try { var res = await _validateToken(jwt); if (res.statusCode != 200) { - showToast(res.body); + await storage.delete(key: JWT_STORAGE_KEY); + showToast("Token could not be validated, logging out"); return ""; } } catch (e) { @@ -62,7 +63,11 @@ class LoadValidPageWidget extends StatelessWidget { future: jwtToken(context), builder: (context, data) { if (!data.hasData) - return CircularProgressIndicator(); + return Scaffold( + body: Center( + child: CircularProgressIndicator(), + ), + ); else if (data.hasData && data.data == '') return DefaultPage; else diff --git a/lib/Widgets/LoginFormCard.dart b/lib/Widgets/LoginFormCard.dart index d13e5c0..188f1f4 100644 --- a/lib/Widgets/LoginFormCard.dart +++ b/lib/Widgets/LoginFormCard.dart @@ -1,7 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +final storage = FlutterSecureStorage(); + +Future getUserName() async { + var jwt = await storage.read(key: USER_ID_KEY); + print(USER_ID_KEY + jwt.toString()); + + if (jwt == null) return ""; + return jwt; +} class FormCard extends StatefulWidget { FormCard(this._usernameController, this._passwordController, this._nameError, @@ -17,9 +28,17 @@ class FormCard extends StatefulWidget { } class _FormCardState extends State { - var _showPassword = false; + setUserName() async { + widget._usernameController.text = await getUserName(); + } + + void initState() { + super.initState(); + setUserName(); + } + @override Widget build(BuildContext context) { return new Container( @@ -42,15 +61,17 @@ class _FormCardState extends State { controller: widget._usernameController, decoration: InputDecoration( hintText: "Enter username here", - hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + hintStyle: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), label: Text("Username", - style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor)), + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor)), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: colors.darkSecondaryTextColor, width: 1.0)), focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.successColor, width: 1.0)), + borderSide: + BorderSide(color: colors.successColor, width: 1.0)), // border: OutlineInputBorder( // borderSide: BorderSide( // color: colors.darkSecondaryTextColor, width: 1.0 @@ -70,37 +91,39 @@ class _FormCardState extends State { obscureText: !_showPassword, style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), decoration: InputDecoration( - suffixIcon: IconButton(onPressed: () { - setState(() { - _showPassword = !_showPassword; - }); - }, + suffixIcon: IconButton( + onPressed: () { + setState(() { + _showPassword = !_showPassword; + }); + }, icon: Icon( - _showPassword ? Icons.visibility_off : Icons.visibility, + _showPassword ? Icons.visibility_off : Icons.visibility, color: colors.darkAccentColor, ), - ), hintText: "Enter password here", - hintStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + hintStyle: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), focusColor: Color(0xffF5A06D), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: colors.darkSecondaryTextColor, width: 1.0)), focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.successColor, width: 1.0)), + borderSide: + BorderSide(color: colors.successColor, width: 1.0)), border: OutlineInputBorder( - borderSide: BorderSide( - color: colors.successColor, width: 1.0 - ), + borderSide: + BorderSide(color: colors.successColor, width: 1.0), ), label: Text("Password", - style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor)), + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor)), floatingLabelStyle: GoogleFonts.poppins(color: colors.darkSecondaryTextColor), errorText: widget._passwordError, - labelStyle: GoogleFonts.poppins(fontSize: 14.0,color: colors.darkAccentColor), + labelStyle: GoogleFonts.poppins( + fontSize: 14.0, color: colors.darkAccentColor), )), SizedBox( height: 30, diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index b398f0a..6559f6d 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Screens/ProfilePage.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; @@ -10,7 +11,7 @@ import 'package:google_fonts/google_fonts.dart'; final storage = FlutterSecureStorage(); Future get _getUserData async { - var userData = await storage.read(key: "userData"); + var userData = await storage.read(key: USER_DATA_KEY); print("userData " + userData.toString()); if (userData == null) return ""; @@ -125,7 +126,7 @@ class NavigationDrawer extends StatelessWidget { style: TextStyle( color: colors.darkPrimaryTextColor)), onPressed: () async { - await storage.delete(key: 'jwt'); + await storage.delete(key: JWT_STORAGE_KEY); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute( builder: (context) => Login()), diff --git a/lib/Widgets/NestedOptionWidgetFormField.dart b/lib/Widgets/NestedOptionWidgetFormField.dart index 4e6d6a8..7439e61 100644 --- a/lib/Widgets/NestedOptionWidgetFormField.dart +++ b/lib/Widgets/NestedOptionWidgetFormField.dart @@ -3,7 +3,6 @@ import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; - class NestedOptionWidgetFormField extends FormField> { NestedOptionWidgetFormField( {FormFieldSetter>? onSaved, @@ -44,6 +43,8 @@ class NestedOptionWidgetFormField extends FormField> { if (selectedOptions.isNotEmpty) { return Text( selectedOptions.join(", "), + maxLines: 1, + overflow: TextOverflow.ellipsis, style: GoogleFonts.poppins( color: Colors.white, fontWeight: FontWeight.w400, @@ -84,9 +85,10 @@ class NestedOptionWidgetFormField extends FormField> { builder: (context) => NestedOptionWidget( title: title, onChanged: (val) { - for(var i in val){ + for (var i in val) { print(i.toJsonString()); - var decodedVal = NestedOptionData.fromJson(i.toJsonString()); + var decodedVal = NestedOptionData.fromJson( + i.toJsonString()); } state.didChange(val); state.validate(); From 5d67e1b6671083357af02609ac3dee9c01efcbed Mon Sep 17 00:00:00 2001 From: nirmal Date: Wed, 19 Jan 2022 17:00:32 +0530 Subject: [PATCH 186/264] Altered FamilyDetails.dart --- lib/Screens/FamilyDetails.dart | 140 +++++++++++++++++++++------------ pubspec.lock | 7 ++ 2 files changed, 95 insertions(+), 52 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 6a292fc..4340008 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -4,6 +4,7 @@ import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; +import 'package:geo_spatial/Widgets/ConditionalRenderWidget.dart'; import 'package:geo_spatial/Widgets/DropDownFormField.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; @@ -241,34 +242,60 @@ class _FamilyDetailsState extends State { }); }, title: "Do you have toilet facilities?"), - if(!toiletFacility) - CheckBoxAddExtraAlertDialog( - title: 'Why do you not have a toilet?', - hint: 'Please choose reason', - singleOption: false, - context: context, - dataMap: - widget.modelData!.noToiletsWhy ?? - noToiletsWhy, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData?.noToiletsWhy = val; - }, - errorField: "Please choose a reason", - autoValidateMode: - AutovalidateMode.onUserInteraction, - ), - OptionsWidget( + Padding( + padding: const EdgeInsets.all(20), + child: ConditionalRenderWidget( + title: "Source of Water", + defaultValue: + widget.modelData!.toiletFacility, options: [ - ['Yes', 'yes'], - ['No', 'no'] + ["Yes", "yes"], + ["No", "no"] ], - defaultValue: widget.modelData!.communityToilet, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.communityToilet = val; + widget.modelData!.toiletFacility = + val; }, - title: "If not toilet, community toilet?"), + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: Container(), + conditionalNegativeWidget: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 25.0), + child: CheckBoxAddExtraAlertDialog( + title: 'Why do you not have a toilet?', + hint: 'Please choose reason', + singleOption: false, + context: context, + dataMap: + widget.modelData!.noToiletsWhy ?? + noToiletsWhy, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.noToiletsWhy = val; + }, + errorField: "Please choose a reason", + autoValidateMode: + AutovalidateMode.onUserInteraction, + ), + ), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.communityToilet, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.communityToilet = val; + }, + title: "Community toilet?"), + ], + ), + ), + ), OptionsWidget( options: [ ['Clean', 'clean'], @@ -379,30 +406,46 @@ class _FamilyDetailsState extends State { widget.modelData!.isCattleOwned = val; }, title: "Do you own cattle?"), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20.0), - child: TextFormField( - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - initialValue: widget.modelData!.incomeFromCattle, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.incomeFromCattle = val; - }, - decoration: InputDecoration( - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - hintText: "Enter income in Rupees", - label: AutoSizeText( - 'Income from cattle/month', - style: GoogleFonts.poppins( + ConditionalRenderWidget( + title: "Do you own cattle?", + defaultValue: + widget.modelData!.isCattleOwned, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isCattleOwned = + val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20.0), + child: TextFormField( + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + initialValue: widget.modelData!.incomeFromCattle, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.incomeFromCattle = val; + }, + decoration: InputDecoration( + hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - )), - autovalidateMode: AutovalidateMode.always, - keyboardType: TextInputType.number, + contentPadding: EdgeInsets.all(7.0), + hintText: "Enter income in Rupees", + label: AutoSizeText( + 'Income from cattle/month', + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + )), + autovalidateMode: AutovalidateMode.always, + keyboardType: TextInputType.number, + ), ), - ), + conditionalNegativeWidget: Container()), OptionsWidget( options: [ ['Yes', 'yes'], @@ -482,9 +525,6 @@ class _FamilyDetailsState extends State { singleOption: false, context: context, ), - - //TODO: Add autosuggest AutoSizeText widget for locally consumed food - //TODO: Add autosuggest AutoSizeText widget for trees owned OptionsWidget( options: [ ['Yes', 'yes'], @@ -515,7 +555,6 @@ class _FamilyDetailsState extends State { widget.modelData!.kitchenGardenPlants = val; }, ), - //TODO: Add autosuggest AutoSizeText widget for kitchen garden crops Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -627,6 +666,3 @@ class _FamilyDetailsState extends State { } -//TODO: Insert values to checkboxalertdialogs - - diff --git a/pubspec.lock b/pubspec.lock index ea07060..50496a7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -707,6 +707,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + visibility_detector: + dependency: "direct main" + description: + name: visibility_detector + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.2" watcher: dependency: transitive description: From caed74f782a845c51e1cefc7b6feb469b6706049 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 18:29:51 +0530 Subject: [PATCH 187/264] Removed unused libraries --- lib/Screens/ChangePassword.dart | 18 +++--- lib/Screens/EditExistingRecordsPage.dart | 2 - lib/Screens/FamilyMemberAdd.dart | 70 +++++++++++++----------- lib/Screens/Home.dart | 1 - lib/Screens/Login.dart | 2 - lib/Screens/ProfilePage.dart | 27 +++++++++ lib/Screens/VillageSelection.dart | 2 - lib/Widgets/AppBarBackButtonWidget.dart | 1 - lib/Widgets/DatePicker.dart | 29 ++++------ lib/Widgets/DropDownFormField.dart | 1 - lib/Widgets/FormPageView.dart | 1 - lib/Widgets/GenderWidget.dart | 1 - lib/Widgets/IncomeWithTypeTextField.dart | 2 +- lib/Widgets/LoadValidPageWidget.dart | 1 - lib/Widgets/LocationWidget.dart | 1 - lib/Widgets/OptionsFormWidget.dart | 1 - lib/Widgets/StepCounterWidget.dart | 6 +- 17 files changed, 89 insertions(+), 77 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 275a704..837e36b 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -52,8 +52,7 @@ class _ChangePasswordState extends State { String jwt = await jwtToken; - var res = await http.put( - Uri.http(url, '/api/changeUserPassword/${username}'), + var res = await http.put(Uri.http(url, '/api/changeUserPassword'), headers: {"Content-Type": "application/json", 'user-auth-token': jwt}, body: body); print("RES: ${res.body}"); @@ -87,7 +86,8 @@ class _ChangePasswordState extends State { height: 200, ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 40.0, vertical: 20), child: TextFormField( obscureText: !_showPasswordOld, key: _oldPasswordKey, @@ -139,9 +139,9 @@ class _ChangePasswordState extends State { autovalidateMode: AutovalidateMode.disabled, ), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 40.0, vertical: 20), child: TextFormField( obscureText: !_showPasswordNew, controller: _newPasswordController, @@ -196,9 +196,9 @@ class _ChangePasswordState extends State { autovalidateMode: AutovalidateMode.disabled, ), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 40.0, vertical: 20), child: TextFormField( obscureText: !_showPasswordNewRepeat, controller: _newPasswordControllerRepeat, @@ -253,9 +253,9 @@ class _ChangePasswordState extends State { autovalidateMode: AutovalidateMode.disabled, ), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 20), + padding: const EdgeInsets.symmetric( + horizontal: 40.0, vertical: 20), child: _showProgressBar ? CircularProgressIndicator() : SizedBox( diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 0730347..78b4ee1 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -3,9 +3,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; -import 'package:geo_spatial/Widgets/AddRemoveBoxWidget.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/objectbox.g.dart'; import 'package:google_fonts/google_fonts.dart'; class EditRecordsScreen extends StatefulWidget { diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 18a2f0a..88b62da 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -301,7 +301,7 @@ class _FamilyMemberAddState extends State { color: colors.darkSecondaryTextColor), ), hintText: "Please enter 12 digit Aadhaar.", - helperText: "Enter 0 if person is not willing to share", + helperText: "Leave empty if person is not willing to share", helperStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), hintStyle: GoogleFonts.poppins( @@ -309,7 +309,8 @@ class _FamilyMemberAddState extends State { contentPadding: EdgeInsets.all(7.0), ), validator: (value) { - if (value!.length != 12 || value != "") { + if (value == "" || value == null) return null; + else if (value.length != 12) { return "Enter a valid Aadhaar"; } else return null; @@ -339,18 +340,22 @@ class _FamilyMemberAddState extends State { //TODO: Occupation widget db functions update NestedOptionWidgetFormField( nestedOptionData: [ - new NestedOptionData( - subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, - boxName: 'Category One'), - new NestedOptionData( - subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, - boxName: 'Category Two'), - new NestedOptionData( - subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, - boxName: 'Category Three'), - new NestedOptionData( - subOptionDataMap: {"Occupation 1": false, "Occupation 2": false}, - boxName: 'Category Four') + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category One'), + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category Two'), + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category Three'), + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category Four') ], title: 'Occupation', context: context, @@ -463,6 +468,7 @@ class _FamilyMemberAddState extends State { }, ), ), + //TODO: Make sure text field is enabled only after option is chosen IncomeWithTypeTextField( onSaved: (textValue, option) { print(textValue! + " " + option!); @@ -636,16 +642,16 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.all(20), child: ConditionalRenderWidget( title: 'Using any Anganwadi services?', - defaultValue: - widget.familyMemberIndividualDataModel!.anganwadiServicesUsing, + defaultValue: widget.familyMemberIndividualDataModel! + .anganwadiServicesUsing, options: [ ["Yes", "yes"], ["No", "no"] ], onSaved: (val) { print("Value recorded: $val"); - widget.familyMemberIndividualDataModel!.anganwadiServicesUsing = - val; + widget.familyMemberIndividualDataModel! + .anganwadiServicesUsing = val; }, conditionalPositiveValue: 'yes', conditionalNegativeValue: 'no', @@ -664,7 +670,8 @@ class _FamilyMemberAddState extends State { return "Enter a value / NA"; } else return null; - }), conditionalNegativeWidget: Container(), + }), + conditionalNegativeWidget: Container(), ), ), Padding( @@ -687,16 +694,16 @@ class _FamilyMemberAddState extends State { padding: const EdgeInsets.all(20), child: ConditionalRenderWidget( title: 'Do you visit a private hospital?', - defaultValue: - widget.familyMemberIndividualDataModel!.privateClinicServicesUsed, + defaultValue: widget.familyMemberIndividualDataModel! + .privateClinicServicesUsed, options: [ ["Yes", "yes"], ["No", "no"] ], onSaved: (val) { print("Value recorded: $val"); - widget.familyMemberIndividualDataModel!.privateClinicServicesUsed = - val; + widget.familyMemberIndividualDataModel! + .privateClinicServicesUsed = val; }, conditionalPositiveValue: 'yes', conditionalNegativeValue: 'no', @@ -704,7 +711,7 @@ class _FamilyMemberAddState extends State { title: 'Reasons for using a private clinic', hint: 'Please choose a reason', dataMap: widget.familyMemberIndividualDataModel! - .privateServiceReason ?? + .privateServiceReason ?? privateClinicReasons, singleOption: false, context: context, @@ -714,7 +721,8 @@ class _FamilyMemberAddState extends State { }, errorField: "Please choose a reason", autoValidateMode: AutovalidateMode.onUserInteraction, - ), conditionalNegativeWidget: Container(), + ), + conditionalNegativeWidget: Container(), ), ) ], @@ -727,7 +735,7 @@ class _FamilyMemberAddState extends State { child: ConditionalRenderWidget( title: 'Do you use any tobacco based products?', defaultValue: - widget.familyMemberIndividualDataModel!.useOfTobacco, + widget.familyMemberIndividualDataModel!.useOfTobacco, options: [ ["Yes", "yes"], ["No", "no"] @@ -739,17 +747,17 @@ class _FamilyMemberAddState extends State { }, conditionalPositiveValue: 'yes', conditionalNegativeValue: 'no', - conditionalPositiveWidget:CheckBoxAddExtraAlertDialog( + conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( title: 'Tobacco products', hint: 'Choose applicable products', - dataMap: widget - .familyMemberIndividualDataModel!.tobaccoProducts ?? + dataMap: widget.familyMemberIndividualDataModel! + .tobaccoProducts ?? tobaccoProducts, context: context, errorField: 'Please choose at least one', onSaved: (map) { - widget.familyMemberIndividualDataModel!.tobaccoProducts = - map; + widget.familyMemberIndividualDataModel! + .tobaccoProducts = map; }, ), conditionalNegativeWidget: Container(), diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 44b286c..46f6d62 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -7,7 +7,6 @@ import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; -import 'package:geo_spatial/Utils/Globals.dart' as globals; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:geo_spatial/Widgets/NavigationDrawer.dart'; import 'package:google_fonts/google_fonts.dart'; diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 92637d1..3fa399f 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -1,7 +1,5 @@ import 'dart:convert'; -import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:local_auth/local_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 952afbd..3323fde 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -9,6 +9,7 @@ import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; class ProfilePage extends StatefulWidget { @override @@ -17,8 +18,34 @@ class ProfilePage extends StatefulWidget { final storage = FlutterSecureStorage(); +Future jwtToken() async { + var jwt = await storage.read(key: JWT_STORAGE_KEY); + print(JWT_STORAGE_KEY + jwt.toString()); + + if (jwt == null) return ""; + return jwt; +} + +Future _getUserDetails() async { + var jwt = await jwtToken(); + String url = NETWORK_ADDRESS; + + var res = await http.get(Uri.http(url, '/api/getUserData'), + headers: {"Content-Type": "application/json", 'user-auth-token': jwt}); + print("RES: ${res.body}"); + + return res; +} + Future get _getUserData async { var userData = await storage.read(key: USER_DATA_KEY); + try { + var res = await _getUserDetails(); + if(res.statusCode == 200){ + userData = res.body; + await storage.write(key: USER_DATA_KEY, value: userData); + } + } catch (e) {} print("userData " + userData.toString()); if (userData == null) return ""; diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index b20e8a8..ebe802e 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -1,11 +1,9 @@ import 'dart:async'; import 'dart:convert'; - import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; -import 'package:geo_spatial/Screens/Home.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; diff --git a/lib/Widgets/AppBarBackButtonWidget.dart b/lib/Widgets/AppBarBackButtonWidget.dart index b1aae77..4880c74 100644 --- a/lib/Widgets/AppBarBackButtonWidget.dart +++ b/lib/Widgets/AppBarBackButtonWidget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart'as colors; diff --git a/lib/Widgets/DatePicker.dart b/lib/Widgets/DatePicker.dart index 85fcb29..3911f5d 100644 --- a/lib/Widgets/DatePicker.dart +++ b/lib/Widgets/DatePicker.dart @@ -1,22 +1,18 @@ import 'package:flutter/material.dart'; -import 'package:table_calendar/table_calendar.dart'; import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart'; class DatePicker extends StatefulWidget { - - DatePicker(this.title); - String title; + final String title; @override _DatePickerState createState() => _DatePickerState(); } class _DatePickerState extends State { - @override - void initState(){ + void initState() { super.initState(); } @@ -27,17 +23,13 @@ class _DatePickerState extends State { String getText() { if (date == "") { return 'Pick date'; - } - - else { + } else { return '${date.day}/${date.month}/${date.year}'; } } @override Widget build(BuildContext context) { - - return Container( child: TextField( decoration: InputDecoration( @@ -47,7 +39,6 @@ class _DatePickerState extends State { onTap: () { pickDate(context); }, - ), ); } @@ -55,16 +46,16 @@ class _DatePickerState extends State { Future pickDate(BuildContext context) async { final initialDate = DateTime.now(); final newDate = await showRoundedDatePicker( - context: context, initialDate: initialDate, - firstDate: DateTime(1900), - lastDate: DateTime.now(), - initialDatePickerMode: DatePickerMode.year, - borderRadius: 16 - ); + context: context, + initialDate: initialDate, + firstDate: DateTime(1900), + lastDate: DateTime.now(), + initialDatePickerMode: DatePickerMode.year, + borderRadius: 16); if (newDate == null) return; setState(() => date = newDate); textFieldController.text = getText(); } -} \ No newline at end of file +} diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 3fe8880..999b3e7 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index af8e8a0..40a7fbd 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/StepCounterWidget.dart'; import 'package:google_fonts/google_fonts.dart'; diff --git a/lib/Widgets/GenderWidget.dart b/lib/Widgets/GenderWidget.dart index f889ff3..b8a4d9b 100644 --- a/lib/Widgets/GenderWidget.dart +++ b/lib/Widgets/GenderWidget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Constants/Constants.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/Widgets/IncomeWithTypeTextField.dart b/lib/Widgets/IncomeWithTypeTextField.dart index 5d21c89..dbede9b 100644 --- a/lib/Widgets/IncomeWithTypeTextField.dart +++ b/lib/Widgets/IncomeWithTypeTextField.dart @@ -33,7 +33,7 @@ class _IncomeWithTypeTextFieldState extends State { initState() { super.initState(); - chosenOption = widget.initialDropdownValue ?? widget.listOfOptions[0]; + chosenOption = widget.initialDropdownValue ?? widget.listOfOptions[widget.listOfOptions.length - 1]; } @override diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index 524ea4f..c3cc1f1 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Constants/Constants.dart'; import 'package:http/http.dart' as http; diff --git a/lib/Widgets/LocationWidget.dart b/lib/Widgets/LocationWidget.dart index bd7e90d..cee987e 100644 --- a/lib/Widgets/LocationWidget.dart +++ b/lib/Widgets/LocationWidget.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geolocator/geolocator.dart'; diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index 1c40698..bed1060 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/Widgets/StepCounterWidget.dart b/lib/Widgets/StepCounterWidget.dart index acfa069..aa35930 100644 --- a/lib/Widgets/StepCounterWidget.dart +++ b/lib/Widgets/StepCounterWidget.dart @@ -104,11 +104,11 @@ class CheckBox extends StatelessWidget { } return Expanded( child: Container( - decoration: BoxDecoration( - ), + decoration: BoxDecoration(), margin: EdgeInsets.only(left: 3.0, right: 3.0), child: Material( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20))), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20))), color: backgroundColor, child: InkWell( onTap: () { From 6e61d83d4f4ad6bdee03c15c57858aa04c967b37 Mon Sep 17 00:00:00 2001 From: nirmal Date: Wed, 19 Jan 2022 18:34:32 +0530 Subject: [PATCH 188/264] Altered FamilyDetails.dart --- lib/Screens/FamilyDetails.dart | 176 ++++++++++++++++----------------- 1 file changed, 85 insertions(+), 91 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 4340008..cde3ff1 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -224,28 +224,10 @@ class _FamilyDetailsState extends State { errorField: "Please choose an option", context: context, ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - onChanged: (val){ - if(val=='yes') - toiletFacility = true; - }, - defaultValue: widget.modelData!.toiletFacility, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.toiletFacility = val; - setState(() { - - }); - }, - title: "Do you have toilet facilities?"), Padding( padding: const EdgeInsets.all(20), child: ConditionalRenderWidget( - title: "Source of Water", + title: "Do you have toilet facilities?", defaultValue: widget.modelData!.toiletFacility, options: [ @@ -395,17 +377,6 @@ class _FamilyDetailsState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.isCattleOwned, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isCattleOwned = val; - }, - title: "Do you own cattle?"), ConditionalRenderWidget( title: "Do you own cattle?", defaultValue: @@ -446,30 +417,62 @@ class _FamilyDetailsState extends State { ), ), conditionalNegativeWidget: Container()), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.isFarmLandOwned, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isFarmLandOwned = val; - }, - title: "Do you own farmland?", - ), - CheckBoxAddExtraAlertDialog( - title: 'Crops Cultivated', - hint: 'Choose cultivated crops', - singleOption: false, - context: context, - dataMap: widget.modelData!.cropsCultivated ?? - seeds_preserved, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.cropsCultivated = val; - }, - ), + ConditionalRenderWidget( + title: "Do you own farmland?", + defaultValue: + widget.modelData!.isFarmLandOwned, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isFarmLandOwned = + val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( + title: 'Crops Cultivated', + hint: 'Choose cultivated crops', + singleOption: false, + context: context, + dataMap: widget.modelData!.cropsCultivated ?? + seeds_preserved, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.cropsCultivated = val; + }, + ), + conditionalNegativeWidget: Container()), + ConditionalRenderWidget( + title: "Do you preserve seeds?", + defaultValue: + widget.modelData!.isSeedsPreserved, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isSeedsPreserved = + val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( + title: 'Seeds Preserved', + hint: 'Choose preserved seeds', + singleOption: false, + context: context, + dataMap: widget.modelData!.preservedSeedsMap ?? + seeds_preserved, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.preservedSeedsMap = val; + }, + ), + conditionalNegativeWidget: Container()), OptionsWidget( options: [ ['Yes', 'yes'], @@ -487,18 +490,6 @@ class _FamilyDetailsState extends State { Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - CheckBoxAddExtraAlertDialog( - title: 'Seeds Preserved', - hint: 'Choose preserved seeds', - singleOption: false, - context: context, - dataMap: widget.modelData!.preservedSeedsMap ?? - seeds_preserved, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.preservedSeedsMap = val; - }, - ), CheckBoxAddExtraAlertDialog( title: 'Trees owned', hint: 'Choose trees owned', @@ -525,39 +516,42 @@ class _FamilyDetailsState extends State { singleOption: false, context: context, ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: - widget.modelData!.isKitchenGardenOwned, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isKitchenGardenOwned = val; - }, - title: "Do you have a kitchen garden?", - ), ], ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - CheckBoxAddExtraAlertDialog( - title: 'Kitchen Garden plants', - hint: 'Choose garden plants', - singleOption: false, - context: context, - dataMap: widget.modelData!.kitchenGardenPlants ?? - garden_plants, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.kitchenGardenPlants = val; - }, - ), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ + ConditionalRenderWidget( + title: "Do you have a kitchen garden?", + defaultValue: + widget.modelData!.isKitchenGardenOwned, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isKitchenGardenOwned = + val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( + title: 'Kitchen Garden plants', + hint: 'Choose garden plants', + singleOption: false, + context: context, + dataMap: widget.modelData!.kitchenGardenPlants ?? + garden_plants, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.kitchenGardenPlants = val; + }, + ), + conditionalNegativeWidget: Container()), Align( alignment: Alignment.topLeft, child: Padding( From f356e3ee8b35a0b7ef301e47ee5cbadee58d7094 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 18:35:50 +0530 Subject: [PATCH 189/264] Removed unused libraries and files and refractored Constants file --- lib/Constants/Globals.dart | 22 ---------------------- lib/Screens/ChangePassword.dart | 2 +- lib/Screens/CommunityDataCollection.dart | 2 +- lib/Screens/FamilyHomeScreen.dart | 2 +- lib/Screens/Home.dart | 2 +- lib/Screens/Login.dart | 2 +- lib/Screens/ProfilePage.dart | 2 +- lib/Screens/VillageSelection.dart | 2 +- lib/{Constants => Utils}/Constants.dart | 4 ++-- lib/Utils/GeoLocation.dart | 4 ---- lib/Utils/Globals.dart | 5 ----- lib/Utils/LightTheme.dart | 0 lib/Widgets/CameraWidget.dart | 0 lib/Widgets/GenderWidget.dart | 2 +- lib/Widgets/LoadValidPageWidget.dart | 2 +- lib/Widgets/LoginFormCard.dart | 2 +- lib/Widgets/NavigationDrawer.dart | 2 +- 17 files changed, 13 insertions(+), 44 deletions(-) delete mode 100644 lib/Constants/Globals.dart rename lib/{Constants => Utils}/Constants.dart (69%) delete mode 100644 lib/Utils/GeoLocation.dart delete mode 100644 lib/Utils/Globals.dart delete mode 100644 lib/Utils/LightTheme.dart delete mode 100644 lib/Widgets/CameraWidget.dart diff --git a/lib/Constants/Globals.dart b/lib/Constants/Globals.dart deleted file mode 100644 index 04b4b65..0000000 --- a/lib/Constants/Globals.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:flutter/material.dart'; - -ThemeData theme = ThemeData( - brightness: Brightness.light, - primaryColor: Color(0xff5EAAA8), - canvasColor: Color(0xffF7F3E9), - scaffoldBackgroundColor: Color(0xffF7F3E9), - cardColor: Colors.white, - focusColor: Color(0xff5EAAA8), - hoverColor: Color(0xff5EAAA8), - highlightColor: Color(0xff5EAAA8), - disabledColor: Colors.grey.shade200, - buttonTheme: ButtonThemeData( - minWidth: 200, - height: 50, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20))), - ), - backgroundColor: Color(0xffF7F3E9), - hintColor: Color(0xff5EAAA8), - colorScheme: ColorScheme.fromSwatch().copyWith(secondary: Color(0xffF05945)), -); diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 837e36b..7a28cd8 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 2b39f2c..4c5b373 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/StoreInstance.dart'; diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 1a96be7..cea74c4 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 46f6d62..bef51de 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 3fa399f..240c71f 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Screens/Home.dart'; import 'package:geo_spatial/Utils/colors.dart' as colors; import 'package:geo_spatial/Widgets/LoginFormCard.dart'; diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 3323fde..f6fb7ee 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Screens/ChangePassword.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart index ebe802e..898bb2c 100644 --- a/lib/Screens/VillageSelection.dart +++ b/lib/Screens/VillageSelection.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; diff --git a/lib/Constants/Constants.dart b/lib/Utils/Constants.dart similarity index 69% rename from lib/Constants/Constants.dart rename to lib/Utils/Constants.dart index 5f90edd..0f6d386 100644 --- a/lib/Constants/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,6 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; -//String NETWORK_ADDRESS = '192.168.29.126:2000'; +//String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; String USER_DATA_KEY = "userData"; diff --git a/lib/Utils/GeoLocation.dart b/lib/Utils/GeoLocation.dart deleted file mode 100644 index fc7c852..0000000 --- a/lib/Utils/GeoLocation.dart +++ /dev/null @@ -1,4 +0,0 @@ -import 'package:geolocator/geolocator.dart'; - -//TODO: Modularise _determinePosition method here - diff --git a/lib/Utils/Globals.dart b/lib/Utils/Globals.dart deleted file mode 100644 index 427bf84..0000000 --- a/lib/Utils/Globals.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:flutter/material.dart'; - -//TODO: Update name and username from response -var userName = "cyberwizard1001"; -var Name = "Nirmal Karthikeyan"; \ No newline at end of file diff --git a/lib/Utils/LightTheme.dart b/lib/Utils/LightTheme.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/Widgets/CameraWidget.dart b/lib/Widgets/CameraWidget.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/Widgets/GenderWidget.dart b/lib/Widgets/GenderWidget.dart index b8a4d9b..4fc4ba4 100644 --- a/lib/Widgets/GenderWidget.dart +++ b/lib/Widgets/GenderWidget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index c3cc1f1..e109146 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:http/http.dart' as http; import 'package:oktoast/oktoast.dart'; diff --git a/lib/Widgets/LoginFormCard.dart b/lib/Widgets/LoginFormCard.dart index 188f1f4..6432a7d 100644 --- a/lib/Widgets/LoginFormCard.dart +++ b/lib/Widgets/LoginFormCard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index 6559f6d..e31d1c6 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Constants/Constants.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Screens/ProfilePage.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; From b3e5d1f228c8cbf4b8f815b00f4a2b11b51c36ec Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 19:58:10 +0530 Subject: [PATCH 190/264] Added user names in head of family field --- lib/Model/FamilyMembersCommonDataModel.dart | 7 +- lib/Screens/FamilyDetails.dart | 1016 +++++++++---------- lib/Screens/FamilyHomeScreen.dart | 209 ++-- lib/Screens/FamilyMemberAdd.dart | 294 +++--- lib/Widgets/AddRemoveBoxWidget.dart | 7 +- lib/Widgets/OptionsFormWidget.dart | 12 +- lib/Widgets/TagTextWidget.dart | 2 +- 7 files changed, 792 insertions(+), 755 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index 6e64fb3..f066646 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -27,8 +27,11 @@ class FamilyMemberIndividualDataModel { Map? vulnerabilities; Map? occupation; String? dailyWageWorker; - String? incomePerDay; - String? incomePerMonth; + String? employed; + String? income; + String? incomeType; + String? incomePerDay; //TODO: Remove field + String? incomePerMonth; //TODO: Remove field String? pension; String? businessStatus; String? maritalStatus; diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index cde3ff1..1d608ae 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -10,7 +10,6 @@ import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:google_fonts/google_fonts.dart'; - class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key, this.modelData}) : super(key: key); final FamilyMembersCommonDataModel? modelData; @@ -74,17 +73,17 @@ class _FamilyDetailsState extends State { 'None': false }; - var noToiletsWhy = { - 'Lack of space' : false, - 'Lack of money' : false, - 'Habit of open defecation' : false, - 'Using community toilets' : false + var noToiletsWhy = { + 'Lack of space': false, + 'Lack of money': false, + 'Habit of open defecation': false, + 'Using community toilets': false }; var seeds_preserved = { 'Country Seeds': false, 'Indigenous Seeds': false, - 'Hybrid Seeds' : false + 'Hybrid Seeds': false }; var local_food = { @@ -93,570 +92,555 @@ class _FamilyDetailsState extends State { }; var trees_owned = { - 'Moringa Tree' : false, - 'Guava Tree' : false, - 'Papaya Tree' : false, - 'Pomegranate Tree' : false, - 'Custard Apple Tree' : false, - 'Banana' : false, + 'Moringa Tree': false, + 'Guava Tree': false, + 'Papaya Tree': false, + 'Pomegranate Tree': false, + 'Custard Apple Tree': false, + 'Banana': false, 'Indian Gooseberry': false }; var garden_plants = { - 'Tapioca' : false, - 'Tomato' : false, - 'Brinjal' : false, - 'Ladies finger' : false, - 'Chili' : false, - 'Mint' : false, - 'Spinach' : false, - 'Ridge Guard' : false, - 'Bitter Guard' : false, - 'Cluster Beans' : false, - 'Long Beans' : false, - 'Snake Guard' : false + 'Tapioca': false, + 'Tomato': false, + 'Brinjal': false, + 'Ladies finger': false, + 'Chili': false, + 'Mint': false, + 'Spinach': false, + 'Ridge Guard': false, + 'Bitter Guard': false, + 'Cluster Beans': false, + 'Long Beans': false, + 'Snake Guard': false }; var water_sources = { - 'None':false, - 'Lake':false, - 'Pond':false, - 'Groundwater':false, - 'Borewell':false, - 'Well':false, - 'Tap':false, - 'Water supply':false, - 'Lorry/Van':false + 'None': false, + 'Lake': false, + 'Pond': false, + 'Groundwater': false, + 'Borewell': false, + 'Well': false, + 'Tap': false, + 'Water supply': false, + 'Lorry/Van': false }; var incomeFromCattleEnabled = false; var toiletFacility = false; + _getUserNameList() { + var list = []; + widget.modelData!.individualDataListTransient.forEach((element) { + if (element.userName != null) if (element.userName != "") + list.add(element.userName); + }); + return list; + } + //TODO: Add village code @override Widget build(BuildContext context) { return WillPopScope( - onWillPop: () async { - final result = await showDialog( - context: context, - builder: (context) => AlertDialog( - backgroundColor: colors.darkScaffoldColor, - title: Text( - "Are you sure?", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - ), - content: Text( - "All unsaved changes will be lost.", - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - ), - actions: [ - TextButton( - child:Text( - 'No', - style: - GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - ), - onPressed: () { - Navigator.pop(context, false); - }, + onWillPop: () async { + final result = await showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: colors.darkAccentColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20)))), - child: Text( - 'Yes', - style: - GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - ), - onPressed: () { - Navigator.pop(context, true); - }, + content: Text( + "All unsaved changes will be lost.", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - ], - ), - ); - return result; - }, - child: Scaffold( - resizeToAvoidBottomInset: true, - backgroundColor: colors.darkScaffoldColor, - appBar: AppBarBackButton('Family Details'), - body: SingleChildScrollView( - child: FormPageView( - [ - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), - child: DropDownFormField( - //TODO: Fetch names from family member add saved objects and populate list - title: 'Head of family', - hint: 'Choose the head of family', - errorField: 'Please choose a head of family', - autoValidateMode: AutovalidateMode.onUserInteraction, - validator: (val){}, - list: [], - ) - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.drinkingWater, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.drinkingWater = val; - }, - title: "Do you have drinking water available?"), - CheckBoxAddExtraAlertDialog( - singleOption: false, - dataMap: widget.modelData!.sourceOfDrinkingWater ?? water_sources, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.sourceOfDrinkingWater = val; - }, - hint: "Select source", - title: "Source of Water", - errorField: "Please choose an option", - context: context, - ), - Padding( - padding: const EdgeInsets.all(20), - child: ConditionalRenderWidget( - title: "Do you have toilet facilities?", - defaultValue: - widget.modelData!.toiletFacility, - options: [ - ["Yes", "yes"], - ["No", "no"] - ], - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.toiletFacility = - val; - }, - conditionalPositiveValue: 'yes', - conditionalNegativeValue: 'no', - conditionalPositiveWidget: Container(), - conditionalNegativeWidget: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 25.0), - child: CheckBoxAddExtraAlertDialog( - title: 'Why do you not have a toilet?', - hint: 'Please choose reason', - singleOption: false, - context: context, - dataMap: - widget.modelData!.noToiletsWhy ?? - noToiletsWhy, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData?.noToiletsWhy = val; - }, - errorField: "Please choose a reason", - autoValidateMode: - AutovalidateMode.onUserInteraction, - ), - ), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.communityToilet, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.communityToilet = val; - }, - title: "Community toilet?"), - ], + actions: [ + TextButton( + child: Text( + 'No', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: () { + Navigator.pop(context, false); + }, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: Text( + 'Yes', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ), + ); + return result; + }, + child: Scaffold( + resizeToAvoidBottomInset: true, + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton('Family Details'), + body: SingleChildScrollView( + child: FormPageView( + [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0), + child: DropDownFormField( + //TODO: Fetch names from family member add saved objects and populate list + title: 'Head of family', + hint: 'Choose the head of family', + errorField: 'Please choose a head of family', + autoValidateMode: AutovalidateMode.onUserInteraction, + validator: (val) {}, + list: _getUserNameList(), + )), + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.drinkingWater, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.drinkingWater = val; + }, + title: "Do you have drinking water available?"), + CheckBoxAddExtraAlertDialog( + singleOption: false, + dataMap: widget.modelData!.sourceOfDrinkingWater ?? + water_sources, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.sourceOfDrinkingWater = val; + }, + hint: "Select source", + title: "Source of Water", + errorField: "Please choose an option", + context: context, + ), + Padding( + padding: const EdgeInsets.all(20), + child: ConditionalRenderWidget( + title: "Do you have toilet facilities?", + defaultValue: widget.modelData!.toiletFacility, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.toiletFacility = val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: Container(), + conditionalNegativeWidget: Column( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(vertical: 25.0), + child: CheckBoxAddExtraAlertDialog( + title: 'Why do you not have a toilet?', + hint: 'Please choose reason', + singleOption: false, + context: context, + dataMap: widget.modelData!.noToiletsWhy ?? + noToiletsWhy, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.noToiletsWhy = val; + }, + errorField: "Please choose a reason", + autoValidateMode: + AutovalidateMode.onUserInteraction, ), ), - ), - OptionsWidget( - options: [ - ['Clean', 'clean'], - ['Unclean', 'unclean'] - ], - defaultValue: - widget.modelData!.environmentSanitationLevel, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.environmentSanitationLevel = - val; - }, - title: "Environmental sanitation level: "), - ], + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.communityToilet, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.communityToilet = val; + }, + title: "Community toilet?"), + ], + ), ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: - widget.modelData!.runningWaterAvailable, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.runningWaterAvailable = val; - }, - title: "Is running water available?"), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No. of two wheelers", - defaultValue: widget.modelData!.noOfTwoWheelers, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.noOfTwoWheelers = val; - }, - errorField: "Please choose a valid number", - ), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No. of three wheelers", - defaultValue: widget.modelData!.noOfThreeWheelers, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.noOfThreeWheelers = val; - }, - errorField: "Please choose a valid number", - ), - CheckBoxAddExtraAlertDialog( - title: 'Two/Three wheeler brand', - hint: 'Please choose brands', - singleOption: false, - context: context, - dataMap: - widget.modelData!.twoThreeWheelManufacturer ?? - two_three_mfg, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData?.twoThreeWheelManufacturer = val; - }, - errorField: "Please choose a brand", - autoValidateMode: - AutovalidateMode.onUserInteraction, - ), - DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], - hint: "Select the highest", - title: "No. of four wheelers", - errorField: "Please choose a valid number", - defaultValue: widget.modelData!.noOfFourWheelers, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.noOfFourWheelers = val; - }, - ), + ), + OptionsWidget( + options: [ + ['Clean', 'clean'], + ['Unclean', 'unclean'] ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - CheckBoxAddExtraAlertDialog( - title: 'Four wheeler brand', - hint: 'Please choose brand', - singleOption: false, - context: context, - dataMap: widget.modelData!.twoFourManufacturer ?? - four_mfg, + defaultValue: + widget.modelData!.environmentSanitationLevel, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.environmentSanitationLevel = val; + }, + title: "Environmental sanitation level: "), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No. of two wheelers", + defaultValue: widget.modelData!.noOfTwoWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfTwoWheelers = val; + }, + errorField: "Please choose a valid number", + ), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No. of three wheelers", + defaultValue: widget.modelData!.noOfThreeWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfThreeWheelers = val; + }, + errorField: "Please choose a valid number", + ), + CheckBoxAddExtraAlertDialog( + title: 'Two/Three wheeler brand', + hint: 'Please choose brands', + singleOption: false, + context: context, + dataMap: widget.modelData!.twoThreeWheelManufacturer ?? + two_three_mfg, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.twoThreeWheelManufacturer = val; + }, + errorField: "Please choose a brand", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + DropDownFormField( + list: ['1', '2', '3', '4', '5', 'More'], + hint: "Select the highest", + title: "No. of four wheelers", + errorField: "Please choose a valid number", + defaultValue: widget.modelData!.noOfFourWheelers, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.noOfFourWheelers = val; + }, + ), + CheckBoxAddExtraAlertDialog( + title: 'Four wheeler brand', + hint: 'Please choose brand', + singleOption: false, + context: context, + dataMap: + widget.modelData!.twoFourManufacturer ?? four_mfg, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData?.twoFourManufacturer = val; + }, + errorField: "Please choose a brand", + autoValidateMode: AutovalidateMode.onUserInteraction, + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + OptionsWidget( + options: [ + ['Yes', 'yes'], + ['No', 'no'] + ], + defaultValue: widget.modelData!.runningWaterAvailable, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.runningWaterAvailable = val; + }, + title: "Is running water available?"), + ConditionalRenderWidget( + title: "Do you own cattle?", + defaultValue: widget.modelData!.isCattleOwned, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isCattleOwned = val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, top: 20.0), + child: TextFormField( + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + initialValue: widget.modelData!.incomeFromCattle, onSaved: (val) { print("Value recorded: $val"); - widget.modelData?.twoFourManufacturer = val; + widget.modelData!.incomeFromCattle = val; }, - errorField: "Please choose a brand", - autoValidateMode: - AutovalidateMode.onUserInteraction, + decoration: InputDecoration( + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + hintText: "Enter income in Rupees", + label: AutoSizeText( + 'Income from cattle/month', + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + )), + autovalidateMode: AutovalidateMode.always, + keyboardType: TextInputType.number, ), - ConditionalRenderWidget( - title: "Do you own cattle?", + ), + conditionalNegativeWidget: Container()), + ConditionalRenderWidget( + title: "Do you own farmland?", + defaultValue: widget.modelData!.isFarmLandOwned, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isFarmLandOwned = val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( + title: 'Crops Cultivated', + hint: 'Choose cultivated crops', + singleOption: false, + context: context, + dataMap: widget.modelData!.cropsCultivated ?? + seeds_preserved, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.cropsCultivated = val; + }, + ), + conditionalNegativeWidget: Container()), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + ConditionalRenderWidget( + title: "Do you preserve seeds?", + defaultValue: widget.modelData!.isSeedsPreserved, + options: [ + ["Yes", "yes"], + ["No", "no"] + ], + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.isSeedsPreserved = val; + }, + conditionalPositiveValue: 'yes', + conditionalNegativeValue: 'no', + conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( + title: 'Seeds Preserved', + hint: 'Choose preserved seeds', + singleOption: false, + context: context, + dataMap: widget.modelData!.preservedSeedsMap ?? + seeds_preserved, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.preservedSeedsMap = val; + }, + ), + conditionalNegativeWidget: Container()), + CheckBoxAddExtraAlertDialog( + title: 'Trees owned', + hint: 'Choose trees owned', + singleOption: false, + context: context, + dataMap: widget.modelData!.treesOwnedMap ?? trees_owned, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.treesOwnedMap = val; + }, + ), + CheckBoxAddExtraAlertDialog( + title: 'Local foods consumed', + hint: 'Choose your resource', + //TODO: Change variable to local food + + dataMap: widget.modelData!.localFoodMap ?? local_food, + onSaved: (val) { + print("Value recorded: $val"); + widget.modelData!.localFoodMap = val; + }, + singleOption: false, + context: context, + ), + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + ConditionalRenderWidget( + title: "Do you have a kitchen garden?", defaultValue: - widget.modelData!.isCattleOwned, + widget.modelData!.isKitchenGardenOwned, options: [ ["Yes", "yes"], ["No", "no"] ], onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.isCattleOwned = - val; + widget.modelData!.isKitchenGardenOwned = val; }, conditionalPositiveValue: 'yes', conditionalNegativeValue: 'no', conditionalPositiveWidget: Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, top: 20.0), - child: TextFormField( - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - initialValue: widget.modelData!.incomeFromCattle, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.incomeFromCattle = val; - }, - decoration: InputDecoration( - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - hintText: "Enter income in Rupees", - label: AutoSizeText( - 'Income from cattle/month', - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - )), - autovalidateMode: AutovalidateMode.always, - keyboardType: TextInputType.number, - ), - ), - conditionalNegativeWidget: Container()), - ConditionalRenderWidget( - title: "Do you own farmland?", - defaultValue: - widget.modelData!.isFarmLandOwned, - options: [ - ["Yes", "yes"], - ["No", "no"] - ], - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isFarmLandOwned = - val; - }, - conditionalPositiveValue: 'yes', - conditionalNegativeValue: 'no', - conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( - title: 'Crops Cultivated', - hint: 'Choose cultivated crops', - singleOption: false, - context: context, - dataMap: widget.modelData!.cropsCultivated ?? - seeds_preserved, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.cropsCultivated = val; - }, - ), - conditionalNegativeWidget: Container()), - ConditionalRenderWidget( - title: "Do you preserve seeds?", - defaultValue: - widget.modelData!.isSeedsPreserved, - options: [ - ["Yes", "yes"], - ["No", "no"] - ], - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isSeedsPreserved = - val; - }, - conditionalPositiveValue: 'yes', - conditionalNegativeValue: 'no', - conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( - title: 'Seeds Preserved', - hint: 'Choose preserved seeds', + padding: EdgeInsets.only(bottom: 30), + child: CheckBoxAddExtraAlertDialog( + title: 'Kitchen Garden plants', + hint: 'Choose garden plants', singleOption: false, context: context, - dataMap: widget.modelData!.preservedSeedsMap ?? - seeds_preserved, + dataMap: + widget.modelData!.kitchenGardenPlants ?? + garden_plants, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.preservedSeedsMap = val; + widget.modelData!.kitchenGardenPlants = val; }, ), - conditionalNegativeWidget: Container()), - OptionsWidget( - options: [ - ['Yes', 'yes'], - ['No', 'no'] - ], - defaultValue: widget.modelData!.isSeedsPreserved, + ), + conditionalNegativeWidget: Container()), + Align( + alignment: Alignment.topLeft, + child: Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 15.0), + child: Text( + "Address", + style: GoogleFonts.montserrat( + fontSize: 15.0, + color: colors.darkPrimaryTextColor), + ), + ), + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + initialValue: widget.modelData!.addressOne, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.isSeedsPreserved = val; + widget.modelData!.addressOne = val; + }, + decoration: InputDecoration( + label: Text( + "First Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter first line", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + if (value == "") { + return "Enter First Line"; + } }, - title: "Do you preserve seeds?", ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - CheckBoxAddExtraAlertDialog( - title: 'Trees owned', - hint: 'Choose trees owned', - singleOption: false, - context: context, - dataMap: - widget.modelData!.treesOwnedMap ?? trees_owned, + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + initialValue: widget.modelData!.addressTwo, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.treesOwnedMap = val; + widget.modelData!.addressTwo = val; }, + decoration: InputDecoration( + label: Text( + "Second Line", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter second line", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), ), - CheckBoxAddExtraAlertDialog( - title: 'Local foods consumed', - hint: 'Choose your resource', - //TODO: Change variable to local food - - dataMap: - widget.modelData!.localFoodMap ?? local_food, + ), + Padding( + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 70.0), + child: TextFormField( + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + initialValue: widget.modelData!.city, onSaved: (val) { print("Value recorded: $val"); - widget.modelData!.localFoodMap = val; + widget.modelData!.city = val; }, - singleOption: false, - context: context, - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - ConditionalRenderWidget( - title: "Do you have a kitchen garden?", - defaultValue: - widget.modelData!.isKitchenGardenOwned, - options: [ - ["Yes", "yes"], - ["No", "no"] - ], - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.isKitchenGardenOwned = - val; - }, - conditionalPositiveValue: 'yes', - conditionalNegativeValue: 'no', - conditionalPositiveWidget: CheckBoxAddExtraAlertDialog( - title: 'Kitchen Garden plants', - hint: 'Choose garden plants', - singleOption: false, - context: context, - dataMap: widget.modelData!.kitchenGardenPlants ?? - garden_plants, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.kitchenGardenPlants = val; - }, - ), - conditionalNegativeWidget: Container()), - Align( - alignment: Alignment.topLeft, - child: Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 15.0), - child: Text( - "Address", - style: GoogleFonts.montserrat( - fontSize: 15.0, - color: colors.darkPrimaryTextColor), - ), - ), - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - initialValue: widget.modelData!.addressOne, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.addressOne = val; - }, - decoration: InputDecoration( - label: Text( - "First Line", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter first line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "") { - return "Enter First Line"; - } - }, - ), - ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - initialValue: widget.modelData!.addressTwo, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.addressTwo = val; - }, - decoration: InputDecoration( - label: Text( - "Second Line", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter second line", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - ), + decoration: InputDecoration( + label: Text( + "City", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), ), - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 70.0), - child: TextFormField( - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), - initialValue: widget.modelData!.city, - onSaved: (val) { - print("Value recorded: $val"); - widget.modelData!.city = val; - }, - decoration: InputDecoration( - label: Text( - "City", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter city", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - ), - ), - ], + hintText: "Please enter city", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), ), - ], - ) - ], - _onSubmit, - onChange: (isValid){ - print(isValid); - print("IS FAM VALID: ${widget.modelData?.commonDetailsValid}"); - widget.modelData?.commonDetailsValid = isValid; - }, - submitMessage: - "Submit to Continue or go back to re-record data", - note: - "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", - ))) - ); + ), + ], + ), + ], + ) + ], + _onSubmit, + onChange: (isValid) { + print(isValid); + print("IS FAM VALID: ${widget.modelData?.commonDetailsValid}"); + widget.modelData?.commonDetailsValid = isValid; + }, + submitMessage: "Submit to Continue or go back to re-record data", + note: + "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", + )))); } } - - diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index cea74c4..13b1eff 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -15,11 +15,8 @@ import 'CollectLocationWidget.dart'; import 'package:http/http.dart' as http; class FamilyHomeScreen extends StatefulWidget { - - FamilyHomeScreen({Key? key, this.modelData}) : super(key: key); - @override State createState() => _FamilyHomeScreenState(); final modelData; @@ -35,15 +32,17 @@ class _FamilyHomeScreenState extends State { setState(() { if (modelData == null) modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); + else { + modelData!.individualDataListTransient.clear(); + } for (var i in modelData!.individualDataList) { - print(i); + print("INDIVIDUAL DATA ${i.userName}"); modelData!.individualDataListTransient.add(i); } }); } - Future _makeRequest( - var data, String node) async { + Future _makeRequest(var data, String node) async { String url = NETWORK_ADDRESS; var body = json.encode(data); @@ -88,106 +87,114 @@ class _FamilyHomeScreenState extends State { Expanded( child: Padding( padding: EdgeInsets.only(left: 10, right: 10), - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkSecondBackgroundColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors - .darkSecondBackgroundColor)))), - onPressed: () async { - bool isValid = true; - print("Common ${modelData!.commonDetailsValid}"); - print("Location ${modelData!.locationPageValid}"); - isValid &= modelData!.commonDetailsValid! && - modelData!.locationPageValid!; - - for (var i - in modelData!.individualDataListTransient) { - isValid &= i.dataValid!; - print("Indv ${i.dataValid}"); - } - - //TODO: Change end point and check res for errors - if(isValid){ - print("MODEL JSON: ${widget.modelData.toJson()}"); - http.Response res = await _makeRequest(modelData!.toJson(), "familyData"); - } - - print("Is Valid: $isValid"); - }), + child: ElevatedButton( + child: Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + colors.darkSecondBackgroundColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () async { + bool isValid = true; + print("Common ${modelData!.commonDetailsValid}"); + print("Location ${modelData!.locationPageValid}"); + isValid &= modelData!.commonDetailsValid! && + modelData!.locationPageValid!; + + for (var i + in modelData!.individualDataListTransient) { + isValid &= i.dataValid!; + print("Indv ${i.dataValid}"); + } + + //TODO: Change end point and check res for errors + if (isValid) { + print("MODEL JSON: ${widget.modelData.toJson()}"); + http.Response res = await _makeRequest( + modelData!.toJson(), "familyData"); + } + + print("Is Valid: $isValid"); + }), ), ), Expanded( child: Padding( padding: EdgeInsets.only( left: 10, right: 10, top: 5, bottom: 10), - child: ElevatedButton( - child: Text("Save", - style: - TextStyle(fontSize: 14, color: Colors.black)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - Colors.white), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.white)))), - onPressed: () async { - var store = await StoreInstance.getInstance(); - Box individualDataBox = - store.box(); - - List i = await individualDataBox.putMany( - modelData!.individualDataListTransient); - print("ID: $i"); - - modelData!.individualDataList - .addAll(modelData!.individualDataListTransient); - - store = await StoreInstance.getInstance(); - Box box = store.box(); - int id = await box.put(modelData); - - AlertDialog alertDialog = AlertDialog( - backgroundColor: colors.darkScaffoldColor, - title: Text( - 'Record Saved', + child: ElevatedButton( + child: Text("Save", + style: + TextStyle(fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.all( + Colors.white), + backgroundColor: MaterialStateProperty.all( + Colors.white), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide(color: Colors.white)))), + onPressed: () async { + var store = await StoreInstance.getInstance(); + Box individualDataBox = + store.box(); + + List i = await individualDataBox.putMany( + modelData!.individualDataListTransient); + print("ID: $i"); + + modelData!.individualDataList.clear(); + modelData!.individualDataList + .addAll(modelData!.individualDataListTransient); + + Box box = store.box(); + int id = await box.put(modelData); + + AlertDialog alertDialog = AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + 'Record Saved', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + content: Text( + 'The Record has been saved with record ID ${id}', style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - ), - content: Text( - 'The Record has been saved with record ID ${id}', - style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor)), - actions: [ - ElevatedButton( - onPressed: () { - Navigator.of(context, rootNavigator: true) - .pop('dialog'); - }, - child: Text('OK',style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor),), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20)),), - primary: colors.darkAccentColor - ), - ) - ], - ); - - showDialog( - context: context, - builder: (BuildContext context) => alertDialog); - }), + color: colors.darkPrimaryTextColor)), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + }, + child: Text( + 'OK', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(20)), + ), + primary: colors.darkAccentColor), + ) + ], + ); + + showDialog( + context: context, + builder: (BuildContext context) => alertDialog); + }), ), ) ], @@ -208,6 +215,4 @@ class _FamilyHomeScreenState extends State { } } - - -//TODO: isEdited to the request \ No newline at end of file +//TODO: isEdited to the request diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 88b62da..bcb1f21 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -249,8 +249,10 @@ class _FamilyMemberAddState extends State { contentPadding: EdgeInsets.all(7.0), ), validator: (value) { - if (value!.length != 10 || value != "") { - return "Enter a valid number"; + if (value == "" || value == null) + return null; + else if (value.length != 10) { + return "Enter a valid Phone Number"; } else return null; }, @@ -286,42 +288,6 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Padding( - padding: const EdgeInsets.only( - left: 10.0, right: 10.0, bottom: 20.0, top: 20.0), - child: TextFormField( - initialValue: - widget.familyMemberIndividualDataModel?.aadhaarNumber, - keyboardType: TextInputType.number, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Aadhaar Number", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter 12 digit Aadhaar.", - helperText: "Leave empty if person is not willing to share", - helperStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: (value) { - if (value == "" || value == null) return null; - else if (value.length != 12) { - return "Enter a valid Aadhaar"; - } else - return null; - }, - onSaved: (data) { - widget.familyMemberIndividualDataModel!.aadhaarNumber = - data; - }, - autovalidateMode: AutovalidateMode.onUserInteraction, - ), - ), CheckBoxAddExtraAlertDialog( title: 'Vulnerabilities', hint: 'Please choose a vulnerability', @@ -384,46 +350,116 @@ class _FamilyMemberAddState extends State { val; }, ), - Padding( - padding: EdgeInsets.all(15), - child: StartingEndingTimeWidget( - initialValue: - widget.familyMemberIndividualDataModel!.workTimings != - null - ? [ - TimeOfDay( - hour: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![0] - .split(":")[0]), - minute: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![0] - .split(":")[1] - .replaceAll(new RegExp(r"\D"), ""))), - TimeOfDay( - hour: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![1] - .split(":")[0]), - minute: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![1] - .split(":")[1] - .replaceAll(new RegExp(r"\D"), ""))) - ] - : null, - onSaved: (List? timeList) { - print(timeList); - var timeFinalString = [ - "${timeList![0].hour}:${timeList[0].minute} ${timeList[0].period == DayPeriod.am ? "AM" : "PM"}", - "${timeList[1].hour}:${timeList[1].minute} ${timeList[1].period == DayPeriod.am ? "AM" : "PM"}" - ]; - widget.familyMemberIndividualDataModel!.workTimings = - timeFinalString; + ConditionalRenderWidget( + title: "Employed?", + onSaved: (val) { + widget.familyMemberIndividualDataModel!.employed = val; }, - ), - ), + defaultValue: + widget.familyMemberIndividualDataModel!.employed, + conditionalPositiveWidget: Column( + children: [ + Padding( + padding: EdgeInsets.all(15), + child: StartingEndingTimeWidget( + initialValue: widget + .familyMemberIndividualDataModel! + .workTimings != + null + ? [ + TimeOfDay( + hour: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![0] + .split(":")[0]), + minute: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![0] + .split(":")[1] + .replaceAll( + new RegExp(r"\D"), ""))), + TimeOfDay( + hour: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![1] + .split(":")[0]), + minute: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![1] + .split(":")[1] + .replaceAll( + new RegExp(r"\D"), ""))) + ] + : null, + onSaved: (List? timeList) { + print(timeList); + var timeFinalString = [ + "${timeList![0].hour}:${timeList[0].minute} ${timeList[0].period == DayPeriod.am ? "AM" : "PM"}", + "${timeList[1].hour}:${timeList[1].minute} ${timeList[1].period == DayPeriod.am ? "AM" : "PM"}" + ]; + widget.familyMemberIndividualDataModel! + .workTimings = timeFinalString; + }, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 20.0), + child: TextFormField( + initialValue: widget + .familyMemberIndividualDataModel! + .noOfDaysWorking, + keyboardType: TextInputType.number, + autovalidateMode: + AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Number of work days", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Please enter number of work days", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: (value) { + print(value); + print("value"); + if (value == null || value == "") + return "Please enter number of work days"; + else if (int.parse(value) < 1) { + return "Enter number of work days"; + } else if (int.parse(value) > 31) { + return "Enter a valid number of work days"; + } + }, + onSaved: (val) { + print(val.toString()); + widget.familyMemberIndividualDataModel! + .noOfDaysWorking = val; + }, + ), + ), + //TODO: Make sure text field is enabled only after option is chosen + IncomeWithTypeTextField( + onSaved: (textValue, option) { + print(textValue! + " " + option!); + }, + text: 'Income', + hintText: 'Enter income', + listOfOptions: ["Day", "Week", "Month"], + ), + ], + ), + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + conditionalPositiveValue: "yes", + conditionalNegativeValue: "no", + conditionalNegativeWidget: Container()) ], ), Column( @@ -431,54 +467,46 @@ class _FamilyMemberAddState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( - padding: const EdgeInsets.symmetric( - horizontal: 10.0, vertical: 20.0), + padding: const EdgeInsets.only( + left: 10.0, right: 10.0, bottom: 20.0, top: 20.0), child: TextFormField( initialValue: widget - .familyMemberIndividualDataModel!.noOfDaysWorking, + .familyMemberIndividualDataModel?.aadhaarNumber, keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, style: darkTheme.DarkTheme.textTheme.bodyText2, decoration: InputDecoration( label: Text( - "Number of work days", + "Aadhaar Number", style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), ), - hintText: "Please enter number of work days", + hintText: "Please enter 12 digit Aadhaar.", + helperText: + "Leave empty if person is not willing to share", + helperStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), contentPadding: EdgeInsets.all(7.0), ), validator: (value) { - print(value); - print("value"); - if (value == null || value == "") - return "Please enter number of work days"; - else if (int.parse(value) < 1) { - return "Enter number of work days"; - } else if (int.parse(value) > 31) { - return "Enter a valid number of work days"; - } + if (value == "" || value == null) + return null; + else if (value.length != 12) { + return "Enter a valid Aadhaar"; + } else + return null; }, - onSaved: (val) { - print(val.toString()); + onSaved: (data) { widget.familyMemberIndividualDataModel! - .noOfDaysWorking = val; + .aadhaarNumber = data; }, + autovalidateMode: AutovalidateMode.onUserInteraction, ), ), - //TODO: Make sure text field is enabled only after option is chosen - IncomeWithTypeTextField( - onSaved: (textValue, option) { - print(textValue! + " " + option!); - }, - text: 'Income', - hintText: 'Enter income', - listOfOptions: ["Day", "Week", "Month"], - ), Padding( - padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 20.0), child: OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel!.pension, @@ -511,7 +539,8 @@ class _FamilyMemberAddState extends State { }, ), Padding( - padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 20.0), child: OptionsWidget( defaultValue: widget .familyMemberIndividualDataModel!.maritalStatus, @@ -534,7 +563,7 @@ class _FamilyMemberAddState extends State { children: [ Padding( padding: - const EdgeInsets.only(left: 10.0, right: 10.0, top: 20), + EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0), child: TagTextWidget( autoValidateMode: AutovalidateMode.onUserInteraction, label: "Special Skills", @@ -605,7 +634,8 @@ class _FamilyMemberAddState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, ), Padding( - padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 20.0), child: OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel!.surgeries, @@ -623,7 +653,7 @@ class _FamilyMemberAddState extends State { ], ), Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel! @@ -639,7 +669,8 @@ class _FamilyMemberAddState extends State { title: 'Aware about Anganwadi services?', ), Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 20.0), child: ConditionalRenderWidget( title: 'Using any Anganwadi services?', defaultValue: widget.familyMemberIndividualDataModel! @@ -655,27 +686,32 @@ class _FamilyMemberAddState extends State { }, conditionalPositiveValue: 'yes', conditionalNegativeValue: 'no', - conditionalPositiveWidget: TagTextWidget( - autoValidateMode: AutovalidateMode.onUserInteraction, - label: "Anganwadi services utilised", - hint: "Enter services here", - initialValue: widget.familyMemberIndividualDataModel! - .anganwadiServicesUsedList, - onSaved: (data) { - widget.familyMemberIndividualDataModel! - .anganwadiServicesUsedList = data; - }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }), + conditionalPositiveWidget: Padding( + padding: EdgeInsets.symmetric(vertical: 20), + child: TagTextWidget( + autoValidateMode: + AutovalidateMode.onUserInteraction, + label: "Anganwadi services utilised", + hint: "Enter services here", + initialValue: widget + .familyMemberIndividualDataModel! + .anganwadiServicesUsedList, + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .anganwadiServicesUsedList = data; + }, + validator: (value) { + if (value == null || value.isEmpty) { + return "Enter a value / NA"; + } else + return null; + }), + ), conditionalNegativeWidget: Container(), ), ), Padding( - padding: const EdgeInsets.all(20.0), + padding: const EdgeInsets.all(10), child: OptionsWidget( defaultValue: widget .familyMemberIndividualDataModel!.PHCServicesUsed, @@ -691,7 +727,7 @@ class _FamilyMemberAddState extends State { ), ), Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.symmetric(vertical: 20.0), child: ConditionalRenderWidget( title: 'Do you visit a private hospital?', defaultValue: widget.familyMemberIndividualDataModel! @@ -731,7 +767,7 @@ class _FamilyMemberAddState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.all(10), child: ConditionalRenderWidget( title: 'Do you use any tobacco based products?', defaultValue: diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 5367654..fa189ee 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -74,7 +74,12 @@ class _AddRemoveBoxWidgetState extends State { */ child: VisibilityDetector( onVisibilityChanged: (VisibilityInfo info) { - setState(() {}); //Re-renders page + try{ + setState(() {}); //Re-renders page + } + catch(e){ + + } }, key: Key('add-remove-widget-key'), child: ListTile( diff --git a/lib/Widgets/OptionsFormWidget.dart b/lib/Widgets/OptionsFormWidget.dart index bed1060..a574847 100644 --- a/lib/Widgets/OptionsFormWidget.dart +++ b/lib/Widgets/OptionsFormWidget.dart @@ -32,10 +32,14 @@ class OptionsWidget extends FormField { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text( - title, - style: GoogleFonts.poppins( - fontSize: 15.0, color: colors.darkPrimaryTextColor), + Padding( + padding: EdgeInsets.only(bottom: 10), + child: Text( + title, + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 15.0, color: colors.darkPrimaryTextColor), + ), ), Wrap( alignment: WrapAlignment.center, diff --git a/lib/Widgets/TagTextWidget.dart b/lib/Widgets/TagTextWidget.dart index 1955ac0..8402f3e 100644 --- a/lib/Widgets/TagTextWidget.dart +++ b/lib/Widgets/TagTextWidget.dart @@ -33,7 +33,7 @@ class TagTextWidget extends FormField> { ScrollController _scrollController = new ScrollController(); return Padding( - padding: EdgeInsets.only(left: 10, right: 10, bottom: 10), + padding: EdgeInsets.only(bottom: 10), child: Column( children: [ Padding( From 07bf706039116ab37d60930e1d99541f16d43ede Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 23:04:17 +0530 Subject: [PATCH 191/264] Added time out to http requests, completed data model for Community Data fields. --- lib/Model/FamilyMembersCommonDataModel.dart | 183 +++++++++++-- lib/Screens/ChangePassword.dart | 19 +- lib/Screens/FamilyDetails.dart | 10 +- lib/Screens/FamilyMemberAdd.dart | 54 ++-- lib/Screens/ProfilePage.dart | 17 +- lib/Widgets/AddRemoveBoxWidget.dart | 2 + lib/Widgets/LoadValidPageWidget.dart | 6 +- lib/objectbox-model.json | 78 +++++- lib/objectbox.g.dart | 277 ++++++++++++++++---- pubspec.lock | 10 +- 10 files changed, 524 insertions(+), 132 deletions(-) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyMembersCommonDataModel.dart index f066646..2d8d6cb 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyMembersCommonDataModel.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:geo_spatial/Widgets/NestedOptionsWidget.dart'; import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:objectbox/objectbox.dart'; @@ -16,6 +17,32 @@ List buildListForOptionWidget(Map mapData) { @Entity() class FamilyMemberIndividualDataModel { + parseOccupationJson(List occupationData) { + var list = []; + for (var i in occupationData) { + print("ENC: ${i.toJsonString()}"); + list.add(i.toJsonString()); + } + + for (var i in list) { + print("ENC AF: ${i}"); + } + + print("ENCODED VAL: ${json.encode(list)}"); + return json.encode(list); + } + + parseOccupationObject(String occupationData) { + List occupationStringList = json.decode(occupationData); + List list = []; + + for (var i in occupationStringList) { + list.add(NestedOptionData.fromJson(i)); + } + + return list; + } + int id = 0; String? userName; @Property(type: PropertyType.date) @@ -30,30 +57,29 @@ class FamilyMemberIndividualDataModel { String? employed; String? income; String? incomeType; - String? incomePerDay; //TODO: Remove field - String? incomePerMonth; //TODO: Remove field String? pension; String? businessStatus; String? maritalStatus; - String? noOfDaysWorking; //TODO: Inform Change + String? noOfDaysWorking; //TODO: Confirm update in JSON List? specialSkills; List? workTimings; String? surgeries; String? anganwadiServicesAware; String? anganwadiServicesUsing; List? anganwadiServicesUsedList; - String? PHCServicesUsed; //TODO: Inform Change - String? privateClinicServicesUsed; //TODO: Inform Change - Map? privateServiceReason; //TODO: Inform Change, write get set functions - Map? communicableDiseases; //TODO: Write get set functions - Map? frequentAilments; //TODO: Inform change, write functions - Map? nonCommunicableDiseases; //TODO: Inform change, write functions - Map? tobaccoProducts; //TODO: Inform change, write functions + String? PHCServicesUsed; //TODO: Confirm update in JSON + String? privateClinicServicesUsed; //TODO: Confirm update in JSON + Map? privateServiceReason; //TODO: Confirm update in JSON + Map? communicableDiseases; //TODO: Confirm update in JSON + Map? frequentAilments; //TODO: Confirm update in JSON + Map? nonCommunicableDiseases; //TODO: Confirm update in JSON + Map? tobaccoProducts; //TODO: Confirm update in JSON String? useOfTobacco; String? useOfAlcohol; String? aarogyaSetuInstalled; String? vizhithiruInstalled; bool? dataValid = false; + List? occupationData; //String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); @@ -75,23 +101,29 @@ class FamilyMemberIndividualDataModel { occupation != null ? buildListForOptionWidget(occupation!) : ['None'], "noOfDaysWorking": noOfDaysWorking, "isADailyWageWorker": dailyWageWorker, - "incomePerDay": incomePerDay, - "incomePerMonth": incomePerMonth, "workTimings": workTimings, "maritalStatus": maritalStatus, "specialSkills": specialSkills, - "frequentHealthAilments": frequentAilments!= null ? buildListForOptionWidget(frequentAilments!) : [], - "communicableDiseases": communicableDiseases!= null ? buildListForOptionWidget(communicableDiseases!) : [], - "nonCommunicableDiseases": nonCommunicableDiseases!=null ? buildListForOptionWidget(nonCommunicableDiseases!) : [], + "frequentHealthAilments": frequentAilments != null + ? buildListForOptionWidget(frequentAilments!) + : [], + "communicableDiseases": communicableDiseases != null + ? buildListForOptionWidget(communicableDiseases!) + : [], + "nonCommunicableDiseases": nonCommunicableDiseases != null + ? buildListForOptionWidget(nonCommunicableDiseases!) + : [], "surgeriesUndergone": surgeries, "anganwadiServicesAware": anganwadiServicesAware, "anganwadiServicesUsed": anganwadiServicesUsing, "anganwadiServicesUtilised": anganwadiServicesUsedList, "phcServicesUtilised": PHCServicesUsed, "privateHealthClinicFacilitiesUsed": privateClinicServicesUsed, - "reasonsForVisitingPrivateHealthClinic": privateServiceReason!= null ? buildListForOptionWidget(privateServiceReason!) : [], + "reasonsForVisitingPrivateHealthClinic": privateServiceReason != null + ? buildListForOptionWidget(privateServiceReason!) + : [], "tobaccoBasedProductsUsage": useOfTobacco, - "tobaccoProductsUsed" : tobaccoProducts, + "tobaccoProductsUsed": tobaccoProducts, "alcoholConsumption": useOfAlcohol, "businessStatus": businessStatus, "arogyaSethuAppInstallationStatus": aarogyaSetuInstalled, @@ -113,6 +145,22 @@ class FamilyMemberIndividualDataModel { } } + String? get dbOccupationData => + occupationData == null ? null : parseOccupationJson(occupationData!); + + set dbOccupationData(String? value) { + if (value == null) { + occupationData = null; + } else { + var data = parseOccupationObject(value); + if (data.isEmpty) { + occupationData = null; + } else { + occupationData = data; + } + } + } + String? get dbOccupation => occupation == null ? null : json.encode(occupation); @@ -124,6 +172,67 @@ class FamilyMemberIndividualDataModel { json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); } } + + String? get dbPrivateServiceReason => + privateServiceReason == null ? null : json.encode(privateServiceReason); + + set dbPrivateServiceReason(String? value) { + if (value == null) { + privateServiceReason = null; + } else { + privateServiceReason = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbCommunicableDiseases => + communicableDiseases == null ? null : json.encode(communicableDiseases); + + set dbCommunicableDiseases(String? value) { + if (value == null) { + communicableDiseases = null; + } else { + communicableDiseases = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbFrequentAilments => + frequentAilments == null ? null : json.encode(frequentAilments); + + set dbFrequentAilments(String? value) { + if (value == null) { + frequentAilments = null; + } else { + frequentAilments = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbNonCommunicableDiseases => nonCommunicableDiseases == null + ? null + : json.encode(nonCommunicableDiseases); + + set dbNonCommunicableDiseases(String? value) { + if (value == null) { + nonCommunicableDiseases = null; + } else { + nonCommunicableDiseases = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbTobaccoProducts => + tobaccoProducts == null ? null : json.encode(tobaccoProducts); + + set dbTobaccoProducts(String? value) { + if (value == null) { + tobaccoProducts = null; + } else { + tobaccoProducts = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } } @Entity() @@ -134,6 +243,7 @@ class FamilyMembersCommonDataModel { Position? locationBottomLeft; Position? locationBottomRight; + String? headOfFamily; String? drinkingWater; Map? sourceOfDrinkingWater; String? toiletFacility; @@ -146,12 +256,12 @@ class FamilyMembersCommonDataModel { Map? twoThreeWheelManufacturer; Map? twoFourManufacturer; Map? localFoodMap; - Map? noToiletsWhy; //TODO: Write set get functions + Map? noToiletsWhy; //TODO: Update JSON String? isCattleOwned; String? incomeFromCattle; String? isFarmLandOwned; String? isSeedsPreserved; - Map? cropsCultivated; + Map? cropsCultivated; //TODO: Update JSON Map? preservedSeedsMap; Map? treesOwnedMap; String? isKitchenGardenOwned; @@ -171,7 +281,7 @@ class FamilyMembersCommonDataModel { Map toJson() { return { 'familyMemberData': - individualDataListTransient.map((item) => item.toJson()).toList(), + individualDataListTransient.map((item) => item.toJson()).toList(), 'locationTopLeft': [ locationTopLeft!.latitude, locationTopLeft!.longitude @@ -196,7 +306,9 @@ class FamilyMembersCommonDataModel { "areToiletsAvailableInHouse": toiletFacility, - "noToiletsWhy" : noToiletsWhy != null ? buildListForOptionWidget(noToiletsWhy!) : [], //TODO: Inform change + "noToiletsWhy": noToiletsWhy != null + ? buildListForOptionWidget(noToiletsWhy!) + : [], //TODO: Inform change "availabilityOfWaterInToilets": String, @@ -212,7 +324,6 @@ class FamilyMembersCommonDataModel { "numberOfThreeWheelers": noOfThreeWheelers, - "numberOfFourWheelers": noOfFourWheelers, "brandsOfFourWheelers": twoFourManufacturer != null @@ -225,7 +336,9 @@ class FamilyMembersCommonDataModel { "doYouOwnFarmLand": isFarmLandOwned, - "cropsCultivated": cropsCultivated != null ? buildListForOptionWidget(cropsCultivated!) : [], + "cropsCultivated": cropsCultivated != null + ? buildListForOptionWidget(cropsCultivated!) + : [], "doYouPreserveSeeds": isSeedsPreserved, @@ -423,6 +536,30 @@ class FamilyMembersCommonDataModel { } } + String? get dbNoToiletsWhy => + noToiletsWhy == null ? null : json.encode(noToiletsWhy); + + set dbNoToiletsWhy(String? value) { + if (value == null) { + noToiletsWhy = null; + } else { + noToiletsWhy = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + + String? get dbCropsCultivated => + cropsCultivated == null ? null : json.encode(cropsCultivated); + + set dbCropsCultivated(String? value) { + if (value == null) { + cropsCultivated = null; + } else { + cropsCultivated = Map.from( + json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); + } + } + String? get dbTreesOwnedMap => treesOwnedMap == null ? null : json.encode(treesOwnedMap); diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 7a28cd8..9602466 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -52,9 +52,22 @@ class _ChangePasswordState extends State { String jwt = await jwtToken; - var res = await http.put(Uri.http(url, '/api/changeUserPassword'), - headers: {"Content-Type": "application/json", 'user-auth-token': jwt}, - body: body); + var res = await http + .put(Uri.http(url, '/api/changeUserPassword'), + headers: { + "Content-Type": "application/json", + 'user-auth-token': jwt + }, + body: body) + .timeout( + const Duration(seconds: 10), + onTimeout: () { + showToast("Server Timed out!"); + // Time has run out, do what you wanted to do. + return http.Response( + 'Error', 408); // Request Timeout response status code + }, + ); print("RES: ${res.body}"); return res; diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 1d608ae..f8e2a0b 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -128,9 +128,6 @@ class _FamilyDetailsState extends State { 'Lorry/Van': false }; - var incomeFromCattleEnabled = false; - var toiletFacility = false; - _getUserNameList() { var list = []; widget.modelData!.individualDataListTransient.forEach((element) { @@ -200,12 +197,15 @@ class _FamilyDetailsState extends State { Padding( padding: const EdgeInsets.symmetric(vertical: 10.0), child: DropDownFormField( + defaultValue: widget.modelData!.headOfFamily, //TODO: Fetch names from family member add saved objects and populate list + onSaved: (value) { + widget.modelData!.headOfFamily = value; + }, title: 'Head of family', hint: 'Choose the head of family', errorField: 'Please choose a head of family', autoValidateMode: AutovalidateMode.onUserInteraction, - validator: (val) {}, list: _getUserNameList(), )), OptionsWidget( @@ -233,7 +233,7 @@ class _FamilyDetailsState extends State { context: context, ), Padding( - padding: const EdgeInsets.all(20), + padding: const EdgeInsets.symmetric(vertical: 20), child: ConditionalRenderWidget( title: "Do you have toilet facilities?", defaultValue: widget.modelData!.toiletFacility, diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index bcb1f21..2c38bc0 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -305,24 +305,30 @@ class _FamilyMemberAddState extends State { ), //TODO: Occupation widget db functions update NestedOptionWidgetFormField( - nestedOptionData: [ - new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category One'), - new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category Two'), - new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category Three'), - new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category Four') - ], + onSaved: (val) { + widget.familyMemberIndividualDataModel!.occupationData = + val; + }, + nestedOptionData: widget + .familyMemberIndividualDataModel!.occupationData ?? + [ + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category One'), + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category Two'), + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category Three'), + new NestedOptionData(subOptionDataMap: { + "Occupation 1": false, + "Occupation 2": false + }, boxName: 'Category Four') + ], title: 'Occupation', context: context, ), @@ -444,8 +450,16 @@ class _FamilyMemberAddState extends State { ), //TODO: Make sure text field is enabled only after option is chosen IncomeWithTypeTextField( - onSaved: (textValue, option) { - print(textValue! + " " + option!); + initialDropdownValue: widget + .familyMemberIndividualDataModel!.incomeType, + initialValue: + widget.familyMemberIndividualDataModel!.income, + onSaved: (income, option) { + widget.familyMemberIndividualDataModel!.income = + income; + widget.familyMemberIndividualDataModel! + .incomeType = option; + print(income! + " " + option!); }, text: 'Income', hintText: 'Enter income', diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index f6fb7ee..08ab6d9 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -10,6 +10,7 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import 'package:oktoast/oktoast.dart'; class ProfilePage extends StatefulWidget { @override @@ -30,8 +31,18 @@ Future _getUserDetails() async { var jwt = await jwtToken(); String url = NETWORK_ADDRESS; - var res = await http.get(Uri.http(url, '/api/getUserData'), - headers: {"Content-Type": "application/json", 'user-auth-token': jwt}); + var res = await http.get(Uri.http(url, '/api/getUserData'), headers: { + "Content-Type": "application/json", + 'user-auth-token': jwt + }).timeout( + const Duration(seconds: 10), + onTimeout: () { + showToast("Server Timed out!"); + // Time has run out, do what you wanted to do. + return http.Response( + 'Error', 408); // Request Timeout response status code + }, + ); print("RES: ${res.body}"); return res; @@ -41,7 +52,7 @@ Future get _getUserData async { var userData = await storage.read(key: USER_DATA_KEY); try { var res = await _getUserDetails(); - if(res.statusCode == 200){ + if (res.statusCode == 200) { userData = res.body; await storage.write(key: USER_DATA_KEY, value: userData); } diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index fa189ee..41f43b0 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -44,6 +44,7 @@ class _AddRemoveBoxWidgetState extends State { fontSize: 18, color: colors.darkAccentColor)), ), IconButton( + splashRadius: 20, onPressed: () { setState(() { widget.modelData?.individualDataListTransient @@ -114,6 +115,7 @@ class _AddRemoveBoxWidgetState extends State { fontSize: 20), ), trailing: IconButton( + splashRadius: 20, color: colors.darkSecondAccentColor, icon: Icon(Icons.close), onPressed: () async { diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index e109146..1b0dc29 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -31,8 +31,10 @@ class LoadValidPageWidget extends StatelessWidget { Future _validateToken(String JWT) async { String url = NETWORK_ADDRESS; - var res = await http.get(Uri.http(url, '/api/validateToken'), - headers: {"Content-Type": "application/json", 'user-auth-token': JWT}); + var res = await http.get(Uri.http(url, '/api/validateToken'), headers: { + "Content-Type": "application/json", + 'user-auth-token': JWT + }).timeout(Duration(seconds: 10)); print("RES: ${res.body}"); return res; diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 93732aa..00a6c52 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -54,7 +54,7 @@ }, { "id": "2:4604626538020621410", - "lastPropertyId": "36:6440758785035669475", + "lastPropertyId": "45:8806096688498887024", "name": "FamilyMemberIndividualDataModel", "properties": [ { @@ -98,16 +98,6 @@ "name": "dailyWageWorker", "type": 9 }, - { - "id": "9:5611188519781040934", - "name": "incomePerDay", - "type": 9 - }, - { - "id": "10:1258910779661384685", - "name": "incomePerMonth", - "type": 9 - }, { "id": "11:742592545502650523", "name": "pension", @@ -202,13 +192,58 @@ "id": "36:6440758785035669475", "name": "privateClinicServicesUsed", "type": 9 + }, + { + "id": "37:3741391841915175758", + "name": "employed", + "type": 9 + }, + { + "id": "38:2451270514680374685", + "name": "income", + "type": 9 + }, + { + "id": "39:5436158745852723253", + "name": "incomeType", + "type": 9 + }, + { + "id": "40:4028603457625037657", + "name": "dbPrivateServiceReason", + "type": 9 + }, + { + "id": "41:3132879446055335430", + "name": "dbCommunicableDiseases", + "type": 9 + }, + { + "id": "42:7751946170395515723", + "name": "dbFrequentAilments", + "type": 9 + }, + { + "id": "43:4854856293984079980", + "name": "dbNonCommunicableDiseases", + "type": 9 + }, + { + "id": "44:558549105718785352", + "name": "dbTobaccoProducts", + "type": 9 + }, + { + "id": "45:8806096688498887024", + "name": "dbOccupationData", + "type": 9 } ], "relations": [] }, { "id": "3:4555229639046191310", - "lastPropertyId": "34:938904163813263655", + "lastPropertyId": "37:8711686748126605615", "name": "FamilyMembersCommonDataModel", "properties": [ { @@ -371,6 +406,21 @@ "id": "34:938904163813263655", "name": "savedTime", "type": 9 + }, + { + "id": "35:4854280675953919579", + "name": "dbNoToiletsWhy", + "type": 9 + }, + { + "id": "36:6442255301640644335", + "name": "dbCropsCultivated", + "type": 9 + }, + { + "id": "37:8711686748126605615", + "name": "headOfFamily", + "type": 9 } ], "relations": [ @@ -399,7 +449,9 @@ 1321911158882624161, 1780571115080959247, 5383502869453245964, - 2820386840249227222 + 2820386840249227222, + 5611188519781040934, + 1258910779661384685 ], "retiredRelationUids": [], "version": 1 diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 0728ea6..7a99355 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -67,7 +67,7 @@ final _entities = [ ModelEntity( id: const IdUid(2, 4604626538020621410), name: 'FamilyMemberIndividualDataModel', - lastPropertyId: const IdUid(36, 6440758785035669475), + lastPropertyId: const IdUid(45, 8806096688498887024), flags: 0, properties: [ ModelProperty( @@ -110,16 +110,6 @@ final _entities = [ name: 'dailyWageWorker', type: 9, flags: 0), - ModelProperty( - id: const IdUid(9, 5611188519781040934), - name: 'incomePerDay', - type: 9, - flags: 0), - ModelProperty( - id: const IdUid(10, 1258910779661384685), - name: 'incomePerMonth', - type: 9, - flags: 0), ModelProperty( id: const IdUid(11, 742592545502650523), name: 'pension', @@ -214,6 +204,51 @@ final _entities = [ id: const IdUid(36, 6440758785035669475), name: 'privateClinicServicesUsed', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(37, 3741391841915175758), + name: 'employed', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(38, 2451270514680374685), + name: 'income', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(39, 5436158745852723253), + name: 'incomeType', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(40, 4028603457625037657), + name: 'dbPrivateServiceReason', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(41, 3132879446055335430), + name: 'dbCommunicableDiseases', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(42, 7751946170395515723), + name: 'dbFrequentAilments', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(43, 4854856293984079980), + name: 'dbNonCommunicableDiseases', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(44, 558549105718785352), + name: 'dbTobaccoProducts', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(45, 8806096688498887024), + name: 'dbOccupationData', + type: 9, flags: 0) ], relations: [], @@ -221,7 +256,7 @@ final _entities = [ ModelEntity( id: const IdUid(3, 4555229639046191310), name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(34, 938904163813263655), + lastPropertyId: const IdUid(37, 8711686748126605615), flags: 0, properties: [ ModelProperty( @@ -383,6 +418,21 @@ final _entities = [ id: const IdUid(34, 938904163813263655), name: 'savedTime', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(35, 4854280675953919579), + name: 'dbNoToiletsWhy', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(36, 6442255301640644335), + name: 'dbCropsCultivated', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(37, 8711686748126605615), + name: 'headOfFamily', + type: 9, flags: 0) ], relations: [ @@ -429,7 +479,9 @@ ModelDefinition getObjectBoxModel() { 1321911158882624161, 1780571115080959247, 5383502869453245964, - 2820386840249227222 + 2820386840249227222, + 5611188519781040934, + 1258910779661384685 ], retiredRelationUids: const [], modelVersion: 5, @@ -531,12 +583,6 @@ ModelDefinition getObjectBoxModel() { final dailyWageWorkerOffset = object.dailyWageWorker == null ? null : fbb.writeString(object.dailyWageWorker!); - final incomePerDayOffset = object.incomePerDay == null - ? null - : fbb.writeString(object.incomePerDay!); - final incomePerMonthOffset = object.incomePerMonth == null - ? null - : fbb.writeString(object.incomePerMonth!); final pensionOffset = object.pension == null ? null : fbb.writeString(object.pension!); final businessStatusOffset = object.businessStatus == null @@ -600,7 +646,36 @@ ModelDefinition getObjectBoxModel() { object.privateClinicServicesUsed == null ? null : fbb.writeString(object.privateClinicServicesUsed!); - fbb.startTable(37); + final employedOffset = object.employed == null + ? null + : fbb.writeString(object.employed!); + final incomeOffset = + object.income == null ? null : fbb.writeString(object.income!); + final incomeTypeOffset = object.incomeType == null + ? null + : fbb.writeString(object.incomeType!); + final dbPrivateServiceReasonOffset = + object.dbPrivateServiceReason == null + ? null + : fbb.writeString(object.dbPrivateServiceReason!); + final dbCommunicableDiseasesOffset = + object.dbCommunicableDiseases == null + ? null + : fbb.writeString(object.dbCommunicableDiseases!); + final dbFrequentAilmentsOffset = object.dbFrequentAilments == null + ? null + : fbb.writeString(object.dbFrequentAilments!); + final dbNonCommunicableDiseasesOffset = + object.dbNonCommunicableDiseases == null + ? null + : fbb.writeString(object.dbNonCommunicableDiseases!); + final dbTobaccoProductsOffset = object.dbTobaccoProducts == null + ? null + : fbb.writeString(object.dbTobaccoProducts!); + final dbOccupationDataOffset = object.dbOccupationData == null + ? null + : fbb.writeString(object.dbOccupationData!); + fbb.startTable(46); fbb.addInt64(0, object.id); fbb.addOffset(1, userNameOffset); fbb.addInt64(2, object.dateOfBirth?.millisecondsSinceEpoch); @@ -609,8 +684,6 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(5, educationQualificationOffset); fbb.addOffset(6, aadhaarNumberOffset); fbb.addOffset(7, dailyWageWorkerOffset); - fbb.addOffset(8, incomePerDayOffset); - fbb.addOffset(9, incomePerMonthOffset); fbb.addOffset(10, pensionOffset); fbb.addOffset(11, businessStatusOffset); fbb.addOffset(12, maritalStatusOffset); @@ -630,6 +703,15 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(33, noOfDaysWorkingOffset); fbb.addOffset(34, PHCServicesUsedOffset); fbb.addOffset(35, privateClinicServicesUsedOffset); + fbb.addOffset(36, employedOffset); + fbb.addOffset(37, incomeOffset); + fbb.addOffset(38, incomeTypeOffset); + fbb.addOffset(39, dbPrivateServiceReasonOffset); + fbb.addOffset(40, dbCommunicableDiseasesOffset); + fbb.addOffset(41, dbFrequentAilmentsOffset); + fbb.addOffset(42, dbNonCommunicableDiseasesOffset); + fbb.addOffset(43, dbTobaccoProductsOffset); + fbb.addOffset(44, dbOccupationDataOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -655,10 +737,6 @@ ModelDefinition getObjectBoxModel() { .vTableGetNullable(buffer, rootOffset, 16) ..dailyWageWorker = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 18) - ..incomePerDay = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 20) - ..incomePerMonth = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 22) ..pension = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 24) ..businessStatus = const fb.StringReader() @@ -699,7 +777,25 @@ ModelDefinition getObjectBoxModel() { ..PHCServicesUsed = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 72) ..privateClinicServicesUsed = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 74); + .vTableGetNullable(buffer, rootOffset, 74) + ..employed = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 76) + ..income = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 78) + ..incomeType = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 80) + ..dbPrivateServiceReason = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 82) + ..dbCommunicableDiseases = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 84) + ..dbFrequentAilments = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 86) + ..dbNonCommunicableDiseases = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 88) + ..dbTobaccoProducts = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 90) + ..dbOccupationData = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 92); return object; }), @@ -809,7 +905,16 @@ ModelDefinition getObjectBoxModel() { final savedTimeOffset = object.savedTime == null ? null : fbb.writeString(object.savedTime!); - fbb.startTable(35); + final dbNoToiletsWhyOffset = object.dbNoToiletsWhy == null + ? null + : fbb.writeString(object.dbNoToiletsWhy!); + final dbCropsCultivatedOffset = object.dbCropsCultivated == null + ? null + : fbb.writeString(object.dbCropsCultivated!); + final headOfFamilyOffset = object.headOfFamily == null + ? null + : fbb.writeString(object.headOfFamily!); + fbb.startTable(38); fbb.addInt64(0, object.id); fbb.addOffset(1, drinkingWaterOffset); fbb.addOffset(3, toiletFacilityOffset); @@ -842,6 +947,9 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(31, dbSourceOfDrinkingWaterOffset); fbb.addOffset(32, villageCodeOffset); fbb.addOffset(33, savedTimeOffset); + fbb.addOffset(34, dbNoToiletsWhyOffset); + fbb.addOffset(35, dbCropsCultivatedOffset); + fbb.addOffset(36, headOfFamilyOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -912,7 +1020,13 @@ ModelDefinition getObjectBoxModel() { ..villageCode = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 68) ..savedTime = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 70); + .vTableGetNullable(buffer, rootOffset, 70) + ..dbNoToiletsWhy = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 72) + ..dbCropsCultivated = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 74) + ..headOfFamily = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 76); InternalToManyAccess.setRelInfo( object.individualDataList, store, @@ -999,108 +1113,141 @@ class FamilyMemberIndividualDataModel_ { QueryStringProperty( _entities[1].properties[7]); - /// see [FamilyMemberIndividualDataModel.incomePerDay] - static final incomePerDay = - QueryStringProperty( - _entities[1].properties[8]); - - /// see [FamilyMemberIndividualDataModel.incomePerMonth] - static final incomePerMonth = - QueryStringProperty( - _entities[1].properties[9]); - /// see [FamilyMemberIndividualDataModel.pension] static final pension = QueryStringProperty( - _entities[1].properties[10]); + _entities[1].properties[8]); /// see [FamilyMemberIndividualDataModel.businessStatus] static final businessStatus = QueryStringProperty( - _entities[1].properties[11]); + _entities[1].properties[9]); /// see [FamilyMemberIndividualDataModel.maritalStatus] static final maritalStatus = QueryStringProperty( - _entities[1].properties[12]); + _entities[1].properties[10]); /// see [FamilyMemberIndividualDataModel.specialSkills] static final specialSkills = QueryStringVectorProperty( - _entities[1].properties[13]); + _entities[1].properties[11]); /// see [FamilyMemberIndividualDataModel.surgeries] static final surgeries = QueryStringProperty( - _entities[1].properties[14]); + _entities[1].properties[12]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesAware] static final anganwadiServicesAware = QueryStringProperty( - _entities[1].properties[15]); + _entities[1].properties[13]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsing] static final anganwadiServicesUsing = QueryStringProperty( - _entities[1].properties[16]); + _entities[1].properties[14]); /// see [FamilyMemberIndividualDataModel.anganwadiServicesUsedList] static final anganwadiServicesUsedList = QueryStringVectorProperty( - _entities[1].properties[17]); + _entities[1].properties[15]); /// see [FamilyMemberIndividualDataModel.useOfTobacco] static final useOfTobacco = QueryStringProperty( - _entities[1].properties[18]); + _entities[1].properties[16]); /// see [FamilyMemberIndividualDataModel.useOfAlcohol] static final useOfAlcohol = QueryStringProperty( - _entities[1].properties[19]); + _entities[1].properties[17]); /// see [FamilyMemberIndividualDataModel.aarogyaSetuInstalled] static final aarogyaSetuInstalled = QueryStringProperty( - _entities[1].properties[20]); + _entities[1].properties[18]); /// see [FamilyMemberIndividualDataModel.vizhithiruInstalled] static final vizhithiruInstalled = QueryStringProperty( - _entities[1].properties[21]); + _entities[1].properties[19]); /// see [FamilyMemberIndividualDataModel.dataValid] static final dataValid = QueryBooleanProperty( - _entities[1].properties[22]); + _entities[1].properties[20]); /// see [FamilyMemberIndividualDataModel.dbVulnerabilities] static final dbVulnerabilities = QueryStringProperty( - _entities[1].properties[23]); + _entities[1].properties[21]); /// see [FamilyMemberIndividualDataModel.dbOccupation] static final dbOccupation = QueryStringProperty( - _entities[1].properties[24]); + _entities[1].properties[22]); /// see [FamilyMemberIndividualDataModel.workTimings] static final workTimings = QueryStringVectorProperty( - _entities[1].properties[25]); + _entities[1].properties[23]); /// see [FamilyMemberIndividualDataModel.noOfDaysWorking] static final noOfDaysWorking = QueryStringProperty( - _entities[1].properties[26]); + _entities[1].properties[24]); /// see [FamilyMemberIndividualDataModel.PHCServicesUsed] static final PHCServicesUsed = QueryStringProperty( - _entities[1].properties[27]); + _entities[1].properties[25]); /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsed] static final privateClinicServicesUsed = QueryStringProperty( - _entities[1].properties[28]); + _entities[1].properties[26]); + + /// see [FamilyMemberIndividualDataModel.employed] + static final employed = QueryStringProperty( + _entities[1].properties[27]); + + /// see [FamilyMemberIndividualDataModel.income] + static final income = QueryStringProperty( + _entities[1].properties[28]); + + /// see [FamilyMemberIndividualDataModel.incomeType] + static final incomeType = + QueryStringProperty( + _entities[1].properties[29]); + + /// see [FamilyMemberIndividualDataModel.dbPrivateServiceReason] + static final dbPrivateServiceReason = + QueryStringProperty( + _entities[1].properties[30]); + + /// see [FamilyMemberIndividualDataModel.dbCommunicableDiseases] + static final dbCommunicableDiseases = + QueryStringProperty( + _entities[1].properties[31]); + + /// see [FamilyMemberIndividualDataModel.dbFrequentAilments] + static final dbFrequentAilments = + QueryStringProperty( + _entities[1].properties[32]); + + /// see [FamilyMemberIndividualDataModel.dbNonCommunicableDiseases] + static final dbNonCommunicableDiseases = + QueryStringProperty( + _entities[1].properties[33]); + + /// see [FamilyMemberIndividualDataModel.dbTobaccoProducts] + static final dbTobaccoProducts = + QueryStringProperty( + _entities[1].properties[34]); + + /// see [FamilyMemberIndividualDataModel.dbOccupationData] + static final dbOccupationData = + QueryStringProperty( + _entities[1].properties[35]); } /// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. @@ -1259,6 +1406,20 @@ class FamilyMembersCommonDataModel_ { static final savedTime = QueryStringProperty( _entities[2].properties[31]); + /// see [FamilyMembersCommonDataModel.dbNoToiletsWhy] + static final dbNoToiletsWhy = + QueryStringProperty( + _entities[2].properties[32]); + + /// see [FamilyMembersCommonDataModel.dbCropsCultivated] + static final dbCropsCultivated = + QueryStringProperty( + _entities[2].properties[33]); + + /// see [FamilyMembersCommonDataModel.headOfFamily] + static final headOfFamily = QueryStringProperty( + _entities[2].properties[34]); + /// see [FamilyMembersCommonDataModel.individualDataList] static final individualDataList = QueryRelationToMany< FamilyMembersCommonDataModel, diff --git a/pubspec.lock b/pubspec.lock index 50496a7..43b34a0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -28,7 +28,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" auto_size_text: dependency: "direct main" description: @@ -105,7 +105,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -414,7 +414,7 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" meta: dependency: transitive description: @@ -685,7 +685,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.3" timing: dependency: transitive description: @@ -706,7 +706,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" visibility_detector: dependency: "direct main" description: From ca5ef34d8e5c19b3e899b4cae9fb99929af3bcc1 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 19 Jan 2022 23:14:15 +0530 Subject: [PATCH 192/264] Changed model name --- ...{FamilyMembersCommonDataModel.dart => FamilyDataModels.dart} | 1 - lib/Screens/CollectLocationWidget.dart | 2 +- lib/Screens/EditExistingRecordsPage.dart | 2 +- lib/Screens/FamilyDetails.dart | 2 +- lib/Screens/FamilyHomeScreen.dart | 2 +- lib/Screens/FamilyMemberAdd.dart | 2 +- lib/Screens/SavedData.dart | 2 +- lib/Widgets/AddRemoveBoxWidget.dart | 2 +- lib/objectbox.g.dart | 2 +- 9 files changed, 8 insertions(+), 9 deletions(-) rename lib/Model/{FamilyMembersCommonDataModel.dart => FamilyDataModels.dart} (99%) diff --git a/lib/Model/FamilyMembersCommonDataModel.dart b/lib/Model/FamilyDataModels.dart similarity index 99% rename from lib/Model/FamilyMembersCommonDataModel.dart rename to lib/Model/FamilyDataModels.dart index 2d8d6cb..9cc2cbb 100644 --- a/lib/Model/FamilyMembersCommonDataModel.dart +++ b/lib/Model/FamilyDataModels.dart @@ -80,7 +80,6 @@ class FamilyMemberIndividualDataModel { String? vizhithiruInstalled; bool? dataValid = false; List? occupationData; - //String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); Map toJson() { diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index a2e10dd..d1f02a2 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -1,6 +1,6 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/FormPageView.dart'; diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 78b4ee1..d43225d 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index f8e2a0b..3b5f9b8 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -1,6 +1,6 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/CheckBoxAddExtraDialog.dart'; diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 13b1eff..d536eb1 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:geo_spatial/Utils/Constants.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/StoreInstance.dart'; diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 2c38bc0..67a640b 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart index 9f39422..ecda276 100644 --- a/lib/Screens/SavedData.dart +++ b/lib/Screens/SavedData.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/StoreInstance.dart'; diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 41f43b0..8af285a 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:geo_spatial/Model/FamilyMembersCommonDataModel.dart'; +import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Screens/FamilyMemberAdd.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:google_fonts/google_fonts.dart'; diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 7a99355..de4960d 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -10,7 +10,7 @@ import 'package:objectbox/objectbox.dart'; import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; import 'Model/CommunityDataModel.dart'; -import 'Model/FamilyMembersCommonDataModel.dart'; +import 'Model/FamilyDataModels.dart'; export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file From 6ff524e16c69df66c3519a00521d740685d4f8c8 Mon Sep 17 00:00:00 2001 From: nirmal Date: Wed, 19 Jan 2022 23:56:35 +0530 Subject: [PATCH 193/264] Altered data models --- lib/Screens/FamilyDetails.dart | 10 +++++----- lib/Screens/FamilyMemberAdd.dart | 1 + lib/Utils/Constants.dart | 4 ++-- lib/Widgets/IncomeWithTypeTextField.dart | 2 ++ 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 3b5f9b8..96e5729 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -302,7 +302,7 @@ class _FamilyDetailsState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], + list: ['0','1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No. of two wheelers", defaultValue: widget.modelData!.noOfTwoWheelers, @@ -313,7 +313,7 @@ class _FamilyDetailsState extends State { errorField: "Please choose a valid number", ), DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], + list: ['0','1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No. of three wheelers", defaultValue: widget.modelData!.noOfThreeWheelers, @@ -338,7 +338,7 @@ class _FamilyDetailsState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, ), DropDownFormField( - list: ['1', '2', '3', '4', '5', 'More'], + list: ['0','1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No. of four wheelers", errorField: "Please choose a valid number", @@ -354,10 +354,10 @@ class _FamilyDetailsState extends State { singleOption: false, context: context, dataMap: - widget.modelData!.twoFourManufacturer ?? four_mfg, + widget.modelData!.fourWheelManufacturer ?? four_mfg, onSaved: (val) { print("Value recorded: $val"); - widget.modelData?.twoFourManufacturer = val; + widget.modelData?.fourWheelManufacturer = val; }, errorField: "Please choose a brand", autoValidateMode: AutovalidateMode.onUserInteraction, diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 67a640b..83cd406 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -80,6 +80,7 @@ class _FamilyMemberAddState extends State { 'Elementary occupations': false, 'Armed Forces occupations': false, 'Unemployed': false, + 'Studying' : false, }; var privateClinicReasons = { diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index 0f6d386..5f90edd 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,6 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -//String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; -String NETWORK_ADDRESS = '192.168.29.126:2000'; +String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +//String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; String USER_DATA_KEY = "userData"; diff --git a/lib/Widgets/IncomeWithTypeTextField.dart b/lib/Widgets/IncomeWithTypeTextField.dart index dbede9b..1fa324e 100644 --- a/lib/Widgets/IncomeWithTypeTextField.dart +++ b/lib/Widgets/IncomeWithTypeTextField.dart @@ -3,6 +3,8 @@ import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; + +//TODO: Check for 0 (or lower) class IncomeWithTypeTextField extends StatefulWidget { IncomeWithTypeTextField({ Key? key, From 90e16f45a9723ef6b86f025d3e0cabf7a2cc0224 Mon Sep 17 00:00:00 2001 From: nirmal Date: Wed, 19 Jan 2022 23:58:25 +0530 Subject: [PATCH 194/264] Altered data models final --- lib/Model/FamilyDataModels.dart | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 9cc2cbb..6753081 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -91,12 +91,14 @@ class FamilyMemberIndividualDataModel { "gender": gender, "educationalQualification": educationQualification, "phoneNumber": phoneNumber, - "aadharNumber": aadhaarNumber, + "aadhaarNumber": aadhaarNumber, "Vulnerabilities": vulnerabilities != null ? buildListForOptionWidget(vulnerabilities!) : ['None'], "oldAgePension": pension, - "occupation": + "income" : income, + "incomeType" : incomeType, + "occupation": //TODO: Convert to list after passing through function occupation != null ? buildListForOptionWidget(occupation!) : ['None'], "noOfDaysWorking": noOfDaysWorking, "isADailyWageWorker": dailyWageWorker, @@ -253,7 +255,7 @@ class FamilyMembersCommonDataModel { String? noOfThreeWheelers; String? noOfFourWheelers; Map? twoThreeWheelManufacturer; - Map? twoFourManufacturer; + Map? fourWheelManufacturer; Map? localFoodMap; Map? noToiletsWhy; //TODO: Update JSON String? isCattleOwned; @@ -297,7 +299,8 @@ class FamilyMembersCommonDataModel { locationBottomRight!.latitude, locationBottomRight!.longitude ], - "availabilityOfDrinkingWater": runningWaterAvailable, + "headOfFamily" : headOfFamily, + "availabilityOfDrinkingWater": drinkingWater, "drinkingWaterSource": sourceOfDrinkingWater != null ? buildListForOptionWidget(sourceOfDrinkingWater!) @@ -309,9 +312,9 @@ class FamilyMembersCommonDataModel { ? buildListForOptionWidget(noToiletsWhy!) : [], //TODO: Inform change - "availabilityOfWaterInToilets": String, + "availabilityOfWaterInToilets": runningWaterAvailable, - "alternativeForHouseholdToilet": String, + "alternativeForHouseholdToilet": communityToilet, "statusOfEnvironmentalSanitation": environmentSanitationLevel, @@ -325,8 +328,8 @@ class FamilyMembersCommonDataModel { "numberOfFourWheelers": noOfFourWheelers, - "brandsOfFourWheelers": twoFourManufacturer != null - ? buildListForOptionWidget(twoFourManufacturer!) + "brandsOfFourWheelers": fourWheelManufacturer != null + ? buildListForOptionWidget(fourWheelManufacturer!) : [], "doYouOwnCattle": isCattleOwned, @@ -500,13 +503,13 @@ class FamilyMembersCommonDataModel { } String? get dbTwoFourManufacturer => - twoFourManufacturer == null ? null : json.encode(twoFourManufacturer); + fourWheelManufacturer == null ? null : json.encode(fourWheelManufacturer); set dbTwoFourManufacturer(String? value) { if (value == null) { - twoFourManufacturer = null; + fourWheelManufacturer = null; } else { - twoFourManufacturer = Map.from( + fourWheelManufacturer = Map.from( json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); } } From df23cd550055e7053251c23c11052db2a7baf79a Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 20 Jan 2022 11:02:14 +0530 Subject: [PATCH 195/264] Added code to differentiate between storage data for different users signed in. Now only saved records that belongs to the user ID can be viewed. --- lib/Model/CommunityDataModel.dart | 1 + lib/Model/FamilyDataModels.dart | 21 +++++------ lib/Screens/CommunityDataCollection.dart | 12 +++++++ lib/Screens/FamilyHomeScreen.dart | 14 ++++++++ lib/Screens/SavedData.dart | 30 ++++++++++++++-- lib/Utils/Constants.dart | 4 +-- lib/objectbox-model.json | 14 ++++++-- lib/objectbox.g.dart | 45 ++++++++++++++++++++---- 8 files changed, 117 insertions(+), 24 deletions(-) diff --git a/lib/Model/CommunityDataModel.dart b/lib/Model/CommunityDataModel.dart index a982099..abbf2a1 100644 --- a/lib/Model/CommunityDataModel.dart +++ b/lib/Model/CommunityDataModel.dart @@ -7,6 +7,7 @@ import 'package:intl/intl.dart'; @Entity() class CommunityDataModel { int id = 0; + String? recordCollectingUserId; String? resourceType; Position? locationTopLeft; Position? locationTopRight; diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 6753081..c7569bc 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -4,6 +4,7 @@ import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:objectbox/objectbox.dart'; + List buildListForOptionWidget(Map mapData) { var listData = []; @@ -80,6 +81,7 @@ class FamilyMemberIndividualDataModel { String? vizhithiruInstalled; bool? dataValid = false; List? occupationData; + //String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); Map toJson() { @@ -96,9 +98,9 @@ class FamilyMemberIndividualDataModel { ? buildListForOptionWidget(vulnerabilities!) : ['None'], "oldAgePension": pension, - "income" : income, - "incomeType" : incomeType, - "occupation": //TODO: Convert to list after passing through function + "income": income, + "incomeType": incomeType, + "occupation": //TODO: Convert to list after passing through function occupation != null ? buildListForOptionWidget(occupation!) : ['None'], "noOfDaysWorking": noOfDaysWorking, "isADailyWageWorker": dailyWageWorker, @@ -238,7 +240,10 @@ class FamilyMemberIndividualDataModel { @Entity() class FamilyMembersCommonDataModel { + int id = 0; + String? recordCollectingUserId; + Position? locationTopLeft; Position? locationTopRight; Position? locationBottomLeft; @@ -299,7 +304,7 @@ class FamilyMembersCommonDataModel { locationBottomRight!.latitude, locationBottomRight!.longitude ], - "headOfFamily" : headOfFamily, + "headOfFamily": headOfFamily, "availabilityOfDrinkingWater": drinkingWater, "drinkingWaterSource": sourceOfDrinkingWater != null @@ -585,12 +590,4 @@ class FamilyMembersCommonDataModel { json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); } } - - FamilyMembersCommonDataModel({ - //this.keys, - this.locationBottomLeft, - this.locationBottomRight, - this.locationTopLeft, - this.locationTopRight, - }); } diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 4c5b373..8f520f8 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -16,6 +16,15 @@ import 'package:oktoast/oktoast.dart'; final storage = FlutterSecureStorage(); +_getUserID() async { + var userData = await storage.read(key: USER_DATA_KEY); + if (userData == null) return ""; + + var dataJson = json.decode(userData); + print("dataJson ${dataJson} ${userData}"); + return dataJson[0]["username"]; +} + class CommunityDataCollection extends StatefulWidget { CommunityDataCollection({Key? key, CommunityDataModel? this.modelData}) : super(key: key); @@ -131,6 +140,9 @@ class _CommunityDataCollectionState extends State { _onSave() async { print("CLICKED"); + var userId = await _getUserID(); + modelData.recordCollectingUserId = userId; + store = await StoreInstance.getInstance(); final box = store.box(); int id = await box.putAsync(modelData); diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index d536eb1..3bca097 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Screens/FamilyDetails.dart'; @@ -14,6 +15,8 @@ import 'package:google_fonts/google_fonts.dart'; import 'CollectLocationWidget.dart'; import 'package:http/http.dart' as http; +final storage = FlutterSecureStorage(); + class FamilyHomeScreen extends StatefulWidget { FamilyHomeScreen({Key? key, this.modelData}) : super(key: key); @@ -22,6 +25,15 @@ class FamilyHomeScreen extends StatefulWidget { final modelData; } +_getUserID() async { + var userData = await storage.read(key: USER_DATA_KEY); + if (userData == null) return ""; + + var dataJson = json.decode(userData); + print("dataJson ${dataJson} ${userData}"); + return dataJson[0]["username"]; +} + FamilyMembersCommonDataModel? modelData; class _FamilyHomeScreenState extends State { @@ -144,6 +156,8 @@ class _FamilyHomeScreenState extends State { borderRadius: BorderRadius.circular(20), side: BorderSide(color: Colors.white)))), onPressed: () async { + var userId = await _getUserID(); + modelData!.recordCollectingUserId = userId; var store = await StoreInstance.getInstance(); Box individualDataBox = store.box(); diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart index ecda276..5f1992b 100644 --- a/lib/Screens/SavedData.dart +++ b/lib/Screens/SavedData.dart @@ -1,12 +1,28 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Model/CommunityDataModel.dart'; import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Utils/StoreInstance.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/objectbox.g.dart'; import 'package:google_fonts/google_fonts.dart'; +final storage = FlutterSecureStorage(); + +_getUserID() async { + var userData = await storage.read(key: USER_DATA_KEY); + if (userData == null) return ""; + + var dataJson = json.decode(userData); + print("dataJson ${dataJson} ${userData}"); + return dataJson[0]["username"]; +} + class SavedDataPage extends StatelessWidget { const SavedDataPage({Key? key}) : super(key: key); @@ -69,9 +85,14 @@ class CommunitySavedListWidget extends StatefulWidget { class _CommunitySavedListWidgetState extends State { Future getList() async { + String userId = await _getUserID(); var store = await StoreInstance.getInstance(); final box = store.box(); - List? list = await box.getAll(); + //box.query().build().find(); + List? list = box + .query(CommunityDataModel_.recordCollectingUserId.equals(userId)) + .build() + .find(); return await list; } @@ -155,9 +176,14 @@ class FamilySavedListWidget extends StatefulWidget { class _FamilySavedListWidgetState extends State { Future getList() async { + String userId = await _getUserID(); var store = await StoreInstance.getInstance(); final box = store.box(); - List? list = await box.getAll(); + List? list = box + .query( + FamilyMembersCommonDataModel_.recordCollectingUserId.equals(userId)) + .build() + .find(); return await list; } diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index 5f90edd..0f6d386 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,6 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; -//String NETWORK_ADDRESS = '192.168.29.126:2000'; +//String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; String USER_DATA_KEY = "userData"; diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 00a6c52..18d07f0 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -5,7 +5,7 @@ "entities": [ { "id": "1:6144760902505378968", - "lastPropertyId": "8:1374390598853638581", + "lastPropertyId": "9:1160256595193105843", "name": "CommunityDataModel", "properties": [ { @@ -48,6 +48,11 @@ "id": "8:1374390598853638581", "name": "dbLocationBottomRight", "type": 9 + }, + { + "id": "9:1160256595193105843", + "name": "recordCollectingUserId", + "type": 9 } ], "relations": [] @@ -243,7 +248,7 @@ }, { "id": "3:4555229639046191310", - "lastPropertyId": "37:8711686748126605615", + "lastPropertyId": "38:7524624993274240071", "name": "FamilyMembersCommonDataModel", "properties": [ { @@ -421,6 +426,11 @@ "id": "37:8711686748126605615", "name": "headOfFamily", "type": 9 + }, + { + "id": "38:7524624993274240071", + "name": "recordCollectingUserId", + "type": 9 } ], "relations": [ diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index de4960d..30e05e9 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -18,7 +18,7 @@ final _entities = [ ModelEntity( id: const IdUid(1, 6144760902505378968), name: 'CommunityDataModel', - lastPropertyId: const IdUid(8, 1374390598853638581), + lastPropertyId: const IdUid(9, 1160256595193105843), flags: 0, properties: [ ModelProperty( @@ -60,6 +60,11 @@ final _entities = [ id: const IdUid(8, 1374390598853638581), name: 'dbLocationBottomRight', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(9, 1160256595193105843), + name: 'recordCollectingUserId', + type: 9, flags: 0) ], relations: [], @@ -256,7 +261,7 @@ final _entities = [ ModelEntity( id: const IdUid(3, 4555229639046191310), name: 'FamilyMembersCommonDataModel', - lastPropertyId: const IdUid(37, 8711686748126605615), + lastPropertyId: const IdUid(38, 7524624993274240071), flags: 0, properties: [ ModelProperty( @@ -433,6 +438,11 @@ final _entities = [ id: const IdUid(37, 8711686748126605615), name: 'headOfFamily', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(38, 7524624993274240071), + name: 'recordCollectingUserId', + type: 9, flags: 0) ], relations: [ @@ -520,7 +530,11 @@ ModelDefinition getObjectBoxModel() { object.dbLocationBottomRight == null ? null : fbb.writeString(object.dbLocationBottomRight!); - fbb.startTable(9); + final recordCollectingUserIdOffset = + object.recordCollectingUserId == null + ? null + : fbb.writeString(object.recordCollectingUserId!); + fbb.startTable(10); fbb.addInt64(0, object.id); fbb.addOffset(1, resourceTypeOffset); fbb.addOffset(2, villageCodeOffset); @@ -529,6 +543,7 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(5, dbLocationTopRightOffset); fbb.addOffset(6, dbLocationBottomLeftOffset); fbb.addOffset(7, dbLocationBottomRightOffset); + fbb.addOffset(8, recordCollectingUserIdOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -551,7 +566,9 @@ ModelDefinition getObjectBoxModel() { ..dbLocationBottomLeft = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 16) ..dbLocationBottomRight = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 18); + .vTableGetNullable(buffer, rootOffset, 18) + ..recordCollectingUserId = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 20); return object; }), @@ -914,7 +931,11 @@ ModelDefinition getObjectBoxModel() { final headOfFamilyOffset = object.headOfFamily == null ? null : fbb.writeString(object.headOfFamily!); - fbb.startTable(38); + final recordCollectingUserIdOffset = + object.recordCollectingUserId == null + ? null + : fbb.writeString(object.recordCollectingUserId!); + fbb.startTable(39); fbb.addInt64(0, object.id); fbb.addOffset(1, drinkingWaterOffset); fbb.addOffset(3, toiletFacilityOffset); @@ -950,6 +971,7 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(34, dbNoToiletsWhyOffset); fbb.addOffset(35, dbCropsCultivatedOffset); fbb.addOffset(36, headOfFamilyOffset); + fbb.addOffset(37, recordCollectingUserIdOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -1026,7 +1048,9 @@ ModelDefinition getObjectBoxModel() { ..dbCropsCultivated = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 74) ..headOfFamily = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 76); + .vTableGetNullable(buffer, rootOffset, 76) + ..recordCollectingUserId = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 78); InternalToManyAccess.setRelInfo( object.individualDataList, store, @@ -1072,6 +1096,10 @@ class CommunityDataModel_ { /// see [CommunityDataModel.dbLocationBottomRight] static final dbLocationBottomRight = QueryStringProperty(_entities[0].properties[7]); + + /// see [CommunityDataModel.recordCollectingUserId] + static final recordCollectingUserId = + QueryStringProperty(_entities[0].properties[8]); } /// [FamilyMemberIndividualDataModel] entity fields to define ObjectBox queries. @@ -1420,6 +1448,11 @@ class FamilyMembersCommonDataModel_ { static final headOfFamily = QueryStringProperty( _entities[2].properties[34]); + /// see [FamilyMembersCommonDataModel.recordCollectingUserId] + static final recordCollectingUserId = + QueryStringProperty( + _entities[2].properties[35]); + /// see [FamilyMembersCommonDataModel.individualDataList] static final individualDataList = QueryRelationToMany< FamilyMembersCommonDataModel, From 74c6248be03b145c61fbb66db0ebd12e3a05240c Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 20 Jan 2022 14:39:20 +0530 Subject: [PATCH 196/264] Completed family data model JSON functions, need to add check conditiona for dependent fields. --- lib/Model/CommunityDataModel.dart | 1 + lib/Model/FamilyDataModels.dart | 168 ++++++++++++------------------ 2 files changed, 67 insertions(+), 102 deletions(-) diff --git a/lib/Model/CommunityDataModel.dart b/lib/Model/CommunityDataModel.dart index abbf2a1..969e638 100644 --- a/lib/Model/CommunityDataModel.dart +++ b/lib/Model/CommunityDataModel.dart @@ -142,6 +142,7 @@ class CommunityDataModel { this.villageCode}); Map toJson() => { + 'userId': recordCollectingUserId, 'resourceType': resourceType, 'villageCode': villageCode, 'locationTopLeft': [ diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index c7569bc..9a2143a 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -4,6 +4,7 @@ import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:objectbox/objectbox.dart'; +//TODO: Add condition to set empty, value to dependent fields List buildListForOptionWidget(Map mapData) { var listData = []; @@ -53,84 +54,84 @@ class FamilyMemberIndividualDataModel { String? educationQualification; String? aadhaarNumber; Map? vulnerabilities; - Map? occupation; String? dailyWageWorker; + List? occupationData; String? employed; String? income; String? incomeType; String? pension; String? businessStatus; String? maritalStatus; - String? noOfDaysWorking; //TODO: Confirm update in JSON + String? noOfDaysWorking; List? specialSkills; List? workTimings; String? surgeries; String? anganwadiServicesAware; String? anganwadiServicesUsing; List? anganwadiServicesUsedList; - String? PHCServicesUsed; //TODO: Confirm update in JSON - String? privateClinicServicesUsed; //TODO: Confirm update in JSON - Map? privateServiceReason; //TODO: Confirm update in JSON - Map? communicableDiseases; //TODO: Confirm update in JSON - Map? frequentAilments; //TODO: Confirm update in JSON - Map? nonCommunicableDiseases; //TODO: Confirm update in JSON - Map? tobaccoProducts; //TODO: Confirm update in JSON + String? PHCServicesUsed; + String? privateClinicServicesUsed; + Map? privateServiceReason; + Map? communicableDiseases; + Map? frequentAilments; + Map? nonCommunicableDiseases; String? useOfTobacco; + Map? tobaccoProducts; String? useOfAlcohol; String? aarogyaSetuInstalled; String? vizhithiruInstalled; bool? dataValid = false; - List? occupationData; //String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); Map toJson() { return { - "UIN": "", - "username": "", - "name": userName, - "date": "${dateOfBirth!.day}-${dateOfBirth!.month}-${dateOfBirth!.year}", - "gender": gender, - "educationalQualification": educationQualification, - "phoneNumber": phoneNumber, - "aadhaarNumber": aadhaarNumber, + "name": userName ?? "", + "dateOfBirth": + "${dateOfBirth!.day}-${dateOfBirth!.month}-${dateOfBirth!.year}", + "gender": gender ?? "", + "phoneNumber": phoneNumber ?? "", + "educationalQualification": educationQualification ?? "", + "aadhaarNumber": aadhaarNumber ?? "", "Vulnerabilities": vulnerabilities != null ? buildListForOptionWidget(vulnerabilities!) : ['None'], - "oldAgePension": pension, - "income": income, - "incomeType": incomeType, - "occupation": //TODO: Convert to list after passing through function - occupation != null ? buildListForOptionWidget(occupation!) : ['None'], - "noOfDaysWorking": noOfDaysWorking, - "isADailyWageWorker": dailyWageWorker, - "workTimings": workTimings, - "maritalStatus": maritalStatus, - "specialSkills": specialSkills, - "frequentHealthAilments": frequentAilments != null - ? buildListForOptionWidget(frequentAilments!) + "isADailyWageWorker": dailyWageWorker ?? "", + "occupationData": occupationData == null + ? [""] + : parseOccupationJson(occupationData!), + "employed": employed ?? "", + "income": income ?? "", + "incomeType": incomeType ?? "", + "oldAgePension": pension ?? "", + "businessStatus": businessStatus ?? "", + "maritalStatus": maritalStatus ?? "", + "noOfDaysWorking": noOfDaysWorking ?? "", + "specialSkills": specialSkills ?? "", + "workTimings": workTimings ?? "", + "surgeriesUndergone": surgeries ?? "", + "anganwadiServicesAware": anganwadiServicesAware ?? "", + "anganwadiServicesUsed": anganwadiServicesUsing ?? "", + "anganwadiServicesUtilised": anganwadiServicesUsedList ?? "", + "phcServicesUtilised": PHCServicesUsed ?? "", + "privateHealthClinicFacilitiesUsed": privateClinicServicesUsed ?? "", + "reasonsForVisitingPrivateHealthClinic": privateServiceReason != null + ? buildListForOptionWidget(privateServiceReason!) : [], "communicableDiseases": communicableDiseases != null ? buildListForOptionWidget(communicableDiseases!) : [], + "frequentHealthAilments": frequentAilments != null + ? buildListForOptionWidget(frequentAilments!) + : [], "nonCommunicableDiseases": nonCommunicableDiseases != null ? buildListForOptionWidget(nonCommunicableDiseases!) : [], - "surgeriesUndergone": surgeries, - "anganwadiServicesAware": anganwadiServicesAware, - "anganwadiServicesUsed": anganwadiServicesUsing, - "anganwadiServicesUtilised": anganwadiServicesUsedList, - "phcServicesUtilised": PHCServicesUsed, - "privateHealthClinicFacilitiesUsed": privateClinicServicesUsed, - "reasonsForVisitingPrivateHealthClinic": privateServiceReason != null - ? buildListForOptionWidget(privateServiceReason!) - : [], - "tobaccoBasedProductsUsage": useOfTobacco, - "tobaccoProductsUsed": tobaccoProducts, - "alcoholConsumption": useOfAlcohol, - "businessStatus": businessStatus, - "arogyaSethuAppInstallationStatus": aarogyaSetuInstalled, - "vizhithiruAppInstallationStatus": vizhithiruInstalled + "tobaccoBasedProductsUsage": useOfTobacco ?? "", + "tobaccoProductsUsed": tobaccoProducts ?? "", + "alcoholConsumption": useOfAlcohol ?? "", + "arogyaSethuAppInstallationStatus": aarogyaSetuInstalled ?? "", + "vizhithiruAppInstallationStatus": vizhithiruInstalled ?? "" }; } @@ -164,18 +165,6 @@ class FamilyMemberIndividualDataModel { } } - String? get dbOccupation => - occupation == null ? null : json.encode(occupation); - - set dbOccupation(String? value) { - if (value == null) { - occupation = null; - } else { - occupation = Map.from( - json.decode(value).map((k, v) => MapEntry(k as String, v as bool))); - } - } - String? get dbPrivateServiceReason => privateServiceReason == null ? null : json.encode(privateServiceReason); @@ -240,7 +229,6 @@ class FamilyMemberIndividualDataModel { @Entity() class FamilyMembersCommonDataModel { - int id = 0; String? recordCollectingUserId; @@ -253,6 +241,7 @@ class FamilyMembersCommonDataModel { String? drinkingWater; Map? sourceOfDrinkingWater; String? toiletFacility; + Map? noToiletsWhy; String? communityToilet; String? environmentSanitationLevel; String? runningWaterAvailable; @@ -262,12 +251,11 @@ class FamilyMembersCommonDataModel { Map? twoThreeWheelManufacturer; Map? fourWheelManufacturer; Map? localFoodMap; - Map? noToiletsWhy; //TODO: Update JSON String? isCattleOwned; String? incomeFromCattle; String? isFarmLandOwned; String? isSeedsPreserved; - Map? cropsCultivated; //TODO: Update JSON + Map? cropsCultivated; Map? preservedSeedsMap; Map? treesOwnedMap; String? isKitchenGardenOwned; @@ -283,9 +271,9 @@ class FamilyMembersCommonDataModel { final individualDataListTransient = []; final individualDataList = ToMany(); - //TODO: Add condition to set empty value to dependent fields Map toJson() { return { + 'volunteerUserId': recordCollectingUserId, 'familyMemberData': individualDataListTransient.map((item) => item.toJson()).toList(), 'locationTopLeft': [ @@ -305,69 +293,45 @@ class FamilyMembersCommonDataModel { locationBottomRight!.longitude ], "headOfFamily": headOfFamily, - "availabilityOfDrinkingWater": drinkingWater, - + "availabilityOfDrinkingWater": drinkingWater ?? "", "drinkingWaterSource": sourceOfDrinkingWater != null ? buildListForOptionWidget(sourceOfDrinkingWater!) : [], - - "areToiletsAvailableInHouse": toiletFacility, - - "noToiletsWhy": noToiletsWhy != null - ? buildListForOptionWidget(noToiletsWhy!) - : [], //TODO: Inform change - - "availabilityOfWaterInToilets": runningWaterAvailable, - - "alternativeForHouseholdToilet": communityToilet, - - "statusOfEnvironmentalSanitation": environmentSanitationLevel, - - "numberOfTwoWheelers": noOfTwoWheelers, - + "areToiletsAvailableInHouse": toiletFacility ?? "", + "noToiletsWhy": + noToiletsWhy != null ? buildListForOptionWidget(noToiletsWhy!) : [], + "alternativeForHouseholdToilet": communityToilet ?? "", + "statusOfEnvironmentalSanitation": environmentSanitationLevel ?? "", + "availabilityOfWaterInToilets": runningWaterAvailable ?? "", + "numberOfTwoWheelers": noOfTwoWheelers ?? "", + "numberOfThreeWheelers": noOfThreeWheelers ?? "", + "numberOfFourWheelers": noOfFourWheelers ?? "", "brandsOfTwoThreeWheelers": twoThreeWheelManufacturer != null ? buildListForOptionWidget(twoThreeWheelManufacturer!) : [], - - "numberOfThreeWheelers": noOfThreeWheelers, - - "numberOfFourWheelers": noOfFourWheelers, - "brandsOfFourWheelers": fourWheelManufacturer != null ? buildListForOptionWidget(fourWheelManufacturer!) : [], - + "locallyAvailableFoodsConsumed": + localFoodMap != null ? buildListForOptionWidget(localFoodMap!) : [], "doYouOwnCattle": isCattleOwned, - - "incomeFromCattle": isCattleOwned == 'yes' ? incomeFromCattle : '', - - "doYouOwnFarmLand": isFarmLandOwned, - + "incomeFromCattle": isCattleOwned == 'yes' ? incomeFromCattle : '', + "doYouOwnFarmLand": isFarmLandOwned ?? "", + "doYouPreserveSeeds": isSeedsPreserved ?? "", "cropsCultivated": cropsCultivated != null ? buildListForOptionWidget(cropsCultivated!) : [], - - "doYouPreserveSeeds": isSeedsPreserved, - "typesOfSeedsPreserved": preservedSeedsMap != null ? buildListForOptionWidget(preservedSeedsMap!) : [], - - "locallyAvailableFoodsConsumed": - localFoodMap != null ? buildListForOptionWidget(localFoodMap!) : [], - "treesOwnedIfAny": treesOwnedMap != null ? buildListForOptionWidget(treesOwnedMap!) : [], - - "isKitchenGardenAvailable": isKitchenGardenOwned, - + "isKitchenGardenAvailable": isKitchenGardenOwned ?? "", "cropsInKitchenGarden": kitchenGardenPlants != null ? buildListForOptionWidget(kitchenGardenPlants!) : [], - "address": "$addressOne\n$addressTwo\n$city", - - "villageCode": villageCode ?? "" + "villageCode": villageCode ?? "" }; } From 21293a4ef95b1400e902362ed65845ce48ec9bef Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 20 Jan 2022 14:40:57 +0530 Subject: [PATCH 197/264] Updated objectbox model classes --- lib/objectbox-model.json | 8 ++----- lib/objectbox.g.dart | 45 ++++++++++++++-------------------------- 2 files changed, 17 insertions(+), 36 deletions(-) diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 18d07f0..144a197 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -173,11 +173,6 @@ "name": "dbVulnerabilities", "type": 9 }, - { - "id": "32:1328642062638523745", - "name": "dbOccupation", - "type": 9 - }, { "id": "33:5419770240499089417", "name": "workTimings", @@ -461,7 +456,8 @@ 5383502869453245964, 2820386840249227222, 5611188519781040934, - 1258910779661384685 + 1258910779661384685, + 1328642062638523745 ], "retiredRelationUids": [], "version": 1 diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 30e05e9..5319f88 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -185,11 +185,6 @@ final _entities = [ name: 'dbVulnerabilities', type: 9, flags: 0), - ModelProperty( - id: const IdUid(32, 1328642062638523745), - name: 'dbOccupation', - type: 9, - flags: 0), ModelProperty( id: const IdUid(33, 5419770240499089417), name: 'workTimings', @@ -491,7 +486,8 @@ ModelDefinition getObjectBoxModel() { 5383502869453245964, 2820386840249227222, 5611188519781040934, - 1258910779661384685 + 1258910779661384685, + 1328642062638523745 ], retiredRelationUids: const [], modelVersion: 5, @@ -645,9 +641,6 @@ ModelDefinition getObjectBoxModel() { final dbVulnerabilitiesOffset = object.dbVulnerabilities == null ? null : fbb.writeString(object.dbVulnerabilities!); - final dbOccupationOffset = object.dbOccupation == null - ? null - : fbb.writeString(object.dbOccupation!); final workTimingsOffset = object.workTimings == null ? null : fbb.writeList(object.workTimings! @@ -715,7 +708,6 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(27, vizhithiruInstalledOffset); fbb.addBool(28, object.dataValid); fbb.addOffset(30, dbVulnerabilitiesOffset); - fbb.addOffset(31, dbOccupationOffset); fbb.addOffset(32, workTimingsOffset); fbb.addOffset(33, noOfDaysWorkingOffset); fbb.addOffset(34, PHCServicesUsedOffset); @@ -784,8 +776,6 @@ ModelDefinition getObjectBoxModel() { const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 60) ..dbVulnerabilities = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 64) - ..dbOccupation = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 66) ..workTimings = const fb.ListReader(fb.StringReader(), lazy: false) .vTableGetNullable(buffer, rootOffset, 68) @@ -1209,73 +1199,68 @@ class FamilyMemberIndividualDataModel_ { QueryStringProperty( _entities[1].properties[21]); - /// see [FamilyMemberIndividualDataModel.dbOccupation] - static final dbOccupation = - QueryStringProperty( - _entities[1].properties[22]); - /// see [FamilyMemberIndividualDataModel.workTimings] static final workTimings = QueryStringVectorProperty( - _entities[1].properties[23]); + _entities[1].properties[22]); /// see [FamilyMemberIndividualDataModel.noOfDaysWorking] static final noOfDaysWorking = QueryStringProperty( - _entities[1].properties[24]); + _entities[1].properties[23]); /// see [FamilyMemberIndividualDataModel.PHCServicesUsed] static final PHCServicesUsed = QueryStringProperty( - _entities[1].properties[25]); + _entities[1].properties[24]); /// see [FamilyMemberIndividualDataModel.privateClinicServicesUsed] static final privateClinicServicesUsed = QueryStringProperty( - _entities[1].properties[26]); + _entities[1].properties[25]); /// see [FamilyMemberIndividualDataModel.employed] static final employed = QueryStringProperty( - _entities[1].properties[27]); + _entities[1].properties[26]); /// see [FamilyMemberIndividualDataModel.income] static final income = QueryStringProperty( - _entities[1].properties[28]); + _entities[1].properties[27]); /// see [FamilyMemberIndividualDataModel.incomeType] static final incomeType = QueryStringProperty( - _entities[1].properties[29]); + _entities[1].properties[28]); /// see [FamilyMemberIndividualDataModel.dbPrivateServiceReason] static final dbPrivateServiceReason = QueryStringProperty( - _entities[1].properties[30]); + _entities[1].properties[29]); /// see [FamilyMemberIndividualDataModel.dbCommunicableDiseases] static final dbCommunicableDiseases = QueryStringProperty( - _entities[1].properties[31]); + _entities[1].properties[30]); /// see [FamilyMemberIndividualDataModel.dbFrequentAilments] static final dbFrequentAilments = QueryStringProperty( - _entities[1].properties[32]); + _entities[1].properties[31]); /// see [FamilyMemberIndividualDataModel.dbNonCommunicableDiseases] static final dbNonCommunicableDiseases = QueryStringProperty( - _entities[1].properties[33]); + _entities[1].properties[32]); /// see [FamilyMemberIndividualDataModel.dbTobaccoProducts] static final dbTobaccoProducts = QueryStringProperty( - _entities[1].properties[34]); + _entities[1].properties[33]); /// see [FamilyMemberIndividualDataModel.dbOccupationData] static final dbOccupationData = QueryStringProperty( - _entities[1].properties[35]); + _entities[1].properties[34]); } /// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. From dfec05da0f8fcb56294d2f881bd49eb726efc2b3 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 20 Jan 2022 15:32:49 +0530 Subject: [PATCH 198/264] Completed JSON for Family Data --- lib/Model/FamilyDataModels.dart | 30 ++++++++++++------ lib/Screens/FamilyHomeScreen.dart | 52 +++++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 15 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 9a2143a..1aa7d00 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -22,18 +22,29 @@ class FamilyMemberIndividualDataModel { parseOccupationJson(List occupationData) { var list = []; for (var i in occupationData) { - print("ENC: ${i.toJsonString()}"); list.add(i.toJsonString()); } - for (var i in list) { - print("ENC AF: ${i}"); - } - - print("ENCODED VAL: ${json.encode(list)}"); return json.encode(list); } + parseOccupationServerResultJSON(List occupationData) { + var list = []; + for (var i in occupationData) { + if (i.isSelected == true) { + var job = []; + i.subOptionDataMap!.forEach((key, value) { + if (value == true) { + job.add(key); + } + }); + list.add({"category: ": i.boxName, "job: ": job}); + } + } + print("ENC: ${json.encode(list)}"); + return list; + } + parseOccupationObject(String occupationData) { List occupationStringList = json.decode(occupationData); List list = []; @@ -99,7 +110,7 @@ class FamilyMemberIndividualDataModel { "isADailyWageWorker": dailyWageWorker ?? "", "occupationData": occupationData == null ? [""] - : parseOccupationJson(occupationData!), + : parseOccupationServerResultJSON(occupationData!), "employed": employed ?? "", "income": income ?? "", "incomeType": incomeType ?? "", @@ -128,7 +139,9 @@ class FamilyMemberIndividualDataModel { ? buildListForOptionWidget(nonCommunicableDiseases!) : [], "tobaccoBasedProductsUsage": useOfTobacco ?? "", - "tobaccoProductsUsed": tobaccoProducts ?? "", + "tobaccoProductsUsed": tobaccoProducts != null + ? buildListForOptionWidget(tobaccoProducts!) + : [], "alcoholConsumption": useOfAlcohol ?? "", "arogyaSethuAppInstallationStatus": aarogyaSetuInstalled ?? "", "vizhithiruAppInstallationStatus": vizhithiruInstalled ?? "" @@ -273,7 +286,6 @@ class FamilyMembersCommonDataModel { Map toJson() { return { - 'volunteerUserId': recordCollectingUserId, 'familyMemberData': individualDataListTransient.map((item) => item.toJson()).toList(), 'locationTopLeft': [ diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 3bca097..2620c0e 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -12,6 +12,7 @@ import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:geo_spatial/objectbox.g.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:oktoast/oktoast.dart'; import 'CollectLocationWidget.dart'; import 'package:http/http.dart' as http; @@ -54,12 +55,36 @@ class _FamilyHomeScreenState extends State { }); } + Future jwtToken() async { + var jwt = await storage.read(key: JWT_STORAGE_KEY); + print(JWT_STORAGE_KEY + jwt.toString()); + + if (jwt == null) return ""; + return jwt; + } + Future _makeRequest(var data, String node) async { String url = NETWORK_ADDRESS; var body = json.encode(data); - var res = await http.post(Uri.https(url, '/api/$node'), - headers: {"Content-Type": "application/json"}, body: body); + var jwt = await jwtToken(); + + var res = await http + .post(Uri.http(url, node), + headers: { + "Content-Type": "application/json", + "user-auth-token": jwt + }, + body: body) + .timeout( + const Duration(seconds: 10), + onTimeout: () { + showToast("Server Timed out!"); + // Time has run out, do what you wanted to do. + return http.Response( + 'Error', 408); // Request Timeout response status code + }, + ); return res; } @@ -128,11 +153,26 @@ class _FamilyHomeScreenState extends State { //TODO: Change end point and check res for errors if (isValid) { - print("MODEL JSON: ${widget.modelData.toJson()}"); - http.Response res = await _makeRequest( - modelData!.toJson(), "familyData"); + try { + print("FINAL DATA: ${modelData!.toJson()}"); + http.Response res = await _makeRequest( + modelData!.toJson(), "/api/IndividualData"); + if (res.statusCode != 20) { + showToast(res.body); + } else { + Navigator.pop(context); + showToast("Data entered successfully!"); + } + } catch (e) { + print(e); + showToast( + "Something went wrong, please check your network connection or save your records to upload later", + position: ToastPosition.center, + backgroundColor: colors.darkAccentColor); + } + } else { + showToast("Please fill all fields!"); } - print("Is Valid: $isValid"); }), ), From b1d236d001f586a41c5b9cac79ca58d363f3ed28 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 20 Jan 2022 15:37:46 +0530 Subject: [PATCH 199/264] Added village code widget in Individual Data --- lib/Screens/FamilyDetails.dart | 28 ++++++++++++++++++++++++---- lib/Screens/FamilyHomeScreen.dart | 1 - 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 96e5729..cac6c4e 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -55,6 +55,17 @@ class _FamilyDetailsState extends State { 'None': false }; + final List _villageCodeName = [ + 'THC', + 'PGP', + 'AMC', + 'KUP', + 'KAP', + 'NEP', + 'CGP', + 'JJN' + ]; + var four_mfg = { 'Maruti Suzuki': false, 'Hyundai': false, @@ -198,7 +209,6 @@ class _FamilyDetailsState extends State { padding: const EdgeInsets.symmetric(vertical: 10.0), child: DropDownFormField( defaultValue: widget.modelData!.headOfFamily, - //TODO: Fetch names from family member add saved objects and populate list onSaved: (value) { widget.modelData!.headOfFamily = value; }, @@ -208,6 +218,16 @@ class _FamilyDetailsState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, list: _getUserNameList(), )), + DropDownFormField( + defaultValue: widget.modelData!.villageCode, + list: _villageCodeName, + onSaved: (data) { + print(data); + widget.modelData!.villageCode = data; + }, + title: "Choose Village Code", + hint: "Select Village Code", + errorField: "Please choose a village code"), OptionsWidget( options: [ ['Yes', 'yes'], @@ -302,7 +322,7 @@ class _FamilyDetailsState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ DropDownFormField( - list: ['0','1', '2', '3', '4', '5', 'More'], + list: ['0', '1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No. of two wheelers", defaultValue: widget.modelData!.noOfTwoWheelers, @@ -313,7 +333,7 @@ class _FamilyDetailsState extends State { errorField: "Please choose a valid number", ), DropDownFormField( - list: ['0','1', '2', '3', '4', '5', 'More'], + list: ['0', '1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No. of three wheelers", defaultValue: widget.modelData!.noOfThreeWheelers, @@ -338,7 +358,7 @@ class _FamilyDetailsState extends State { autoValidateMode: AutovalidateMode.onUserInteraction, ), DropDownFormField( - list: ['0','1', '2', '3', '4', '5', 'More'], + list: ['0', '1', '2', '3', '4', '5', 'More'], hint: "Select the highest", title: "No. of four wheelers", errorField: "Please choose a valid number", diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 2620c0e..00e28ec 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -269,4 +269,3 @@ class _FamilyHomeScreenState extends State { } } -//TODO: isEdited to the request From f9b806992cdfedb87f25c2d1bf33c1bdd619de7d Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Thu, 20 Jan 2022 15:51:00 +0530 Subject: [PATCH 200/264] Fixed bug in displaying Head of Family when the name was recently changed in the individual family data field. --- lib/Screens/FamilyMemberAdd.dart | 13 ++++++++++++- lib/Widgets/AddRemoveBoxWidget.dart | 12 +++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 83cd406..5dd5945 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -80,7 +80,7 @@ class _FamilyMemberAddState extends State { 'Elementary occupations': false, 'Armed Forces occupations': false, 'Unemployed': false, - 'Studying' : false, + 'Studying': false, }; var privateClinicReasons = { @@ -178,6 +178,17 @@ class _FamilyMemberAddState extends State { initialValue: widget.familyMemberIndividualDataModel?.userName, onSaved: (String? data) async { + /** + * If condition to check if user name is equal to the HeadofFamily + * HeadOfFamily value updated as well + */ + if (widget.dataModel!.headOfFamily != null) { + if (widget.dataModel!.headOfFamily == + widget + .familyMemberIndividualDataModel!.userName) { + widget.dataModel!.headOfFamily = data; + } + } widget.familyMemberIndividualDataModel!.userName = data; }, style: darkTheme.DarkTheme.textTheme.bodyText2, diff --git a/lib/Widgets/AddRemoveBoxWidget.dart b/lib/Widgets/AddRemoveBoxWidget.dart index 8af285a..9f0bcde 100644 --- a/lib/Widgets/AddRemoveBoxWidget.dart +++ b/lib/Widgets/AddRemoveBoxWidget.dart @@ -44,7 +44,7 @@ class _AddRemoveBoxWidgetState extends State { fontSize: 18, color: colors.darkAccentColor)), ), IconButton( - splashRadius: 20, + splashRadius: 20, onPressed: () { setState(() { widget.modelData?.individualDataListTransient @@ -68,25 +68,23 @@ class _AddRemoveBoxWidgetState extends State { itemBuilder: (BuildContext context, int index) { return Card( color: colors.darkSecondBackgroundColor, - /** + /** * Re-renders tiles whenever visibility changed * i.e, when user comes back from user page, * page re rendered and user name is reflected */ child: VisibilityDetector( onVisibilityChanged: (VisibilityInfo info) { - try{ + try { setState(() {}); //Re-renders page - } - catch(e){ - - } + } catch (e) {} }, key: Key('add-remove-widget-key'), child: ListTile( onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => FamilyMemberAdd( + dataModel: widget.modelData, familyMemberIndividualDataModel: widget.modelData! .individualDataListTransient From bbb93b6171028cd2448fa7b963282f73129465fd Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 21 Jan 2022 01:20:12 +0530 Subject: [PATCH 201/264] Changed URL, added UIN place holder in toJson --- lib/Model/FamilyDataModels.dart | 1 + lib/Utils/Constants.dart | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 1aa7d00..8f62234 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -97,6 +97,7 @@ class FamilyMemberIndividualDataModel { Map toJson() { return { + "UIN": "", "name": userName ?? "", "dateOfBirth": "${dateOfBirth!.day}-${dateOfBirth!.month}-${dateOfBirth!.year}", diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index 0f6d386..5f90edd 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,6 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -//String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; -String NETWORK_ADDRESS = '192.168.29.126:2000'; +String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +//String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; String USER_DATA_KEY = "userData"; From a42d707936f06bf0748628fb6d4dff65e3ea8aaf Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 21 Jan 2022 01:21:41 +0530 Subject: [PATCH 202/264] Updated check status code to 201 --- lib/Screens/FamilyHomeScreen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 00e28ec..a6e3468 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -157,7 +157,7 @@ class _FamilyHomeScreenState extends State { print("FINAL DATA: ${modelData!.toJson()}"); http.Response res = await _makeRequest( modelData!.toJson(), "/api/IndividualData"); - if (res.statusCode != 20) { + if (res.statusCode != 201) { showToast(res.body); } else { Navigator.pop(context); From ea318d3d116e2ad2dfc75ba6227301e6f6cd5ec4 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Fri, 21 Jan 2022 01:36:06 +0530 Subject: [PATCH 203/264] Changed HTTP to HTTPS --- lib/Screens/ChangePassword.dart | 2 +- lib/Screens/CommunityDataCollection.dart | 2 +- lib/Screens/FamilyHomeScreen.dart | 2 +- lib/Screens/Login.dart | 5 +++-- lib/Screens/ProfilePage.dart | 2 +- lib/Widgets/LoadValidPageWidget.dart | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 9602466..162c9d8 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -53,7 +53,7 @@ class _ChangePasswordState extends State { String jwt = await jwtToken; var res = await http - .put(Uri.http(url, '/api/changeUserPassword'), + .put(Uri.https(url, '/api/changeUserPassword'), headers: { "Content-Type": "application/json", 'user-auth-token': jwt diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 8f520f8..ab2a682 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -90,7 +90,7 @@ class _CommunityDataCollectionState extends State { var jwt = await jwtToken(); var res = await http - .post(Uri.http(url, node), + .post(Uri.https(url, node), headers: { "Content-Type": "application/json", "user-auth-token": jwt diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index a6e3468..5731b74 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -70,7 +70,7 @@ class _FamilyHomeScreenState extends State { var jwt = await jwtToken(); var res = await http - .post(Uri.http(url, node), + .post(Uri.https(url, node), headers: { "Content-Type": "application/json", "user-auth-token": jwt diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 240c71f..11c83ca 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -56,7 +56,7 @@ class _MyAppState extends State { String url = NETWORK_ADDRESS; var body = json.encode({"username": username, "password": password}); - var res = await http.post(Uri.http(url, '/api/login'), + var res = await http.post(Uri.https(url, '/api/login'), headers: {"Content-Type": "application/json"}, body: body); print("RES: ${res.body}"); @@ -66,7 +66,7 @@ class _MyAppState extends State { Future _getUserDetails(String JWT) async { String url = NETWORK_ADDRESS; - var res = await http.get(Uri.http(url, '/api/getUserData'), + var res = await http.get(Uri.https(url, '/api/getUserData'), headers: {"Content-Type": "application/json", 'user-auth-token': JWT}); print("RES: ${res.body}"); @@ -99,6 +99,7 @@ class _MyAppState extends State { try { http.Response loginResponse = await _makeLoginRequest(username, password); + print("LOGIN RESPONSE ${loginResponse.body}"); if (loginResponse.statusCode != 200) { setState(() { _nameError = loginResponse.body; diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 08ab6d9..fea44d0 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -31,7 +31,7 @@ Future _getUserDetails() async { var jwt = await jwtToken(); String url = NETWORK_ADDRESS; - var res = await http.get(Uri.http(url, '/api/getUserData'), headers: { + var res = await http.get(Uri.https(url, '/api/getUserData'), headers: { "Content-Type": "application/json", 'user-auth-token': jwt }).timeout( diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index 1b0dc29..8108a40 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -31,7 +31,7 @@ class LoadValidPageWidget extends StatelessWidget { Future _validateToken(String JWT) async { String url = NETWORK_ADDRESS; - var res = await http.get(Uri.http(url, '/api/validateToken'), headers: { + var res = await http.get(Uri.https(url, '/api/validateToken'), headers: { "Content-Type": "application/json", 'user-auth-token': JWT }).timeout(Duration(seconds: 10)); From ca4374fb16b55485b5c26af3e29e7e0bc25b7fca Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 22 Jan 2022 12:45:31 +0530 Subject: [PATCH 204/264] Updated server URL --- lib/Utils/Constants.dart | 2 +- lib/Widgets/NestedOptionWidgetFormField.dart | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index 5f90edd..94fe6d4 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,5 +1,5 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = 'node-geo-spatial-api.herokuapp.com'; +String NETWORK_ADDRESS = 'https://geo-spatial-amrita.herokuapp.com/'; //String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; diff --git a/lib/Widgets/NestedOptionWidgetFormField.dart b/lib/Widgets/NestedOptionWidgetFormField.dart index 7439e61..f734c0d 100644 --- a/lib/Widgets/NestedOptionWidgetFormField.dart +++ b/lib/Widgets/NestedOptionWidgetFormField.dart @@ -117,6 +117,5 @@ class NestedOptionWidgetFormField extends FormField> { ], ), ); - ; }); } From d9c1b801c2006ff3ea6a5e03334887e06f4193e9 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 14:17:34 +0530 Subject: [PATCH 205/264] Changed full URL to partial URL as HTTP and HTTPS is managed by library, added progress dialog for submitting data. --- lib/Screens/CommunityDataCollection.dart | 34 ++++++++++++++++++++-- lib/Screens/FamilyHomeScreen.dart | 36 ++++++++++++++++++++++-- lib/Utils/Constants.dart | 2 +- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index ab2a682..73cdf5d 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -97,12 +97,11 @@ class _CommunityDataCollectionState extends State { }, body: body) .timeout( - const Duration(seconds: 10), + const Duration(seconds: 30), onTimeout: () { - showToast("Server Timed out!"); // Time has run out, do what you wanted to do. return http.Response( - 'Error', 408); // Request Timeout response status code + 'Server Timed out!', 408); // Request Timeout response status code }, ); return res; @@ -117,6 +116,34 @@ class _CommunityDataCollectionState extends State { print(isValid.toString()); if (isValid) { + var progressContext; + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + progressContext = context; + return WillPopScope( + child: Dialog( + child: Padding( + padding: EdgeInsets.all(20), + child: new Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: EdgeInsets.only(right: 20), + child: CircularProgressIndicator(), + ), + new Text( + "Uploading data", + style: TextStyle(color: Colors.black), + ), + ], + ), + ), + ), + onWillPop: () async => false); + }, + ); try { http.Response res = await _makeRequest( modelData.toJson(), "/api/addCommunityBuilding"); @@ -133,6 +160,7 @@ class _CommunityDataCollectionState extends State { position: ToastPosition.center, backgroundColor: colors.darkAccentColor); } + Navigator.of(progressContext!, rootNavigator: true).pop(); } else { showToast("Please fill all fields!"); } diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 5731b74..14e1a05 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -151,8 +151,38 @@ class _FamilyHomeScreenState extends State { print("Indv ${i.dataValid}"); } - //TODO: Change end point and check res for errors if (isValid) { + var progressContext; + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + progressContext = context; + return WillPopScope( + child: Dialog( + child: Padding( + padding: EdgeInsets.all(20), + child: new Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: + EdgeInsets.only(right: 20), + child: + CircularProgressIndicator(), + ), + new Text( + "Uploading data", + style: TextStyle( + color: Colors.black), + ), + ], + ), + ), + ), + onWillPop: () async => false); + }, + ); try { print("FINAL DATA: ${modelData!.toJson()}"); http.Response res = await _makeRequest( @@ -170,6 +200,9 @@ class _FamilyHomeScreenState extends State { position: ToastPosition.center, backgroundColor: colors.darkAccentColor); } + Navigator.of(progressContext!, + rootNavigator: true) + .pop(); } else { showToast("Please fill all fields!"); } @@ -268,4 +301,3 @@ class _FamilyHomeScreenState extends State { modelData = null; } } - diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index 94fe6d4..f74ef50 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,5 +1,5 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = 'https://geo-spatial-amrita.herokuapp.com/'; +String NETWORK_ADDRESS = 'geo-spatial-amrita.herokuapp.com'; //String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; From 3bdce4219b6b566619c56fc98bc11f51ce51bcbd Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 14:27:49 +0530 Subject: [PATCH 206/264] Added validation to check if number is less than or equal to 0 in Income withy type field. Removed completed TODOs --- lib/Screens/CommunityDataCollection.dart | 2 -- lib/Screens/FamilyDetails.dart | 3 ++- lib/Screens/FamilyMemberAdd.dart | 1 - lib/Widgets/IncomeWithTypeTextField.dart | 14 ++++++++++---- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 73cdf5d..aa3b191 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -52,8 +52,6 @@ class CommunityDataCollection extends StatefulWidget { 'Food processing units' ]; - //TODO: Replace with list of village codes - final List _villageCodeName = [ 'THC', 'PGP', diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index cac6c4e..8c78ce0 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -10,6 +10,7 @@ import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:google_fonts/google_fonts.dart'; +//TODO: Add validation to check if entered value is numeric before parsing or submitting class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key, this.modelData}) : super(key: key); final FamilyMembersCommonDataModel? modelData; @@ -148,7 +149,6 @@ class _FamilyDetailsState extends State { return list; } - //TODO: Add village code @override Widget build(BuildContext context) { return WillPopScope( @@ -318,6 +318,7 @@ class _FamilyDetailsState extends State { title: "Environmental sanitation level: "), ], ), + //TODO: Add limit in multi option dropdown based on the no of vehicles selected? Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 5dd5945..7ea1d70 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -315,7 +315,6 @@ class _FamilyMemberAddState extends State { errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), - //TODO: Occupation widget db functions update NestedOptionWidgetFormField( onSaved: (val) { widget.familyMemberIndividualDataModel!.occupationData = diff --git a/lib/Widgets/IncomeWithTypeTextField.dart b/lib/Widgets/IncomeWithTypeTextField.dart index 1fa324e..7eff612 100644 --- a/lib/Widgets/IncomeWithTypeTextField.dart +++ b/lib/Widgets/IncomeWithTypeTextField.dart @@ -3,8 +3,6 @@ import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; - -//TODO: Check for 0 (or lower) class IncomeWithTypeTextField extends StatefulWidget { IncomeWithTypeTextField({ Key? key, @@ -35,7 +33,8 @@ class _IncomeWithTypeTextFieldState extends State { initState() { super.initState(); - chosenOption = widget.initialDropdownValue ?? widget.listOfOptions[widget.listOfOptions.length - 1]; + chosenOption = widget.initialDropdownValue ?? + widget.listOfOptions[widget.listOfOptions.length - 1]; } @override @@ -65,9 +64,16 @@ class _IncomeWithTypeTextFieldState extends State { ), validator: widget.validate ?? (value) { - if (value == "") { + print(value); + if (value == "" || value == null) { return "Enter Income"; } + if (int.tryParse(value) != null) { + if (double.parse(value) <= 0) + return "Income can't be less than or equal to 0"; + } else { + return "Income has to be a numeric value"; + } }, onSaved: (value) { widget.onSaved(value, chosenOption); From 07ebf446a7b4c52faaaf9b0b9f933c81a3a55d82 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 14:40:16 +0530 Subject: [PATCH 207/264] Added validation to check if entered text value is only numbers in TextFields which accept only numbers --- lib/Screens/FamilyDetails.dart | 8 ++++++++ lib/Screens/FamilyMemberAdd.dart | 12 +++++++++--- lib/Widgets/IncomeWithTypeTextField.dart | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 8c78ce0..901c100 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -433,6 +433,14 @@ class _FamilyDetailsState extends State { style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), )), + validator: (value) { + if (value == null || value == "") { + return "Please enter cattle income"; + } + if (int.tryParse(value) == null) { + return "Income can only have numbers"; + } + }, autovalidateMode: AutovalidateMode.always, keyboardType: TextInputType.number, ), diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 7ea1d70..b0212f4 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -263,7 +263,9 @@ class _FamilyMemberAddState extends State { validator: (value) { if (value == "" || value == null) return null; - else if (value.length != 10) { + else if (int.tryParse(value) == null) { + return "Phone number can only have numbers"; + } else if (value.length != 10) { return "Enter a valid Phone Number"; } else return null; @@ -446,7 +448,9 @@ class _FamilyMemberAddState extends State { print("value"); if (value == null || value == "") return "Please enter number of work days"; - else if (int.parse(value) < 1) { + else if (int.tryParse(value) == null) { + return "Field can only have numbers"; + } else if (int.parse(value) < 1) { return "Enter number of work days"; } else if (int.parse(value) > 31) { return "Enter a valid number of work days"; @@ -517,7 +521,9 @@ class _FamilyMemberAddState extends State { validator: (value) { if (value == "" || value == null) return null; - else if (value.length != 12) { + else if (int.tryParse(value) == null) { + return "Aadhaar number can only have numbers"; + } else if (value.length != 12) { return "Enter a valid Aadhaar"; } else return null; diff --git a/lib/Widgets/IncomeWithTypeTextField.dart b/lib/Widgets/IncomeWithTypeTextField.dart index 7eff612..a0b9cb6 100644 --- a/lib/Widgets/IncomeWithTypeTextField.dart +++ b/lib/Widgets/IncomeWithTypeTextField.dart @@ -68,7 +68,7 @@ class _IncomeWithTypeTextFieldState extends State { if (value == "" || value == null) { return "Enter Income"; } - if (int.tryParse(value) != null) { + else if (int.tryParse(value) != null) { if (double.parse(value) <= 0) return "Income can't be less than or equal to 0"; } else { From c2c463aff0e0fdfef5ae9ec94f93670b94e502f1 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 14:55:30 +0530 Subject: [PATCH 208/264] Added string parsing for empty fields to replace with in json parsing method --- lib/Model/FamilyDataModels.dart | 121 ++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 52 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 8f62234..9af23f0 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -6,6 +6,13 @@ import 'package:objectbox/objectbox.dart'; //TODO: Add condition to set empty, value to dependent fields +String parseStringFields(String? val) { + if (val == null || val == "") + return ""; + else + return val; +} + List buildListForOptionWidget(Map mapData) { var listData = []; @@ -14,6 +21,9 @@ List buildListForOptionWidget(Map mapData) { listData.add(key); } }); + if (listData.isEmpty) { + return [""]; + } return listData; } @@ -98,54 +108,56 @@ class FamilyMemberIndividualDataModel { Map toJson() { return { "UIN": "", - "name": userName ?? "", + "name": parseStringFields(userName), "dateOfBirth": "${dateOfBirth!.day}-${dateOfBirth!.month}-${dateOfBirth!.year}", - "gender": gender ?? "", - "phoneNumber": phoneNumber ?? "", - "educationalQualification": educationQualification ?? "", - "aadhaarNumber": aadhaarNumber ?? "", + "gender": parseStringFields(gender), + "phoneNumber": parseStringFields(phoneNumber), + "educationalQualification": parseStringFields(educationQualification), + "aadhaarNumber": parseStringFields(aadhaarNumber), "Vulnerabilities": vulnerabilities != null ? buildListForOptionWidget(vulnerabilities!) : ['None'], - "isADailyWageWorker": dailyWageWorker ?? "", + "isADailyWageWorker": parseStringFields(dailyWageWorker), "occupationData": occupationData == null ? [""] : parseOccupationServerResultJSON(occupationData!), - "employed": employed ?? "", - "income": income ?? "", - "incomeType": incomeType ?? "", - "oldAgePension": pension ?? "", - "businessStatus": businessStatus ?? "", - "maritalStatus": maritalStatus ?? "", - "noOfDaysWorking": noOfDaysWorking ?? "", + "employed": parseStringFields(employed), + "income": parseStringFields(income), + "incomeType": parseStringFields(incomeType), + "oldAgePension": parseStringFields(pension), + "businessStatus": parseStringFields(businessStatus), + "maritalStatus": parseStringFields(maritalStatus), + "noOfDaysWorking": parseStringFields(noOfDaysWorking), "specialSkills": specialSkills ?? "", "workTimings": workTimings ?? "", - "surgeriesUndergone": surgeries ?? "", - "anganwadiServicesAware": anganwadiServicesAware ?? "", - "anganwadiServicesUsed": anganwadiServicesUsing ?? "", + "surgeriesUndergone": parseStringFields(surgeries), + "anganwadiServicesAware": parseStringFields(anganwadiServicesAware), + "anganwadiServicesUsed": parseStringFields(anganwadiServicesUsing), "anganwadiServicesUtilised": anganwadiServicesUsedList ?? "", - "phcServicesUtilised": PHCServicesUsed ?? "", - "privateHealthClinicFacilitiesUsed": privateClinicServicesUsed ?? "", + "phcServicesUtilised": parseStringFields(PHCServicesUsed), + "privateHealthClinicFacilitiesUsed": + parseStringFields(privateClinicServicesUsed), "reasonsForVisitingPrivateHealthClinic": privateServiceReason != null ? buildListForOptionWidget(privateServiceReason!) - : [], + : [""], "communicableDiseases": communicableDiseases != null ? buildListForOptionWidget(communicableDiseases!) - : [], + : [""], "frequentHealthAilments": frequentAilments != null ? buildListForOptionWidget(frequentAilments!) - : [], + : [""], "nonCommunicableDiseases": nonCommunicableDiseases != null ? buildListForOptionWidget(nonCommunicableDiseases!) - : [], + : [""], "tobaccoBasedProductsUsage": useOfTobacco ?? "", "tobaccoProductsUsed": tobaccoProducts != null ? buildListForOptionWidget(tobaccoProducts!) - : [], - "alcoholConsumption": useOfAlcohol ?? "", - "arogyaSethuAppInstallationStatus": aarogyaSetuInstalled ?? "", - "vizhithiruAppInstallationStatus": vizhithiruInstalled ?? "" + : [""], + "alcoholConsumption": parseStringFields(useOfAlcohol), + "arogyaSethuAppInstallationStatus": + parseStringFields(aarogyaSetuInstalled), + "vizhithiruAppInstallationStatus": parseStringFields(vizhithiruInstalled) }; } @@ -305,46 +317,51 @@ class FamilyMembersCommonDataModel { locationBottomRight!.latitude, locationBottomRight!.longitude ], - "headOfFamily": headOfFamily, - "availabilityOfDrinkingWater": drinkingWater ?? "", + "headOfFamily": parseStringFields(headOfFamily), + "availabilityOfDrinkingWater": parseStringFields(drinkingWater), "drinkingWaterSource": sourceOfDrinkingWater != null ? buildListForOptionWidget(sourceOfDrinkingWater!) - : [], - "areToiletsAvailableInHouse": toiletFacility ?? "", - "noToiletsWhy": - noToiletsWhy != null ? buildListForOptionWidget(noToiletsWhy!) : [], - "alternativeForHouseholdToilet": communityToilet ?? "", - "statusOfEnvironmentalSanitation": environmentSanitationLevel ?? "", - "availabilityOfWaterInToilets": runningWaterAvailable ?? "", - "numberOfTwoWheelers": noOfTwoWheelers ?? "", - "numberOfThreeWheelers": noOfThreeWheelers ?? "", - "numberOfFourWheelers": noOfFourWheelers ?? "", + : [""], + "areToiletsAvailableInHouse": parseStringFields(toiletFacility), + "noToiletsWhy": noToiletsWhy != null + ? buildListForOptionWidget(noToiletsWhy!) + : [""], + "alternativeForHouseholdToilet": parseStringFields(communityToilet), + "statusOfEnvironmentalSanitation": + parseStringFields(environmentSanitationLevel), + "availabilityOfWaterInToilets": parseStringFields(runningWaterAvailable), + "numberOfTwoWheelers": parseStringFields(noOfTwoWheelers), + "numberOfThreeWheelers": parseStringFields(noOfThreeWheelers), + "numberOfFourWheelers": parseStringFields(noOfFourWheelers), "brandsOfTwoThreeWheelers": twoThreeWheelManufacturer != null ? buildListForOptionWidget(twoThreeWheelManufacturer!) - : [], + : [""], "brandsOfFourWheelers": fourWheelManufacturer != null ? buildListForOptionWidget(fourWheelManufacturer!) - : [], - "locallyAvailableFoodsConsumed": - localFoodMap != null ? buildListForOptionWidget(localFoodMap!) : [], + : [""], + "locallyAvailableFoodsConsumed": localFoodMap != null + ? buildListForOptionWidget(localFoodMap!) + : [""], "doYouOwnCattle": isCattleOwned, "incomeFromCattle": isCattleOwned == 'yes' ? incomeFromCattle : '', - "doYouOwnFarmLand": isFarmLandOwned ?? "", - "doYouPreserveSeeds": isSeedsPreserved ?? "", + "doYouOwnFarmLand": parseStringFields(isFarmLandOwned), + "doYouPreserveSeeds": parseStringFields(isSeedsPreserved), "cropsCultivated": cropsCultivated != null ? buildListForOptionWidget(cropsCultivated!) - : [], + : [""], "typesOfSeedsPreserved": preservedSeedsMap != null ? buildListForOptionWidget(preservedSeedsMap!) - : [], - "treesOwnedIfAny": - treesOwnedMap != null ? buildListForOptionWidget(treesOwnedMap!) : [], - "isKitchenGardenAvailable": isKitchenGardenOwned ?? "", + : [""], + "treesOwnedIfAny": treesOwnedMap != null + ? buildListForOptionWidget(treesOwnedMap!) + : [""], + "isKitchenGardenAvailable": parseStringFields(isKitchenGardenOwned), "cropsInKitchenGarden": kitchenGardenPlants != null ? buildListForOptionWidget(kitchenGardenPlants!) - : [], - "address": "$addressOne\n$addressTwo\n$city", - "villageCode": villageCode ?? "" + : [""], + "address": + "$addressOne${addressTwo != null && addressTwo != "" ? "\n$addressTwo" : ""}\n$city", + "villageCode": parseStringFields(villageCode) }; } From 5a974bafce9a6077680d1da7f84f8cd4d1c72415 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 15:18:00 +0530 Subject: [PATCH 209/264] Added and implemented method to parse values which depend on a the value of a particular field --- lib/Model/FamilyDataModels.dart | 86 +++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 9af23f0..20303c7 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -13,6 +13,17 @@ String parseStringFields(String? val) { return val; } +parseDependentField( + String? dependentFieldVal, var returnVal, String requiredValue) { + if (dependentFieldVal == null || dependentFieldVal == "") { + return ""; + } else if (dependentFieldVal == requiredValue) { + return returnVal; + } else { + return ""; + } +} + List buildListForOptionWidget(Map mapData) { var listData = []; @@ -123,24 +134,30 @@ class FamilyMemberIndividualDataModel { ? [""] : parseOccupationServerResultJSON(occupationData!), "employed": parseStringFields(employed), - "income": parseStringFields(income), - "incomeType": parseStringFields(incomeType), + "income": parseDependentField(employed, parseStringFields(income), "yes"), + "incomeType": + parseDependentField(employed, parseStringFields(incomeType), "yes"), "oldAgePension": parseStringFields(pension), "businessStatus": parseStringFields(businessStatus), "maritalStatus": parseStringFields(maritalStatus), - "noOfDaysWorking": parseStringFields(noOfDaysWorking), + "noOfDaysWorking": parseDependentField( + employed, parseStringFields(noOfDaysWorking), "yes"), "specialSkills": specialSkills ?? "", - "workTimings": workTimings ?? "", + "workTimings": parseDependentField(employed, workTimings, "yes"), "surgeriesUndergone": parseStringFields(surgeries), "anganwadiServicesAware": parseStringFields(anganwadiServicesAware), "anganwadiServicesUsed": parseStringFields(anganwadiServicesUsing), - "anganwadiServicesUtilised": anganwadiServicesUsedList ?? "", + "anganwadiServicesUtilised": parseDependentField( + anganwadiServicesUsing, anganwadiServicesUsedList, "yes"), "phcServicesUtilised": parseStringFields(PHCServicesUsed), "privateHealthClinicFacilitiesUsed": parseStringFields(privateClinicServicesUsed), - "reasonsForVisitingPrivateHealthClinic": privateServiceReason != null - ? buildListForOptionWidget(privateServiceReason!) - : [""], + "reasonsForVisitingPrivateHealthClinic": parseDependentField( + privateClinicServicesUsed, + privateServiceReason != null + ? buildListForOptionWidget(privateServiceReason!) + : [""], + "yes"), "communicableDiseases": communicableDiseases != null ? buildListForOptionWidget(communicableDiseases!) : [""], @@ -150,10 +167,13 @@ class FamilyMemberIndividualDataModel { "nonCommunicableDiseases": nonCommunicableDiseases != null ? buildListForOptionWidget(nonCommunicableDiseases!) : [""], - "tobaccoBasedProductsUsage": useOfTobacco ?? "", - "tobaccoProductsUsed": tobaccoProducts != null - ? buildListForOptionWidget(tobaccoProducts!) - : [""], + "tobaccoBasedProductsUsage": parseStringFields(useOfTobacco), + "tobaccoProductsUsed": parseDependentField( + useOfTobacco, + tobaccoProducts != null + ? buildListForOptionWidget(tobaccoProducts!) + : [""], + "yes"), "alcoholConsumption": parseStringFields(useOfAlcohol), "arogyaSethuAppInstallationStatus": parseStringFields(aarogyaSetuInstalled), @@ -323,10 +343,14 @@ class FamilyMembersCommonDataModel { ? buildListForOptionWidget(sourceOfDrinkingWater!) : [""], "areToiletsAvailableInHouse": parseStringFields(toiletFacility), - "noToiletsWhy": noToiletsWhy != null - ? buildListForOptionWidget(noToiletsWhy!) - : [""], - "alternativeForHouseholdToilet": parseStringFields(communityToilet), + "noToiletsWhy": parseDependentField( + toiletFacility, + noToiletsWhy != null + ? buildListForOptionWidget(noToiletsWhy!) + : [""], + "no"), + "alternativeForHouseholdToilet": parseDependentField( + toiletFacility, parseStringFields(communityToilet), "no"), "statusOfEnvironmentalSanitation": parseStringFields(environmentSanitationLevel), "availabilityOfWaterInToilets": parseStringFields(runningWaterAvailable), @@ -343,22 +367,32 @@ class FamilyMembersCommonDataModel { ? buildListForOptionWidget(localFoodMap!) : [""], "doYouOwnCattle": isCattleOwned, - "incomeFromCattle": isCattleOwned == 'yes' ? incomeFromCattle : '', + "incomeFromCattle": + parseDependentField(isCattleOwned, incomeFromCattle, "yes"), "doYouOwnFarmLand": parseStringFields(isFarmLandOwned), + "cropsCultivated": parseDependentField( + isFarmLandOwned, + cropsCultivated != null + ? buildListForOptionWidget(cropsCultivated!) + : [""], + "yes"), "doYouPreserveSeeds": parseStringFields(isSeedsPreserved), - "cropsCultivated": cropsCultivated != null - ? buildListForOptionWidget(cropsCultivated!) - : [""], - "typesOfSeedsPreserved": preservedSeedsMap != null - ? buildListForOptionWidget(preservedSeedsMap!) - : [""], + "typesOfSeedsPreserved": parseDependentField( + isSeedsPreserved, + preservedSeedsMap != null + ? buildListForOptionWidget(preservedSeedsMap!) + : [""], + "yes`"), "treesOwnedIfAny": treesOwnedMap != null ? buildListForOptionWidget(treesOwnedMap!) : [""], "isKitchenGardenAvailable": parseStringFields(isKitchenGardenOwned), - "cropsInKitchenGarden": kitchenGardenPlants != null - ? buildListForOptionWidget(kitchenGardenPlants!) - : [""], + "cropsInKitchenGarden": parseDependentField( + isKitchenGardenOwned, + kitchenGardenPlants != null + ? buildListForOptionWidget(kitchenGardenPlants!) + : [""], + "yes"), "address": "$addressOne${addressTwo != null && addressTwo != "" ? "\n$addressTwo" : ""}\n$city", "villageCode": parseStringFields(villageCode) From 770073f7ed21ab7db17d84e425e7491d46b2315d Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 15:20:42 +0530 Subject: [PATCH 210/264] Removed completed TODOs --- lib/Model/FamilyDataModels.dart | 2 -- lib/Screens/FamilyDetails.dart | 1 - 2 files changed, 3 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 20303c7..cc106ae 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -4,8 +4,6 @@ import 'package:geolocator/geolocator.dart'; import 'package:intl/intl.dart'; import 'package:objectbox/objectbox.dart'; -//TODO: Add condition to set empty, value to dependent fields - String parseStringFields(String? val) { if (val == null || val == "") return ""; diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 901c100..cc3e12b 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -10,7 +10,6 @@ import 'package:geo_spatial/Widgets/FormPageView.dart'; import 'package:geo_spatial/Widgets/OptionsFormWidget.dart'; import 'package:google_fonts/google_fonts.dart'; -//TODO: Add validation to check if entered value is numeric before parsing or submitting class FamilyDetails extends StatefulWidget { const FamilyDetails({Key? key, this.modelData}) : super(key: key); final FamilyMembersCommonDataModel? modelData; From d3b126df6cba8baca253f2e151a22621d9722130 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 19:21:43 +0530 Subject: [PATCH 211/264] Added remember me option and server timeouts and --- lib/Screens/ChangePassword.dart | 2 +- lib/Screens/FamilyHomeScreen.dart | 2 +- lib/Screens/Home.dart | 38 ++++++++++++++++++- lib/Screens/Login.dart | 39 ++++++++++++++++--- lib/Screens/ProfilePage.dart | 2 +- lib/Utils/Constants.dart | 1 + lib/Widgets/LoadValidPageWidget.dart | 12 +++++- lib/main.dart | 13 ++++++- pubspec.lock | 56 ++++++++++++++++++++++++++++ pubspec.yaml | 1 + 10 files changed, 153 insertions(+), 13 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 162c9d8..2acbc5f 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -60,7 +60,7 @@ class _ChangePasswordState extends State { }, body: body) .timeout( - const Duration(seconds: 10), + const Duration(seconds: 30), onTimeout: () { showToast("Server Timed out!"); // Time has run out, do what you wanted to do. diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 14e1a05..6879c6d 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -77,7 +77,7 @@ class _FamilyHomeScreenState extends State { }, body: body) .timeout( - const Duration(seconds: 10), + const Duration(seconds: 30), onTimeout: () { showToast("Server Timed out!"); // Time has run out, do what you wanted to do. diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index bef51de..20d77ff 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -1,8 +1,11 @@ import 'dart:convert'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:geo_spatial/Screens/Login.dart'; +import 'package:geo_spatial/Utils/CheckNetworkConnectivity.dart'; import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Screens/CommunityDataCollection.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; @@ -10,6 +13,8 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Widgets/DataCard.dart'; import 'package:geo_spatial/Widgets/NavigationDrawer.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:oktoast/oktoast.dart'; +import 'package:http/http.dart' as http; import 'EditExistingRecordsPage.dart'; import 'SavedData.dart'; @@ -32,6 +37,37 @@ Future get _getUserName async { } class _HomeWidgetState extends State { + final NetworkConnectivity _connectivity = NetworkConnectivity.instance; + + @override + void initState() { + super.initState(); + _connectivity.initialise(); + _connectivity.myStream.listen((source) async { + if (source == ConnectivityResult.none) { + showToast( + "Offline mode, data cannot be uploaded until device is connected to the internet"); + } else { + var jwt = await storage.read(key: JWT_STORAGE_KEY); + if (jwt != null) { + var res = await http + .get(Uri.https(NETWORK_ADDRESS, '/api/validateToken'), headers: { + "Content-Type": "application/json", + 'user-auth-token': jwt + }).timeout(Duration(seconds: 30)); + if (res.statusCode == 401) { + await storage.delete(key: JWT_STORAGE_KEY); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false); + showToast("Invalid token or token not found, logging out"); + } + } + } + print("CONNECTED: ${source}"); + }); + } + @override Widget build(BuildContext context) { return WillPopScope( @@ -92,7 +128,7 @@ class _HomeWidgetState extends State { style: GoogleFonts.montserrat( fontSize: 18, color: colors.darkPrimaryTextColor), ); - } else{ + } else { return Text( 'Geo Spatial Api!', style: GoogleFonts.montserrat( diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 11c83ca..09276f9 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -23,18 +23,28 @@ class _MyAppState extends State { var _nameError = null; var _passwordError = null; - bool _isSelected = false; + bool _isSelected = true; bool _isLoading = false; @override void initState() { super.initState(); + data() async { + var data = await storage.read(key: REMEMBER_ME_KEY); + if (data != null) { + _isSelected = data == "true"; + } + setState(() {}); + } + + data(); } void _radio() { setState(() { _isSelected = !_isSelected; }); + storage.write(key: REMEMBER_ME_KEY, value: _isSelected.toString()); } String _validateUserName(String username) { @@ -56,8 +66,17 @@ class _MyAppState extends State { String url = NETWORK_ADDRESS; var body = json.encode({"username": username, "password": password}); - var res = await http.post(Uri.https(url, '/api/login'), - headers: {"Content-Type": "application/json"}, body: body); + var res = await http + .post(Uri.https(url, '/api/login'), + headers: {"Content-Type": "application/json"}, body: body) + .timeout( + const Duration(seconds: 30), + onTimeout: () { + // Time has run out, do what you wanted to do. + return http.Response( + 'Server Timed out!', 408); // Request Timeout response status code + }, + ); print("RES: ${res.body}"); return res; @@ -66,8 +85,18 @@ class _MyAppState extends State { Future _getUserDetails(String JWT) async { String url = NETWORK_ADDRESS; - var res = await http.get(Uri.https(url, '/api/getUserData'), - headers: {"Content-Type": "application/json", 'user-auth-token': JWT}); + var res = await http.get(Uri.https(url, '/api/getUserData'), headers: { + "Content-Type": "application/json", + 'user-auth-token': JWT + }).timeout( + const Duration(seconds: 30), + onTimeout: () { + showToast("Server Timed out!"); + // Time has run out, do what you wanted to do. + return http.Response( + 'Error', 408); // Request Timeout response status code + }, + ); print("RES: ${res.body}"); return res; diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index fea44d0..d7ad478 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -35,7 +35,7 @@ Future _getUserDetails() async { "Content-Type": "application/json", 'user-auth-token': jwt }).timeout( - const Duration(seconds: 10), + const Duration(seconds: 30), onTimeout: () { showToast("Server Timed out!"); // Time has run out, do what you wanted to do. diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index f74ef50..bf6adc1 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -4,6 +4,7 @@ String NETWORK_ADDRESS = 'geo-spatial-amrita.herokuapp.com'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; String USER_DATA_KEY = "userData"; +String REMEMBER_ME_KEY = "RememberMe"; final String MALE = "Male"; final String FEMALE = "Female"; final String OTHER = "Other"; diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index 8108a40..16600c2 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -34,7 +34,15 @@ class LoadValidPageWidget extends StatelessWidget { var res = await http.get(Uri.https(url, '/api/validateToken'), headers: { "Content-Type": "application/json", 'user-auth-token': JWT - }).timeout(Duration(seconds: 10)); + }).timeout( + const Duration(seconds: 30), + onTimeout: () { + showToast("Server Timed out!"); + // Time has run out, do what you wanted to do. + return http.Response( + 'Error', 408); // Request Timeout response status code + }, + ); print("RES: ${res.body}"); return res; @@ -47,7 +55,7 @@ class LoadValidPageWidget extends StatelessWidget { if (jwt == null) return ""; try { var res = await _validateToken(jwt); - if (res.statusCode != 200) { + if (res.statusCode == 401) { await storage.delete(key: JWT_STORAGE_KEY); showToast("Token could not be validated, logging out"); return ""; diff --git a/lib/main.dart b/lib/main.dart index 9133e98..d00b9c6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:geo_spatial/Screens/Login.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:geo_spatial/Screens/Home.dart'; import 'package:flutter/services.dart'; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Utils/DarkTheme.dart'; import 'package:geo_spatial/Widgets/LoadValidPageWidget.dart'; import 'package:oktoast/oktoast.dart'; @@ -10,16 +11,24 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; final storage = FlutterSecureStorage(); -void main() { +Future main() async { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations( [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); + var data = await storage.read(key: REMEMBER_ME_KEY); + var rememberMe = true; + if (null != data) { + rememberMe = data == "true"; + if (!rememberMe) { + await storage.delete(key: JWT_STORAGE_KEY); + } + } runApp(OKToast( position: ToastPosition.center, backgroundColor: colors.darkAccentColor, child: MaterialApp( - home: LoadValidPageWidget(Login(), Home()), + home: rememberMe ? LoadValidPageWidget(Login(), Home()) : Login(), debugShowCheckedModeBanner: false, theme: darkTheme.DarkTheme), )); diff --git a/pubspec.lock b/pubspec.lock index 43b34a0..066f527 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -148,6 +148,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + connectivity_plus_linux: + dependency: transitive + description: + name: connectivity_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + connectivity_plus_macos: + dependency: transitive + description: + name: connectivity_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + connectivity_plus_web: + dependency: transitive + description: + name: connectivity_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + connectivity_plus_windows: + dependency: transitive + description: + name: connectivity_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" convert: dependency: transitive description: @@ -176,6 +218,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.2.1" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.8" fake_async: dependency: transitive description: @@ -429,6 +478,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + nm: + dependency: transitive + description: + name: nm + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.2" objectbox: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 5a7ca42..30ccbd7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ environment: sdk: ">=2.12.0 <3.0.0" dependencies: + connectivity_plus: ^2.0.2 visibility_detector: ^0.2.2 oktoast: ^3.1.5 preload_page_view: ^0.1.6 From aea0760527223c7f329c2b959cbc9eecfa454147 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 19:22:16 +0530 Subject: [PATCH 212/264] Added class to check for network connectivity and validate JWT token accordingly --- lib/Utils/CheckNetworkConnectivity.dart | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 lib/Utils/CheckNetworkConnectivity.dart diff --git a/lib/Utils/CheckNetworkConnectivity.dart b/lib/Utils/CheckNetworkConnectivity.dart new file mode 100644 index 0000000..a83bada --- /dev/null +++ b/lib/Utils/CheckNetworkConnectivity.dart @@ -0,0 +1,23 @@ +import 'dart:async'; + +import 'package:connectivity_plus/connectivity_plus.dart'; + +class NetworkConnectivity { + NetworkConnectivity._(); + + static final _instance = NetworkConnectivity._(); + + static NetworkConnectivity get instance => _instance; + final _connectivity = Connectivity(); + final _controller = StreamController.broadcast(); + + Stream get myStream => _controller.stream; + + void initialise() async { + _connectivity.onConnectivityChanged.listen((result) { + _controller.sink.add(result); + }); + } + + void disposeStream() => _controller.close(); +} From b1e4e63135132068725e8f767f3ba9aa1a147747 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 19:44:07 +0530 Subject: [PATCH 213/264] Added volunteer user id field in json --- lib/Model/CommunityDataModel.dart | 2 +- lib/Model/FamilyDataModels.dart | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Model/CommunityDataModel.dart b/lib/Model/CommunityDataModel.dart index 969e638..0a3367c 100644 --- a/lib/Model/CommunityDataModel.dart +++ b/lib/Model/CommunityDataModel.dart @@ -142,7 +142,7 @@ class CommunityDataModel { this.villageCode}); Map toJson() => { - 'userId': recordCollectingUserId, + 'volunteerUserId': recordCollectingUserId, 'resourceType': resourceType, 'villageCode': villageCode, 'locationTopLeft': [ diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index cc106ae..4172ff5 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -317,6 +317,7 @@ class FamilyMembersCommonDataModel { Map toJson() { return { + 'volunteerUserId':recordCollectingUserId, 'familyMemberData': individualDataListTransient.map((item) => item.toJson()).toList(), 'locationTopLeft': [ From 64424bb4d652aea9fdb15062bb58adc207135fa6 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 22 Jan 2022 21:13:30 +0530 Subject: [PATCH 214/264] Added request code for Edit Existing Record page, fixed Json error in List of seeds preserved field, send recordCollectingUserId field in CommunityDataCollection --- lib/Model/FamilyDataModels.dart | 40 +-- lib/Screens/CommunityDataCollection.dart | 2 + lib/Screens/EditExistingRecordsPage.dart | 371 +++++++++++++++-------- lib/Screens/FamilyHomeScreen.dart | 2 + 4 files changed, 263 insertions(+), 152 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 4172ff5..b871f42 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -13,7 +13,7 @@ String parseStringFields(String? val) { parseDependentField( String? dependentFieldVal, var returnVal, String requiredValue) { - if (dependentFieldVal == null || dependentFieldVal == "") { + if (dependentFieldVal == null || dependentFieldVal == "") { return ""; } else if (dependentFieldVal == requiredValue) { return returnVal; @@ -22,7 +22,7 @@ parseDependentField( } } -List buildListForOptionWidget(Map mapData) { +buildListForOptionWidget(Map mapData) { var listData = []; mapData.forEach((key, value) { @@ -31,7 +31,7 @@ List buildListForOptionWidget(Map mapData) { } }); if (listData.isEmpty) { - return [""]; + return ""; } return listData; } @@ -129,7 +129,7 @@ class FamilyMemberIndividualDataModel { : ['None'], "isADailyWageWorker": parseStringFields(dailyWageWorker), "occupationData": occupationData == null - ? [""] + ? "" : parseOccupationServerResultJSON(occupationData!), "employed": parseStringFields(employed), "income": parseDependentField(employed, parseStringFields(income), "yes"), @@ -154,23 +154,23 @@ class FamilyMemberIndividualDataModel { privateClinicServicesUsed, privateServiceReason != null ? buildListForOptionWidget(privateServiceReason!) - : [""], + : "", "yes"), "communicableDiseases": communicableDiseases != null ? buildListForOptionWidget(communicableDiseases!) - : [""], + : "", "frequentHealthAilments": frequentAilments != null ? buildListForOptionWidget(frequentAilments!) - : [""], + : "", "nonCommunicableDiseases": nonCommunicableDiseases != null ? buildListForOptionWidget(nonCommunicableDiseases!) - : [""], + : "", "tobaccoBasedProductsUsage": parseStringFields(useOfTobacco), "tobaccoProductsUsed": parseDependentField( useOfTobacco, tobaccoProducts != null ? buildListForOptionWidget(tobaccoProducts!) - : [""], + : "", "yes"), "alcoholConsumption": parseStringFields(useOfAlcohol), "arogyaSethuAppInstallationStatus": @@ -317,7 +317,7 @@ class FamilyMembersCommonDataModel { Map toJson() { return { - 'volunteerUserId':recordCollectingUserId, + 'volunteerUserId': recordCollectingUserId, 'familyMemberData': individualDataListTransient.map((item) => item.toJson()).toList(), 'locationTopLeft': [ @@ -340,13 +340,13 @@ class FamilyMembersCommonDataModel { "availabilityOfDrinkingWater": parseStringFields(drinkingWater), "drinkingWaterSource": sourceOfDrinkingWater != null ? buildListForOptionWidget(sourceOfDrinkingWater!) - : [""], + : "", "areToiletsAvailableInHouse": parseStringFields(toiletFacility), "noToiletsWhy": parseDependentField( toiletFacility, noToiletsWhy != null ? buildListForOptionWidget(noToiletsWhy!) - : [""], + : "", "no"), "alternativeForHouseholdToilet": parseDependentField( toiletFacility, parseStringFields(communityToilet), "no"), @@ -358,13 +358,13 @@ class FamilyMembersCommonDataModel { "numberOfFourWheelers": parseStringFields(noOfFourWheelers), "brandsOfTwoThreeWheelers": twoThreeWheelManufacturer != null ? buildListForOptionWidget(twoThreeWheelManufacturer!) - : [""], + : "", "brandsOfFourWheelers": fourWheelManufacturer != null ? buildListForOptionWidget(fourWheelManufacturer!) - : [""], + : "", "locallyAvailableFoodsConsumed": localFoodMap != null ? buildListForOptionWidget(localFoodMap!) - : [""], + : "", "doYouOwnCattle": isCattleOwned, "incomeFromCattle": parseDependentField(isCattleOwned, incomeFromCattle, "yes"), @@ -373,24 +373,24 @@ class FamilyMembersCommonDataModel { isFarmLandOwned, cropsCultivated != null ? buildListForOptionWidget(cropsCultivated!) - : [""], + : "", "yes"), "doYouPreserveSeeds": parseStringFields(isSeedsPreserved), "typesOfSeedsPreserved": parseDependentField( isSeedsPreserved, preservedSeedsMap != null ? buildListForOptionWidget(preservedSeedsMap!) - : [""], - "yes`"), + : "", + "yes"), "treesOwnedIfAny": treesOwnedMap != null ? buildListForOptionWidget(treesOwnedMap!) - : [""], + : "", "isKitchenGardenAvailable": parseStringFields(isKitchenGardenOwned), "cropsInKitchenGarden": parseDependentField( isKitchenGardenOwned, kitchenGardenPlants != null ? buildListForOptionWidget(kitchenGardenPlants!) - : [""], + : "", "yes"), "address": "$addressOne${addressTwo != null && addressTwo != "" ? "\n$addressTwo" : ""}\n$city", diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index aa3b191..85f50eb 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -114,6 +114,8 @@ class _CommunityDataCollectionState extends State { print(isValid.toString()); if (isValid) { + var userId = await _getUserID(); + modelData.recordCollectingUserId = userId; var progressContext; showDialog( context: context, diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index d43225d..3894669 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -1,11 +1,17 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Model/FamilyDataModels.dart'; import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; +import 'package:oktoast/oktoast.dart'; +//TODO: Parse Data into Family Data Object class EditRecordsScreen extends StatefulWidget { const EditRecordsScreen({Key? key}) : super(key: key); @@ -17,7 +23,7 @@ class _EditRecordsScreenState extends State { bool isSearchOpen = false; TextEditingController _textEditingController = new TextEditingController(); - List _dataList = ["ONE", "TWO", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE", "THREE"]; + List _dataList = []; late List _searchList; initState() { @@ -25,143 +31,244 @@ class _EditRecordsScreenState extends State { _searchList = _dataList; } + Future get jwtToken async { + var jwt = await storage.read(key: JWT_STORAGE_KEY); + print(JWT_STORAGE_KEY + jwt.toString()); + + if (jwt == null) return ""; + return jwt; + } + + Future _getCommonRecords() async { + String url = NETWORK_ADDRESS; + String jwt = await jwtToken; + + try { + var res = await http.get(Uri.http(url, '/api/getCommonRecords'), + headers: { + "Content-Type": "application/json", + 'user-auth-token': jwt + }).timeout( + const Duration(seconds: 30), + onTimeout: () { + showToast("Server Timed out!"); + return http.Response('Error', 408); + }, + ); + print("RES: ${res.body}"); + return res; + } catch (e) { + return http.Response(e.toString(), 408); + } + } + @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: colors.darkScaffoldColor, - appBar: AppBarBackButton( - 'Edit Existing Data', - actions: [ - IconButton( - splashRadius: 20, - icon: Icon( - Icons.search, - color: colors.darkAccentColor, - ), - onPressed: () { - setState(() { - isSearchOpen = !isSearchOpen; - _searchList = _dataList; - }); - }) - ], - ), - body: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Visibility( - visible: isSearchOpen, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: TextField( - onChanged: (text) { - print("INVOKED"); - setState(() { - _searchList = _dataList - .where( - (i) => i.toLowerCase().contains(text.toLowerCase())) - .toList(); - }); - }, - controller: _textEditingController, - style: TextStyle(color: Colors.white), - decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: colors.darkSecondaryTextColor, width: 1.0)), - contentPadding: EdgeInsets.symmetric(horizontal: 10.0), - fillColor: colors.darkScaffoldColor, - prefixIcon: Icon( + return FutureBuilder( + future: _getCommonRecords(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + if (snapshot.requireData.statusCode != 200) { + return Scaffold( + appBar: AppBarBackButton("Edit Records"), + body: Center( + child: Text("Could not fetch data from server at this time"), + ), + ); + } + + var dataJson = json.decode(snapshot.requireData.body); + for (var i in dataJson) { + print(i["FamilyUIN"]); + _dataList.add(i["FamilyUIN"]); + } + + return Scaffold( + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton( + 'Edit Existing Data', + actions: [ + IconButton( + splashRadius: 20, + icon: Icon( Icons.search, color: colors.darkAccentColor, ), - // suffixIcon: Material( - // borderRadius: BorderRadius.only( - // topRight: Radius.circular(4), - // bottomRight: Radius.circular(4)), - // child: IconButton( - // splashRadius: 16, - // icon: Icon( - // Icons.clear, - // color: colors.darkSecondAccentColor, - // ), - // onPressed: () { - // _textEditingController.text = ""; - // }, - // ), - // ), - label: Text( - "Search", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), + onPressed: () { + setState(() { + isSearchOpen = !isSearchOpen; + _searchList = _dataList; + }); + }) + ], + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Visibility( + visible: isSearchOpen, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: TextField( + onChanged: (text) { + print("INVOKED"); + setState(() { + _searchList = _dataList + .where((i) => i + .toLowerCase() + .contains(text.toLowerCase())) + .toList(); + }); + }, + controller: _textEditingController, + style: TextStyle(color: Colors.white), + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, + width: 1.0)), + contentPadding: + EdgeInsets.symmetric(horizontal: 10.0), + fillColor: colors.darkScaffoldColor, + prefixIcon: Icon( + Icons.search, + color: colors.darkAccentColor, + ), + // suffixIcon: Material( + // borderRadius: BorderRadius.only( + // topRight: Radius.circular(4), + // bottomRight: Radius.circular(4)), + // child: IconButton( + // splashRadius: 16, + // icon: Icon( + // Icons.clear, + // color: colors.darkSecondAccentColor, + // ), + // onPressed: () { + // _textEditingController.text = ""; + // }, + // ), + // ), + label: Text( + "Search", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Search for records...", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor)), ), - hintText: "Search for records...", - hintStyle: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor)), - ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.all(20), + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC252426), + blurRadius: 8.0, + ), + ], + ), + child: Padding( + padding: EdgeInsets.all(12), + child: _searchList.isNotEmpty + ? ListView.builder( + itemCount: _searchList.length, + itemBuilder: + (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 3.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(5))), + elevation: 10, + color: colors.darkScaffoldColor, + child: ListTile( + contentPadding: EdgeInsets.symmetric( + vertical: 10, horizontal: 20.0), + minLeadingWidth: 30, + onTap: () { + var modelData = + FamilyMembersCommonDataModel(); + modelData + .individualDataListTransient + .add( + FamilyMemberIndividualDataModel()); + modelData + .individualDataListTransient + .add( + FamilyMemberIndividualDataModel()); + modelData + .individualDataListTransient + .add( + FamilyMemberIndividualDataModel()); + modelData + .individualDataListTransient + .add( + FamilyMemberIndividualDataModel()); + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + FamilyHomeScreen( + modelData: modelData, + ))); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + title: Text( + _searchList[index], + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + subtitle: Text( + 'Click to edit', + style: GoogleFonts.poppins( + color: colors + .darkSecondaryTextColor), + ), + leading: SvgPicture.asset( + "assets/svg/user-id-icon.svg", + fit: BoxFit.fill, + ), + isThreeLine: true, + trailing: Icon( + Icons.chevron_right, + color: colors.darkAccentColor, + ), + ), + ), + ); + }) + : Container( + width: double.infinity, + child: Center( + child: Text( + "No Results Found", + textAlign: TextAlign.center, + ), + )), + ), + ), + ), + ), + ], ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.all(20), - child: Container( - decoration: BoxDecoration( - color: colors.darkSecondBackgroundColor, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Color(0xBC252426), - blurRadius: 8.0, - ), - ], - ), - child: Padding( - padding: EdgeInsets.all(12), - child: - _searchList.isNotEmpty ? - ListView.builder( - itemCount: _searchList.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0,vertical: 3.0), - child: Card( - shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(5))), - elevation: 10, - color: colors.darkScaffoldColor, - child: ListTile( - contentPadding: EdgeInsets.symmetric(vertical: 10,horizontal: 20.0), - minLeadingWidth: 30, - onTap: () { - var modelData = FamilyMembersCommonDataModel(); - modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); - modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); - modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); - modelData.individualDataListTransient.add(FamilyMemberIndividualDataModel()); - Navigator.of(context) - .push(MaterialPageRoute(builder: (context) => FamilyHomeScreen(modelData: modelData,))); - }, - //Pass a function which is called onSaved in the next page and add data to the class object - title: Text( - _searchList[index], - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 20), - ), - subtitle: Text('Click to edit',style: GoogleFonts.poppins(color: colors.darkSecondaryTextColor),), - leading: SvgPicture.asset("assets/svg/user-id-icon.svg",fit: BoxFit.fill,), - isThreeLine: true, - trailing: Icon(Icons.chevron_right,color: colors.darkAccentColor,), - ), - ), - ); - }) : Container(width: double.infinity, child: Text("No Results Found", textAlign: TextAlign.center,)), - ), - ), - ), - ), - ], - ), - ); + ); + } else { + return Scaffold( + appBar: AppBarBackButton("Edit Records"), + body: Center( + child: CircularProgressIndicator(), + )); + } + }); } } diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 6879c6d..f09bf1c 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -152,6 +152,8 @@ class _FamilyHomeScreenState extends State { } if (isValid) { + var userId = await _getUserID(); + modelData!.recordCollectingUserId = userId; var progressContext; showDialog( context: context, From 068ea928a43d70007a6dd9c9f7b10e4c478f1045 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 22 Jan 2022 22:21:12 +0530 Subject: [PATCH 215/264] Deleted VillageSelection.dart --- lib/Screens/VillageSelection.dart | 214 ------------------------------ 1 file changed, 214 deletions(-) delete mode 100644 lib/Screens/VillageSelection.dart diff --git a/lib/Screens/VillageSelection.dart b/lib/Screens/VillageSelection.dart deleted file mode 100644 index 898bb2c..0000000 --- a/lib/Screens/VillageSelection.dart +++ /dev/null @@ -1,214 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'package:flutter/material.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:geo_spatial/Utils/Constants.dart'; -import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; -import 'package:geo_spatial/Utils/Colors.dart' as colors; -import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; -import 'package:geo_spatial/Widgets/CheckBoxAlertDialog.dart'; -import 'package:geo_spatial/Widgets/PageViewContentBox.dart'; -import 'package:google_fonts/google_fonts.dart'; -import 'package:http/http.dart' as http; - -final storage = FlutterSecureStorage(); -String UID = ""; -Map villages = {}; -List? villageData; - -class VillageSelectionScreen extends StatefulWidget { - VillageSelectionScreen({Key? key}) : super(key: key); - - @override - _VillageSelectionScreenState createState() => _VillageSelectionScreenState(); -} - -class _VillageSelectionScreenState extends State { - Future _makeRequest(String node) async { - String url = NETWORK_ADDRESS; - - var jwt = await storage.read(key: JWT_STORAGE_KEY); - var res = await http.get(Uri.https(url, '/api/$node'), - headers: {"user-auth-token": jwt.toString()}); - return res; - } - - initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: colors.darkScaffoldColor, - appBar: AppBarBackButton('Generate UID'), - body: SafeArea( - child: PageViewContentBox( - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FutureBuilder( - future: _makeRequest("villageInfo/getVillageInfo"), - builder: (BuildContext context, - AsyncSnapshot snapshot) { - print(snapshot.data?.body); - if (snapshot.data == null) - return Text( - "Can't load data, your network might be turned off or the server might be down, click on Generate UIN later to continue without UIN", - textAlign: TextAlign.center, - ); - else if (snapshot.data!.statusCode == 200) { - villageData = json.decode(snapshot.data!.body); - villageData?.forEach((element) { - villages[element["villageCode"]] = false; - }); - - return CheckBoxAlertDialog( - autoSave: true, - singleOption: true, - title: "Choose Village Code", - context: context, - hint: 'Choose here', - dataMap: villages, - onSaved: (data) { - data!.forEach((key, value) { - if (value) { - UID = key; - } - }); - print(UID); - }, - ); - } else { - return Text( - "Can't load data, your network might be turned off or the server might be down, click on Generate UIN later to continue without UIN", - textAlign: TextAlign.center); - } - }), - ContentChildWidget() - ], - ), - ), - ), - ); - } -} - -class ContentChildWidget extends StatefulWidget { - const ContentChildWidget({Key? key}) : super(key: key); - - @override - _ContentChildWidgetState createState() => _ContentChildWidgetState(); -} - -class _ContentChildWidgetState extends State { - late bool isGenerated; - String lastModifiedUIN = ""; - - initState() { - super.initState(); - isGenerated = false; - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Padding( - padding: const EdgeInsets.only( - top: 25.0, bottom: 75, right: 15.0, left: 25.0), - child: SizedBox( - width: double.infinity, - height: 50, - child: ElevatedButton( - child: Text("Generate UID", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: - MaterialStateProperty.all(Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkScaffoldColor), - shape: MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: - BorderSide(color: colors.darkScaffoldColor)))), - onPressed: () { - villageData?.forEach((element) { - if (UID != "") { - if (element["villageCode"] == UID) { - setState(() { - lastModifiedUIN = element["LastModifiedUIN"]; - //TODO:Modify CODE - - }); - } - } else { - //TODO:Ask user to pick a code - } - }); - setState(() { - isGenerated = true; - }); - }), - ), - ), - if (isGenerated) - Card( - shape: - RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), - elevation: 10, - color: colors.darkScaffoldColor, - child: Padding( - padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 20.0), - child: Text( - "UID: ${lastModifiedUIN}", - style: GoogleFonts.poppins( - fontWeight: FontWeight.w600, - fontSize: 20, - color: colors.darkPrimaryTextColor), - ), - ), - ElevatedButton.icon( - label: Text("Continue", - style: GoogleFonts.poppins(fontSize: 15)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - colors.lightPrimaryTextColor), - backgroundColor: MaterialStateProperty.all( - colors.darkPrimaryTextColor), - shape: - MaterialStateProperty.all( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors.darkScaffoldColor)))), - onPressed: () { - Navigator.of(context).pushReplacement(MaterialPageRoute( - builder: (context) => FamilyHomeScreen())); - }, - icon: Icon(Icons.arrow_right_alt_sharp), - ), - ], - ), - ), - ), - SizedBox( - height: MediaQuery.of(context).size.height * 0.2, - ), - if (!isGenerated) - TextButton( - onPressed: () { - Navigator.of(context).pushReplacement(MaterialPageRoute( - builder: (context) => - FamilyHomeScreen())); - }, - child: Text("Generate UIN later")) - ], - ); - } -} From 8bbdb1edda43c8b0b27b0e259026d774aa5bcdc1 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 22 Jan 2022 23:09:33 +0530 Subject: [PATCH 216/264] Added optional fields to FamilyMemberAdd.dart --- lib/Screens/FamilyMemberAdd.dart | 13 ++--- lib/Widgets/IncomeWithTypeTextField.dart | 73 ++++++++++++------------ 2 files changed, 42 insertions(+), 44 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index b0212f4..a25ac4d 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -66,7 +66,6 @@ class _FamilyMemberAddState extends State { 'Lactating Mother': false, 'Elderly (>60 years)': false, 'Children below 2 years': false, - 'None': false }; var occupations = { @@ -314,6 +313,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.vulnerabilities = map; }, + validator: (val){}, errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -463,7 +463,6 @@ class _FamilyMemberAddState extends State { }, ), ), - //TODO: Make sure text field is enabled only after option is chosen IncomeWithTypeTextField( initialDropdownValue: widget .familyMemberIndividualDataModel!.incomeType, @@ -605,12 +604,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.specialSkills = data; }, - validator: (value) { - if (value == null || value.isEmpty) { - return "Enter a value / NA"; - } else - return null; - }, + validator: (value) {}, ), ), CheckBoxAddExtraAlertDialog( @@ -625,6 +619,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.frequentAilments = map; }, + validator: (val){}, errorField: "Please choose ailments/None", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -643,6 +638,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel! .communicableDiseases = map; }, + validator: (val){}, errorField: "Please choose diseases/None", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -661,6 +657,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel! .nonCommunicableDiseases = map; }, + validator: (val){}, errorField: "Please choose diseases/None", autoValidateMode: AutovalidateMode.onUserInteraction, ), diff --git a/lib/Widgets/IncomeWithTypeTextField.dart b/lib/Widgets/IncomeWithTypeTextField.dart index a0b9cb6..33f0743 100644 --- a/lib/Widgets/IncomeWithTypeTextField.dart +++ b/lib/Widgets/IncomeWithTypeTextField.dart @@ -44,42 +44,6 @@ class _IncomeWithTypeTextFieldState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - flex: 3, - child: TextFormField( - initialValue: widget.initialValue, - keyboardType: TextInputType.number, - autovalidateMode: AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - widget.text, - style: - GoogleFonts.poppins(color: colors.darkSecondaryTextColor), - ), - hintText: widget.hintText, - hintStyle: - GoogleFonts.poppins(color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), - ), - validator: widget.validate ?? - (value) { - print(value); - if (value == "" || value == null) { - return "Enter Income"; - } - else if (int.tryParse(value) != null) { - if (double.parse(value) <= 0) - return "Income can't be less than or equal to 0"; - } else { - return "Income has to be a numeric value"; - } - }, - onSaved: (value) { - widget.onSaved(value, chosenOption); - }, - ), - ), Expanded( flex: 2, child: Card( @@ -118,6 +82,43 @@ class _IncomeWithTypeTextFieldState extends State { ), ), ), + Expanded( + flex: 3, + child: TextFormField( + initialValue: widget.initialValue, + keyboardType: TextInputType.number, + autovalidateMode: AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + widget.text, + style: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + ), + hintText: widget.hintText, + hintStyle: + GoogleFonts.poppins(color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), + ), + validator: widget.validate ?? + (value) { + print(value); + if (value == "" || value == null) { + return "Enter Income"; + } + else if (int.tryParse(value) != null) { + if (double.parse(value) <= 0) + return "Income can't be less than or equal to 0"; + } else { + return "Income has to be a numeric value"; + } + }, + onSaved: (value) { + widget.onSaved(value, chosenOption); + }, + ), + ), + ], ), ); From 1340c95d73bfff5842c1c8598c31a664506e2af3 Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sat, 22 Jan 2022 23:59:57 +0530 Subject: [PATCH 217/264] Added optional fields and data to FamilyDetails.dart --- lib/Screens/FamilyDetails.dart | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index cc3e12b..8f8aa84 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -98,8 +98,15 @@ class _FamilyDetailsState extends State { }; var local_food = { - 'yes': false, - 'no': false, + 'brinjal': false, + 'tomato': false, + 'drumstick': false, + 'ladies finger': false, + 'banana': false, + 'potato': false, + 'drumstick leaves': false, + 'beans': false, + 'long beans': false, }; var trees_owned = { @@ -317,7 +324,6 @@ class _FamilyDetailsState extends State { title: "Environmental sanitation level: "), ], ), - //TODO: Add limit in multi option dropdown based on the no of vehicles selected? Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -355,6 +361,7 @@ class _FamilyDetailsState extends State { widget.modelData?.twoThreeWheelManufacturer = val; }, errorField: "Please choose a brand", + validator: (val){}, autoValidateMode: AutovalidateMode.onUserInteraction, ), DropDownFormField( @@ -379,6 +386,7 @@ class _FamilyDetailsState extends State { print("Value recorded: $val"); widget.modelData?.fourWheelManufacturer = val; }, + validator: (val){}, errorField: "Please choose a brand", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -507,6 +515,7 @@ class _FamilyDetailsState extends State { hint: 'Choose trees owned', singleOption: false, context: context, + validator: (val){}, dataMap: widget.modelData!.treesOwnedMap ?? trees_owned, onSaved: (val) { print("Value recorded: $val"); @@ -517,7 +526,7 @@ class _FamilyDetailsState extends State { title: 'Local foods consumed', hint: 'Choose your resource', //TODO: Change variable to local food - + validator: (val){}, dataMap: widget.modelData!.localFoodMap ?? local_food, onSaved: (val) { print("Value recorded: $val"); From 375dda32407cbb94c587d24f9e5569613d28591d Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sun, 23 Jan 2022 00:56:12 +0530 Subject: [PATCH 218/264] Added occupations to the occupation widget --- lib/Screens/FamilyMemberAdd.dart | 110 +++++++++++++++++++++++---- lib/Widgets/NestedOptionsWidget.dart | 2 +- 2 files changed, 95 insertions(+), 17 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index a25ac4d..b73396e 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -313,7 +313,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.vulnerabilities = map; }, - validator: (val){}, + validator: (val) {}, errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -326,21 +326,99 @@ class _FamilyMemberAddState extends State { .familyMemberIndividualDataModel!.occupationData ?? [ new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category One'), + "Administrative and Commercial Managers": false, + "Chief Executives, Senior Officials and Legislators": + false, + "Production and Specialized Services Managers": + false, + "Hospitality, Retail and Other Services Managers": + false + }, boxName: 'Managers'), new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category Two'), + "Science and Engineering Professionals": false, + "Health Professionals": false, + "Teaching Professionals": false, + "Business and Administration Professionals": false, + "Information and Communications Technology Professionals": + false, + "Legal, Social and Cultural Professionals": false + }, boxName: 'Professionals'), + new NestedOptionData( + subOptionDataMap: { + "Science and Engineering Associate Professionals": + false, + "Health Associate Professionals": false, + "Business and Administration Associate Professionals": + false, + "Legal, Social, Cultural and Related Associate Professionals": + false, + "Information and Communications Technicians": + false + }, + boxName: + 'Technicians and Associate Professionals'), + new NestedOptionData(subOptionDataMap: { + "General and Keyboard Clerks": false, + "Customer Services Clerks": false, + "Numerical and Material Recording Clerks": false, + "Other Clerical Support Workers": false + }, boxName: 'Clerical Support Workers'), + new NestedOptionData(subOptionDataMap: { + "Personal Services Workers": false, + "Sales Workers": false, + "Personal Care Workers": false, + "Protective Services Workers": false + }, boxName: 'Services and Sales Workers'), + new NestedOptionData( + subOptionDataMap: { + "Market-oriented Skilled Agricultural Workers": + false, + "Market-oriented Skilled Forestry, Fishery and Hunting Workers": + false, + "Subsistence Farmers, Fishers, Hunters and Gatherers": + false + }, + boxName: + 'Skilled Agricultural, Forestry and Fishery Workers'), + new NestedOptionData(subOptionDataMap: { + "Building and Related Trades Workers (excluding Electricians)": + false, + "Metal, Machinery and Related Trades Workers": + false, + "Handicraft and Printing Workers": false, + "Electrical and Electronic Trades Workers": false, + "Food Processing, Woodworking, Garment and Other Craft and Related Trades Workers": + false + }, boxName: 'Craft and Related Trades Workers'), + new NestedOptionData( + subOptionDataMap: { + "Stationary Plant and Machine Operators": false, + "Assemblers": false, + "Drivers and Mobile Plant Operators": false + }, + boxName: + 'Plant and Machine Operators and Assemblers'), + new NestedOptionData(subOptionDataMap: { + "Cleaners and Helpers": false, + "Agricultural, Forestry and Fishery Labourers": + false, + "Labourers in Mining, Construction, Manufacturing and Transport": + false, + "Food Preparation Assistants": false, + "Street and Related Sales and Services Workers": + false, + "Refuse Workers and Other Elementary Workers": false + }, boxName: 'Elementary Occupations'), new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category Three'), + "Commissioned Armed Forces Officers": false, + "Non-commissioned Armed Forces Officers": false, + "Armed Forces Occupations, Other Ranks": false + }, boxName: 'Armed Forces Occupations'), new NestedOptionData(subOptionDataMap: { - "Occupation 1": false, - "Occupation 2": false - }, boxName: 'Category Four') + "School": false, + "College": false, + "Vocational": false + }, boxName: 'Student') ], title: 'Occupation', context: context, @@ -619,7 +697,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.frequentAilments = map; }, - validator: (val){}, + validator: (val) {}, errorField: "Please choose ailments/None", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -638,7 +716,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel! .communicableDiseases = map; }, - validator: (val){}, + validator: (val) {}, errorField: "Please choose diseases/None", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -657,7 +735,7 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel! .nonCommunicableDiseases = map; }, - validator: (val){}, + validator: (val) {}, errorField: "Please choose diseases/None", autoValidateMode: AutovalidateMode.onUserInteraction, ), diff --git a/lib/Widgets/NestedOptionsWidget.dart b/lib/Widgets/NestedOptionsWidget.dart index 7952335..53bbb2f 100644 --- a/lib/Widgets/NestedOptionsWidget.dart +++ b/lib/Widgets/NestedOptionsWidget.dart @@ -111,7 +111,7 @@ class _NestedOptionWidgetState extends State { bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10))), child: CheckBoxAddExtraAlertDialog( - hint: "hint", + hint: "Choose job", autoSave: true, onSaved: (map) { widget.nestedOptionData[index] From 67f3df6590dc79baa1fe1d30f895cd97f2cfda54 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 12:59:21 +0530 Subject: [PATCH 219/264] Fixed bug in parsing occupation data --- lib/Model/FamilyDataModels.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index b871f42..5705047 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -13,7 +13,7 @@ String parseStringFields(String? val) { parseDependentField( String? dependentFieldVal, var returnVal, String requiredValue) { - if (dependentFieldVal == null || dependentFieldVal == "") { + if (dependentFieldVal == null || dependentFieldVal == "") { return ""; } else if (dependentFieldVal == requiredValue) { return returnVal; @@ -57,7 +57,7 @@ class FamilyMemberIndividualDataModel { job.add(key); } }); - list.add({"category: ": i.boxName, "job: ": job}); + list.add({"category": i.boxName, "occupation": job}); } } print("ENC: ${json.encode(list)}"); From 04597d5a56df92cea154656883683537bf60a3db Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 13:31:45 +0530 Subject: [PATCH 220/264] Added null and empty check for skills list json --- lib/Model/FamilyDataModels.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 5705047..56efef7 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -126,7 +126,7 @@ class FamilyMemberIndividualDataModel { "aadhaarNumber": parseStringFields(aadhaarNumber), "Vulnerabilities": vulnerabilities != null ? buildListForOptionWidget(vulnerabilities!) - : ['None'], + : "", "isADailyWageWorker": parseStringFields(dailyWageWorker), "occupationData": occupationData == null ? "" @@ -140,7 +140,7 @@ class FamilyMemberIndividualDataModel { "maritalStatus": parseStringFields(maritalStatus), "noOfDaysWorking": parseDependentField( employed, parseStringFields(noOfDaysWorking), "yes"), - "specialSkills": specialSkills ?? "", + "specialSkills": specialSkills != null ? (specialSkills!.isNotEmpty ? specialSkills : "") : "", "workTimings": parseDependentField(employed, workTimings, "yes"), "surgeriesUndergone": parseStringFields(surgeries), "anganwadiServicesAware": parseStringFields(anganwadiServicesAware), From 2cf781a88e8b1838d2a7f954d8b45572fc6260c0 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 15:41:03 +0530 Subject: [PATCH 221/264] Added error validation for nested options inside NestedOptionsWidget.dart --- lib/Widgets/NestedOptionWidgetFormField.dart | 75 ++++++++++++-------- lib/Widgets/NestedOptionsWidget.dart | 2 + 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/lib/Widgets/NestedOptionWidgetFormField.dart b/lib/Widgets/NestedOptionWidgetFormField.dart index f734c0d..7650202 100644 --- a/lib/Widgets/NestedOptionWidgetFormField.dart +++ b/lib/Widgets/NestedOptionWidgetFormField.dart @@ -17,10 +17,23 @@ class NestedOptionWidgetFormField extends FormField> { onSaved: onSaved, validator: validator ?? (data) { + areSubOptionsChosen(i) { + int flag = 0; + i.subOptionDataMap!.forEach((key, value) { + if (value) { + flag++; + } + }); + return flag != 0; + } + bool isSelected = false; for (var i in data!) { - print(i.boxName); - print(i.isSelected); + if (i.isSelected) { + if (!areSubOptionsChosen(i)) { + return "Please choose occupation under selected categories"; + } + } isSelected |= i.isSelected; } if (!isSelected) { @@ -30,16 +43,24 @@ class NestedOptionWidgetFormField extends FormField> { }, builder: (state) { getDisplayData() { + var selectedOptions = []; + for (var i in state.value!) { + if (i.isSelected) selectedOptions.add(i.boxName); + } if (state.hasError) { + if (selectedOptions.isNotEmpty) { + return Text( + selectedOptions.join(", "), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: GoogleFonts.poppins(color: colors.errorColor), + ); + } return Text( state.errorText ?? "Please choose a value", style: GoogleFonts.poppins(color: colors.errorColor), ); } else { - var selectedOptions = []; - for (var i in state.value!) { - if (i.isSelected) selectedOptions.add(i.boxName); - } if (selectedOptions.isNotEmpty) { return Text( selectedOptions.join(", "), @@ -80,29 +101,25 @@ class NestedOptionWidgetFormField extends FormField> { margin: EdgeInsets.only(top: 3, bottom: 3), color: colors.darkScaffoldColor, child: ListTile( - onTap: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => NestedOptionWidget( - title: title, - onChanged: (val) { - for (var i in val) { - print(i.toJsonString()); - var decodedVal = NestedOptionData.fromJson( - i.toJsonString()); - } - state.didChange(val); - state.validate(); - }, - nestedOptionData: state.value!, - ), - )); - }, - //Pass a function which is called onSaved in the next page and add data to the class object - trailing: Icon( - Icons.arrow_right, - color: colors.darkSecondaryTextColor, - ), - title: getDisplayData()), + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => NestedOptionWidget( + title: title, + onChanged: (val) { + state.didChange(val); + state.validate(); + }, + nestedOptionData: state.value!, + ), + )); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + trailing: Icon( + Icons.arrow_right, + color: colors.darkSecondaryTextColor, + ), + title: getDisplayData(), + ), ), state.hasError ? Container( diff --git a/lib/Widgets/NestedOptionsWidget.dart b/lib/Widgets/NestedOptionsWidget.dart index 53bbb2f..55bb8b6 100644 --- a/lib/Widgets/NestedOptionsWidget.dart +++ b/lib/Widgets/NestedOptionsWidget.dart @@ -92,6 +92,7 @@ class _NestedOptionWidgetState extends State { ), onChanged: (val) { setState(() { + //Enable the below commented if only one category can be chosen at a time // for (var i in widget.nestedOptionData) { // i.isSelected = false; // } @@ -112,6 +113,7 @@ class _NestedOptionWidgetState extends State { bottomRight: Radius.circular(10))), child: CheckBoxAddExtraAlertDialog( hint: "Choose job", + autoValidateMode: AutovalidateMode.always, autoSave: true, onSaved: (map) { widget.nestedOptionData[index] From 222a0bbfd575ceef68f6ec2452f0c9f8bdee0d50 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 15:51:53 +0530 Subject: [PATCH 222/264] Added TOTO, toast message on error for LoadValidPage widget and added helper message for Phone Number field --- lib/Screens/FamilyDetails.dart | 9 +++++---- lib/Screens/FamilyMemberAdd.dart | 4 ++++ lib/Widgets/LoadValidPageWidget.dart | 9 ++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 8f8aa84..1dc8e74 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -245,6 +245,7 @@ class _FamilyDetailsState extends State { widget.modelData!.drinkingWater = val; }, title: "Do you have drinking water available?"), + //TODO: DO we remove None from water source and make field non-mandatory? CheckBoxAddExtraAlertDialog( singleOption: false, dataMap: widget.modelData!.sourceOfDrinkingWater ?? @@ -361,7 +362,7 @@ class _FamilyDetailsState extends State { widget.modelData?.twoThreeWheelManufacturer = val; }, errorField: "Please choose a brand", - validator: (val){}, + validator: (val) {}, autoValidateMode: AutovalidateMode.onUserInteraction, ), DropDownFormField( @@ -386,7 +387,7 @@ class _FamilyDetailsState extends State { print("Value recorded: $val"); widget.modelData?.fourWheelManufacturer = val; }, - validator: (val){}, + validator: (val) {}, errorField: "Please choose a brand", autoValidateMode: AutovalidateMode.onUserInteraction, ), @@ -515,7 +516,7 @@ class _FamilyDetailsState extends State { hint: 'Choose trees owned', singleOption: false, context: context, - validator: (val){}, + validator: (val) {}, dataMap: widget.modelData!.treesOwnedMap ?? trees_owned, onSaved: (val) { print("Value recorded: $val"); @@ -526,7 +527,7 @@ class _FamilyDetailsState extends State { title: 'Local foods consumed', hint: 'Choose your resource', //TODO: Change variable to local food - validator: (val){}, + validator: (val) {}, dataMap: widget.modelData!.localFoodMap ?? local_food, onSaved: (val) { print("Value recorded: $val"); diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index b73396e..847b143 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -254,6 +254,10 @@ class _FamilyMemberAddState extends State { style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), ), + helperText: + "Leave empty if person is not willing to share", + helperStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), hintText: "Please enter 10 digit phone", hintStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index 16600c2..e15aba3 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -37,20 +37,17 @@ class LoadValidPageWidget extends StatelessWidget { }).timeout( const Duration(seconds: 30), onTimeout: () { - showToast("Server Timed out!"); - // Time has run out, do what you wanted to do. return http.Response( - 'Error', 408); // Request Timeout response status code + 'Server Timed out!', 408); // Request Timeout response status code }, ); - print("RES: ${res.body}"); return res; } Future jwtToken(context) async { var jwt = await storage.read(key: JWT_STORAGE_KEY); - print(JWT_STORAGE_KEY + jwt.toString()); + print(JWT_STORAGE_KEY + " : " + jwt.toString()); if (jwt == null) return ""; try { @@ -59,6 +56,8 @@ class LoadValidPageWidget extends StatelessWidget { await storage.delete(key: JWT_STORAGE_KEY); showToast("Token could not be validated, logging out"); return ""; + } else if (res.statusCode != 200) { + showToast("Couldn't validate token, continuing in offline mode!"); } } catch (e) { showToast("Couldn't validate token, continuing in offline mode!"); From e891974a3a5d56d6afcad672a5455eae563b9d98 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 15:57:18 +0530 Subject: [PATCH 223/264] Made timeout messages more responsive and user-friendly --- lib/Screens/ProfilePage.dart | 2 +- lib/Widgets/LoadValidPageWidget.dart | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index d7ad478..3051e91 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -37,7 +37,7 @@ Future _getUserDetails() async { }).timeout( const Duration(seconds: 30), onTimeout: () { - showToast("Server Timed out!"); + showToast("Server Timed out! Showing last updated data"); // Time has run out, do what you wanted to do. return http.Response( 'Error', 408); // Request Timeout response status code diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index e15aba3..e49ece0 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -58,6 +58,7 @@ class LoadValidPageWidget extends StatelessWidget { return ""; } else if (res.statusCode != 200) { showToast("Couldn't validate token, continuing in offline mode!"); + return jwt; } } catch (e) { showToast("Couldn't validate token, continuing in offline mode!"); From 911aa4e3b4e8a014be269ad6bb8131a32828bb59 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 16:01:22 +0530 Subject: [PATCH 224/264] Added error message for Edit Existing Records page --- lib/Screens/EditExistingRecordsPage.dart | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 3894669..80898aa 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -77,10 +77,19 @@ class _EditRecordsScreenState extends State { ); } - var dataJson = json.decode(snapshot.requireData.body); - for (var i in dataJson) { - print(i["FamilyUIN"]); - _dataList.add(i["FamilyUIN"]); + try { + var dataJson = json.decode(snapshot.requireData.body); + for (var i in dataJson) { + print(i["FamilyUIN"]); + _dataList.add(i["FamilyUIN"]); + } + } catch (e) { + return Scaffold( + appBar: AppBarBackButton("Edit Records"), + body: Center( + child: Text("Could not fetch data from server at this time"), + ), + ); } return Scaffold( From fa6efa56fb9042325f00f636dc5c80f6bf63e73e Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 16:05:24 +0530 Subject: [PATCH 225/264] Removed unused comment --- lib/Screens/Home.dart | 43 +------------------------------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 20d77ff..9f2e6f7 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -156,48 +156,7 @@ class _HomeWidgetState extends State { 'Community Details', 'Data entry for communities', 'assets/svg/house.svg', - CommunityDataCollection( - /* - modelData: new CommunityDataModel( - resourceType: "Bakeries", - locationBottomLeft: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - locationBottomRight: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - locationTopRight: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - locationTopLeft: new Position( - latitude: 1.2, - longitude: 2.4, - accuracy: 32, - heading: 21, - speedAccuracy: 32, - altitude: 23, - speed: 32, - timestamp: null), - villageCode: "Temple")*/ - ), + CommunityDataCollection(), Color(0xfff54b64), Color(0xfff78361)), DataCard( From a6cd143d66b647cc693c9e4a1f535c5122b83c01 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 16:09:04 +0530 Subject: [PATCH 226/264] Removed redundant lines in FamilyHomeScreen.dart --- lib/Screens/FamilyHomeScreen.dart | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index f09bf1c..e780228 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -31,7 +31,6 @@ _getUserID() async { if (userData == null) return ""; var dataJson = json.decode(userData); - print("dataJson ${dataJson} ${userData}"); return dataJson[0]["username"]; } @@ -45,11 +44,7 @@ class _FamilyHomeScreenState extends State { setState(() { if (modelData == null) modelData = widget.modelData ?? new FamilyMembersCommonDataModel(); - else { - modelData!.individualDataListTransient.clear(); - } for (var i in modelData!.individualDataList) { - print("INDIVIDUAL DATA ${i.userName}"); modelData!.individualDataListTransient.add(i); } }); @@ -186,7 +181,6 @@ class _FamilyHomeScreenState extends State { }, ); try { - print("FINAL DATA: ${modelData!.toJson()}"); http.Response res = await _makeRequest( modelData!.toJson(), "/api/IndividualData"); if (res.statusCode != 201) { @@ -298,8 +292,6 @@ class _FamilyHomeScreenState extends State { @override void dispose() { super.dispose(); - print("DISPOSED"); modelData!.individualDataListTransient.clear(); - modelData = null; } } From 815dd1d965fdc787d8f09a11e7da53f489204821 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 16:13:03 +0530 Subject: [PATCH 227/264] Fixed glitch in drop down widget, text was not included in the inkwell animation when clicked on as container was hiding it. --- lib/Widgets/DropDownFormField.dart | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/Widgets/DropDownFormField.dart b/lib/Widgets/DropDownFormField.dart index 999b3e7..047f638 100644 --- a/lib/Widgets/DropDownFormField.dart +++ b/lib/Widgets/DropDownFormField.dart @@ -50,13 +50,9 @@ class DropDownFormField extends FormField { items: list.map((value) { return DropdownMenuItem( value: value, - child: Container( - color: colors.darkScaffoldColor, - child: Text( - value, - overflow: TextOverflow.ellipsis, - ), - padding: EdgeInsets.only(left: 8), + child: Text( + value, + overflow: TextOverflow.ellipsis, ), ); }).toList(), From c773760afb9dc6c4e5466d2df319cfddeb5595ac Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 16:21:14 +0530 Subject: [PATCH 228/264] Fixed color mismatch in ProfilePage.dart --- lib/Screens/ProfilePage.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 3051e91..997b33f 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -73,6 +73,7 @@ class _ProfilePageState extends State { var dataJson = json.decode(snapshot.requireData); var gender = dataJson[0]["gender"]; return Scaffold( + backgroundColor: Color.fromRGBO(36, 37, 56, 1), appBar: AppBarBackButton( 'Profile', actions: [ From 62d79d9ef15eaf0c9bb68e5ddd2bb041dbdd69e0 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 17:28:21 +0530 Subject: [PATCH 229/264] Made changes to NavigationDrawer.dart --- lib/Widgets/NavigationDrawer.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index e31d1c6..042ecc9 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -35,8 +35,7 @@ class NavigationDrawer extends StatelessWidget { return Drawer( child: Material( color: colors.darkScaffoldColor, - child: ListView( - padding: EdgeInsets.zero, + child: Column( children: [ UserAccountsDrawerHeader( currentAccountPicture: CircleAvatar( @@ -76,6 +75,7 @@ class NavigationDrawer extends StatelessWidget { Navigator.of(context).push(MaterialPageRoute( builder: (context) => ProfilePage())); }), + Expanded(child: Container()), Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Container( @@ -157,12 +157,15 @@ class NavigationDrawer extends StatelessWidget { VoidCallback? onTap, }) { return Padding( - padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), + padding: const EdgeInsets.symmetric(vertical: 10.0), child: ListTile( selectedTileColor: colors.darkAccentColor, - leading: Icon( - icon, - color: colors.darkPrimaryTextColor, + leading: Padding( + padding: EdgeInsets.only(left: 10), + child: Icon( + icon, + color: colors.darkAccentColor, + ), ), title: Text( text, From 128ff586f49032d4141ad9de606b8a2c361cf19f Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sun, 23 Jan 2022 18:14:29 +0530 Subject: [PATCH 230/264] Figured out that flutter had a way to change icon color for AppBar hamburger icon, changed color through source code rather than changing source code --- lib/Screens/Home.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 9f2e6f7..be4fd52 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -116,6 +116,7 @@ class _HomeWidgetState extends State { drawer: NavigationDrawer(), backgroundColor: colors.darkScaffoldColor, appBar: AppBar( + iconTheme: IconThemeData(color: colors.darkAccentColor), elevation: 40, title: FutureBuilder( future: _getUserName, From 6b8c5cd6d274f13d32df54b7f10b1bf2cdcf5a3a Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Sun, 23 Jan 2022 18:16:58 +0530 Subject: [PATCH 231/264] Updated timePicker theme --- lib/Utils/DarkTheme.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/Utils/DarkTheme.dart b/lib/Utils/DarkTheme.dart index 60192da..becdc17 100644 --- a/lib/Utils/DarkTheme.dart +++ b/lib/Utils/DarkTheme.dart @@ -5,6 +5,15 @@ import 'package:geo_spatial/Utils/Colors.dart' as colors; class darkTheme{ static ThemeData get DarkTheme{ return ThemeData( + timePickerTheme: TimePickerThemeData( + backgroundColor: colors.darkScaffoldColor, + dialHandColor: colors.darkAccentColor, + dialTextColor: Colors.white, + entryModeIconColor: Colors.white, + hourMinuteTextColor: Colors.white, + dayPeriodTextColor: colors.darkAccentColor + + ), fontFamily: 'Poppins', primaryColor: Colors.white, scaffoldBackgroundColor: colors.darkScaffoldColor, From c57c845da89c127b520d9bc1a777fef203448239 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 11:27:28 +0530 Subject: [PATCH 232/264] App didn't work without INTERNET permission in manifest, added permission --- android/.gitignore | 1 + android/app/src/main/AndroidManifest.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/android/.gitignore b/android/.gitignore index 0a741cb..ed8ee91 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -4,6 +4,7 @@ gradle-wrapper.jar /gradlew /gradlew.bat /local.properties +/key.properties GeneratedPluginRegistrant.java # Remember to never publicly share your keystore. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b1f16c8..8484f86 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + Date: Mon, 24 Jan 2022 11:38:58 +0530 Subject: [PATCH 233/264] Added WillPopScope in FamilyHomeScreen.dart and changed app name in AndroidManifest.xml --- android/app/src/main/AndroidManifest.xml | 2 +- lib/Screens/FamilyHomeScreen.dart | 418 +++++++++++++---------- 2 files changed, 237 insertions(+), 183 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8484f86..2f9b4e5 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBarBackButton('Individual Data'), - backgroundColor: colors.darkScaffoldColor, - body: SafeArea( - child: Column( - children: [ - AddRemoveBoxWidget( - modelData: modelData, + return WillPopScope( + onWillPop: () async { + final result = await showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + "Are you sure?", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - DataCard( - "\nCollect Common Details", - "", - "assets/svg/house.svg", - FamilyDetails( - modelData: modelData, + content: Text( + "All unsaved changes will be lost.", + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + actions: [ + TextButton( + child: Text( + 'No', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: () { + Navigator.pop(context, false); + }, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: Text( + 'Yes', + style: + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), - Color(0xfff54b64), - Color(0xfff78361)), - DataCard( - "Record GPS Data", - "Make sure GPS is enabled", - "assets/svg/map.svg", - CollectLocationWidget(modelData: modelData), - Color(0xfff54b64), - Color(0xfff78361)), - Padding( - padding: EdgeInsets.only( - bottom: 10.0, left: 10.0, right: 10.0, top: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: Padding( - padding: EdgeInsets.only(left: 10, right: 10), - child: ElevatedButton( - child: Text("Submit", style: TextStyle(fontSize: 14)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - colors.darkSecondBackgroundColor), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide( - color: colors - .darkSecondBackgroundColor)))), - onPressed: () async { - bool isValid = true; - print("Common ${modelData!.commonDetailsValid}"); - print("Location ${modelData!.locationPageValid}"); - isValid &= modelData!.commonDetailsValid! && - modelData!.locationPageValid!; + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ), + ); + return result; + }, + child: Scaffold( + appBar: AppBarBackButton('Individual Data'), + backgroundColor: colors.darkScaffoldColor, + body: SafeArea( + child: Column( + children: [ + AddRemoveBoxWidget( + modelData: modelData, + ), + DataCard( + "\nCollect Common Details", + "", + "assets/svg/house.svg", + FamilyDetails( + modelData: modelData, + ), + Color(0xfff54b64), + Color(0xfff78361)), + DataCard( + "Record GPS Data", + "Make sure GPS is enabled", + "assets/svg/map.svg", + CollectLocationWidget(modelData: modelData), + Color(0xfff54b64), + Color(0xfff78361)), + Padding( + padding: EdgeInsets.only( + bottom: 10.0, left: 10.0, right: 10.0, top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: ElevatedButton( + child: + Text("Submit", style: TextStyle(fontSize: 14)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + Colors.white), + backgroundColor: + MaterialStateProperty.all( + colors.darkSecondBackgroundColor), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: BorderSide( + color: colors + .darkSecondBackgroundColor)))), + onPressed: () async { + bool isValid = true; + print("Common ${modelData!.commonDetailsValid}"); + print("Location ${modelData!.locationPageValid}"); + isValid &= modelData!.commonDetailsValid! && + modelData!.locationPageValid!; - for (var i - in modelData!.individualDataListTransient) { - isValid &= i.dataValid!; - print("Indv ${i.dataValid}"); - } + for (var i + in modelData!.individualDataListTransient) { + isValid &= i.dataValid!; + print("Indv ${i.dataValid}"); + } - if (isValid) { - var userId = await _getUserID(); - modelData!.recordCollectingUserId = userId; - var progressContext; - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - progressContext = context; - return WillPopScope( - child: Dialog( - child: Padding( - padding: EdgeInsets.all(20), - child: new Row( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: - EdgeInsets.only(right: 20), - child: - CircularProgressIndicator(), - ), - new Text( - "Uploading data", - style: TextStyle( - color: Colors.black), - ), - ], + if (isValid) { + var userId = await _getUserID(); + modelData!.recordCollectingUserId = userId; + var progressContext; + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + progressContext = context; + return WillPopScope( + child: Dialog( + child: Padding( + padding: EdgeInsets.all(20), + child: new Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: EdgeInsets.only( + right: 20), + child: + CircularProgressIndicator(), + ), + new Text( + "Uploading data", + style: TextStyle( + color: Colors.black), + ), + ], + ), ), ), - ), - onWillPop: () async => false); - }, - ); - try { - http.Response res = await _makeRequest( - modelData!.toJson(), "/api/IndividualData"); - if (res.statusCode != 201) { - showToast(res.body); - } else { - Navigator.pop(context); - showToast("Data entered successfully!"); + onWillPop: () async => false); + }, + ); + try { + http.Response res = await _makeRequest( + modelData!.toJson(), + "/api/IndividualData"); + if (res.statusCode != 201) { + showToast(res.body); + } else { + Navigator.pop(context); + showToast("Data entered successfully!"); + } + } catch (e) { + print(e); + showToast( + "Something went wrong, please check your network connection or save your records to upload later", + position: ToastPosition.center, + backgroundColor: colors.darkAccentColor); } - } catch (e) { - print(e); - showToast( - "Something went wrong, please check your network connection or save your records to upload later", - position: ToastPosition.center, - backgroundColor: colors.darkAccentColor); + Navigator.of(progressContext!, + rootNavigator: true) + .pop(); + } else { + showToast("Please fill all fields!"); } - Navigator.of(progressContext!, - rootNavigator: true) - .pop(); - } else { - showToast("Please fill all fields!"); - } - print("Is Valid: $isValid"); - }), + print("Is Valid: $isValid"); + }), + ), ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only( - left: 10, right: 10, top: 5, bottom: 10), - child: ElevatedButton( - child: Text("Save", - style: - TextStyle(fontSize: 14, color: Colors.black)), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.all( - Colors.white), - backgroundColor: MaterialStateProperty.all( - Colors.white), - shape: MaterialStateProperty.all< - RoundedRectangleBorder>( - RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - side: BorderSide(color: Colors.white)))), - onPressed: () async { - var userId = await _getUserID(); - modelData!.recordCollectingUserId = userId; - var store = await StoreInstance.getInstance(); - Box individualDataBox = - store.box(); + Expanded( + child: Padding( + padding: EdgeInsets.only( + left: 10, right: 10, top: 5, bottom: 10), + child: ElevatedButton( + child: Text("Save", + style: TextStyle( + fontSize: 14, color: Colors.black)), + style: ButtonStyle( + foregroundColor: + MaterialStateProperty.all( + Colors.white), + backgroundColor: + MaterialStateProperty.all( + Colors.white), + shape: MaterialStateProperty.all< + RoundedRectangleBorder>( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + side: + BorderSide(color: Colors.white)))), + onPressed: () async { + var userId = await _getUserID(); + modelData!.recordCollectingUserId = userId; + var store = await StoreInstance.getInstance(); + Box individualDataBox = + store.box(); - List i = await individualDataBox.putMany( - modelData!.individualDataListTransient); - print("ID: $i"); + List i = await individualDataBox.putMany( + modelData!.individualDataListTransient); + print("ID: $i"); - modelData!.individualDataList.clear(); - modelData!.individualDataList - .addAll(modelData!.individualDataListTransient); + modelData!.individualDataList.clear(); + modelData!.individualDataList.addAll( + modelData!.individualDataListTransient); - Box box = store.box(); - int id = await box.put(modelData); + Box box = + store.box(); + int id = await box.put(modelData); - AlertDialog alertDialog = AlertDialog( - backgroundColor: colors.darkScaffoldColor, - title: Text( - 'Record Saved', - style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - ), - content: Text( - 'The Record has been saved with record ID ${id}', + AlertDialog alertDialog = AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + 'Record Saved', style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor)), - actions: [ - ElevatedButton( - onPressed: () { - Navigator.of(context, rootNavigator: true) - .pop('dialog'); - }, - child: Text( - 'OK', + color: colors.darkPrimaryTextColor), + ), + content: Text( + 'The Record has been saved with record ID ${id}', style: GoogleFonts.poppins( - color: colors.darkPrimaryTextColor), - ), - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(20)), - ), - primary: colors.darkAccentColor), - ) - ], - ); + color: colors.darkPrimaryTextColor)), + actions: [ + ElevatedButton( + onPressed: () { + Navigator.of(context, rootNavigator: true) + .pop('dialog'); + }, + child: Text( + 'OK', + style: GoogleFonts.poppins( + color: colors.darkPrimaryTextColor), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(20)), + ), + primary: colors.darkAccentColor), + ) + ], + ); - showDialog( - context: context, - builder: (BuildContext context) => alertDialog); - }), - ), - ) - ], + showDialog( + context: context, + builder: (BuildContext context) => + alertDialog); + }), + ), + ) + ], + ), ), - ), - ], + ], + ), ), ), ); From 0712de9c411b5d0c64a94444cf1fa29c42ab96ea Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 11:49:09 +0530 Subject: [PATCH 234/264] Changed ChangePassword.dart background color to match background asset --- lib/Screens/ChangePassword.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 2acbc5f..54c4e63 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -76,6 +76,7 @@ class _ChangePasswordState extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Color.fromRGBO(36, 37, 56, 1), resizeToAvoidBottomInset: true, appBar: AppBarBackButton('Change Password'), body: Stack( From 5d0d1dc222a880fe1ff48a9813419c74b5a2170a Mon Sep 17 00:00:00 2001 From: Nirmal K Date: Mon, 24 Jan 2022 16:56:37 +0530 Subject: [PATCH 235/264] Modified, has error in student field. Needs dataModel modification --- lib/Screens/FamilyMemberAdd.dart | 233 +++++++++++++++++-------------- 1 file changed, 126 insertions(+), 107 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 847b143..0bd841c 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -321,112 +321,6 @@ class _FamilyMemberAddState extends State { errorField: "Please choose a vulnerability / None", autoValidateMode: AutovalidateMode.onUserInteraction, ), - NestedOptionWidgetFormField( - onSaved: (val) { - widget.familyMemberIndividualDataModel!.occupationData = - val; - }, - nestedOptionData: widget - .familyMemberIndividualDataModel!.occupationData ?? - [ - new NestedOptionData(subOptionDataMap: { - "Administrative and Commercial Managers": false, - "Chief Executives, Senior Officials and Legislators": - false, - "Production and Specialized Services Managers": - false, - "Hospitality, Retail and Other Services Managers": - false - }, boxName: 'Managers'), - new NestedOptionData(subOptionDataMap: { - "Science and Engineering Professionals": false, - "Health Professionals": false, - "Teaching Professionals": false, - "Business and Administration Professionals": false, - "Information and Communications Technology Professionals": - false, - "Legal, Social and Cultural Professionals": false - }, boxName: 'Professionals'), - new NestedOptionData( - subOptionDataMap: { - "Science and Engineering Associate Professionals": - false, - "Health Associate Professionals": false, - "Business and Administration Associate Professionals": - false, - "Legal, Social, Cultural and Related Associate Professionals": - false, - "Information and Communications Technicians": - false - }, - boxName: - 'Technicians and Associate Professionals'), - new NestedOptionData(subOptionDataMap: { - "General and Keyboard Clerks": false, - "Customer Services Clerks": false, - "Numerical and Material Recording Clerks": false, - "Other Clerical Support Workers": false - }, boxName: 'Clerical Support Workers'), - new NestedOptionData(subOptionDataMap: { - "Personal Services Workers": false, - "Sales Workers": false, - "Personal Care Workers": false, - "Protective Services Workers": false - }, boxName: 'Services and Sales Workers'), - new NestedOptionData( - subOptionDataMap: { - "Market-oriented Skilled Agricultural Workers": - false, - "Market-oriented Skilled Forestry, Fishery and Hunting Workers": - false, - "Subsistence Farmers, Fishers, Hunters and Gatherers": - false - }, - boxName: - 'Skilled Agricultural, Forestry and Fishery Workers'), - new NestedOptionData(subOptionDataMap: { - "Building and Related Trades Workers (excluding Electricians)": - false, - "Metal, Machinery and Related Trades Workers": - false, - "Handicraft and Printing Workers": false, - "Electrical and Electronic Trades Workers": false, - "Food Processing, Woodworking, Garment and Other Craft and Related Trades Workers": - false - }, boxName: 'Craft and Related Trades Workers'), - new NestedOptionData( - subOptionDataMap: { - "Stationary Plant and Machine Operators": false, - "Assemblers": false, - "Drivers and Mobile Plant Operators": false - }, - boxName: - 'Plant and Machine Operators and Assemblers'), - new NestedOptionData(subOptionDataMap: { - "Cleaners and Helpers": false, - "Agricultural, Forestry and Fishery Labourers": - false, - "Labourers in Mining, Construction, Manufacturing and Transport": - false, - "Food Preparation Assistants": false, - "Street and Related Sales and Services Workers": - false, - "Refuse Workers and Other Elementary Workers": false - }, boxName: 'Elementary Occupations'), - new NestedOptionData(subOptionDataMap: { - "Commissioned Armed Forces Officers": false, - "Non-commissioned Armed Forces Officers": false, - "Armed Forces Occupations, Other Ranks": false - }, boxName: 'Armed Forces Occupations'), - new NestedOptionData(subOptionDataMap: { - "School": false, - "College": false, - "Vocational": false - }, boxName: 'Student') - ], - title: 'Occupation', - context: context, - ), OptionsWidget( defaultValue: widget.familyMemberIndividualDataModel!.dailyWageWorker, @@ -458,8 +352,133 @@ class _FamilyMemberAddState extends State { }, defaultValue: widget.familyMemberIndividualDataModel!.employed, + conditionalNegativeWidget: ConditionalRenderWidget( + title: 'Student?', + onSaved: (val){}, + defaultValue: null, + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + conditionalPositiveValue: "yes", + conditionalNegativeValue: "no", + conditionalPositiveWidget: DropDownFormField( + defaultValue: "Enter value", + list: [ + 'School', + 'College', + 'Vocational', + ], + onSaved: (data) {}, + hint: "Choose category", + title: "Education", + errorField: "Please choose a category", + ), + conditionalNegativeWidget: Container(), + ), conditionalPositiveWidget: Column( children: [ + NestedOptionWidgetFormField( + onSaved: (val) { + widget.familyMemberIndividualDataModel!.occupationData = + val; + }, + nestedOptionData: widget + .familyMemberIndividualDataModel!.occupationData ?? + [ + new NestedOptionData(subOptionDataMap: { + "Administrative and Commercial Managers": false, + "Chief Executives, Senior Officials and Legislators": + false, + "Production and Specialized Services Managers": + false, + "Hospitality, Retail and Other Services Managers": + false + }, boxName: 'Managers'), + new NestedOptionData(subOptionDataMap: { + "Science and Engineering Professionals": false, + "Health Professionals": false, + "Teaching Professionals": false, + "Business and Administration Professionals": false, + "Information and Communications Technology Professionals": + false, + "Legal, Social and Cultural Professionals": false + }, boxName: 'Professionals'), + new NestedOptionData( + subOptionDataMap: { + "Science and Engineering Associate Professionals": + false, + "Health Associate Professionals": false, + "Business and Administration Associate Professionals": + false, + "Legal, Social, Cultural and Related Associate Professionals": + false, + "Information and Communications Technicians": + false + }, + boxName: + 'Technicians and Associate Professionals'), + new NestedOptionData(subOptionDataMap: { + "General and Keyboard Clerks": false, + "Customer Services Clerks": false, + "Numerical and Material Recording Clerks": false, + "Other Clerical Support Workers": false + }, boxName: 'Clerical Support Workers'), + new NestedOptionData(subOptionDataMap: { + "Personal Services Workers": false, + "Sales Workers": false, + "Personal Care Workers": false, + "Protective Services Workers": false + }, boxName: 'Services and Sales Workers'), + new NestedOptionData( + subOptionDataMap: { + "Market-oriented Skilled Agricultural Workers": + false, + "Market-oriented Skilled Forestry, Fishery and Hunting Workers": + false, + "Subsistence Farmers, Fishers, Hunters and Gatherers": + false + }, + boxName: + 'Skilled Agricultural, Forestry and Fishery Workers'), + new NestedOptionData(subOptionDataMap: { + "Building and Related Trades Workers (excluding Electricians)": + false, + "Metal, Machinery and Related Trades Workers": + false, + "Handicraft and Printing Workers": false, + "Electrical and Electronic Trades Workers": false, + "Food Processing, Woodworking, Garment and Other Craft and Related Trades Workers": + false + }, boxName: 'Craft and Related Trades Workers'), + new NestedOptionData( + subOptionDataMap: { + "Stationary Plant and Machine Operators": false, + "Assemblers": false, + "Drivers and Mobile Plant Operators": false + }, + boxName: + 'Plant and Machine Operators and Assemblers'), + new NestedOptionData(subOptionDataMap: { + "Cleaners and Helpers": false, + "Agricultural, Forestry and Fishery Labourers": + false, + "Labourers in Mining, Construction, Manufacturing and Transport": + false, + "Food Preparation Assistants": false, + "Street and Related Sales and Services Workers": + false, + "Refuse Workers and Other Elementary Workers": false + }, boxName: 'Elementary Occupations'), + new NestedOptionData(subOptionDataMap: { + "Commissioned Armed Forces Officers": false, + "Non-commissioned Armed Forces Officers": false, + "Armed Forces Occupations, Other Ranks": false + }, boxName: 'Armed Forces Occupations'), + ], + title: 'Occupation', + context: context, + ), Padding( padding: EdgeInsets.all(15), child: StartingEndingTimeWidget( @@ -569,7 +588,7 @@ class _FamilyMemberAddState extends State { ], conditionalPositiveValue: "yes", conditionalNegativeValue: "no", - conditionalNegativeWidget: Container()) + ) ], ), Column( From e7b3d32a75d5be1eaf1e65a99d2f978febfb91f5 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 17:27:47 +0530 Subject: [PATCH 236/264] Fixed bug in Education Drop Down field added in FamilyMemberAdd.dart, commented out Edit Page Card in Home.dart --- lib/Screens/FamilyMemberAdd.dart | 476 ++++++++++++++++--------------- lib/Screens/Home.dart | 14 +- 2 files changed, 250 insertions(+), 240 deletions(-) diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 0bd841c..efa4ef7 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -255,7 +255,7 @@ class _FamilyMemberAddState extends State { color: colors.darkSecondaryTextColor), ), helperText: - "Leave empty if person is not willing to share", + "Leave empty if person is not willing to share", helperStyle: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), hintText: "Please enter 10 digit phone", @@ -346,249 +346,259 @@ class _FamilyMemberAddState extends State { }, ), ConditionalRenderWidget( - title: "Employed?", - onSaved: (val) { - widget.familyMemberIndividualDataModel!.employed = val; - }, - defaultValue: - widget.familyMemberIndividualDataModel!.employed, - conditionalNegativeWidget: ConditionalRenderWidget( - title: 'Student?', - onSaved: (val){}, - defaultValue: null, - options: [ - ["Yes", "yes"], - ["No", "no"], + title: "Employed?", + onSaved: (val) { + widget.familyMemberIndividualDataModel!.employed = val; + }, + defaultValue: + widget.familyMemberIndividualDataModel!.employed, + conditionalNegativeWidget: ConditionalRenderWidget( + title: 'Student?', + onSaved: (val) {}, + defaultValue: null, + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + conditionalPositiveValue: "yes", + conditionalNegativeValue: "no", + conditionalPositiveWidget: DropDownFormField( + //defaultValue: "Enter value", + list: [ + 'School', + 'College', + 'Vocational', ], - conditionalPositiveValue: "yes", - conditionalNegativeValue: "no", - conditionalPositiveWidget: DropDownFormField( - defaultValue: "Enter value", - list: [ - 'School', - 'College', - 'Vocational', - ], - onSaved: (data) {}, - hint: "Choose category", - title: "Education", - errorField: "Please choose a category", - ), - conditionalNegativeWidget: Container(), + onSaved: (data) {}, + hint: "Choose education category", + title: "Education", + errorField: "Please choose a category", ), - conditionalPositiveWidget: Column( - children: [ - NestedOptionWidgetFormField( - onSaved: (val) { - widget.familyMemberIndividualDataModel!.occupationData = - val; + conditionalNegativeWidget: Container(), + ), + conditionalPositiveWidget: Column( + children: [ + NestedOptionWidgetFormField( + onSaved: (val) { + widget.familyMemberIndividualDataModel! + .occupationData = val; + }, + nestedOptionData: widget + .familyMemberIndividualDataModel! + .occupationData ?? + [ + new NestedOptionData(subOptionDataMap: { + "Administrative and Commercial Managers": + false, + "Chief Executives, Senior Officials and Legislators": + false, + "Production and Specialized Services Managers": + false, + "Hospitality, Retail and Other Services Managers": + false + }, boxName: 'Managers'), + new NestedOptionData(subOptionDataMap: { + "Science and Engineering Professionals": + false, + "Health Professionals": false, + "Teaching Professionals": false, + "Business and Administration Professionals": + false, + "Information and Communications Technology Professionals": + false, + "Legal, Social and Cultural Professionals": + false + }, boxName: 'Professionals'), + new NestedOptionData( + subOptionDataMap: { + "Science and Engineering Associate Professionals": + false, + "Health Associate Professionals": false, + "Business and Administration Associate Professionals": + false, + "Legal, Social, Cultural and Related Associate Professionals": + false, + "Information and Communications Technicians": + false + }, + boxName: + 'Technicians and Associate Professionals'), + new NestedOptionData(subOptionDataMap: { + "General and Keyboard Clerks": false, + "Customer Services Clerks": false, + "Numerical and Material Recording Clerks": + false, + "Other Clerical Support Workers": false + }, boxName: 'Clerical Support Workers'), + new NestedOptionData(subOptionDataMap: { + "Personal Services Workers": false, + "Sales Workers": false, + "Personal Care Workers": false, + "Protective Services Workers": false + }, boxName: 'Services and Sales Workers'), + new NestedOptionData( + subOptionDataMap: { + "Market-oriented Skilled Agricultural Workers": + false, + "Market-oriented Skilled Forestry, Fishery and Hunting Workers": + false, + "Subsistence Farmers, Fishers, Hunters and Gatherers": + false + }, + boxName: + 'Skilled Agricultural, Forestry and Fishery Workers'), + new NestedOptionData(subOptionDataMap: { + "Building and Related Trades Workers (excluding Electricians)": + false, + "Metal, Machinery and Related Trades Workers": + false, + "Handicraft and Printing Workers": false, + "Electrical and Electronic Trades Workers": + false, + "Food Processing, Woodworking, Garment and Other Craft and Related Trades Workers": + false + }, boxName: 'Craft and Related Trades Workers'), + new NestedOptionData( + subOptionDataMap: { + "Stationary Plant and Machine Operators": + false, + "Assemblers": false, + "Drivers and Mobile Plant Operators": + false + }, + boxName: + 'Plant and Machine Operators and Assemblers'), + new NestedOptionData(subOptionDataMap: { + "Cleaners and Helpers": false, + "Agricultural, Forestry and Fishery Labourers": + false, + "Labourers in Mining, Construction, Manufacturing and Transport": + false, + "Food Preparation Assistants": false, + "Street and Related Sales and Services Workers": + false, + "Refuse Workers and Other Elementary Workers": + false + }, boxName: 'Elementary Occupations'), + new NestedOptionData(subOptionDataMap: { + "Commissioned Armed Forces Officers": false, + "Non-commissioned Armed Forces Officers": + false, + "Armed Forces Occupations, Other Ranks": false + }, boxName: 'Armed Forces Occupations'), + ], + title: 'Occupation', + context: context, + ), + Padding( + padding: EdgeInsets.all(15), + child: StartingEndingTimeWidget( + initialValue: widget + .familyMemberIndividualDataModel! + .workTimings != + null + ? [ + TimeOfDay( + hour: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![0] + .split(":")[0]), + minute: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![0] + .split(":")[1] + .replaceAll( + new RegExp(r"\D"), ""))), + TimeOfDay( + hour: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![1] + .split(":")[0]), + minute: int.parse(widget + .familyMemberIndividualDataModel! + .workTimings![1] + .split(":")[1] + .replaceAll(new RegExp(r"\D"), ""))) + ] + : null, + onSaved: (List? timeList) { + print(timeList); + var timeFinalString = [ + "${timeList![0].hour}:${timeList[0].minute} ${timeList[0].period == DayPeriod.am ? "AM" : "PM"}", + "${timeList[1].hour}:${timeList[1].minute} ${timeList[1].period == DayPeriod.am ? "AM" : "PM"}" + ]; + widget.familyMemberIndividualDataModel! + .workTimings = timeFinalString; }, - nestedOptionData: widget - .familyMemberIndividualDataModel!.occupationData ?? - [ - new NestedOptionData(subOptionDataMap: { - "Administrative and Commercial Managers": false, - "Chief Executives, Senior Officials and Legislators": - false, - "Production and Specialized Services Managers": - false, - "Hospitality, Retail and Other Services Managers": - false - }, boxName: 'Managers'), - new NestedOptionData(subOptionDataMap: { - "Science and Engineering Professionals": false, - "Health Professionals": false, - "Teaching Professionals": false, - "Business and Administration Professionals": false, - "Information and Communications Technology Professionals": - false, - "Legal, Social and Cultural Professionals": false - }, boxName: 'Professionals'), - new NestedOptionData( - subOptionDataMap: { - "Science and Engineering Associate Professionals": - false, - "Health Associate Professionals": false, - "Business and Administration Associate Professionals": - false, - "Legal, Social, Cultural and Related Associate Professionals": - false, - "Information and Communications Technicians": - false - }, - boxName: - 'Technicians and Associate Professionals'), - new NestedOptionData(subOptionDataMap: { - "General and Keyboard Clerks": false, - "Customer Services Clerks": false, - "Numerical and Material Recording Clerks": false, - "Other Clerical Support Workers": false - }, boxName: 'Clerical Support Workers'), - new NestedOptionData(subOptionDataMap: { - "Personal Services Workers": false, - "Sales Workers": false, - "Personal Care Workers": false, - "Protective Services Workers": false - }, boxName: 'Services and Sales Workers'), - new NestedOptionData( - subOptionDataMap: { - "Market-oriented Skilled Agricultural Workers": - false, - "Market-oriented Skilled Forestry, Fishery and Hunting Workers": - false, - "Subsistence Farmers, Fishers, Hunters and Gatherers": - false - }, - boxName: - 'Skilled Agricultural, Forestry and Fishery Workers'), - new NestedOptionData(subOptionDataMap: { - "Building and Related Trades Workers (excluding Electricians)": - false, - "Metal, Machinery and Related Trades Workers": - false, - "Handicraft and Printing Workers": false, - "Electrical and Electronic Trades Workers": false, - "Food Processing, Woodworking, Garment and Other Craft and Related Trades Workers": - false - }, boxName: 'Craft and Related Trades Workers'), - new NestedOptionData( - subOptionDataMap: { - "Stationary Plant and Machine Operators": false, - "Assemblers": false, - "Drivers and Mobile Plant Operators": false - }, - boxName: - 'Plant and Machine Operators and Assemblers'), - new NestedOptionData(subOptionDataMap: { - "Cleaners and Helpers": false, - "Agricultural, Forestry and Fishery Labourers": - false, - "Labourers in Mining, Construction, Manufacturing and Transport": - false, - "Food Preparation Assistants": false, - "Street and Related Sales and Services Workers": - false, - "Refuse Workers and Other Elementary Workers": false - }, boxName: 'Elementary Occupations'), - new NestedOptionData(subOptionDataMap: { - "Commissioned Armed Forces Officers": false, - "Non-commissioned Armed Forces Officers": false, - "Armed Forces Occupations, Other Ranks": false - }, boxName: 'Armed Forces Occupations'), - ], - title: 'Occupation', - context: context, ), - Padding( - padding: EdgeInsets.all(15), - child: StartingEndingTimeWidget( - initialValue: widget - .familyMemberIndividualDataModel! - .workTimings != - null - ? [ - TimeOfDay( - hour: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![0] - .split(":")[0]), - minute: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![0] - .split(":")[1] - .replaceAll( - new RegExp(r"\D"), ""))), - TimeOfDay( - hour: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![1] - .split(":")[0]), - minute: int.parse(widget - .familyMemberIndividualDataModel! - .workTimings![1] - .split(":")[1] - .replaceAll( - new RegExp(r"\D"), ""))) - ] - : null, - onSaved: (List? timeList) { - print(timeList); - var timeFinalString = [ - "${timeList![0].hour}:${timeList[0].minute} ${timeList[0].period == DayPeriod.am ? "AM" : "PM"}", - "${timeList[1].hour}:${timeList[1].minute} ${timeList[1].period == DayPeriod.am ? "AM" : "PM"}" - ]; - widget.familyMemberIndividualDataModel! - .workTimings = timeFinalString; - }, - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 10.0, vertical: 20.0), - child: TextFormField( - initialValue: widget - .familyMemberIndividualDataModel! - .noOfDaysWorking, - keyboardType: TextInputType.number, - autovalidateMode: - AutovalidateMode.onUserInteraction, - style: darkTheme.DarkTheme.textTheme.bodyText2, - decoration: InputDecoration( - label: Text( - "Number of work days", - style: GoogleFonts.poppins( - color: colors.darkSecondaryTextColor), - ), - hintText: "Please enter number of work days", - hintStyle: GoogleFonts.poppins( + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 20.0), + child: TextFormField( + initialValue: widget + .familyMemberIndividualDataModel! + .noOfDaysWorking, + keyboardType: TextInputType.number, + autovalidateMode: + AutovalidateMode.onUserInteraction, + style: darkTheme.DarkTheme.textTheme.bodyText2, + decoration: InputDecoration( + label: Text( + "Number of work days", + style: GoogleFonts.poppins( color: colors.darkSecondaryTextColor), - contentPadding: EdgeInsets.all(7.0), ), - validator: (value) { - print(value); - print("value"); - if (value == null || value == "") - return "Please enter number of work days"; - else if (int.tryParse(value) == null) { - return "Field can only have numbers"; - } else if (int.parse(value) < 1) { - return "Enter number of work days"; - } else if (int.parse(value) > 31) { - return "Enter a valid number of work days"; - } - }, - onSaved: (val) { - print(val.toString()); - widget.familyMemberIndividualDataModel! - .noOfDaysWorking = val; - }, + hintText: "Please enter number of work days", + hintStyle: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + contentPadding: EdgeInsets.all(7.0), ), - ), - IncomeWithTypeTextField( - initialDropdownValue: widget - .familyMemberIndividualDataModel!.incomeType, - initialValue: - widget.familyMemberIndividualDataModel!.income, - onSaved: (income, option) { - widget.familyMemberIndividualDataModel!.income = - income; + validator: (value) { + print(value); + print("value"); + if (value == null || value == "") + return "Please enter number of work days"; + else if (int.tryParse(value) == null) { + return "Field can only have numbers"; + } else if (int.parse(value) < 1) { + return "Enter number of work days"; + } else if (int.parse(value) > 31) { + return "Enter a valid number of work days"; + } + }, + onSaved: (val) { + print(val.toString()); widget.familyMemberIndividualDataModel! - .incomeType = option; - print(income! + " " + option!); + .noOfDaysWorking = val; }, - text: 'Income', - hintText: 'Enter income', - listOfOptions: ["Day", "Week", "Month"], ), - ], - ), - options: [ - ["Yes", "yes"], - ["No", "no"], + ), + IncomeWithTypeTextField( + initialDropdownValue: widget + .familyMemberIndividualDataModel!.incomeType, + initialValue: + widget.familyMemberIndividualDataModel!.income, + onSaved: (income, option) { + widget.familyMemberIndividualDataModel!.income = + income; + widget.familyMemberIndividualDataModel!.incomeType = + option; + print(income! + " " + option!); + }, + text: 'Income', + hintText: 'Enter income', + listOfOptions: ["Day", "Week", "Month"], + ), ], - conditionalPositiveValue: "yes", - conditionalNegativeValue: "no", - ) + ), + options: [ + ["Yes", "yes"], + ["No", "no"], + ], + conditionalPositiveValue: "yes", + conditionalNegativeValue: "no", + ) ], ), Column( diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index be4fd52..19f4333 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -160,13 +160,13 @@ class _HomeWidgetState extends State { CommunityDataCollection(), Color(0xfff54b64), Color(0xfff78361)), - DataCard( - 'Edit Existing Record', - 'Edit information of an existing person', - 'assets/svg/male.svg', - EditRecordsScreen(), - Color(0xfff54b64), - Color(0xfff78361)), + // DataCard( + // 'Edit Existing Record', + // 'Edit information of an existing person', + // 'assets/svg/male.svg', + // EditRecordsScreen(), + // Color(0xfff54b64), + // Color(0xfff78361)), DataCard( 'View saved data', 'View all data saved in local storage', From aceb2e7d3759bde88e1c769822f28f4458a8e7a1 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 17:36:12 +0530 Subject: [PATCH 237/264] Added Student and Student education type fields to model and built objectbox-model.json --- lib/Model/FamilyDataModels.dart | 4 +++- lib/Screens/FamilyMemberAdd.dart | 15 +++++++++---- lib/objectbox-model.json | 12 ++++++++++- lib/objectbox.g.dart | 37 +++++++++++++++++++++++++++++--- 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 56efef7..fb11927 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -85,8 +85,10 @@ class FamilyMemberIndividualDataModel { String? aadhaarNumber; Map? vulnerabilities; String? dailyWageWorker; - List? occupationData; String? employed; + List? occupationData; //TODO: Make occupationData dependent on employed + String? student; //TODO: Add to model, make field dependent on employed + String? studentEducationCategory; //TODO: Make value dependent on student and employed, add to model (USE CASE: Education set but then employed changed to yes) String? income; String? incomeType; String? pension; diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index efa4ef7..9c4515a 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -354,8 +354,11 @@ class _FamilyMemberAddState extends State { widget.familyMemberIndividualDataModel!.employed, conditionalNegativeWidget: ConditionalRenderWidget( title: 'Student?', - onSaved: (val) {}, - defaultValue: null, + onSaved: (val) { + widget.familyMemberIndividualDataModel!.student = val; + }, + defaultValue: + widget.familyMemberIndividualDataModel!.student, options: [ ["Yes", "yes"], ["No", "no"], @@ -363,13 +366,17 @@ class _FamilyMemberAddState extends State { conditionalPositiveValue: "yes", conditionalNegativeValue: "no", conditionalPositiveWidget: DropDownFormField( - //defaultValue: "Enter value", + defaultValue: widget.familyMemberIndividualDataModel! + .studentEducationCategory, list: [ 'School', 'College', 'Vocational', ], - onSaved: (data) {}, + onSaved: (data) { + widget.familyMemberIndividualDataModel! + .studentEducationCategory = data; + }, hint: "Choose education category", title: "Education", errorField: "Please choose a category", diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index 144a197..f42350c 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -59,7 +59,7 @@ }, { "id": "2:4604626538020621410", - "lastPropertyId": "45:8806096688498887024", + "lastPropertyId": "47:9107986757309043468", "name": "FamilyMemberIndividualDataModel", "properties": [ { @@ -237,6 +237,16 @@ "id": "45:8806096688498887024", "name": "dbOccupationData", "type": 9 + }, + { + "id": "46:1773687084148916152", + "name": "student", + "type": 9 + }, + { + "id": "47:9107986757309043468", + "name": "studentEducationCategory", + "type": 9 } ], "relations": [] diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 5319f88..3cbc849 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -72,7 +72,7 @@ final _entities = [ ModelEntity( id: const IdUid(2, 4604626538020621410), name: 'FamilyMemberIndividualDataModel', - lastPropertyId: const IdUid(45, 8806096688498887024), + lastPropertyId: const IdUid(47, 9107986757309043468), flags: 0, properties: [ ModelProperty( @@ -249,6 +249,16 @@ final _entities = [ id: const IdUid(45, 8806096688498887024), name: 'dbOccupationData', type: 9, + flags: 0), + ModelProperty( + id: const IdUid(46, 1773687084148916152), + name: 'student', + type: 9, + flags: 0), + ModelProperty( + id: const IdUid(47, 9107986757309043468), + name: 'studentEducationCategory', + type: 9, flags: 0) ], relations: [], @@ -685,7 +695,13 @@ ModelDefinition getObjectBoxModel() { final dbOccupationDataOffset = object.dbOccupationData == null ? null : fbb.writeString(object.dbOccupationData!); - fbb.startTable(46); + final studentOffset = + object.student == null ? null : fbb.writeString(object.student!); + final studentEducationCategoryOffset = + object.studentEducationCategory == null + ? null + : fbb.writeString(object.studentEducationCategory!); + fbb.startTable(48); fbb.addInt64(0, object.id); fbb.addOffset(1, userNameOffset); fbb.addInt64(2, object.dateOfBirth?.millisecondsSinceEpoch); @@ -721,6 +737,8 @@ ModelDefinition getObjectBoxModel() { fbb.addOffset(42, dbNonCommunicableDiseasesOffset); fbb.addOffset(43, dbTobaccoProductsOffset); fbb.addOffset(44, dbOccupationDataOffset); + fbb.addOffset(45, studentOffset); + fbb.addOffset(46, studentEducationCategoryOffset); fbb.finish(fbb.endTable()); return object.id; }, @@ -802,7 +820,11 @@ ModelDefinition getObjectBoxModel() { ..dbTobaccoProducts = const fb.StringReader() .vTableGetNullable(buffer, rootOffset, 90) ..dbOccupationData = const fb.StringReader() - .vTableGetNullable(buffer, rootOffset, 92); + .vTableGetNullable(buffer, rootOffset, 92) + ..student = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 94) + ..studentEducationCategory = const fb.StringReader() + .vTableGetNullable(buffer, rootOffset, 96); return object; }), @@ -1261,6 +1283,15 @@ class FamilyMemberIndividualDataModel_ { static final dbOccupationData = QueryStringProperty( _entities[1].properties[34]); + + /// see [FamilyMemberIndividualDataModel.student] + static final student = QueryStringProperty( + _entities[1].properties[35]); + + /// see [FamilyMemberIndividualDataModel.studentEducationCategory] + static final studentEducationCategory = + QueryStringProperty( + _entities[1].properties[36]); } /// [FamilyMembersCommonDataModel] entity fields to define ObjectBox queries. From d03957033615493cdf8c994b36745ae6ab05e93e Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 17:44:59 +0530 Subject: [PATCH 238/264] Added parsing methods to new fields in FamilyDataModels.dart --- lib/Model/FamilyDataModels.dart | 34 ++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index fb11927..9539700 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -86,9 +86,9 @@ class FamilyMemberIndividualDataModel { Map? vulnerabilities; String? dailyWageWorker; String? employed; - List? occupationData; //TODO: Make occupationData dependent on employed - String? student; //TODO: Add to model, make field dependent on employed - String? studentEducationCategory; //TODO: Make value dependent on student and employed, add to model (USE CASE: Education set but then employed changed to yes) + List? occupationData; + String? student; + String? studentEducationCategory; String? income; String? incomeType; String? pension; @@ -114,8 +114,6 @@ class FamilyMemberIndividualDataModel { String? vizhithiruInstalled; bool? dataValid = false; - //String? savedTime = DateFormat('hh:mm a').format(DateTime.now()); - Map toJson() { return { "UIN": "", @@ -130,19 +128,33 @@ class FamilyMemberIndividualDataModel { ? buildListForOptionWidget(vulnerabilities!) : "", "isADailyWageWorker": parseStringFields(dailyWageWorker), - "occupationData": occupationData == null - ? "" - : parseOccupationServerResultJSON(occupationData!), + "occupationData": parseDependentField( + privateClinicServicesUsed, + occupationData == null + ? "" + : parseOccupationServerResultJSON(occupationData!), + "yes"), "employed": parseStringFields(employed), "income": parseDependentField(employed, parseStringFields(income), "yes"), "incomeType": parseDependentField(employed, parseStringFields(incomeType), "yes"), + "noOfDaysWorking": parseDependentField( + employed, parseStringFields(noOfDaysWorking), "yes"), + //TODO: Verify if parseDependentField method working for new fields + "student": + parseDependentField(employed, parseStringFields(student), "no"), + "studentEducationCategory": parseDependentField( + employed, + parseDependentField(parseStringFields(student), + parseStringFields(studentEducationCategory), "yes"), + "no"), "oldAgePension": parseStringFields(pension), "businessStatus": parseStringFields(businessStatus), "maritalStatus": parseStringFields(maritalStatus), - "noOfDaysWorking": parseDependentField( - employed, parseStringFields(noOfDaysWorking), "yes"), - "specialSkills": specialSkills != null ? (specialSkills!.isNotEmpty ? specialSkills : "") : "", + + "specialSkills": specialSkills != null + ? (specialSkills!.isNotEmpty ? specialSkills : "") + : "", "workTimings": parseDependentField(employed, workTimings, "yes"), "surgeriesUndergone": parseStringFields(surgeries), "anganwadiServicesAware": parseStringFields(anganwadiServicesAware), From eb214230be2fea7f56826eea2b59f1b27f96f8a8 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 17:51:11 +0530 Subject: [PATCH 239/264] Changed Deployment endpoint for testing --- lib/Utils/Constants.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index bf6adc1..c64e47e 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,5 +1,6 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = 'geo-spatial-amrita.herokuapp.com'; +//String NETWORK_ADDRESS = 'geo-spatial-amrita.herokuapp.com'; +String NETWORK_ADDRESS = 'geo-spatial-avv.herokuapp.com'; //String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; From efcdb6b66e594cec904e4545e50d5a7c1992c186 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 18:07:10 +0530 Subject: [PATCH 240/264] Fixed bug which caused data to persist even after closing page --- lib/Screens/FamilyHomeScreen.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index c1451ce..6f1ff5a 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -37,8 +37,6 @@ _getUserID() async { FamilyMembersCommonDataModel? modelData; class _FamilyHomeScreenState extends State { - var store; - void initState() { super.initState(); setState(() { @@ -282,9 +280,8 @@ class _FamilyHomeScreenState extends State { Box individualDataBox = store.box(); - List i = await individualDataBox.putMany( + await individualDataBox.putMany( modelData!.individualDataListTransient); - print("ID: $i"); modelData!.individualDataList.clear(); modelData!.individualDataList.addAll( @@ -347,5 +344,6 @@ class _FamilyHomeScreenState extends State { void dispose() { super.dispose(); modelData!.individualDataListTransient.clear(); + modelData = null; } } From 1ddc9279f34dcc0b4903d84d1083e42de8ff3ea9 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 18:44:01 +0530 Subject: [PATCH 241/264] Fixed bug in FamilyDataModels.dart which prevented occupationData from being written to the server, fixed a null exception in FamilyDataModels.dart caused when a user data tile was deleted and the head of the family was already chosen. Also implemented auto save, the user doesn't have to slide to the next page to save locally. --- lib/Model/FamilyDataModels.dart | 21 +++++++++++++++------ lib/Screens/FamilyDetails.dart | 4 +++- lib/Widgets/FormPageView.dart | 6 ++++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/Model/FamilyDataModels.dart b/lib/Model/FamilyDataModels.dart index 9539700..80cfe47 100644 --- a/lib/Model/FamilyDataModels.dart +++ b/lib/Model/FamilyDataModels.dart @@ -12,13 +12,14 @@ String parseStringFields(String? val) { } parseDependentField( - String? dependentFieldVal, var returnVal, String requiredValue) { + String? dependentFieldVal, var returnVal, String requiredValue, + {bool sendEmptyList = false}) { if (dependentFieldVal == null || dependentFieldVal == "") { - return ""; + return sendEmptyList ? [] : ""; } else if (dependentFieldVal == requiredValue) { return returnVal; } else { - return ""; + return sendEmptyList ? [] : ""; } } @@ -115,6 +116,13 @@ class FamilyMemberIndividualDataModel { bool? dataValid = false; Map toJson() { + print(parseDependentField( + employed, + occupationData == null + ? [] + : parseOccupationServerResultJSON(occupationData!), + "yes", + sendEmptyList: true)); return { "UIN": "", "name": parseStringFields(userName), @@ -129,11 +137,12 @@ class FamilyMemberIndividualDataModel { : "", "isADailyWageWorker": parseStringFields(dailyWageWorker), "occupationData": parseDependentField( - privateClinicServicesUsed, + employed, occupationData == null - ? "" + ? [] : parseOccupationServerResultJSON(occupationData!), - "yes"), + "yes", + sendEmptyList: true), "employed": parseStringFields(employed), "income": parseDependentField(employed, parseStringFields(income), "yes"), "incomeType": diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 1dc8e74..497d99e 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -152,6 +152,8 @@ class _FamilyDetailsState extends State { if (element.userName != null) if (element.userName != "") list.add(element.userName); }); + if (!list.contains(widget.modelData!.headOfFamily)) + widget.modelData!.headOfFamily = null; return list; } @@ -214,6 +216,7 @@ class _FamilyDetailsState extends State { Padding( padding: const EdgeInsets.symmetric(vertical: 10.0), child: DropDownFormField( + list: _getUserNameList(), defaultValue: widget.modelData!.headOfFamily, onSaved: (value) { widget.modelData!.headOfFamily = value; @@ -222,7 +225,6 @@ class _FamilyDetailsState extends State { hint: 'Choose the head of family', errorField: 'Please choose a head of family', autoValidateMode: AutovalidateMode.onUserInteraction, - list: _getUserNameList(), )), DropDownFormField( defaultValue: widget.modelData!.villageCode, diff --git a/lib/Widgets/FormPageView.dart b/lib/Widgets/FormPageView.dart index 40a7fbd..5d5857c 100644 --- a/lib/Widgets/FormPageView.dart +++ b/lib/Widgets/FormPageView.dart @@ -81,7 +81,6 @@ class _FormPageViewState extends State { var isDataValid = formKeyList[i].currentState!.validate(); isValid &= isDataValid; formKeyList[i].currentState!.save(); - if (isDataValid) {} } widget.onSubmit(isValid); @@ -195,7 +194,10 @@ class _FormKeepAliveState extends State return Form( child: widget.childWidget, key: widget._formKey, - onChanged: () {}, + onChanged: () { + //TODO: Decide if AutoSave as soon as changed or save after going to next page + widget._formKey.currentState!.save(); //AutoSave as each content page content is changed + }, ); } From e44e1a9127a61100c6858f703f9f550c9d39ac02 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 18:45:28 +0530 Subject: [PATCH 242/264] Changed note message in FamilyMemberAdd.dart and FamilyDetails.dart.dart --- lib/Screens/FamilyDetails.dart | 2 +- lib/Screens/FamilyMemberAdd.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 497d99e..0fc1a11 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -680,7 +680,7 @@ class _FamilyDetailsState extends State { }, submitMessage: "Submit to Continue or go back to re-record data", note: - "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", + "The entered fields are automatically saved when changed and doesn't require submit to be clicked to save locally", )))); } } diff --git a/lib/Screens/FamilyMemberAdd.dart b/lib/Screens/FamilyMemberAdd.dart index 9c4515a..0b561c9 100644 --- a/lib/Screens/FamilyMemberAdd.dart +++ b/lib/Screens/FamilyMemberAdd.dart @@ -996,7 +996,7 @@ class _FamilyMemberAddState extends State { }, submitMessage: "Submit to continue or go back to re-record data", note: - "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", + "The entered fields are automatically saved when changed and doesn't require submit to be clicked to save locally", ), ), ), From cdc717510bc9f19dd3be624927a5c1e2c85383e4 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 19:19:35 +0530 Subject: [PATCH 243/264] Changed note message for location page --- lib/Screens/CollectLocationWidget.dart | 93 +++++++++++++------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/lib/Screens/CollectLocationWidget.dart b/lib/Screens/CollectLocationWidget.dart index d1f02a2..26d1d47 100644 --- a/lib/Screens/CollectLocationWidget.dart +++ b/lib/Screens/CollectLocationWidget.dart @@ -51,7 +51,7 @@ class _CollectLocationWidgetState extends State { child: Text( 'No', style: - GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + GoogleFonts.poppins(color: colors.darkPrimaryTextColor), ), onPressed: () { Navigator.pop(context, false); @@ -77,55 +77,52 @@ class _CollectLocationWidgetState extends State { backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Get Location'), body: SingleChildScrollView( - child: FormPageView( - [ - LocationWidgetField( - title: "Record location at top left part of the facility", - context: context, - defaultValue: widget.modelData?.locationTopLeft, - onSaved: (data) { - print(data); - widget.modelData?.locationTopLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at top right part of the facility", - context: context, - defaultValue: widget.modelData?.locationTopRight, - onSaved: (data) { - print(data); - widget.modelData?.locationTopRight = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom left part of the facility", - context: context, - defaultValue: widget.modelData?.locationBottomLeft, - onSaved: (data) { - print(data); - widget.modelData?.locationBottomLeft = data; - }, - ), - LocationWidgetField( - title: "Record location at bottom right part of the facility", - context: context, - defaultValue: widget.modelData?.locationBottomRight, - onSaved: (data) { - print(data); - widget.modelData?.locationBottomRight = data; - }, - ), - ], - _onSubmit, - onChange: (isValid){ - print("IS LOCATION VALID: ${widget.modelData?.locationPageValid}"); - widget.modelData?.locationPageValid = isValid; + child: FormPageView([ + LocationWidgetField( + title: "Record location at top left part of the facility", + context: context, + defaultValue: widget.modelData?.locationTopLeft, + onSaved: (data) { + print(data); + widget.modelData?.locationTopLeft = data; }, + ), + LocationWidgetField( + title: "Record location at top right part of the facility", + context: context, + defaultValue: widget.modelData?.locationTopRight, + onSaved: (data) { + print(data); + widget.modelData?.locationTopRight = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom left part of the facility", + context: context, + defaultValue: widget.modelData?.locationBottomLeft, + onSaved: (data) { + print(data); + widget.modelData?.locationBottomLeft = data; + }, + ), + LocationWidgetField( + title: "Record location at bottom right part of the facility", + context: context, + defaultValue: widget.modelData?.locationBottomRight, + onSaved: (data) { + print(data); + widget.modelData?.locationBottomRight = data; + }, + ), + ], _onSubmit, onChange: (isValid) { + print( + "IS LOCATION VALID: ${widget.modelData?.locationPageValid}"); + widget.modelData?.locationPageValid = isValid; + }, submitMessage: - "Submit to Continue or go back to re-record location data", - note: "The entered fields are automatically saved when moving to next page and doesn't require submit to be clicked to save", - - ), + "Submit to Continue or go back to re-record location data", + note: + "The entered fields are automatically saved when changed and doesn't require submit to be clicked to save locally"), )), ); } From 6e38e7011b744277e2a5e1d0dedb3e9b181edea5 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 22:18:32 +0530 Subject: [PATCH 244/264] Fixed issue with keyboard coming up and hiding text views and other widgets in certain devices --- android/app/src/main/AndroidManifest.xml | 4 +- .../app/src/main/res/values-night/styles.xml | 2 + android/app/src/main/res/values/styles.xml | 2 + pubspec.lock | 79 +++++++++++++------ pubspec.yaml | 7 +- 5 files changed, 66 insertions(+), 28 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2f9b4e5..7aa14b2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,11 +13,11 @@ android:icon="@mipmap/ic_launcher"> + android:hardwareAccelerated="true"> @drawable/launch_background + false diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index d74aa35..b696815 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -5,6 +5,7 @@ @drawable/launch_background + false diff --git a/pubspec.lock b/pubspec.lock index 066f527..f9e9add 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -98,7 +98,7 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.1.3" + version: "8.1.4" characters: dependency: transitive description: @@ -259,12 +259,12 @@ packages: source: sdk version: "0.0.0" flutter_keyboard_visibility: - dependency: "direct main" + dependency: transitive description: name: flutter_keyboard_visibility url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "5.1.1" flutter_keyboard_visibility_platform_interface: dependency: transitive description: @@ -299,14 +299,49 @@ packages: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "4.2.1" + version: "5.0.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" flutter_svg: dependency: "direct main" description: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "0.23.0" + version: "1.0.3" flutter_test: dependency: "direct dev" description: flutter @@ -344,35 +379,35 @@ packages: name: geolocator url: "https://pub.dartlang.org" source: hosted - version: "7.7.1" + version: "8.0.4" geolocator_android: dependency: transitive description: name: geolocator_android url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.2" geolocator_apple: dependency: transitive description: name: geolocator_apple url: "https://pub.dartlang.org" source: hosted - version: "1.2.2" + version: "2.0.1" geolocator_platform_interface: dependency: transitive description: name: geolocator_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.3.6" + version: "4.0.1" geolocator_web: dependency: transitive description: name: geolocator_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.1.4" glob: dependency: transitive description: @@ -386,7 +421,7 @@ packages: name: google_fonts url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.2.0" graphs: dependency: transitive description: @@ -449,7 +484,7 @@ packages: name: local_auth url: "https://pub.dartlang.org" source: hosted - version: "1.1.9" + version: "1.1.10" logging: dependency: transitive description: @@ -533,14 +568,14 @@ packages: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "0.5.1+1" + version: "1.0.0" path_parsing: dependency: transitive description: name: path_parsing url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "1.0.0" path_provider: dependency: transitive description: @@ -568,28 +603,28 @@ packages: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.5" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.3" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" petitparser: dependency: transitive description: @@ -610,7 +645,7 @@ packages: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.2" pool: dependency: transitive description: @@ -699,7 +734,7 @@ packages: name: step_progress_indicator url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" stream_channel: dependency: transitive description: @@ -790,7 +825,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.3.3" + version: "2.3.8" xdg_directories: dependency: transitive description: @@ -813,5 +848,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.15.0 <3.0.0" flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 30ccbd7..9406cf5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,11 +29,11 @@ dependencies: objectbox: ^1.3.0 local_auth: objectbox_flutter_libs: any - flutter_svg: 0.23.0 - geolocator: ^7.7.1 + flutter_svg: ^1.0.3 + geolocator: ^8.0.4 auto_size_text: ^3.0.0 http: 0.13.4 - flutter_secure_storage: ^4.2.1 + flutter_secure_storage: ^5.0.2 step_progress_indicator: ^1.0.1 flutter: sdk: flutter @@ -45,7 +45,6 @@ dependencies: google_fonts: table_calendar: gender_picker: ^1.1.0 - flutter_keyboard_visibility: ^5.1.0 flutter_rounded_date_picker: dev_dependencies: From 035d9ef2b8846338d572f3283db0e4eaa365e2e7 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 22:29:53 +0530 Subject: [PATCH 245/264] Set resizeToAvoidBottomInset to false in places where keyboards are not necessary --- lib/Screens/CommunityDataCollection.dart | 1 + lib/Screens/EditExistingRecordsPage.dart | 1 + lib/Screens/FamilyHomeScreen.dart | 1 + lib/Screens/Home.dart | 1 + lib/Screens/ProfilePage.dart | 2 +- lib/Screens/SavedData.dart | 1 + 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 85f50eb..a240e8a 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -250,6 +250,7 @@ class _CommunityDataCollectionState extends State { return result; }, child: Scaffold( + resizeToAvoidBottomInset: false, backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton('Community Data'), body: SingleChildScrollView( diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/EditExistingRecordsPage.dart index 80898aa..961ab2d 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/EditExistingRecordsPage.dart @@ -85,6 +85,7 @@ class _EditRecordsScreenState extends State { } } catch (e) { return Scaffold( + resizeToAvoidBottomInset: false, appBar: AppBarBackButton("Edit Records"), body: Center( child: Text("Could not fetch data from server at this time"), diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 6f1ff5a..a5cdf71 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -128,6 +128,7 @@ class _FamilyHomeScreenState extends State { return result; }, child: Scaffold( + resizeToAvoidBottomInset: false, appBar: AppBarBackButton('Individual Data'), backgroundColor: colors.darkScaffoldColor, body: SafeArea( diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 19f4333..56a14ee 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -113,6 +113,7 @@ class _HomeWidgetState extends State { return result; }, child: Scaffold( + resizeToAvoidBottomInset: false, drawer: NavigationDrawer(), backgroundColor: colors.darkScaffoldColor, appBar: AppBar( diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 997b33f..03442aa 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -132,7 +132,7 @@ class _ProfilePageState extends State { )) ], ), - resizeToAvoidBottomInset: true, + resizeToAvoidBottomInset: false, body: Stack(children: [ SvgPicture.asset('assets/svg/profile_bg.svg', alignment: Alignment.center, fit: BoxFit.fill), diff --git a/lib/Screens/SavedData.dart b/lib/Screens/SavedData.dart index 5f1992b..5ae9bed 100644 --- a/lib/Screens/SavedData.dart +++ b/lib/Screens/SavedData.dart @@ -31,6 +31,7 @@ class SavedDataPage extends StatelessWidget { return DefaultTabController( length: 2, child: Scaffold( + resizeToAvoidBottomInset: false, appBar: AppBar( bottom: TabBar( tabs: [ From 68fc5192e80844a6d6b88bc724c1f062b84eff7c Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 24 Jan 2022 23:40:53 +0530 Subject: [PATCH 246/264] Removed all print statements, removed unused permissions from AndroidManifest.xml --- android/app/src/main/AndroidManifest.xml | 30 ++++++++++-------------- lib/Screens/ChangePassword.dart | 2 -- lib/Screens/CollectLocationWidget.dart | 7 ------ lib/Screens/CommunityDataCollection.dart | 15 +----------- lib/Screens/EditExistingRecordsPage.dart | 4 ---- lib/Screens/FamilyDetails.dart | 30 ------------------------ lib/Screens/FamilyHomeScreen.dart | 6 ----- lib/Screens/FamilyMemberAdd.dart | 25 +------------------- lib/Screens/Home.dart | 3 --- lib/Screens/Login.dart | 8 ++----- lib/Screens/ProfilePage.dart | 4 ---- lib/Screens/SavedData.dart | 1 - lib/Utils/Providers.dart | 10 ++++++++ lib/Widgets/IncomeWithTypeTextField.dart | 1 - lib/Widgets/LoadValidPageWidget.dart | 1 - lib/Widgets/LocationWidget.dart | 1 - lib/Widgets/LoginFormCard.dart | 1 - lib/Widgets/NavigationDrawer.dart | 1 - lib/Widgets/TagTextWidget.dart | 2 -- 19 files changed, 27 insertions(+), 125 deletions(-) create mode 100644 lib/Utils/Providers.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7aa14b2..64ac89f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -4,40 +4,36 @@ - - - + - + + android:windowSoftInputMode="adjustResize"> + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" /> + android:name="io.flutter.embedding.android.SplashScreenDrawable" + android:resource="@drawable/launch_background" /> - - + + ^A9Ii!;9r-P?_AmUqmy^`&8(>cY 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 QGynhq07*qoM6N<$g7f$7X#fBK literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..8e30ffe78eb9d3b3652d8d04e8549159ed7f2fd5 GIT binary patch literal 289229 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 -7Ob*yB>Tv@M`~uH#hx8P7 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 bUPSqSYYj}&U^w#Z00000NkvXXu0mjfaU;0O literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000000000000000000000000000000000000..36a2815eb74b311b3a40650157c13c7ab8f84691 GIT binary patch literal 4408 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 YKU%1t2?59gh5!Hn07*qoM6N<$f|sJnMgRZ+ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000000000000000000000000000000000000..1cdae3f337b2f2554ac6095b6aad9c00c9587140 GIT binary patch literal 10060 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png new file mode 100644 index 0000000000000000000000000000000000000000..aded42ec4316d5494b305b0422c303aba389571f GIT binary patch literal 727 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png new file mode 100644 index 0000000000000000000000000000000000000000..a5743331b6ced4baac9c77c4a0773ba6566c85b5 GIT binary patch literal 14989 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 LNkvXXu0mjfoSAVF literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c52296a794e8eab542f81aec98d1350b6fc863 GIT binary patch literal 19356 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 P00000NkvXXu0mjfchVaj literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png new file mode 100644 index 0000000000000000000000000000000000000000..2974b62b51443d2361619c1d3604590a9e3391b6 GIT binary patch literal 30569 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa41805c4bf81ebe21d30138409ea452ce1863d GIT binary patch literal 1465 zcmV;q1xEUbP)Px)b4f%&R7gvumsxC7RT#&A=iEEDGi|{tg<>FLgs6!`Et{h3F1#2NDu~2jP~pXe zB_P5R4?eh}BJqI`Kogz_qVYvz;EkmuDk=?VFe!#w3)9kt+3wtPjyd<U;lvC2G4VG9OovW`u{~Kh3^MQDOkF6F`G8OhLjG%7-K&A zU=IiOA7WfxZJdq4*pzNDgb>)LjkdNlYt}4h^V{nXjg4o_`ZsrwN+oYe&f)U2a_4e+ zc747Bv2E*n=Gf5_R900E2^!{WUrhM;-(f+snJkN*cpUNElC>tC?!a}OaFhFn6om39 zZLpp)nDDbB!Cuogfe~h4RSp70?btDhh4WXMfiATR+Q{TJfr82kK~+-Xx&l9do}3Eb zD-wc~8-tIKyL2RC{@fM)a&@F2=WDbwOuM&|h4s};y*tUcngmGbY3?H3p6BNl#j*26 zE_5iWJb@E49|?9pP%B$^Rx^3L#~Te}ne$LJB0ib6GkGo- zG$}_63mk$<37MQ``jkpO-8d1?6$E*Wn-ByV3N76+V8mKDP{cr4&#iIEyn9gg8^~-8my>u+a?tnxLSdO7;RwM#24x!YZ3%|F*g;vRtt}M-d zfG0%RdKPo%tS~80aB%x1#@vwrW$a^6Ni9PwX~HtJ5}F9GsTF=}5sY>PO*xmx$h#51VH*=>}v2(*jj9&umHBBg~3x#Y1Sdz5F&;p)q5hR?@TV%B1U`LjmG2!Py zLF=bCm{%8%;q{m5D0C}=Rts1lD!l%tDFeEsK!?TBfJcS=w?%Iw~A8B9eP>d1o#+t7atG{B)9#q-`b+3@nRs46UTrcqgx9 zXv+swNWrCq#JA0&9O%qPmzxa!-0TFDJTf|Cn1Myf8mK_+s>D( zMsZi2L$+I^FAiQ7)}?(-qcogMM+`kFLS|i#Ank~<(pvIj(fk#rGiO*mGs*gSNjlF3 zq->v*y@g*Yi;`(dF13J{W5AMUEX$#!jX)QyG%C<&37^eMQh%GvwZMdXTj9dlxDI<6 z+T+oL4EqAw-*-47e3mni1q}PCog6yauM!}ckP_^AB*plY#5aa>tm<5#k@ z7oxJT2ZG%@Yn-0gL_;<2>(k)w9r4`z;U4zyJ49VwZFsU2l@8^--I3hmxlHgJF827O z3q@QR86_tKdE3Ziwu2r51LxjXma}=wy3&NN`DEu_jvW3Tr8N~^BAoE;g2i~;bBX34 zD`Cm0Lm4KVIQmTZ%NiE5aZ^0u4|gw9TDULRa5GT2*Vpf5rm*DMCz(CF_g>~d{GSog T;v$HN00000NkvXXu0mjf%51j# literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png new file mode 100644 index 0000000000000000000000000000000000000000..49fdcbb57cfae9ef96576eafbd2849a9d09b4b79 GIT binary patch literal 1661 zcmV-@27>vCP)Px*H%UZ6R9Hu~mtBmUWfjMN=lz(S+1U?hOS`p}FB5wMqFV&qrCkaa6^(`pEG9%* zftnZ-@Pbw}8iq32$-z@F#fd9Ee(NgM@>qL?U(*tTtq zrw)9V$vbbgBt#={;>0O_@Z`_%T$fxfYd`q7$}c6Zkx)TFP`5;WefSwBCUzpr%PZzP zGY9!#VbOxear{Y$zU+Uvu4_q*jcwwkBhMo*A9>aM=J3mmj12wX!P~5qM5$Eai6>@| z{g3_7%+39afq_iVu#14c?J@Sn|C*m_N2Af?rki#kU-|MQrd+PBnQ#i|h!7`+Ffv53 zAu;+4JkP;*!F90D)=Nh7Yp6(4UO=^Gc;(LlN9US|3%;bbT*>JWP~~v~+IpUOWQ;wNqYxxSp>|0j5utvrNG_;@ zC#mNK5(mN$6Y>`fvkMW=zFpU!k!j^dKN71Vpo#X2$G5U;VwA8Lp?RRqFfu}8zDTx~ zf~O^bRbM+F;}i@U`+Qb7S%`T0Z*>yvqrS%yP@t7c%=f>(kw>RDTX4@2qy=u3*8{|L zI?5G1IG^AY5?nXsqfQME3cq`&$qT0&jQG;m3b||dv}uHf8@6Ql{g1B2bp=r?I^ZR8 zK@B|TVs^QzJi%3PFD*fR4|s598QwlC{9&m^A&T)udM2gZJ@t@L^*?!dGyC>#AS%ar zp4hOb%Ih}SI+fZD-csHMKf4TXz9$TdFjo(Gy%dlYv36YU$gVr5P0kmN{`fjJZS-w1 z$Mp8xEtpQ&yTMPsmzJRhs~Q`QUZ@cmgWIDt<+j@%FrU9M#|sCpwY3w`R^H!pEj4XG zs=N)ZrL5OkR^X2-0sn494D_%;#&3PVeC_rTp8ejZXjT)N@0Zu*`PmgXc{)|Dd84E} z5rQb@*m6L@82nxl_`>-8=9~9i&B2+il>V_yzPUcnJIY(&z9W>wgug6SIb#y4zJt@c zyw=JC8Q*!oxo>impMG_i=3)g`JIEz<-qUlvut>wM8DEKFW*4gjVZutrVMTjMuO$59 z?GKteuJ<|oV4f&$HIG)4xwOuEd7crW+ybveiS@nU3DtfCCMKuN=DhIAw}x#e(}75A zhg-YO*YaGIEBNunD%B`K$!J90_Z>o=BYH((&(yT3HVnVKFVEzT49(EcSZaZ-C#)gi@G>y%r@l0Tr<3z=B>_eVVcC**$G44a3xDd=5wbXO^*Hhj-5#{(2@YBW*Hm&({LicB_e}%IhtgF5CZGL+Q;o?^r#Snt4;`DCSpoH5;dEIX%Vm zhhF5|e+qbhx}3U>V^u{){WZ4C^tNly2CBB7VkOmHPQx%_`}VCobznaelU>VcXFV^L zIriG0m_7d1s`b1L)V?CR7Nq_&->UU|C;Ps!m(kJT&U*e|r+uNjP4fiY00000NkvXX Hu0mjfHdQ@y literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000000000000000000000000000000000000..a7bfc3dec2d994d65bf305683d3c75ecea837b69 GIT binary patch literal 1999 zcmV;=2Qc`FP)Px+iAh93R9HvNnSG2DXC22s&&=%W-9pQYS_rg&QYvi}f?(x1?rNDI$ zHdYMSU?plLX^Uvk6q`a)(`ZeNFR}3t6YYPBCe}LyL%{@*GXZN`O5l#YyS?4no!Oar z%#Jk-nS{Er|ym9)UXE=D^MNXXf2SE_xI1Y|u zBR9JiOExXf34#FIwpq7+E!($0#4YcA_ZXxK!%&NIul)HayTA1`u3M$Oz0E+$4X(Cw zmv2;_6APdzmn&qmS@wQ+7oD9O4Wv=9zyB;>eE1vYjdVIq7>3tEuxalpD*C=}TX(0ah_<%;+XhffT&cL+eb1e!2R`$t{`c88NT*XR1%&vsiRt7j z?ybeeY*kKCBkDI$5A-8B4vT3(nx^k z2rJnmpUPEC@Ejn&%)HuQ@#D=o zLW6P?m7<5$fQuS%F`+~ZlrKhbE@FOGG2}&j^LUL{iy;N^*%>N%g@O{D`@gi5jT;Ko zOM!{b159$l?#-g85m7rwq6$5Q5p>MFv$aY>POAfpt28m)2I^~txWqPk=2{d%|(^64@nqL%MN|DBH!OW_&qenXy{AAa1Zd{f@hu{uPo#$o)XHuk6)WV3DiY`Un znjfl;%{{t3XYtF&mvjBXH06QXScRA@3C|Wz+@>CB{yI?MR21Pk%J}(oOLc6%PtVKS zy!6BhoO(d?)-X9ob1mTd1}hY60YhnvQA>@dvMDGHV0+Hy`EBpwhQP(v5xTj}Y?QCL zDCb8JhX-5+y@0HxIPX|g6p2b3+v1*bLtGk{%NdbAYu>#~ZU zK3L%THbp44d0_lhGNHCMm9HcTCwZTc?8S9jGvT8JrkJ{7(FDCd)KUqQ9s(Kd*T1t~~Fo z#HA?-=DET(L^tYHW}==1Qqp$HA)!>)bS-xH{s*$un#MC`&(kPZm4KK;xx}<1wqnq3 z-LzwEXLI8&u_cfXtw^(dZHB5ZGRA3VDzmzQL~DhS%gma(ZE4bK5E3G0<7=85h z9n+8P+)Fl-A<}WTAdu2Wd}N73S0O`r#75bgpb^e;Nhw7|loPmm9If(e(_qPz6cDox zHO^J7!WnN;7QXNC^bd9?>*!!KYv88zgoD9+X`_FLj*%vu}eDWcB^BF>RYmm&IBK5wS}36q&o%g>re|A+ft<aIi?NcJ2O#ShQ#XH?LVm hclYgVp5$+c{{oWqu@!O%L7xBs002ovPDHLkV1n*z=f3~| literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png new file mode 100644 index 0000000000000000000000000000000000000000..71ed69029f70f4cee9effaffb7e1750a9d761415 GIT binary patch literal 2542 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000000000000000000000000000000000000..95468674caa7f9d1a95af1a6b6ad5b82c0b2978b GIT binary patch literal 2691 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png new file mode 100644 index 0000000000000000000000000000000000000000..39ed20fd415795556ceeece3c52eb22fb4351601 GIT binary patch literal 96106 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 Q&j0`b07*qoM6N<$f-mSCs{jB1 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000000000000000000000000000000000000..ed1c1f21d48f2f068981ec7b8c4e988bc4343540 GIT binary patch literal 3053 zcmVPx=r%6OXRA@uxn|q8@)g8yb=RW4Ovrl(fU_r{G1seg;CTLq8vHioYlv*AOnzVpO zuo0y(qWGw7wMtcJ)mW|CDrf>kz*d`rX_{(UjkW>gl@vvng)NU=*_qj$$DO&a)BMhz zyE{9~>@GVq%fpjQGP`ph=W~9K^Eofz7e>lB?b7c%bU=& zXpZP+CYu0uCCj;u^-sM70(L-Ep&B`~{zBkAs}BTDrbyZtk84=a)QEfUT?xh{(BKHo zv~61e(}hny@q299{5EQ8Dq-7>%3O@i1rLWJSakFEao^gX2*C+p%d$AZZr`>G>mGj& zRaF(REc;^QJgd*-Zz7Q{Jow-pn78124m3&l)TwqXTXK)kf4b;mm25UKNtB$L-|xe# zn>Jv?h+z;m{Pb`Ch}U0x6IE4};(|-52`Ps=@#CfQvHGXCf`vj6e(TaT!Xv9HN%vC1 zB}WAqh9x}rtDBwz+qLsu{^%pm!sGE=GOCpgUm%tuE zcp7l>Q*73ZrgMHR$&VHo1gGgXh1aME$QWL&U`(Bg+G+)UpA1z2EE9-oHcp*LpsmZo z$u1kwl=Dizhe45OWg{L@@<#nWXJC?!VF8Jxjmk0!S5NR`#^fNTj`w3^oeEWD5Mm@L z$_%gpttARyG!C6}oCw=Ebkf2HM-A+0H4#a21YGbTpdK)=W1Eh&s>@_FPOre+Z&zYm zgBS2Hz~tgXYDyAg;4s0^c|3~BR04`e68B4TdLT@W=5`Bj9n|s8e|3a4j-Z!TJ*AcQ zfPf{MyloCc=eYi=AePUm#rSc4z_elO1j!+}BO=z*#Lm#!8bw7i4q1`JKoBqi(RX^L zLfRk!E$tRw{FjD*d~U$2Fes!LC6ac(z|{Ga!QodK?)+gLelWXQ*qW8H(usiHrbpb_ zu=zZ*7zANhfPT!v-wx||?ud?r1^DFBK=%nu_8L!dG*l`0)omkj#T9;7amT~B-Z>NZ zTwv)wdPdR&V$CK3NubQfaNvxIUmQr`WRjyy2CO1WIxjG(oThV(u2He!js}dr+zT^q zLna%{(FO%;0Pz+RK@9+TbQ>sBftD^C_wG%iRkPujSy9zHCosY4CKt}>*;S)3cAT%| zuzAvaUd>XNE_ihal1Mtw)RisHPw}i2NV3_JunYbE zDH9Lu*Bpmfq;?iC*==Xs#_f$YxUFdz%-GPvx?E(tWgdp#>`!7#tATR0II7(Xm{d8b zb9{BA7cbs38XhkLth6W18sTEtY`*Y{yt+pLj)s7}$AGOJ8rp3Os+ipiYgxby@uY<( zmXE;fZ&kvKTO$6=ZbJdv9OBsB!r+%A9M%l{rAvc{(y@i{_Jo!+MI=%-CXeyqg}XEC27D)sr^x-zJEt0@Vvv4VQOPGM82^;q>9)@{0)Ht@ACEX!~rFq)1DEJw} z?zoP>$CB_CC}jamlB78>=x5ltW(mXE;9>ncRNOj5rPU|k85?H)-Qc&k%` zQh*%`V4*S+@Z##xm@v)Z#?`Jl$EOp9qmG8 z%E?rmPsuv48b0YtL6sORh9Ur`RXX5h*tm8K0$K{bSPY7K{$US9k~q?pgp!W>3U^(I~R(Ha!m_Y@>?hkADEDtP!n~dS4TIBU` zG|92{dOzk*_c>}!>ruHhL51sxNW1ohHGCd5M6xcI2PPHnlo`$xsLo;@b~n@L#R&tr zvR=mXi-Q7|V(FCGJC#}t$r6+sPVNh7XpZS(p3OJi(ErIh>r{3$SmRCKcUDd-u5&!z z7{GU?dJ&7+NFFP$8fU_OoQ8F$o@^GnmeSx+3HU;B_NEGLX8~&l$Jc6QJUu@Me%gjV z&cSFgnrHakgxf$C0zI${dqWAd^dnhs8WCp*Z489T1MP(ytXr1PTsh=gJaLJzSpze zY7AgcNJC3}V6aIBw5gIv;uWmQj6qN7m@;(|l`Xx%w{PEx@?h_>C9#=i0S!KeC$8~f ze1!u|FZU9xSiDmZK;^r+T}h^c+TEey*Z^Tu1gl6ei(t1RER`k1y5gd`mhIa49)I+a zXL6P;kwj^)w%*I|%PC$=tyN%hE+o5mfRd#bl4J)8t1%~Drlnw^l6A#EHJ4PF_AnKu z^;ddGl1|YEwFIo1~Vl-E>-Ym&x4h%(3QQ2Ack#j0!6_m@1xaGrC-M?|udejfE>nRZ5 zv3(aFf9!Xtsw(fZK%6>7oud*Y+5%}%WlZoY7^%vrpwuS^_JtB?P4re{$}N**X%Ud5 zeJt9kB=s!;XpeLybVj0h;GtERH~)s70`bfv09!Y|jjEbT@P3W}5IA*~z=h{#3{|oO znRCPpOYHO!Awkl0k3GZ2GoS5f+=Li5pDAb9?x6H+T_ubxe1R(bzkDa25 z+~ev0kcX@40xE5s6|6Fx05vQmsqRLtF$W-0GuxSqNS+k<|ArJT5Qsz+?Qty{v z+Jg4>j&nN3DJfa^mUBqwiS!9U}0lAQ0h6Nl=q<4iT|C(jvc$w2erPx?rAb6VRCr$HTX~Qa)gAs`A2U0%vnMPd3rh%!!U~9>##CX-2pSb3S|u@wRa9As zsI{pe5syL<#3LS2@Q6WE@z11!Nj#FWASM-~Xp|cS1y*2n7jW5~ncbP`p6Tg+so(4A zxpuDI86c3Zf-TsY?*6{t_q*PEKgK!d$hw^WVvLF3bR6l#r=RY^zI_LAUtr->Ryjy4r)LrePR2t{IaipNmT_orac{(c*n9i-Vvzc+y{zWfMRjmLwba zmMy#Rmp^U9)~&nY_Xov|R8@g2OX6m^Zg@HvAcN5#)3k(9BuPR;V;!bWy#O~axE?cS zPE8WwU~}Fxg8<92#FtNW_hQ|;*Rg5izY&j{@Oa!%6h(Z;dD!UyTI`wWMv2Gc(6lI2 zRmPk-vv7CYLW~$O3=YNt1USF=Y|j^1`S5c%eCTV`*7^X6fm=4iXVR4-gQKr6gqD_O zta|hwOqp_i1_?p|4*0!$58$4qYY+_d37;bCpADC+$k4(XYU^t7>~ky7+Bz{w0<*}m z0d#-UgFEkBfv(Qu@OnKk&9ei%V?bG!5s5_5+9wUPY1N_xIt38?M45tCtG57A~-5%WkyY{jdmj2|=6<%Fl^`j2(?e@xn`w zV#bUMZ2}&=|0!(R^Z{yXs$p8zSqq+kQ3|J^IOpnFc>IawU>zNueDR_O5DrHm$r5m8 z1^Yo8iwYvD7pi?;y!zUcU>pAUSN`-<>*4iQo%Ql}*rH-6647z*eRqJZUbU9L{nmT% z`Me@E{6Ab&?1e%R%$qkGY|(AY`QE(;;c}^GT(L7$V^JWC#SBbtJr8XD+(o?C9}p#Q zB`(o)P<~A`Qi&h13rVUd?J#q?3rkXa&mdM64l76lj%!{neM z((W5z& zO)AbAuAV@zLQpwtpQ* z$l&m(qz>RzDq>Is2&GFvSmW@x7_OY=!;M$eVe)tn6fdy?AZ~$MHVEn>namK;Ikb)d z8d*%#8X`^*IWmA4$Nu9c-rOC-ru{MaH4dMf{AuINm4jnh~yN`8jJP?B_F{r0N z4J8pkFG+sxQW%z8KMXg|Zh+*HVCt4I6R9FSh6?ZsgQi&s9|>TX6oW;6lPB5;$#X#U zFlgN--uonqUmq~g8?)e57|bC@sp8S3C;utbC_@G?ZA4ERr2kh)AXxFsA2npm?-$G(1!8U-hfgn|S(;3te!@#G!N7(31l zBV>wHmNRP-5CzaQE@a=3kbNQWjEGTyzzGv_rv;D9C@jFI06jX#LpyYA@tdeQNlM5| z02xg;IGP(&Jm1!g<}q%>!xm%;T)8e`MFveL*$2@m**;&axgyI4x-G~@EqKW16Zajy><*GUR6axGB!B{0+@we^;l;Kwn0THC@vv?AoY)fqPk zg9UF2OXq9Dh=gjD;XlU>+`l7QOi;z6Ue+fD5I}z47qM{tB{g{Dj?plqTvTbrEbsWd zSVb-n@Wicz>`lmBw$B&pLFr!fPSF^!W?KyZ>NDW2pb9bw5Yo4R+A0aJEgOqbqg=3z z+yvyy^92K*1766!u;oSTM5&RogU0dEmkfP6!-hZvJ(fjrvm$E9Ab^+-hAk}q!7wbo zr3q%3HcAHCez197+#!)6M8NAB1bCfeb2~#g%0wpE8j4|KNQaxT$`W8(pQENq!f$`k zf>9$~;D)`YmVT9!=L0>ZS)N>i+KGV9@j*L-9<_S}x(tis_x=caOb)epk|`P!k_sS8 z_eU(u|4uDd+&)@Vc>{c3SkbQV%E|MEeBJ@?Pgq_f@N%kCtYQrBhoaaVj#fkk83a)E z_Uw|;xO_$pEGIcoC>=_{K2t2ftQ17a&VV z;~eMID|mI;STr=Ku;MBCr>D9~=J^cQ0z~se;6H4qG@P=0Hd)j=yy1_aD{ew9GZqL1 zko-dt3s+3>;hCQ`!;GaO|H;nt8PPsn_IY|IauE+>c(+f(cFh2}L^-`u1_8HS-GC)O z9+`~(8Q>GO{mIDlBGu`@hwVrPynLV>0(L}V*x0XENCAvGJ_{>T2#8u(cULnmn_h!>#DwCKO77?Bf ze0mI^1=Y`kI(GC$ah!5xnV0PX42VQ6tiNY0re07@$rf64@cn#Qc|MWq3gIDZ@9WdC zFQCJc89FIymU(3mKm}0iWG}*g6Z%&}@8^e_=ksA9*;BON7u2!0PZzR}GvMn=5`A7>cT?eDapvYCM zpC4+T&-VGxg1WFiS)MNXTW1W%s1`2sO1eNe#?dy*i(4;uA#P+Ya^`wQ3jE+38xin| z?8G~=-xJjFd0%F_Bh&Ot4BbkerMW?nk|dx%%5lp@E-bsY8Zn(Gx2>}8HI#mSFnQj2 z9!2}l0%ZAUvJrBAM+EfB41SrRxK0bRk)eR;%?e(;*_U^pFbRIJ{rn*EJiRV~-|g4& zMV>;3-s2mEAtY6Z0J@>G^z@q_`OwlN!^mC;DYKt1mgkcjsElDxzy|O5e7X(AyTT5D zlnKg>0;z700ptcNW_vMzrW;23QW(9R3<)`! zD8_N=SOser_{27t*bB_DZePhfp8^l;4n(oPNPSQ5M8S`OV7dOEL4YGO+VNR;Q#CFc zuL>2&YVLLWd^x*NKc6og$&6u_U&Db=v|w}N)$0%j?Bo*qu%cltFPB=AM*0s^ly;3!F~63(Bn-hd-AVoNLzjIU={JHvxI zg~6bmpFH|aE?t+{&nNRd7M>+>IzBfwgm z6ErsZ`n%exH6!?$Ooj_*-vog3ni- z^PnW{6g}AL!gb?Zpnk#G@Ex#jUn2M&ehuxR(!ob)6}W;?p9ruIN`^6i{v5Ck8~(! zb@$?~B`eU`c@$o+x9HH6)0Pquv^z6Wkug@41QE5eg!aBDzKX<>8<--PQY%Zl(3FNK z%}Vx9Qqai+E~?JN(A1bQ_R!Su;fbNC?6J9JOV=P!;@F(?(gZHf2?!U5KZy{NrcBfJ z))Pkog*phZ6Wl5p-Ser0EKj4pb-BjooY7flc5u(0{aCf~c^o>_ftng0Sc!v^4jBZ@ zNn5$f+fxD9DR#);DTULF(D?CVv1;{Fv|gB+85EyOpB;8c=;`s}g|)9^GYf5P3x(|Sj?SiP~jd!ta+aC1x((tqen$$iMhNl}F z>o8^N1z50PE@sS}Vh886!Eguffa!5jz$6A8oJs4BjxK!q$xeHG{z#{oGW}l~pLeM$ lyfi*PA~8Ncsr2#r{{pv;I09ebJQ@H1002ovPDHLkV1hOAszd+) literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000000000000000000000000000000000000..9d12c671dc920579d1d6e53002f4c7345f636efd GIT binary patch literal 3880 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 XpjJJ-Hi$+E00000NkvXXu0mjfdUb%Q literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfac4ad5e31ca38793dbb17afcc8980387cfcfc GIT binary patch literal 4288 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ 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 deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ 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 deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 zcmVjJBgitF5mAp-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 deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8CFBundleInfoDictionaryVersion 6.0 CFBundleName - geo_spatial + Samagri Spatial CFBundlePackageType APPL CFBundleShortVersionString From af75ecb3cd2289f8ce78e58389fee5edaa7ceb1d Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 25 Jan 2022 15:44:59 +0530 Subject: [PATCH 255/264] Added icon background color asset in android values folder --- .../app/src/main/res/values/ic_samagri_icon_background.xml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 android/app/src/main/res/values/ic_samagri_icon_background.xml diff --git a/android/app/src/main/res/values/ic_samagri_icon_background.xml b/android/app/src/main/res/values/ic_samagri_icon_background.xml new file mode 100644 index 0000000..74a956f --- /dev/null +++ b/android/app/src/main/res/values/ic_samagri_icon_background.xml @@ -0,0 +1,4 @@ + + + #3F3D56 + \ No newline at end of file From 5aea8b28c429b7922381718c9ab9c80c57166f75 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 25 Jan 2022 18:34:26 +0530 Subject: [PATCH 256/264] Added logic to signout account on invalid JWT usage, i.e, when passwords are changed or user deleted. Modularised logout logic. --- lib/Screens/ChangePassword.dart | 4 ++++ lib/Screens/CommunityDataCollection.dart | 3 +++ lib/Screens/FamilyHomeScreen.dart | 3 +++ lib/Screens/Home.dart | 2 ++ lib/Screens/ProfilePage.dart | 3 +-- lib/Utils/Constants.dart | 4 ++-- lib/Utils/Utils.dart | 14 +++++++++----- lib/Widgets/LoadValidPageWidget.dart | 2 ++ lib/Widgets/NavigationDrawer.dart | 2 +- 9 files changed, 27 insertions(+), 10 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index f257e56..bfdbdbc 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -6,6 +6,7 @@ import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Utils.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:geo_spatial/main.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; import 'package:oktoast/oktoast.dart'; @@ -302,6 +303,9 @@ class _ChangePasswordState extends State { if (res.statusCode != 200) { showToast(res.body); } else { + // storage.write( + // key: JWT_STORAGE_KEY, + // value: res.body); showToast( "Password changed successfully!"); Navigator.pop(context); diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 56e0c37..bd3fb4a 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -126,6 +126,9 @@ class _CommunityDataCollectionState extends State { http.Response res = await _makeRequest( modelData.toJson(), "/api/addCommunityBuilding"); if (res.statusCode != 201) { + if(res.statusCode == 401){ + logout(context); + } showToast(res.body); } else { Navigator.pop(context); diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index a77971f..9c60aae 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -170,6 +170,9 @@ class _FamilyHomeScreenState extends State { modelData!.toJson(), "/api/IndividualData"); if (res.statusCode != 201) { + if(res.statusCode == 401){ + logout(context); + } showToast(res.body); } else { Navigator.pop(context); diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 33e8180..3ae2bae 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -37,11 +37,13 @@ class _HomeWidgetState extends State { "Offline mode, data cannot be uploaded until device is connected to the internet"); } else { String jwt = await jwtToken; + print(jwt); var res = await http .get(Uri.https(NETWORK_ADDRESS, '/api/validateToken'), headers: { "Content-Type": "application/json", 'user-auth-token': jwt }).timeout(Duration(seconds: 30)); + print(res.statusCode); if (res.statusCode == 401) { await storage.delete(key: JWT_STORAGE_KEY); Navigator.of(context).pushAndRemoveUntil( diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 363800a..4fb8305 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Screens/ChangePassword.dart'; -import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Utils.dart'; import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; @@ -70,7 +69,7 @@ class _ProfilePageState extends State { IconButton( splashRadius: 20, onPressed: () async { - logout(context); + logoutDialog(context); }, icon: Icon( Icons.login_outlined, diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index b170920..de124d3 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -1,9 +1,9 @@ //Server ID Address/URL, change here and this constant, avoid hardcoding -String NETWORK_ADDRESS = 'geo-spatial-amrita.herokuapp.com'; +//String NETWORK_ADDRESS = 'geo-spatial-amrita.herokuapp.com'; //TESTING SERVER: -//String NETWORK_ADDRESS = 'geo-spatial-avv.herokuapp.com'; +String NETWORK_ADDRESS = 'geo-spatial-avv.herokuapp.com'; //String NETWORK_ADDRESS = '192.168.29.126:2000'; String JWT_STORAGE_KEY = 'jwt'; diff --git a/lib/Utils/Utils.dart b/lib/Utils/Utils.dart index 742157f..a34fa9c 100644 --- a/lib/Utils/Utils.dart +++ b/lib/Utils/Utils.dart @@ -31,7 +31,14 @@ Future get getUserName async { return storedUserId; } -logout(context) { +logout(context) async { + await storage.delete(key: JWT_STORAGE_KEY); + Navigator.of(context).pushAndRemoveUntil( + MaterialPageRoute(builder: (context) => Login()), + (Route route) => false); +} + +logoutDialog(context) { return showDialog( context: context, builder: (context) => AlertDialog( @@ -62,10 +69,7 @@ logout(context) { child: Text('Yes', style: TextStyle(color: colors.darkPrimaryTextColor)), onPressed: () async { - await storage.delete(key: JWT_STORAGE_KEY); - Navigator.of(context).pushAndRemoveUntil( - MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); + logout(context); }, ), ], diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index 7993840..bdc69bb 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -48,6 +48,8 @@ class LoadValidPageWidget extends StatelessWidget { Future getVerifiedJwt(context) async { var jwt = await jwtToken; + if(jwt == "") return ""; + try { var res = await _validateToken(jwt); if (res.statusCode == 401) { diff --git a/lib/Widgets/NavigationDrawer.dart b/lib/Widgets/NavigationDrawer.dart index 2b58be6..fc6ee99 100644 --- a/lib/Widgets/NavigationDrawer.dart +++ b/lib/Widgets/NavigationDrawer.dart @@ -79,7 +79,7 @@ class NavigationDrawer extends StatelessWidget { text: 'Sign Out', icon: Icons.logout, onTap: () async { - logout(context); + logoutDialog(context); }, ), ], From 1421c69024f6df6ea1aa2b6b3155849959d56563 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 25 Jan 2022 18:47:26 +0530 Subject: [PATCH 257/264] Updated version number --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index e9fa566..47b8485 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 +version: 1.0.2+1 environment: sdk: ">=2.12.0 <3.0.0" From 2e32ff6654e5e3999125c4316b6476a03d743ddb Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 25 Jan 2022 18:56:32 +0530 Subject: [PATCH 258/264] Removed unused libraries --- lib/Widgets/DatePicker.dart | 61 ------------------------------------- pubspec.lock | 7 ----- pubspec.yaml | 3 +- 3 files changed, 1 insertion(+), 70 deletions(-) delete mode 100644 lib/Widgets/DatePicker.dart diff --git a/lib/Widgets/DatePicker.dart b/lib/Widgets/DatePicker.dart deleted file mode 100644 index 3911f5d..0000000 --- a/lib/Widgets/DatePicker.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart'; - -class DatePicker extends StatefulWidget { - DatePicker(this.title); - - final String title; - - @override - _DatePickerState createState() => _DatePickerState(); -} - -class _DatePickerState extends State { - @override - void initState() { - super.initState(); - } - - DateTime date = DateTime.now(); - - var textFieldController = TextEditingController(); - - String getText() { - if (date == "") { - return 'Pick date'; - } else { - return '${date.day}/${date.month}/${date.year}'; - } - } - - @override - Widget build(BuildContext context) { - return Container( - child: TextField( - decoration: InputDecoration( - label: Text(widget.title), - ), - controller: textFieldController, - onTap: () { - pickDate(context); - }, - ), - ); - } - - Future pickDate(BuildContext context) async { - final initialDate = DateTime.now(); - final newDate = await showRoundedDatePicker( - context: context, - initialDate: initialDate, - firstDate: DateTime(1900), - lastDate: DateTime.now(), - initialDatePickerMode: DatePickerMode.year, - borderRadius: 16); - - if (newDate == null) return; - - setState(() => date = newDate); - textFieldController.text = getText(); - } -} diff --git a/pubspec.lock b/pubspec.lock index 3f3a7d2..e5c1587 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -714,13 +714,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.10.0" - step_progress_indicator: - dependency: "direct main" - description: - name: step_progress_indicator - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" stream_channel: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 47b8485..46e4379 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,7 +33,6 @@ dependencies: auto_size_text: ^3.0.0 http: 0.13.4 flutter_secure_storage: ^5.0.2 - step_progress_indicator: ^1.0.1 flutter: sdk: flutter @@ -44,7 +43,7 @@ dependencies: google_fonts: table_calendar: gender_picker: ^1.1.0 - flutter_rounded_date_picker: + flutter_rounded_date_picker: #TODO: Verify and remove5 dev_dependencies: build_runner: ^2.0.0 From 20e73adab5b9121c71f8834b4b280d5a2aa41c6a Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 31 Jan 2022 10:05:38 +0530 Subject: [PATCH 259/264] Uncommented JWT saving code in ChangePassword.dart --- lib/Screens/ChangePassword.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index bfdbdbc..9e08202 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -303,9 +303,9 @@ class _ChangePasswordState extends State { if (res.statusCode != 200) { showToast(res.body); } else { - // storage.write( - // key: JWT_STORAGE_KEY, - // value: res.body); + storage.write( + key: JWT_STORAGE_KEY, + value: res.body); showToast( "Password changed successfully!"); Navigator.pop(context); From e21ba2a68898ef3d82f6ab1c1a6e10eeb102abf3 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 31 Jan 2022 10:11:07 +0530 Subject: [PATCH 260/264] Added logout logic in ChangePassword.dart when invalid token detected --- lib/Screens/ChangePassword.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 9e08202..65da1ed 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -301,6 +301,9 @@ class _ChangePasswordState extends State { _newPasswordController.text); if (res.statusCode != 200) { + if(res.statusCode == 401){ + logout(context); + } showToast(res.body); } else { storage.write( From 4d70ed897082ec0756d24a0e4a8127ef215da8f6 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Wed, 23 Feb 2022 16:03:08 +0530 Subject: [PATCH 261/264] Added new village code --- lib/Screens/CommunityDataCollection.dart | 5 +++-- lib/Screens/FamilyDetails.dart | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index bd3fb4a..8c653ec 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -49,7 +49,8 @@ class CommunityDataCollection extends StatefulWidget { 'KAP', 'NEP', 'CGP', - 'JJN' + 'JJN', + 'ETT' ]; @override @@ -126,7 +127,7 @@ class _CommunityDataCollectionState extends State { http.Response res = await _makeRequest( modelData.toJson(), "/api/addCommunityBuilding"); if (res.statusCode != 201) { - if(res.statusCode == 401){ + if (res.statusCode == 401) { logout(context); } showToast(res.body); diff --git a/lib/Screens/FamilyDetails.dart b/lib/Screens/FamilyDetails.dart index 2c53c7c..b22b393 100644 --- a/lib/Screens/FamilyDetails.dart +++ b/lib/Screens/FamilyDetails.dart @@ -61,7 +61,8 @@ class _FamilyDetailsState extends State { 'KAP', 'NEP', 'CGP', - 'JJN' + 'JJN', + 'ETT' ]; var four_mfg = { From cd74ec0f1ec4a29b1aef0db8ad5d72cb67109462 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Sat, 23 Jul 2022 15:24:58 +0530 Subject: [PATCH 262/264] Added DisplayUploadData page to show paths to village and community data Added DiaplayUploadedVillageData to show list of all villages uploaded Changed edit records to DisplayUploadedFamilyData.dart Built new widget to render json data into widgets --- android/build.gradle | 2 +- lib/Screens/DisplayUploadedData.dart | 41 +++ ...ge.dart => DisplayUploadedFamilyData.dart} | 68 ++-- lib/Screens/DisplayUploadedVillageData.dart | 245 ++++++++++++++ lib/Screens/Home.dart | 16 +- lib/Screens/RenderJSONData.dart | 152 +++++++++ pubspec.lock | 306 +++++++++++++++++- pubspec.yaml | 1 + 8 files changed, 762 insertions(+), 69 deletions(-) create mode 100644 lib/Screens/DisplayUploadedData.dart rename lib/Screens/{EditExistingRecordsPage.dart => DisplayUploadedFamilyData.dart} (76%) create mode 100644 lib/Screens/DisplayUploadedVillageData.dart create mode 100644 lib/Screens/RenderJSONData.dart diff --git a/android/build.gradle b/android/build.gradle index ed45c65..09fbd64 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.6.10' repositories { google() mavenCentral() diff --git a/lib/Screens/DisplayUploadedData.dart b/lib/Screens/DisplayUploadedData.dart new file mode 100644 index 0000000..1d22ed2 --- /dev/null +++ b/lib/Screens/DisplayUploadedData.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Screens/DisplayUploadedFamilyData.dart'; +import 'package:geo_spatial/Screens/DisplayUploadedVillageData.dart'; + +import '../Widgets/AppBarBackButtonWidget.dart'; +import '../Widgets/DataCard.dart'; + +class DisplayUploadedData extends StatelessWidget { + const DisplayUploadedData({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBarBackButton("View Uploaded Records"), + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + DataCard( + 'Individual data', + 'Individual data entry for everyone in home', + 'assets/svg/female.svg', + //FamilyHomeScreen(), + DisplayFamilyData(), + Color(0xfff54b64), + Color(0xfff78361)), + DataCard( + 'Community Details', + 'Data entry for communities', + 'assets/svg/house.svg', + DisplayVillageData(), + Color(0xfff54b64), + Color(0xfff78361)), + + ], + ), + ), + ); + } +} diff --git a/lib/Screens/EditExistingRecordsPage.dart b/lib/Screens/DisplayUploadedFamilyData.dart similarity index 76% rename from lib/Screens/EditExistingRecordsPage.dart rename to lib/Screens/DisplayUploadedFamilyData.dart index c399181..cabc6d9 100644 --- a/lib/Screens/EditExistingRecordsPage.dart +++ b/lib/Screens/DisplayUploadedFamilyData.dart @@ -2,8 +2,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:geo_spatial/Model/FamilyDataModels.dart'; -import 'package:geo_spatial/Screens/FamilyHomeScreen.dart'; +import 'package:geo_spatial/Screens/RenderJSONData.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; import 'package:geo_spatial/Utils/Constants.dart'; import 'package:geo_spatial/Utils/Utils.dart'; @@ -13,18 +12,19 @@ import 'package:http/http.dart' as http; import 'package:oktoast/oktoast.dart'; //TODO: Parse Data into Family Data Object -class EditRecordsScreen extends StatefulWidget { - const EditRecordsScreen({Key? key}) : super(key: key); +class DisplayFamilyData extends StatefulWidget { + const DisplayFamilyData({Key? key}) : super(key: key); @override - State createState() => _EditRecordsScreenState(); + State createState() => _DisplayFamilyDataState(); } -class _EditRecordsScreenState extends State { +class _DisplayFamilyDataState extends State { bool isSearchOpen = false; TextEditingController _textEditingController = new TextEditingController(); List _dataList = []; + List _mapData = []; late List _searchList; initState() { @@ -37,7 +37,7 @@ class _EditRecordsScreenState extends State { String jwt = await jwtToken; try { - var res = await http.get(Uri.http(url, '/api/getCommonRecords'), + var res = await http.get(Uri.http(url, '/api/getCommonRecords/familyData'), headers: { "Content-Type": "application/json", 'user-auth-token': jwt @@ -48,6 +48,8 @@ class _EditRecordsScreenState extends State { return http.Response('Error', 408); }, ); + print(json.decode(res.body)); + return res; } catch (e) { return http.Response(e.toString(), 408); @@ -62,7 +64,7 @@ class _EditRecordsScreenState extends State { if (snapshot.hasData) { if (snapshot.requireData.statusCode != 200) { return Scaffold( - appBar: AppBarBackButton("Edit Records"), + appBar: AppBarBackButton("View Family Data"), body: Center( child: Text("Could not fetch data from server at this time"), ), @@ -71,13 +73,18 @@ class _EditRecordsScreenState extends State { try { var dataJson = json.decode(snapshot.requireData.body); + _dataList.clear(); + _mapData.clear(); for (var i in dataJson) { _dataList.add(i["FamilyUIN"]); + _mapData.add(i); + print(i); } } catch (e) { + print(e); return Scaffold( resizeToAvoidBottomInset: false, - appBar: AppBarBackButton("Edit Records"), + appBar: AppBarBackButton("View Family Data"), body: Center( child: Text("Could not fetch data from server at this time"), ), @@ -87,7 +94,7 @@ class _EditRecordsScreenState extends State { return Scaffold( backgroundColor: colors.darkScaffoldColor, appBar: AppBarBackButton( - 'Edit Existing Data', + 'View Family Data', actions: [ IconButton( splashRadius: 20, @@ -134,21 +141,6 @@ class _EditRecordsScreenState extends State { Icons.search, color: colors.darkAccentColor, ), - // suffixIcon: Material( - // borderRadius: BorderRadius.only( - // topRight: Radius.circular(4), - // bottomRight: Radius.circular(4)), - // child: IconButton( - // splashRadius: 16, - // icon: Icon( - // Icons.clear, - // color: colors.darkSecondAccentColor, - // ), - // onPressed: () { - // _textEditingController.text = ""; - // }, - // ), - // ), label: Text( "Search", style: GoogleFonts.poppins( @@ -194,30 +186,10 @@ class _EditRecordsScreenState extends State { vertical: 10, horizontal: 20.0), minLeadingWidth: 30, onTap: () { - var modelData = - FamilyMembersCommonDataModel(); - modelData - .individualDataListTransient - .add( - FamilyMemberIndividualDataModel()); - modelData - .individualDataListTransient - .add( - FamilyMemberIndividualDataModel()); - modelData - .individualDataListTransient - .add( - FamilyMemberIndividualDataModel()); - modelData - .individualDataListTransient - .add( - FamilyMemberIndividualDataModel()); Navigator.of(context).push( MaterialPageRoute( builder: (context) => - FamilyHomeScreen( - modelData: modelData, - ))); + RenderJSONData(data: _mapData[index]))); }, //Pass a function which is called onSaved in the next page and add data to the class object title: Text( @@ -228,7 +200,7 @@ class _EditRecordsScreenState extends State { fontSize: 20), ), subtitle: Text( - 'Click to edit', + 'Click to view data', style: GoogleFonts.poppins( color: colors .darkSecondaryTextColor), @@ -263,7 +235,7 @@ class _EditRecordsScreenState extends State { ); } else { return Scaffold( - appBar: AppBarBackButton("Edit Records"), + appBar: AppBarBackButton("View Family Data"), body: Center( child: CircularProgressIndicator(), )); diff --git a/lib/Screens/DisplayUploadedVillageData.dart b/lib/Screens/DisplayUploadedVillageData.dart new file mode 100644 index 0000000..fc55ea2 --- /dev/null +++ b/lib/Screens/DisplayUploadedVillageData.dart @@ -0,0 +1,245 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:geo_spatial/Screens/RenderJSONData.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Utils/Constants.dart'; +import 'package:geo_spatial/Utils/Utils.dart'; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:http/http.dart' as http; +import 'package:oktoast/oktoast.dart'; + +//TODO: Parse Data into Family Data Object +class DisplayVillageData extends StatefulWidget { + const DisplayVillageData({Key? key}) : super(key: key); + + @override + State createState() => _DisplayVillageDataState(); +} + +class _DisplayVillageDataState extends State { + bool isSearchOpen = false; + TextEditingController _textEditingController = new TextEditingController(); + + List _dataList = []; + List _mapData = []; + late List _searchList; + + initState() { + super.initState(); + _searchList = _dataList; + } + + Future _getCommonRecords() async { + String url = NETWORK_ADDRESS; + String jwt = await jwtToken; + + try { + var res = await http.get(Uri.http(url, '/api/getCommonRecords/individualData'), + headers: { + "Content-Type": "application/json", + 'user-auth-token': jwt + }).timeout( + const Duration(seconds: 30), + onTimeout: () { + showToast("Server Timed out!"); + return http.Response('Error', 408); + }, + ); + print(json.decode(res.body)); + + return res; + } catch (e) { + return http.Response(e.toString(), 408); + } + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _getCommonRecords(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + if (snapshot.requireData.statusCode != 200) { + return Scaffold( + appBar: AppBarBackButton("View Community Data"), + body: Center( + child: Text("Could not fetch data from server at this time"), + ), + ); + } + + try { + var dataJson = json.decode(snapshot.requireData.body); + _dataList.clear(); + _mapData.clear(); + for (var i in dataJson) { + _dataList.add(i["resourceType"]); + _mapData.add(i); + print(i); + } + } catch (e) { + print(e); + return Scaffold( + resizeToAvoidBottomInset: false, + appBar: AppBarBackButton("View Community Data"), + body: Center( + child: Text("Could not fetch data from server at this time"), + ), + ); + } + + return Scaffold( + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton( + 'View Community Data', + actions: [ + IconButton( + splashRadius: 20, + icon: Icon( + Icons.search, + color: colors.darkAccentColor, + ), + onPressed: () { + setState(() { + isSearchOpen = !isSearchOpen; + _searchList = _dataList; + }); + }) + ], + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Visibility( + visible: isSearchOpen, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: TextField( + onChanged: (text) { + setState(() { + _searchList = _dataList + .where((i) => i + .toLowerCase() + .contains(text.toLowerCase())) + .toList(); + }); + }, + controller: _textEditingController, + style: TextStyle(color: Colors.white), + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: colors.darkSecondaryTextColor, + width: 1.0)), + contentPadding: + EdgeInsets.symmetric(horizontal: 10.0), + fillColor: colors.darkScaffoldColor, + prefixIcon: Icon( + Icons.search, + color: colors.darkAccentColor, + ), + label: Text( + "Search", + style: GoogleFonts.poppins( + color: colors.darkSecondaryTextColor), + ), + hintText: "Search for records...", + ), + ), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.all(20), + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC252426), + blurRadius: 8.0, + ), + ], + ), + child: Padding( + padding: EdgeInsets.all(12), + child: _searchList.isNotEmpty + ? ListView.builder( + itemCount: _searchList.length, + itemBuilder: + (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 3.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(5))), + elevation: 10, + color: colors.darkScaffoldColor, + child: ListTile( + contentPadding: EdgeInsets.symmetric( + vertical: 10, horizontal: 20.0), + minLeadingWidth: 30, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + RenderJSONData(data: _mapData[index]))); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + title: Text( + _searchList[index], + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + subtitle: Text( + 'Click to view data', + style: GoogleFonts.poppins( + color: colors + .darkSecondaryTextColor), + ), + leading: SvgPicture.asset( + "assets/svg/user-id-icon.svg", + fit: BoxFit.fill, + ), + isThreeLine: true, + trailing: Icon( + Icons.chevron_right, + color: colors.darkAccentColor, + ), + ), + ), + ); + }) + : Container( + width: double.infinity, + child: Center( + child: Text( + "No Results Found", + textAlign: TextAlign.center, + ), + )), + ), + ), + ), + ), + ], + ), + ); + } else { + return Scaffold( + appBar: AppBarBackButton("View Community Data"), + body: Center( + child: CircularProgressIndicator(), + )); + } + }); + } +} diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 3ae2bae..4c93fe3 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -2,6 +2,7 @@ import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:geo_spatial/Screens/DisplayUploadedData.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:geo_spatial/Utils/CheckNetworkConnectivity.dart'; import 'package:geo_spatial/Utils/Constants.dart'; @@ -15,6 +16,7 @@ import 'package:geo_spatial/main.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:oktoast/oktoast.dart'; import 'package:http/http.dart' as http; +import 'DisplayUploadedFamilyData.dart'; import 'SavedData.dart'; class Home extends StatefulWidget { @@ -146,13 +148,13 @@ class _HomeWidgetState extends State { CommunityDataCollection(), Color(0xfff54b64), Color(0xfff78361)), - // DataCard( - // 'Edit Existing Record', - // 'Edit information of an existing person', - // 'assets/svg/male.svg', - // EditRecordsScreen(), - // Color(0xfff54b64), - // Color(0xfff78361)), + DataCard( + 'View Uploaded Records', + 'View all records uploaded by you', + 'assets/svg/male.svg', + DisplayUploadedData(), + Color(0xfff54b64), + Color(0xfff78361)), DataCard( 'View saved data', 'View all data saved in local storage', diff --git a/lib/Screens/RenderJSONData.dart b/lib/Screens/RenderJSONData.dart new file mode 100644 index 0000000..7755247 --- /dev/null +++ b/lib/Screens/RenderJSONData.dart @@ -0,0 +1,152 @@ +import 'package:flutter/material.dart'; +import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:geo_spatial/Widgets/AppBarBackButtonWidget.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class RenderJSONData extends StatefulWidget { + const RenderJSONData({Key? key, required this.data}) : super(key: key); + final Map data; + + @override + State createState() => _RenderJSONDataState(); +} + +class _RenderJSONDataState extends State { + List listData = []; + + buildWidgetList(List jsonData) { + List listData = []; + int mapCount = 0; + jsonData.forEach((element) { + print(element.runtimeType); + if (element.runtimeType == String || + element.runtimeType == double || + element.runtimeType == int) { + listData.add(new Card( + color: colors.darkSecondBackgroundColor, + child: ListTile( + title: Text( + element.toString(), + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 15), + ), + ), + elevation: 3, + )); + setState(() {}); + } else if (element.runtimeType == List) { + listData.add(buildWidgetList(element)); + } else { + listData.add(Card( + color: colors.darkSecondBackgroundColor, + child: ListTile( + title: Text( + "Data entry ${mapCount + 1}", + style: GoogleFonts.poppins( + color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15), + ), + subtitle: buildWidgetMap(element), + ), + )); + } + mapCount++; + }); + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: listData, + ), + ); + } + + buildWidgetMap(data) { + List mapListData = []; + data.forEach((key, value) { + print(value.runtimeType); + if (value.runtimeType == String) { + mapListData.add(new Card( + color: colors.darkScaffoldColor, + child: ListTile( + title: Text( + key.toString(), + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 15), + ), + subtitle: Text(value.toString(), style: GoogleFonts.poppins( + color: colors + .darkSecondaryTextColor)), + ), + )); + setState(() {}); + } else if (value.runtimeType == List) { + mapListData.add(Card( + color: colors.darkScaffoldColor, + child: ListTile( + title: Padding( + padding: const EdgeInsets.only(top: 20), + child: Text( + key.toString().toUpperCase(), + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 15), + ), + ), + subtitle: buildWidgetList(value), + ), + )); + setState(() {}); + } else if (value.runtimeType == Map) { + mapListData.add(new Card( + color: colors.darkSecondBackgroundColor, + child: ListTile( + title: Text( + key.toString().toUpperCase(), + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w200, + fontSize: 15), + ), + subtitle: buildWidgetMap(value), + ), + )); + } + }); + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: mapListData, + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: colors.darkScaffoldColor, + appBar: AppBarBackButton("Family Data"), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Container( + decoration: BoxDecoration( + color: colors.darkSecondBackgroundColor, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Color(0xBC252426), + blurRadius: 8.0, + ), + ], + ), + child: SingleChildScrollView( + child: buildWidgetMap(widget.data), + ), + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index e5c1587..a759543 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,7 +21,14 @@ packages: name: args url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.3.1" + asn1lib: + dependency: transitive + description: + name: asn1lib + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" async: dependency: transitive description: @@ -36,6 +43,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.0" + automated_testing_framework: + dependency: transitive + description: + name: automated_testing_framework + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.2" + automated_testing_framework_models: + dependency: transitive + description: + name: automated_testing_framework_models + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9+5" boolean_selector: dependency: transitive description: @@ -120,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + child_builder: + dependency: transitive + description: + name: child_builder + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0+3" cli_util: dependency: transitive description: @@ -147,7 +175,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" connectivity_plus: dependency: "direct main" description: @@ -196,14 +224,14 @@ packages: name: convert url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -225,13 +253,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.8" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + device_info_plus_linux: + dependency: transitive + description: + name: device_info_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + device_info_plus_macos: + dependency: transitive + description: + name: device_info_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.3" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0+1" + device_info_plus_web: + dependency: transitive + description: + name: device_info_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + device_info_plus_windows: + dependency: transitive + description: + name: device_info_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + encrypt: + dependency: transitive + description: + name: encrypt + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.1" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: transitive description: @@ -279,6 +356,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + flutter_markdown: + dependency: transitive + description: + name: flutter_markdown + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.10+3" flutter_rounded_date_picker: dependency: "direct main" description: @@ -352,6 +436,13 @@ packages: description: flutter source: sdk version: "0.0.0" + form_validation: + dependency: transitive + description: + name: form_validation + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0+10" frontend_server_client: dependency: transitive description: @@ -443,6 +534,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" + interpolation: + dependency: transitive + description: + name: interpolation + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" intl: dependency: transitive description: @@ -463,7 +561,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: @@ -471,6 +569,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.4.0" + json_class: + dependency: transitive + description: + name: json_class + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2+8" + json_conditional: + dependency: transitive + description: + name: json_conditional + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0+9" + json_dynamic_widget: + dependency: "direct main" + description: + name: json_dynamic_widget + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.2+5" + json_path: + dependency: transitive + description: + name: json_path + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" + json_schema2: + dependency: transitive + description: + name: json_schema2 + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2+7" + json_theme: + dependency: transitive + description: + name: json_theme + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0+7" logging: dependency: transitive description: @@ -478,6 +618,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + markdown: + dependency: transitive + description: + name: markdown + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.0" matcher: dependency: transitive description: @@ -485,6 +632,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" meta: dependency: transitive description: @@ -499,6 +653,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" nm: dependency: transitive description: @@ -541,13 +702,55 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.2" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.2" + package_info_plus_linux: + dependency: transitive + description: + name: package_info_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + package_info_plus_macos: + dependency: transitive + description: + name: package_info_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_info_plus_web: + dependency: transitive + description: + name: package_info_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + package_info_plus_windows: + dependency: transitive + description: + name: package_info_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" path_drawing: dependency: transitive description: @@ -632,6 +835,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + pointycastle: + dependency: transitive + description: + name: pointycastle + url: "https://pub.dartlang.org" + source: hosted + version: "3.6.1" pool: dependency: transitive description: @@ -653,6 +863,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.2.4" + provider: + dependency: transitive + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.3" pub_semver: dependency: transitive description: @@ -667,6 +884,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + rest_client: + dependency: transitive + description: + name: rest_client + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4+7" + rfc_6901: + dependency: transitive + description: + name: rfc_6901 + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.5" shelf: dependency: transitive description: @@ -706,7 +951,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -714,6 +959,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.10.0" + static_translations: + dependency: transitive + description: + name: static_translations + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1+7" stream_channel: dependency: transitive description: @@ -742,6 +994,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.3" + template_expressions: + dependency: transitive + description: + name: template_expressions + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.7+4" term_glyph: dependency: transitive description: @@ -755,7 +1014,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.9" timing: dependency: transitive description: @@ -770,13 +1029,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + uri: + dependency: transitive + description: + name: uri + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.6" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" visibility_detector: dependency: "direct main" description: @@ -825,7 +1098,14 @@ packages: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" + yaon: + dependency: transitive + description: + name: yaon + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1+3" sdks: - dart: ">=2.15.0 <3.0.0" - flutter: ">=2.5.0" + dart: ">=2.17.0 <3.0.0" + flutter: ">=3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 46e4379..36b628c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: auto_size_text: ^3.0.0 http: 0.13.4 flutter_secure_storage: ^5.0.2 + json_dynamic_widget: ^5.0.2+5 flutter: sdk: flutter From 02e253d48cef18f5c4bff78dabb2e8f416783723 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Mon, 25 Jul 2022 11:43:18 +0530 Subject: [PATCH 263/264] Added logic and dialog to delete records entered by the user through the application --- ...dart => DisplayUploadedCommunityData.dart} | 156 +++++++++++------- lib/Screens/DisplayUploadedData.dart | 2 +- lib/Screens/DisplayUploadedFamilyData.dart | 48 +++++- lib/Utils/Utils.dart | 99 ++++++++++- 4 files changed, 231 insertions(+), 74 deletions(-) rename lib/Screens/{DisplayUploadedVillageData.dart => DisplayUploadedCommunityData.dart} (53%) diff --git a/lib/Screens/DisplayUploadedVillageData.dart b/lib/Screens/DisplayUploadedCommunityData.dart similarity index 53% rename from lib/Screens/DisplayUploadedVillageData.dart rename to lib/Screens/DisplayUploadedCommunityData.dart index fc55ea2..76164de 100644 --- a/lib/Screens/DisplayUploadedVillageData.dart +++ b/lib/Screens/DisplayUploadedCommunityData.dart @@ -37,11 +37,11 @@ class _DisplayVillageDataState extends State { String jwt = await jwtToken; try { - var res = await http.get(Uri.http(url, '/api/getCommonRecords/individualData'), - headers: { - "Content-Type": "application/json", - 'user-auth-token': jwt - }).timeout( + var res = await http + .get(Uri.http(url, '/api/getCommonRecords/individualData'), headers: { + "Content-Type": "application/json", + 'user-auth-token': jwt + }).timeout( const Duration(seconds: 30), onTimeout: () { showToast("Server Timed out!"); @@ -122,8 +122,8 @@ class _DisplayVillageDataState extends State { setState(() { _searchList = _dataList .where((i) => i - .toLowerCase() - .contains(text.toLowerCase())) + .toLowerCase() + .contains(text.toLowerCase())) .toList(); }); }, @@ -135,7 +135,7 @@ class _DisplayVillageDataState extends State { color: colors.darkSecondaryTextColor, width: 1.0)), contentPadding: - EdgeInsets.symmetric(horizontal: 10.0), + EdgeInsets.symmetric(horizontal: 10.0), fillColor: colors.darkScaffoldColor, prefixIcon: Icon( Icons.search, @@ -169,63 +169,93 @@ class _DisplayVillageDataState extends State { padding: EdgeInsets.all(12), child: _searchList.isNotEmpty ? ListView.builder( - itemCount: _searchList.length, - itemBuilder: - (BuildContext context, int index) { - return Padding( - padding: const EdgeInsets.symmetric( - horizontal: 10.0, vertical: 3.0), - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(5))), - elevation: 10, - color: colors.darkScaffoldColor, - child: ListTile( - contentPadding: EdgeInsets.symmetric( - vertical: 10, horizontal: 20.0), - minLeadingWidth: 30, - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => - RenderJSONData(data: _mapData[index]))); - }, - //Pass a function which is called onSaved in the next page and add data to the class object - title: Text( - _searchList[index], - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w400, - fontSize: 20), - ), - subtitle: Text( - 'Click to view data', - style: GoogleFonts.poppins( - color: colors - .darkSecondaryTextColor), - ), - leading: SvgPicture.asset( - "assets/svg/user-id-icon.svg", - fit: BoxFit.fill, - ), - isThreeLine: true, - trailing: Icon( - Icons.chevron_right, - color: colors.darkAccentColor, + itemCount: _searchList.length, + itemBuilder: + (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10.0, vertical: 3.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(5))), + elevation: 10, + color: colors.darkScaffoldColor, + child: ListTile( + contentPadding: EdgeInsets.symmetric( + vertical: 10, horizontal: 20.0), + minLeadingWidth: 30, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + RenderJSONData( + data: _mapData[ + index]))); + }, + //Pass a function which is called onSaved in the next page and add data to the class object + title: Text( + _searchList[index], + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20), + ), + subtitle: Text( + 'Click to view data', + style: GoogleFonts.poppins( + color: colors + .darkSecondaryTextColor), + ), + leading: SvgPicture.asset( + "assets/svg/user-id-icon.svg", + fit: BoxFit.fill, + ), + isThreeLine: true, + trailing: IconButton( + icon: Icon( + Icons.delete_forever, + color: colors.darkAccentColor, + ), + onPressed: () { + displayDialog( + context, + positiveFunction: () async { + var record = _mapData[index]; + Navigator.of(context).pop(); + + bool success = + await deleteRecord({ + "id": record["_id"] + }, "/api/getCommonRecords/deleteCommunityData", + context); + + if (success) { + _mapData.removeAt(index); + setState(() {}); + } + }, + negativeFunction: () { + Navigator.of(context).pop(); + }, + title: 'Delete record', + subTitle: + 'Are you sure you want to delete this record?', + ); + }, + ), + ), ), - ), - ), - ); - }) + ); + }) : Container( - width: double.infinity, - child: Center( - child: Text( - "No Results Found", - textAlign: TextAlign.center, - ), - )), + width: double.infinity, + child: Center( + child: Text( + "No Results Found", + textAlign: TextAlign.center, + ), + )), ), ), ), diff --git a/lib/Screens/DisplayUploadedData.dart b/lib/Screens/DisplayUploadedData.dart index 1d22ed2..1e3690f 100644 --- a/lib/Screens/DisplayUploadedData.dart +++ b/lib/Screens/DisplayUploadedData.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/DisplayUploadedFamilyData.dart'; -import 'package:geo_spatial/Screens/DisplayUploadedVillageData.dart'; +import 'package:geo_spatial/Screens/DisplayUploadedCommunityData.dart'; import '../Widgets/AppBarBackButtonWidget.dart'; import '../Widgets/DataCard.dart'; diff --git a/lib/Screens/DisplayUploadedFamilyData.dart b/lib/Screens/DisplayUploadedFamilyData.dart index cabc6d9..8d8d5af 100644 --- a/lib/Screens/DisplayUploadedFamilyData.dart +++ b/lib/Screens/DisplayUploadedFamilyData.dart @@ -37,11 +37,11 @@ class _DisplayFamilyDataState extends State { String jwt = await jwtToken; try { - var res = await http.get(Uri.http(url, '/api/getCommonRecords/familyData'), - headers: { - "Content-Type": "application/json", - 'user-auth-token': jwt - }).timeout( + var res = await http + .get(Uri.http(url, '/api/getCommonRecords/familyData'), headers: { + "Content-Type": "application/json", + 'user-auth-token': jwt + }).timeout( const Duration(seconds: 30), onTimeout: () { showToast("Server Timed out!"); @@ -189,7 +189,9 @@ class _DisplayFamilyDataState extends State { Navigator.of(context).push( MaterialPageRoute( builder: (context) => - RenderJSONData(data: _mapData[index]))); + RenderJSONData( + data: _mapData[ + index]))); }, //Pass a function which is called onSaved in the next page and add data to the class object title: Text( @@ -210,9 +212,37 @@ class _DisplayFamilyDataState extends State { fit: BoxFit.fill, ), isThreeLine: true, - trailing: Icon( - Icons.chevron_right, - color: colors.darkAccentColor, + trailing: IconButton( + icon: Icon( + Icons.delete_forever, + color: colors.darkAccentColor, + ), + onPressed: () { + displayDialog( + context, + positiveFunction: () async { + var record = _mapData[index]; + Navigator.of(context).pop(); + + bool success = + await deleteRecord({ + "id": record["_id"] + }, "/api/getCommonRecords/deleteFamilyData", + context); + + if (success) { + _mapData.removeAt(index); + setState(() {}); + } + }, + negativeFunction: () { + Navigator.of(context).pop(); + }, + title: 'Delete record', + subTitle: + 'Are you sure you want to delete this record?', + ); + }, ), ), ), diff --git a/lib/Utils/Utils.dart b/lib/Utils/Utils.dart index a34fa9c..648d655 100644 --- a/lib/Utils/Utils.dart +++ b/lib/Utils/Utils.dart @@ -1,10 +1,13 @@ import 'dart:convert'; +import 'dart:ffi'; import 'package:flutter/material.dart'; import 'package:geo_spatial/Screens/Login.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:geo_spatial/Utils/Colors.dart' as colors; +import 'package:oktoast/oktoast.dart'; import '../main.dart'; import 'Constants.dart'; +import 'package:http/http.dart' as http; Future get jwtToken async { var jwt = await storage.read(key: JWT_STORAGE_KEY); @@ -35,7 +38,7 @@ logout(context) async { await storage.delete(key: JWT_STORAGE_KEY); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => Login()), - (Route route) => false); + (Route route) => false); } logoutDialog(context) { @@ -117,3 +120,97 @@ closePage(context) { ), ); } + +displayDialog(context, + {required String title, + required String subTitle, + required VoidCallback positiveFunction, + required VoidCallback negativeFunction}) { + return showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: colors.darkScaffoldColor, + title: Text( + title, + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + content: Text( + subTitle, + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + actions: [ + TextButton( + child: Text( + 'No', + style: GoogleFonts.poppins(color: colors.darkPrimaryTextColor), + ), + onPressed: negativeFunction, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: colors.darkAccentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)))), + child: + Text('Yes', style: TextStyle(color: colors.darkPrimaryTextColor)), + onPressed: positiveFunction, + ), + ], + ), + ); +} + +Future deleteRecord(var data, String node, context) async { + String url = NETWORK_ADDRESS; + var body = json.encode(data); + + var progressContext; + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + progressContext = context; + return WillPopScope( + child: Dialog( + child: Padding( + padding: EdgeInsets.all(20), + child: new Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: EdgeInsets.only(right: 20), + child: CircularProgressIndicator(), + ), + new Text( + "Deleting Record", + style: TextStyle(color: Colors.black), + ), + ], + ), + ), + ), + onWillPop: () async => false); + }, + ); + + var jwt = await jwtToken; + + var res = await http + .post(Uri.https(url, node), + headers: {"Content-Type": "application/json", "user-auth-token": jwt}, + body: body) + .timeout( + const Duration(seconds: 30), + onTimeout: () { + // Time has run out, do what you wanted to do. + return http.Response( + 'Server Timed out!', 408); // Request Timeout response status code + }, + ); + Navigator.of(progressContext!, rootNavigator: true).pop(); + if (res.statusCode != 200) { + showToast(res.body); + return false; + } + return true; +} From b26eaaad5cb72760df5fbca2f9669880cba60912 Mon Sep 17 00:00:00 2001 From: sooryasrajan Date: Tue, 27 Dec 2022 18:18:41 +0530 Subject: [PATCH 264/264] Changed URL to Amrita server and downgraded connection to HTTP --- lib/Screens/ChangePassword.dart | 2 +- lib/Screens/CommunityDataCollection.dart | 2 +- lib/Screens/FamilyHomeScreen.dart | 2 +- lib/Screens/Home.dart | 2 +- lib/Screens/Login.dart | 4 ++-- lib/Screens/ProfilePage.dart | 2 +- lib/Utils/Constants.dart | 4 ++-- lib/Utils/Utils.dart | 2 +- lib/Widgets/LoadValidPageWidget.dart | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/Screens/ChangePassword.dart b/lib/Screens/ChangePassword.dart index 65da1ed..7f275eb 100644 --- a/lib/Screens/ChangePassword.dart +++ b/lib/Screens/ChangePassword.dart @@ -44,7 +44,7 @@ class _ChangePasswordState extends State { String jwt = await jwtToken; var res = await http - .put(Uri.https(url, '/api/changeUserPassword'), + .put(Uri.http(url, '/api/changeUserPassword'), headers: { "Content-Type": "application/json", 'user-auth-token': jwt diff --git a/lib/Screens/CommunityDataCollection.dart b/lib/Screens/CommunityDataCollection.dart index 8c653ec..6b00726 100644 --- a/lib/Screens/CommunityDataCollection.dart +++ b/lib/Screens/CommunityDataCollection.dart @@ -70,7 +70,7 @@ class _CommunityDataCollectionState extends State { var jwt = await jwtToken; var res = await http - .post(Uri.https(url, node), + .post(Uri.http(url, node), headers: { "Content-Type": "application/json", "user-auth-token": jwt diff --git a/lib/Screens/FamilyHomeScreen.dart b/lib/Screens/FamilyHomeScreen.dart index 9c60aae..32273ff 100644 --- a/lib/Screens/FamilyHomeScreen.dart +++ b/lib/Screens/FamilyHomeScreen.dart @@ -45,7 +45,7 @@ class _FamilyHomeScreenState extends State { var jwt = await jwtToken; var res = await http - .post(Uri.https(url, node), + .post(Uri.http(url, node), headers: { "Content-Type": "application/json", "user-auth-token": jwt diff --git a/lib/Screens/Home.dart b/lib/Screens/Home.dart index 4c93fe3..a9582f5 100644 --- a/lib/Screens/Home.dart +++ b/lib/Screens/Home.dart @@ -41,7 +41,7 @@ class _HomeWidgetState extends State { String jwt = await jwtToken; print(jwt); var res = await http - .get(Uri.https(NETWORK_ADDRESS, '/api/validateToken'), headers: { + .get(Uri.http(NETWORK_ADDRESS, '/api/validateToken'), headers: { "Content-Type": "application/json", 'user-auth-token': jwt }).timeout(Duration(seconds: 30)); diff --git a/lib/Screens/Login.dart b/lib/Screens/Login.dart index 1b4f8da..ec1fe7c 100644 --- a/lib/Screens/Login.dart +++ b/lib/Screens/Login.dart @@ -67,7 +67,7 @@ class _MyAppState extends State { var body = json.encode({"username": username, "password": password}); var res = await http - .post(Uri.https(url, '/api/login'), + .post(Uri.http(url, '/api/login'), headers: {"Content-Type": "application/json"}, body: body) .timeout( const Duration(seconds: 30), @@ -84,7 +84,7 @@ class _MyAppState extends State { Future _getUserDetails(String JWT) async { String url = NETWORK_ADDRESS; - var res = await http.get(Uri.https(url, '/api/getUserData'), headers: { + var res = await http.get(Uri.http(url, '/api/getUserData'), headers: { "Content-Type": "application/json", 'user-auth-token': JWT }).timeout( diff --git a/lib/Screens/ProfilePage.dart b/lib/Screens/ProfilePage.dart index 4fb8305..eb04f2e 100644 --- a/lib/Screens/ProfilePage.dart +++ b/lib/Screens/ProfilePage.dart @@ -22,7 +22,7 @@ Future _getUserDetails() async { var jwt = await jwtToken; String url = NETWORK_ADDRESS; - var res = await http.get(Uri.https(url, '/api/getUserData'), headers: { + var res = await http.get(Uri.http(url, '/api/getUserData'), headers: { "Content-Type": "application/json", 'user-auth-token': jwt }).timeout( diff --git a/lib/Utils/Constants.dart b/lib/Utils/Constants.dart index de124d3..e189459 100644 --- a/lib/Utils/Constants.dart +++ b/lib/Utils/Constants.dart @@ -3,8 +3,8 @@ //String NETWORK_ADDRESS = 'geo-spatial-amrita.herokuapp.com'; //TESTING SERVER: -String NETWORK_ADDRESS = 'geo-spatial-avv.herokuapp.com'; -//String NETWORK_ADDRESS = '192.168.29.126:2000'; +// String NETWORK_ADDRESS = 'geo-spatial-avv.herokuapp.com'; +String NETWORK_ADDRESS = '172.17.18.87:2000'; String JWT_STORAGE_KEY = 'jwt'; String USER_ID_KEY = "userId"; diff --git a/lib/Utils/Utils.dart b/lib/Utils/Utils.dart index 648d655..f0a1b05 100644 --- a/lib/Utils/Utils.dart +++ b/lib/Utils/Utils.dart @@ -196,7 +196,7 @@ Future deleteRecord(var data, String node, context) async { var jwt = await jwtToken; var res = await http - .post(Uri.https(url, node), + .post(Uri.http(url, node), headers: {"Content-Type": "application/json", "user-auth-token": jwt}, body: body) .timeout( diff --git a/lib/Widgets/LoadValidPageWidget.dart b/lib/Widgets/LoadValidPageWidget.dart index bdc69bb..1e7d2c8 100644 --- a/lib/Widgets/LoadValidPageWidget.dart +++ b/lib/Widgets/LoadValidPageWidget.dart @@ -31,7 +31,7 @@ class LoadValidPageWidget extends StatelessWidget { Future _validateToken(String JWT) async { String url = NETWORK_ADDRESS; - var res = await http.get(Uri.https(url, '/api/validateToken'), headers: { + var res = await http.get(Uri.http(url, '/api/validateToken'), headers: { "Content-Type": "application/json", 'user-auth-token': JWT }).timeout(