add paginator in boxes and deliveries
This commit is contained in:
@@ -66,8 +66,8 @@ class _BoxEditorState extends State<BoxEditor> {
|
||||
// for packages
|
||||
var packageModel = Provider.of<PackageModel>(context, listen: false);
|
||||
_packages = [
|
||||
packageModel.packages[0],
|
||||
packageModel.packages[1],
|
||||
// packageModel.packages[0],
|
||||
// packageModel.packages[1],
|
||||
];
|
||||
_packages.forEach((p) {
|
||||
p.isChecked = false;
|
||||
@@ -75,10 +75,18 @@ class _BoxEditorState extends State<BoxEditor> {
|
||||
|
||||
//for shipment boxes
|
||||
var boxModel = Provider.of<BoxModel>(context, listen: false);
|
||||
_shipmentBoxes = [boxModel.boxes[0], boxModel.boxes[1], boxModel.boxes[2]];
|
||||
_shipmentBoxes = [
|
||||
boxModel.boxeList[0],
|
||||
boxModel.boxeList[1],
|
||||
boxModel.boxeList[2]
|
||||
];
|
||||
|
||||
//for mix boxes
|
||||
_mixBoxes = [boxModel.boxes[0], boxModel.boxes[1], boxModel.boxes[2]];
|
||||
_mixBoxes = [
|
||||
boxModel.boxeList[0],
|
||||
boxModel.boxeList[1],
|
||||
boxModel.boxeList[2]
|
||||
];
|
||||
_mixBoxes.forEach((b) {
|
||||
b.isChecked = false;
|
||||
});
|
||||
@@ -101,6 +109,7 @@ class _BoxEditorState extends State<BoxEditor> {
|
||||
_lengthController.text = _box.length.toString();
|
||||
_selectedCartonType = _box.cartonType;
|
||||
isNew = false;
|
||||
user = User(fcsID: _box.fcsID, name: _box.userName);
|
||||
} else {
|
||||
_cargoTypes = [
|
||||
CargoType(id: "1", name: 'General', weight: 25),
|
||||
|
||||
@@ -1,25 +1,18 @@
|
||||
import 'package:fcs/domain/constants.dart';
|
||||
import 'package:fcs/domain/entities/box.dart';
|
||||
import 'package:fcs/domain/entities/cargo_type.dart';
|
||||
import 'package:fcs/domain/entities/package.dart';
|
||||
import 'package:fcs/domain/vo/delivery_address.dart';
|
||||
import 'package:fcs/helpers/theme.dart';
|
||||
import 'package:fcs/pages/main/model/main_model.dart';
|
||||
import 'package:fcs/pages/main/util.dart';
|
||||
import 'package:fcs/pages/package/model/package_model.dart';
|
||||
import 'package:fcs/pages/rates/model/shipment_rate_model.dart';
|
||||
import 'package:fcs/pages/widgets/bottom_up_page_route.dart';
|
||||
import 'package:fcs/pages/widgets/defalut_delivery_address.dart';
|
||||
import 'package:fcs/pages/widgets/display_text.dart';
|
||||
import 'package:fcs/pages/widgets/fcs_id_icon.dart';
|
||||
import 'package:fcs/pages/widgets/length_picker.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/multi_img_file.dart';
|
||||
import 'package:fcs/pages/widgets/progress.dart';
|
||||
import 'package:fcs/pages/widgets/status_tree.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_icons/flutter_icons.dart';
|
||||
@@ -48,7 +41,7 @@ class _BoxInfoState extends State<BoxInfo> {
|
||||
String _shipmentNumber;
|
||||
List<Package> _packages = [];
|
||||
List<Box> _mixBoxes = [];
|
||||
Box _selectedShipmentBox;
|
||||
Box _selectedShipmentBox = new Box();
|
||||
List<CargoType> _cargoTypes = [];
|
||||
DeliveryAddress _deliveryAddress = new DeliveryAddress();
|
||||
TextEditingController _widthController = new TextEditingController();
|
||||
@@ -66,8 +59,8 @@ class _BoxInfoState extends State<BoxInfo> {
|
||||
// for packages
|
||||
var packageModel = Provider.of<PackageModel>(context, listen: false);
|
||||
_packages = [
|
||||
packageModel.packages[0],
|
||||
packageModel.packages[1],
|
||||
// packageModel.packages[0],
|
||||
// packageModel.packages[1],
|
||||
];
|
||||
_packages.forEach((p) {
|
||||
p.isChecked = false;
|
||||
@@ -75,10 +68,14 @@ class _BoxInfoState extends State<BoxInfo> {
|
||||
|
||||
//for shipment boxes
|
||||
var boxModel = Provider.of<BoxModel>(context, listen: false);
|
||||
_selectedShipmentBox = boxModel.boxes[0];
|
||||
_selectedShipmentBox = boxModel.boxeList[0];
|
||||
|
||||
//for mix boxes
|
||||
_mixBoxes = [boxModel.boxes[0], boxModel.boxes[1], boxModel.boxes[2]];
|
||||
_mixBoxes = [
|
||||
boxModel.boxeList[0],
|
||||
boxModel.boxeList[1],
|
||||
boxModel.boxeList[2]
|
||||
];
|
||||
_mixBoxes.forEach((b) {
|
||||
b.isChecked = false;
|
||||
});
|
||||
@@ -115,6 +112,7 @@ class _BoxInfoState extends State<BoxInfo> {
|
||||
|
||||
final DateFormat dateFormat = DateFormat("d MMM yyyy");
|
||||
List<TimelineModel> _models() {
|
||||
if (_box.shipmentHistory == null) return [];
|
||||
// return [];
|
||||
return _box.shipmentHistory
|
||||
.map((e) => TimelineModel(
|
||||
@@ -155,7 +153,19 @@ class _BoxInfoState extends State<BoxInfo> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var boxModel = Provider.of<BoxModel>(context);
|
||||
final cargoType = Container(
|
||||
height: 30,
|
||||
padding: EdgeInsets.only(left: 15),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.check_circle, color: primaryColor),
|
||||
SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(_selectedCartonType),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
final shipmentBox = DisplayText(
|
||||
text: _shipmentNumber == null ? "" : _shipmentNumber,
|
||||
@@ -464,10 +474,7 @@ class _BoxInfoState extends State<BoxInfo> {
|
||||
height: 10,
|
||||
),
|
||||
LocalTitle(textKey: "box.type.title"),
|
||||
LocalRadioButtons(
|
||||
values: boxModel.cartonTypes,
|
||||
selectedValue: _selectedCartonType,
|
||||
callback: (v) {}),
|
||||
cargoType,
|
||||
LocalTitle(textKey: "box.shipment_info"),
|
||||
shipmentBox,
|
||||
fcsIDBox,
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
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/widgets/bottom_up_page_route.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';
|
||||
@@ -20,11 +18,17 @@ class BoxList extends StatefulWidget {
|
||||
|
||||
class _BoxListState extends State<BoxList> {
|
||||
bool _isLoading = false;
|
||||
bool _showDelivered = false;
|
||||
var _controller = ScrollController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_controller.addListener(() async {
|
||||
if (_controller.position.pixels == _controller.position.maxScrollExtent) {
|
||||
Provider.of<BoxModel>(context, listen: false).loadMore();
|
||||
}
|
||||
});
|
||||
Provider.of<BoxModel>(context, listen: false).initData();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -37,11 +41,17 @@ class _BoxListState extends State<BoxList> {
|
||||
var boxModel = Provider.of<BoxModel>(context);
|
||||
final popupMenu = LocalPopupMenuButton(
|
||||
popmenus: [
|
||||
LocalPopupMenu(id: 1, textKey: "box.popupmenu.active", selected: true),
|
||||
LocalPopupMenu(id: 2, textKey: "box.popupmenu.delivered")
|
||||
LocalPopupMenu(
|
||||
id: 1,
|
||||
textKey: "box.popupmenu.active",
|
||||
selected: boxModel.selectedIndex == 1),
|
||||
LocalPopupMenu(
|
||||
id: 2,
|
||||
textKey: "box.popupmenu.delivered",
|
||||
selected: boxModel.selectedIndex == 2)
|
||||
],
|
||||
popupMenuCallback: (p) => this.setState(() {
|
||||
_showDelivered = p.id == 2;
|
||||
boxModel.selectedIndex = p.id;
|
||||
}),
|
||||
);
|
||||
return LocalProgress(
|
||||
@@ -78,17 +88,41 @@ class _BoxListState extends State<BoxList> {
|
||||
label: LocalText(context, "boxes.new", color: Colors.white),
|
||||
backgroundColor: primaryColor,
|
||||
),
|
||||
body: new ListView.separated(
|
||||
separatorBuilder: (context, index) => Divider(
|
||||
color: Colors.black,
|
||||
),
|
||||
scrollDirection: Axis.vertical,
|
||||
padding: EdgeInsets.only(top: 15),
|
||||
shrinkWrap: true,
|
||||
itemCount: boxModel.boxes.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return BoxListRow(box: boxModel.boxes[index]);
|
||||
}),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: RefreshIndicator(
|
||||
child: new ListView.separated(
|
||||
physics: AlwaysScrollableScrollPhysics(),
|
||||
controller: _controller,
|
||||
separatorBuilder: (context, index) => Divider(
|
||||
color: Colors.black,
|
||||
),
|
||||
scrollDirection: Axis.vertical,
|
||||
padding: EdgeInsets.only(top: 15),
|
||||
shrinkWrap: true,
|
||||
itemCount: boxModel.boxes.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return BoxListRow(box: boxModel.boxes[index]);
|
||||
}),
|
||||
onRefresh: () => boxModel.refresh(),
|
||||
),
|
||||
),
|
||||
boxModel.isLoading
|
||||
? Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
color: primaryColor,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text("Loading...",
|
||||
style: TextStyle(color: Colors.white)),
|
||||
],
|
||||
),
|
||||
)
|
||||
: Container(),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -75,7 +75,7 @@ class _BoxListRowState extends State<BoxListRow> {
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(0),
|
||||
child: getStatus(_box.status),
|
||||
child: getStatus(_box.status == null ? "" : _box.status),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5),
|
||||
|
||||
@@ -5,13 +5,22 @@ import 'package:fcs/domain/constants.dart';
|
||||
import 'package:fcs/domain/entities/box.dart';
|
||||
import 'package:fcs/domain/entities/cargo_type.dart';
|
||||
import 'package:fcs/domain/entities/package.dart';
|
||||
import 'package:fcs/domain/vo/message.dart';
|
||||
import 'package:fcs/domain/vo/shipment_status.dart';
|
||||
import 'package:fcs/domain/vo/delivery_address.dart';
|
||||
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<Box> _boxes = [];
|
||||
final log = Logger('BoxModel');
|
||||
List<Box> get boxes =>
|
||||
_selectedIndex == 1 ? _boxes : List<Box>.from(_delivered.values);
|
||||
|
||||
Paginator _delivered;
|
||||
int _selectedIndex = 1;
|
||||
bool isLoading = false;
|
||||
|
||||
StreamSubscription<QuerySnapshot> listener;
|
||||
static List<ShipmentStatus> statusHistory = [
|
||||
@@ -26,7 +35,7 @@ class BoxModel extends BaseModel {
|
||||
// PackageModel.packages[2]
|
||||
];
|
||||
|
||||
List<Box> boxes = [
|
||||
List<Box> boxeList = [
|
||||
Box(
|
||||
shipmentNumber: "A202",
|
||||
receiverNumber: "3",
|
||||
@@ -309,6 +318,97 @@ class BoxModel extends BaseModel {
|
||||
carton_mix_box
|
||||
];
|
||||
|
||||
set selectedIndex(int index) {
|
||||
_selectedIndex = index;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
get selectedIndex => _selectedIndex;
|
||||
|
||||
initData() {
|
||||
_selectedIndex = 1;
|
||||
_loadBoxes();
|
||||
|
||||
if (_delivered != null) _delivered.close();
|
||||
// _delivered = _getDelivered();
|
||||
_delivered = _getDeliveredExample();
|
||||
_delivered.load();
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
Paginator _getDeliveredExample() {
|
||||
count = 1;
|
||||
var pageQuery = Firestore.instance
|
||||
.collection(
|
||||
"/users/8OTfsbVvsUOn1SLxy1OrKk7Y_yNKkVoGalPcIlcHnAY/messages")
|
||||
.orderBy("date", descending: true);
|
||||
var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) {
|
||||
var m = Message.fromMap(data, id);
|
||||
return Box(
|
||||
id: m.id,
|
||||
shipmentNumber: m.message,
|
||||
boxNumber: "1",
|
||||
receiverNumber: "3",
|
||||
rate: 0,
|
||||
weight: 0,
|
||||
arrivedDate: m.date,
|
||||
);
|
||||
});
|
||||
return paginator;
|
||||
}
|
||||
|
||||
Future<void> _loadBoxes() async {
|
||||
if (user == null || !user.hasCarton()) return;
|
||||
String path = "/$boxes_collection/";
|
||||
if (listener != null) listener.cancel();
|
||||
_boxes = [];
|
||||
try {
|
||||
listener = Firestore.instance
|
||||
.collection("$path")
|
||||
.snapshots()
|
||||
.listen((QuerySnapshot snapshot) {
|
||||
_boxes.clear();
|
||||
_boxes = snapshot.documents.map((documentSnapshot) {
|
||||
var s =
|
||||
Box.fromMap(documentSnapshot.data, documentSnapshot.documentID);
|
||||
return s;
|
||||
}).toList();
|
||||
notifyListeners();
|
||||
});
|
||||
} catch (e) {
|
||||
log.warning("Error!! $e");
|
||||
}
|
||||
}
|
||||
|
||||
Paginator _getDelivered() {
|
||||
if (user == null || !user.hasCarton()) return null;
|
||||
|
||||
var pageQuery = Firestore.instance
|
||||
.collection("/$boxes_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 paginator;
|
||||
}
|
||||
|
||||
Future<void> loadMore() async {
|
||||
if (_delivered.ended) return;
|
||||
isLoading = true;
|
||||
notifyListeners();
|
||||
await _delivered.load(onFinished: () {
|
||||
isLoading = false;
|
||||
notifyListeners();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> refresh() async {
|
||||
await _delivered.refresh(onFinished: () {
|
||||
notifyListeners();
|
||||
});
|
||||
}
|
||||
|
||||
void initUser(user) {
|
||||
super.initUser(user);
|
||||
}
|
||||
@@ -316,6 +416,7 @@ class BoxModel extends BaseModel {
|
||||
@override
|
||||
logout() async {
|
||||
if (listener != null) await listener.cancel();
|
||||
boxes = [];
|
||||
if (_delivered != null) _delivered.close();
|
||||
_boxes = [];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user