fix carton

This commit is contained in:
2021-01-10 15:56:27 +06:30
parent 83cea10328
commit 4839109280
21 changed files with 201 additions and 162 deletions

View File

@@ -275,7 +275,7 @@
"box.packages":"Packages", "box.packages":"Packages",
"box.tracking.id":"Tracking ID", "box.tracking.id":"Tracking ID",
"box.market":"Market", "box.market":"Market",
"box.cargo.save.btn":"Save", "box.cargo.save.btn":"Select",
"box.type.title":"Carton types", "box.type.title":"Carton types",
"box.shipment.boxes":"Cartons", "box.shipment.boxes":"Cartons",
"box.shipment_number":"Shipment number", "box.shipment_number":"Shipment number",

View File

@@ -275,7 +275,7 @@
"box.packages":"အထုပ်များ", "box.packages":"အထုပ်များ",
"box.tracking.id":"Tracking ID", "box.tracking.id":"Tracking ID",
"box.market":"အွန်လိုင်စျေးဆိုင်", "box.market":"အွန်လိုင်စျေးဆိုင်",
"box.cargo.save.btn":"သိမ်းဆည်းမည်", "box.cargo.save.btn":"ရွေးမည်",
"box.type.title":"သေတ္တာအမျိုးအစားများ", "box.type.title":"သေတ္တာအမျိုးအစားများ",
"box.shipment.boxes":"သေတ္တာများ", "box.shipment.boxes":"သေတ္တာများ",
"box.shipment_number":"ပို့ဆောင်နံပါတ်", "box.shipment_number":"ပို့ဆောင်နံပါတ်",

View File

@@ -60,6 +60,7 @@ class Carton {
//for mix box //for mix box
String mixBoxType; String mixBoxType;
List<Carton> mixCartons; List<Carton> mixCartons;
List<String> mixCartonIDs;
int get amount => rate != null && weight != null ? rate * weight : 0; int get amount => rate != null && weight != null ? rate * weight : 0;
@@ -172,10 +173,11 @@ class Carton {
this.cartonSizeID, this.cartonSizeID,
this.cartonSizeName, this.cartonSizeName,
this.mixBoxType, this.mixBoxType,
this.mixCartons}); this.mixCartons,
this.mixCartonIDs});
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
List _cargoTypes = cargoTypes.map((c) => c.toMap()).toList(); List _cargoTypes = cargoTypes?.map((c) => c.toMap())?.toList() ?? [];
List _packages = packages?.map((c) => c.toJson())?.toList(); List _packages = packages?.map((c) => c.toJson())?.toList();
List _mixCartons = mixCartons?.map((c) => c.toJson())?.toList(); List _mixCartons = mixCartons?.map((c) => c.toJson())?.toList();
return { return {
@@ -246,6 +248,7 @@ class Carton {
senderID: map['sender_id'], senderID: map['sender_id'],
senderFCSID: map['sender_fcs_id'], senderFCSID: map['sender_fcs_id'],
senderName: map['sender_name'], senderName: map['sender_name'],
mixCartonIDs: List<String>.from(map['mix_carton_ids'] ?? []),
); );
} }

View File

@@ -7,6 +7,7 @@ class DeliveryAddress {
String state; String state;
String phoneNumber; String phoneNumber;
bool isDefault; bool isDefault;
String userID;
DeliveryAddress( DeliveryAddress(
{this.id, {this.id,
this.fullName, this.fullName,
@@ -15,6 +16,7 @@ class DeliveryAddress {
this.city, this.city,
this.state, this.state,
this.phoneNumber, this.phoneNumber,
this.userID,
this.isDefault = false}); this.isDefault = false});
factory DeliveryAddress.fromMap(Map<String, dynamic> map, String docID) { factory DeliveryAddress.fromMap(Map<String, dynamic> map, String docID) {
@@ -39,6 +41,7 @@ class DeliveryAddress {
'city': city, 'city': city,
'state': state, 'state': state,
'phone_number': phoneNumber, 'phone_number': phoneNumber,
'user_id': userID,
}; };
} }

View File

@@ -98,10 +98,16 @@ class _CartonEditorState extends State<CartonEditor> {
_selectedCartonType = _carton.cartonType; _selectedCartonType = _carton.cartonType;
_cargoTypes = List.from(_carton.cargoTypes); _cargoTypes = List.from(_carton.cargoTypes);
_isNew = false; _isNew = false;
_user = User(fcsID: _carton.fcsID, name: _carton.userName); _user = User(
consignee = id: _carton.userID, fcsID: _carton.fcsID, name: _carton.userName);
User(fcsID: _carton.receiverFCSID, name: _carton.receiverName); consignee = User(
sender = User(fcsID: _carton.senderID, name: _carton.senderName); id: _carton.receiverID,
fcsID: _carton.receiverFCSID,
name: _carton.receiverName);
sender = User(
id: _carton.senderID,
fcsID: _carton.senderID,
name: _carton.senderName);
_selectedMixBoxType = _carton.mixBoxType ?? ""; _selectedMixBoxType = _carton.mixBoxType ?? "";
this._mixCartons = this._mixCartons =
_carton.mixCartons == null ? [] : List.from(_carton.mixCartons); _carton.mixCartons == null ? [] : List.from(_carton.mixCartons);
@@ -268,13 +274,12 @@ class _CartonEditorState extends State<CartonEditor> {
_isNew _isNew
? IconButton( ? IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => onPressed: () => searchUser(context, onUserSelect: (u) {
searchUser(context, callbackUserSelect: (u) {
setState(() { setState(() {
this._user = u; this._user = u;
_loadPackages(); _loadPackages();
}); });
})) }, popPage: true))
: Container(), : Container(),
], ],
)); ));
@@ -356,6 +361,36 @@ class _CartonEditorState extends State<CartonEditor> {
), ),
); );
final mixTypeDisplayBox = Container(
padding: EdgeInsets.only(top: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.only(left: 5),
child: LocalText(
context,
"box.mix_type",
color: primaryColor,
fontSize: 15,
fontWeight: FontWeight.bold,
)),
Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Icon(
Icons.check,
color: primaryColor,
),
),
Text(_selectedMixBoxType ?? "")
],
)
],
),
);
final mixcartonTitleBox = Container( final mixcartonTitleBox = Container(
child: LocalTitle( child: LocalTitle(
textKey: "box.mix_caton_title", textKey: "box.mix_caton_title",
@@ -427,7 +462,7 @@ class _CartonEditorState extends State<CartonEditor> {
); );
final createMixCarton = LocalButton( final createMixCarton = LocalButton(
textKey: _isNew ? "box.mix_carton_btn" : "box.cargo.save.btn", textKey: _isNew ? "box.mix_carton_btn" : "btn.save",
callBack: _creatMixCarton, callBack: _creatMixCarton,
); );
@@ -441,11 +476,11 @@ class _CartonEditorState extends State<CartonEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this.consignee = u; this.consignee = u;
}); });
})), }, popPage: true)),
], ],
); );
@@ -475,11 +510,11 @@ class _CartonEditorState extends State<CartonEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this.sender = u; this.sender = u;
}); });
})), }, popPage: true)),
], ],
); );
@@ -537,7 +572,11 @@ class _CartonEditorState extends State<CartonEditor> {
cartonTypeBox, cartonTypeBox,
LocalTitle(textKey: "box.shipment_info"), LocalTitle(textKey: "box.shipment_info"),
_isNew ? fcsShipmentsBox : shipmentBox, _isNew ? fcsShipmentsBox : shipmentBox,
isMixBox ? mixTypeBox : Container(), isMixBox
? _isNew
? mixTypeBox
: mixTypeDisplayBox
: Container(),
...(isMixBox ...(isMixBox
? [ ? [
mixcartonTitleBox, mixcartonTitleBox,
@@ -647,8 +686,11 @@ class _CartonEditorState extends State<CartonEditor> {
Carton _c = await Navigator.push( Carton _c = await Navigator.push(
context, context,
CupertinoPageRoute( CupertinoPageRoute(
builder: (context) => builder: (context) => PackageCartonEditor(
PackageCartonEditor(carton: c.value, isNew: false)), carton: c.value,
isNew: false,
consignee: _user,
)),
); );
if (_c == null) return; if (_c == null) return;
cartons.removeWhere((item) => item.id == _c.id); cartons.removeWhere((item) => item.id == _c.id);
@@ -826,8 +868,11 @@ class _CartonEditorState extends State<CartonEditor> {
Carton _c = await Navigator.push( Carton _c = await Navigator.push(
context, context,
CupertinoPageRoute( CupertinoPageRoute(
builder: (context) => builder: (context) => PackageCartonEditor(
PackageCartonEditor(carton: carton, isNew: _isNew)), carton: carton,
isNew: _isNew,
consignee: _user,
)),
); );
if (_c == null) return; if (_c == null) return;
var cartonModel = Provider.of<CartonModel>(context, listen: false); var cartonModel = Provider.of<CartonModel>(context, listen: false);
@@ -882,9 +927,9 @@ class _CartonEditorState extends State<CartonEditor> {
CartonModel cartonModel = CartonModel cartonModel =
Provider.of<CartonModel>(context, listen: false); Provider.of<CartonModel>(context, listen: false);
if (_isNew) { if (_isNew) {
await cartonModel.createMixCarton(carton); await cartonModel.createCarton(carton);
} else { } else {
await cartonModel.updateMixCarton(carton); await cartonModel.updateCarton(carton);
} }
Navigator.pop(context, true); Navigator.pop(context, true);
} catch (e) { } catch (e) {

View File

@@ -51,7 +51,6 @@ class _CartonInfoState extends State<CartonInfo> {
double volumetricRatio = 0; double volumetricRatio = 0;
double shipmentWeight = 0; double shipmentWeight = 0;
String selectMixBoxType; String selectMixBoxType;
List<Carton> _mixCartons = [];
bool isMixBox; bool isMixBox;
bool isFromShipments; bool isFromShipments;
@@ -76,6 +75,7 @@ class _CartonInfoState extends State<CartonInfo> {
_updateBoxData(); _updateBoxData();
_loadPackages(); _loadPackages();
_loadMixCartons();
} }
_updateBoxData() { _updateBoxData() {
@@ -93,7 +93,6 @@ class _CartonInfoState extends State<CartonInfo> {
isEdiable = (isFromPackages || isMixBox || isFromCartons) && isEdiable = (isFromPackages || isMixBox || isFromCartons) &&
_box.status == carton_packed_status; _box.status == carton_packed_status;
selectMixBoxType = _box.mixBoxType ?? ""; selectMixBoxType = _box.mixBoxType ?? "";
_mixCartons = _box.mixCartons == null ? [] : _box.mixCartons;
getCartonSize(); getCartonSize();
} }
@@ -132,6 +131,20 @@ class _CartonInfoState extends State<CartonInfo> {
}); });
} }
_loadMixCartons() async {
if (_box.cartonType != carton_mix_box) return;
CartonModel cartonModel = Provider.of<CartonModel>(context, listen: false);
List<Carton> catons = [];
for (var id in _box.mixCartonIDs) {
Carton c = await cartonModel.getCarton(id);
catons.add(c);
}
setState(() {
_box.mixCartons = catons;
});
}
_calShipmentWeight() { _calShipmentWeight() {
double l = double.parse(_lengthController.text, (s) => 0); double l = double.parse(_lengthController.text, (s) => 0);
double w = double.parse(_widthController.text, (s) => 0); double w = double.parse(_widthController.text, (s) => 0);
@@ -356,7 +369,7 @@ class _CartonInfoState extends State<CartonInfo> {
isMixBox ? mixTypeBox : Container(), isMixBox ? mixTypeBox : Container(),
isMixBox ? LocalTitle(textKey: "box.mix_caton_title") : Container(), isMixBox ? LocalTitle(textKey: "box.mix_caton_title") : Container(),
isMixBox isMixBox
? Column(children: _getCartons(context, this._mixCartons)) ? Column(children: _getCartons(context, _box.mixCartons))
: Container(), : Container(),
isFromPackages || isSmallBag isFromPackages || isSmallBag
? CartonPackageTable( ? CartonPackageTable(
@@ -397,6 +410,7 @@ class _CartonInfoState extends State<CartonInfo> {
} }
_gotoEditor() async { _gotoEditor() async {
widget.box.mixCartons=_box.mixCartons;
bool updated = await Navigator.push<bool>( bool updated = await Navigator.push<bool>(
context, context,
CupertinoPageRoute(builder: (context) => CartonEditor(box: widget.box)), CupertinoPageRoute(builder: (context) => CartonEditor(box: widget.box)),
@@ -406,9 +420,10 @@ class _CartonInfoState extends State<CartonInfo> {
var c = await cartonModel.getCarton(widget.box.id); var c = await cartonModel.getCarton(widget.box.id);
setState(() { setState(() {
_box = c; _box = c;
_loadPackages();
_loadMixCartons();
_updateBoxData(); _updateBoxData();
}); });
_loadPackages();
} }
} }

View File

@@ -60,7 +60,7 @@ class CartonModel extends BaseModel {
List<String> cartonTypes = [ List<String> cartonTypes = [
carton_from_packages, carton_from_packages,
carton_from_cargos, // carton_from_cargos,
carton_mix_box carton_mix_box
]; ];
List<String> mixBoxTypes = [mix_delivery, mix_pickup]; List<String> mixBoxTypes = [mix_delivery, mix_pickup];
@@ -262,11 +262,4 @@ class CartonModel extends BaseModel {
return Services.instance.cartonService.searchCarton(term); return Services.instance.cartonService.searchCarton(term);
} }
Future<Carton> createMixCarton(Carton carton) {
// return Services.instance.cartonService.createCarton(carton);
}
Future<void> updateMixCarton(Carton carton) {
// return Services.instance.cartonService.updateCarton(carton);
}
} }

View File

@@ -3,6 +3,7 @@ import 'package:fcs/domain/entities/carton.dart';
import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/cargo_type.dart';
import 'package:fcs/domain/entities/carton_size.dart'; import 'package:fcs/domain/entities/carton_size.dart';
import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/package.dart';
import 'package:fcs/domain/entities/user.dart';
import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/domain/vo/delivery_address.dart';
import 'package:fcs/helpers/theme.dart'; import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/carton_size/carton_size_list.dart'; import 'package:fcs/pages/carton_size/carton_size_list.dart';
@@ -30,7 +31,8 @@ import 'model/carton_model.dart';
class PackageCartonEditor extends StatefulWidget { class PackageCartonEditor extends StatefulWidget {
final Carton carton; final Carton carton;
final bool isNew; final bool isNew;
PackageCartonEditor({this.carton, this.isNew}); final User consignee;
PackageCartonEditor({this.carton, this.isNew, this.consignee});
@override @override
_PackageCartonEditorState createState() => _PackageCartonEditorState(); _PackageCartonEditorState createState() => _PackageCartonEditorState();
@@ -200,7 +202,9 @@ class _PackageCartonEditorState extends State<PackageCartonEditor> {
CupertinoPageRoute( CupertinoPageRoute(
builder: (context) => DeliveryAddressSelection( builder: (context) => DeliveryAddressSelection(
deliveryAddress: _deliveryAddress, deliveryAddress: _deliveryAddress,
deliveryAddresses: this._deliveryAddresses)), deliveryAddresses: this._deliveryAddresses,
user: widget.consignee,
)),
); );
if (d == null) return; if (d == null) return;
setState(() { setState(() {

View File

@@ -43,7 +43,7 @@ class _CustomerListState extends State<CustomerList> {
actions: <Widget>[ actions: <Widget>[
IconButton( IconButton(
icon: Icon(Icons.search, color: Colors.white), icon: Icon(Icons.search, color: Colors.white),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
_select(u); _select(u);
})), })),
], ],

View File

@@ -1,3 +1,4 @@
import 'package:fcs/domain/entities/user.dart';
import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/domain/vo/delivery_address.dart';
import 'package:fcs/helpers/theme.dart'; import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart';
@@ -12,7 +13,8 @@ import 'package:provider/provider.dart';
class DeliveryAddressEditor extends StatefulWidget { class DeliveryAddressEditor extends StatefulWidget {
final DeliveryAddress deliveryAddress; final DeliveryAddress deliveryAddress;
DeliveryAddressEditor({this.deliveryAddress}); final User user;
DeliveryAddressEditor({this.deliveryAddress, this.user});
@override @override
_DeliveryAddressEditorState createState() => _DeliveryAddressEditorState(); _DeliveryAddressEditorState createState() => _DeliveryAddressEditorState();
@@ -195,6 +197,9 @@ class _DeliveryAddressEditorState extends State<DeliveryAddressEditor> {
if (!valid) { if (!valid) {
return; return;
} }
if (widget.user != null) {
deliveryAddress.userID = widget.user.id;
}
setState(() { setState(() {
_isLoading = true; _isLoading = true;
}); });
@@ -202,7 +207,7 @@ class _DeliveryAddressEditorState extends State<DeliveryAddressEditor> {
Provider.of<DeliveryAddressModel>(context, listen: false); Provider.of<DeliveryAddressModel>(context, listen: false);
try { try {
await deliveryAddressModel.createDeliveryAddress(deliveryAddress); await deliveryAddressModel.createDeliveryAddress(deliveryAddress);
Navigator.pop(context); Navigator.pop(context,true);
} catch (e) { } catch (e) {
showMsgDialog(context, "Error", e.toString()); showMsgDialog(context, "Error", e.toString());
} finally { } finally {
@@ -225,7 +230,7 @@ class _DeliveryAddressEditorState extends State<DeliveryAddressEditor> {
Provider.of<DeliveryAddressModel>(context, listen: false); Provider.of<DeliveryAddressModel>(context, listen: false);
try { try {
await deliveryAddressModel.updateDeliveryAddress(deliveryAddress); await deliveryAddressModel.updateDeliveryAddress(deliveryAddress);
Navigator.pop(context); Navigator.pop(context,true);
} catch (e) { } catch (e) {
showMsgDialog(context, "Error", e.toString()); showMsgDialog(context, "Error", e.toString());
} finally { } finally {
@@ -247,7 +252,7 @@ class _DeliveryAddressEditorState extends State<DeliveryAddressEditor> {
DeliveryAddressModel deliveryAddressModel = DeliveryAddressModel deliveryAddressModel =
Provider.of<DeliveryAddressModel>(context, listen: false); Provider.of<DeliveryAddressModel>(context, listen: false);
await deliveryAddressModel.deleteDeliveryAddress(_deliveryAddress); await deliveryAddressModel.deleteDeliveryAddress(_deliveryAddress);
Navigator.pop(context); Navigator.pop(context,true);
} catch (e) { } catch (e) {
showMsgDialog(context, "Error", e.toString()); showMsgDialog(context, "Error", e.toString());
} finally { } finally {

View File

@@ -77,12 +77,12 @@ class _DiscountEditorState extends State<DiscountEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
customerId = u.id; customerId = u.id;
customerName = u.name; customerName = u.name;
}); });
})), },popPage: true)),
], ],
); );

View File

@@ -47,7 +47,7 @@ class _PackageNewState extends State<PackageNew> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this.user = u; this.user = u;
}); });

View File

@@ -1,3 +1,4 @@
import 'package:fcs/domain/constants.dart';
import 'package:fcs/domain/entities/market.dart'; import 'package:fcs/domain/entities/market.dart';
import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/package.dart';
import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/domain/entities/user.dart';
@@ -7,7 +8,9 @@ import 'package:fcs/pages/market/model/market_model.dart';
import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/package/model/package_model.dart';
import 'package:fcs/pages/package/tracking_id_page.dart'; import 'package:fcs/pages/package/tracking_id_page.dart';
import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/main/util.dart';
import 'package:fcs/pages/package_search/package_serach.dart';
import 'package:fcs/pages/widgets/barcode_scanner.dart'; import 'package:fcs/pages/widgets/barcode_scanner.dart';
import 'package:fcs/pages/widgets/display_text.dart';
import 'package:fcs/pages/widgets/input_text.dart'; import 'package:fcs/pages/widgets/input_text.dart';
import 'package:fcs/pages/widgets/local_text.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_controller.dart';
@@ -32,59 +35,60 @@ class PackageEditor extends StatefulWidget {
class _PackageEditorState extends State<PackageEditor> { class _PackageEditorState extends State<PackageEditor> {
TextEditingController _remarkCtl = new TextEditingController(); TextEditingController _remarkCtl = new TextEditingController();
TextEditingController _descCtl = new TextEditingController(); TextEditingController _descCtl = new TextEditingController();
TextEditingController _trackingIDCtl = new TextEditingController();
bool _isLoading = false; bool _isLoading = false;
bool _isNew;
MultiImgController multiImgController = MultiImgController(); MultiImgController multiImgController = MultiImgController();
Package _package = Package(); Package _package;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
if (widget.package != null) { _package = Package();
_isNew = false; _loadPackageData(null);
_package = widget.package; }
_trackingIDCtl.text = _package.trackingID;
_loadPackageData(String id) async {
if (id != null) {
PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false);
Package package = await packageModel.getPackage(id);
if (package != null) {
if (package.status != package_received_status) {
showMsgDialog(context, "Error",
"Invalid package status, expected '$package_received_status' status");
return;
}
setState(() {
_package = package;
});
}
}
setState(() {
selectedMarket = _package.market ?? ""; selectedMarket = _package.market ?? "";
_descCtl.text = _package.desc; _descCtl.text = _package.desc;
_remarkCtl.text = _package.remark; _remarkCtl.text = _package.remark;
multiImgController.setImageFiles = _package.photoFiles; multiImgController.setImageUrls = _package.photoUrls;
} else { });
_isNew = true;
}
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final trackingIDBox = Container( var trackingIDBox = Row(
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
child: InputText( child: DisplayText(
iconData: MaterialCommunityIcons.barcode_scan, text: _package.trackingID,
labelTextKey: "processing.tracking.id", labelTextKey: "processing.tracking.id",
controller: _trackingIDCtl, iconData: MaterialCommunityIcons.barcode_scan,
)), )),
InkWell( IconButton(
onTap: _scan, icon: Icon(Icons.search, color: primaryColor),
child: Padding( onPressed: () => searchPackage(context, callbackPackageSelect: (u) {
padding: const EdgeInsets.all(8.0), _loadPackageData(u.id);
child: Column( Navigator.pop(context);
children: [ })),
Icon(
MaterialCommunityIcons.barcode_scan,
color: primaryColor,
),
Text("Scan")
], ],
), );
),
),
],
));
final descBox = InputText( final descBox = InputText(
labelTextKey: 'processing.desc', labelTextKey: 'processing.desc',
@@ -243,31 +247,6 @@ class _PackageEditorState extends State<PackageEditor> {
); );
} }
_scan() async {
PermissionStatus permission =
await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
if (permission != PermissionStatus.granted) {
Map<PermissionGroup, PermissionStatus> permissions =
await PermissionHandler()
.requestPermissions([PermissionGroup.camera]);
if (permissions[PermissionGroup.camera] != PermissionStatus.granted) {
showMsgDialog(context, "Error", "Camera permission is not granted");
return null;
}
}
try {
String barcode = await scanBarcode();
if (barcode != null) {
setState(() {
_trackingIDCtl.text = barcode;
});
}
} catch (e) {
print('error: $e');
}
}
_selectPackage() async { _selectPackage() async {
setState(() { setState(() {
_isLoading = true; _isLoading = true;
@@ -275,22 +254,17 @@ class _PackageEditorState extends State<PackageEditor> {
PackageModel packageModel = PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false); Provider.of<PackageModel>(context, listen: false);
try { try {
Package package = _package.market = selectedMarket;
await packageModel.getPackageByTrackingID(_trackingIDCtl.text); _package.desc = _descCtl.text;
package.trackingID = _trackingIDCtl.text; _package.remark = _remarkCtl.text;
package.market = selectedMarket; _package.photoFiles = multiImgController.getUpdatedFile;
package.desc = _descCtl.text; _package.fcsID = widget.consignee.fcsID;
package.remark = _remarkCtl.text; _package.senderFCSID = widget.sender?.fcsID;
package.photoFiles = _isNew
? multiImgController.getAddedFile
: multiImgController.getUpdatedFile;
package.fcsID = widget.consignee.fcsID;
package.senderFCSID = widget.sender?.fcsID;
await packageModel.updateProcessing(package, await packageModel.updateProcessing(_package,
multiImgController.getAddedFile, multiImgController.getDeletedUrl); multiImgController.getAddedFile, multiImgController.getDeletedUrl);
Navigator.pop<Package>(context, package); Navigator.pop<Package>(context, _package);
} catch (e) { } catch (e) {
showMsgDialog(context, "Error", e.toString()); showMsgDialog(context, "Error", e.toString());
} finally { } finally {
@@ -301,8 +275,7 @@ class _PackageEditorState extends State<PackageEditor> {
} }
isDataChanged() { isDataChanged() {
return _trackingIDCtl.text != "" || return selectedMarket != null ||
selectedMarket != null ||
_descCtl.text != "" || _descCtl.text != "" ||
_remarkCtl.text != "" || _remarkCtl.text != "" ||
multiImgController.getAddedFile.isNotEmpty; multiImgController.getAddedFile.isNotEmpty;

View File

@@ -68,7 +68,7 @@ class _ProcessingEditEditorState extends State<ProcessingEditEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this._user = u; this._user = u;
}); });

View File

@@ -62,11 +62,11 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this.consignee = u; this.consignee = u;
}); });
})), }, popPage: true)),
], ],
); );
@@ -104,11 +104,11 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this.sender = u; this.sender = u;
}); });
})), }, popPage: true)),
], ],
); );
@@ -148,7 +148,8 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
), ),
onPressed: () async { onPressed: () async {
if (this.consignee == null) { if (this.consignee == null) {
showMsgDialog(context, "Warning", "Please select 'Consignee'"); showMsgDialog(
context, "Warning", "Please select 'Consignee'");
return; return;
} }
Package _package = await Navigator.push<Package>( Package _package = await Navigator.push<Package>(
@@ -181,13 +182,7 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
icon: icon:
new Icon(CupertinoIcons.back, color: primaryColor, size: 30), new Icon(CupertinoIcons.back, color: primaryColor, size: 30),
onPressed: () { onPressed: () {
if (isDataChanged()) {
showConfirmDialog(context, "back.button_confirm", () {
Navigator.of(context).pop(); Navigator.of(context).pop();
});
} else {
Navigator.of(context).pop();
}
}, },
), ),
shadowColor: Colors.transparent, shadowColor: Colors.transparent,
@@ -290,16 +285,4 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
}); });
} }
} }
isDataChanged() {
if (_isNew) {
return this.packages.isNotEmpty || consignee != null || sender != null;
} else {
Processing _processing = Processing(
userID: consignee.fcsID,
fcsID: sender.fcsID,
packages: this.packages);
return widget.processing.isChangedForEdit(_processing);
}
}
} }

View File

@@ -69,7 +69,7 @@ class _ProcessingEditorState extends State<ProcessingEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this._user = u; this._user = u;
}); });

View File

@@ -77,11 +77,11 @@ class _ReceivingEditorState extends State<ReceivingEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) {
setState(() { setState(() {
this.user = u; this.user = u;
}); });
})), },popPage: true)),
], ],
); );

View File

@@ -4,9 +4,9 @@ import 'package:fcs/pages/user_search/user_serach.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class UserListRow extends StatefulWidget { class UserListRow extends StatefulWidget {
final CallbackUserSelect callbackUserSelect; final OnUserRowSelect onUserRowSelect;
final User user; final User user;
const UserListRow({this.user, this.callbackUserSelect}); const UserListRow({this.user, this.onUserRowSelect});
@override @override
_UserListRowState createState() => _UserListRowState(); _UserListRowState createState() => _UserListRowState();
@@ -30,9 +30,8 @@ class _UserListRowState extends State<UserListRow> {
color: Colors.white, color: Colors.white,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
Navigator.pop(context); if (widget.onUserRowSelect != null)
if (widget.callbackUserSelect != null) widget.onUserRowSelect(widget.user);
widget.callbackUserSelect(widget.user);
}, },
child: Row( child: Row(
children: <Widget>[ children: <Widget>[

View File

@@ -5,19 +5,22 @@ import 'package:fcs/pages/user_search/user_list_row.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
typedef CallbackUserSelect(User suer); typedef OnUserSelect(User suer);
typedef OnUserRowSelect(User suer);
Future<User> searchUser(BuildContext context, Future<User> searchUser(BuildContext context,
{CallbackUserSelect callbackUserSelect}) async => {OnUserSelect onUserSelect, bool popPage = false}) async =>
await showSearch<User>( await showSearch<User>(
context: context, context: context,
delegate: UserSearchDelegate(callbackUserSelect: callbackUserSelect), delegate:
UserSearchDelegate(onUserSelect: onUserSelect, popPage: popPage),
); );
class UserSearchDelegate extends SearchDelegate<User> { class UserSearchDelegate extends SearchDelegate<User> {
final CallbackUserSelect callbackUserSelect; final OnUserSelect onUserSelect;
final bool popPage;
UserSearchDelegate({this.callbackUserSelect}); UserSearchDelegate({this.onUserSelect, this.popPage});
@override @override
String get searchFieldLabel => 'Search by FCS ID or Name'; String get searchFieldLabel => 'Search by FCS ID or Name';
@@ -77,7 +80,7 @@ class UserSearchDelegate extends SearchDelegate<User> {
children: snapshot.data children: snapshot.data
.map((u) => UserListRow( .map((u) => UserListRow(
user: u, user: u,
callbackUserSelect: callbackUserSelect, onUserRowSelect: (u) => _onUserRowSelect(context, u),
)) ))
.toList(), .toList(),
), ),
@@ -113,4 +116,13 @@ class UserSearchDelegate extends SearchDelegate<User> {
), ),
); );
} }
_onUserRowSelect(BuildContext context, User user) {
if (onUserSelect != null) {
onUserSelect(user);
}
if (popPage) {
Navigator.pop(context);
}
}
} }

View File

@@ -1,3 +1,4 @@
import 'package:fcs/domain/entities/user.dart';
import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/domain/vo/delivery_address.dart';
import 'package:fcs/helpers/theme.dart'; import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/delivery_address/delivery_address_editor.dart'; import 'package:fcs/pages/delivery_address/delivery_address_editor.dart';
@@ -9,9 +10,10 @@ import 'package:flutter/material.dart';
class DeliveryAddressSelection extends StatelessWidget { class DeliveryAddressSelection extends StatelessWidget {
final DeliveryAddress deliveryAddress; final DeliveryAddress deliveryAddress;
final List<DeliveryAddress> deliveryAddresses; final List<DeliveryAddress> deliveryAddresses;
final User user;
const DeliveryAddressSelection( const DeliveryAddressSelection(
{Key key, this.deliveryAddress, this.deliveryAddresses}) {Key key, this.deliveryAddress, this.deliveryAddresses, this.user})
: super(key: key); : super(key: key);
@override @override
@@ -29,9 +31,11 @@ class DeliveryAddressSelection extends StatelessWidget {
color: primaryColor, fontSize: 20), color: primaryColor, fontSize: 20),
), ),
floatingActionButton: FloatingActionButton.extended( floatingActionButton: FloatingActionButton.extended(
onPressed: () { onPressed: () async {
Navigator.of(context).push(CupertinoPageRoute( Navigator.of(context).push(CupertinoPageRoute(
builder: (context) => DeliveryAddressEditor())); builder: (context) => DeliveryAddressEditor(
user: user,
)));
}, },
icon: Icon(Icons.add), icon: Icon(Icons.add),
label: LocalText(context, "delivery_address.new_address", label: LocalText(context, "delivery_address.new_address",