add packages
This commit is contained in:
@@ -104,7 +104,7 @@
|
|||||||
"reg.confirm":"Submit Registration?",
|
"reg.confirm":"Submit Registration?",
|
||||||
"reg.date":"Registeration Date",
|
"reg.date":"Registeration Date",
|
||||||
|
|
||||||
"profile.title": "FCS Profile",
|
"profile.title": "Profile",
|
||||||
"profile.edit_title": "Edit FCS Profile",
|
"profile.edit_title": "Edit FCS Profile",
|
||||||
"profile.name": "Name",
|
"profile.name": "Name",
|
||||||
"profile.phone": "Phone",
|
"profile.phone": "Phone",
|
||||||
@@ -552,7 +552,8 @@
|
|||||||
|
|
||||||
"contact": "CONTACTS",
|
"contact": "CONTACTS",
|
||||||
|
|
||||||
"fcs.profile": "PROFILE",
|
"fcs.btn": "FCS Profile",
|
||||||
|
"fcs.profile": "FCS PROFILE",
|
||||||
|
|
||||||
"contact.usa.phone": "USA Phone",
|
"contact.usa.phone": "USA Phone",
|
||||||
"contact.mm.phone": "Myanmar Phone"
|
"contact.mm.phone": "Myanmar Phone"
|
||||||
|
|||||||
BIN
assets/photos/1.jpg
Normal file
BIN
assets/photos/1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
assets/photos/2.jpg
Normal file
BIN
assets/photos/2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
BIN
assets/photos/3.jpg
Normal file
BIN
assets/photos/3.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
@@ -60,7 +60,9 @@ class MainModel extends ChangeNotifier {
|
|||||||
shippingAddress: '154-19 64th Ave.Flushing, \nNY 11367',
|
shippingAddress: '154-19 64th Ave.Flushing, \nNY 11367',
|
||||||
deliveryAddress: '39 42th St. Kyaut Ta Thar Township Yangon');
|
deliveryAddress: '39 42th St. Kyaut Ta Thar Township Yangon');
|
||||||
|
|
||||||
Setting setting = Setting(terms: '[{"insert":"* Minimum shipping weight is 1lbs.\n* Oversized goods, Light weight/Large volume items, laptops, phones, tablets may incur extra charges based on pecifications.Please contact us for pricing.\n* Goods with lithium battary needs extra packaging and declaration. Please inform us ahead of time so that we can process your package accordingly.\n* Loose Batteries, Drones, and Prescription medicines are not allowed on aircraft.\n* Payment: We accept money orders, any US bank transfers via Zelle, AYA, KBZ and CB. No COD except for pick-ups.\n*Payments made in Myanmar will incur 2% tranfer fee\n"}]');
|
Setting setting = Setting(
|
||||||
|
terms:
|
||||||
|
'[{"insert":"* Minimum shipping weight is 1lbs.\n* Oversized goods, Light weight/Large volume items, laptops, phones, tablets may incur extra charges based on pecifications.Please contact us for pricing.\n* Goods with lithium battary needs extra packaging and declaration. Please inform us ahead of time so that we can process your package accordingly.\n* Loose Batteries, Drones, and Prescription medicines are not allowed on aircraft.\n* Payment: We accept money orders, any US bank transfers via Zelle, AYA, KBZ and CB. No COD except for pick-ups.\n*Payments made in Myanmar will incur 2% tranfer fee\n"}]');
|
||||||
PackageInfo packageInfo;
|
PackageInfo packageInfo;
|
||||||
bool isLoaded = true;
|
bool isLoaded = true;
|
||||||
bool isOnline = true;
|
bool isOnline = true;
|
||||||
@@ -109,6 +111,14 @@ class MainModel extends ChangeNotifier {
|
|||||||
return this.user != null;
|
return this.user != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isCustomer() {
|
||||||
|
return user != null && user.name != "Owner";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isOwner() {
|
||||||
|
return user != null && user.name == "Owner";
|
||||||
|
}
|
||||||
|
|
||||||
bool hasEmail() {
|
bool hasEmail() {
|
||||||
return this.user != null && this.user.isEmail();
|
return this.user != null && this.user.isEmail();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,19 +8,19 @@ class ShipmentModel extends BaseModel {
|
|||||||
Shipment(
|
Shipment(
|
||||||
shipDate: DateTime(2020, 4, 23),
|
shipDate: DateTime(2020, 4, 23),
|
||||||
shipmentNumber: 'A103B',
|
shipmentNumber: 'A103B',
|
||||||
status: 'Pending',
|
status: 'In Progress',
|
||||||
arrivalDate: DateTime(2020, 4, 30),
|
arrivalDate: DateTime(2020, 4, 30),
|
||||||
departureDate: DateTime(2020, 4, 23)),
|
departureDate: DateTime(2020, 4, 23)),
|
||||||
Shipment(
|
Shipment(
|
||||||
shipDate: DateTime(2020, 4, 2),
|
shipDate: DateTime(2020, 4, 2),
|
||||||
shipmentNumber: 'A100A',
|
shipmentNumber: 'A100A',
|
||||||
status: 'Delivered',
|
status: 'Ready to ship',
|
||||||
arrivalDate: DateTime(2020, 4, 28),
|
arrivalDate: DateTime(2020, 4, 28),
|
||||||
departureDate: DateTime(2020, 4, 15)),
|
departureDate: DateTime(2020, 4, 15)),
|
||||||
Shipment(
|
Shipment(
|
||||||
shipDate: DateTime(2020, 4, 2),
|
shipDate: DateTime(2020, 4, 2),
|
||||||
shipmentNumber: 'A100B',
|
shipmentNumber: 'A100B',
|
||||||
status: 'Delivered',
|
status: 'Arrived',
|
||||||
arrivalDate: DateTime(2020, 4, 28),
|
arrivalDate: DateTime(2020, 4, 28),
|
||||||
departureDate: DateTime(2020, 4, 15)),
|
departureDate: DateTime(2020, 4, 15)),
|
||||||
Shipment(
|
Shipment(
|
||||||
@@ -38,7 +38,7 @@ class ShipmentModel extends BaseModel {
|
|||||||
Shipment(
|
Shipment(
|
||||||
shipDate: DateTime(2020, 4, 10),
|
shipDate: DateTime(2020, 4, 10),
|
||||||
shipmentNumber: 'A102B',
|
shipmentNumber: 'A102B',
|
||||||
status: 'Assigned',
|
status: 'Arrived',
|
||||||
arrivalDate: DateTime(2020, 4, 30),
|
arrivalDate: DateTime(2020, 4, 30),
|
||||||
departureDate: DateTime(2020, 4, 20),
|
departureDate: DateTime(2020, 4, 20),
|
||||||
)
|
)
|
||||||
@@ -47,29 +47,31 @@ class ShipmentModel extends BaseModel {
|
|||||||
List<Shipment> get canceled {
|
List<Shipment> get canceled {
|
||||||
List<Shipment> _p = shipments.where((e) => e.status == "Canceled").toList()
|
List<Shipment> _p = shipments.where((e) => e.status == "Canceled").toList()
|
||||||
..sort((e1, e2) {
|
..sort((e1, e2) {
|
||||||
return e2.shipDate.compareTo(e1.shipDate);
|
return e1.shipDate.compareTo(e2.shipDate);
|
||||||
});
|
});
|
||||||
return _p;
|
return _p;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Shipment> get completed {
|
List<Shipment> get completed {
|
||||||
return shipments.where((e) => e.status == "Delivered").toList()
|
return shipments.where((e) => e.status == "Arrived").toList()
|
||||||
..sort((e1, e2) {
|
..sort((e1, e2) {
|
||||||
return e2.shipDate.compareTo(e1.shipDate);
|
return e1.shipDate.compareTo(e2.shipDate);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Shipment> get upcoming {
|
List<Shipment> get upcoming {
|
||||||
return shipments
|
List<Shipment> _shipments = shipments
|
||||||
.where((e) =>
|
.where((e) =>
|
||||||
e.status == "Pending" ||
|
e.status == "In Progress" ||
|
||||||
e.status == "Assigned" ||
|
e.status == "Ready to ship" ||
|
||||||
e.status == "Processed" ||
|
e.status == "Processed" ||
|
||||||
e.status == "Rescheduled")
|
e.status == "Rescheduled")
|
||||||
.toList()
|
.toList();
|
||||||
..sort((e1, e2) {
|
|
||||||
return e2.shipDate.compareTo(e1.shipDate);
|
_shipments.sort((e1, e2) {
|
||||||
});
|
return e1.shipDate.compareTo(e2.shipDate);
|
||||||
|
});
|
||||||
|
return _shipments;
|
||||||
}
|
}
|
||||||
|
|
||||||
void initUser(user) {
|
void initUser(user) {
|
||||||
|
|||||||
@@ -14,51 +14,51 @@ class MessageModel extends BaseModel {
|
|||||||
List<Message> messages = [
|
List<Message> messages = [
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
receiverName: "Online Buyer",
|
receiverName: "Ko Myo Min",
|
||||||
date: DateTime(2020, 6, 1, 1, 1, 1),
|
date: DateTime(2020, 6, 1, 1, 1, 1),
|
||||||
message:
|
message:
|
||||||
"Hi Online Buyer, we received your goods. Please see the following link",
|
"Hi Ko Myo Min, we received your goods. Please see the following link",
|
||||||
),
|
),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
receiverName: "Online Buyer",
|
receiverName: "Ko Myo Min",
|
||||||
date: DateTime(2020, 6, 1, 1, 1, 1),
|
date: DateTime(2020, 6, 1, 1, 1, 1),
|
||||||
message:
|
message:
|
||||||
"'A202-3 #1'",
|
"'A202-3 #1'",
|
||||||
),
|
),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
receiverName: "Online Buyer",
|
receiverName: "Ko Myo Min",
|
||||||
date: DateTime(2020, 6, 1, 1, 5, 1),
|
date: DateTime(2020, 6, 1, 1, 5, 1),
|
||||||
message: "Thank you. Will check the photos.",
|
message: "Thank you. Will check the photos.",
|
||||||
isMe: false),
|
isMe: false),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
receiverName: "Online Buyer",
|
receiverName: "Ko Myo Min",
|
||||||
date: DateTime(2020, 6, 1, 2, 1, 1),
|
date: DateTime(2020, 6, 1, 2, 1, 1),
|
||||||
message:
|
message:
|
||||||
"Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in the following link.",
|
"Hi Ko Myo Min, we successfully processed your goods and ready for payment. Please see in the following link.",
|
||||||
),
|
),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
receiverName: "Online Buyer",
|
receiverName: "Ko Myo Min",
|
||||||
date: DateTime(2020, 6, 1, 2, 1, 1),
|
date: DateTime(2020, 6, 1, 2, 1, 1),
|
||||||
message:
|
message:
|
||||||
"'INV202005010387'",
|
"'INV202005010387'",
|
||||||
),
|
),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
receiverName: "Online Buyer",
|
receiverName: "Ko Myo Min",
|
||||||
date: DateTime(2020, 6, 1, 2, 10, 1),
|
date: DateTime(2020, 6, 1, 2, 10, 1),
|
||||||
message:
|
message:
|
||||||
"Hi Online Buyer, we have confirmed your payment and ready to ship your packages.",
|
"Hi Ko Myo Min, we have confirmed your payment and ready to ship your packages.",
|
||||||
),
|
),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
receiverName: "Shipper",
|
receiverName: "Shipper",
|
||||||
date: DateTime(2020, 6, 1, 1, 1, 1),
|
date: DateTime(2020, 6, 1, 1, 1, 1),
|
||||||
message:
|
message:
|
||||||
"Hi Online Buyer, we received your goods. Please see in the following link.",
|
"Hi Ko Myo Min, we received your goods. Please see in the following link.",
|
||||||
),
|
),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
@@ -72,7 +72,7 @@ class MessageModel extends BaseModel {
|
|||||||
receiverName: "Shipper",
|
receiverName: "Shipper",
|
||||||
date: DateTime(2020, 6, 1, 2, 1, 1),
|
date: DateTime(2020, 6, 1, 2, 1, 1),
|
||||||
message:
|
message:
|
||||||
"Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in the following link.",
|
"Hi FCS Team, we successfully processed your goods and ready for payment. Please see in the following link.",
|
||||||
),
|
),
|
||||||
Message(
|
Message(
|
||||||
senderName: "FCS System",
|
senderName: "FCS System",
|
||||||
@@ -86,7 +86,14 @@ class MessageModel extends BaseModel {
|
|||||||
receiverName: "Shipper",
|
receiverName: "Shipper",
|
||||||
date: DateTime(2020, 6, 1, 2, 10, 1),
|
date: DateTime(2020, 6, 1, 2, 10, 1),
|
||||||
message:
|
message:
|
||||||
"Hi Online Buyer, we have confirmed your payment and ready to ship your packages.",
|
"Hi FCS Team, we have confirmed your payment and ready to ship your packages.",
|
||||||
|
),
|
||||||
|
Message(
|
||||||
|
senderName: "Ko Myo Min",
|
||||||
|
receiverName: "FCS Team",
|
||||||
|
date: DateTime(2020, 6, 1, 2, 10, 1),
|
||||||
|
message:
|
||||||
|
"Hi Ko Myo Min, we have recevied your pickup request. We will arrange the pickup soon. Thank you.",
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -9,78 +9,103 @@ class PackageModel extends BaseModel {
|
|||||||
final log = Logger('PackageModel');
|
final log = Logger('PackageModel');
|
||||||
|
|
||||||
StreamSubscription<QuerySnapshot> listener;
|
StreamSubscription<QuerySnapshot> listener;
|
||||||
|
static List<Status> statusHistory = [
|
||||||
|
Status(status: "Received", date: DateTime(2020, 6, 1), done: true),
|
||||||
|
Status(status: "Processed", date: DateTime(2020, 6, 1), done: true),
|
||||||
|
Status(status: "Shipped", date: DateTime(2020, 6, 5), done: false),
|
||||||
|
Status(status: "Delivered", date: DateTime(2020, 6, 15), done: false)
|
||||||
|
];
|
||||||
List<Package> packages = [
|
List<Package> packages = [
|
||||||
Package(
|
|
||||||
shipmentNumber: "A202",
|
|
||||||
receiverNumber: "3",
|
|
||||||
boxNumber: "1",
|
|
||||||
rate: 7,
|
|
||||||
packageType: "General",
|
|
||||||
weight: 25,
|
|
||||||
status: "Received",
|
|
||||||
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
|
|
||||||
arrivedDate: DateTime(2020, 6, 1),
|
|
||||||
),
|
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A202",
|
shipmentNumber: "A202",
|
||||||
receiverNumber: "3",
|
receiverNumber: "3",
|
||||||
|
receiverName: "Ko Oo",
|
||||||
|
boxNumber: "1",
|
||||||
|
rate: 7,
|
||||||
|
packageType: "General",
|
||||||
|
weight: 25,
|
||||||
|
status: "Received",
|
||||||
|
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
|
||||||
|
cargoDesc: "Clothes",
|
||||||
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory),
|
||||||
|
Package(
|
||||||
|
shipmentNumber: "A202",
|
||||||
|
receiverNumber: "3",
|
||||||
|
receiverName: "Ko Oo",
|
||||||
boxNumber: "2",
|
boxNumber: "2",
|
||||||
rate: 7,
|
rate: 7,
|
||||||
packageType: "General",
|
packageType: "General",
|
||||||
weight: 20,
|
weight: 20,
|
||||||
status: "Received",
|
status: "Received",
|
||||||
|
cargoDesc: "Clothes",
|
||||||
arrivedDate: DateTime(2020, 6, 1),
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'),
|
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'),
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A202",
|
shipmentNumber: "A202",
|
||||||
receiverNumber: "3",
|
receiverNumber: "3",
|
||||||
|
receiverName: "Ko Oo",
|
||||||
boxNumber: "3",
|
boxNumber: "3",
|
||||||
rate: 7,
|
rate: 7,
|
||||||
packageType: "General",
|
packageType: "General",
|
||||||
weight: 15,
|
weight: 15,
|
||||||
status: "Waiting for payment",
|
cargoDesc: "Shoes",
|
||||||
|
status: "Processed",
|
||||||
arrivedDate: DateTime(2020, 6, 1),
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'),
|
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'),
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A202",
|
shipmentNumber: "A202",
|
||||||
receiverNumber: "2",
|
receiverNumber: "2",
|
||||||
|
receiverName: "Ma Aye",
|
||||||
boxNumber: "1",
|
boxNumber: "1",
|
||||||
rate: 8,
|
rate: 8,
|
||||||
packageType: "Medicine",
|
packageType: "Medicine",
|
||||||
weight: 15,
|
weight: 15,
|
||||||
status: "Processing",
|
status: "Processed",
|
||||||
|
cargoDesc: "Dietary supplement",
|
||||||
arrivedDate: DateTime(2020, 6, 1),
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'),
|
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'),
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A202",
|
shipmentNumber: "A202",
|
||||||
receiverNumber: "2",
|
receiverNumber: "2",
|
||||||
|
receiverName: "Ma Aye",
|
||||||
boxNumber: "2",
|
boxNumber: "2",
|
||||||
rate: 7,
|
rate: 7,
|
||||||
packageType: "General",
|
packageType: "General",
|
||||||
|
cargoDesc: "Handbags",
|
||||||
weight: 55,
|
weight: 55,
|
||||||
status: "Ready to ship",
|
status: "Ready to ship",
|
||||||
arrivedDate: DateTime(2020, 6, 1),
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'),
|
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'),
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A201",
|
shipmentNumber: "A201",
|
||||||
receiverNumber: "1",
|
receiverNumber: "1",
|
||||||
|
receiverName: "Ko Wai",
|
||||||
boxNumber: "1",
|
boxNumber: "1",
|
||||||
rate: 9,
|
rate: 9,
|
||||||
packageType: "Dangerous",
|
packageType: "Dangerous",
|
||||||
|
cargoDesc: "Phones and Scooters",
|
||||||
weight: 25,
|
weight: 25,
|
||||||
status: "Delivered",
|
status: "Delivered",
|
||||||
arrivedDate: DateTime(2020, 5, 21),
|
arrivedDate: DateTime(2020, 5, 21),
|
||||||
|
statusHistory: statusHistory,
|
||||||
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'),
|
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'),
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A201",
|
shipmentNumber: "A201",
|
||||||
receiverNumber: "1",
|
receiverNumber: "1",
|
||||||
|
receiverName: "Ko Wai",
|
||||||
boxNumber: "2",
|
boxNumber: "2",
|
||||||
rate: 7,
|
rate: 7,
|
||||||
packageType: "General",
|
packageType: "General",
|
||||||
|
cargoDesc: "Construction tools",
|
||||||
weight: 5,
|
weight: 5,
|
||||||
status: "Delivered",
|
status: "Delivered",
|
||||||
arrivedDate: DateTime(2020, 5, 21),
|
arrivedDate: DateTime(2020, 5, 21),
|
||||||
|
statusHistory: statusHistory,
|
||||||
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'),
|
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'),
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -94,7 +119,7 @@ class PackageModel extends BaseModel {
|
|||||||
List<Package> get upcoming {
|
List<Package> get upcoming {
|
||||||
return packages
|
return packages
|
||||||
.where((e) =>
|
.where((e) =>
|
||||||
e.status == "Processing" ||
|
e.status == "Processed" ||
|
||||||
e.status == "Received" ||
|
e.status == "Received" ||
|
||||||
e.status == "Ready to ship")
|
e.status == "Ready to ship")
|
||||||
.toList()
|
.toList()
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ class _CustomerListState extends State<CustomerList> {
|
|||||||
padding: new EdgeInsets.symmetric(
|
padding: new EdgeInsets.symmetric(
|
||||||
horizontal: 32.0 - dotSize / 2),
|
horizontal: 32.0 - dotSize / 2),
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Feather.users,
|
Feather.user,
|
||||||
color: primaryColor,
|
color: primaryColor,
|
||||||
size: 40,
|
size: 40,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -103,13 +103,16 @@ class _HomePageState extends State<HomePage> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
login = Provider.of<MainModel>(context).isLogin();
|
login = Provider.of<MainModel>(context).isLogin();
|
||||||
|
var owner = Provider.of<MainModel>(context).isOwner();
|
||||||
|
var customer = Provider.of<MainModel>(context).isCustomer();
|
||||||
|
|
||||||
final packagesBtn = _buildBtn2("package.name",
|
final packagesBtn = _buildBtn2("package.name",
|
||||||
icon: Octicons.package,
|
icon: Octicons.package,
|
||||||
btnCallback: () =>
|
btnCallback: () =>
|
||||||
Navigator.of(context).push(BottomUpPageRoute(PackageList())));
|
Navigator.of(context).push(BottomUpPageRoute(PackageList())));
|
||||||
|
|
||||||
final pickUpBtn = _buildBtn2("pickup",
|
final pickUpBtn = _buildBtn2("pickup",
|
||||||
icon: MaterialCommunityIcons.directions,
|
icon: SimpleLineIcons.direction,
|
||||||
btnCallback: () =>
|
btnCallback: () =>
|
||||||
Navigator.of(context).push(BottomUpPageRoute(PickUpList())));
|
Navigator.of(context).push(BottomUpPageRoute(PickUpList())));
|
||||||
|
|
||||||
@@ -118,7 +121,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
btnCallback: () =>
|
btnCallback: () =>
|
||||||
Navigator.of(context).push(BottomUpPageRoute(ShipmentRates())));
|
Navigator.of(context).push(BottomUpPageRoute(ShipmentRates())));
|
||||||
|
|
||||||
final fcsProfileBtn = _buildBtn2("profile.title",
|
final fcsProfileBtn = _buildBtn2("fcs.btn",
|
||||||
// imgIcon: Image.asset("assets/logo_btn.png", height: 25,color:Colors.white),
|
// imgIcon: Image.asset("assets/logo_btn.png", height: 25,color:Colors.white),
|
||||||
icon: MaterialCommunityIcons.home_city,
|
icon: MaterialCommunityIcons.home_city,
|
||||||
btnCallback: () =>
|
btnCallback: () =>
|
||||||
@@ -171,16 +174,16 @@ class _HomePageState extends State<HomePage> {
|
|||||||
Navigator.of(context).push(BottomUpPageRoute(Term())));
|
Navigator.of(context).push(BottomUpPageRoute(Term())));
|
||||||
|
|
||||||
List<Widget> widgets = [];
|
List<Widget> widgets = [];
|
||||||
widgets.add(buyingBtn);
|
customer ? widgets.add(buyingBtn) : "";
|
||||||
widgets.add(pickUpBtn);
|
customer || owner ? widgets.add(pickUpBtn) : "";
|
||||||
widgets.add(shipmentBtn);
|
owner ? widgets.add(shipmentBtn) : "";
|
||||||
widgets.add(notiBtn);
|
customer || owner ? widgets.add(notiBtn) : "";
|
||||||
widgets.add(staffBtn);
|
owner ? widgets.add(staffBtn) : "";
|
||||||
widgets.add(fcsProfileBtn);
|
owner ? widgets.add(fcsProfileBtn) : "";
|
||||||
widgets.add(shipmentCostBtn);
|
widgets.add(shipmentCostBtn);
|
||||||
widgets.add(packagesBtn);
|
customer || owner ? widgets.add(packagesBtn) : "";
|
||||||
widgets.add(customersBtn);
|
owner ? widgets.add(customersBtn) : "";
|
||||||
widgets.add(invoicesBtn);
|
customer || owner ? widgets.add(invoicesBtn) : "";
|
||||||
widgets.add(termBtn);
|
widgets.add(termBtn);
|
||||||
|
|
||||||
return OfflineRedirect(
|
return OfflineRedirect(
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import 'package:fcs/widget/multi_img_file.dart';
|
|||||||
import 'package:fcs/widget/my_data_table.dart';
|
import 'package:fcs/widget/my_data_table.dart';
|
||||||
import 'package:fcs/widget/progress.dart';
|
import 'package:fcs/widget/progress.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_icons/flutter_icons.dart';
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
@@ -48,7 +49,7 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
_dateController.text = dateFormatter.format(_invoice.invoiceDate);
|
_dateController.text = dateFormatter.format(_invoice.invoiceDate);
|
||||||
_nameController.text = _invoice.customerName;
|
_nameController.text = _invoice.customerName;
|
||||||
_phoneController.text = _invoice.customerPhoneNumber;
|
_phoneController.text = _invoice.customerPhoneNumber;
|
||||||
_amountController.text = _invoice.amount.toString();
|
_amountController.text = _invoice.getAmount.toString();
|
||||||
_statusController.text = _invoice.status.toString();
|
_statusController.text = _invoice.status.toString();
|
||||||
_packages = _invoice.packages;
|
_packages = _invoice.packages;
|
||||||
} else {
|
} else {
|
||||||
@@ -123,8 +124,8 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
enabledBorder: InputBorder.none,
|
enabledBorder: InputBorder.none,
|
||||||
focusedBorder: InputBorder.none,
|
focusedBorder: InputBorder.none,
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.pages,
|
FontAwesomeIcons.fileInvoice,
|
||||||
color: Colors.grey,
|
color: primaryColor,
|
||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
@@ -132,7 +133,7 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
? Container(
|
? Container(
|
||||||
padding: EdgeInsets.only(top: 5),
|
padding: EdgeInsets.only(top: 5),
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
initialValue: "U Nyi",
|
initialValue: "Ko Myo Min",
|
||||||
cursorColor: primaryColor,
|
cursorColor: primaryColor,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
@@ -144,8 +145,8 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: Colors.grey, width: 1.0)),
|
color: Colors.grey, width: 1.0)),
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.account_box,
|
FontAwesomeIcons.fileInvoice,
|
||||||
color: Colors.grey,
|
color: primaryColor,
|
||||||
),
|
),
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
@@ -167,34 +168,34 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Customer Name',
|
labelText: 'Customer Name',
|
||||||
labelStyle:
|
labelStyle:
|
||||||
TextStyle(fontSize: 16, color: Colors.grey),
|
TextStyle(fontSize: 16, color: primaryColor),
|
||||||
filled: true,
|
filled: true,
|
||||||
enabledBorder: InputBorder.none,
|
enabledBorder: InputBorder.none,
|
||||||
focusedBorder: InputBorder.none,
|
focusedBorder: InputBorder.none,
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.account_box,
|
Feather.user,
|
||||||
color: Colors.grey,
|
color: primaryColor,
|
||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
widget.invoice == null
|
// widget.invoice == null
|
||||||
? Container()
|
// ? Container()
|
||||||
: TextFormField(
|
// : TextFormField(
|
||||||
controller: _phoneController,
|
// controller: _phoneController,
|
||||||
readOnly: true,
|
// readOnly: true,
|
||||||
decoration: InputDecoration(
|
// decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
// fillColor: Colors.white,
|
||||||
labelText: 'Customer Phone Number',
|
// labelText: 'Customer Phone Number',
|
||||||
labelStyle:
|
// labelStyle:
|
||||||
TextStyle(fontSize: 16, color: Colors.grey),
|
// TextStyle(fontSize: 16, color: Colors.grey),
|
||||||
filled: true,
|
// filled: true,
|
||||||
enabledBorder: InputBorder.none,
|
// enabledBorder: InputBorder.none,
|
||||||
focusedBorder: InputBorder.none,
|
// focusedBorder: InputBorder.none,
|
||||||
icon: Icon(
|
// icon: Icon(
|
||||||
Icons.phone,
|
// Icons.phone,
|
||||||
color: Colors.grey,
|
// color: Colors.grey,
|
||||||
),
|
// ),
|
||||||
)),
|
// )),
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.only(top: 0),
|
padding: EdgeInsets.only(top: 0),
|
||||||
child: fcsInput('Amount', FontAwesomeIcons.moneyBill,
|
child: fcsInput('Amount', FontAwesomeIcons.moneyBill,
|
||||||
@@ -215,12 +216,7 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Status',
|
labelText: 'Status',
|
||||||
filled: true,
|
filled: true,
|
||||||
icon: Image.asset(
|
icon: Icon(Icons.av_timer,color: primaryColor,),
|
||||||
'assets/status.png',
|
|
||||||
width: 24,
|
|
||||||
height: 24,
|
|
||||||
color: Colors.grey[700],
|
|
||||||
),
|
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ class MessageDetail extends StatelessWidget {
|
|||||||
message: e.message,
|
message: e.message,
|
||||||
time: dateFormat.format(e.date),
|
time: dateFormat.format(e.date),
|
||||||
delivered: true,
|
delivered: true,
|
||||||
isMe: e.isMe != null ? e.isMe : true))
|
isMe: !(e.isMe != null ? e.isMe : true)))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
|||||||
@@ -45,11 +45,13 @@ class _PickUpEditorState extends State<PickUpEditor> {
|
|||||||
PickUp _pickUp;
|
PickUp _pickUp;
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
var now = new DateTime.now();
|
var now = new DateTime.now();
|
||||||
|
bool isNew;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
if (widget.pickUp != null) {
|
if (widget.pickUp != null) {
|
||||||
|
isNew = false;
|
||||||
_pickUp = widget.pickUp;
|
_pickUp = widget.pickUp;
|
||||||
_addressEditingController.text = _pickUp.address;
|
_addressEditingController.text = _pickUp.address;
|
||||||
_fromTimeEditingController.text = _pickUp.fromTime;
|
_fromTimeEditingController.text = _pickUp.fromTime;
|
||||||
@@ -63,6 +65,8 @@ class _PickUpEditorState extends State<PickUpEditor> {
|
|||||||
_recipientPhoneEditingController.text = mainModel.recipient.phoneNumber;
|
_recipientPhoneEditingController.text = mainModel.recipient.phoneNumber;
|
||||||
_recipientAddressEditingController.text =
|
_recipientAddressEditingController.text =
|
||||||
mainModel.recipient.shippingAddress;
|
mainModel.recipient.shippingAddress;
|
||||||
|
} else {
|
||||||
|
isNew = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,7 +194,7 @@ class _PickUpEditorState extends State<PickUpEditor> {
|
|||||||
EdgeInsets.symmetric(vertical: 10.0, horizontal: 0.0),
|
EdgeInsets.symmetric(vertical: 10.0, horizontal: 0.0),
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.date_range,
|
Icons.date_range,
|
||||||
color: Colors.grey,
|
color: primaryColor,
|
||||||
)),
|
)),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value.isEmpty) {
|
if (value.isEmpty) {
|
||||||
@@ -224,18 +228,20 @@ class _PickUpEditorState extends State<PickUpEditor> {
|
|||||||
child: ListView(children: <Widget>[
|
child: ListView(children: <Widget>[
|
||||||
Center(child: nameWidget(mainModel.customer.name)),
|
Center(child: nameWidget(mainModel.customer.name)),
|
||||||
Center(child: nameWidget(mainModel.customer.phoneNumber)),
|
Center(child: nameWidget(mainModel.customer.phoneNumber)),
|
||||||
Center(
|
isNew
|
||||||
child: Padding(
|
? Container()
|
||||||
padding: const EdgeInsets.only(left: 10.0, top: 8),
|
: Center(
|
||||||
child: Text(
|
child: Padding(
|
||||||
'#P200304',
|
padding: const EdgeInsets.only(left: 10.0, top: 8),
|
||||||
style: TextStyle(
|
child: Text(
|
||||||
color: Colors.black87,
|
'#P200304',
|
||||||
fontSize: 14,
|
style: TextStyle(
|
||||||
fontWeight: FontWeight.bold),
|
color: Colors.black87,
|
||||||
),
|
fontSize: 14,
|
||||||
),
|
fontWeight: FontWeight.bold),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
ExpansionTile(
|
ExpansionTile(
|
||||||
title: Text('Pickup Location / Time'),
|
title: Text('Pickup Location / Time'),
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ class _PickupListRowState extends State<PickupListRow> {
|
|||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.all(5.0),
|
padding: EdgeInsets.all(5.0),
|
||||||
child: Icon(
|
child: Icon(
|
||||||
MaterialCommunityIcons.directions,
|
SimpleLineIcons.direction,
|
||||||
color: primaryColor,
|
color: primaryColor,
|
||||||
)),
|
)),
|
||||||
new Expanded(
|
new Expanded(
|
||||||
|
|||||||
@@ -254,27 +254,6 @@ class _ProfileState extends State<Profile> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
Future<String> getVersionNumber() async {
|
|
||||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
|
||||||
String version = packageInfo.version + "+" + packageInfo.buildNumber;
|
|
||||||
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
final versionbox = Container(
|
|
||||||
padding: EdgeInsets.only(top: 15),
|
|
||||||
child: Container(
|
|
||||||
child: Center(
|
|
||||||
child: FutureBuilder(
|
|
||||||
future: getVersionNumber(),
|
|
||||||
builder: (BuildContext context, AsyncSnapshot<String> snapshot) =>
|
|
||||||
Text(
|
|
||||||
snapshot.hasData ? "v${snapshot.data}" : "Loading ...",
|
|
||||||
style: TextStyle(fontSize: 16.0, fontStyle: FontStyle.normal),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
));
|
|
||||||
|
|
||||||
return LocalProgress(
|
return LocalProgress(
|
||||||
inAsyncCall: _isLoading,
|
inAsyncCall: _isLoading,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
|
|||||||
@@ -266,7 +266,7 @@ class _ShipmentEditorState extends State<ShipmentEditor> {
|
|||||||
child: ListView(children: <Widget>[
|
child: ListView(children: <Widget>[
|
||||||
// _showCustomerData(mainModel.customer),
|
// _showCustomerData(mainModel.customer),
|
||||||
widget.shipment == null
|
widget.shipment == null
|
||||||
? fcsInput('Shipment Number', Icons.text_rotation_none,
|
? fcsInput('Shipment Number', Ionicons.ios_airplane,
|
||||||
controller: _shipmentNumberController)
|
controller: _shipmentNumberController)
|
||||||
: Container(
|
: Container(
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
@@ -281,8 +281,8 @@ class _ShipmentEditorState extends State<ShipmentEditor> {
|
|||||||
enabledBorder: InputBorder.none,
|
enabledBorder: InputBorder.none,
|
||||||
focusedBorder: InputBorder.none,
|
focusedBorder: InputBorder.none,
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.text_rotation_none,
|
Ionicons.ios_airplane,
|
||||||
color: Colors.grey,
|
color: primaryColor,
|
||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
@@ -293,26 +293,6 @@ class _ShipmentEditorState extends State<ShipmentEditor> {
|
|||||||
controller: _cutoffDateController),
|
controller: _cutoffDateController),
|
||||||
)
|
)
|
||||||
: Container(),
|
: Container(),
|
||||||
widget.shipment == null
|
|
||||||
? Container(
|
|
||||||
padding: EdgeInsets.only(top: 5),
|
|
||||||
child: DropdownButtonFormField(
|
|
||||||
decoration: InputDecoration(
|
|
||||||
fillColor: Colors.white,
|
|
||||||
labelText: 'Shipment Type',
|
|
||||||
icon: Icon(Icons.pages)),
|
|
||||||
items: shipmentModel.shipmentType
|
|
||||||
.map((e) =>
|
|
||||||
DropdownMenuItem(child: Text(e), value: e))
|
|
||||||
.toList(),
|
|
||||||
onChanged: (selected) => {
|
|
||||||
setState(() {
|
|
||||||
_currentShipment = selected;
|
|
||||||
})
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: Container(),
|
|
||||||
Container(
|
Container(
|
||||||
padding:
|
padding:
|
||||||
EdgeInsets.only(top: widget.shipment == null ? 5 : 0),
|
EdgeInsets.only(top: widget.shipment == null ? 5 : 0),
|
||||||
@@ -324,6 +304,28 @@ class _ShipmentEditorState extends State<ShipmentEditor> {
|
|||||||
child: fcsInput('Departure Date', Icons.date_range,
|
child: fcsInput('Departure Date', Icons.date_range,
|
||||||
controller: _departureDateControler),
|
controller: _departureDateControler),
|
||||||
),
|
),
|
||||||
|
widget.shipment == null
|
||||||
|
? Container(
|
||||||
|
padding: EdgeInsets.only(top: 5),
|
||||||
|
child: DropdownButtonFormField(
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Shipment Type',
|
||||||
|
icon: Icon(Ionicons.ios_airplane,
|
||||||
|
color: primaryColor)),
|
||||||
|
items: shipmentModel.shipmentType
|
||||||
|
.map((e) =>
|
||||||
|
DropdownMenuItem(child: Text(e), value: e))
|
||||||
|
.toList(),
|
||||||
|
onChanged: (selected) => {
|
||||||
|
setState(() {
|
||||||
|
_currentShipment = selected;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
|
||||||
widget.shipment == null
|
widget.shipment == null
|
||||||
? Container(
|
? Container(
|
||||||
padding: EdgeInsets.only(top: 5),
|
padding: EdgeInsets.only(top: 5),
|
||||||
@@ -355,21 +357,16 @@ class _ShipmentEditorState extends State<ShipmentEditor> {
|
|||||||
controller: _statusController,
|
controller: _statusController,
|
||||||
cursorColor: primaryColor,
|
cursorColor: primaryColor,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Status',
|
labelText: 'Status',
|
||||||
filled: true,
|
filled: true,
|
||||||
labelStyle:
|
labelStyle: TextStyle(
|
||||||
TextStyle(fontSize: 16, color: Colors.grey),
|
fontSize: 16, color: Colors.grey),
|
||||||
focusedBorder: UnderlineInputBorder(
|
focusedBorder: UnderlineInputBorder(
|
||||||
borderSide: BorderSide(
|
borderSide: BorderSide(
|
||||||
color: Colors.grey, width: 1.0)),
|
color: Colors.grey, width: 1.0)),
|
||||||
icon: Image.asset(
|
icon: Icon(Icons.av_timer,
|
||||||
'assets/status.png',
|
color: primaryColor))),
|
||||||
width: 24,
|
|
||||||
height: 24,
|
|
||||||
color: Colors.grey[700],
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
),
|
||||||
widget.shipment == null
|
widget.shipment == null
|
||||||
? Container()
|
? Container()
|
||||||
|
|||||||
@@ -381,7 +381,7 @@ Widget nameWidget(String name) {
|
|||||||
child: Text(
|
child: Text(
|
||||||
name,
|
name,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.black87, fontSize: 18, fontWeight: FontWeight.bold),
|
color: Colors.black87, fontSize: 18, fontWeight: FontWeight.bold),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -417,7 +417,7 @@ Widget fcsInput(String label, IconData iconData,
|
|||||||
filled: true,
|
filled: true,
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
iconData,
|
iconData,
|
||||||
color: Colors.grey,
|
color: primaryColor,
|
||||||
),
|
),
|
||||||
focusedBorder: UnderlineInputBorder(
|
focusedBorder: UnderlineInputBorder(
|
||||||
borderSide: BorderSide(color: Colors.grey, width: 1.0)),
|
borderSide: BorderSide(color: Colors.grey, width: 1.0)),
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import 'package:fcs/model/main_model.dart';
|
|
||||||
import 'package:fcs/model/pickup_model.dart';
|
|
||||||
import 'package:fcs/pages/util.dart';
|
import 'package:fcs/pages/util.dart';
|
||||||
import 'package:fcs/vo/package.dart';
|
import 'package:fcs/vo/package.dart';
|
||||||
import 'package:fcs/widget/localization/app_translations.dart';
|
import 'package:fcs/widget/localization/app_translations.dart';
|
||||||
import 'package:fcs/widget/progress.dart';
|
import 'package:fcs/widget/progress.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_icons/flutter_icons.dart';
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:timeline_list/timeline.dart';
|
||||||
|
import 'package:timeline_list/timeline_model.dart';
|
||||||
|
|
||||||
import '../theme/theme.dart';
|
import '../theme/theme.dart';
|
||||||
|
|
||||||
@@ -29,18 +30,26 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
|
|
||||||
Package _package;
|
Package _package;
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
|
List<String> _images = [
|
||||||
|
"assets/photos/1.jpg",
|
||||||
|
"assets/photos/2.jpg",
|
||||||
|
"assets/photos/3.jpg"
|
||||||
|
];
|
||||||
|
bool isNew;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
if (widget.package != null) {
|
if (widget.package != null) {
|
||||||
_package = widget.package;
|
_package = widget.package;
|
||||||
|
isNew = false;
|
||||||
// _addressEditingController.text = _pickUp.address;
|
// _addressEditingController.text = _pickUp.address;
|
||||||
// _fromTimeEditingController.text = _pickUp.fromTime;
|
// _fromTimeEditingController.text = _pickUp.fromTime;
|
||||||
// _toTimeEditingController.text = _pickUp.toTime;
|
// _toTimeEditingController.text = _pickUp.toTime;
|
||||||
// _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString();
|
// _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString();
|
||||||
// _weightEditingController.text = _pickUp.weight.toString();
|
// _weightEditingController.text = _pickUp.weight.toString();
|
||||||
} else {
|
} else {
|
||||||
|
isNew = true;
|
||||||
_package = Package(rate: 0, weight: 0);
|
_package = Package(rate: 0, weight: 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -50,8 +59,48 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final DateFormat dateFormat = DateFormat("d MMM yyyy");
|
||||||
|
List<TimelineModel> _models() {
|
||||||
|
return _package.statusHistory
|
||||||
|
.map((e) => TimelineModel(
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(18.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
var images = isNew ? [] : _images;
|
||||||
return LocalProgress(
|
return LocalProgress(
|
||||||
inAsyncCall: _isLoading,
|
inAsyncCall: _isLoading,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
@@ -67,26 +116,31 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
body: Card(
|
body: Card(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
widget.package == null
|
||||||
|
? Center(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.all(8),
|
||||||
|
child: Text("New Package")))
|
||||||
|
: Center(child: nameWidget(_package.packageNumber)),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ListView(
|
child: ListView(
|
||||||
children: [
|
children: [
|
||||||
widget.package == null
|
|
||||||
? Center(
|
|
||||||
child: Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
child: Text("New Package")))
|
|
||||||
: Center(child: nameWidget(_package.packageNumber)),
|
|
||||||
ExpansionTile(
|
ExpansionTile(
|
||||||
title: Text('Package Information'),
|
title: Text(
|
||||||
|
'Receiving',
|
||||||
|
style: TextStyle(
|
||||||
|
color: primaryColor, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
child: DropdownButtonFormField(
|
child: DropdownButtonFormField(
|
||||||
value: _package.shipmentNumber,
|
value: _package.shipmentNumber,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Shipment Number',
|
labelText: 'Shipment Number',
|
||||||
icon: Icon(Icons.pages)
|
icon: Icon(Ionicons.ios_airplane,
|
||||||
|
color: primaryColor)
|
||||||
// prefixIcon: Icon(Icons.play_arrow)
|
// prefixIcon: Icon(Icons.play_arrow)
|
||||||
),
|
),
|
||||||
items: ["A102", "A103", "A201", "A202"]
|
items: ["A102", "A103", "A201", "A202"]
|
||||||
@@ -97,92 +151,44 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
initialValue: "FCS383-283-1",
|
initialValue: isNew ? "" : "FCS383-283-1",
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'FCS_ID',
|
labelText: 'FCS_ID',
|
||||||
hintText: 'FCS_ID',
|
hintText: 'FCS_ID',
|
||||||
filled: true,
|
filled: true,
|
||||||
icon: Icon(
|
icon: Icon(Feather.user, color: primaryColor),
|
||||||
Icons.account_box,
|
|
||||||
),
|
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
icon: Icon(Icons.search),
|
icon: Icon(Icons.search),
|
||||||
onPressed: () {})),
|
onPressed: () {})),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
child: DropdownButtonFormField(
|
child: TextFormField(
|
||||||
value: _package.packageType,
|
initialValue: _package.receiverName,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Cargo Type',
|
labelText: 'Customer Name',
|
||||||
icon: Icon(Icons.pages)
|
filled: true,
|
||||||
// prefixIcon: Icon(Icons.play_arrow)
|
icon: Icon(Feather.user, color: Colors.white),
|
||||||
),
|
suffixIcon: IconButton(
|
||||||
items: ["General", "Medicine", "Dangerous"]
|
icon: Icon(Icons.search),
|
||||||
.map((e) =>
|
onPressed: () {})),
|
||||||
DropdownMenuItem(child: Text(e), value: e))
|
|
||||||
.toList(),
|
|
||||||
onChanged: (map) => {},
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
initialValue: _package.weight.toString(),
|
initialValue: isNew ? "" : "P0203",
|
||||||
textAlign: TextAlign.end,
|
|
||||||
decoration: InputDecoration(
|
|
||||||
fillColor: Colors.white,
|
|
||||||
labelText: 'Weight',
|
|
||||||
filled: true,
|
|
||||||
icon: Icon(
|
|
||||||
FontAwesomeIcons.weightHanging,
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
|
||||||
child: TextFormField(
|
|
||||||
initialValue: _package.rate.toString(),
|
|
||||||
textAlign: TextAlign.end,
|
|
||||||
decoration: InputDecoration(
|
|
||||||
fillColor: Colors.white,
|
|
||||||
labelText: 'Rate',
|
|
||||||
filled: true,
|
|
||||||
icon: Icon(
|
|
||||||
FontAwesomeIcons.tag,
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
|
||||||
child: TextFormField(
|
|
||||||
initialValue: _package.amount.toString(),
|
|
||||||
textAlign: TextAlign.end,
|
|
||||||
decoration: InputDecoration(
|
|
||||||
fillColor: Colors.white,
|
|
||||||
labelText: 'Amount',
|
|
||||||
filled: true,
|
|
||||||
icon: Icon(
|
|
||||||
FontAwesomeIcons.moneyBill,
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
|
||||||
child: TextFormField(
|
|
||||||
initialValue: "P0203",
|
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Pickup ID',
|
labelText: 'Pickup ID',
|
||||||
filled: true,
|
filled: true,
|
||||||
icon: Icon(
|
icon: Icon(MaterialCommunityIcons.directions,
|
||||||
Icons.account_box,
|
color: primaryColor),
|
||||||
),
|
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
icon: Icon(Icons.search),
|
icon: Icon(Icons.search),
|
||||||
onPressed: () {})),
|
onPressed: () {})),
|
||||||
@@ -191,35 +197,152 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
ExpansionTile(
|
ExpansionTile(
|
||||||
title: Text('Photos'),
|
title: Text(
|
||||||
|
'Processing',
|
||||||
|
style: TextStyle(
|
||||||
|
color: primaryColor, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: DropdownButtonFormField(
|
||||||
|
value: _package.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:
|
||||||
|
isNew ? "" : _package.cargoDesc.toString(),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Description',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(MaterialIcons.description,
|
||||||
|
color: primaryColor),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: _package.weight.toString(),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Weight',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(FontAwesomeIcons.weightHanging,
|
||||||
|
color: primaryColor),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: _package.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: _package.amount.toString(),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Amount',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(FontAwesomeIcons.moneyBill,
|
||||||
|
color: primaryColor),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ExpansionTile(
|
||||||
|
title: Text(
|
||||||
|
'Photos',
|
||||||
|
style: TextStyle(
|
||||||
|
color: primaryColor, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Container(
|
Container(
|
||||||
height: 130,
|
height: 130,
|
||||||
width: 500,
|
width: 500,
|
||||||
child: ListView(
|
child: ListView.separated(
|
||||||
// scrollDirection: Axis.horizontal,
|
separatorBuilder: (context, index) => Divider(
|
||||||
children: <Widget>[
|
color: Colors.black,
|
||||||
Padding(
|
),
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
itemCount: images.length + 1,
|
||||||
child: DropdownButtonFormField(
|
scrollDirection: Axis.horizontal,
|
||||||
value: _package.shipmentNumber,
|
itemBuilder: (context, index) {
|
||||||
decoration: InputDecoration(
|
if (index == images.length) {
|
||||||
fillColor: Colors.white,
|
return Padding(
|
||||||
labelText: 'Shipment Number',
|
padding: const EdgeInsets.all(8.0),
|
||||||
icon: Icon(Icons.pages)
|
child: Container(
|
||||||
// prefixIcon: Icon(Icons.play_arrow)
|
width: 200,
|
||||||
|
height: 70,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(
|
||||||
|
color: primaryColor,
|
||||||
|
width: 2.0,
|
||||||
),
|
),
|
||||||
items: ["A102", "A103", "A201", "A202"]
|
),
|
||||||
.map((e) => DropdownMenuItem(
|
child: Icon(SimpleLineIcons.plus),
|
||||||
child: Text(e), value: e))
|
),
|
||||||
.toList(),
|
);
|
||||||
onChanged: (map) => {},
|
} else {
|
||||||
),
|
return Padding(
|
||||||
),
|
padding: const EdgeInsets.all(8.0),
|
||||||
],
|
child: Container(
|
||||||
|
width: 200,
|
||||||
|
height: 70,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(
|
||||||
|
color: primaryColor,
|
||||||
|
width: 2.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Image.asset(images[index],
|
||||||
|
width: 50, height: 50),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
|
ExpansionTile(
|
||||||
|
title: Text(
|
||||||
|
'Status',
|
||||||
|
style: TextStyle(
|
||||||
|
color: primaryColor, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
children: <Widget>[
|
||||||
|
Container(
|
||||||
|
height: 500,
|
||||||
|
padding: EdgeInsets.only(left: 20),
|
||||||
|
child: isNew
|
||||||
|
? Container()
|
||||||
|
: Timeline(
|
||||||
|
children: _models(),
|
||||||
|
position: TimelinePosition.Left),
|
||||||
|
),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -231,7 +354,7 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
width: 250,
|
width: 250,
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
child: Text('Create package'),
|
child: Text('Complete receiving'),
|
||||||
color: primaryColor,
|
color: primaryColor,
|
||||||
textColor: Colors.white,
|
textColor: Colors.white,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
@@ -248,7 +371,7 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
width: 250,
|
width: 250,
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
child: Text('Save package'),
|
child: Text('Complete processing'),
|
||||||
color: primaryColor,
|
color: primaryColor,
|
||||||
textColor: Colors.white,
|
textColor: Colors.white,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
|
|||||||
@@ -21,4 +21,6 @@ class Invoice {
|
|||||||
this.status,
|
this.status,
|
||||||
this.paymentAttachment,
|
this.paymentAttachment,
|
||||||
this.packages});
|
this.packages});
|
||||||
|
|
||||||
|
double get getAmount => packages.fold(0, (p, e) => (e.rate * e.weight) + p);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
|
class Status {
|
||||||
|
String status;
|
||||||
|
DateTime date;
|
||||||
|
bool done;
|
||||||
|
Status({this.status, this.date, this.done});
|
||||||
|
}
|
||||||
|
|
||||||
class Package {
|
class Package {
|
||||||
String id;
|
String id;
|
||||||
String shipmentNumber;
|
String shipmentNumber;
|
||||||
@@ -9,6 +16,7 @@ class Package {
|
|||||||
String receiverNumber;
|
String receiverNumber;
|
||||||
String boxNumber;
|
String boxNumber;
|
||||||
String status;
|
String status;
|
||||||
|
String cargoDesc;
|
||||||
|
|
||||||
int rate;
|
int rate;
|
||||||
int weight;
|
int weight;
|
||||||
@@ -24,6 +32,8 @@ class Package {
|
|||||||
shipmentNumber + "-" + receiverNumber + " #" + boxNumber;
|
shipmentNumber + "-" + receiverNumber + " #" + boxNumber;
|
||||||
double get price => rate.toDouble() * weight;
|
double get price => rate.toDouble() * weight;
|
||||||
|
|
||||||
|
List<Status> statusHistory;
|
||||||
|
|
||||||
Package(
|
Package(
|
||||||
{this.id,
|
{this.id,
|
||||||
this.shipmentNumber,
|
this.shipmentNumber,
|
||||||
@@ -40,5 +50,7 @@ class Package {
|
|||||||
this.pickUpID,
|
this.pickUpID,
|
||||||
this.remark,
|
this.remark,
|
||||||
this.status,
|
this.status,
|
||||||
this.arrivedDate});
|
this.arrivedDate,
|
||||||
|
this.cargoDesc,
|
||||||
|
this.statusHistory});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -693,6 +693,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.15"
|
version: "0.2.15"
|
||||||
|
timeline_list:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: timeline_list
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.5"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -66,6 +66,9 @@ dependencies:
|
|||||||
pin_input_text_field:
|
pin_input_text_field:
|
||||||
flutter_icons: ^1.1.0
|
flutter_icons: ^1.1.0
|
||||||
country_icons: ^1.1.1
|
country_icons: ^1.1.1
|
||||||
|
timeline_list: ^0.0.5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
@@ -76,6 +79,7 @@ flutter:
|
|||||||
assets:
|
assets:
|
||||||
- assets/
|
- assets/
|
||||||
- assets/local/
|
- assets/local/
|
||||||
|
- assets/photos/
|
||||||
|
|
||||||
|
|
||||||
fonts:
|
fonts:
|
||||||
|
|||||||
Reference in New Issue
Block a user