import 'package:fcs/model/main_model.dart'; import 'package:fcs/model/pickup_model.dart'; import 'package:fcs/model/shipment_model.dart'; import 'package:fcs/model_fcs/box_model.dart'; import 'package:fcs/pages/util.dart'; import 'package:fcs/pages_fcs/shipping_address_row.dart'; import 'package:fcs/vo/box.dart'; import 'package:fcs/vo/cargo.dart'; import 'package:fcs/vo/pickup.dart'; import 'package:fcs/vo/shipping_address.dart'; import 'package:fcs/widget/bottom_up_page_route.dart'; import 'package:fcs/widget/fcs_text_field.dart'; import 'package:fcs/widget/fcs_text_field_readonly.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:fcs/widget/localization/app_translations.dart'; import 'package:flutter/material.dart'; import 'package:fcs/widget/progress.dart'; import '../theme/theme.dart'; import 'pickup_box_editor.dart'; class PickUpEditor extends StatefulWidget { final PickUp pickUp; PickUpEditor({this.pickUp}); @override _PickUpEditorState createState() => _PickUpEditorState(); } class _PickUpEditorState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); final numberFormatter = new NumberFormat("#,###"); 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(); PickUp _pickUp; bool _isLoading = false; var now = new DateTime.now(); bool isNew; ShippingAddress _shippingAddress = new ShippingAddress(); int _currVal = 1; @override void initState() { super.initState(); if (widget.pickUp != null) { isNew = false; _pickUp = widget.pickUp; _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 = PickUp(cargoTypes: _cargoTypes); } var shipmentModel = Provider.of(context, listen: false); _shippingAddress = shipmentModel.shippingAddresses[1]; } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { var pickupModel = Provider.of(context); final pickUpAddress = fcsInput('Pickup Address', Icons.location_on, controller: _addressEditingController); final pickUpAddressReadOnly = fcsInputReadOnly( 'Pickup Address', Icons.location_on, controller: _addressEditingController); final fromTimeBox = fcsInput( 'From', Icons.timer, controller: _fromTimeEditingController, ); final toTimeBox = fcsInput( 'To', null, controller: _toTimeEditingController, ); final fromTimeBoxReadOnly = fcsInputReadOnly( 'From', Icons.timer, controller: _fromTimeEditingController, ); final toTimeBoxReadOnly = fcsInputReadOnly( 'To', null, controller: _toTimeEditingController, ); final pickupTime = Padding( padding: const EdgeInsets.only(left: 20.0), child: Row( children: [ Container( child: fromTimeBox, width: 120, ), Padding( padding: const EdgeInsets.only(left: 8.0), child: Text('-'), ), Container( 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, ), ], ), ); final noOfPackageBox = fcsInput( 'Number of Packages', Octicons.package, controller: _noOfPackageEditingController, ); final noOfPackageBoxReadonly = fcsInputReadOnly( 'Number of Packages', Octicons.package, controller: _noOfPackageEditingController, ); final requestDateBox = Container( child: InkWell( onTap: () { DatePicker.showDatePicker( context, showTitleActions: true, currentTime: _pickupDate.text == "" ? null : dateFormatter.parse(_pickupDate.text), minTime: DateTime.now(), maxTime: DateTime(2030, 12, 31), onConfirm: (date) {}, locale: LocaleType.en, ); }, child: TextFormField( controller: _pickupDate, autofocus: false, cursorColor: primaryColor, style: textStyle, enabled: false, keyboardType: TextInputType.datetime, decoration: new InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none, labelText: AppTranslations.of(context).text("pickup.date"), // labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, contentPadding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 0.0), icon: Icon( Icons.date_range, color: primaryColor, )), validator: (value) { if (value.isEmpty) { return AppTranslations.of(context).text("do.form.date"); } return null; }, ), )); MainModel mainModel = Provider.of(context); var boxModel = Provider.of(context); var shipmentModel = 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(), ), backgroundColor: primaryColor, title: Text(AppTranslations.of(context).text("pickup.edit.title")), ), body: Card( child: Column( children: [ Expanded( child: Padding( padding: const EdgeInsets.all(10.0), child: ListView(children: [ Center(child: nameWidget(mainModel.customer.name)), Center(child: nameWidget(mainModel.customer.phoneNumber)), 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.pickUp == null ? Container() : widget.pickUp.isCourier ? Padding( padding: const EdgeInsets.only(left: 15.0), child: fcsInputReadOnly( "Courier Fee", FontAwesomeIcons.moneyBill, controller: _handlingFeeController), ) : Padding( padding: const EdgeInsets.only(left: 15.0), child: fcsInputReadOnly( "Handling Fee", FontAwesomeIcons.moneyBill, controller: _handlingFeeController), ), ExpansionTile( title: Text( 'Shipment Type', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), children: [ Container( child: Wrap( children: pickupModel.radioGroups .map((t) => RadioListTile( title: Text("${t.text}"), groupValue: _currVal, activeColor: primaryColor, value: t.index, onChanged: (val) { setState(() { _currVal = val; }); }, )) .toList(), ), ), ], ), _currVal == 3 ? Container( child: ShippingAddressRow( shippingAddress: ShippingAddress( fullName: 'Myo Min', addressLine1: '154-19 64th Ave.', addressLine2: 'Flushing', city: 'NY', state: 'NY', phoneNumber: '+1 (292)215-2247'), ), ) : _currVal == 4 ? Container( child: Column( children: [ ShippingAddressRow( shippingAddress: shipmentModel.shippingAddresses[1]), Container( padding: EdgeInsets.only( top: 20, bottom: 15, right: 15), child: Align( alignment: Alignment.bottomRight, child: Container( width: 120, height: 40, child: FloatingActionButton.extended( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, onPressed: () {}, icon: Icon(Icons.add), label: Text( 'Select\nAddress', style: TextStyle(fontSize: 12), ), backgroundColor: primaryColor, ), ), ), ), ], )) : ExpansionTile( title: Text( 'Package Information', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), children: [ Column( children: getBoxList(context, boxModel.boxes), ), Container( padding: EdgeInsets.only( top: 20, bottom: 15, right: 15), child: Align( alignment: Alignment.bottomRight, child: Container( width: 120, height: 40, child: FloatingActionButton.extended( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, icon: Icon(Icons.add), onPressed: () { Navigator.push( context, BottomUpPageRoute( PickupBoxEditor()), ); }, label: Text( 'Add Package', style: TextStyle(fontSize: 12), ), backgroundColor: primaryColor, ), ), ), ), SizedBox(height: 10.0), ], ), _currVal == 3 || _currVal == 4 ? Container() : ExpansionTile( title: Text( 'Pickup Location / Time', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), children: [ Padding( padding: const EdgeInsets.only(left: 20.0), child: Column( children: [ Row( children: [ Icon( Icons.location_on, color: primaryColor, ), Padding( padding: const EdgeInsets.all(8.0), child: Text('Pickup Address'), ), ], ), Padding( padding: const EdgeInsets.only(left: 10.0), child: ShippingAddressRow( shippingAddress: _shippingAddress), ), Container( padding: EdgeInsets.only( top: 20, bottom: 15, right: 15), child: Align( alignment: Alignment.bottomRight, child: Container( width: 120, height: 40, child: FloatingActionButton.extended( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, onPressed: () {}, icon: Icon(Icons.add), label: Text( 'Select\nAddress', style: TextStyle(fontSize: 12), ), backgroundColor: primaryColor, ), ), ), ), ], ), // child: ExpansionTile( // leading: Icon( // Icons.location_on, // color: primaryColor, // ), // title: Text('My Address'), // children: [ // Padding( // padding: const EdgeInsets.only(left: 10.0), // child: ShippingAddressRow( // shippingAddress: _shippingAddress), // ), // Container( // padding: EdgeInsets.only( // top: 20, bottom: 15, right: 15), // child: Align( // alignment: Alignment.bottomRight, // child: Container( // width: 120, // height: 40, // child: FloatingActionButton.extended( // materialTapTargetSize: // MaterialTapTargetSize.shrinkWrap, // onPressed: () {}, // icon: Icon(Icons.add), // label: Text( // 'Select\nAddress', // style: TextStyle(fontSize: 12), // ), // backgroundColor: primaryColor, // ), // ), // ), // ), // ], // ), ), widget.pickUp == null ? pickupTime : widget.pickUp.status == 'Pending' ? pickupTime : pickupTimeReadOnly, Padding( padding: const EdgeInsets.only(left: 20.0), child: Column( children: [ SizedBox(height: 5), Container(height: 50.0, child: requestDateBox) ], ), ), SizedBox(height: 15.0), ], ), // ExpansionTile( // title: Text( // 'Package Information', // style: TextStyle( // color: primaryColor, fontWeight: FontWeight.bold), // ), // children: [ // Padding( // padding: const EdgeInsets.only(left: 20.0), // child: widget.pickUp == null // ? noOfPackageBox // : widget.pickUp.status == 'Pending' // ? noOfPackageBox // : noOfPackageBoxReadonly, // ), // Padding( // padding: const EdgeInsets.only(left: 20.0), // child: widget.pickUp == null // ? fcsInput("Total Weight (lb)", // FontAwesomeIcons.weightHanging, // controller: _weightEditingController) // : widget.pickUp.status == 'Pending' // ? fcsInput("Total Weight (lb)", // FontAwesomeIcons.weightHanging, // controller: _weightEditingController) // : fcsInputReadOnly("Total Weight (lb)", // FontAwesomeIcons.weightHanging, // controller: _weightEditingController), // ), // Padding( // padding: const EdgeInsets.only(left: 20.0), // child: fcsInput("Remark", MaterialCommunityIcons.note), // ), // Padding( // padding: const EdgeInsets.only(left: 3.0), // child: ExpansionTile( // leading: Icon( // SimpleLineIcons.location_pin, // color: primaryColor, // ), // title: Text( // 'Shipping Address', // ), // children: [ // ShippingAddressRow( // shippingAddress: _shippingAddress), // Container( // padding: EdgeInsets.only( // top: 20, bottom: 15, right: 15), // child: Align( // alignment: Alignment.bottomRight, // child: Container( // width: 130, // height: 40, // child: FloatingActionButton.extended( // materialTapTargetSize: // MaterialTapTargetSize.shrinkWrap, // onPressed: () {}, // icon: Icon(Icons.add), // label: Text( // 'Add Shipping\nAddress', // style: TextStyle(fontSize: 12), // ), // backgroundColor: primaryColor, // ), // ), // ), // ), // ], // ), // ), // SizedBox(height: 10.0), // ], // ), mainModel.isCustomer() ? Container() : ExpansionTile( title: Text('For FCS'), children: [ widget.pickUp != null ? widget.pickUp.status == 'Pending' ? Padding( padding: const EdgeInsets.only(left: 20.0), child: fcsDropDown("Assigned", MaterialCommunityIcons.worker), ) : Container() : Container(), ], ), ]), )), widget.pickUp == null ? Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Request for shipment'), color: primaryColor, textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))) : Container( child: Column( children: [ widget.pickUp.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('Assign 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); }, ), ))) ], )) ], ), ), ), ); } List getBoxList(BuildContext context, List boxes) { List _boxes = [boxes[0], boxes[1]]; return _boxes.asMap().entries.map((_box) { ShippingAddress 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(); } }