From b77a36ac506e8c0f28b78109dabf70ce86271825 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 17 Oct 2023 10:22:25 +0300 Subject: [PATCH] Gas refill screen --- lib/controllers/api_routes/urls.dart | 2 +- .../providers/api/gas_refill_provider.dart | 10 +++--- lib/main.dart | 2 ++ lib/models/enums/translation_keys.dart | 1 + lib/models/new_models/gas_refill_model.dart | 20 +++++++++++ .../single_item_drop_down_menu.dart | 29 ++++++++-------- .../pages/new_gas_refill_request_page.dart | 34 +++++++++++++++---- lib/providers/loading_list_notifier.dart | 3 +- 8 files changed, 73 insertions(+), 28 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index b5b933a8..870435ce 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -21,7 +21,7 @@ class URLs { // static String getFileUrl(String file) => (file == null || file.isEmpty) ? null :1 (file.contains("/") ? file : "$_host/attachment/$file"); // API Routes - static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // post + static get login => "$_baseUrl/MobileAuth/Login"; // post static get register => "$_baseUrl/handle/create/user"; // post static get updateProfile => "$_baseUrl/update/user/profile"; // post static get getSites => "$_baseUrl/Customer/GetCustomers"; // get diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 9e24fcb6..8bb52ea8 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -7,6 +7,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/new_models/gas_refill_model.dart' as gasModel; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; @@ -89,9 +90,8 @@ class GasRefillProvider extends ChangeNotifier { } Future createModel({ - @required String host, @required User user, - @required GasRefillModel model, + @required gasModel.GasRefillModel model, }) async { Map body = { "uid": user.id.toString(), @@ -109,12 +109,12 @@ class GasRefillProvider extends ChangeNotifier { "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), }; - body["gazRefillDetails"] = model.details + body["gazRefillDetails"] = model.gazRefillDetails .map((model) => { - "gasType": model.type.toMap(), + "gasType": model.gasType.toMap(), "cylinderSize": model.cylinderSize.toMap(), "cylinderType": model.cylinderType.toMap(), - "requestedQty": model.requestedQuantity, + "requestedQty": model.requestedQty, }) .toList(); diff --git a/lib/main.dart b/lib/main.dart index 8892d5ec..42bb8a00 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,6 +20,7 @@ import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/views/pages/user/land_page.dart' as old; +import 'controllers/providers/api/gas_refill_provider.dart'; import 'controllers/providers/api/user_provider.dart'; import 'controllers/providers/settings/setting_provider.dart'; import 'new_views/pages/new_gas_refill_request_page.dart'; @@ -65,6 +66,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => CylinderSizeProvider()), ChangeNotifierProvider(create: (_) => DepartmentProvider()), ChangeNotifierProvider(create: (_) => SiteProvider()), + ChangeNotifierProvider(create: (_) => GasRefillProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/enums/translation_keys.dart b/lib/models/enums/translation_keys.dart index d002ab82..abfa82b4 100644 --- a/lib/models/enums/translation_keys.dart +++ b/lib/models/enums/translation_keys.dart @@ -36,4 +36,5 @@ enum TranslationKeys { youHaveToSelect, building, floor, + createdSuccessfully, } diff --git a/lib/models/new_models/gas_refill_model.dart b/lib/models/new_models/gas_refill_model.dart index 37edb645..a68305ba 100644 --- a/lib/models/new_models/gas_refill_model.dart +++ b/lib/models/new_models/gas_refill_model.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/cupertino.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/extensions/context_extension.dart'; @@ -46,6 +48,7 @@ class GasRefillModel { site = json['site'] != null ? Site.fromJson(json['site']) : null; building = json['building'] != null ? Building.fromJson(json['building']) : null; floor = json['floor'] != null ? Floor.fromJson(json['floor']) : null; + log(json['department']); department = json['department'] != null ? Department.fromJson(json['department']) : null; assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null; status = json['status'] != null ? Lookup.fromJson(json['status']) : null; @@ -150,6 +153,23 @@ class GasRefillModel { } return map; } + + Future validate(BuildContext context) async { + if (site == null) { + await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.destinationSite)}"); + return false; + } else if (building == null) { + await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.building)}"); + return false; + } else if (floor == null) { + await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.floor)}"); + return false; + } else if (department == null) { + await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.department)}"); + return false; + } + return true; + } } class GasRefillDetails { diff --git a/lib/new_views/common_widgets/single_item_drop_down_menu.dart b/lib/new_views/common_widgets/single_item_drop_down_menu.dart index b0e25aba..deb434dd 100644 --- a/lib/new_views/common_widgets/single_item_drop_down_menu.dart +++ b/lib/new_views/common_widgets/single_item_drop_down_menu.dart @@ -17,8 +17,8 @@ class SingleItemDropDownMenu exte final List staticData; final TranslationKeys title; - /// If you want to use a static data (without calling API) - /// just use [NullableLoadingProvider] as generic data type and fill the [staticData] + /// To use a static data (without calling API) + /// just send [NullableLoadingProvider] as generic data type and fill the [staticData] const SingleItemDropDownMenu({ Key key, @required this.context, @@ -39,19 +39,18 @@ class _SingleItemDropDownMenuState(widget.context); } if (widget.initialValue != null) { - final result = (widget.staticData ?? provider?.items)?.where((element) { + final result = (X == NullableLoadingProvider ? widget.staticData : provider.items)?.where((element) { return element == widget.initialValue; }); if (result.isNotEmpty) _selectedItem = result.first; - if (widget.initialValue?.identifier ?? "" != _selectedItem?.identifier ?? "") { + if ((widget.initialValue?.identifier ?? "") != (_selectedItem?.identifier ?? "")) { widget.onSelect(_selectedItem); } } - super.initState(); } @@ -63,7 +62,7 @@ class _SingleItemDropDownMenuState oldWidget) { if (widget.initialValue != null) { - final result = (widget.staticData ?? provider?.items)?.where((element) { + final result = (X == NullableLoadingProvider ? widget.staticData : provider.items)?.where((element) { return element == widget.initialValue; }); if (result.isNotEmpty) { @@ -71,7 +70,7 @@ class _SingleItemDropDownMenuState>((value) { + items: ((X == NullableLoadingProvider) ? widget.staticData : provider.items)?.map>((value) { return DropdownMenuItem( value: value, child: Text( diff --git a/lib/new_views/pages/new_gas_refill_request_page.dart b/lib/new_views/pages/new_gas_refill_request_page.dart index 49023986..df5f2cd8 100644 --- a/lib/new_views/pages/new_gas_refill_request_page.dart +++ b/lib/new_views/pages/new_gas_refill_request_page.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; @@ -20,6 +23,7 @@ import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart' import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; +import '../../controllers/providers/api/gas_refill_provider.dart'; import '../../controllers/validator/validator.dart'; import '../common_widgets/default_app_bar.dart'; @@ -105,34 +109,44 @@ class _NewGasRefillRequestPageState extends State { SingleItemDropDownMenu( context: context, title: TranslationKeys.destinationSite, + initialValue: _gasModel.site, onSelect: (value) { - _gasModel.site = value; + setState(() { + _gasModel.site = value; + }); }, ), 8.height, SingleItemDropDownMenu( context: context, title: TranslationKeys.building, + initialValue: _gasModel.building, enabled: _gasModel.site?.buildings?.isNotEmpty ?? false, staticData: _gasModel.site?.buildings ?? [], onSelect: (value) { - _gasModel.building = value; + setState(() { + _gasModel.building = value; + }); }, ), 8.height, SingleItemDropDownMenu( context: context, title: TranslationKeys.floor, + initialValue: _gasModel.floor, enabled: _gasModel.building?.floors?.isNotEmpty ?? false, staticData: _gasModel.building?.floors ?? [], onSelect: (value) { - _gasModel.floor = value; + setState(() { + _gasModel.floor = value; + }); }, ), 8.height, SingleItemDropDownMenu( context: context, title: TranslationKeys.department, + initialValue: _gasModel.department, enabled: _gasModel.floor?.departments?.isNotEmpty ?? false, staticData: _gasModel.floor?.departments ?? [], onSelect: (value) { @@ -213,7 +227,7 @@ class _NewGasRefillRequestPageState extends State { } void _add() async { - if (_formKey.currentState.validate() && await _currentDetails.validate(context)) { + if (_formKey.currentState.validate() && await _currentDetails.validate(context) && await _gasModel.validate(context)) { _formKey.currentState.save(); _gasModel.gazRefillDetails.add(_currentDetails); _quantityController.clear(); @@ -227,7 +241,15 @@ class _NewGasRefillRequestPageState extends State { setState(() {}); } - void _submit() { - Navigator.pop(context); + Future _submit() async { + final status = await Provider.of(context, listen: false).createModel( + user: Provider.of(context, listen: false).user, + model: _gasModel, + ); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: context.translate(TranslationKeys.createdSuccessfully)); + Navigator.of(context).pop(); + setState(() {}); + } } } diff --git a/lib/providers/loading_list_notifier.dart b/lib/providers/loading_list_notifier.dart index ed04be27..45a83784 100644 --- a/lib/providers/loading_list_notifier.dart +++ b/lib/providers/loading_list_notifier.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/base.dart'; -import 'package:test_sa/models/lookup.dart'; -class NullableLoadingProvider extends LoadingListNotifier { +class NullableLoadingProvider extends LoadingListNotifier { @override Future getDate() { return Future.value();