diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index d21ef28..855390e 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -327,13 +327,15 @@ "box.select.cartion":"Select cartons", "box.no_carton":"There is no cartons in this shipment.", "box.crete.carton":"Create carton", - "box.carton.type":"Carton Type", + "box.carton.type":"Carton type", "box.select.delivery":"Select delivery type", "box.select.package":"Select packages", "box.no_package":"There is no packages.", "box.input_cargo_weight":"Input cargo weight (lb)", "box.input_surcharge_item":"Input surcharge items", "box.select.cargo_type":"Select surcharge item", + "box.package.count":"Packages ({0})", + "Boxes End ================================================================":"", "Delivery Start ================================================================":"", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index 44c0a1b..3270107 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -326,13 +326,14 @@ "box.select.cartion":"Select cartons", "box.no_carton":"There is no cartons in this shipment.", "box.crete.carton":"Create carton", - "box.carton.type":"Carton Type", + "box.carton.type":"Carton type", "box.select.delivery":"Select delivery type", "box.select.package":"Select packages", "box.no_package":"There is no packages.", "box.input_cargo_weight":"Input cargo weight (lb)", "box.input_surcharge_item":"Input surcharge items", "box.select.cargo_type":"Select surcharge item", + "box.package.count":"Packages ({0})", "Boxes End ================================================================":"", "Delivery Start ================================================================":"", diff --git a/lib/domain/constants.dart b/lib/domain/constants.dart index f2081a4..56f8ceb 100644 --- a/lib/domain/constants.dart +++ b/lib/domain/constants.dart @@ -137,3 +137,7 @@ const payment_canceled_status = "canceled"; //Delivery types const delivery_caton = "Delivery carton"; const pickup_carton = "Pick-up carton"; + +// bill +const billToSender ="Bill to sender"; +const billToConsignee="Bill to consignee"; diff --git a/lib/pages/carton/cargo_widget.dart b/lib/pages/carton/cargo_widget.dart index aabfe30..212a815 100644 --- a/lib/pages/carton/cargo_widget.dart +++ b/lib/pages/carton/cargo_widget.dart @@ -6,6 +6,7 @@ import 'package:provider/provider.dart'; import '../../domain/entities/cargo_type.dart'; import '../../domain/entities/user.dart'; +import '../main/util.dart'; import '../rates/model/shipment_rate_model.dart'; import '../widgets/continue_button.dart'; import '../widgets/display_text.dart'; @@ -22,14 +23,14 @@ class CargoWidget extends StatefulWidget { final User sender; final User consignee; final List cargoTypes; - final List customDuties; + final List surchargeItems; final OnPrevious? onPrevious; final OnContinue? onContinue; const CargoWidget({ Key? key, required this.cargoTypes, - required this.customDuties, + required this.surchargeItems, this.onPrevious, this.onContinue, required this.sender, @@ -42,9 +43,10 @@ class CargoWidget extends StatefulWidget { class _CargoWidgetState extends State { List _cargoTypes = []; - List _customDuties = []; + List _surchareItems = []; TextEditingController _totalCtl = TextEditingController(); List _cargoTypeControllers = []; + List _surchargeControllers = []; @override void initState() { @@ -53,10 +55,28 @@ class _CargoWidgetState extends State { } _init() { + // for cargo types var model = context.read(); _cargoTypes = model.rate.cargoTypes.map((e) => e.clone()).toList(); if (widget.cargoTypes.isNotEmpty) { + _cargoTypes.forEach((mp) { + mp.weight = 0; + widget.cargoTypes.forEach((vp) { + if (mp.id == vp.id) { + mp.weight = vp.weight; + } + }); + }); + _cargoTypes.forEach((e) { + var editor = new TextEditingController(); + editor.text = removeTrailingZeros(e.weight); + editor.addListener(inputChangeListener); + _cargoTypeControllers.add(editor); + }); + + double total = _cargoTypes.fold(0, (sum, value) => sum + value.weight); + _totalCtl.text = removeTrailingZeros(total); } else { _cargoTypes.forEach((e) { var editor = new TextEditingController(); @@ -66,6 +86,18 @@ class _CargoWidgetState extends State { }); } + //for surcharge items + + if (widget.surchargeItems.isNotEmpty) { + _surchareItems = List.from(widget.surchargeItems); + _surchareItems.forEach((e) { + var editor = new TextEditingController(); + editor.text = e.qty.toString(); + editor.addListener(inputChangeListener); + _surchargeControllers.add(editor); + }); + } + if (mounted) { setState(() {}); } @@ -87,11 +119,6 @@ class _CargoWidgetState extends State { inputChangeListener() { List emptyFields = getEmptyFields(); - print("emptyFields:$emptyFields"); - - // if (emptyFields.isNotEmpty && emptyFields.length == 1) { - // // _cargoTypeControllers[emptyFields.first].text = - // } if (emptyFields.isEmpty) { _cargoTypes.asMap().entries.forEach((e) { @@ -100,29 +127,8 @@ class _CargoWidgetState extends State { }); double total = _cargoTypes.fold(0, (sum, value) => sum + value.weight); setState(() { - _totalCtl.text = total.toString(); + _totalCtl.text = removeTrailingZeros(total); }); - } else { - // if (emptyFields.length == 1) { - // print("_totalCtl.text:${_totalCtl.text}"); - - // if (_totalCtl.text.isNotEmpty) { - // double t = double.tryParse(_totalCtl.text) ?? 0; - - // _cargoTypes.asMap().entries.forEach((e) { - // _cargoTypes[e.key].weight = - // double.tryParse(_cargoTypeControllers[e.key].text) ?? 0; - // }); - // double result = - // _cargoTypes.fold(0, (sum, value) => sum + value.weight); - - // double remaining = t - result; - // setState(() { - // _cargoTypeControllers[emptyFields.first].text = - // remaining.toString(); - // }); - // } - // } } } @@ -146,10 +152,7 @@ class _CargoWidgetState extends State { final userRow = Row( children: [ - Expanded( - child: senderBox, - flex: 2, - ), + Expanded(child: senderBox, flex: 2), Flexible(child: consigneeBox) ], ); @@ -167,34 +170,34 @@ class _CargoWidgetState extends State { InkResponse( radius: 25, onTap: () { - setState(() { - _cargoTypeControllers[key].clear(); - }); + double totalWeight = double.tryParse(_totalCtl.text) ?? 0; + double removeWeight = + (double.tryParse(_cargoTypeControllers[key].text) ?? + 0); + + if (totalWeight >= removeWeight) { + double result = totalWeight - removeWeight; + _totalCtl.text = removeTrailingZeros(result); + } + + _cargoTypeControllers[key].clear(); + if (mounted) { + setState(() {}); + } }, - child: Icon(MaterialIcons.clear)), + child: Icon(MaterialIcons.clear, color: labelColor)), const SizedBox(width: 10), Flexible( child: inputTextFieldWidget(context, lableText: c.name ?? "", - controller: _cargoTypeControllers[key] - // onChanged: (newValue) { - // setState(() { - // _cargoTypes[key].weight = double.tryParse(newValue) ?? 0; - // }); - // double total = - // _cargoTypes.fold(0, (sum, value) => sum + value.weight); - // setState(() { - // _totalCtl.text = total.toString(); - // }); - // }, - ), + controller: _cargoTypeControllers[key]), ), ], ), ); }).toList()); - final totalBox = Row( + final totalWeightBox = Row( mainAxisAlignment: MainAxisAlignment.end, children: [ SizedBox( @@ -208,11 +211,34 @@ class _CargoWidgetState extends State { _totalCtl.clear(); }); }, - child: Icon(MaterialIcons.clear)), + child: Icon(MaterialIcons.clear, color: labelColor)), const SizedBox(width: 10), Flexible( child: inputTextFieldWidget(context, - lableText: "Total", controller: _totalCtl), + lableText: "Total", + controller: _totalCtl, + readOnly: getEmptyFields().isEmpty, onChanged: (neValue) { + List emptyFields = getEmptyFields(); + if (emptyFields.length == 1) { + double totalWeight = double.tryParse(neValue) ?? 0; + + _cargoTypes.asMap().entries.forEach((e) { + _cargoTypes[e.key].weight = double.tryParse( + _cargoTypeControllers[e.key].text) ?? + 0; + }); + double result = _cargoTypes.fold( + 0, (sum, value) => sum + value.weight); + + if (totalWeight >= result) { + double remaining = totalWeight - result; + setState(() { + _cargoTypeControllers[emptyFields.first].text = + removeTrailingZeros(remaining); + }); + } + } + }), ), ], )), @@ -231,10 +257,17 @@ class _CargoWidgetState extends State { context, CupertinoPageRoute( builder: (context) => - CustomDutyAddition(customDuties: _customDuties))); + CustomDutyAddition(customDuties: _surchareItems))); if (customList == null) return; - _customDuties = List.from(customList); + _surchareItems = List.from(customList); + + _surchargeControllers.clear(); + _surchareItems.asMap().entries.forEach((e) { + var editor = new TextEditingController(); + editor.text = e.value.qty == 0 ? "" : e.value.qty.toString(); + _surchargeControllers.add(editor); + }); if (mounted) { setState(() {}); @@ -245,7 +278,7 @@ class _CargoWidgetState extends State { final subChargeItemsBox = Wrap( alignment: WrapAlignment.spaceBetween, runSpacing: 15, - children: _customDuties.asMap().entries.map((e) { + children: _surchareItems.asMap().entries.map((e) { var key = e.key; var c = e.value; return SizedBox( @@ -256,15 +289,21 @@ class _CargoWidgetState extends State { radius: 25, onTap: () { setState(() { - _customDuties.removeAt(key); + _surchareItems.removeAt(key); }); }, - child: Icon(Feather.minus_circle)), + child: Icon(Feather.minus_circle, color: labelColor)), const SizedBox(width: 10), Flexible( child: inputTextFieldWidget( context, lableText: c.name ?? "", + controller: _surchargeControllers[key], + onChanged: (newValue) { + setState(() { + _surchareItems[key].qty = int.tryParse(newValue) ?? 0; + }); + }, ), ), ], @@ -274,20 +313,15 @@ class _CargoWidgetState extends State { final continueBtn = ContinueButton( onTap: () { - // if (selectedPackageList.isEmpty || searchResults.isEmpty) { - // showMsgDialog(context, 'Error', "Please select the packages"); - // return false; - // } - - // if (widget.onContinue != null) { - // widget.onContinue!(selectedPackageList); - // } + if (widget.onContinue != null) { + widget.onContinue!(_cargoTypes, _surchareItems); + } }, ); final previousBtn = PreviousButton(onTap: () { if (widget.onPrevious != null) { - widget.onPrevious!(_cargoTypes, _customDuties); + widget.onPrevious!(_cargoTypes, _surchareItems); } }); @@ -305,7 +339,7 @@ class _CargoWidgetState extends State { const SizedBox(height: 15), Divider(), const SizedBox(height: 5), - totalBox, + totalWeightBox, subchargeItemTitleBox, subChargeItemsBox, const SizedBox(height: 30), @@ -333,13 +367,15 @@ class _CargoWidgetState extends State { Widget inputTextFieldWidget(BuildContext context, {required String lableText, TextEditingController? controller, - Function(String)? onChanged}) { + Function(String)? onChanged, + bool readOnly = false}) { return TextFormField( controller: controller, style: textStyle, cursorColor: primaryColor, keyboardType: TextInputType.number, onChanged: onChanged, + readOnly: readOnly, decoration: new InputDecoration( contentPadding: EdgeInsets.all(0), labelText: lableText, diff --git a/lib/pages/carton/carton_editor.dart b/lib/pages/carton/carton_editor.dart index 22b178a..d2c5938 100644 --- a/lib/pages/carton/carton_editor.dart +++ b/lib/pages/carton/carton_editor.dart @@ -33,7 +33,7 @@ class _CartonEditorState extends State { bool _isLoading = false; bool _isNew = false; - int _billToValue = 1; + String _billToValue = billToSender; String? _selectedCartonType; User? _consignee; @@ -159,7 +159,7 @@ class _CartonEditorState extends State { context, CupertinoPageRoute( builder: (context) => CartonEditorForPackage( - sender: _sender!, consignee: _consignee!))); + sender: _sender!, consignee: _consignee!,billToValue: _billToValue))); } // for mix cartion else { @@ -275,16 +275,16 @@ class _CartonEditorState extends State { child: InkWell( onTap: () { setState(() { - _billToValue = 1; + _billToValue = billToSender; }); }, child: Row(children: [ LocalRadio( - value: 1, + value: billToSender, groupValue: _billToValue, onChanged: (p0) { setState(() { - _billToValue = 1; + _billToValue = billToSender; }); }, ), @@ -293,7 +293,7 @@ class _CartonEditorState extends State { padding: const EdgeInsets.only(left: 10), child: LocalText(context, 'box.bill_to_sender', fontSize: 15, - color: _billToValue == 1 ? primaryColor : Colors.black), + color: _billToValue == billToSender ? primaryColor : Colors.black), ), ) ]), @@ -302,16 +302,16 @@ class _CartonEditorState extends State { child: InkWell( onTap: () { setState(() { - _billToValue = 2; + _billToValue = billToConsignee; }); }, child: Row(children: [ LocalRadio( - value: 2, + value: billToConsignee, groupValue: _billToValue, onChanged: (p0) { setState(() { - _billToValue = 2; + _billToValue = billToConsignee; }); }, ), @@ -320,7 +320,7 @@ class _CartonEditorState extends State { padding: const EdgeInsets.only(left: 10), child: LocalText(context, 'box.bill_to.consignee', fontSize: 15, - color: _billToValue == 2 ? primaryColor : Colors.black), + color: _billToValue == billToConsignee ? primaryColor : Colors.black), ), ) ]), diff --git a/lib/pages/carton/carton_editor_for_package.dart b/lib/pages/carton/carton_editor_for_package.dart index 5921cf6..60ca750 100644 --- a/lib/pages/carton/carton_editor_for_package.dart +++ b/lib/pages/carton/carton_editor_for_package.dart @@ -19,14 +19,16 @@ import '../widgets/progress.dart'; import '../widgets/step_widget.dart'; import 'cargo_widget.dart'; import 'carton_size_widget.dart'; +import 'carton_submit.dart'; import 'model/package_selection_model.dart'; import 'package_selection_widget.dart'; class CartonEditorForPackage extends StatefulWidget { final User sender; final User consignee; + final String billToValue; const CartonEditorForPackage( - {Key? key, required this.sender, required this.consignee}) + {Key? key, required this.sender, required this.consignee, required this.billToValue}) : super(key: key); @override @@ -44,7 +46,7 @@ class _CartonEditorForPackageState extends State { ]; List _packages = []; List _cargoTypes = []; - List _customDuties = []; + List _surchareItems = []; int currentStep = 0; double _length = 0; @@ -181,18 +183,18 @@ class _CartonEditorForPackageState extends State { sender: widget.sender, consignee: widget.consignee, cargoTypes: _cargoTypes, - customDuties: _customDuties, + surchargeItems: _surchareItems, onContinue: (cargoTypes, customDuties) { setState(() { _cargoTypes = List.from(cargoTypes); - _customDuties = List.from(customDuties); + _surchareItems = List.from(customDuties); currentStep += 1; }); }, onPrevious: (cargoTypes, customDuties) { setState(() { _cargoTypes = List.from(cargoTypes); - _customDuties = List.from(customDuties); + _surchareItems = List.from(customDuties); currentStep -= 1; }); }, @@ -200,24 +202,29 @@ class _CartonEditorForPackageState extends State { ); } else { return Expanded( - child: Text("Submit"), - // child: MixCartonSubmit( - // cartonSizeType: _cartonSizeType, - // standardSize: _standardSize, - // length: _length, - // width: _width, - // height: _height, - // shipment: _shipment!, - // cartons: _packages, - // onCreate: () { - // _create(); - // }, - // onPrevious: () { - // setState(() { - // currentStep -= 1; - // }); - // }, - // ), + child: CartonSubmit( + sender: widget.sender, + consingee: widget.consignee, + billToValue: widget.billToValue, + cartonSizeType: _cartonSizeType, + standardSize: _standardSize, + length: _length, + width: _width, + height: _height, + deliveryType: _selectedDeliveryType, + shipment: _shipment!, + packages: _packages, + cargoTypes: _cargoTypes, + surchareItems: _surchareItems, + onCreate: () { + _create(); + }, + onPrevious: () { + setState(() { + currentStep -= 1; + }); + }, + ), ); } } diff --git a/lib/pages/carton/carton_submit.dart b/lib/pages/carton/carton_submit.dart new file mode 100644 index 0000000..cbad83f --- /dev/null +++ b/lib/pages/carton/carton_submit.dart @@ -0,0 +1,373 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_vector_icons/flutter_vector_icons.dart'; +import 'package:intl/intl.dart'; + +import '../../../domain/constants.dart'; +import '../../../domain/entities/cargo_type.dart'; +import '../../../domain/entities/carton_size.dart'; +import '../../../domain/entities/fcs_shipment.dart'; +import '../../../helpers/theme.dart'; + +import '../../domain/entities/package.dart'; +import '../../domain/entities/user.dart'; +import '../main/util.dart'; +import '../widgets/local_text.dart'; +import '../widgets/previous_button.dart'; +import '../widgets/submit_text_widget.dart'; + +typedef OnCreateCarton = Function(); +typedef OnPrevious = Function(); +final NumberFormat numberFormatter = NumberFormat("#,###"); + +class CartonSubmit extends StatelessWidget { + final User sender; + final User consingee; + final String billToValue; + final FcsShipment shipment; + final List packages; + final String cartonSizeType; + final CartonSize? standardSize; + final double length; + final double width; + final double height; + final String deliveryType; + final List cargoTypes; + final List surchareItems; + final OnCreateCarton? onCreate; + final OnPrevious? onPrevious; + const CartonSubmit( + {Key? key, + required this.sender, + required this.consingee, + required this.billToValue, + this.onCreate, + this.onPrevious, + required this.shipment, + this.packages = const [], + this.standardSize, + required this.cartonSizeType, + required this.deliveryType, + this.length = 0, + this.width = 0, + this.height = 0, + this.cargoTypes = const [], + this.surchareItems = const []}) + : super(key: key); + + @override + Widget build(BuildContext context) { + String? boxDimension = cartonSizeType == standardCarton + ? "${standardSize?.name} - ${standardSize?.length.toInt()}”x${standardSize?.width.toInt()}”x${standardSize?.height.toInt()}”" + : cartonSizeType == customCarton + ? "${length.toInt()}”x${width.toInt()}”x${height.toInt()}”" + : null; + + double totalWeight = cargoTypes.fold(0, (sum, value) => sum + value.weight); + + final cartonType = Padding( + padding: const EdgeInsets.only(top: 10), + child: SubmitTextWidget( + labelKey: 'box.carton.type', + text: carton_from_packages, + subText: boxDimension), + ); + + final shipmentBox = Padding( + padding: const EdgeInsets.only(top: 10), + child: SubmitTextWidget( + labelKey: 'box.shipment', + text: shipment.shipmentNumber ?? '', + subText: shipment.status ?? "", + ), + ); + + final usersBox = Padding( + padding: const EdgeInsets.only(top: 10), + child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + Padding( + padding: const EdgeInsets.only(left: 5, bottom: 5), + child: Row( + children: [ + Expanded( + child: LocalText(context, 'box.sender.title', + color: primaryColor, + fontSize: 16, + fontWeight: FontWeight.normal), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 13), + child: LocalText(context, 'box.consignee.title', + color: primaryColor, + fontSize: 16, + fontWeight: FontWeight.normal), + ), + ), + ], + ), + ), + Container( + decoration: BoxDecoration( + border: Border.all(color: primaryColor), + borderRadius: BorderRadius.circular(5), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(sender.name ?? "", + style: const TextStyle( + fontSize: 16.0, fontWeight: FontWeight.w500)), + sender.fcsID == null + ? const SizedBox() + : Text(sender.fcsID!, + style: const TextStyle( + fontSize: 14.0, color: Colors.grey)), + ], + ), + ), + billToValue == billToSender + ? billWidget(context) + : const SizedBox() + ], + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 15), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(consingee.name ?? "", + style: const TextStyle( + fontSize: 16.0, fontWeight: FontWeight.w500)), + consingee.fcsID == null + ? const SizedBox() + : Text(consingee.fcsID!, + style: const TextStyle( + fontSize: 14.0, color: Colors.grey)), + ], + ), + ), + billToValue == billToConsignee + ? billWidget(context) + : const SizedBox() + ], + ), + )) + ]), + ), + ), + ]), + ); + + final deliveryTypeBox = Padding( + padding: const EdgeInsets.only(top: 10), + child: SubmitTextWidget( + labelKey: 'box.delivery_type', + text: deliveryType, + ), + ); + + final packagesBox = Padding( + padding: const EdgeInsets.only(top: 10), + child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + Padding( + padding: const EdgeInsets.only(left: 5, bottom: 5), + child: LocalText(context, 'box.package.count', + translationVariables: [packages.length.toString()], + color: primaryColor, + fontSize: 16, + fontWeight: FontWeight.normal), + ), + Container( + decoration: BoxDecoration( + border: Border.all(color: primaryColor), + borderRadius: BorderRadius.circular(5), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Wrap( + spacing: 15, + children: packages.map((e) { + return SizedBox( + width: MediaQuery.of(context).size.width / 2.5, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 3), + child: Text( + e.trackingID ?? "", + style: TextStyle(color: Colors.black, fontSize: 15), + ), + ), + ); + }).toList()), + ), + ), + ]), + ); + + final cargosBox = Padding( + padding: const EdgeInsets.only(top: 10), + child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + Padding( + padding: const EdgeInsets.only(left: 5, bottom: 5, right: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocalText(context, 'box.cargo.type', + color: primaryColor, + fontSize: 16, + fontWeight: FontWeight.normal), + Text("${removeTrailingZeros(totalWeight)} lb", + style: TextStyle(color: Colors.black, fontSize: 15)) + ], + ), + ), + Container( + decoration: BoxDecoration( + border: Border.all(color: primaryColor), + borderRadius: BorderRadius.circular(5), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: cargoTypes.map((e) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 3), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + e.name ?? "", + style: + TextStyle(color: Colors.black, fontSize: 15), + ), + Text("${removeTrailingZeros(e.weight)} lb", + style: TextStyle( + color: Colors.black, fontSize: 15)) + ], + ), + ); + }).toList()), + const SizedBox(height: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: surchareItems.map((e) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 3), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + e.name ?? "", + style: TextStyle(color: labelColor, fontSize: 15), + ), + Text("${numberFormatter.format(e.qty)} pc", + style: + TextStyle(color: labelColor, fontSize: 15)) + ], + ), + ); + }).toList()), + ], + ), + ), + ), + ]), + ); + + final createBtn = InkWell( + onTap: () { + if (onCreate != null) { + onCreate!(); + } + }, + child: Container( + alignment: Alignment.bottomRight, + height: 45, + width: 150, + decoration: BoxDecoration( + color: primaryColor, + borderRadius: BorderRadius.circular(5), + ), + child: TextButton( + onPressed: null, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + child: LocalText(context, 'box.crete.carton', + color: Colors.white, fontSize: 15), + ), + const SizedBox(width: 5), + const Icon( + MaterialCommunityIcons.check_circle_outline, + color: Colors.white, + ), + ], + ), + ), + )); + + final previousBtn = PreviousButton(onTap: () { + if (onPrevious != null) { + onPrevious!(); + } + }); + + return Column( + children: [ + Expanded( + child: ListView( + padding: const EdgeInsets.all(20), + children: [ + cartonType, + const SizedBox(height: 10), + shipmentBox, + const SizedBox(height: 10), + usersBox, + const SizedBox(height: 10), + deliveryTypeBox, + const SizedBox(height: 10), + packages.isNotEmpty ? packagesBox : const SizedBox(), + const SizedBox(height: 10), + cargosBox, + const SizedBox(height: 20), + ], + ), + ), + Padding( + padding: const EdgeInsets.only(left: 15, right: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [previousBtn, createBtn], + ), + ), + const SizedBox(height: 20) + ], + ); + } + + Widget billWidget(BuildContext context) { + return Row( + children: [ + Icon(Ionicons.document_text_outline, color: primaryColor, size: 20), + Text("Bill to", style: TextStyle(color: primaryColor, fontSize: 15)) + ], + ); + } +} diff --git a/lib/pages/carton/custom_duty_addition.dart b/lib/pages/carton/custom_duty_addition.dart index d224f86..cb07ac6 100644 --- a/lib/pages/carton/custom_duty_addition.dart +++ b/lib/pages/carton/custom_duty_addition.dart @@ -35,11 +35,18 @@ class _CustomDutyAdditionState extends State { shipmentRateModel.rate.customDuties.map((e) => e.clone()).toList(); for (var p in customDuties) { + p.qty = 0; if (widget.customDuties.any((e) => e.id == p.id)) { p.isChecked = true; } else { p.isChecked = false; } + + widget.customDuties.forEach((vp) { + if (p.id == vp.id) { + p.qty = vp.qty; + } + }); } if (mounted) { @@ -87,6 +94,7 @@ class _CustomDutyAdditionState extends State { callBack: () { List _cargos = customDuties.where((c) => c.isChecked).toList(); + if (_cargos.isEmpty) { showMsgDialog(context, 'Error', "Please select the cargo type"); return; diff --git a/lib/pages/carton/mix_carton/mix_carton_submit.dart b/lib/pages/carton/mix_carton/mix_carton_submit.dart index 7f386ab..894471b 100644 --- a/lib/pages/carton/mix_carton/mix_carton_submit.dart +++ b/lib/pages/carton/mix_carton/mix_carton_submit.dart @@ -8,6 +8,7 @@ import '../../../domain/entities/carton.dart'; import '../../../domain/entities/carton_size.dart'; import '../../../domain/entities/fcs_shipment.dart'; import '../../../helpers/theme.dart'; +import '../../main/util.dart'; import '../../widgets/local_text.dart'; import '../../widgets/previous_button.dart'; import '../../widgets/submit_text_widget.dart'; @@ -47,6 +48,7 @@ class _MixCartonSubmitState extends State { final NumberFormat numberFormatter = NumberFormat("#,###"); Map _mapCargosByWeight = {}; Map _mapCargosByCustomDutyFee = {}; + double totalWeight = 0; @override void initState() { @@ -69,6 +71,9 @@ class _MixCartonSubmitState extends State { _mapCargosByWeight[key] = total; }); + totalWeight = + _mapCargosByWeight.entries.fold(0, (sum, value) => sum + value.value); + // get cargos by custom duty fee Map> _cargosByCustomDutyFee = groupCargos(_cargoTypes.where((e) => e.isCutomDuty).toList()); @@ -104,7 +109,7 @@ class _MixCartonSubmitState extends State { padding: const EdgeInsets.only(top: 10), child: SubmitTextWidget( labelKey: 'box.carton.type', - text: 'Mix Carton', + text: carton_mix_carton, subText: boxDimension, ), ); @@ -159,9 +164,18 @@ class _MixCartonSubmitState extends State { padding: const EdgeInsets.only(top: 10), child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Padding( - padding: const EdgeInsets.only(left: 5, bottom: 5), - child: LocalText(context, 'box.cargo.type', - color: primaryColor, fontSize: 16, fontWeight: FontWeight.normal), + padding: const EdgeInsets.only(left: 5, bottom: 5, right: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocalText(context, 'box.cargo.type', + color: primaryColor, + fontSize: 16, + fontWeight: FontWeight.normal), + Text("${removeTrailingZeros(totalWeight)} lb", + style: TextStyle(color: Colors.black, fontSize: 15)) + ], + ), ), Container( decoration: BoxDecoration( @@ -185,7 +199,7 @@ class _MixCartonSubmitState extends State { style: TextStyle(color: Colors.black, fontSize: 15), ), - Text("${numberFormatter.format(e.value)} lb", + Text("${removeTrailingZeros(e.value)} lb", style: TextStyle( color: Colors.black, fontSize: 15)) ], diff --git a/lib/pages/main/util.dart b/lib/pages/main/util.dart index 63751ac..9e28cbb 100644 --- a/lib/pages/main/util.dart +++ b/lib/pages/main/util.dart @@ -395,3 +395,12 @@ bool hasUnicode(String text) { text.codeUnits.where((ch) => ch > maxBits).toList(); return unicodeSymbols.length > 0; } + + +String removeTrailingZeros(double number) { + String result = number.toString(); + result = result.indexOf('.') > 0 + ? result.replaceAll(RegExp(r"([.]*0)(?!.*\d)"), "") + : result; + return result; +}