import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/asset_transfer_provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_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/device/device_transfer.dart'; import 'package:test_sa/models/device/asset_transfer_attachment.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/providers/ppm_service_provider.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/views/pages/user/requests/pending_requests_screen.dart'; import 'package:test_sa/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart'; import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import '../../../models/new_models/building.dart'; import '../../../models/new_models/site.dart'; import '../../../new_views/common_widgets/app_filled_button.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/site_provider.dart'; import '../../../providers/loading_list_notifier.dart'; class CreateDeviceTransferRequest extends StatefulWidget { static const String id = "/request-device-transfer"; const CreateDeviceTransferRequest({Key? key}) : super(key: key); @override State createState() => _CreateDeviceTransferRequestState(); } class _CreateDeviceTransferRequestState extends State { late AssetTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); final DeviceTransfer _transferModel = DeviceTransfer(id: 0); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); final TextEditingController _receiverNameController = TextEditingController(), _commentsController = TextEditingController(); final Asset _assetDestination = Asset(); Asset? _pickedAsset; final List _deviceImages = []; PendingAssetServiceRequest? pendingAssetServiceRequest; @override void setState(VoidCallback fn) { if (mounted) super.setState(() {}); } bool checkPendingRequest = false; void showPendingRequests() { Navigator.of(context).push(MaterialPageRoute(builder: (_) => PendingServiceRequestScreen(pendingAssetServiceRequest!))); } void _onSubmit() async { _transferModel.assetId = _pickedAsset?.id; _transferModel.destSiteId = _assetDestination.site?.id; _transferModel.destBuildingId = _assetDestination.building?.id; _transferModel.destFloorId = _assetDestination.floor?.id; _transferModel.destDepartmentId = _assetDestination.department?.id; _transferModel.destRoomId = _assetDestination.room?.id; if (!_formKey.currentState!.validate() || !(await _transferModel.validate(context))) { return; } _formKey.currentState!.save(); List attachement = []; for (var item in _deviceImages) { attachement.add(AssetTransferAttachment(id: 0, attachmentName: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); } _transferModel.attachments = attachement; await _deviceTransferProvider.createRequest( context: context, model: _transferModel, ); if(_deviceTransferProvider.stateCode==200){ DashBoardProvider dashBoardProvider = Provider.of(context,listen: false); dashBoardProvider.refreshDashboard(context: context,userType: UsersTypes.nurse); } } @override void initState() { WidgetsBinding.instance.addPostFrameCallback((_) async { Provider.of(context, listen: false).getDate(); }); super.initState(); } @override void dispose() { _requestedQuantityController.dispose(); _deviceTransferProvider.reset(); _receiverNameController.dispose(); _commentsController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context, listen: false); return Scaffold( key: _scaffoldKey, appBar: DefaultAppBar( title: context.translation.createAssetTransferRequest, titleStyle: AppTextStyles.heading3.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ), body: Form( key: _formKey, child: SafeArea( child: Column( children: [ SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AssetPicker( device: _pickedAsset, showLoading: false, borderColor: AppColor.black20, backgroundColor: AppColor.white936, onPick: (asset) async { _pickedAsset = asset; // await checkAssetForPendingServiceRequest(asset.id!.toInt()); // if (_pickedAsset != null && pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) { // showPendingRequestBottomSheet(); // } setState(() {}); }), // if (pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) ...[ // 8.height, // Row( // children: [ // const Icon(Icons.warning, color: Color(0xffEE404C), size: 14), // 8.width, // Text( // "This asset already have ${pendingAssetServiceRequest!.details!.length} request pending", // style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500, color: Color(0xff7D859A), decoration: TextDecoration.underline), // ).expanded, // ], // ).onPress(() { // showPendingRequests(); // }), // ], 21.height, requestTypeWidget(context), 12.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SingleItemDropDownMenu( context: context, title: context.translation.site, initialValue: _assetDestination.site, showShadow: false, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, onSelect: (value) { _assetDestination.site = value; _assetDestination.building = null; _assetDestination.floor = null; _assetDestination.department = null; setState(() {}); }, ).expanded, 8.width, SingleItemDropDownMenu( context: context, title: context.translation.building, initialValue: _assetDestination.building, showShadow: false, showAsBottomSheet: true, backgroundColor: AppColor.neutral100, enabled: _assetDestination.site?.buildings?.isNotEmpty ?? false, staticData: _assetDestination.site?.buildings ?? [], onSelect: (value) { _assetDestination.building = value; _assetDestination.floor = null; _assetDestination.department = null; setState(() {}); }, ).expanded, ], ), 8.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SingleItemDropDownMenu( context: context, title: context.translation.floor, showShadow: false, showAsBottomSheet: true, initialValue: _assetDestination.floor, backgroundColor: AppColor.neutral100, enabled: _assetDestination.building?.floors?.isNotEmpty ?? false, staticData: _assetDestination.building?.floors ?? [], onSelect: (value) { _assetDestination.floor = value; _assetDestination.department = null; setState(() {}); }, ).expanded, 8.width, SingleItemDropDownMenu( context: context, title: context.translation.department, showShadow: false, showAsBottomSheet: true, initialValue: _assetDestination.department, backgroundColor: AppColor.neutral100, enabled: _assetDestination.floor?.departments?.isNotEmpty ?? false, staticData: _assetDestination.floor?.departments ?? [], onSelect: (value) { _assetDestination.department = value; _assetDestination.room = null; setState(() {}); }, ).expanded, ], ), 8.height, AppTextFormField( controller: _commentsController, backgroundColor: AppColor.neutral100, labelText: context.translation.callComments, labelStyle: AppTextStyles.textFieldLabelStyle, alignLabelWithHint: true, textInputType: TextInputType.multiline, showShadow: false, onSaved: (text) { _transferModel.comment = text; }, ), 8.height, 23.height, MultiFilesPicker( label: context.translation.attachImage, files: _deviceImages, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), ), // 100.height, ], ).toShadowContainer(context).paddingOnly(top: 20, start: 16, end: 16), ).expanded, FooterActionButton.footerContainer( child: AppFilledButton(buttonColor: AppColor.primary10, label: context.translation.submitRequest, maxWidth: true, onPressed: _onSubmit), ), ], ), ), ), ); } Future checkAssetForPendingServiceRequest(int assetId) async { checkPendingRequest = true; setState(() {}); pendingAssetServiceRequest = await _deviceTransferProvider.checkAssetPendingRequest(assetId); await Future.delayed(const Duration(milliseconds: 250)); checkPendingRequest = false; setState(() {}); } void showPendingRequestBottomSheet() async { bool view = (await showModalBottomSheet( context: context, isDismissible: false, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular(20), ), ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (BuildContext context) => PendingRequestBottomSheet(pendingAssetServiceRequest!, _pickedAsset!), )) as bool; if (view) { showPendingRequests(); } } Widget requestTypeWidget(BuildContext context) { return Consumer(builder: (cxt, snapshot, _) { try { _transferModel.transferType ??= snapshot.items.first; } catch (ex) { print("snapshot.items:${snapshot.items.length}"); } return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ context.translation.requestType.bodyText(context).custom(color: AppColor.white936), 8.height, Wrap( runSpacing: 8, spacing: 8, children: [ for (var element in snapshot.items) Row( mainAxisSize: MainAxisSize.min, children: [ SizedBox( width: 24, height: 24, child: Radio( value: element, activeColor: AppColor.primary10, fillColor: WidgetStateColor.resolveWith((states) { if (states.contains(WidgetState.selected)) { return AppColor.primary10; // Thumb color when selected } return Colors.grey; // Thumb color when unselected (grey) }), groupValue: _transferModel.transferType, onChanged: (state) { _transferModel.transferType = element; setState(() {}); // }); }), ), 8.width, Text(element.name ?? '', style: AppTextStyles.tinyFont.copyWith(color: AppColor.neutral120)), ], ) ], ).toShimmer(isShow: snapshot.loading), ], ); }); } }