From 2c045f43f1929a726f7ac6b6fa140ff6597fa6bf Mon Sep 17 00:00:00 2001 From: erfan Date: Wed, 6 Jan 2021 11:57:21 +0330 Subject: [PATCH] 1.7.0 --- lib/pages/forget_pass_screen.dart | 6 +- lib/pages/home_screen.dart | 258 ++++++++++++++++-- lib/pages/login_screen.dart | 2 +- lib/pages/rePass_screen.dart | 9 +- lib/pages/test_form_page.dart | 4 +- lib/pages/verify_pass_screen.dart | 3 +- lib/providers/auth.dart | 18 +- lib/providers/input.dart | 26 +- lib/providers/test_results.dart | 7 +- .../TestResultScreens/Add/form_creator.dart | 10 +- pubspec.lock | 38 +-- pubspec.yaml | 40 +-- 12 files changed, 302 insertions(+), 119 deletions(-) diff --git a/lib/pages/forget_pass_screen.dart b/lib/pages/forget_pass_screen.dart index 8db1d38..a6db5dc 100644 --- a/lib/pages/forget_pass_screen.dart +++ b/lib/pages/forget_pass_screen.dart @@ -20,7 +20,6 @@ class _ForgetPassScreenState extends State { bool _isLoading = false; final cellNumberController = TextEditingController(); - @override void initState() { cellNumberController.text = ''; @@ -59,7 +58,7 @@ class _ForgetPassScreenState extends State { _isLoading = true; }); // try { - await Provider.of(context) + await Provider.of(context, listen: false) .requestCode( cellNumberController.text, ) @@ -72,7 +71,7 @@ class _ForgetPassScreenState extends State { _isLoading = false; }, ); - } else{ + } else { // _showDialog('User or password incorrect!'); Navigator.of(context).popAndPushNamed(Routes.sendCodeScreen); // setState( @@ -153,7 +152,6 @@ class _ForgetPassScreenState extends State { ), keyboardType: TextInputType.phone, textInputAction: TextInputAction.next, - onSaved: (value) { cellNumberController.text = value; }, diff --git a/lib/pages/home_screen.dart b/lib/pages/home_screen.dart index 38a13d3..4da9e00 100644 --- a/lib/pages/home_screen.dart +++ b/lib/pages/home_screen.dart @@ -1,7 +1,10 @@ +import 'package:barcode_scan/platform_wrapper.dart'; import 'package:double_back_to_close_app/double_back_to_close_app.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_phoenix/flutter_phoenix.dart'; import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; import './my_info_screen.dart'; import '../providers/auth.dart'; @@ -19,7 +22,8 @@ class HomePage extends StatelessWidget { // static const route = '/HomeScreen'; @override Widget build(BuildContext context) { - final userData = Provider.of(context,listen: false).user; + final userData = Provider.of(context, listen: false).user; + // print(userData['roles']); return Scaffold( resizeToAvoidBottomPadding: false, @@ -53,7 +57,7 @@ class HomePage extends StatelessWidget { child: Text('Yes'), onPressed: () { Navigator.of(ctx).pop(); - Provider.of(context).logout(); + Provider.of(context, listen: false).logout(); Phoenix.rebirth(context); }, ), @@ -106,35 +110,75 @@ class HomePage extends StatelessWidget { endColor: Color(0xFFFFECD2), firstLine: 'My INFO', secondLine: 'List, Details & Add a one', - onTap: Consumer( - builder: (ctx, auth, _) { - return MyInfoScreen(); - }, + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return Consumer( + builder: (ctx, auth, _) { + return MyInfoScreen(); + }, + ); + }, + ), ), ), SelectionItem( - startColor: Color(0xFFD5F5FD), - endColor: Color(0xFFE9FFF7), - firstLine: 'TEST RESULTS', - secondLine: 'List, Details & Add a one', - onTap: TestResultScreen() - // MyTestResult( - // isAdmin: false, - // ), + startColor: Color(0xFFD5F5FD), + endColor: Color(0xFFE9FFF7), + firstLine: 'TEST RESULTS', + secondLine: 'List, Details & Add a one', + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return Consumer( + builder: (ctx, auth, _) { + return TestResultScreen(); + }, + ); + }, ), + ), + // MyTestResult( + // isAdmin: false, + // ), + ), SelectionItem( startColor: Color(0xFFE2D2C4), endColor: Color(0xFFFAF7F5), firstLine: 'LABELS', secondLine: 'List, Details & Add a one', - onTap: LabelResultScreen(), + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return Consumer( + builder: (ctx, auth, _) { + return LabelResultScreen(); + }, + ); + }, + ), + ), ), SelectionItem( startColor: Color(0xFFA7CCE1), endColor: Color(0xFFECF7ED), firstLine: 'CYCLES', secondLine: 'List, Details & Add a one', - onTap: CycleResultScreen(), + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return Consumer( + builder: (ctx, auth, _) { + return CycleResultScreen(); + }, + ); + }, + ), + ), ), // SelectionItem( // startColor: Color(0xFFA7CCE1), @@ -149,9 +193,21 @@ class HomePage extends StatelessWidget { startColor: Color(0xFFA7CCE1), endColor: Color(0xFFECF7ED), firstLine: 'TEST TO VERIFY', - secondLine: 'List, Details & Add a one', - onTap: TestVerifyScreen(), + secondLine: 'Verify and reject Test Results', + onTap: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return Consumer( + builder: (ctx, auth, _) { + return TestVerifyScreen(); + }, + ); + }, + ), + ), ), + BarcodeSelectionItem(), ], ), ), @@ -163,12 +219,33 @@ class HomePage extends StatelessWidget { } } +Future scan() async { + try { + var barcode = await BarcodeScanner.scan(); + if (barcode.type.name == 'Cancelled') { + return 'cancel'; + } else if (barcode.type.name == 'Failed') { + return 'error'; + } + try { + var id = barcode.rawContent; + return id; + } catch (_) { + return 'null'; + } + } on PlatformException catch (_) { + return 'access'; + } catch (_) { + return 'error'; + } +} + class SelectionItem extends StatelessWidget { final Color startColor; final Color endColor; final String firstLine; final String secondLine; - final Widget onTap; + final Function onTap; SelectionItem( {this.startColor, @@ -196,16 +273,7 @@ class SelectionItem extends StatelessWidget { ), child: InkWell( splashColor: Colors.red, - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) { - return onTap; - }, - ), - ); - }, + onTap: onTap, child: ListTile( title: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -258,3 +326,135 @@ class SelectionItem extends StatelessWidget { ); } } + +class BarcodeSelectionItem extends StatelessWidget { + @override + Widget build(BuildContext context) { + final _media = MediaQuery.of(context); + // final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5); + final double _devicewidth = _media.size.width; + final double _deviceBlockSize = _devicewidth / 100; + return Container( + margin: EdgeInsets.symmetric(vertical: 10), + padding: EdgeInsets.symmetric(vertical: 5), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.black, Colors.black87], + ), + borderRadius: BorderRadius.all( + Radius.circular(3), + ), + ), + child: InkWell( + splashColor: Colors.red, + onTap: () => scan().then( + (String result) { + if (result == 'cancel') { + print('cancel'); + } else if (result == 'error') { + print('error'); + } else if (result == 'access') { + print('access'); + } else { + print(result); + showDialog( + context: context, + child: AlertDialog( + title: Text( + 'نتیجه ی اسکن', + textDirection: TextDirection.rtl, + textAlign: TextAlign.right, + style: TextStyle( + fontSize: 2.75 * _deviceBlockSize, + ), + ), + content: Text( + result, + textDirection: TextDirection.rtl, + style: TextStyle( + fontSize: 4 * _deviceBlockSize, + ), + ), + actions: [ + FlatButton( + onPressed: () async { + await launch(result); + Navigator.of(context).pop(); + }, + child: Text( + 'بازکردن در مرورگر', + style: TextStyle( + fontFamily: 'montserrat', + ), + ), + ) + ], + ), + ); + } + }, + ), + child: ListTile( + title: Row( + children: [ + Icon( + Icons.qr_code_scanner, + color: Colors.white, + size: 8 * _deviceBlockSize, + ), + SizedBox( + width: 2 * _deviceBlockSize, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'SCANNER', + style: TextStyle( + color: Colors.white, + fontSize: 5 * _deviceBlockSize, + letterSpacing: 3.5, + ), + ), + Text( + 'Scan a Bar or QR code', + style: TextStyle( + color: Colors.white, + fontSize: 3.5 * _deviceBlockSize, + ), + ), + ], + ) + ], + ), + trailing: Icon( + Icons.arrow_forward_ios, + color: Colors.white, + ), + ), + // Column( + // children: [ + // ListTile( + // title: Text( + // firstLine, + // textAlign: TextAlign.start, + // style: TextStyle(color: Colors.black), + // ), + // ), + // ListTile( + // title: Text( + // secondLine, + // style: TextStyle(color: Colors.black, fontSize: 20), + // ), + // trailing: Icon( + // Icons.arrow_forward_ios, + // color: Colors.black, + // ), + // ), + // ], + // ), + ), + ); + } +} diff --git a/lib/pages/login_screen.dart b/lib/pages/login_screen.dart index 04dd8c5..14a5693 100644 --- a/lib/pages/login_screen.dart +++ b/lib/pages/login_screen.dart @@ -64,7 +64,7 @@ class _LoginScreenState extends State { _isLoading = true; }); // try { - await Provider.of(context) + await Provider.of(context, listen: false) .login( map['cellNumber'], map['password'], diff --git a/lib/pages/rePass_screen.dart b/lib/pages/rePass_screen.dart index b9983ef..6d299a8 100644 --- a/lib/pages/rePass_screen.dart +++ b/lib/pages/rePass_screen.dart @@ -37,7 +37,7 @@ class _RePassScreenState extends State { super.didChangeDependencies(); } - Future _showDialog(String message) async{ + Future _showDialog(String message) async { await showDialog( context: context, builder: (ctx) => AlertDialog( @@ -62,11 +62,12 @@ class _RePassScreenState extends State { setState(() { _isLoading = true; }); - await Provider.of(context) + await Provider.of(context, listen: false) .sendRePass(passwordController.text, token) - .then((value) async{ + .then((value) async { if (value == 'done') { - await _showDialog('Password changed successfully.Now login to your account.'); + await _showDialog( + 'Password changed successfully.Now login to your account.'); Navigator.of(context).pop(); } }); diff --git a/lib/pages/test_form_page.dart b/lib/pages/test_form_page.dart index 5618e09..1064ede 100644 --- a/lib/pages/test_form_page.dart +++ b/lib/pages/test_form_page.dart @@ -71,7 +71,7 @@ class _FormPageState extends State { setState(() { _isLoading = true; }); - Provider.of(context) + Provider.of(context, listen: false) .getInputs( testResultId: this.widget.testResultId ?? "", name: this.widget.name ?? "", @@ -186,6 +186,6 @@ class _FormPageState extends State { formatData(input['children']); } } - print(values); + // print(values); } } diff --git a/lib/pages/verify_pass_screen.dart b/lib/pages/verify_pass_screen.dart index 55838d6..17fa79c 100644 --- a/lib/pages/verify_pass_screen.dart +++ b/lib/pages/verify_pass_screen.dart @@ -20,7 +20,6 @@ class _VerifyPassScreenState extends State { bool _isLoading = false; final codeCTRL = TextEditingController(); - @override void initState() { codeCTRL.text = ''; @@ -59,7 +58,7 @@ class _VerifyPassScreenState extends State { _isLoading = true; }); // try { - await Provider.of(context) + await Provider.of(context, listen: false) .sendCode( codeCTRL.text, ) diff --git a/lib/providers/auth.dart b/lib/providers/auth.dart index 743d154..3264043 100644 --- a/lib/providers/auth.dart +++ b/lib/providers/auth.dart @@ -62,12 +62,10 @@ class Auth with ChangeNotifier { // return 'Done'; // } print(responseData); - if (responseData['status']=='Faild') { + if (responseData['status'] == 'Faild') { return 'wrong'; - } - else{ - return responseData['access_token']; - + } else { + return responseData['access_token']; } } @@ -81,10 +79,7 @@ class Auth with ChangeNotifier { 'password': password, 'password_confirmation': password, }, - headers: { - 'Authorization': token, - 'X-Requested-With': 'XMLHttpRequest' - }, + headers: {'Authorization': token, 'X-Requested-With': 'XMLHttpRequest'}, // headers: {'X-Requested-With': 'XMLHttpRequest'}, ); final responseData = json.decode(response.body); @@ -94,10 +89,9 @@ class Auth with ChangeNotifier { // return 'Done'; // } print(responseData); - if (responseData['status']=='Success') { + if (responseData['status'] == 'Success') { return 'done'; - } - else{ + } else { return 'error'; } } diff --git a/lib/providers/input.dart b/lib/providers/input.dart index 8ce5e70..cee0360 100644 --- a/lib/providers/input.dart +++ b/lib/providers/input.dart @@ -13,14 +13,14 @@ class Inputs with ChangeNotifier { String name = "", String uniqueCode = "", String testTypeId = ""}) async { - print( - { - 'test_type_id': testTypeId, - 'test_result_id': testResultId, - 'name': name, - 'unique_code': uniqueCode, - }, - ); + // print( + // { + // 'test_type_id': testTypeId, + // 'test_result_id': testResultId, + // 'name': name, + // 'unique_code': uniqueCode, + // }, + // ); var response = await http.post( Url.getInputs, body: { @@ -41,8 +41,10 @@ class Inputs with ChangeNotifier { } final responseData = json.decode(response.body); - // print(responseData); - + // print(responseData['data']['inputs']); + // for (var item in responseData['data']['testType'].keys) { + // print(item); + // } Map values; if (testResultId.isNotEmpty) { response = await http.get(Url.testResultFormValues(testResultId), @@ -72,11 +74,12 @@ class Inputs with ChangeNotifier { 'value': general['id'] }); + // print(responseData['data']['inputs']); inputItems.add({ 'type': 'Text', 'key': 'device_id', 'name': general['device_label'], - 'value': deviceLabel + 'value': deviceLabel, }); inputItems.add( {'type': 'Date', 'key': 'date', 'name': 'date', 'value': dateTime}); @@ -86,6 +89,7 @@ class Inputs with ChangeNotifier { setValues(inputs, values); for (var input in inputs) { inputItems.add(input as Map); + // print(input); } inputItems.add({ 'type': 'Image', diff --git a/lib/providers/test_results.dart b/lib/providers/test_results.dart index 500c24a..1340d28 100644 --- a/lib/providers/test_results.dart +++ b/lib/providers/test_results.dart @@ -190,6 +190,7 @@ class TestResultsProvider with ChangeNotifier { url, headers: { 'Authorization': User.token, + // 'X-Requested-With': 'XMLHttpRequest', }, ); @@ -200,11 +201,11 @@ class TestResultsProvider with ChangeNotifier { items = []; } for (var item in testResultData['data']['data']) { - // print(item); + print(item); originalItems.add( TestResultObject( id: item['id'].toString(), - name: item['test_type']['name'], + name: item['test_type'] != null ? item['test_type']['name'] : '', deviceId: item['device_id'].toString(), result: item['result'] == 'Accept' ? 'Accepted' : 'Not Accepted', date: item['created_at'].toString().substring(0, 10), @@ -246,7 +247,7 @@ class TestResultsProvider with ChangeNotifier { "file": di.MultipartFile.fromBytes(imageListInt, filename: fileName) }); - var response = await dio.post( + await dio.post( Url.addImage, data: formData, ); diff --git a/lib/widgets/TestResultScreens/Add/form_creator.dart b/lib/widgets/TestResultScreens/Add/form_creator.dart index eadeace..d045e78 100644 --- a/lib/widgets/TestResultScreens/Add/form_creator.dart +++ b/lib/widgets/TestResultScreens/Add/form_creator.dart @@ -167,7 +167,7 @@ class _FormCreatorState extends State { } if (item['type'] == "Text") { - print(item['name']); + // print(item['require_scanner'].toString()); TextEditingController idCTRL = new TextEditingController(); final _media = MediaQuery.of(context); // final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5); @@ -176,7 +176,7 @@ class _FormCreatorState extends State { listWidgets.add( Padding( padding: const EdgeInsets.all(8.0), - child: item['name'] != 'Autoclave ID' + child: item['require_scanner'].toString() != '1' ? TextFormField( controller: idCTRL, decoration: InputDecoration( @@ -184,7 +184,7 @@ class _FormCreatorState extends State { border: UnderlineInputBorder(), contentPadding: EdgeInsets.all(0), ), - initialValue: item['value'] ?? '', + // initialValue: item['value'] ?? '', onChanged: (String value) { formItems[count]['value'] = value; _handleChanged(); @@ -202,7 +202,7 @@ class _FormCreatorState extends State { border: UnderlineInputBorder(), contentPadding: EdgeInsets.all(0), ), - initialValue: item['value'] ?? '', + // initialValue: item['value'] ?? '', onChanged: (String value) { formItems[count]['value'] = value; _handleChanged(); @@ -340,7 +340,7 @@ class _FormCreatorState extends State { border: UnderlineInputBorder(), contentPadding: EdgeInsets.all(0), ), - initialValue: item['value'] ?? '', + // initialValue: item['value'] ?? '', onChanged: (String value) { formItems[count]['value'] = value; _handleChanged(); diff --git a/pubspec.lock b/pubspec.lock index 403e9ee..60b3187 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,7 +21,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.2" + version: "2.5.0-nullsafety.1" barcode_scan: dependency: "direct main" description: @@ -35,7 +35,7 @@ packages: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety.1" camera: dependency: "direct main" description: @@ -49,28 +49,28 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0-nullsafety.3" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.3" + version: "1.2.0-nullsafety.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0-nullsafety.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.13" + version: "1.15.0-nullsafety.3" connectivity: dependency: "direct main" description: @@ -133,7 +133,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0-nullsafety.1" file: dependency: transitive description: @@ -253,14 +253,14 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.8" + version: "0.12.10-nullsafety.1" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" + version: "1.3.0-nullsafety.3" multiselect_formfield: dependency: "direct main" description: @@ -274,7 +274,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0-nullsafety.1" path_provider: dependency: "direct main" description: @@ -412,49 +412,49 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0-nullsafety.2" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.5" + version: "1.10.0-nullsafety.1" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety.1" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0-nullsafety.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0-nullsafety.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.17" + version: "0.2.19-nullsafety.2" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0-nullsafety.3" url_launcher: dependency: "direct main" description: @@ -489,7 +489,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0-nullsafety.3" video_player: dependency: "direct main" description: @@ -533,5 +533,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.9.0-14.0.dev <3.0.0" + dart: ">=2.10.0-110 <2.11.0" flutter: ">=1.12.13+hotfix.5 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index dca6ed5..ca43672 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: A new Flutter project. # 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.5.0+2 +version: 1.7.0+6 environment: sdk: ">=2.2.2 <3.0.0" @@ -19,39 +19,26 @@ environment: dependencies: flutter: sdk: flutter - http: ^0.12.0+3 - provider: ^3.2.0 barcode_scan: ^3.0.0 - # flutter_barcode_scanner: ^1.0.0 + camera: ^0.5.8+2 connectivity: ^0.4.8+5 - - shared_preferences: ^0.5.6 - multiselect_formfield: ^0.1.2 + cupertino_icons: ^0.1.2 + dio: ^3.0.9 + double_back_to_close_app: ^1.2.0 + file_picker: ^1.9.0+1 flutter_phoenix: ^0.1.0 font_awesome_flutter: ^8.8.1 - intl: ^0.16.1 - double_back_to_close_app: ^1.2.0 - # hive: ^1.4.1+1 - url_launcher: ^5.4.10 - # multi_image_picker: ^4.6.7 - # image_picker: ^0.6.7 - file_picker: ^1.9.0+1 - dio: ^3.0.9 - # camera : any - # loadmore: ^1.0.4 - # incrementally_loading_listview: ^0.3.0 - # dropdown_formfield: ^0.1.2 - path_provider: ^1.6.11 - # video_player: ^0.10.11+2 + http: ^0.12.0+3 image_picker_gallery_camera: ^0.1.6 + intl: ^0.16.1 + multiselect_formfield: ^0.1.2 + path_provider: ^1.6.11 + provider: ^3.2.0 random_string: ^2.0.1 - camera: ^0.5.8+2 + shared_preferences: ^0.5.6 + url_launcher: ^5.4.10 video_player: ^0.10.11+2 - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.2 - dev_dependencies: flutter_test: sdk: flutter @@ -104,4 +91,3 @@ flutter: # - asset: assets/Fonts/Montserrat-Italic.ttf # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages -