import 'package:fcs/domain/entities/market.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/market/market_editor.dart'; import 'package:fcs/pages/market/model/market_model.dart'; import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/package/tracking_id_page.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/user_search/user_search.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/input_text.dart'; import 'package:fcs/pages/widgets/local_app_bar.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/multi_img_controller.dart'; import 'package:fcs/pages/widgets/multi_img_file.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../../domain/entities/fcs_shipment.dart'; import '../fcs_shipment/model/fcs_shipment_model.dart'; import '../widgets/local_dropdown.dart'; class ProcessingEditEditor extends StatefulWidget { final Package package; const ProcessingEditEditor({super.key, required this.package}); @override _ProcessingEditEditorState createState() => _ProcessingEditEditorState(); } class _ProcessingEditEditorState extends State { final DateFormat dateFormat = DateFormat("d MMM yyyy"); TextEditingController _remarkCtl = TextEditingController(); TextEditingController _descCtl = TextEditingController(); Package? _package; User? _consignee; User? _sender; bool _isLoading = false; List _shipments = []; FcsShipment? _shipment; MultiImgController multiImgController = MultiImgController(); @override void initState() { super.initState(); _package = widget.package; selectedMarket = _package!.market ?? ""; _descCtl.text = _package!.desc ?? ""; _remarkCtl.text = _package!.remark ?? ""; multiImgController.setImageUrls = _package!.photoUrls; _consignee = User( fcsID: _package!.fcsID ?? "", name: _package!.userName ?? "", phoneNumber: _package!.phoneNumber ?? ""); _sender = User( fcsID: _package!.senderFCSID ?? "", name: _package!.senderName ?? "", phoneNumber: _package!.senderPhoneNumber ?? ""); _loadShipment(); } _loadShipment() async { var fcsShipments = await context.read().getActiveFcsShipments(); _shipments = fcsShipments; var s = FcsShipment( id: widget.package.id, shipmentNumber: widget.package.shipmentNumber); if (_shipments.contains(s)) { _shipment = s; } else { _shipment = null; } if (mounted) { setState(() {}); } } @override Widget build(BuildContext context) { final trackingIdBox = DisplayText( text: _package!.trackingID, labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); final completeProcessingBtn = fcsButton( context, getLocalString(context, 'processing.edit.complete.btn'), callack: _completeProcessing, ); final descBox = InputText( labelTextKey: 'processing.desc', iconData: MaterialCommunityIcons.message_text_outline, controller: _descCtl); final remarkBox = InputText( labelTextKey: 'processing.remark', iconData: Entypo.new_message, controller: _remarkCtl); final img = MultiImageFile( enabled: true, controller: multiImgController, title: "Receipt File", ); final consigneeBox = userSearchBox(context, lableKey: 'box.consignee.title', icon: MaterialCommunityIcons.account_arrow_left, user: _consignee, onSearch: () => searchUser(context, onUserSelect: (u) { setState(() { _consignee = u; }); }, popPage: true)); final senderBox = userSearchBox(context, lableKey: 'box.sender.title', icon: MaterialCommunityIcons.account_arrow_right, user: _sender, onSearch: () => searchUser(context, onUserSelect: (u) { setState(() { _sender = u; }); }, popPage: true)); final fcsShipmentsBox = Container( padding: EdgeInsets.symmetric(vertical: 15), child: LocalDropdown( callback: (v) { setState(() { _shipment = v; }); }, labelKey: "box.shipment", iconData: Ionicons.ios_airplane, display: (u) => u.shipmentNumber, selectedValue: _shipment, values: _shipments, )); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: LocalAppBar( labelKey: "processing.edit.title", backgroundColor: Colors.white, labelColor: primaryColor, arrowColor: primaryColor, onBack: () { if (isDataChanged()) { showConfirmDialog(context, "back.button_confirm", () { Navigator.of(context).pop(); }); } else { Navigator.of(context).pop(); } }, ), body: Padding( padding: const EdgeInsets.only(left: 12.0, right: 12, top: 10), child: ListView( children: [ trackingIdBox, Row( children: [ Flexible(child: consigneeBox), Flexible(child: senderBox) ], ), const SizedBox(height: 8), fcsShipmentsBox, marketDropdown(), descBox, remarkBox, const SizedBox(height: 10), img, SizedBox(height: 20), completeProcessingBtn, SizedBox(height: 30) ], ), ), ), ); } String? selectedMarket; Widget marketDropdown() { List _markets = Provider.of(context).markets; List markets = _markets.map((e) => e.name).toList(); markets.insert(0, MANAGE_MARKET); if (!markets.contains(selectedMarket)) { markets.insert(0, selectedMarket); } return Padding( padding: const EdgeInsets.only(left: 5.0, right: 0, top: 10), child: Row( children: [ Padding( padding: const EdgeInsets.only(left: 0, right: 10), child: Icon(Icons.store, color: primaryColor), ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(right: 18.0), child: LocalText( context, "processing.market", color: Colors.black54, fontSize: 16, ), ), DropdownButton( isDense: true, value: selectedMarket, style: TextStyle(color: Colors.black, fontSize: 14), underline: Container( height: 1, color: Colors.grey, ), onChanged: (String? newValue) { setState(() { if (newValue == MANAGE_MARKET) { selectedMarket = null; _manageMarket(); return; } selectedMarket = newValue; }); }, isExpanded: true, items: markets.map>((String? value) { return DropdownMenuItem( value: value, child: Text(value ?? "", overflow: TextOverflow.ellipsis, style: TextStyle( color: value == MANAGE_MARKET ? secondaryColor : primaryColor)), ); }).toList(), ), ], ), ), ], ), ); } _manageMarket() { Navigator.push( context, CupertinoPageRoute(builder: (context) => MarketEditor()), ); } _completeProcessing() async { if (_consignee!.fcsID == null || _consignee!.fcsID == "") { showMsgDialog(context, "Error", "Expected FCS-ID"); return; } setState(() { _isLoading = true; }); PackageModel packageModel = Provider.of(context, listen: false); try { _package!.fcsID = _consignee!.fcsID; _package!.senderFCSID = _sender!.fcsID; _package!.desc = _descCtl.text; _package!.remark = _remarkCtl.text; _package!.market = selectedMarket ?? ""; await packageModel.updateProcessing(_package!, multiImgController.getAddedFile, multiImgController.getDeletedUrl); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } isDataChanged() { var package = Package( fcsID: _consignee!.fcsID, senderFCSID: _sender!.fcsID, market: selectedMarket, desc: _descCtl.text, remark: _remarkCtl.text, photoUrls: widget.package.photoUrls, shipmentId: _shipment?.id); return widget.package.isChangedForEditProcessing(package) || multiImgController.getAddedFile.isNotEmpty || multiImgController.getDeletedUrl.isNotEmpty; } }