You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			268 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			268 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Dart
		
	
 | 
						|
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/new_views/common_widgets/app_filled_button.dart';
 | 
						|
import 'package:test_sa/views/widgets/loaders/loading_manager.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<RequestGasRefill> createState() => _RequestGasRefillState();
 | 
						|
}
 | 
						|
 | 
						|
class _RequestGasRefillState extends State<RequestGasRefill> {
 | 
						|
  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<FormState> _formKey = GlobalKey<FormState>();
 | 
						|
  final GlobalKey _DetailsKey = GlobalKey<FormState>();
 | 
						|
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 | 
						|
  bool _firstTime = true;
 | 
						|
 | 
						|
  @override
 | 
						|
  void initState() {
 | 
						|
    super.initState();
 | 
						|
    if (widget.gasRefillModel != null) {
 | 
						|
      _formModel.fromGasRefillModel(widget.gasRefillModel);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  void setState(VoidCallback fn) {
 | 
						|
    if (mounted) super.setState(() {});
 | 
						|
  }
 | 
						|
 | 
						|
  _onSubmit(BuildContext context) async {
 | 
						|
    if (_formModel.gazRefillDetails.isEmpty) {
 | 
						|
      if (!(await _addNewModel(context))) return;
 | 
						|
    }
 | 
						|
 | 
						|
    setState(() {});
 | 
						|
 | 
						|
    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<bool> _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<UserProvider>(context);
 | 
						|
    _settingProvider = Provider.of<SettingProvider>(context);
 | 
						|
    if (_gasRefillProvider == null) {
 | 
						|
      _gasRefillProvider = Provider.of<GasRefillProvider>(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: Column(
 | 
						|
              children: [
 | 
						|
                SingleChildScrollView(
 | 
						|
                  child: 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,
 | 
						|
                            /// TBD
 | 
						|
                            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<Lookup,GasStatusProvider >(
 | 
						|
                        context: context,
 | 
						|
                        title: context.translation.reportStatus,
 | 
						|
                        initialValue: widget.gasRefillModel.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)
 | 
						|
                ).expanded,
 | 
						|
                AppFilledButton(
 | 
						|
                  label: widget.gasRefillModel == null ? context.translation.submit : context.translation.update,
 | 
						|
                  onPressed:()async{_onSubmit.call(context);},
 | 
						|
                ).paddingAll(16),
 | 
						|
              ],
 | 
						|
            )
 | 
						|
           ),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |