v3
This commit is contained in:
@@ -513,14 +513,23 @@
|
|||||||
|
|
||||||
"rate.edit.title":"EDIT RATES",
|
"rate.edit.title":"EDIT RATES",
|
||||||
|
|
||||||
"rate.cal.title":"CALCULATE RATES",
|
"rate.cal.title":"ESTIMATE SHIPPING COST",
|
||||||
|
|
||||||
|
"boxes.name":"Boxes",
|
||||||
|
"boxes.title":"BOXES",
|
||||||
|
"boxes.new":"New Box",
|
||||||
|
"box.edit.title":"BOX",
|
||||||
|
"box.package.id":"Package ID",
|
||||||
|
"box.package.desc":"Description",
|
||||||
|
"box.package.market":"Market",
|
||||||
|
"box.add_package":"Add Package",
|
||||||
|
|
||||||
"package.name":"Packages",
|
"package.name":"Packages",
|
||||||
"package.title":"PACKAGES",
|
"package.title":"PACKAGES",
|
||||||
"package.new":"New Package",
|
"package.new":"New Package",
|
||||||
"package.edit.title":"PACKAGE",
|
"package.edit.title":"PACKAGE",
|
||||||
"package.arrival.date":"Arrival Date",
|
"package.arrival.date":"Arrival Date",
|
||||||
"package.number":"Package Number",
|
"package.number":"Box Number",
|
||||||
"package.rate":"Rate",
|
"package.rate":"Rate",
|
||||||
"package.weight":"Weight",
|
"package.weight":"Weight",
|
||||||
"package.amount":"Amount",
|
"package.amount":"Amount",
|
||||||
@@ -542,7 +551,7 @@
|
|||||||
"invoices.add":"New Invoice",
|
"invoices.add":"New Invoice",
|
||||||
"invoice.form.title":"INVOICE",
|
"invoice.form.title":"INVOICE",
|
||||||
"invoice.payment":"Payment Receipt",
|
"invoice.payment":"Payment Receipt",
|
||||||
"invoice.add_package":"Add Package",
|
"invoice.add_box":"Add Box",
|
||||||
|
|
||||||
"term":"TERMS",
|
"term":"TERMS",
|
||||||
"term.btn":"Terms",
|
"term.btn":"Terms",
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import 'model/product_model.dart';
|
|||||||
import 'model/report_user_model.dart';
|
import 'model/report_user_model.dart';
|
||||||
import 'model/shipment_rate_model.dart';
|
import 'model/shipment_rate_model.dart';
|
||||||
import 'model/user_model.dart';
|
import 'model/user_model.dart';
|
||||||
|
import 'model_fcs/box_model.dart';
|
||||||
import 'pages/home_page.dart';
|
import 'pages/home_page.dart';
|
||||||
import 'pages/splash.dart';
|
import 'pages/splash.dart';
|
||||||
import 'pages/term.dart';
|
import 'pages/term.dart';
|
||||||
@@ -71,6 +72,7 @@ class _AppState extends State<App> {
|
|||||||
final ShipmentRateModel shipmentRateModel = new ShipmentRateModel();
|
final ShipmentRateModel shipmentRateModel = new ShipmentRateModel();
|
||||||
final ShipmentModel shipmentModel = new ShipmentModel();
|
final ShipmentModel shipmentModel = new ShipmentModel();
|
||||||
final PackageModel packageModel=new PackageModel();
|
final PackageModel packageModel=new PackageModel();
|
||||||
|
final BoxModel boxModel=new BoxModel();
|
||||||
final MessageModel messageModel=new MessageModel();
|
final MessageModel messageModel=new MessageModel();
|
||||||
final InvoiceModel invoiceModel = new InvoiceModel();
|
final InvoiceModel invoiceModel = new InvoiceModel();
|
||||||
final CustomerModel customerModel = new CustomerModel();
|
final CustomerModel customerModel = new CustomerModel();
|
||||||
@@ -108,6 +110,7 @@ class _AppState extends State<App> {
|
|||||||
..addModel(shipmentRateModel)
|
..addModel(shipmentRateModel)
|
||||||
..addModel(shipmentModel)
|
..addModel(shipmentModel)
|
||||||
..addModel(packageModel)
|
..addModel(packageModel)
|
||||||
|
..addModel(boxModel)
|
||||||
..addModel(messageModel)
|
..addModel(messageModel)
|
||||||
..addModel(shipmentRateModel)
|
..addModel(shipmentRateModel)
|
||||||
..addModel(invoiceModel)
|
..addModel(invoiceModel)
|
||||||
@@ -164,6 +167,7 @@ class _AppState extends State<App> {
|
|||||||
ChangeNotifierProvider(builder: (context) => shipmentRateModel),
|
ChangeNotifierProvider(builder: (context) => shipmentRateModel),
|
||||||
ChangeNotifierProvider(builder: (context) => shipmentModel),
|
ChangeNotifierProvider(builder: (context) => shipmentModel),
|
||||||
ChangeNotifierProvider(builder: (context) => packageModel),
|
ChangeNotifierProvider(builder: (context) => packageModel),
|
||||||
|
ChangeNotifierProvider(builder: (context) => boxModel),
|
||||||
ChangeNotifierProvider(builder: (context) => messageModel),
|
ChangeNotifierProvider(builder: (context) => messageModel),
|
||||||
ChangeNotifierProvider(builder: (context) => invoiceModel),
|
ChangeNotifierProvider(builder: (context) => invoiceModel),
|
||||||
ChangeNotifierProvider(builder: (context) => customerModel),
|
ChangeNotifierProvider(builder: (context) => customerModel),
|
||||||
|
|||||||
153
lib/model_fcs/box_model.dart
Normal file
153
lib/model_fcs/box_model.dart
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
|
import 'package:fcs/model/base_model.dart';
|
||||||
|
import 'package:fcs/model_fcs/package_model.dart';
|
||||||
|
import 'package:fcs/vo/box.dart';
|
||||||
|
import 'package:fcs/vo/package.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
|
class BoxModel extends BaseModel {
|
||||||
|
final log = Logger('BoxModel');
|
||||||
|
|
||||||
|
StreamSubscription<QuerySnapshot> listener;
|
||||||
|
static List<Status> statusHistory = [
|
||||||
|
Status(status: "Packed", 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)
|
||||||
|
];
|
||||||
|
static List<Package> packages = [
|
||||||
|
PackageModel.packages[0],
|
||||||
|
PackageModel.packages[1],
|
||||||
|
PackageModel.packages[2]
|
||||||
|
];
|
||||||
|
List<Box> boxes = [
|
||||||
|
Box(
|
||||||
|
shipmentNumber: "A202",
|
||||||
|
receiverNumber: "3",
|
||||||
|
receiverName: "Ko Myo Min",
|
||||||
|
boxNumber: "1",
|
||||||
|
rate: 7,
|
||||||
|
packageType: "General",
|
||||||
|
weight: 25,
|
||||||
|
status: "Packed",
|
||||||
|
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
|
||||||
|
cargoDesc: "Clothes",
|
||||||
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
packages: packages,
|
||||||
|
statusHistory: statusHistory),
|
||||||
|
Box(
|
||||||
|
shipmentNumber: "A202",
|
||||||
|
receiverNumber: "3",
|
||||||
|
receiverName: "Ko Myo Min",
|
||||||
|
boxNumber: "2",
|
||||||
|
rate: 7,
|
||||||
|
packageType: "General",
|
||||||
|
weight: 20,
|
||||||
|
status: "Packed",
|
||||||
|
cargoDesc: "Clothes",
|
||||||
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
|
packages: packages,
|
||||||
|
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'),
|
||||||
|
Box(
|
||||||
|
shipmentNumber: "A202",
|
||||||
|
receiverNumber: "3",
|
||||||
|
receiverName: "Ko Myo Min",
|
||||||
|
boxNumber: "3",
|
||||||
|
rate: 7,
|
||||||
|
packageType: "General",
|
||||||
|
weight: 15,
|
||||||
|
cargoDesc: "Shoes",
|
||||||
|
status: "Packed",
|
||||||
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
|
packages: packages,
|
||||||
|
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'),
|
||||||
|
Box(
|
||||||
|
shipmentNumber: "A202",
|
||||||
|
receiverNumber: "2",
|
||||||
|
receiverName: "Ma Aye",
|
||||||
|
boxNumber: "1",
|
||||||
|
rate: 8,
|
||||||
|
packageType: "Medicine",
|
||||||
|
weight: 15,
|
||||||
|
status: "Packed",
|
||||||
|
cargoDesc: "Dietary supplement",
|
||||||
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
|
packages: packages,
|
||||||
|
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'),
|
||||||
|
Box(
|
||||||
|
shipmentNumber: "A202",
|
||||||
|
receiverNumber: "2",
|
||||||
|
receiverName: "Ma Aye",
|
||||||
|
boxNumber: "2",
|
||||||
|
rate: 7,
|
||||||
|
packageType: "General",
|
||||||
|
cargoDesc: "Handbags",
|
||||||
|
weight: 55,
|
||||||
|
status: "Shipped",
|
||||||
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
|
statusHistory: statusHistory,
|
||||||
|
packages: packages,
|
||||||
|
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'),
|
||||||
|
Box(
|
||||||
|
shipmentNumber: "A201",
|
||||||
|
receiverNumber: "1",
|
||||||
|
receiverName: "Ko Wai",
|
||||||
|
boxNumber: "1",
|
||||||
|
rate: 9,
|
||||||
|
packageType: "Dangerous",
|
||||||
|
cargoDesc: "Phones and Scooters",
|
||||||
|
weight: 25,
|
||||||
|
status: "Delivered",
|
||||||
|
arrivedDate: DateTime(2020, 5, 21),
|
||||||
|
statusHistory: statusHistory,
|
||||||
|
packages: packages,
|
||||||
|
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'),
|
||||||
|
Box(
|
||||||
|
shipmentNumber: "A201",
|
||||||
|
receiverNumber: "1",
|
||||||
|
receiverName: "Ko Wai",
|
||||||
|
boxNumber: "2",
|
||||||
|
rate: 7,
|
||||||
|
packageType: "General",
|
||||||
|
cargoDesc: "Construction tools",
|
||||||
|
weight: 5,
|
||||||
|
status: "Delivered",
|
||||||
|
arrivedDate: DateTime(2020, 5, 21),
|
||||||
|
statusHistory: statusHistory,
|
||||||
|
packages: packages,
|
||||||
|
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'),
|
||||||
|
];
|
||||||
|
|
||||||
|
List<Box> get completed {
|
||||||
|
return boxes.where((e) => e.status == "Delivered").toList()
|
||||||
|
..sort((e1, e2) {
|
||||||
|
return e2.packageNumber.compareTo(e1.packageNumber);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Box> get upcoming {
|
||||||
|
return boxes
|
||||||
|
.where((e) =>
|
||||||
|
e.status == "Packed" ||
|
||||||
|
e.status == "Received" ||
|
||||||
|
e.status == "Shipped")
|
||||||
|
.toList()
|
||||||
|
..sort((e1, e2) {
|
||||||
|
return e2.packageNumber.compareTo(e1.packageNumber);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void initUser(user) {
|
||||||
|
super.initUser(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
logout() async {
|
||||||
|
if (listener != null) await listener.cancel();
|
||||||
|
boxes = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
import 'package:fcs/model/base_model.dart';
|
import 'package:fcs/model/base_model.dart';
|
||||||
|
import 'package:fcs/vo/box.dart';
|
||||||
import 'package:fcs/vo/package.dart';
|
import 'package:fcs/vo/package.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
@@ -15,24 +16,26 @@ class PackageModel extends BaseModel {
|
|||||||
Status(status: "Shipped", date: DateTime(2020, 6, 5), done: false),
|
Status(status: "Shipped", date: DateTime(2020, 6, 5), done: false),
|
||||||
Status(status: "Delivered", date: DateTime(2020, 6, 15), done: false)
|
Status(status: "Delivered", date: DateTime(2020, 6, 15), done: false)
|
||||||
];
|
];
|
||||||
List<Package> packages = [
|
static List<Package> packages = [
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A202",
|
shipmentNumber: "A202",
|
||||||
receiverNumber: "3",
|
receiverNumber: "3",
|
||||||
receiverName: "Ko Oo",
|
receiverName: "Ko Myo Min",
|
||||||
boxNumber: "1",
|
boxNumber: "1",
|
||||||
rate: 7,
|
rate: 7,
|
||||||
packageType: "General",
|
packageType: "General",
|
||||||
weight: 25,
|
weight: 25,
|
||||||
status: "Received",
|
status: "Received",
|
||||||
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
|
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
|
||||||
cargoDesc: "Clothes",
|
cargoDesc: "Computers",
|
||||||
arrivedDate: DateTime(2020, 6, 1),
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
statusHistory: statusHistory),
|
market: "Amazon",
|
||||||
|
id: "PKG2039",
|
||||||
|
trackingID: "23-234s-asdfl"),
|
||||||
Package(
|
Package(
|
||||||
shipmentNumber: "A202",
|
shipmentNumber: "A202",
|
||||||
receiverNumber: "3",
|
receiverNumber: "3",
|
||||||
receiverName: "Ko Oo",
|
receiverName: "Ko Myo Min",
|
||||||
boxNumber: "2",
|
boxNumber: "2",
|
||||||
rate: 7,
|
rate: 7,
|
||||||
packageType: "General",
|
packageType: "General",
|
||||||
@@ -40,20 +43,24 @@ class PackageModel extends BaseModel {
|
|||||||
status: "Received",
|
status: "Received",
|
||||||
cargoDesc: "Clothes",
|
cargoDesc: "Clothes",
|
||||||
arrivedDate: DateTime(2020, 6, 1),
|
arrivedDate: DateTime(2020, 6, 1),
|
||||||
statusHistory: statusHistory,
|
market: "Macy",
|
||||||
|
trackingID: "asd-sdf-23498",
|
||||||
|
id: "PKG2040",
|
||||||
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",
|
receiverName: "Ko Myo Min",
|
||||||
boxNumber: "3",
|
boxNumber: "3",
|
||||||
rate: 7,
|
rate: 7,
|
||||||
packageType: "General",
|
packageType: "General",
|
||||||
weight: 15,
|
weight: 15,
|
||||||
cargoDesc: "Shoes",
|
cargoDesc: "Shoes",
|
||||||
status: "Processed",
|
status: "Processed",
|
||||||
|
market: "Macy",
|
||||||
|
trackingID: "8923-234-sd",
|
||||||
|
id: "PKG2041",
|
||||||
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",
|
||||||
@@ -64,9 +71,11 @@ class PackageModel extends BaseModel {
|
|||||||
packageType: "Medicine",
|
packageType: "Medicine",
|
||||||
weight: 15,
|
weight: 15,
|
||||||
status: "Processed",
|
status: "Processed",
|
||||||
|
market: "Macy",
|
||||||
|
trackingID: "lsdf-sd09sdf",
|
||||||
cargoDesc: "Dietary supplement",
|
cargoDesc: "Dietary supplement",
|
||||||
|
id: "PKG2042",
|
||||||
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",
|
||||||
@@ -77,9 +86,11 @@ class PackageModel extends BaseModel {
|
|||||||
packageType: "General",
|
packageType: "General",
|
||||||
cargoDesc: "Handbags",
|
cargoDesc: "Handbags",
|
||||||
weight: 55,
|
weight: 55,
|
||||||
status: "Ready to ship",
|
market: "Macy",
|
||||||
|
trackingID: "234-sdflsdf-213",
|
||||||
|
status: "Processed",
|
||||||
|
id: "PKG2043",
|
||||||
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",
|
||||||
@@ -90,9 +101,11 @@ class PackageModel extends BaseModel {
|
|||||||
packageType: "Dangerous",
|
packageType: "Dangerous",
|
||||||
cargoDesc: "Phones and Scooters",
|
cargoDesc: "Phones and Scooters",
|
||||||
weight: 25,
|
weight: 25,
|
||||||
status: "Delivered",
|
status: "Received",
|
||||||
|
market: "Amazon",
|
||||||
|
trackingID: "sdf-asdf-23489",
|
||||||
|
id: "PKG2044",
|
||||||
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",
|
||||||
@@ -103,29 +116,26 @@ class PackageModel extends BaseModel {
|
|||||||
packageType: "General",
|
packageType: "General",
|
||||||
cargoDesc: "Construction tools",
|
cargoDesc: "Construction tools",
|
||||||
weight: 5,
|
weight: 5,
|
||||||
status: "Delivered",
|
status: "Processed",
|
||||||
|
market: "Amazon",
|
||||||
|
id: "PKG2045",
|
||||||
|
trackingID: "oiuw-sdfpo-234",
|
||||||
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'),
|
||||||
];
|
];
|
||||||
|
|
||||||
List<Package> get completed {
|
List<Package> get completed {
|
||||||
return packages.where((e) => e.status == "Delivered").toList()
|
return packages.where((e) => e.status == "Processed").toList()
|
||||||
..sort((e1, e2) {
|
..sort((e1, e2) {
|
||||||
return e2.packageNumber.compareTo(e1.packageNumber);
|
return e2.packageNumber.compareTo(e1.packageNumber);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Package> get upcoming {
|
List<Package> get upcoming {
|
||||||
return packages
|
return packages.where((e) => e.status == "Received").toList()
|
||||||
.where((e) =>
|
..sort((e1, e2) {
|
||||||
e.status == "Processed" ||
|
return e2.packageNumber.compareTo(e1.packageNumber);
|
||||||
e.status == "Received" ||
|
});
|
||||||
e.status == "Ready to ship")
|
|
||||||
.toList()
|
|
||||||
..sort((e1, e2) {
|
|
||||||
return e2.packageNumber.compareTo(e1.packageNumber);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void initUser(user) {
|
void initUser(user) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:country_code_picker/country_code.dart';
|
import 'package:country_code_picker/country_code.dart';
|
||||||
import 'package:fcs/model/main_model.dart';
|
import 'package:fcs/model/main_model.dart';
|
||||||
import 'package:fcs/pages/shipment_list.dart';
|
import 'package:fcs/pages/shipment_list.dart';
|
||||||
|
import 'package:fcs/pages_fcs/box_list.dart';
|
||||||
import 'package:fcs/pages_fcs/package_list.dart';
|
import 'package:fcs/pages_fcs/package_list.dart';
|
||||||
import 'package:fcs/widget/bottom_up_page_route.dart';
|
import 'package:fcs/widget/bottom_up_page_route.dart';
|
||||||
import 'package:fcs/widget/localization/transalation.dart';
|
import 'package:fcs/widget/localization/transalation.dart';
|
||||||
@@ -111,6 +112,11 @@ class _HomePageState extends State<HomePage> {
|
|||||||
btnCallback: () =>
|
btnCallback: () =>
|
||||||
Navigator.of(context).push(BottomUpPageRoute(PackageList())));
|
Navigator.of(context).push(BottomUpPageRoute(PackageList())));
|
||||||
|
|
||||||
|
final boxesBtn = _buildBtn2("boxes.name",
|
||||||
|
icon: MaterialCommunityIcons.package,
|
||||||
|
btnCallback: () =>
|
||||||
|
Navigator.of(context).push(BottomUpPageRoute(BoxList())));
|
||||||
|
|
||||||
final pickUpBtn = _buildBtn2("pickup",
|
final pickUpBtn = _buildBtn2("pickup",
|
||||||
icon: SimpleLineIcons.direction,
|
icon: SimpleLineIcons.direction,
|
||||||
btnCallback: () =>
|
btnCallback: () =>
|
||||||
@@ -182,6 +188,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
owner ? widgets.add(fcsProfileBtn) : "";
|
owner ? widgets.add(fcsProfileBtn) : "";
|
||||||
widgets.add(shipmentCostBtn);
|
widgets.add(shipmentCostBtn);
|
||||||
customer || owner ? widgets.add(packagesBtn) : "";
|
customer || owner ? widgets.add(packagesBtn) : "";
|
||||||
|
customer || owner ? widgets.add(boxesBtn) : "";
|
||||||
owner ? widgets.add(customersBtn) : "";
|
owner ? widgets.add(customersBtn) : "";
|
||||||
customer || owner ? widgets.add(invoicesBtn) : "";
|
customer || owner ? widgets.add(invoicesBtn) : "";
|
||||||
widgets.add(termBtn);
|
widgets.add(termBtn);
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class _InvoiceListState extends State<InvoiceList> {
|
|||||||
bottom: TabBar(
|
bottom: TabBar(
|
||||||
unselectedLabelColor: Colors.grey,
|
unselectedLabelColor: Colors.grey,
|
||||||
tabs: [
|
tabs: [
|
||||||
Tab(text: "Packages"),
|
Tab(text: "Boxes"),
|
||||||
Tab(text: "Pending"),
|
Tab(text: "Pending"),
|
||||||
Tab(text: "Paid"),
|
Tab(text: "Paid"),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:fcs/model/main_model.dart';
|
||||||
import 'package:fcs/pages/invoice/package_addition.dart';
|
import 'package:fcs/pages/invoice/package_addition.dart';
|
||||||
import 'package:fcs/theme/theme.dart';
|
import 'package:fcs/theme/theme.dart';
|
||||||
import 'package:fcs/vo/invoice.dart';
|
import 'package:fcs/vo/invoice.dart';
|
||||||
@@ -86,6 +87,8 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
var mainModel = Provider.of<MainModel>(context);
|
||||||
|
|
||||||
return LocalProgress(
|
return LocalProgress(
|
||||||
inAsyncCall: _isLoading,
|
inAsyncCall: _isLoading,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
@@ -246,7 +249,7 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
ExpansionTile(
|
ExpansionTile(
|
||||||
title: Text('Package Informations'),
|
title: Text('Box Information'),
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Container(
|
Container(
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
@@ -288,14 +291,14 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(
|
mainModel.isOwner()?Container(
|
||||||
padding: EdgeInsets.only(top: 20),
|
padding: EdgeInsets.only(top: 20),
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.bottomRight,
|
alignment: Alignment.bottomRight,
|
||||||
child: FloatingActionButton.extended(
|
child: FloatingActionButton.extended(
|
||||||
icon: Icon(Icons.add),
|
icon: Icon(Icons.add),
|
||||||
label: Text(AppTranslations.of(context)
|
label: Text(AppTranslations.of(context)
|
||||||
.text("invoice.add_package")),
|
.text("invoice.add_box")),
|
||||||
backgroundColor: primaryColor,
|
backgroundColor: primaryColor,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.of(context)
|
Navigator.of(context)
|
||||||
@@ -303,7 +306,7 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
):Container(),
|
||||||
SizedBox(height: 25),
|
SizedBox(height: 25),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -324,7 +327,7 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
)))
|
)))
|
||||||
: Container(
|
:mainModel.isCustomer()?Container():Container(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Align(
|
Align(
|
||||||
@@ -351,7 +354,7 @@ class _InvoiceEditorState extends State<InvoiceEditor> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
width: 250,
|
width: 250,
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
child: Text('Confirm Payment'),
|
child: Text('Attach Payment Receipt'),
|
||||||
color: primaryColor,
|
color: primaryColor,
|
||||||
textColor: Colors.white,
|
textColor: Colors.white,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ class _PickUpEditorState extends State<PickUpEditor> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
ExpansionTile(
|
ExpansionTile(
|
||||||
title: Text('Package Informations'),
|
title: Text('Package Information'),
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
padding: const EdgeInsets.only(left: 20.0),
|
||||||
@@ -302,7 +302,7 @@ class _PickUpEditorState extends State<PickUpEditor> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
ExpansionTile(
|
ExpansionTile(
|
||||||
title: Text('Recipient Informations'),
|
title: Text('Recipient Information'),
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0),
|
padding: const EdgeInsets.only(left: 20.0),
|
||||||
@@ -346,6 +346,7 @@ class _PickUpEditorState extends State<PickUpEditor> {
|
|||||||
_recipientAddressEditingController)),
|
_recipientAddressEditingController)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
mainModel.isCustomer()?Container():
|
||||||
ExpansionTile(
|
ExpansionTile(
|
||||||
title: Text('For FCS'),
|
title: Text('For FCS'),
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ class _ShipmentRatesState extends State<ShipmentRates> {
|
|||||||
Navigator.of(context)
|
Navigator.of(context)
|
||||||
.push(MaterialPageRoute(builder: (_) => Term()));
|
.push(MaterialPageRoute(builder: (_) => Term()));
|
||||||
}),
|
}),
|
||||||
fcsButton(context, "Calculate", callack: () {
|
fcsButton(context, "Estimate shipping cost", callack: () {
|
||||||
Navigator.of(context)
|
Navigator.of(context)
|
||||||
.push(BottomUpPageRoute(ShipmentRatesCal()));
|
.push(BottomUpPageRoute(ShipmentRatesCal()));
|
||||||
}),
|
}),
|
||||||
|
|||||||
407
lib/pages_fcs/box_editor.dart
Normal file
407
lib/pages_fcs/box_editor.dart
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
import 'package:fcs/model/main_model.dart';
|
||||||
|
import 'package:fcs/model_fcs/package_model.dart';
|
||||||
|
import 'package:fcs/pages/invoice/package_addition.dart';
|
||||||
|
import 'package:fcs/pages/util.dart';
|
||||||
|
import 'package:fcs/vo/box.dart';
|
||||||
|
import 'package:fcs/vo/package.dart';
|
||||||
|
import 'package:fcs/widget/bottom_up_page_route.dart';
|
||||||
|
import 'package:fcs/widget/local_text.dart';
|
||||||
|
import 'package:fcs/widget/localization/app_translations.dart';
|
||||||
|
import 'package:fcs/widget/my_data_table.dart';
|
||||||
|
import 'package:fcs/widget/progress.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_icons/flutter_icons.dart';
|
||||||
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:timeline_list/timeline.dart';
|
||||||
|
import 'package:timeline_list/timeline_model.dart';
|
||||||
|
|
||||||
|
import '../theme/theme.dart';
|
||||||
|
|
||||||
|
class BoxEditor extends StatefulWidget {
|
||||||
|
final Box box;
|
||||||
|
BoxEditor({this.box});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_BoxEditorState createState() => _BoxEditorState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BoxEditorState extends State<BoxEditor> {
|
||||||
|
TextEditingController _addressEditingController = new TextEditingController();
|
||||||
|
TextEditingController _fromTimeEditingController =
|
||||||
|
new TextEditingController();
|
||||||
|
TextEditingController _toTimeEditingController = new TextEditingController();
|
||||||
|
TextEditingController _noOfPackageEditingController =
|
||||||
|
new TextEditingController();
|
||||||
|
TextEditingController _weightEditingController = new TextEditingController();
|
||||||
|
|
||||||
|
Box _box;
|
||||||
|
bool _isLoading = false;
|
||||||
|
List<String> _images = [
|
||||||
|
"assets/photos/1.jpg",
|
||||||
|
"assets/photos/2.jpg",
|
||||||
|
"assets/photos/3.jpg"
|
||||||
|
];
|
||||||
|
bool isNew;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
if (widget.box != null) {
|
||||||
|
_box = widget.box;
|
||||||
|
isNew = false;
|
||||||
|
// _addressEditingController.text = _pickUp.address;
|
||||||
|
// _fromTimeEditingController.text = _pickUp.fromTime;
|
||||||
|
// _toTimeEditingController.text = _pickUp.toTime;
|
||||||
|
// _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString();
|
||||||
|
// _weightEditingController.text = _pickUp.weight.toString();
|
||||||
|
} else {
|
||||||
|
List<Package> packages = [
|
||||||
|
PackageModel.packages[0],
|
||||||
|
PackageModel.packages[1],
|
||||||
|
PackageModel.packages[2]
|
||||||
|
];
|
||||||
|
|
||||||
|
isNew = true;
|
||||||
|
_box = Box(rate: 0, weight: 0, packages: packages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
final DateFormat dateFormat = DateFormat("d MMM yyyy");
|
||||||
|
List<TimelineModel> _models() {
|
||||||
|
// return [];
|
||||||
|
return _box.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
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var mainModel = Provider.of<MainModel>(context);
|
||||||
|
|
||||||
|
var images = isNew ? [] : _images;
|
||||||
|
return LocalProgress(
|
||||||
|
inAsyncCall: _isLoading,
|
||||||
|
child: Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
centerTitle: true,
|
||||||
|
leading: new IconButton(
|
||||||
|
icon: new Icon(Icons.close),
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
),
|
||||||
|
backgroundColor: primaryColor,
|
||||||
|
title: Text(AppTranslations.of(context).text("box.edit.title")),
|
||||||
|
),
|
||||||
|
body: Card(
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
widget.box == null
|
||||||
|
? Center(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.all(8), child: Text("New Box")))
|
||||||
|
: Center(child: nameWidget(_box.packageNumber)),
|
||||||
|
Expanded(
|
||||||
|
child: ListView(
|
||||||
|
children: [
|
||||||
|
ExpansionTile(
|
||||||
|
title: Text(
|
||||||
|
'Shipment Information',
|
||||||
|
style: TextStyle(
|
||||||
|
color: primaryColor, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: DropdownButtonFormField(
|
||||||
|
value: _box.shipmentNumber,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Shipment Number',
|
||||||
|
icon: Icon(Ionicons.ios_airplane,
|
||||||
|
color: primaryColor)
|
||||||
|
// prefixIcon: Icon(Icons.play_arrow)
|
||||||
|
),
|
||||||
|
items: ["A102", "A103", "A201", "A202"]
|
||||||
|
.map((e) =>
|
||||||
|
DropdownMenuItem(child: Text(e), value: e))
|
||||||
|
.toList(),
|
||||||
|
onChanged: (map) => {},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue:
|
||||||
|
isNew ? "FCS-0203-390-2" : "FCS-0203-390-2",
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'FCS_ID',
|
||||||
|
hintText: 'FCS_ID',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(Feather.user, color: primaryColor),
|
||||||
|
suffixIcon: IconButton(
|
||||||
|
icon: Icon(Icons.search),
|
||||||
|
onPressed: () {})),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: _box.receiverName,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Customer Name',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(Feather.user, color: Colors.white),
|
||||||
|
suffixIcon: IconButton(
|
||||||
|
icon: Icon(Icons.search),
|
||||||
|
onPressed: () {})),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 30,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ExpansionTile(
|
||||||
|
title: Text(
|
||||||
|
'Packages',
|
||||||
|
style: TextStyle(
|
||||||
|
color: primaryColor, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: DropdownButtonFormField(
|
||||||
|
value: _box.packageType,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Cargo Type',
|
||||||
|
icon: Icon(Entypo.box, color: primaryColor)),
|
||||||
|
items: ["General", "Medicine", "Dangerous"]
|
||||||
|
.map((e) =>
|
||||||
|
DropdownMenuItem(child: Text(e), value: e))
|
||||||
|
.toList(),
|
||||||
|
onChanged: (map) => {},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: _box.weight.toString(),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Total Weight',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(FontAwesomeIcons.weightHanging,
|
||||||
|
color: primaryColor),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: _box.rate.toString(),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Rate',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(FontAwesomeIcons.tag,
|
||||||
|
color: primaryColor),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: _box.amount.toString(),
|
||||||
|
textAlign: TextAlign.end,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Total Amount',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(FontAwesomeIcons.moneyBill,
|
||||||
|
color: primaryColor),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.only(top: 10),
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
child: MyDataTable(
|
||||||
|
headingRowHeight: 40,
|
||||||
|
columnSpacing: 20,
|
||||||
|
columns: [
|
||||||
|
MyDataColumn(
|
||||||
|
label: LocalText(
|
||||||
|
context,
|
||||||
|
"box.package.id",
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
MyDataColumn(
|
||||||
|
label: LocalText(
|
||||||
|
context,
|
||||||
|
"box.package.desc",
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
MyDataColumn(
|
||||||
|
label: LocalText(
|
||||||
|
context,
|
||||||
|
"box.package.market",
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
rows: getPackageRow(context),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
mainModel.isOwner()
|
||||||
|
? Container(
|
||||||
|
padding: EdgeInsets.only(top: 20),
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.bottomRight,
|
||||||
|
child: FloatingActionButton.extended(
|
||||||
|
icon: Icon(Icons.add),
|
||||||
|
label: Text(AppTranslations.of(context)
|
||||||
|
.text("box.add_package")),
|
||||||
|
backgroundColor: primaryColor,
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).push(
|
||||||
|
BottomUpPageRoute(PackageAddition()));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
SizedBox(height: 25),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
isNew
|
||||||
|
? Container()
|
||||||
|
: 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),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
widget.box == null
|
||||||
|
? Align(
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
|
child: Center(
|
||||||
|
child: Container(
|
||||||
|
width: 250,
|
||||||
|
child: FlatButton(
|
||||||
|
child: Text('Create New Box'),
|
||||||
|
color: primaryColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)))
|
||||||
|
: Container(
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
|
child: Center(
|
||||||
|
child: Container(
|
||||||
|
width: 250,
|
||||||
|
child: FlatButton(
|
||||||
|
child: Text('Complete packing'),
|
||||||
|
color: primaryColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
))),
|
||||||
|
],
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MyDataRow> getPackageRow(BuildContext context) {
|
||||||
|
if (_box == null || _box.packages == null) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return _box.packages.map((p) {
|
||||||
|
return MyDataRow(
|
||||||
|
onSelectChanged: (bool selected) {},
|
||||||
|
cells: [
|
||||||
|
MyDataCell(new Text(
|
||||||
|
p.id == null ? "" : p.id,
|
||||||
|
style: textStyle,
|
||||||
|
)),
|
||||||
|
MyDataCell(
|
||||||
|
new Text(p.cargoDesc, style: textStyle),
|
||||||
|
),
|
||||||
|
MyDataCell(
|
||||||
|
new Text("${p.market}", style: textStyle),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}).toList();
|
||||||
|
}
|
||||||
|
}
|
||||||
146
lib/pages_fcs/box_list.dart
Normal file
146
lib/pages_fcs/box_list.dart
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
import 'package:fcs/model/pickup_model.dart';
|
||||||
|
import 'package:fcs/model_fcs/box_model.dart';
|
||||||
|
import 'package:fcs/model_fcs/package_model.dart';
|
||||||
|
import 'package:fcs/pages/pickup_list_row.dart';
|
||||||
|
import 'package:fcs/pages/search_page.dart';
|
||||||
|
import 'package:fcs/pages_fcs/box_editor.dart';
|
||||||
|
import 'package:fcs/pages_fcs/box_list_row.dart';
|
||||||
|
import 'package:fcs/pages_fcs/package_editor.dart';
|
||||||
|
import 'package:fcs/pages_fcs/package_list_row.dart';
|
||||||
|
import 'package:fcs/vo/buyer.dart';
|
||||||
|
import 'package:fcs/widget/bottom_up_page_route.dart';
|
||||||
|
import 'package:fcs/widget/localization/app_translations.dart';
|
||||||
|
import 'package:fcs/widget/progress.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import '../theme/theme.dart';
|
||||||
|
import 'pickup_editor.dart';
|
||||||
|
|
||||||
|
class BoxList extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_BoxListState createState() => _BoxListState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BoxListState extends State<BoxList> {
|
||||||
|
Buyer buyer;
|
||||||
|
bool _isLoading = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return LocalProgress(
|
||||||
|
inAsyncCall: _isLoading,
|
||||||
|
child: DefaultTabController(
|
||||||
|
length: 2,
|
||||||
|
child: Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
centerTitle: true,
|
||||||
|
leading: new IconButton(
|
||||||
|
icon: new Icon(Icons.close),
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
),
|
||||||
|
backgroundColor: primaryColor,
|
||||||
|
title: Text(AppTranslations.of(context).text("boxes.title")),
|
||||||
|
actions: <Widget>[
|
||||||
|
IconButton(
|
||||||
|
icon: Icon(
|
||||||
|
Icons.search,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
iconSize: 30,
|
||||||
|
onPressed: () => showPlacesSearch(context),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
bottom: TabBar(
|
||||||
|
unselectedLabelColor: Colors.grey,
|
||||||
|
tabs: [
|
||||||
|
Tab(
|
||||||
|
text: "Upcoming",
|
||||||
|
),
|
||||||
|
Tab(text: "Delivered"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
floatingActionButton: FloatingActionButton.extended(
|
||||||
|
onPressed: () {
|
||||||
|
_newPickup();
|
||||||
|
},
|
||||||
|
icon: Icon(Icons.add),
|
||||||
|
label: Text(AppTranslations.of(context).text("boxes.new")),
|
||||||
|
backgroundColor: primaryColor,
|
||||||
|
),
|
||||||
|
body: TabBarView(
|
||||||
|
children: [
|
||||||
|
_upComing(),
|
||||||
|
_completed(),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_newPickup() {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
BottomUpPageRoute(BoxEditor()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _upComing() {
|
||||||
|
var boxModel = Provider.of<BoxModel>(context);
|
||||||
|
return Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: new ListView.separated(
|
||||||
|
separatorBuilder: (context, index) => Divider(
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
scrollDirection: Axis.vertical,
|
||||||
|
padding: EdgeInsets.only(top: 15),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: boxModel.upcoming.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return BoxListRow(
|
||||||
|
box: boxModel.upcoming[index],
|
||||||
|
isReadOnly: false,
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _completed() {
|
||||||
|
var boxModel = Provider.of<BoxModel>(context);
|
||||||
|
return Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: new ListView.separated(
|
||||||
|
separatorBuilder: (context, index) => Divider(
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
scrollDirection: Axis.vertical,
|
||||||
|
padding: EdgeInsets.only(top: 15),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: boxModel.completed.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return BoxListRow(
|
||||||
|
box: boxModel.completed[index],
|
||||||
|
isReadOnly: false,
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
119
lib/pages_fcs/box_list_row.dart
Normal file
119
lib/pages_fcs/box_list_row.dart
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
import 'package:fcs/pages/invoice/package_info.dart';
|
||||||
|
import 'package:fcs/pages/util.dart';
|
||||||
|
import 'package:fcs/pages_fcs/box_editor.dart';
|
||||||
|
import 'package:fcs/pages_fcs/package_editor.dart';
|
||||||
|
import 'package:fcs/vo/box.dart';
|
||||||
|
import 'package:fcs/vo/package.dart';
|
||||||
|
import 'package:fcs/widget/bottom_up_page_route.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
|
class BoxListRow extends StatefulWidget {
|
||||||
|
final bool isReadOnly;
|
||||||
|
final Box box;
|
||||||
|
const BoxListRow({this.box, this.isReadOnly});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_BoxListRowState createState() => _BoxListRowState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BoxListRowState extends State<BoxListRow> {
|
||||||
|
final double dotSize = 15.0;
|
||||||
|
Box _box = new Box();
|
||||||
|
final DateFormat dateFormat = new DateFormat("dd MMM yyyy");
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_box = widget.box;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.only(left: 15, right: 15),
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () {
|
||||||
|
if (widget.isReadOnly) {
|
||||||
|
// Navigator.push(
|
||||||
|
// context,
|
||||||
|
// BottomUpPageRoute(PackageInfo(package: _box)),
|
||||||
|
// );
|
||||||
|
} else {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
BottomUpPageRoute(BoxEditor(box: _box)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: new Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 16.0),
|
||||||
|
child: new Row(
|
||||||
|
children: <Widget>[
|
||||||
|
new Expanded(
|
||||||
|
child: new Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 8.0),
|
||||||
|
child: new Text(
|
||||||
|
_box.packageNumber == null
|
||||||
|
? ''
|
||||||
|
: _box.packageNumber,
|
||||||
|
style: new TextStyle(
|
||||||
|
fontSize: 15.0, color: Colors.black),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 10.0, top: 10),
|
||||||
|
child: new Text(
|
||||||
|
dateFormat.format(_box.arrivedDate),
|
||||||
|
style: new TextStyle(
|
||||||
|
fontSize: 15.0, color: Colors.grey),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(0),
|
||||||
|
child: getStatus(_box.status),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
new Text(
|
||||||
|
_box.weight == null
|
||||||
|
? ''
|
||||||
|
: _box.weight.toString() + 'lb - ',
|
||||||
|
style:
|
||||||
|
new TextStyle(fontSize: 15.0, color: Colors.grey),
|
||||||
|
),
|
||||||
|
new Text(
|
||||||
|
_box.price == null
|
||||||
|
? ""
|
||||||
|
: "\$ " + _box.price.toString(),
|
||||||
|
style:
|
||||||
|
new TextStyle(fontSize: 15.0, color: Colors.grey),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -60,43 +60,6 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final DateFormat dateFormat = DateFormat("d MMM yyyy");
|
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) {
|
||||||
@@ -116,12 +79,13 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
body: Card(
|
body: Card(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
widget.package == null
|
isNew ? Container() : Center(child: nameWidget(_package.market)),
|
||||||
|
isNew
|
||||||
? Center(
|
? Center(
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.all(8),
|
padding: EdgeInsets.all(8),
|
||||||
child: Text("New Package")))
|
child: Text("New Package")))
|
||||||
: Center(child: nameWidget(_package.packageNumber)),
|
: Center(child: nameWidget(_package.trackingID)),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ListView(
|
child: ListView(
|
||||||
children: [
|
children: [
|
||||||
@@ -134,26 +98,49 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
child: DropdownButtonFormField(
|
child: TextFormField(
|
||||||
value: _package.shipmentNumber,
|
initialValue: isNew ? "" : "PKG2039",
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Shipment Number',
|
labelText: 'Package ID',
|
||||||
icon: Icon(Ionicons.ios_airplane,
|
hintText: 'Package ID',
|
||||||
color: primaryColor)
|
filled: true,
|
||||||
// prefixIcon: Icon(Icons.play_arrow)
|
icon: Icon(MaterialCommunityIcons.id_card,
|
||||||
),
|
color: primaryColor),
|
||||||
items: ["A102", "A103", "A201", "A202"]
|
),
|
||||||
.map((e) =>
|
|
||||||
DropdownMenuItem(child: Text(e), value: e))
|
|
||||||
.toList(),
|
|
||||||
onChanged: (map) => {},
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
initialValue: isNew ? "" : "FCS383-283-1",
|
initialValue: isNew ? "" : "Amazon",
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Market',
|
||||||
|
hintText: 'FCS_ID',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(MaterialCommunityIcons.cart_outline,
|
||||||
|
color: primaryColor),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: isNew ? "" : "zdf-sdfl-37sdfks",
|
||||||
|
decoration: InputDecoration(
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: 'Tracking ID',
|
||||||
|
hintText: 'Tracking ID',
|
||||||
|
filled: true,
|
||||||
|
icon: Icon(Octicons.package, color: primaryColor),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
|
child: TextFormField(
|
||||||
|
initialValue: isNew ? "" : "FCS-0203-390-2",
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'FCS_ID',
|
labelText: 'FCS_ID',
|
||||||
@@ -182,7 +169,7 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
padding: const EdgeInsets.only(left: 20.0, right: 20),
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
initialValue: isNew ? "" : "P0203",
|
initialValue: isNew ? "" : "",
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
fillColor: Colors.white,
|
fillColor: Colors.white,
|
||||||
labelText: 'Pickup ID',
|
labelText: 'Pickup ID',
|
||||||
@@ -196,154 +183,90 @@ class _PackageEditorState extends State<PackageEditor> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
ExpansionTile(
|
isNew
|
||||||
title: Text(
|
? Container()
|
||||||
'Processing',
|
: ExpansionTile(
|
||||||
style: TextStyle(
|
title: Text(
|
||||||
color: primaryColor, fontWeight: FontWeight.bold),
|
'Processing',
|
||||||
),
|
style: TextStyle(
|
||||||
children: [
|
color: primaryColor,
|
||||||
Padding(
|
fontWeight: FontWeight.bold),
|
||||||
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>[
|
|
||||||
Container(
|
|
||||||
height: 130,
|
|
||||||
width: 500,
|
|
||||||
child: ListView.separated(
|
|
||||||
separatorBuilder: (context, index) => Divider(
|
|
||||||
color: Colors.black,
|
|
||||||
),
|
),
|
||||||
itemCount: images.length + 1,
|
children: [
|
||||||
scrollDirection: Axis.horizontal,
|
Padding(
|
||||||
itemBuilder: (context, index) {
|
padding: const EdgeInsets.only(
|
||||||
if (index == images.length) {
|
left: 20.0, right: 20),
|
||||||
return Padding(
|
child: TextFormField(
|
||||||
padding: const EdgeInsets.all(8.0),
|
initialValue: isNew
|
||||||
child: Container(
|
? ""
|
||||||
width: 200,
|
: _package.cargoDesc.toString(),
|
||||||
height: 70,
|
decoration: InputDecoration(
|
||||||
decoration: BoxDecoration(
|
fillColor: Colors.white,
|
||||||
border: Border.all(
|
labelText: 'Description',
|
||||||
color: primaryColor,
|
filled: true,
|
||||||
width: 2.0,
|
icon: Icon(MaterialIcons.description,
|
||||||
),
|
color: primaryColor),
|
||||||
),
|
)),
|
||||||
child: Icon(SimpleLineIcons.plus),
|
),
|
||||||
),
|
],
|
||||||
);
|
),
|
||||||
} else {
|
isNew
|
||||||
return Padding(
|
? Container()
|
||||||
padding: const EdgeInsets.all(8.0),
|
: ExpansionTile(
|
||||||
child: Container(
|
title: Text(
|
||||||
width: 200,
|
'Photos',
|
||||||
height: 70,
|
style: TextStyle(
|
||||||
decoration: BoxDecoration(
|
color: primaryColor,
|
||||||
border: Border.all(
|
fontWeight: FontWeight.bold),
|
||||||
color: primaryColor,
|
),
|
||||||
width: 2.0,
|
children: <Widget>[
|
||||||
),
|
Container(
|
||||||
),
|
height: 130,
|
||||||
child: Image.asset(images[index],
|
width: 500,
|
||||||
width: 50, height: 50),
|
child: ListView.separated(
|
||||||
),
|
separatorBuilder: (context, index) => Divider(
|
||||||
);
|
color: Colors.black,
|
||||||
}
|
),
|
||||||
},
|
itemCount: images.length + 1,
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
if (index == images.length) {
|
||||||
|
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: Icon(SimpleLineIcons.plus),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} 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),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ class _PackageListState extends State<PackageList> {
|
|||||||
unselectedLabelColor: Colors.grey,
|
unselectedLabelColor: Colors.grey,
|
||||||
tabs: [
|
tabs: [
|
||||||
Tab(
|
Tab(
|
||||||
text: "Upcoming",
|
text: "Received",
|
||||||
),
|
),
|
||||||
Tab(text: "Completed"),
|
Tab(text: "Processed"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -58,21 +58,29 @@ class _PackageListRowtate extends State<PackageListRow> {
|
|||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 8.0),
|
padding: const EdgeInsets.only(left: 8.0),
|
||||||
child: new Text(
|
child: new Text(
|
||||||
_package.packageNumber == null
|
_package.id == null ? '' : _package.id,
|
||||||
? ''
|
|
||||||
: _package.packageNumber,
|
|
||||||
style: new TextStyle(
|
style: new TextStyle(
|
||||||
fontSize: 15.0, color: Colors.black),
|
fontSize: 15.0, color: Colors.black),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 10.0, top: 10),
|
padding: const EdgeInsets.only(left: 8.0),
|
||||||
child: new Text(
|
child: new Text(
|
||||||
dateFormat.format(_package.arrivedDate),
|
_package.market == null ? '' : _package.market,
|
||||||
|
style: new TextStyle(
|
||||||
|
fontSize: 15.0, color: Colors.black),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 8.0),
|
||||||
|
child: new Text(
|
||||||
|
_package.trackingID == null
|
||||||
|
? ''
|
||||||
|
: _package.trackingID,
|
||||||
style: new TextStyle(
|
style: new TextStyle(
|
||||||
fontSize: 15.0, color: Colors.grey),
|
fontSize: 15.0, color: Colors.grey),
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -84,7 +92,10 @@ class _PackageListRowtate extends State<PackageListRow> {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.all(0),
|
padding: const EdgeInsets.all(0),
|
||||||
child: getStatus(_package.status),
|
child: new Text(
|
||||||
|
dateFormat.format(_package.arrivedDate),
|
||||||
|
style: new TextStyle(fontSize: 15.0, color: Colors.grey),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5),
|
padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5),
|
||||||
|
|||||||
61
lib/vo/box.dart
Normal file
61
lib/vo/box.dart
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import 'package.dart';
|
||||||
|
|
||||||
|
class Status {
|
||||||
|
String status;
|
||||||
|
DateTime date;
|
||||||
|
bool done;
|
||||||
|
Status({this.status, this.date, this.done});
|
||||||
|
}
|
||||||
|
|
||||||
|
class Box {
|
||||||
|
String id;
|
||||||
|
String shipmentNumber;
|
||||||
|
String senderFCSID;
|
||||||
|
String senderName;
|
||||||
|
String receiverFCSID;
|
||||||
|
String receiverName;
|
||||||
|
String receiverAddress;
|
||||||
|
String receiverNumber;
|
||||||
|
String boxNumber;
|
||||||
|
String status;
|
||||||
|
String cargoDesc;
|
||||||
|
|
||||||
|
int rate;
|
||||||
|
int weight;
|
||||||
|
String packageType;
|
||||||
|
String pickUpID;
|
||||||
|
List<String> photos;
|
||||||
|
String remark;
|
||||||
|
DateTime arrivedDate;
|
||||||
|
|
||||||
|
List<Package> packages;
|
||||||
|
|
||||||
|
int get amount => rate != null && weight != null ? rate * weight : 0;
|
||||||
|
|
||||||
|
String get packageNumber =>
|
||||||
|
shipmentNumber + "-" + receiverNumber + " #" + boxNumber;
|
||||||
|
double get price => rate.toDouble() * weight;
|
||||||
|
|
||||||
|
List<Status> statusHistory;
|
||||||
|
|
||||||
|
Box(
|
||||||
|
{this.id,
|
||||||
|
this.shipmentNumber,
|
||||||
|
this.senderFCSID,
|
||||||
|
this.senderName,
|
||||||
|
this.receiverFCSID,
|
||||||
|
this.receiverName,
|
||||||
|
this.receiverNumber,
|
||||||
|
this.receiverAddress,
|
||||||
|
this.boxNumber,
|
||||||
|
this.rate,
|
||||||
|
this.weight,
|
||||||
|
this.packageType,
|
||||||
|
this.pickUpID,
|
||||||
|
this.remark,
|
||||||
|
this.status,
|
||||||
|
this.arrivedDate,
|
||||||
|
this.cargoDesc,
|
||||||
|
this.statusHistory,
|
||||||
|
this.packages});
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
class Status {
|
// class Status {
|
||||||
String status;
|
// String status;
|
||||||
DateTime date;
|
// DateTime date;
|
||||||
bool done;
|
// bool done;
|
||||||
Status({this.status, this.date, this.done});
|
// Status({this.status, this.date, this.done});
|
||||||
}
|
// }
|
||||||
|
|
||||||
class Package {
|
class Package {
|
||||||
String id;
|
String id;
|
||||||
@@ -17,6 +17,8 @@ class Package {
|
|||||||
String boxNumber;
|
String boxNumber;
|
||||||
String status;
|
String status;
|
||||||
String cargoDesc;
|
String cargoDesc;
|
||||||
|
String market;
|
||||||
|
String trackingID;
|
||||||
|
|
||||||
int rate;
|
int rate;
|
||||||
int weight;
|
int weight;
|
||||||
@@ -32,7 +34,7 @@ class Package {
|
|||||||
shipmentNumber + "-" + receiverNumber + " #" + boxNumber;
|
shipmentNumber + "-" + receiverNumber + " #" + boxNumber;
|
||||||
double get price => rate.toDouble() * weight;
|
double get price => rate.toDouble() * weight;
|
||||||
|
|
||||||
List<Status> statusHistory;
|
// List<Status> statusHistory;
|
||||||
|
|
||||||
Package(
|
Package(
|
||||||
{this.id,
|
{this.id,
|
||||||
@@ -52,5 +54,8 @@ class Package {
|
|||||||
this.status,
|
this.status,
|
||||||
this.arrivedDate,
|
this.arrivedDate,
|
||||||
this.cargoDesc,
|
this.cargoDesc,
|
||||||
this.statusHistory});
|
this.market,
|
||||||
|
this.trackingID
|
||||||
|
// this.statusHistory
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user