import 'package:fcs/domain/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; FcsShipmentInfo({this.fcsShipment}); @override _FcsShipmentInfoState createState() => _FcsShipmentInfoState(); } class _FcsShipmentInfoState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); FcsShipment? _fcsShipment; bool _isLoading = false; TextEditingController _shipmentNumberController = new TextEditingController(); TextEditingController _cutoffDateController = new TextEditingController(); TextEditingController _arrivalDateController = new TextEditingController(); TextEditingController _departureDateControler = new TextEditingController(); TextEditingController _shipmentTypeControler = new TextEditingController(); TextEditingController _consigneeController = new TextEditingController(); TextEditingController _portController = new TextEditingController(); TextEditingController _destinationController = new TextEditingController(); TextEditingController _statusController = new 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?.arrivalDate != null) _arrivalDateController.text = dateFormatter.format(_fcsShipment!.arrivalDate!); if (_fcsShipment?.departureDate != null) _departureDateControler.text = dateFormatter.format(_fcsShipment!.departureDate!); _shipmentTypeControler.text = _fcsShipment!.shipType ?? ""; _consigneeController.text = _fcsShipment!.consignee ?? ""; _portController.text = _fcsShipment!.port ?? ""; _destinationController.text = _fcsShipment!.destination ?? ""; _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: _arrivalDateController.text, labelTextKey: "FCSshipment.carton", iconData: MaterialCommunityIcons.package, ); final packageBox = DisplayText( //text: _arrivalDateController.text, 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: _ship, ), ); final arriveBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( textKey: "FCSshipment.arrive.btn", callBack: _ship, ), ); final invoiceBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( textKey: "FCSshipment.invoice.btn", callBack: _ship, ), ); final cancelBtn = Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: LocalButton( color: dangerColor, textKey: "FCSshipment.cancel.btn", callBack: () { showConfirmDialog(context, "FCSshipment.cancel.confirm", () {}); }, ), ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: LocalAppBar( titleWidget: Text(_shipmentNumberController.text, style: TextStyle(fontSize: 20, color: primaryColor)), backgroundColor: Colors.white, labelColor: primaryColor, arrowColor: primaryColor, actions: [ IconButton( icon: Icon(Icons.edit, color: primaryColor), onPressed: _edit, ), //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_processing_status ? shipBtn : Container(), _fcsShipment?.status == fcs_shipment_shipped_status ? arriveBtn : Container(), _fcsShipment?.status == fcs_shipment_arrived_status ? invoiceBtn : 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 != null && _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(); }); } _ship() { showConfirmDialog(context, "FCSshipment.ship.confirm", () { _shipFcsShipment(); }); } _shipFcsShipment() async { setState(() { _isLoading = true; }); try { FcsShipmentModel fcsShipmentModel = Provider.of(context, listen: false); await fcsShipmentModel.ship(_fcsShipment!); 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; }); } } }