import 'package:fcs/domain/constants.dart'; import 'package:fcs/domain/entities/box.dart'; import 'package:fcs/domain/entities/cargo.dart'; import 'package:fcs/domain/entities/pickup.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/box/model/box_model.dart'; import 'package:fcs/pages/delivery_address/delivery_address_list.dart'; import 'package:fcs/pages/delivery_address/delivery_address_row.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/shipment/model/shipment_model.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/input_date.dart'; import 'package:fcs/pages/widgets/input_text.dart'; import 'package:fcs/pages/widgets/input_time.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_datetime_picker/flutter_datetime_picker.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:flutter/material.dart'; import 'pickup_box_editor.dart'; class ShipmentEditor extends StatefulWidget { final Shipment shipment; ShipmentEditor({this.shipment}); @override _ShipmentEditorState createState() => _ShipmentEditorState(); } class _ShipmentEditorState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); final numberFormatter = new NumberFormat("#,###"); MultiImgController multiImgController = MultiImgController(); TextEditingController _addressEditingController = new TextEditingController(); TextEditingController _fromTimeEditingController = new TextEditingController(); TextEditingController _toTimeEditingController = new TextEditingController(); TextEditingController _noOfPackageEditingController = new TextEditingController(); TextEditingController _weightEditingController = new TextEditingController(); TextEditingController _recipientNameEditingController = new TextEditingController(); TextEditingController _recipientPhoneEditingController = new TextEditingController(); TextEditingController _recipientAddressEditingController = new TextEditingController(); TextEditingController _pickupDate = new TextEditingController(); TextEditingController _handlingFeeController = new TextEditingController(); Shipment _pickUp; bool _isLoading = false; var now = new DateTime.now(); bool _isNew; DeliveryAddress _pickupAddress = new DeliveryAddress(); int _currVal = 1; String selectedPickupType; @override void initState() { super.initState(); selectedPickupType = shipment_local_pickup; if (widget.shipment != null) { _isNew = false; _pickUp = widget.shipment; _addressEditingController.text = _pickUp.address; _fromTimeEditingController.text = _pickUp.fromTime; _toTimeEditingController.text = _pickUp.toTime; _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString(); _weightEditingController.text = _pickUp.weight.toString(); _pickupDate.text = dateFormatter.format(now); _handlingFeeController.text = numberFormatter.format(_pickUp.handlingFee); _currVal = _pickUp.radioIndex; var mainModel = Provider.of(context, listen: false); // _recipientNameEditingController.text = mainModel.recipient.name; // _recipientPhoneEditingController.text = mainModel.recipient.phoneNumber; // _recipientAddressEditingController.text = // mainModel.recipient.shippingAddress; } else { _isNew = true; List _cargoTypes = [ Cargo(type: 'General Cargo', weight: 25), Cargo(type: 'Medicine', weight: 20), Cargo(type: 'Dangerous Cargo', weight: 30) ]; _pickUp = Shipment(cargoTypes: _cargoTypes); } var shipmentModel = Provider.of(context, listen: false); _pickupAddress = shipmentModel.defalutAddress; } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { final fromTimeBox = InputTime( labelTextKey: 'shipment.from', iconData: Icons.timer, controller: _fromTimeEditingController); final toTimeBox = InputTime( labelTextKey: 'shipment.to', controller: _toTimeEditingController); final fromTimeBoxReadOnly = fcsInputReadOnly( 'From', Icons.timer, controller: _fromTimeEditingController, ); final toTimeBoxReadOnly = fcsInputReadOnly( 'To', null, controller: _toTimeEditingController, ); final pickupTimeBox = Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( child: fromTimeBox, width: 120, ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Text('-'), ), Container( padding: EdgeInsets.only(left: 20), child: toTimeBox, width: 120, ), ], ); final pickupTimeReadOnly = Padding( padding: const EdgeInsets.only(left: 20.0), child: Row( children: [ SizedBox(height: 5), Container( child: fromTimeBoxReadOnly, width: 120, ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Text('-'), ), Container( child: toTimeBoxReadOnly, width: 120, ), ], ), ); MainModel mainModel = Provider.of(context); var boxModel = Provider.of(context); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( centerTitle: true, leading: new IconButton( icon: new Icon(Icons.close), onPressed: () => Navigator.of(context).pop(), ), shadowColor: Colors.transparent, backgroundColor: Colors.white, title: LocalText( context, _isNew ? "shipment.new.title" : "shipment.edit.title", fontSize: 20, color: primaryColor, ), ), body: Padding( padding: const EdgeInsets.all(10.0), child: ListView( children: [ _isNew ? Container() : Center( child: Padding( padding: const EdgeInsets.only(left: 10.0, top: 8), child: Text( '#P200304', style: TextStyle( color: Colors.black87, fontSize: 14, fontWeight: FontWeight.bold), ), ), ), widget.shipment == null ? Container() : widget.shipment.isCourier ? Padding( padding: const EdgeInsets.only(left: 15.0), child: fcsInputReadOnly("Handling Fee/Courier Fee", FontAwesomeIcons.moneyBill, controller: _handlingFeeController), ) : Padding( padding: const EdgeInsets.only(left: 15.0), child: fcsInputReadOnly("Handling Fee/Courier Fee", FontAwesomeIcons.moneyBill, controller: _handlingFeeController), ), makeDropdown(), makeLocation(context, _pickupAddress), InputDate( labelTextKey: "shipment.date", iconData: Icons.date_range, controller: _pickupDate, ), pickupTimeBox, _currVal == 3 ? Container( child: DeliveryAddressRow( deliveryAddress: DeliveryAddress( fullName: 'FCS Office', addressLine1: '154-19 64th Ave.', addressLine2: 'Flushing', city: 'NY', state: 'NY', phoneNumber: '+1 (292)215-2247'), ), ) : _currVal == 4 ? Container( child: Column( children: [ Container( padding: EdgeInsets.only( top: 20, bottom: 15, right: 15), child: Align( alignment: Alignment.center, child: Container( width: 350, height: 40, child: FloatingActionButton.extended( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, onPressed: () {}, icon: Icon(Icons.arrow_right), label: Text( 'Visit courier websie for nearest drop-off', style: TextStyle(fontSize: 12), ), backgroundColor: primaryColor, ), ), ), ), ], )) : Container(), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Text( 'Boxes', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), Spacer(), IconButton( onPressed: () { Navigator.push( context, BottomUpPageRoute(PickupBoxEditor()), ); }, icon: Icon( Icons.add, color: primaryColor, )) ], ), ), Column( children: getBoxList(context, boxModel.boxes), ), mainModel.isCustomer() || _isNew ? Container() : ExpansionTile( title: Text('For FCS'), children: [ widget.shipment != null ? widget.shipment.status == 'Pending' ? Padding( padding: const EdgeInsets.only(left: 20.0), child: fcsDropDown("Assigned", MaterialCommunityIcons.worker), ) : Container() : Container(), Padding( padding: EdgeInsets.only(left: 20), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( padding: EdgeInsets.only(top: 8), child: Text( 'Attach Courier Shiping Labels', style: TextStyle( color: Colors.black, fontSize: 16), ), ), Container( padding: EdgeInsets.only(left: 10), child: MultiImageFile( enabled: true, controller: multiImgController, title: "Receipt File", )), ], ), ), ], ), widget.shipment == null ? Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Create shipment'), color: primaryColor, textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))) : Container( child: Column( children: [ widget.shipment.status == 'Confirmed' ? Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Complete Shipment'), color: primaryColor, textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))) : Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Confirm Shipment'), color: primaryColor, textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))), Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Cancel Shipment'), color: Colors.grey[600], textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))) ], )) ], ), ), ), ); } Widget makeDropdown() { ShipmentModel pickupModel = Provider.of(context); return Padding( padding: const EdgeInsets.only(left: 5.0, right: 0), child: Row( children: [ Padding( padding: const EdgeInsets.only(left: 0, right: 10), child: Icon(SimpleLineIcons.direction, color: primaryColor), ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(right: 18.0), child: LocalText( context, "shipment.type", color: Colors.black54, fontSize: 16, ), ), DropdownButton( isDense: true, value: selectedPickupType, style: TextStyle(color: Colors.black, fontSize: 14), underline: Container( height: 1, color: Colors.grey, ), onChanged: (String newValue) { setState(() { selectedPickupType = newValue; }); }, isExpanded: true, items: pickupModel.pickupTypes .map>((String value) { return DropdownMenuItem( value: value, child: Text(value ?? "", overflow: TextOverflow.ellipsis, style: TextStyle(color: primaryColor)), ); }).toList(), ), ], ), ), ], ), ); } Widget makeLocation(BuildContext context, DeliveryAddress deliveryAddress) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: DisplayText( labelTextKey: "shipment.location", iconData: MaterialCommunityIcons.truck_fast, ), ), Chip( label: InkWell( onTap: () async { DeliveryAddress d = await Navigator.push( context, BottomUpPageRoute(DeliveryAddressList( forSelection: true, )), ); setState(() { this._pickupAddress = d; }); }, child: LocalText(context, "delivery_address.change_address", color: primaryColor), )) ], ), Padding( padding: const EdgeInsets.only(left: 28.0), child: deliveryAddress == null ? Container() : DeliveryAddressRow( key: ValueKey(deliveryAddress.id), deliveryAddress: deliveryAddress), ), ], ); } List getBoxList(BuildContext context, List boxes) { List _boxes = [boxes[0], boxes[1]]; return _boxes.asMap().entries.map((_box) { DeliveryAddress shippingAddress = _box.value.shippingAddress; return InkWell( onTap: () { Navigator.of(context) .push(BottomUpPageRoute(PickupBoxEditor(box: _box.value))); }, child: Container( padding: EdgeInsets.only(left: 10), child: Column( children: [ Row( children: [ Expanded( child: new Padding( padding: const EdgeInsets.symmetric(vertical: 10.0), child: new Row( children: [ new Expanded( child: new Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( shippingAddress.fullName == null ? '' : shippingAddress.fullName, style: new TextStyle( fontSize: 15.0, color: Colors.black, fontWeight: FontWeight.bold), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( shippingAddress.addressLine1 == null ? '' : shippingAddress.addressLine1, style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( shippingAddress.addressLine2 == null ? '' : shippingAddress.addressLine2, style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( shippingAddress.city == null ? '' : shippingAddress.city, style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( shippingAddress.state == null ? '' : shippingAddress.state, style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( shippingAddress.phoneNumber == null ? '' : "Phone:${shippingAddress.phoneNumber}", style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), ), ], ), ), ], ), ), ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( "L${_box.value.length}xW${_box.value.weight}xH${_box.value.height}", style: new TextStyle( fontSize: 15.0, color: Colors.black), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( _box.value.weight == null ? '' : "Actual Weight:${_box.value.weight.toString()}lb", style: new TextStyle(fontSize: 14.0, color: Colors.grey), ), ), Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( _box.value.shipmentWeight == null ? '' : "Shipment Weight:${_box.value.shipmentWeight.toString()}lb", style: new TextStyle(fontSize: 14.0, color: Colors.grey), ), ), ], ) ], ), _box.key == _boxes.length - 1 ? Container() : Divider( color: Colors.black, ) ], ), ), ); }).toList(); } }