import 'package:fcs/model/main_model.dart'; import 'package:fcs/model/shipment_model.dart'; import 'package:fcs/model_fcs/package_model.dart'; import 'package:fcs/pages/invoice/package_addition.dart'; import 'package:fcs/pages/shipping_address_editor.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/vo/box.dart'; import 'package:fcs/vo/cargo.dart'; import 'package:fcs/vo/package.dart'; import 'package:fcs/vo/shipping_address.dart'; import 'package:fcs/widget/bottom_up_page_route.dart'; import 'package:fcs/widget/local_text.dart'; import 'package:fcs/widget/localization/app_translations.dart'; import 'package:fcs/widget/my_data_table.dart'; import 'package:fcs/widget/progress.dart'; import 'package:flutter/material.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:timeline_list/timeline.dart'; import 'package:timeline_list/timeline_model.dart'; import '../fcs/common/helpers/theme.dart'; import 'shipping_address_row.dart'; class BoxEditor extends StatefulWidget { final Box box; BoxEditor({this.box}); @override _BoxEditorState createState() => _BoxEditorState(); } class _BoxEditorState extends State { TextEditingController _addressEditingController = new TextEditingController(); TextEditingController _fromTimeEditingController = new TextEditingController(); TextEditingController _toTimeEditingController = new TextEditingController(); TextEditingController _noOfPackageEditingController = new TextEditingController(); TextEditingController _weightEditingController = new TextEditingController(); Box _box; bool _isLoading = false; List _images = [ "assets/photos/1.jpg", "assets/photos/2.jpg", "assets/photos/3.jpg" ]; bool isNew; bool isMixBox = false; ShippingAddress _shippingAddress = new ShippingAddress(); @override void initState() { super.initState(); if (widget.box != null) { _box = widget.box; _shippingAddress = _box.shippingAddress; isNew = false; // _addressEditingController.text = _pickUp.address; // _fromTimeEditingController.text = _pickUp.fromTime; // _toTimeEditingController.text = _pickUp.toTime; // _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString(); // _weightEditingController.text = _pickUp.weight.toString(); } else { List packages = [ PackageModel.packages[0], PackageModel.packages[1], PackageModel.packages[2] ]; List _cargoTypes = [ Cargo(type: 'General Cargo', weight: 25), Cargo(type: 'Medicine', weight: 20), Cargo(type: 'Dangerous Cargo', weight: 30) ]; var shipmentModel = Provider.of(context, listen: false); _shippingAddress = shipmentModel.shippingAddresses[1]; isNew = true; _box = Box( rate: 0, weight: 75, width: 0, height: 0, length: 0, packages: packages, cargoTypes: _cargoTypes, shipmentWeight: 0); } } @override void dispose() { super.dispose(); } final DateFormat dateFormat = DateFormat("d MMM yyyy"); List _models() { // return []; return _box.statusHistory .map((e) => TimelineModel( Padding( padding: const EdgeInsets.all(18.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(e.status, style: TextStyle( color: e.done ? primaryColor : Colors.grey, fontSize: 16, fontWeight: FontWeight.bold)), e.status == "Processed" ? Text("(Waiting for payment)", style: TextStyle( color: e.done ? primaryColor : Colors.grey, fontSize: 14, fontWeight: FontWeight.bold)) : Container(), Text(dateFormat.format(e.date)), ], ), ), iconBackground: e.done ? primaryColor : Colors.grey, icon: Icon( e.status == "Shipped" ? Ionicons.ios_airplane : e.status == "Delivered" ? MaterialCommunityIcons.truck_fast : e.status == "Processed" ? MaterialIcons.check : Octicons.package, color: Colors.white, ))) .toList(); } @override Widget build(BuildContext context) { var mainModel = Provider.of(context); var shipmentModel = Provider.of(context); var images = isNew ? [] : _images; 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("box.edit.title")), ), body: Card( child: Column( children: [ widget.box == null ? Center( child: Container( padding: EdgeInsets.all(8), child: Text("New Box"))) : Center(child: nameWidget(_box.packageNumber)), Expanded( child: ListView( children: [ ExpansionTile( title: Text( 'Shipment Information', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), children: [ Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: DropdownButtonFormField( value: _box.shipmentNumber, decoration: InputDecoration( fillColor: Colors.white, labelText: 'FCS Shipment Number', icon: Icon(Ionicons.ios_airplane, color: primaryColor) // prefixIcon: Icon(Icons.play_arrow) ), items: ["A102", "A103", "A201", "A202"] .map((e) => DropdownMenuItem(child: Text(e), value: e)) .toList(), onChanged: (map) => {}, ), ), Padding( padding: const EdgeInsets.only(left: 8.0, right: 20), child: new Row( children: [ new Checkbox( value: isMixBox, activeColor: primaryColor, onChanged: (bool value) { setState(() { isMixBox = value; }); }), SizedBox( width: 5, ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( "Mix Box", style: TextStyle(fontSize: 15.0), ), ], ), ], ), ), Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( initialValue: isNew ? "FCS-0203-390-2" : "FCS-0203-390-2", decoration: InputDecoration( fillColor: Colors.white, labelText: 'FCS_ID', hintText: 'FCS_ID', filled: true, icon: Icon(Feather.user, color: primaryColor), suffixIcon: IconButton( icon: Icon(Icons.search), onPressed: () {})), ), ), Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( initialValue: _box.receiverName, decoration: InputDecoration( fillColor: Colors.white, labelText: 'Customer Name', filled: true, icon: Icon(Feather.user, color: Colors.white), suffixIcon: IconButton( icon: Icon(Icons.search), onPressed: () {})), ), ), SizedBox( height: 30, ) ], ), ExpansionTile( title: Text( 'Cargo Types', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), children: [ // Padding( // padding: const EdgeInsets.only(left: 20.0, right: 20), // child: DropdownButtonFormField( // value: _box.packageType, // decoration: InputDecoration( // fillColor: Colors.white, // labelText: 'Cargo Type', // icon: Icon(Entypo.box, color: primaryColor)), // items: ["General", "Medicine", "Dangerous"] // .map((e) => // DropdownMenuItem(child: Text(e), value: e)) // .toList(), // onChanged: (map) => {}, // ), // ), Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( initialValue: _box.weight.toString(), textAlign: TextAlign.end, decoration: InputDecoration( fillColor: Colors.white, labelText: 'Actual Weight', filled: true, icon: Icon(FontAwesomeIcons.weightHanging, color: primaryColor), )), ), // Padding( // padding: const EdgeInsets.only(left: 20.0, right: 20), // child: TextFormField( // initialValue: _box.rate.toString(), // textAlign: TextAlign.end, // decoration: InputDecoration( // fillColor: Colors.white, // labelText: 'Rate', // filled: true, // icon: Icon(FontAwesomeIcons.tag, // color: primaryColor), // )), // ), // Padding( // padding: const EdgeInsets.only(left: 20.0, right: 20), // child: TextFormField( // initialValue: _box.amount.toString(), // textAlign: TextAlign.end, // decoration: InputDecoration( // fillColor: Colors.white, // labelText: 'Total Amount', // filled: true, // icon: Icon(FontAwesomeIcons.moneyBill, // color: primaryColor), // )), // ), Container( padding: EdgeInsets.only(top: 10), child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: MyDataTable( headingRowHeight: 40, columnSpacing: 120, columns: [ MyDataColumn( label: LocalText( context, "cargo.type", color: Colors.grey, ), ), MyDataColumn( label: LocalText( context, "cargo.weight", color: Colors.grey, ), ), ], rows: getCargoRows(context), ), ), ), mainModel.isOwner() ? Container( padding: EdgeInsets.only(top: 20), child: Align( alignment: Alignment.bottomRight, child: FloatingActionButton.extended( icon: Icon(Icons.add), label: Text("Add Cargo"), backgroundColor: primaryColor, onPressed: () { // Navigator.of(context).push( // BottomUpPageRoute(PackageAddition())); }, ), ), ) : Container(), SizedBox(height: 25), ], ), ExpansionTile( title: Text( 'Box Dimension', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), children: [ Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: fcsInputReadOnly( "Shipment Weight", FontAwesomeIcons.weightHanging, value: _box.shipmentWeight.toString()), ), Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( initialValue: _box.width.toString(), textAlign: TextAlign.end, decoration: InputDecoration( fillColor: Colors.white, labelText: 'Width', filled: true, icon: Icon(FontAwesomeIcons.arrowCircleRight, color: primaryColor), )), ), Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( initialValue: _box.height.toString(), textAlign: TextAlign.end, decoration: InputDecoration( fillColor: Colors.white, labelText: 'Height', filled: true, icon: Icon(FontAwesomeIcons.arrowAltCircleUp, color: primaryColor), )), ), Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( initialValue: _box.length.toString(), textAlign: TextAlign.end, decoration: InputDecoration( fillColor: Colors.white, labelText: 'Length', filled: true, icon: Icon(FontAwesomeIcons.arrowCircleUp, color: primaryColor), )), ), SizedBox(height: 25), ], ), ExpansionTile( title: Text( 'Shipping Address', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), 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( 'Select \nAddress', style: TextStyle(fontSize: 12), ), backgroundColor: primaryColor, ), ), ), ), SizedBox(height: 25), ], ), isNew ? Container() : ExpansionTile( title: Text( 'Status', style: TextStyle( color: primaryColor, fontWeight: FontWeight.bold), ), children: [ Container( height: 500, padding: EdgeInsets.only(left: 20), child: isNew ? Container() : Timeline( children: _models(), position: TimelinePosition.Left), ), ], ) ], ), ), widget.box == null ? Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Create New Box'), color: primaryColor, textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))) : Container( child: Column( children: [ Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Complete packing'), color: primaryColor, textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))), widget.box.status == 'Arrived' ? Align( alignment: Alignment.bottomCenter, child: Center( child: Container( width: 250, child: FlatButton( child: Text('Deliver'), color: primaryColor, textColor: Colors.white, onPressed: () { Navigator.pop(context); }, ), ))) : Container(), ], )), ], ), ), ), ); } List getCargoRows(BuildContext context) { if (_box == null || _box.cargoTypes == null) { return []; } return _box.cargoTypes.map((c) { return MyDataRow( onSelectChanged: (bool selected) {}, cells: [ MyDataCell(new Text( c.type == null ? "" : c.type, style: textStyle, )), MyDataCell( new Text(c.weight == null ? "0" : c.weight.toString(), style: textStyle), ), ], ); }).toList(); } List getAddressList( BuildContext context, List addresses) { return addresses.asMap().entries.map((s) { return InkWell( onTap: () {}, child: ShippingAddressRow(shippingAddress: s.value, index: s.key), ); }).toList(); } }