import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/parts_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_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/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../../models/lookup.dart'; import '../../../../../models/service_request/spare_parts.dart'; import '../../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../controllers/validator/validator.dart'; class VerifyAssetDetail extends StatefulWidget { static const String id = "/verify-assets-detail"; const VerifyAssetDetail({Key? key}) : super(key: key); @override _VerifyAssetDetailState createState() => _VerifyAssetDetailState(); } class _VerifyAssetDetailState extends State with TickerProviderStateMixin { late UserProvider _userProvider; late SettingProvider _settingProvider; late ServiceRequestsProvider _serviceRequestsProvider; late ServiceStatusProvider _assetTypeProvider; late PartsProvider _partsProvider; late ServiceReport _serviceReport; bool _isLoading = false; List _spareParts = []; final List _files = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); final TextEditingController _faultController = TextEditingController(); final TextEditingController _workPreformedController = TextEditingController(); final TextEditingController _partQtyController = TextEditingController(); final TextEditingController _oracleNoController = TextEditingController(); @override void initState() { _serviceReport = ServiceReport( // returnToService: DateTime.now(), // //type: const Lookup(value: 2), // device: widget.request.device, sparePartsWorkOrders: [], ); super.initState(); if (context.mounted) { ServiceRequestsProvider serviceRequestsProvider = Provider.of(context, listen: false); Provider.of(context, listen: false).reset(); Provider.of(context, listen: false).reset(); Provider.of(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest!.id; } // _isLoading = true; } @override void dispose() { _faultController.dispose(); _workPreformedController.dispose(); _partQtyController.dispose(); super.dispose(); } void getRequestForWorkOrder() async { _isLoading = true; setState(() {}); ServiceRequestsProvider serviceRequestsProvider = Provider.of(context, listen: false); _serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest!.id!); await _assetTypeProvider.getTypes(); _serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee; _serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType; _serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web _spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest!.deviceId!); _isLoading = false; setState(() {}); } @override Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); _assetTypeProvider = Provider.of(context); _partsProvider = Provider.of(context); if (_serviceReport.callRequest == null) { getRequestForWorkOrder(); } _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( (element) => element.value == _serviceReport.callRequest?.assetType, orElse: null, ); return Scaffold( key: _scaffoldKey, appBar: DefaultAppBar(title: context.translation.verify_asset_details), body: Consumer(builder: (context, serviceRequestProvider, child) { return SafeArea( child: LoadingManager( isLoading: _isLoading, isFailedLoading: false, stateCode: 200, onRefresh: () async {}, child: Form( key: _formKey, child: Column( children: [ SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Card( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ context.translation.sparePartDetails.heading5(context), 12.height, SingleItemDropDownMenu( context: context, title: context.translation.partNo, staticData: _spareParts, height: 80.toScreenHeight, showShadow: false, initialValue: serviceRequestProvider.initialSelectedSparePart.sparePart, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, onSelect: (part) { serviceRequestProvider.initialSelectedSparePart = SparePartsWorkOrders(id: 0, sparePart: part, qty: 0); }, ), 15.height, AppTextFormField( controller: _partQtyController, labelText: context.translation.quantity, textInputType: TextInputType.number, contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight), showWithoutDecoration: true, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null, validator: (value) => value == null || value.isEmpty ? context.translation.requiredField : Validator.isNumeric(value) ? null : context.translation.onlyNumbers, onSaved: (text) { serviceRequestProvider.initialSelectedSparePart.qty = num.tryParse(text ?? ""); }, ), 15.height, AppTextFormField( controller: _oracleNoController, labelText: context.translation.oracleNo, textInputType: TextInputType.number, showWithoutDecoration: true, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, enable: serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null, validator: (value) => value == null || value.isEmpty ? context.translation.requiredField : Validator.isNumeric(value) ? null : context.translation.onlyNumbers, onSaved: (text) { //TODO set the values... // serviceRequestProvider.initialSelectedSparePart. = num.tryParse(text ?? ""); }, ), 15.height, AppTextFormField( initialValue: _serviceReport.comment, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, labelText: context.translation.description, alignLabelWithHint: true, labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.black10), showWithoutDecoration: true, textInputType: TextInputType.multiline, onSaved: (value) { _serviceReport.comment = value; }, ), 15.height, MultiFilesPicker(label: context.translation.attachQuotation, files: _files), ], ).paddingAll(12), ), 8.height, ], ), ).paddingAll(16).expanded, FooterActionButton.footerContainer(child: AppFilledButton( label: context.translation.addSparePartActivity, buttonColor: AppColor.green70, onPressed: () async { ServiceRequestBottomSheet.actionBottomSheet(context: context, title: context.translation.addSparePartActionHeading); // bool shouldReloadData = (await showModalBottomSheet( // context: context, // useSafeArea: true, // isScrollControlled: true, // backgroundColor: Colors.transparent, // builder: (context) => ActionBottomSheet(title: context.translation.addSparePartActionHeading), // )) as bool; // if (shouldReloadData ?? false) {} //TODO write add sparepart logic // if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) { // setState(() {}); // return; // } // _formKey.currentState.save(); // _serviceReport.attachmentsWorkOrder ??= []; // if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; // for (var file in _files) { // _serviceReport.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); // } // final user = Provider.of(context, listen: false).user; // await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user); }, )), ], ), ), ), ); }), ); } }