import 'package:fcs/constants.dart'; import 'package:fcs/domain/entities/fcs_shipment.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/fcs_shipment/model/fcs_shipment_model.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/local_app_bar.dart'; import 'package:fcs/pages/widgets/local_button.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/pdf_screen.dart'; import 'package:fcs/pages/widgets/popupmenu.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:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'fcs_shipment_editor.dart'; class FcsShipmentInfo extends StatefulWidget { final FcsShipment fcsShipment; const FcsShipmentInfo({super.key, required this.fcsShipment}); @override _FcsShipmentInfoState createState() => _FcsShipmentInfoState(); } class _FcsShipmentInfoState extends State { var dateFormatter = DateFormat('dd MMM yyyy'); final NumberFormat numberFormatter = NumberFormat("#,###"); late FcsShipment _fcsShipment; bool _isLoading = false; TextEditingController shipmentNumberController = TextEditingController(); TextEditingController cutoffDateController = TextEditingController(); TextEditingController arrivalDateController = TextEditingController(); TextEditingController departureDateControler = TextEditingController(); TextEditingController shipmentTypeControler = TextEditingController(); TextEditingController consigneeController = TextEditingController(); TextEditingController portController = TextEditingController(); TextEditingController destinationController = TextEditingController(); TextEditingController statusController = TextEditingController(); @override void initState() { super.initState(); _fcsShipment = widget.fcsShipment; _load(); } _load() { shipmentNumberController.text = _fcsShipment.shipmentNumber ?? ""; if (_fcsShipment.cutoffDate != null) { cutoffDateController.text = dateFormatter.format(_fcsShipment.cutoffDate!); } if (_fcsShipment.etaDate != null) { arrivalDateController.text = dateFormatter.format(_fcsShipment.etaDate!); } if (_fcsShipment.departureDate != null) { departureDateControler.text = dateFormatter.format(_fcsShipment.departureDate!); } shipmentTypeControler.text = _fcsShipment.shipmentTypeName ?? ""; consigneeController.text = _fcsShipment.consigneeName ?? ''; portController.text = _fcsShipment.loadingPortName ?? ''; destinationController.text = _fcsShipment.destinationPortName ?? ''; statusController.text = _fcsShipment.status ?? ""; } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { final cutoffDateDBox = DisplayText( text: cutoffDateController.text, labelTextKey: "FCSshipment.cutoff_date", iconData: Icons.date_range, ); final etaBox = DisplayText( text: arrivalDateController.text, labelTextKey: "FCSshipment.ETA", iconData: Icons.date_range, ); final cartonBox = DisplayText( text: numberFormatter.format(_fcsShipment.cartonCount), labelTextKey: "FCSshipment.carton", iconData: MaterialCommunityIcons.package, ); final packageBox = DisplayText( text: numberFormatter.format(_fcsShipment.packageCount), labelTextKey: "FCSshipment.package", iconData: Octicons.package, ); final shipTypeBox = DisplayText( text: shipmentTypeControler.text, labelTextKey: "FCSshipment.shipment_type", iconData: Ionicons.ios_airplane, ); final consigneeBox = DisplayText( text: consigneeController.text, labelTextKey: "FCSshipment.consignee", iconData: Icons.work, ); final portBox = DisplayText( text: portController.text, labelTextKey: "FCSshipment.port_of_loading", iconData: FontAwesomeIcons.ship, ); final destinationBox = DisplayText( text: destinationController.text, labelTextKey: "FCSshipment.final_destination", iconData: MaterialCommunityIcons.location_enter, ); final statusBox = DisplayText( text: statusController.text, labelTextKey: "FCSshipment.status", iconData: Feather.clock, ); final shipBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( textKey: "FCSshipment.ship.btn", callBack: _ship, ), ); final processBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( textKey: "FCSshipment.process.btn", callBack: _process, ), ); final arriveBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( textKey: "FCSshipment.arrive.btn", callBack: _arrive, ), ); final invoiceBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( textKey: "FCSshipment.invoiced.btn", callBack: _invoice, ), ); final deliverBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( textKey: "FCSshipment.deliver.btn", callBack: _deliver, ), ); final cancelBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( color: dangerColor, textKey: "FCSshipment.cancel.btn", callBack: () { showConfirmDialog(context, "FCSshipment.cancel.confirm", () { _cancelFcsShipment(); }); }, ), ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: LocalAppBar( titleWidget: Column( children: [ LocalText(context, "FCSshipment.form.title", fontSize: 20, color: primaryColor), Text(shipmentNumberController.text, style: TextStyle(fontSize: 15, color: Colors.black)) ], ), backgroundColor: Colors.white, labelColor: primaryColor, arrowColor: primaryColor, actions: [ _fcsShipment.status == fcs_shipment_pending_status ? IconButton( icon: Icon(Icons.edit, color: primaryColor), onPressed: _edit, ) : const SizedBox(), //menuPopWidget(context) ], ), body: Card( elevation: 0, child: Padding( padding: const EdgeInsets.only(left: 12.0, right: 12), child: ListView(children: [ statusBox, Row(mainAxisAlignment: MainAxisAlignment.end, children: [ Expanded( child: cutoffDateDBox, // flex: 2, ), Flexible(child: etaBox), ]), Row( children: [ Expanded( child: cartonBox, // flex: 2, ), Flexible(child: packageBox) ], ), shipTypeBox, consigneeBox, portBox, destinationBox, const SizedBox(height: 30), _fcsShipment.status == fcs_shipment_pending_status ? processBtn : Container(), _fcsShipment.status == fcs_shipment_pending_status ? Container( padding: EdgeInsets.only(top: 3), child: cancelBtn) : Container(), _fcsShipment.status == fcs_shipment_processed_status ? shipBtn : Container(), _fcsShipment.status == fcs_shipment_shipped_status ? arriveBtn : Container(), _fcsShipment.status == fcs_shipment_arrived_status ? invoiceBtn : Container(), _fcsShipment.status == fcs_shipment_invoiced_status ? deliverBtn : Container(), SizedBox(height: 20) ]), ), ), ), ); } _edit() async { bool? updated = await Navigator.push( context, CupertinoPageRoute( builder: (context) => FcsShipmentEditor(shipment: _fcsShipment)), ); if (updated ?? false) { var shipmentModel = Provider.of(context, listen: false); if (_fcsShipment.id != null) { FcsShipment? f = await shipmentModel.getFcsShipment(_fcsShipment.id!); if (f == null) return; setState(() { _fcsShipment = f; }); _load(); } } } Widget menuPopWidget(BuildContext context) { return PopupMenuButton( elevation: 3.2, icon: Icon(Icons.more_vert, color: primaryColor), onSelected: (choice) { _showPDF(choice.id); }, itemBuilder: (BuildContext context) { return menuPopup.map((PopupMenu choice) { return PopupMenuItem( value: choice, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( padding: EdgeInsets.only(left: 15), child: LocalText( context, choice.status, color: primaryColor, )), ], ), ); }).toList(); }); } _process() { showConfirmDialog(context, "FCSshipment.process.confirm", () { _processFcsShipment(); }); } _processFcsShipment() async { setState(() { _isLoading = true; }); try { await context.read().process(_fcsShipment.id!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _ship() { showConfirmDialog(context, "FCSshipment.ship.confirm", () { _shipFcsShipment(); }); } _shipFcsShipment() async { setState(() { _isLoading = true; }); try { await context.read().ship(_fcsShipment.id!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _arrive() { showConfirmDialog(context, "FCSshipment.arrive.confirm", () { _arriveFcsShipment(); }); } _arriveFcsShipment() async { setState(() { _isLoading = true; }); try { await context.read().arrive(_fcsShipment.id!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _invoice() { showConfirmDialog(context, "FCSshipment.invoice.confirm", () { _invoiceFcsShipment(); }); } _invoiceFcsShipment() async { setState(() { _isLoading = true; }); try { await context.read().invoice(_fcsShipment.id!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _cancelFcsShipment() async { setState(() { _isLoading = true; }); try { await context.read().cancel(_fcsShipment.id!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _deliver() { showConfirmDialog(context, "FCSshipment.deliver.confrim", () { _deliverFcsShipment(); }); } _deliverFcsShipment() async { setState(() { _isLoading = true; }); try { await context.read().deliver(_fcsShipment.id!); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _showPDF(int id) async { setState(() { _isLoading = true; }); try { var reportName = ""; if (id == 1) { reportName = "commercial_invoice"; } else if (id == 2) { reportName = "packing_list"; } else if (id == 3) { reportName = "dms"; } else if (id == 4) { reportName = "manifest"; } _fcsShipment.reportName = reportName; FcsShipmentModel fcsShipmentModel = Provider.of(context, listen: false); String url = await fcsShipmentModel.report(_fcsShipment); Navigator.of(context).push(CupertinoPageRoute( builder: (context) => PDFScreen( title: "", url: url, ))); // Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } }