diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 776ea22..080c567 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -321,6 +321,7 @@ "Shipment Start ================================================================":"", "shipment": "Shipments", "shipment.title": "Shipments", + "shipment.number": "Shipment number", "shipment.new": "New shipment", "shipment.new.title": "New Shipment", "shipment.edit.title": "Edit Shipment", @@ -329,6 +330,8 @@ "shipment.date.time": "Pickup date/Time", "shipment.time": "Pickup time", "shipment.location": "Pickup address", + "shipment.location.dropoff": "Local dropoff address", + "shipment.courier.dropoff":"Courier dropoff", "shipment.location_time": "Pickup Location / Time", "shipment.information": "Pickup information", "shipment.recipient_information": "Recipient informations", @@ -349,6 +352,7 @@ "shipment.create":"Create shipment", "shipment.update":"Update shipment", "shipment.info":"Shipment Info", + "shipment.cancel.confirm":"Cancel this shipment?", "Shipment End ================================================================":"", "Rate Start ================================================================":"", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index 04031af..cf10d2e 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -321,15 +321,18 @@ "Shipment Start ================================================================":"", "shipment": "ပို့ဆောင်ခြင်းများ", "shipment.title": "ပို့ဆောင်ခြင်းများ", + "shipment.number": "ပို့ဆောင်ခြင်း နံပါတ်", "shipment.new": "ပို့ဆောင်ခြင်း အသစ်", "shipment.new.title": "ပို့ဆောင်ခြင်း အသစ်", "shipment.edit.title": "ပို့ဆောင်ခြင်း ပြင်ဆင်ခြင်း", - "shipment.type": "Pickup/Drop-off ရွေးရန်", + "shipment.type": "Pickup/Drop-off", "shipment.date": "Pickup နေ့စွဲ", "shipment.date.time": "Pickup နေ့စွဲ/အချိန်", "shipment.time": "Pickup အချိန်", "shipment.location_time": "Pickup location / Time", "shipment.location": "Pickup လိပ်စာ", + "shipment.location.dropoff": "Local dropoff လိပ်စာ", + "shipment.courier.dropoff":"Courier dropoff", "shipment.information": "Pickup informations", "shipment.recipient_information": "Recipient informations", "shipment.from":"အချိန်(မှ)", @@ -349,6 +352,7 @@ "shipment.create":"ပို့ဆောင်ခြင်း ပြုလုပ်မည်", "shipment.update":"ပို့ဆောင်ခြင်းပြုပြင်မည်", "shipment.info":"ပို့ဆောင်ခြင်း", + "shipment.cancel.confirm":"ပို့ဆောင်ခြင်း ပိတ်သိမ်းမလား?", "Shipment End ================================================================":"", "Rate Start ================================================================":"", diff --git a/lib/app.dart b/lib/app.dart index 819b9a1..ff298d5 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,6 +1,6 @@ import 'package:fcs/localization/app_translations_delegate.dart'; import 'package:fcs/localization/transalation.dart'; -import 'package:fcs/pages/box/model/box_model.dart'; +import 'package:fcs/pages/carton/model/carton_model.dart'; import 'package:fcs/pages/chat/model/message_model.dart'; import 'package:fcs/pages/contact/model/contact_model.dart'; import 'package:fcs/pages/customer/model/customer_model.dart'; @@ -44,7 +44,7 @@ class _AppState extends State { final LanguageModel lanuguageModel = new LanguageModel(); final ShipmentModel shipmentModel = new ShipmentModel(); final ShipmentRateModel shipmentRateModel = new ShipmentRateModel(); - final BoxModel boxModel = new BoxModel(); + final CartonModel boxModel = new CartonModel(); final MessageModel messageModel = new MessageModel(); final InvoiceModel invoiceModel = new InvoiceModel(); final CustomerModel customerModel = new CustomerModel(); diff --git a/lib/data/provider/shipment_data_provider.dart b/lib/data/provider/shipment_data_provider.dart index d65cba4..37cf72a 100644 --- a/lib/data/provider/shipment_data_provider.dart +++ b/lib/data/provider/shipment_data_provider.dart @@ -22,7 +22,7 @@ class ShipmentDataProvider { } Future cancelShipment(Shipment shipment) async { - return await requestAPI("/shipment_cancel", "PUT", + return await requestAPI("/shipments/cancel", "PUT", payload: shipment.toMap(), token: await getToken()); } diff --git a/lib/domain/constants.dart b/lib/domain/constants.dart index cf98d14..b461a54 100644 --- a/lib/domain/constants.dart +++ b/lib/domain/constants.dart @@ -12,12 +12,13 @@ const cargo_types_collection = "cargo_types"; const custom_duties_collection = "custom_duties"; const discounts_by_weights_collection = "discounts_by_weight"; const shipments_collection = "shipments"; -const boxes_collection = "boxes"; +const cartons_collection = "cartons"; // docs const setting_doc_id = "setting"; const rate_doc_id = "rate"; +// user's status const user_requested_status = "requested"; const user_invited_status = "invited"; const user_disabled_status = "disabled"; @@ -64,10 +65,18 @@ const privilege_receiving = "rc"; // Pickup types const shipment_local_pickup = "Local pickup"; const shipment_courier_pickup = "Courier pickup"; -const shipment_local_dropoff = "Local drop-off"; -const shipment_courier_dropoff = "Courier drop-off"; +const shipment_local_dropoff = "Local drop off"; +const shipment_courier_dropoff = "Courier drop off"; //Carton types const carton_from_packages = "From packages"; const carton_from_shipments = "From shipments"; const carton_mix_box = "Mix carton"; + +// shipment status +const shipment_pending_status = "pending"; +const shipment_confirmed_status = "confirmed"; +const shipment_pickuped_status = "pickuped"; +const shipment_packed_status = "packed"; +const shipment_shipped_status = "shipped"; +const shipment_delivered_status = "delivered"; diff --git a/lib/domain/entities/cargo_type.dart b/lib/domain/entities/cargo_type.dart index a4ca89c..a61a45a 100644 --- a/lib/domain/entities/cargo_type.dart +++ b/lib/domain/entities/cargo_type.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + class CargoType { String id; String name; @@ -11,7 +13,8 @@ class CargoType { return CargoType( id: id, name: map['name'], - rate: (map['rate'] ?? 0).toDouble(), + rate: map['rate']?.toDouble() ?? 0, + weight: map['weight']?.toDouble() ?? 0, ); } CargoType({this.id, this.name, this.rate, this.weight}); @@ -25,6 +28,10 @@ class CargoType { }; } + CargoType clone() { + return CargoType.fromMap(toMap(), this.id); + } + @override bool operator ==(Object other) => other is CargoType && other.id == id; diff --git a/lib/domain/entities/box.dart b/lib/domain/entities/carton.dart similarity index 87% rename from lib/domain/entities/box.dart rename to lib/domain/entities/carton.dart index 2956554..9302b5a 100644 --- a/lib/domain/entities/box.dart +++ b/lib/domain/entities/carton.dart @@ -7,7 +7,7 @@ import 'package:fcs/domain/vo/delivery_address.dart'; import 'cargo_type.dart'; import 'package.dart'; -class Box { +class Carton { String id; String shipmentNumber; String senderFCSID; @@ -91,7 +91,7 @@ class Box { List shipmentHistory; - Box( + Carton( {this.id, this.shipmentNumber, this.senderFCSID, @@ -132,13 +132,18 @@ class Box { 'width': width, 'height': height, 'delivery_address': deliveryAddress.toMap(), + 'carton_type': cartonType, }; } - factory Box.fromMap(Map map, String docID) { + factory Carton.fromMap(Map map, String docID) { var _arrivedDate = (map['arrived_date'] as Timestamp); - - return Box( + var da = map['delivery_address']; + var _da = da != null ? DeliveryAddress.fromMap(da, da["id"]) : null; + var cargoTypesMaps = List>.from(map['cargo_types']); + var cargoTypes = + cargoTypesMaps.map((e) => CargoType.fromMap(e, e["id"])).toList(); + return Carton( id: docID, arrivedDate: _arrivedDate != null ? _arrivedDate.toDate() : null, shipmentNumber: map['shipment_number'], @@ -149,6 +154,8 @@ class Box { height: map['height'], userName: map['user_name'], fcsID: map['fcs_id'], - cartonType: map['carton_type']); + cartonType: map['carton_type'], + deliveryAddress: _da, + cargoTypes: cargoTypes); } } diff --git a/lib/domain/entities/setting.dart b/lib/domain/entities/setting.dart index 8a203ee..8f594bb 100644 --- a/lib/domain/entities/setting.dart +++ b/lib/domain/entities/setting.dart @@ -23,24 +23,25 @@ class Setting { final String termsEng; final String termsMm; String about; + String courierWebsite; List shipmentTypes; - Setting({ - this.supportBuildNum, - this.usaAddress, - this.mmAddress, - this.usaContactNumber, - this.mmContactNumber, - this.emailAddress, - this.facebookLink, - this.inviteRequired, - this.appUrl, - this.termsEng, - this.termsMm, - this.about, - this.shipmentTypes, - }); + Setting( + {this.supportBuildNum, + this.usaAddress, + this.mmAddress, + this.usaContactNumber, + this.mmContactNumber, + this.emailAddress, + this.facebookLink, + this.inviteRequired, + this.appUrl, + this.termsEng, + this.termsMm, + this.about, + this.shipmentTypes, + this.courierWebsite}); factory Setting.fromMap(Map map) { return Setting( @@ -57,6 +58,7 @@ class Setting { termsEng: map['terms_eng'], termsMm: map['terms_mm'], shipmentTypes: List.from(map['shipment_types']), + courierWebsite: map['courier_website'], ); } diff --git a/lib/domain/entities/shipment.dart b/lib/domain/entities/shipment.dart index ed75da2..d9c29cb 100644 --- a/lib/domain/entities/shipment.dart +++ b/lib/domain/entities/shipment.dart @@ -1,9 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; -import 'cargo_type.dart'; - class Shipment { String id; String shipmentNumber; @@ -22,7 +20,7 @@ class Shipment { String currentStatus; bool isCourier; int radioIndex; - List boxes; + List boxes; Shipment( {this.id, @@ -40,12 +38,15 @@ class Shipment { this.pickupDate, this.isCourier = false, this.radioIndex = 1, + this.pickupAddress, this.boxes}); int get last => DateTime.now().difference(pickupDate).inDays; factory Shipment.fromMap(Map map, String id) { var pd = (map['pickup_date'] as Timestamp); + var pa = map['pickup_address']; + var _pa = pa != null ? DeliveryAddress.fromMap(pa, pa["id"]) : null; return Shipment( id: id, userName: map['user_name'], @@ -54,14 +55,17 @@ class Shipment { pickupDate: pd == null ? null : pd.toDate(), pickupTimeStart: map['pickup_time_start'], pickupTimeEnd: map['pickup_time_end'], - currentStatus: map['current_status']); + currentStatus: map['current_status'], + shipmentType: map['shipment_type'], + pickupAddress: _pa); } Map toMap() { List _boxes = boxes.map((l) => l.toMap()).toList(); + return { "id": id, - 'boxes': _boxes, + 'cartons': _boxes, 'shipment_type': shipmentType, 'pickup_address': pickupAddress.toMap(), "pickup_date": pickupDate?.toUtc()?.toIso8601String(), diff --git a/lib/pages/box/box_editor.dart b/lib/pages/carton/box_editor.dart similarity index 98% rename from lib/pages/box/box_editor.dart rename to lib/pages/carton/box_editor.dart index 568232f..09c6865 100644 --- a/lib/pages/box/box_editor.dart +++ b/lib/pages/carton/box_editor.dart @@ -1,5 +1,5 @@ import 'package:fcs/domain/constants.dart'; -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/user.dart'; @@ -30,10 +30,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:provider/provider.dart'; import 'cargo_type_editor.dart'; -import 'model/box_model.dart'; +import 'model/carton_model.dart'; class BoxEditor extends StatefulWidget { - final Box box; + final Carton box; BoxEditor({this.box}); @override @@ -45,7 +45,7 @@ class _BoxEditorState extends State { TextEditingController _heightController = new TextEditingController(); TextEditingController _lengthController = new TextEditingController(); - Box _box; + Carton _box; bool _isLoading = false; bool isNew; DeliveryAddress _deliveryAddress = new DeliveryAddress(); @@ -53,12 +53,12 @@ class _BoxEditorState extends State { String _selectShipmentNumber; String _selectedCartonType; List _packages = []; - List _shipmentBoxes = []; - List _mixBoxes = []; + List _shipmentBoxes = []; + List _mixBoxes = []; List _cargoTypes = []; double volumetricRatio = 0; double shipmentWeight = 0; - Box _selectedShipmentBox; + Carton _selectedShipmentBox; @override void initState() { @@ -74,7 +74,7 @@ class _BoxEditorState extends State { }); //for shipment boxes - var boxModel = Provider.of(context, listen: false); + var boxModel = Provider.of(context, listen: false); _shipmentBoxes = [ boxModel.boxeList[0], boxModel.boxeList[1], @@ -142,7 +142,7 @@ class _BoxEditorState extends State { @override Widget build(BuildContext context) { var languageModel = Provider.of(context); - var boxModel = Provider.of(context); + var boxModel = Provider.of(context); var shipmentBox = Container( child: DropdownButtonFormField( diff --git a/lib/pages/box/box_info.dart b/lib/pages/carton/box_info.dart similarity index 98% rename from lib/pages/box/box_info.dart rename to lib/pages/carton/box_info.dart index f3766f8..b491159 100644 --- a/lib/pages/box/box_info.dart +++ b/lib/pages/carton/box_info.dart @@ -1,4 +1,4 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; @@ -22,12 +22,12 @@ import 'package:timeline_list/timeline.dart'; import 'package:timeline_list/timeline_model.dart'; import 'box_editor.dart'; -import 'model/box_model.dart'; +import 'model/carton_model.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); class BoxInfo extends StatefulWidget { - final Box box; + final Carton box; BoxInfo({this.box}); @override @@ -36,12 +36,12 @@ class BoxInfo extends StatefulWidget { class _BoxInfoState extends State { bool _isLoading = false; - Box _box; + Carton _box; String _selectedCartonType; String _shipmentNumber; List _packages = []; - List _mixBoxes = []; - Box _selectedShipmentBox = new Box(); + List _mixBoxes = []; + Carton _selectedShipmentBox = new Carton(); List _cargoTypes = []; DeliveryAddress _deliveryAddress = new DeliveryAddress(); TextEditingController _widthController = new TextEditingController(); @@ -67,7 +67,7 @@ class _BoxInfoState extends State { }); //for shipment boxes - var boxModel = Provider.of(context, listen: false); + var boxModel = Provider.of(context, listen: false); _selectedShipmentBox = boxModel.boxeList[0]; //for mix boxes diff --git a/lib/pages/box/box_list.dart b/lib/pages/carton/box_list.dart similarity index 94% rename from lib/pages/box/box_list.dart rename to lib/pages/carton/box_list.dart index b5e2738..7275279 100644 --- a/lib/pages/box/box_list.dart +++ b/lib/pages/carton/box_list.dart @@ -1,5 +1,5 @@ import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/box/model/box_model.dart'; +import 'package:fcs/pages/carton/model/carton_model.dart'; import 'package:fcs/pages/widgets/local_popup_menu_button.dart'; import 'package:fcs/pages/widgets/local_popupmenu.dart'; import 'package:fcs/pages/widgets/local_text.dart'; @@ -25,10 +25,10 @@ class _BoxListState extends State { super.initState(); _controller.addListener(() async { if (_controller.position.pixels == _controller.position.maxScrollExtent) { - Provider.of(context, listen: false).loadMore(); + Provider.of(context, listen: false).loadMore(); } }); - Provider.of(context, listen: false).initData(); + Provider.of(context, listen: false).initData(); } @override @@ -38,7 +38,7 @@ class _BoxListState extends State { @override Widget build(BuildContext context) { - var boxModel = Provider.of(context); + var boxModel = Provider.of(context); final popupMenu = LocalPopupMenuButton( popmenus: [ LocalPopupMenu( diff --git a/lib/pages/box/box_list_row.dart b/lib/pages/carton/box_list_row.dart similarity index 97% rename from lib/pages/box/box_list_row.dart rename to lib/pages/carton/box_list_row.dart index 0c98fc6..f6d1fc6 100644 --- a/lib/pages/box/box_list_row.dart +++ b/lib/pages/carton/box_list_row.dart @@ -1,4 +1,4 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'box_info.dart'; class BoxListRow extends StatefulWidget { - final Box box; + final Carton box; const BoxListRow({this.box}); @override @@ -15,7 +15,7 @@ class BoxListRow extends StatefulWidget { class _BoxListRowState extends State { final double dotSize = 15.0; - Box _box = new Box(); + Carton _box = new Carton(); final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); @override diff --git a/lib/pages/box/cargo_type_editor.dart b/lib/pages/carton/cargo_type_editor.dart similarity index 98% rename from lib/pages/box/cargo_type_editor.dart rename to lib/pages/carton/cargo_type_editor.dart index 697a7ae..e2e9cc7 100644 --- a/lib/pages/box/cargo_type_editor.dart +++ b/lib/pages/carton/cargo_type_editor.dart @@ -40,7 +40,7 @@ class _CargoTypeEditorState extends State { _loadDefalut() { ShipmentRateModel shipmentRateModel = Provider.of(context, listen: false); - _cargo = shipmentRateModel.rate.defaultCargoType; + _cargo = shipmentRateModel.rate.defaultCargoType.clone(); } @override diff --git a/lib/pages/box/model/box_model.dart b/lib/pages/carton/model/carton_model.dart similarity index 91% rename from lib/pages/box/model/box_model.dart rename to lib/pages/carton/model/carton_model.dart index 598b6eb..d65e619 100644 --- a/lib/pages/box/model/box_model.dart +++ b/lib/pages/carton/model/carton_model.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/domain/constants.dart'; -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/vo/message.dart'; @@ -12,11 +12,11 @@ import 'package:fcs/helpers/paginator.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; -class BoxModel extends BaseModel { - List _boxes = []; - final log = Logger('BoxModel'); - List get boxes => - _selectedIndex == 1 ? _boxes : List.from(_delivered.values); +class CartonModel extends BaseModel { + List _boxes = []; + final log = Logger('CartonModel'); + List get boxes => + _selectedIndex == 1 ? _boxes : List.from(_delivered.values); Paginator _delivered; int _selectedIndex = 1; @@ -35,8 +35,8 @@ class BoxModel extends BaseModel { // PackageModel.packages[2] ]; - List boxeList = [ - Box( + List boxeList = [ + Carton( shipmentNumber: "A202", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -68,7 +68,7 @@ class BoxModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A203", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -100,7 +100,7 @@ class BoxModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A204", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -132,7 +132,7 @@ class BoxModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "2", receiverName: "Ma Aye", @@ -163,7 +163,7 @@ class BoxModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "2", receiverName: "Ma Aye", @@ -193,7 +193,7 @@ class BoxModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "2", receiverName: "Ma Aye", @@ -223,7 +223,7 @@ class BoxModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A201", receiverNumber: "1", receiverName: "Ko Wai", @@ -253,7 +253,7 @@ class BoxModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A201", receiverNumber: "1", receiverName: "Ko Wai", @@ -285,21 +285,21 @@ class BoxModel extends BaseModel { ]), ]; - List get completed { + List get completed { return boxes.where((e) => e.status == "Delivered").toList() ..sort((e1, e2) { return e2.packageNumber.compareTo(e1.packageNumber); }); } - List get processed { + List get processed { return boxes.where((e) => e.status == "Packed").toList() ..sort((e1, e2) { return e2.packageNumber.compareTo(e1.packageNumber); }); } - List get upcoming { + List get upcoming { return boxes .where((e) => e.status == "Packed" || @@ -344,7 +344,7 @@ class BoxModel extends BaseModel { .orderBy("date", descending: true); var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) { var m = Message.fromMap(data, id); - return Box( + return Carton( id: m.id, shipmentNumber: m.message, boxNumber: "1", @@ -359,7 +359,7 @@ class BoxModel extends BaseModel { Future _loadBoxes() async { if (user == null || !user.hasCarton()) return; - String path = "/$boxes_collection/"; + String path = "/$cartons_collection/"; if (listener != null) listener.cancel(); _boxes = []; try { @@ -369,8 +369,8 @@ class BoxModel extends BaseModel { .listen((QuerySnapshot snapshot) { _boxes.clear(); _boxes = snapshot.documents.map((documentSnapshot) { - var s = - Box.fromMap(documentSnapshot.data, documentSnapshot.documentID); + var s = Carton.fromMap( + documentSnapshot.data, documentSnapshot.documentID); return s; }).toList(); notifyListeners(); @@ -384,11 +384,11 @@ class BoxModel extends BaseModel { if (user == null || !user.hasCarton()) return null; var pageQuery = Firestore.instance - .collection("/$boxes_collection") + .collection("/$cartons_collection") .where("is_delivered", isEqualTo: true) .where("is_deleted", isEqualTo: false); var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) { - return Box.fromMap(data, id); + return Carton.fromMap(data, id); }); return paginator; } @@ -419,4 +419,15 @@ class BoxModel extends BaseModel { if (_delivered != null) _delivered.close(); _boxes = []; } + + Future> getCartons(String shipmentID) async { + String path = "/$cartons_collection"; + var querySnap = await Firestore.instance + .collection(path) + .where("shipment_id", isEqualTo: shipmentID) + .getDocuments(); + return querySnap.documents + .map((e) => Carton.fromMap(e.data, e.documentID)) + .toList(); + } } diff --git a/lib/pages/delivery/delivery_info.dart b/lib/pages/delivery/delivery_info.dart index c99a2bd..ec58deb 100644 --- a/lib/pages/delivery/delivery_info.dart +++ b/lib/pages/delivery/delivery_info.dart @@ -1,4 +1,4 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; @@ -25,7 +25,7 @@ import 'package:timeline_list/timeline_model.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); class DeliveryInfo extends StatefulWidget { - final Box box; + final Carton box; DeliveryInfo({this.box}); @override @@ -34,12 +34,12 @@ class DeliveryInfo extends StatefulWidget { class _DeliveryInfoState extends State { bool _isLoading = false; - Box _box; + Carton _box; String _selectedCartonType; String _shipmentNumber; List _packages = []; - List _mixBoxes = []; - Box _selectedShipmentBox = new Box(); + List _mixBoxes = []; + Carton _selectedShipmentBox = new Carton(); List _cargoTypes = []; DeliveryAddress _deliveryAddress = new DeliveryAddress(); TextEditingController _widthController = new TextEditingController(); diff --git a/lib/pages/delivery/delivery_list_row.dart b/lib/pages/delivery/delivery_list_row.dart index 2f33e9b..84b7543 100644 --- a/lib/pages/delivery/delivery_list_row.dart +++ b/lib/pages/delivery/delivery_list_row.dart @@ -1,5 +1,4 @@ -import 'package:fcs/domain/entities/box.dart'; -import 'package:fcs/pages/box/box_editor.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -8,7 +7,7 @@ import 'package:intl/intl.dart'; import 'delivery_info.dart'; class DeliveryListRow extends StatefulWidget { - final Box box; + final Carton box; const DeliveryListRow({this.box}); @override @@ -17,7 +16,7 @@ class DeliveryListRow extends StatefulWidget { class _DeliveryListRowState extends State { final double dotSize = 15.0; - Box _box = new Box(); + Carton _box = new Carton(); final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); @override diff --git a/lib/pages/delivery/model/delivery_model.dart b/lib/pages/delivery/model/delivery_model.dart index 9e165bd..519d5b5 100644 --- a/lib/pages/delivery/model/delivery_model.dart +++ b/lib/pages/delivery/model/delivery_model.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/domain/constants.dart'; -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/vo/message.dart'; @@ -13,10 +13,10 @@ import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; class DeliveryModel extends BaseModel { - List _cartons = []; + List _cartons = []; final log = Logger('BoxModel'); - List get cartons => - _selectedIndex == 1 ? _cartons : List.from(_delivered.values); + List get cartons => + _selectedIndex == 1 ? _cartons : List.from(_delivered.values); Paginator _delivered; int _selectedIndex = 1; @@ -35,8 +35,8 @@ class DeliveryModel extends BaseModel { // PackageModel.packages[2] ]; - List cartonList = [ - Box( + List cartonList = [ + Carton( shipmentNumber: "A202", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -68,7 +68,7 @@ class DeliveryModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A203", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -100,7 +100,7 @@ class DeliveryModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A204", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -132,7 +132,7 @@ class DeliveryModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "2", receiverName: "Ma Aye", @@ -163,7 +163,7 @@ class DeliveryModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "2", receiverName: "Ma Aye", @@ -193,7 +193,7 @@ class DeliveryModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "2", receiverName: "Ma Aye", @@ -223,7 +223,7 @@ class DeliveryModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A201", receiverNumber: "1", receiverName: "Ko Wai", @@ -253,7 +253,7 @@ class DeliveryModel extends BaseModel { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous', weight: 30) ]), - Box( + Carton( shipmentNumber: "A201", receiverNumber: "1", receiverName: "Ko Wai", @@ -317,7 +317,7 @@ class DeliveryModel extends BaseModel { .orderBy("date", descending: true); var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) { var m = Message.fromMap(data, id); - return Box( + return Carton( id: m.id, shipmentNumber: m.message, boxNumber: "1", @@ -332,7 +332,7 @@ class DeliveryModel extends BaseModel { Future _loadBoxes() async { if (user == null || !user.hasDeliveries()) return; - String path = "/$boxes_collection/"; + String path = "/$cartons_collection/"; if (listener != null) listener.cancel(); _cartons = []; try { @@ -342,8 +342,8 @@ class DeliveryModel extends BaseModel { .listen((QuerySnapshot snapshot) { _cartons.clear(); _cartons = snapshot.documents.map((documentSnapshot) { - var s = - Box.fromMap(documentSnapshot.data, documentSnapshot.documentID); + var s = Carton.fromMap( + documentSnapshot.data, documentSnapshot.documentID); return s; }).toList(); notifyListeners(); @@ -357,11 +357,11 @@ class DeliveryModel extends BaseModel { if (user == null || !user.hasDeliveries()) return null; var pageQuery = Firestore.instance - .collection("/$boxes_collection") + .collection("/$cartons_collection") .where("is_delivered", isEqualTo: true) .where("is_deleted", isEqualTo: false); var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) { - return Box.fromMap(data, id); + return Carton.fromMap(data, id); }); return paginator; } diff --git a/lib/pages/invoice/box_addition.dart b/lib/pages/invoice/box_addition.dart index 4a8aef5..882529d 100644 --- a/lib/pages/invoice/box_addition.dart +++ b/lib/pages/invoice/box_addition.dart @@ -1,14 +1,14 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/localization/app_translations.dart'; -import 'package:fcs/pages/box/model/box_model.dart'; +import 'package:fcs/pages/carton/model/carton_model.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class BoxAddition extends StatefulWidget { - final Box box; + final Carton box; BoxAddition({this.box}); @override @@ -16,7 +16,7 @@ class BoxAddition extends StatefulWidget { } class _BoxAdditionState extends State { - Box _box = new Box(); + Carton _box = new Carton(); bool _isLoading = false; @override @@ -34,7 +34,7 @@ class _BoxAdditionState extends State { @override Widget build(BuildContext context) { - var boxModel = Provider.of(context); + var boxModel = Provider.of(context); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( diff --git a/lib/pages/invoice/invoice_editor.dart b/lib/pages/invoice/invoice_editor.dart index 00e9293..840d4fd 100644 --- a/lib/pages/invoice/invoice_editor.dart +++ b/lib/pages/invoice/invoice_editor.dart @@ -1,4 +1,4 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/custom_duty.dart'; import 'package:fcs/domain/entities/discount.dart'; @@ -63,7 +63,7 @@ class _InvoiceEditorState extends State { Invoice _invoice; bool _isLoading = false; - List _boxes = []; + List _boxes = []; bool isSwitched = false; int deliveryfee = 0; double customFee = 10.0; @@ -76,7 +76,7 @@ class _InvoiceEditorState extends State { PaymentMethod paymentMethod; double volumetricRatio = 0; - List selectedBoxes = []; + List selectedBoxes = []; List customs = []; List _cargoTypes = [ @@ -130,7 +130,7 @@ class _InvoiceEditorState extends State { } _boxes = [ - Box( + Carton( shipmentNumber: "A202", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -152,7 +152,7 @@ class _InvoiceEditorState extends State { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous Cargo', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "3", receiverName: "Ko Myo Min", diff --git a/lib/pages/invoice/invoice_info.dart b/lib/pages/invoice/invoice_info.dart index b0313f8..7a6a9a0 100644 --- a/lib/pages/invoice/invoice_info.dart +++ b/lib/pages/invoice/invoice_info.dart @@ -1,4 +1,4 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/custom_duty.dart'; import 'package:fcs/domain/entities/discount.dart'; @@ -63,7 +63,7 @@ class _InvoiceInfoPageState extends State { Invoice _invoice; bool _isLoading = false; - List _boxes = []; + List _boxes = []; bool isSwitched = false; int deliveryfee = 0; double customFee = 0; @@ -75,7 +75,7 @@ class _InvoiceInfoPageState extends State { PaymentMethod paymentMethod; double volumetricRatio = 0; - List selectedBoxes = []; + List selectedBoxes = []; List customs = []; List _cargoTypes = [ @@ -122,7 +122,7 @@ class _InvoiceInfoPageState extends State { } _boxes = [ - Box( + Carton( shipmentNumber: "A202", receiverNumber: "3", receiverName: "Ko Myo Min", @@ -144,7 +144,7 @@ class _InvoiceInfoPageState extends State { CargoType(name: 'Medicine', weight: 20), CargoType(name: 'Dangerous Cargo', weight: 30) ]), - Box( + Carton( shipmentNumber: "A202", receiverNumber: "3", receiverName: "Ko Myo Min", diff --git a/lib/pages/main/home_page.dart b/lib/pages/main/home_page.dart index d2562bc..237784a 100644 --- a/lib/pages/main/home_page.dart +++ b/lib/pages/main/home_page.dart @@ -7,7 +7,7 @@ import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/shared_pref.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/localization/transalation.dart'; -import 'package:fcs/pages/box/box_list.dart'; +import 'package:fcs/pages/carton/box_list.dart'; import 'package:fcs/pages/chat/message_detail.dart'; import 'package:fcs/pages/chat/model/message_model.dart'; import 'package:fcs/pages/customer/customer_list.dart'; diff --git a/lib/pages/package/package_list.dart b/lib/pages/package/package_list.dart index abde531..701058c 100644 --- a/lib/pages/package/package_list.dart +++ b/lib/pages/package/package_list.dart @@ -97,11 +97,10 @@ class _PackageListState extends State { child: ListView.separated( controller: _controller, separatorBuilder: (context, index) => Divider( - color: Colors.black, + color: Colors.grey, + height: 1, ), scrollDirection: Axis.vertical, - padding: EdgeInsets.only(top: 15), - shrinkWrap: true, itemCount: packages.length, itemBuilder: (BuildContext context, int index) { return PackageListRow( diff --git a/lib/pages/package/package_list_row.dart b/lib/pages/package/package_list_row.dart index c8908f7..2ff3eb3 100644 --- a/lib/pages/package/package_list_row.dart +++ b/lib/pages/package/package_list_row.dart @@ -1,9 +1,10 @@ import 'package:fcs/domain/entities/package.dart'; -import 'package:fcs/pages/package/package_info.dart'; +import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; +import 'package:fcs/pages/package/package_info.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_icons/flutter_icons.dart'; import 'package:intl/intl.dart'; typedef CallbackPackageSelect(Package package); @@ -19,68 +20,76 @@ class PackageListRow extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.only(left: 15, right: 15), - child: InkWell( - onTap: () { - if (callbackPackageSelect != null) { - callbackPackageSelect(package); - return; - } - Navigator.push( - context, - CupertinoPageRoute(builder: (context) => PackageInfo(package: package)), - ); - }, - child: Row( - children: [ - Expanded( - child: new Padding( - padding: const EdgeInsets.symmetric(vertical: 16.0), - child: new Row( + return InkWell( + onTap: () { + if (callbackPackageSelect != null) { + callbackPackageSelect(package); + return; + } + Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => PackageInfo(package: package)), + ); + }, + child: Container( + padding: EdgeInsets.only(left: 15, right: 15), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: new Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: new Row( + children: [ + Icon(Octicons.package, color: primaryColor), + SizedBox(width: 8), + new Expanded( + child: new Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: new Text( + package.id == null ? '' : package.trackingID, + style: new TextStyle( + fontSize: 15.0, color: Colors.black), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: new Text( + package.market == null ? '' : package.market, + style: new TextStyle( + fontSize: 15.0, color: Colors.black), + ), + ), + ], + ), + ), + ], + ), + ), + ), + Column( children: [ - new Expanded( - child: new Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - package.id == null ? '' : package.trackingID, - style: new TextStyle( - fontSize: 15.0, color: Colors.black), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - package.market == null ? '' : package.market, - style: new TextStyle( - fontSize: 15.0, color: Colors.black), - ), - ), - ], + Padding( + padding: const EdgeInsets.all(3.0), + child: getStatus(package.currentStatus), + ), + Padding( + padding: const EdgeInsets.all(0), + child: new Text( + dateFormat.format(package.currentStatusDate), + style: + new TextStyle(fontSize: 15.0, color: Colors.grey), ), ), ], - ), - ), - ), - Column( - children: [ - Padding( - padding: const EdgeInsets.all(3.0), - child: getStatus(package.currentStatus), - ), - Padding( - padding: const EdgeInsets.all(0), - child: new Text( - dateFormat.format(package.currentStatusDate), - style: new TextStyle(fontSize: 15.0, color: Colors.grey), - ), - ), + ) ], - ) + ), ], ), ), diff --git a/lib/pages/rates/cargo_type_list.dart b/lib/pages/rates/cargo_type_list.dart index 9ae1e2f..4b4aa14 100644 --- a/lib/pages/rates/cargo_type_list.dart +++ b/lib/pages/rates/cargo_type_list.dart @@ -1,12 +1,5 @@ import 'package:fcs/domain/entities/cargo_type.dart'; -import 'package:fcs/domain/entities/custom_duty.dart'; -import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/box/cargo_type_editor.dart'; -import 'package:fcs/pages/delivery_address/delivery_address_editor.dart'; -import 'package:fcs/pages/main/util.dart'; -import 'package:fcs/pages/rates/custom_editor.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; @@ -14,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'cargo_editor.dart'; -import 'custom_row.dart'; import 'model/shipment_rate_model.dart'; class CargoTypeList extends StatefulWidget { diff --git a/lib/pages/rates/shipment_rates_calculate.dart b/lib/pages/rates/shipment_rates_calculate.dart index 4303005..792fda3 100644 --- a/lib/pages/rates/shipment_rates_calculate.dart +++ b/lib/pages/rates/shipment_rates_calculate.dart @@ -1,4 +1,4 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/helpers/theme.dart'; @@ -56,7 +56,8 @@ class _ShipmentRatesCalState extends State { double w = double.parse(_widthController.text, (s) => 0); double h = double.parse(_heightController.text, (s) => 0); _cargoType.weight = double.tryParse(_actualWeightCtl.text) ?? 0; - Box box = Box(cargoTypes: [_cargoType], length: l, width: w, height: h); + Carton box = + Carton(cargoTypes: [_cargoType], length: l, width: w, height: h); var amount = box.calAmount(rate); var shipmentWeight = box.getShipmentWeight(rate.volumetricRatio); var effectiveWeight = diff --git a/lib/pages/shipment/box_row.dart b/lib/pages/shipment/box_row.dart index db403bb..1739616 100644 --- a/lib/pages/shipment/box_row.dart +++ b/lib/pages/shipment/box_row.dart @@ -1,9 +1,9 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class BoxRow extends StatelessWidget { - final Box box; + final Carton box; const BoxRow({Key key, this.box}) : super(key: key); @@ -27,9 +27,7 @@ class BoxRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - box.deliveryAddress.fullName == null - ? '' - : box.deliveryAddress.fullName, + box.deliveryAddress?.fullName ?? "", style: new TextStyle( fontSize: 15.0, color: Colors.black, @@ -39,9 +37,7 @@ class BoxRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - box.deliveryAddress.addressLine1 == null - ? '' - : box.deliveryAddress.addressLine1, + box.deliveryAddress?.addressLine1 ?? "", style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), @@ -49,9 +45,7 @@ class BoxRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - box.deliveryAddress.addressLine2 == null - ? '' - : box.deliveryAddress.addressLine2, + box.deliveryAddress?.addressLine2 ?? "", style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), @@ -59,9 +53,7 @@ class BoxRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - box.deliveryAddress.city == null - ? '' - : box.deliveryAddress.city, + box.deliveryAddress?.city ?? "", style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), @@ -69,9 +61,7 @@ class BoxRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - box.deliveryAddress.state == null - ? '' - : box.deliveryAddress.state, + box.deliveryAddress?.state ?? "", style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), @@ -79,9 +69,7 @@ class BoxRow extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - box.deliveryAddress.phoneNumber == null - ? '' - : "Phone:${box.deliveryAddress.phoneNumber}", + box.deliveryAddress?.phoneNumber ?? "", style: new TextStyle( fontSize: 14.0, color: Colors.grey), ), diff --git a/lib/pages/shipment/model/shipment_model.dart b/lib/pages/shipment/model/shipment_model.dart index 9e59195..ebc0aaf 100644 --- a/lib/pages/shipment/model/shipment_model.dart +++ b/lib/pages/shipment/model/shipment_model.dart @@ -117,6 +117,7 @@ class ShipmentModel extends BaseModel { var q = Firestore.instance .collection("$path") .where("is_delivered", isEqualTo: false) + .where("is_canceled", isEqualTo: false) .where("is_deleted", isEqualTo: false); if (forCustomer) { @@ -144,6 +145,21 @@ class ShipmentModel extends BaseModel { shipment_courier_dropoff ]; + Future getShipment(String shipmentID) async { + String path = "/$shipments_collection"; + try { + var ref = Firestore.instance.collection("$path").document(shipmentID); + var snap = await ref.get(source: Source.server); + if (snap.exists) { + var s = Shipment.fromMap(snap.data, snap.documentID); + return s; + } + } catch (e) { + log.warning("Error!! $e"); + } + return null; + } + void initUser(user) { super.initUser(user); } @@ -155,4 +171,8 @@ class ShipmentModel extends BaseModel { Future updateShipment(Shipment shipment) { return Services.instance.shipmentService.updateShipment(shipment); } + + Future cancelShipment(Shipment shipment) { + return Services.instance.shipmentService.cancelShipment(shipment); + } } diff --git a/lib/pages/shipment/shipment_box_editor.dart b/lib/pages/shipment/shipment_box_editor.dart index 1a4594c..9b974f3 100644 --- a/lib/pages/shipment/shipment_box_editor.dart +++ b/lib/pages/shipment/shipment_box_editor.dart @@ -1,8 +1,8 @@ -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/box/cargo_type_editor.dart'; +import 'package:fcs/pages/carton/cargo_type_editor.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/rates/model/shipment_rate_model.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; @@ -20,7 +20,7 @@ import 'package:flutter_icons/flutter_icons.dart'; import 'package:provider/provider.dart'; class ShipmentBoxEditor extends StatefulWidget { - final Box box; + final Carton box; ShipmentBoxEditor({this.box}); @override @@ -32,7 +32,7 @@ class _ShipmentBoxEditorState extends State { TextEditingController _widthCtl = new TextEditingController(); TextEditingController _heightCtl = new TextEditingController(); - Box _box; + Carton _box; bool _isLoading = false; bool _isNew; double volumetricRatio = 0; @@ -57,7 +57,7 @@ class _ShipmentBoxEditorState extends State { Provider.of(context, listen: false); _isNew = true; - _box = Box(cargoTypes: []); + _box = Carton(cargoTypes: []); _box.deliveryAddress = shipmentModel.defalutAddress; _lengthCtl.text = "12"; diff --git a/lib/pages/shipment/shipment_editor.dart b/lib/pages/shipment/shipment_editor.dart index c17eac9..5094612 100644 --- a/lib/pages/shipment/shipment_editor.dart +++ b/lib/pages/shipment/shipment_editor.dart @@ -1,9 +1,8 @@ import 'package:fcs/domain/constants.dart'; -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/shipment.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/box/model/box_model.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/main/util.dart'; @@ -11,24 +10,23 @@ import 'package:fcs/pages/shipment/model/shipment_model.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; import 'package:fcs/pages/widgets/delivery_address_selection.dart'; import 'package:fcs/pages/widgets/display_text.dart'; +import 'package:fcs/pages/widgets/fcs_id_icon.dart'; import 'package:fcs/pages/widgets/input_date.dart'; import 'package:fcs/pages/widgets/input_time.dart'; import 'package:fcs/pages/widgets/local_button.dart'; -import 'package:fcs/pages/widgets/local_dropdown.dart'; import 'package:fcs/pages/widgets/local_radio_buttons.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/local_title.dart'; -import 'package:fcs/pages/widgets/multi_img_controller.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.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:url_launcher/url_launcher.dart'; import 'box_row.dart'; import 'shipment_box_editor.dart'; +import 'widgets.dart'; class ShipmentEditor extends StatefulWidget { final Shipment shipment; @@ -40,55 +38,37 @@ class ShipmentEditor extends StatefulWidget { class _ShipmentEditorState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); - final numberFormatter = new NumberFormat("#,###"); - MultiImgController multiImgController = MultiImgController(); + var timeFormatter = new DateFormat('jm'); - TextEditingController _addressEditingController = new TextEditingController(); TextEditingController _fromTimeEditingController = new TextEditingController(); TextEditingController _toTimeEditingController = new TextEditingController(); - TextEditingController _noOfPackageEditingController = - new TextEditingController(); - TextEditingController _weightEditingController = new TextEditingController(); - TextEditingController _recipientNameEditingController = - new TextEditingController(); - TextEditingController _recipientPhoneEditingController = - new TextEditingController(); - TextEditingController _recipientAddressEditingController = - new TextEditingController(); TextEditingController _pickupDate = new TextEditingController(); - TextEditingController _handlingFeeController = new TextEditingController(); Shipment _shipment; bool _isLoading = false; var now = new DateTime.now(); bool _isNew; - int _currVal = 1; String _selectedShipmentType; @override void initState() { super.initState(); - _selectedShipmentType = shipment_local_pickup; if (widget.shipment != null) { _isNew = false; _shipment = widget.shipment; - _addressEditingController.text = _shipment.address; + _selectedShipmentType = _shipment.shipmentType; _fromTimeEditingController.text = _shipment.pickupTimeStart; _toTimeEditingController.text = _shipment.pickupTimeEnd; - _noOfPackageEditingController.text = _shipment.numberOfPackage.toString(); - _weightEditingController.text = _shipment.weight.toString(); _pickupDate.text = dateFormatter.format(_shipment.pickupDate ?? now); - // _handlingFeeController.text = - // numberFormatter.format(_shipment.handlingFee); - _currVal = _shipment.radioIndex; } else { _isNew = true; + _selectedShipmentType = shipment_local_pickup; _pickupDate.text = dateFormatter.format(now); - _fromTimeEditingController.text = "${(now.hour)}:${(now.minute)}"; - _toTimeEditingController.text = "${(now.hour)}:${(now.minute)}"; + _fromTimeEditingController.text = "${timeFormatter.format(now)}"; + _toTimeEditingController.text = "${timeFormatter.format(now)}"; _shipment = Shipment(boxes: []); var shipmentModel = Provider.of(context, listen: false); @@ -106,7 +86,11 @@ class _ShipmentEditorState extends State { Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); ShipmentModel pickupModel = Provider.of(context); - + final shipmentNumberBox = getShipmentNumberStatus(context, _shipment); + bool isLocalPickup = _selectedShipmentType == shipment_local_pickup; + bool isCourierPickup = _selectedShipmentType == shipment_courier_pickup; + bool isLocalDropoff = _selectedShipmentType == shipment_local_dropoff; + bool isCourierDropoff = _selectedShipmentType == shipment_courier_dropoff; final fromTimeBox = InputTime( labelTextKey: 'shipment.from', iconData: Icons.timer, @@ -124,20 +108,17 @@ class _ShipmentEditorState extends State { iconData: Icons.date_range, controller: _pickupDate, ); - final localDropoffAddress = DisplayText( - iconData: Icons.location_on, - labelTextKey: "Local Dropoff Address", - text: mainModel.setting.usaAddress); - final curierDropoffAddress = FloatingActionButton.extended( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - onPressed: () {}, - icon: Icon(Icons.arrow_right), - label: Text( - 'Visit courier websie for nearest drop-off', - style: TextStyle(fontSize: 12), - ), - backgroundColor: primaryColor, - ); + final curierDropoffAddress = Padding( + padding: EdgeInsets.all(8), + child: FloatingActionButton.extended( + onPressed: _openCourierWebsite, + icon: Icon(Icons.open_in_new, color: primaryColor), + label: Text( + 'Visit courier websie \nfor nearest drop-off', + style: TextStyle(fontSize: 16, color: primaryColor), + ), + backgroundColor: Colors.white, + )); final pickupAddressBox = DefaultDeliveryAddress( deliveryAddress: _shipment.pickupAddress, iconData: Icons.location_on, @@ -156,28 +137,22 @@ class _ShipmentEditorState extends State { }); }, ); - var boxModel = Provider.of(context); - var handlingFeeBox = DisplayText( - labelTextKey: "shipment.handling.fee", - text: "10", - iconData: FontAwesomeIcons.moneyBill); - var shipmentTypeBox = LocalDropdown( - callback: (v) { - setState(() { - _selectedShipmentType = v; - }); - }, - iconData: SimpleLineIcons.direction, - selectedValue: _selectedShipmentType, - values: pickupModel.shipmentTypes, - ); + var localDropoffAddressBox = Row(children: [ + FcsIDIcon(), + Expanded( + child: DisplayText( + text: mainModel.setting.usaAddress, + ), + ) + ]); final createBtn = LocalButton( textKey: "shipment.create", - callBack: _create, + callBack: _save, ); final updateBtn = LocalButton( textKey: "shipment.update", + callBack: _save, ); return LocalProgress( @@ -205,6 +180,7 @@ class _ShipmentEditorState extends State { padding: const EdgeInsets.all(10.0), child: ListView( children: [ + _isNew ? Container() : Center(child: shipmentNumberBox), LocalTitle(textKey: "shipment.type"), LocalRadioButtons( values: pickupModel.shipmentTypes, @@ -214,16 +190,28 @@ class _ShipmentEditorState extends State { _selectedShipmentType = v; }); }), - // handlingFeeBox, - // shipmentTypeBox, - LocalTitle(textKey: "shipment.location"), - pickupAddressBox, - LocalTitle(textKey: "shipment.date.time"), - pickupDateBox, - fromTimeBox, - toTimeBox, - // localDropoffAddress, - // curierDropoffAddress, + ...(isLocalDropoff + ? [ + LocalTitle(textKey: "shipment.location.dropoff"), + localDropoffAddressBox + ] + : []), + ...(isCourierDropoff + ? [ + LocalTitle(textKey: "shipment.courier.dropoff"), + curierDropoffAddress + ] + : []), + ...(isCourierPickup || isLocalPickup + ? [ + LocalTitle(textKey: "shipment.location"), + pickupAddressBox, + LocalTitle(textKey: "shipment.date.time"), + pickupDateBox, + fromTimeBox, + toTimeBox, + ] + : []), LocalTitle( textKey: "boxes.name", trailing: IconButton( @@ -232,7 +220,7 @@ class _ShipmentEditorState extends State { color: primaryColor, ), onPressed: () async { - Box box = await Navigator.push( + Carton box = await Navigator.push( context, CupertinoPageRoute( builder: (context) => ShipmentBoxEditor()), @@ -252,11 +240,11 @@ class _ShipmentEditorState extends State { ); } - List getBoxList(BuildContext context, List boxes) { + List getBoxList(BuildContext context, List boxes) { return boxes.asMap().entries.map((_box) { return InkWell( onTap: () async { - Box box = await Navigator.of(context).push(CupertinoPageRoute( + Carton box = await Navigator.of(context).push(CupertinoPageRoute( builder: (context) => ShipmentBoxEditor(box: _box.value))); _saveBox(box); }, @@ -267,7 +255,7 @@ class _ShipmentEditorState extends State { onTap: () => _removeBox(_box.value), child: Padding( padding: const EdgeInsets.all(8.0), - child: Icon(Icons.remove, color: primaryColor), + child: Icon(Icons.remove_circle, color: primaryColor), ), ), ], @@ -276,24 +264,25 @@ class _ShipmentEditorState extends State { }).toList(); } - _addBox(Box box) { + _addBox(Carton box) { if (box == null) return; + box.cartonType = carton_from_shipments; _shipment.boxes.add(box); setState(() {}); } - _saveBox(Box box) { + _saveBox(Carton box) { if (box == null) return; setState(() {}); } - _removeBox(Box box) { + _removeBox(Carton box) { if (box == null) return; _shipment.boxes.remove(box); setState(() {}); } - _create() async { + _save() async { _shipment.shipmentType = this._selectedShipmentType; _shipment.pickupDate = dateFormatter.parse(_pickupDate.text); _shipment.pickupTimeStart = _fromTimeEditingController.text; @@ -307,9 +296,9 @@ class _ShipmentEditorState extends State { if (_isNew) { await shipmentModel.createShipment(_shipment); } else { - await shipmentModel.createShipment(_shipment); + await shipmentModel.updateShipment(_shipment); } - Navigator.pop(context); + Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { @@ -318,4 +307,9 @@ class _ShipmentEditorState extends State { }); } } + + _openCourierWebsite() { + MainModel mainModel = Provider.of(context, listen: false); + launch("${mainModel.setting.courierWebsite}"); + } } diff --git a/lib/pages/shipment/shipment_info.dart b/lib/pages/shipment/shipment_info.dart index c201d82..d453daa 100644 --- a/lib/pages/shipment/shipment_info.dart +++ b/lib/pages/shipment/shipment_info.dart @@ -1,17 +1,18 @@ import 'package:fcs/domain/constants.dart'; -import 'package:fcs/domain/entities/box.dart'; +import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/shipment.dart'; -import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/box/model/box_model.dart'; +import 'package:fcs/pages/carton/model/carton_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; +import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/shipment/model/shipment_model.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; -import 'package:fcs/pages/widgets/delivery_address_selection.dart'; import 'package:fcs/pages/widgets/display_text.dart'; -import 'package:fcs/pages/widgets/input_date.dart'; -import 'package:fcs/pages/widgets/input_time.dart'; +import 'package:fcs/pages/widgets/fcs_id_icon.dart'; +import 'package:fcs/pages/widgets/local_button.dart'; import 'package:fcs/pages/widgets/local_dropdown.dart'; +import 'package:fcs/pages/widgets/local_popup_menu_button.dart'; +import 'package:fcs/pages/widgets/local_popupmenu.dart'; import 'package:fcs/pages/widgets/local_radio_buttons.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/local_title.dart'; @@ -23,8 +24,11 @@ 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:url_launcher/url_launcher.dart'; import 'box_row.dart'; +import 'shipment_editor.dart'; +import 'widgets.dart'; class ShipmentInfo extends StatefulWidget { final Shipment shipment; @@ -38,6 +42,7 @@ class _ShipmentInfoState extends State { var dateFormatter = new DateFormat('dd MMM yyyy'); final numberFormatter = new NumberFormat("#,###"); MultiImgController multiImgController = MultiImgController(); + var timeFormatter = new DateFormat('jm'); TextEditingController _addressEditingController = new TextEditingController(); TextEditingController _fromTimeEditingController = @@ -59,14 +64,11 @@ class _ShipmentInfoState extends State { bool _isLoading = false; var now = new DateTime.now(); - int _currVal = 1; - String _selectedShipmentType; - @override void initState() { super.initState(); - _selectedShipmentType = shipment_local_pickup; _shipment = widget.shipment; + _loadCartons(_shipment.id); if (widget.shipment != null) { _addressEditingController.text = _shipment.address; @@ -77,10 +79,17 @@ class _ShipmentInfoState extends State { _pickupDate.text = dateFormatter.format(_shipment.pickupDate ?? now); // _handlingFeeController.text = // numberFormatter.format(_shipment.handlingFee); - _currVal = _shipment.radioIndex; } } + _loadCartons(String shipmentID) async { + CartonModel cartonModel = Provider.of(context, listen: false); + var cartons = await cartonModel.getCartons(shipmentID); + setState(() { + _shipment.boxes = cartons; + }); + } + @override void dispose() { super.dispose(); @@ -90,70 +99,61 @@ class _ShipmentInfoState extends State { Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); ShipmentModel pickupModel = Provider.of(context); + bool isLocalPickup = _shipment.shipmentType == shipment_local_pickup; + bool isCourierPickup = _shipment.shipmentType == shipment_courier_pickup; + bool isLocalDropoff = _shipment.shipmentType == shipment_local_dropoff; + bool isCourierDropoff = _shipment.shipmentType == shipment_courier_dropoff; - final fromTimeBox = InputTime( - labelTextKey: 'shipment.from', - iconData: Icons.timer, - controller: _fromTimeEditingController); + final shipmentNumberBox = getShipmentNumberStatus(context, _shipment); - final toTimeBox = Container( - width: 150, - child: InputTime( - iconData: Icons.timer_off, - labelTextKey: 'shipment.to', - controller: _toTimeEditingController)); + final fromTimeBox = DisplayText( + labelTextKey: 'shipment.from', + iconData: Icons.timer, + text: _shipment.pickupTimeStart, + ); + final toTimeBox = DisplayText( + labelTextKey: 'shipment.to', + iconData: Icons.timer_off, + text: _shipment.pickupTimeEnd, + ); - final pickupDateBox = InputDate( + final pickupDateBox = DisplayText( labelTextKey: "shipment.date", iconData: Icons.date_range, - controller: _pickupDate, - ); - final localDropoffAddress = DisplayText( - iconData: Icons.location_on, - labelTextKey: "Local Dropoff Address", - text: mainModel.setting.usaAddress); - final curierDropoffAddress = FloatingActionButton.extended( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - onPressed: () {}, - icon: Icon(Icons.arrow_right), - label: Text( - 'Visit courier websie for nearest drop-off', - style: TextStyle(fontSize: 12), - ), - backgroundColor: primaryColor, + text: dateFormatter.format(_shipment.pickupDate), ); + var localDropoffAddressBox = Row(children: [ + FcsIDIcon(), + Expanded( + child: DisplayText( + text: mainModel.setting.usaAddress, + ), + ) + ]); + final curierDropoffAddress = Padding( + padding: EdgeInsets.all(8), + child: FloatingActionButton.extended( + onPressed: _openCourierWebsite, + icon: Icon(Icons.open_in_new, color: primaryColor), + label: Text( + 'Visit courier websie \nfor nearest drop-off', + style: TextStyle(fontSize: 16, color: primaryColor), + ), + backgroundColor: Colors.white, + )); final pickupAddressBox = DefaultDeliveryAddress( deliveryAddress: _shipment.pickupAddress, iconData: Icons.location_on, labelKey: "shipment.location", - onTap: () async { - DeliveryAddress address = await Navigator.push( - context, - CupertinoPageRoute( - builder: (context) => DeliveryAddressSelection( - deliveryAddress: _shipment.pickupAddress, - )), - ); - if (address == null) return; - setState(() { - _shipment.pickupAddress = address; - }); - }, ); - var boxModel = Provider.of(context); + var boxModel = Provider.of(context); var handlingFeeBox = DisplayText( labelTextKey: "shipment.handling.fee", text: "10", iconData: FontAwesomeIcons.moneyBill); - var shipmentTypeBox = LocalDropdown( - callback: (v) { - setState(() { - _selectedShipmentType = v; - }); - }, - iconData: SimpleLineIcons.direction, - selectedValue: _selectedShipmentType, - values: pickupModel.shipmentTypes, + final cancelBtn = LocalButton( + textKey: "btn.cancel", + callBack: _cancel, ); return LocalProgress( @@ -180,44 +180,55 @@ class _ShipmentInfoState extends State { IconButton( icon: Icon(Icons.edit, color: primaryColor), onPressed: _edit, - ) + ), ]), body: Padding( padding: const EdgeInsets.all(10.0), child: ListView( children: [ + shipmentNumberBox, + LocalTitle(textKey: "shipment.type"), LocalRadioButtons( - values: pickupModel.shipmentTypes, - selectedValue: _selectedShipmentType, - callback: (v) { - setState(() { - _selectedShipmentType = v; - }); - }), + readOnly: true, + values: pickupModel.shipmentTypes, + selectedValue: _shipment.shipmentType, + ), // handlingFeeBox, // shipmentTypeBox, - LocalTitle(textKey: "shipment.location"), - pickupAddressBox, - LocalTitle(textKey: "shipment.date.time"), - pickupDateBox, - fromTimeBox, - toTimeBox, + ...(isLocalDropoff + ? [ + LocalTitle(textKey: "shipment.location.dropoff"), + localDropoffAddressBox + ] + : []), + ...(isCourierDropoff + ? [ + LocalTitle(textKey: "shipment.courier.dropoff"), + curierDropoffAddress + ] + : []), + ...(isCourierPickup || isLocalPickup + ? [ + LocalTitle(textKey: "shipment.location"), + pickupAddressBox, + LocalTitle(textKey: "shipment.date.time"), + pickupDateBox, + fromTimeBox, + toTimeBox, + ] + : []), // localDropoffAddress, // curierDropoffAddress, LocalTitle( textKey: "boxes.name", - trailing: IconButton( - icon: Icon( - Icons.add_circle, - color: primaryColor, - ), - onPressed: () async {}, - ), ), - // Column( - // children: getBoxList(context, _shipment.boxes), - // ), + Column( + children: getBoxList(context, _shipment.boxes), + ), + _shipment.currentStatus == shipment_pending_status + ? cancelBtn + : Container() ], ), ), @@ -225,24 +236,62 @@ class _ShipmentInfoState extends State { ); } - List getBoxList(BuildContext context, List boxes) { + List getBoxList(BuildContext context, List boxes) { + if (boxes == null) return []; return boxes.asMap().entries.map((_box) { - return InkWell( - onTap: () async {}, - child: Row( - children: [ - Expanded(child: BoxRow(box: _box.value)), - InkWell( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Icon(Icons.remove, color: primaryColor), - ), - ), - ], - ), + return Row( + children: [ + Expanded(child: BoxRow(box: _box.value)), + ], ); }).toList(); } - _edit() {} + _edit() async { + bool updated = await Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => ShipmentEditor( + shipment: _shipment, + )), + ); + if (updated ?? false) { + ShipmentModel shipmentModel = + Provider.of(context, listen: false); + Shipment s = await shipmentModel.getShipment(_shipment.id); + setState(() { + _shipment = s; + }); + await _loadCartons(s.id); + } + } + + _cancel() { + showConfirmDialog(context, "shipment.cancel.confirm", () { + _cancelShipment(); + }); + } + + _cancelShipment() async { + setState(() { + _isLoading = true; + }); + try { + ShipmentModel shipmentModel = + Provider.of(context, listen: false); + await shipmentModel.cancelShipment(_shipment); + Navigator.pop(context, true); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + _openCourierWebsite() { + MainModel mainModel = Provider.of(context, listen: false); + launch("${mainModel.setting.courierWebsite}"); + } } diff --git a/lib/pages/shipment/shipment_list.dart b/lib/pages/shipment/shipment_list.dart index 018f36c..5f3ad78 100644 --- a/lib/pages/shipment/shipment_list.dart +++ b/lib/pages/shipment/shipment_list.dart @@ -101,14 +101,14 @@ class _ShipmentListState extends State { child: ListView.separated( controller: _controller, separatorBuilder: (context, index) => Divider( - color: Colors.black, + color: Colors.grey, + height: 1, ), scrollDirection: Axis.vertical, - padding: EdgeInsets.only(top: 15), - shrinkWrap: true, itemCount: shipmentModel.shipments.length, itemBuilder: (BuildContext context, int index) { return ShipmentListRow( + key: ValueKey(shipmentModel.shipments[index].id), pickUp: shipmentModel.shipments[index]); }), onRefresh: () => diff --git a/lib/pages/shipment/shipment_list_row.dart b/lib/pages/shipment/shipment_list_row.dart index df921a7..35bb9dd 100644 --- a/lib/pages/shipment/shipment_list_row.dart +++ b/lib/pages/shipment/shipment_list_row.dart @@ -1,49 +1,25 @@ import 'package:fcs/domain/entities/shipment.dart'; import 'package:fcs/helpers/theme.dart'; -import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import '../main/util.dart'; -import 'shipment_editor.dart'; import 'shipment_info.dart'; -class ShipmentListRow extends StatefulWidget { +class ShipmentListRow extends StatelessWidget { final Shipment pickUp; - const ShipmentListRow({this.pickUp}); - - @override - _ShipmentListRowState createState() => _ShipmentListRowState(); -} - -class _ShipmentListRowState extends State { - final double dotSize = 15.0; - Shipment _pickUp = new Shipment(); - - @override - void initState() { - super.initState(); - // PickUpModel pickUpModel = Provider.of(context, listen: false); - if (widget.pickUp != null) { - _pickUp = widget.pickUp; - // pickUpModel.pickups.forEach((b) { - // if (widget.pickUp.id == b.id) { - // _pickUp = b; - // } - // }); - } - } + const ShipmentListRow({Key key, this.pickUp}) : super(key: key); @override Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.only(left: 15, right: 15), - child: InkWell( - onTap: () { - Navigator.of(context).push(CupertinoPageRoute( - builder: (context) => ShipmentInfo(shipment: _pickUp))); - }, + return InkWell( + onTap: () { + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => ShipmentInfo(shipment: pickUp))); + }, + child: Container( + padding: EdgeInsets.only(left: 15, right: 15), child: Row( children: [ Expanded( @@ -64,7 +40,7 @@ class _ShipmentListRowState extends State { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - _pickUp.shipmentNumber, + pickUp.shipmentNumber, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), @@ -72,9 +48,9 @@ class _ShipmentListRowState extends State { Padding( padding: const EdgeInsets.only(left: 10.0, top: 10), child: new Text( - _pickUp.id == null + pickUp.id == null ? '' - : "Last ${_pickUp.last} days", + : "Last ${pickUp.last} days", style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), @@ -90,23 +66,23 @@ class _ShipmentListRowState extends State { children: [ Padding( padding: const EdgeInsets.all(0), - child: getStatus(_pickUp.currentStatus), + child: getStatus(pickUp.currentStatus), ), Padding( padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5), child: Row( children: [ new Text( - _pickUp.weight == null + pickUp.weight == null ? '' - : _pickUp.weight.toString() + 'lb - ', + : pickUp.weight.toString() + 'lb - ', style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), new Text( - _pickUp.numberOfPackage == null + pickUp.numberOfPackage == null ? "" - : _pickUp.numberOfPackage.toString() + ' packages', + : pickUp.numberOfPackage.toString() + ' packages', style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), diff --git a/lib/pages/shipment/widgets.dart b/lib/pages/shipment/widgets.dart new file mode 100644 index 0000000..175f116 --- /dev/null +++ b/lib/pages/shipment/widgets.dart @@ -0,0 +1,24 @@ +import 'package:fcs/domain/entities/shipment.dart'; +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:flutter/material.dart'; + +Widget getShipmentNumberStatus(BuildContext context, Shipment shipment) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + LocalText( + context, + '', + text: shipment.shipmentNumber ?? "", + color: primaryColor, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Chip(label: Text(shipment.currentStatus ?? "")), + ), + ], + ); +} diff --git a/lib/pages/widgets/input_time.dart b/lib/pages/widgets/input_time.dart index 06f65ae..1311bf6 100644 --- a/lib/pages/widgets/input_time.dart +++ b/lib/pages/widgets/input_time.dart @@ -3,6 +3,7 @@ import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/main/model/language_model.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class InputTime extends StatelessWidget { @@ -42,18 +43,25 @@ class InputTime extends StatelessWidget { var initialDate = TimeOfDay.now(); if (controller != null) { try { - var values = controller.text.split(":"); - initialDate = TimeOfDay( - hour: int.parse(values[0]), minute: int.parse(values[1])); + final format = DateFormat.jm(); //"6:00 AM" + initialDate = + TimeOfDay.fromDateTime(format.parse(controller.text)); + // var values = controller.text.split(":"); + // initialDate = TimeOfDay( + // hour: int.parse(values[0]), minute: int.parse(values[1])); } catch (e) {} // ignore error } - var t = await showTimePicker( + TimeOfDay t = await showTimePicker( initialTime: initialDate, context: context, ); if (t != null && controller != null) { - controller.text = "${t.hour} : ${t.minute}"; + final format = DateFormat.jm(); //"6:00 AM" + final now = new DateTime.now(); + final dt = + DateTime(now.year, now.month, now.day, t.hour, t.minute); + controller.text = "${format.format(dt)}"; } }, controller: controller, diff --git a/lib/pages/widgets/local_popup_menu_button.dart b/lib/pages/widgets/local_popup_menu_button.dart index 3132ac5..90f2d90 100644 --- a/lib/pages/widgets/local_popup_menu_button.dart +++ b/lib/pages/widgets/local_popup_menu_button.dart @@ -10,11 +10,13 @@ class LocalPopupMenuButton extends StatefulWidget { final PopupMenuCallback popupMenuCallback; final List popmenus; final bool multiSelect; + final IconData buttonIcon; const LocalPopupMenuButton( {Key key, this.popupMenuCallback, this.popmenus, + this.buttonIcon, this.multiSelect = false}) : super(key: key); @@ -69,7 +71,7 @@ class _LocalPopupMenuButtonState extends State { fit: StackFit.expand, children: [ Icon( - Icons.filter_list, + widget.buttonIcon ?? Icons.filter_list, color: primaryColor, ), hightlight diff --git a/lib/pages/widgets/local_radio_buttons.dart b/lib/pages/widgets/local_radio_buttons.dart index e45baa8..e2b2f96 100644 --- a/lib/pages/widgets/local_radio_buttons.dart +++ b/lib/pages/widgets/local_radio_buttons.dart @@ -7,14 +7,22 @@ class LocalRadioButtons extends StatelessWidget { final IconData iconData; final T selectedValue; final List values; + final bool readOnly; + final bool hideUnselected; const LocalRadioButtons( - {Key key, this.callback, this.iconData, this.selectedValue, this.values}) + {Key key, + this.callback, + this.iconData, + this.selectedValue, + this.values, + this.readOnly = false, + this.hideUnselected = true}) : super(key: key); @override Widget build(BuildContext context) { - return Column(children: getChildren()); + return Column(children: readOnly ? getReadonlyChildren() : getChildren()); } List getChildren() { @@ -38,4 +46,28 @@ class LocalRadioButtons extends StatelessWidget { ))) .toList(); } + + List getReadonlyChildren() { + return values + .toList() + .map((e) => hideUnselected && e == selectedValue + ? SizedBox( + height: 30, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + e == selectedValue ? Icons.check : Icons.remove, + color: + e == selectedValue ? primaryColor : Colors.grey, + ), + ), + Text(e.toString()), + ]), + ) + : Container()) + .toList(); + } }