287 lines
8.2 KiB
Dart
287 lines
8.2 KiB
Dart
// ignore_for_file: deprecated_member_use
|
|
|
|
import 'package:fcs/domain/entities/carton.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import '../../constants.dart';
|
|
import '../../../domain/entities/carton_size.dart';
|
|
import '../../../domain/entities/fcs_shipment.dart';
|
|
import '../../../domain/vo/local_step.dart';
|
|
import '../../../helpers/theme.dart';
|
|
import '../../domain/entities/cargo_type.dart';
|
|
import '../../domain/entities/user.dart';
|
|
import '../main/util.dart';
|
|
import '../widgets/local_text.dart';
|
|
import '../widgets/progress.dart';
|
|
import '../widgets/step_widget.dart';
|
|
import 'cargo_widget.dart';
|
|
import 'carton_size_widget.dart';
|
|
import 'carton_submit.dart';
|
|
import 'model/carton_model.dart';
|
|
import 'model/package_selection_model.dart';
|
|
import 'package_selection_widget.dart';
|
|
|
|
class CartonPackageForm extends StatefulWidget {
|
|
final User sender;
|
|
final User consignee;
|
|
|
|
const CartonPackageForm({
|
|
super.key,
|
|
required this.sender,
|
|
required this.consignee,
|
|
});
|
|
|
|
@override
|
|
State<CartonPackageForm> createState() => _CartonPackageFormState();
|
|
}
|
|
|
|
class _CartonPackageFormState extends State<CartonPackageForm> {
|
|
var dateFormatter = DateFormat('dd MMM yyyy');
|
|
final NumberFormat numberFormatter = NumberFormat("#,###");
|
|
List<LocalStep> steps = [
|
|
LocalStep(lable: 'Size', stepType: StepType.SIZE),
|
|
LocalStep(lable: 'Packages', stepType: StepType.PACKAGES),
|
|
LocalStep(lable: 'Cargos', stepType: StepType.CARGOS),
|
|
LocalStep(lable: 'Submit', stepType: StepType.SUBMIT)
|
|
];
|
|
|
|
List<CargoType> _cargoTypes = [];
|
|
List<CargoType> _surchareItems = [];
|
|
double _totalWeight = 0;
|
|
|
|
int currentStep = 0;
|
|
double _length = 0;
|
|
double _width = 0;
|
|
double _height = 0;
|
|
|
|
String _selectedLastMile = delivery_caton;
|
|
String _billToValue = billToSender;
|
|
|
|
FcsShipment? _shipment;
|
|
String _cartonSizeType = standardCarton;
|
|
CartonSize? _standardSize;
|
|
bool _isLoading = false;
|
|
|
|
@override
|
|
void initState() {
|
|
context.read<PackageSelectionModel>().clearSelection();
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return WillPopScope(
|
|
onWillPop: () {
|
|
if (currentStep == 0) {
|
|
Navigator.of(context).pop();
|
|
}
|
|
if (currentStep > 0) {
|
|
setState(() {
|
|
currentStep -= 1;
|
|
});
|
|
}
|
|
|
|
return Future.value(false);
|
|
},
|
|
child: LocalProgress(
|
|
inAsyncCall: _isLoading,
|
|
child: Scaffold(
|
|
appBar: AppBar(
|
|
elevation: 0,
|
|
centerTitle: true,
|
|
leading: IconButton(
|
|
icon: const Icon(CupertinoIcons.back,
|
|
color: primaryColor, size: 25),
|
|
onPressed: () {
|
|
if (currentStep == 0) {
|
|
Navigator.of(context).pop();
|
|
}
|
|
if (currentStep > 0) {
|
|
setState(() {
|
|
currentStep -= 1;
|
|
});
|
|
}
|
|
},
|
|
),
|
|
backgroundColor: Colors.white,
|
|
title: LocalText(context, 'boxes.new',
|
|
color: primaryColor, fontSize: 20),
|
|
),
|
|
body: Column(
|
|
children: [
|
|
StepperWidget(
|
|
labels: steps.map((e) => e.lable).toList(),
|
|
currentStep: currentStep,
|
|
eachStepWidth: MediaQuery.of(context).size.width / 4,
|
|
onChange: (index) {
|
|
if (index > currentStep) {
|
|
return;
|
|
}
|
|
setState(() {
|
|
currentStep = index;
|
|
});
|
|
},
|
|
),
|
|
getContent(currentStep)
|
|
],
|
|
))),
|
|
);
|
|
}
|
|
|
|
Widget getContent(int index) {
|
|
var step = steps[index];
|
|
if (step.stepType == StepType.SIZE) {
|
|
return Expanded(
|
|
child: CartonSizeWidget(
|
|
lastMile: _selectedLastMile,
|
|
billType: _billToValue,
|
|
sender: widget.sender,
|
|
consignee: widget.consignee,
|
|
shipment: _shipment,
|
|
cartonSizeType: _cartonSizeType,
|
|
standardSize: _standardSize,
|
|
length: _length,
|
|
width: _width,
|
|
height: _height,
|
|
onPrevious: () {
|
|
Navigator.pop(context);
|
|
},
|
|
onContinue: (lastMile, billType, shipment, cartonSizeType,
|
|
{standardSize, length, width, height}) {
|
|
setState(() {
|
|
_selectedLastMile = lastMile;
|
|
_billToValue = billType;
|
|
_shipment = shipment;
|
|
_cartonSizeType = cartonSizeType;
|
|
_standardSize = standardSize;
|
|
_length = length ?? 0;
|
|
_width = width ?? 0;
|
|
_height = height ?? 0;
|
|
currentStep += 1;
|
|
});
|
|
},
|
|
));
|
|
} else if (step.stepType == StepType.PACKAGES) {
|
|
return Expanded(
|
|
child: PackageSelectionWidget(
|
|
sender: widget.sender,
|
|
consignee: widget.consignee,
|
|
shipment: _shipment!,
|
|
onContinue: () {
|
|
setState(() {
|
|
currentStep += 1;
|
|
});
|
|
},
|
|
onPrevious: () {
|
|
setState(() {
|
|
currentStep -= 1;
|
|
});
|
|
},
|
|
),
|
|
);
|
|
} else if (step.stepType == StepType.CARGOS) {
|
|
return Expanded(
|
|
child: CargoWidget(
|
|
sender: widget.sender,
|
|
consignee: widget.consignee,
|
|
cargoTypes: _cargoTypes,
|
|
surchargeItems: _surchareItems,
|
|
totalWeight: _totalWeight,
|
|
onContinue: (cargoTypes, customDuties) {
|
|
setState(() {
|
|
_cargoTypes = List.from(cargoTypes);
|
|
_surchareItems = List.from(customDuties);
|
|
currentStep += 1;
|
|
});
|
|
},
|
|
onPrevious: (cargoTypes, customDuties, totalWeight) {
|
|
setState(() {
|
|
_totalWeight = totalWeight;
|
|
_cargoTypes = List.from(cargoTypes);
|
|
_surchareItems = List.from(customDuties);
|
|
currentStep -= 1;
|
|
});
|
|
},
|
|
),
|
|
);
|
|
} else {
|
|
return Expanded(
|
|
child: CartonSubmit(
|
|
sender: widget.sender,
|
|
consingee: widget.consignee,
|
|
billToValue: _billToValue,
|
|
cartonSizeType: _cartonSizeType,
|
|
standardSize: _standardSize,
|
|
length: _length,
|
|
width: _width,
|
|
height: _height,
|
|
lastMile: _selectedLastMile,
|
|
shipment: _shipment!,
|
|
cargoTypes: _cargoTypes,
|
|
surchareItems: _surchareItems,
|
|
onCreate: () {
|
|
_create();
|
|
},
|
|
onPrevious: () {
|
|
setState(() {
|
|
currentStep -= 1;
|
|
});
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
_create() async {
|
|
setState(() {
|
|
_isLoading = true;
|
|
});
|
|
try {
|
|
double length = 0;
|
|
double width = 0;
|
|
double height = 0;
|
|
|
|
if (_cartonSizeType == standardCarton) {
|
|
if (_standardSize != null) {
|
|
length = _standardSize!.length;
|
|
width = _standardSize!.width;
|
|
height = _standardSize!.height;
|
|
}
|
|
} else if (_cartonSizeType == customCarton) {
|
|
length = _length;
|
|
width = _width;
|
|
height = _height;
|
|
} else {
|
|
length = 0;
|
|
width = 0;
|
|
height = 0;
|
|
}
|
|
|
|
var carton = Carton(
|
|
cartonType: carton_from_packages,
|
|
senderID: widget.sender.id,
|
|
consigneeID: widget.consignee.id,
|
|
billTo: _billToValue,
|
|
lastMile: _selectedLastMile,
|
|
fcsShipmentID: _shipment?.id,
|
|
length: length,
|
|
width: width,
|
|
height: height,
|
|
// packages: _packages,
|
|
cargoTypes: _cargoTypes,
|
|
surchareItems: _surchareItems);
|
|
var c = await context.read<CartonModel>().createCarton(carton);
|
|
Navigator.pop(context, c);
|
|
} catch (e) {
|
|
showMsgDialog(context, "Error", e.toString());
|
|
} finally {
|
|
setState(() {
|
|
_isLoading = false;
|
|
});
|
|
}
|
|
}
|
|
}
|