import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/gas_refill/building_type_menu.dart'; import 'package:test_sa/views/widgets/gas_refill/department_type_menu.dart'; import 'package:test_sa/views/widgets/gas_refill/floor_type_menu.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field_new.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_type.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/providers/api/hospitals_provider.dart'; import '../../../../extensions/text_extensions.dart'; import '../../../../models/new_models/gas_refill_model.dart'; import '../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../../providers/gas_request_providers/gas_status_provider.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; final GasRefillModel gasRefillModel; const RequestGasRefill({this.gasRefillModel, Key key}) : super(key: key); @override State createState() => _RequestGasRefillState(); } class _RequestGasRefillState extends State { bool _isLoading = false; bool _validate = false; UserProvider _userProvider; SettingProvider _settingProvider; GasRefillProvider _gasRefillProvider; GasRefillDetails _currentDetails = GasRefillDetails(); final TextEditingController _deliveredQuantityController = TextEditingController(); final TextEditingController _commentController = TextEditingController(); final TextEditingController _workingHoursController = TextEditingController(); GasRefillModel _formModel = GasRefillModel(gazRefillDetails: []); final GlobalKey _formKey = GlobalKey(); final GlobalKey _DetailsKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); bool _firstTime = true; @override void initState() { super.initState(); if (widget.gasRefillModel != null) { _formModel = widget.gasRefillModel; } } @override void setState(VoidCallback fn) { if (mounted) super.setState(() {}); } _onSubmit(BuildContext context) async { if (_formModel.gazRefillDetails.isEmpty) { if (!(await _addNewModel(context))) return; } //_isLoading = true; setState(() {}); // if (widget.gasRefillModel != null) { // if (!(await _formModel.validate(context))) { // _isLoading = false; // setState(() {}); // return; // } // } //if(!(_formKey.currentState.validate())) return; // if (_gasRefillProvider.department?.name == null) { // ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("Select department"))); // _isLoading = false; // setState(() {}); // return; // } int status = widget.gasRefillModel == null ? null /*await _gasRefillProvider.createModel( user: _userProvider.user, model: _formModel, )*/ : await _gasRefillProvider.updateModel( user: _userProvider.user, host: _settingProvider.host, oldModel: widget.gasRefillModel, newModel: _formModel, ); //_isLoading = false; setState(() {}); if (status >= 200 && status < 300) { Fluttertoast.showToast( msg: context.translation.successfulRequestMessage, ); Navigator.of(context).pop(_formModel); setState(() {}); } else { String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(errorMessage), )); } } Future _addNewModel(BuildContext context) async { _validate = true; if (!_formKey.currentState.validate()) { setState(() {}); return false; } _formKey.currentState.save(); if (!(await _currentDetails.validate(context))) { setState(() {}); return false; } _formModel.gazRefillDetails.insert(0, _currentDetails); _validate = false; Scrollable.ensureVisible(_DetailsKey.currentContext); _deliveredQuantityController.clear(); _workingHoursController.clear(); _commentController.clear(); _currentDetails = GasRefillDetails(); setState(() {}); return true; } @override void dispose() { _deliveredQuantityController.dispose(); _commentController.dispose(); _workingHoursController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); if (_gasRefillProvider == null) { _gasRefillProvider = Provider.of(context, listen: false); //_gasRefillProvider.reset(); } if (_firstTime) { String _clientName; if (widget.gasRefillModel != null) { //_formModel.status = widget.gasRefillModel?.status ?? Lookup(value: 0); _gasRefillProvider.expectedDateTime = DateTime.tryParse(_formModel.expectedDate??""); _gasRefillProvider.timer = TimerModel(startAt: DateTime.tryParse(widget.gasRefillModel?.startDate??""), endAt: DateTime.tryParse(widget.gasRefillModel?.endDate??"")); _clientName = _formModel.site.custName; } else { _gasRefillProvider.timer = null; _clientName = _userProvider.user?.clientName; } HospitalsProvider().getHospitalsListByVal(searchVal: _clientName).then((value) { _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == _clientName, orElse: () => null); _gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null); _gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null); _gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null); _firstTime = false; setState(() {}); }); } return Scaffold( appBar: DefaultAppBar(title: context.translation.updateRequest), key: _scaffoldKey, body: Form( key: _formKey, child: SafeArea( child: LoadingManager( isLoading: _isLoading, isFailedLoading: false, stateCode: 200, onRefresh: () async {}, child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( children: [ Container( width: MediaQuery.of(context).size.width, decoration: ShapeDecoration( color: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(context.translation.gasRefill, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), 8.height, Text( 'Gas Request:', style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), ), Text( 'Cylinder Size: ${widget.gasRefillModel.gazRefillDetails[0].cylinderSize.value}', style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), ), Text( 'Request Quantity: ${widget.gasRefillModel.gazRefillDetails[0].requestedQty}', style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), ), Text( 'Site: ${widget.gasRefillModel.site.name}', style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), ), ], ).paddingAll(16), ), 12.height, AppTextFormField( labelText: context.translation.workingHours, onSaved:(value){ _formModel?.workingHours = double.tryParse(value); }, textInputType: TextInputType.number, controller: _workingHoursController, validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", ), 12.height, SingleItemDropDownMenu( context: context, title: context.translation.reportStatus, initialValue: _formModel.status, onSelect: (value) { _formModel.status=value; }, ), 12.height, AppTextFormField( labelText: context.translation.deliveredQuantity, onSaved:(value){ _currentDetails?.deliverdQty = double.tryParse(value); }, textInputType: TextInputType.number, controller: _deliveredQuantityController, validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", ), 12.height, /// TBD AppTextFormField( labelText: context.translation.comments, textInputType: TextInputType.multiline, alignLabelWithHint: true, controller: _commentController, onSaved: (value){ }, ), ], ).paddingAll(16), AButton( text: widget.gasRefillModel == null ? context.translation.submit : context.translation.update, onPressed:()async{_onSubmit.call(context);}, ).paddingAll(16), ], ), ) ), ), ), ); } }