update package and carton selection

This commit is contained in:
tzw
2024-03-04 17:09:47 +06:30
parent c66734d386
commit 1c4a9c2112
11 changed files with 236 additions and 237 deletions

View File

@@ -118,7 +118,7 @@ const carton_invoiced_status = "invoiced";
const carton_canceled_status = "canceled"; const carton_canceled_status = "canceled";
const all_status = "All stauts"; const all_status = "All stauts";
const all = "All"; const all = "All";
const see_all ="See All"; const see_more = "See More";
// shipment status // shipment status
const shipment_pending_status = "pending"; const shipment_pending_status = "pending";

View File

@@ -13,10 +13,12 @@ import 'package:fcs/pages/widgets/progress.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart';
import 'package:provider/provider.dart';
import '../main/util.dart'; import '../main/util.dart';
import 'carton_package_form.dart'; import 'carton_package_form.dart';
import 'carton_info.dart'; import 'carton_info.dart';
import 'mix_carton/mix_carton_form.dart'; import 'mix_carton/mix_carton_form.dart';
import 'model/package_selection_model.dart';
import 'widget/carton_row.dart'; import 'widget/carton_row.dart';
class CartonEditor extends StatefulWidget { class CartonEditor extends StatefulWidget {
@@ -38,6 +40,7 @@ class _CartonEditorState extends State<CartonEditor> {
User? _consignee; User? _consignee;
User? _sender; User? _sender;
Carton? _carton; Carton? _carton;
bool _hasPackages = true;
@override @override
void initState() { void initState() {
@@ -140,6 +143,12 @@ class _CartonEditorState extends State<CartonEditor> {
return; return;
} }
if (!_hasPackages) {
showMsgDialog(
context, "Error", "No packages in sender and consignee");
return;
}
Navigator.push( Navigator.push(
context, context,
CupertinoPageRoute( CupertinoPageRoute(
@@ -170,10 +179,12 @@ class _CartonEditorState extends State<CartonEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: Colors.black), icon: Icon(Icons.search, color: Colors.black),
onPressed: () => searchUser(context, onUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) async {
setState(() { setState(() {
this._consignee = u; this._consignee = u;
}); });
_checkPackages();
}, popPage: true)), }, popPage: true)),
], ],
); );
@@ -197,11 +208,12 @@ class _CartonEditorState extends State<CartonEditor> {
final consigneeBox = Container( final consigneeBox = Container(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
consigneeSearchBox, consigneeSearchBox,
consigneefcsIDBox, consigneefcsIDBox,
consigneePhoneBox, consigneePhoneBox,
consigneeNameBox consigneeNameBox,
], ],
), ),
); );
@@ -216,10 +228,12 @@ class _CartonEditorState extends State<CartonEditor> {
)), )),
IconButton( IconButton(
icon: Icon(Icons.search, color: Colors.black), icon: Icon(Icons.search, color: Colors.black),
onPressed: () => searchUser(context, onUserSelect: (u) { onPressed: () => searchUser(context, onUserSelect: (u) async {
setState(() { setState(() {
this._sender = u; this._sender = u;
}); });
_checkPackages();
}, popPage: true)), }, popPage: true)),
], ],
); );
@@ -243,6 +257,7 @@ class _CartonEditorState extends State<CartonEditor> {
final senderBox = Container( final senderBox = Container(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
senderSearchBox, senderSearchBox,
senderIDBox, senderIDBox,
@@ -268,14 +283,24 @@ class _CartonEditorState extends State<CartonEditor> {
cartonTypeBox, cartonTypeBox,
isFromPackages isFromPackages
? Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
LocalTitle(textKey: "box.select.sender_and_consignee"), LocalTitle(textKey: "box.select.sender_and_consignee"),
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Flexible(child: senderBox), Flexible(child: senderBox),
Flexible(child: consigneeBox) Flexible(child: consigneeBox)
], ],
), ),
!_hasPackages
? Padding(
padding: const EdgeInsets.only(top: 5),
child: Text("No packages in sender and consignee",
style: TextStyle(
color: dangerColor, fontSize: 13)),
)
: const SizedBox()
], ],
) )
: Container(), : Container(),
@@ -290,6 +315,18 @@ class _CartonEditorState extends State<CartonEditor> {
); );
} }
_checkPackages() async {
if (_sender != null && _consignee != null) {
var p = await context
.read<PackageSelectionModel>()
.getPackagesBySenderAndConsigneeId(
senderId: _sender!.id ?? "", consigneeId: _consignee!.id ?? "");
setState(() {
_hasPackages = p.isNotEmpty;
});
}
}
List<Widget> _getCartons(BuildContext context, List<Carton> cartons) { List<Widget> _getCartons(BuildContext context, List<Carton> cartons) {
return cartons.map((c) { return cartons.map((c) {
return InkWell( return InkWell(

View File

@@ -41,7 +41,7 @@ class _CartonListState extends State<CartonList> {
_shipments.insert(0, model.defaultShipment); _shipments.insert(0, model.defaultShipment);
if (_shipments.length > shipmentCountForCartonFilter) { if (_shipments.length > shipmentCountForCartonFilter) {
_shipments.insert(_shipments.length, _shipments.insert(_shipments.length,
FcsShipment(shipmentNumber: "See All", id: see_all)); FcsShipment(shipmentNumber: "See More", id: see_more));
} }
_selectedShipment = model.shipment ?? model.defaultShipment; _selectedShipment = model.shipment ?? model.defaultShipment;
@@ -72,7 +72,7 @@ class _CartonListState extends State<CartonList> {
child: ActionChip( child: ActionChip(
shape: StadiumBorder( shape: StadiumBorder(
side: BorderSide( side: BorderSide(
color: g.id == see_all color: g.id == see_more
? Colors.transparent ? Colors.transparent
: _selectedShipment?.id == g.id : _selectedShipment?.id == g.id
? primaryColor ? primaryColor
@@ -83,7 +83,7 @@ class _CartonListState extends State<CartonList> {
}, },
label: Text(g.shipmentNumber ?? "", label: Text(g.shipmentNumber ?? "",
style: TextStyle( style: TextStyle(
color: g.id == see_all color: g.id == see_more
? primaryColor ? primaryColor
: _selectedShipment?.id == g.id : _selectedShipment?.id == g.id
? primaryColor ? primaryColor
@@ -343,7 +343,7 @@ class _CartonListState extends State<CartonList> {
} }
_filterShipment(FcsShipment shipment) async { _filterShipment(FcsShipment shipment) async {
if (shipment.id == see_all) { if (shipment.id == see_more) {
_showFilter(); _showFilter();
return; return;
} }

View File

@@ -1,4 +1,5 @@
import 'package:fcs/pages/widgets/local_radio.dart'; import 'package:fcs/pages/widgets/local_radio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -7,6 +8,7 @@ import '../../../domain/entities/carton_size.dart';
import '../../../domain/entities/fcs_shipment.dart'; import '../../../domain/entities/fcs_shipment.dart';
import '../../../helpers/theme.dart'; import '../../../helpers/theme.dart';
import '../../domain/entities/user.dart'; import '../../domain/entities/user.dart';
import '../carton_size/carton_size_list.dart';
import '../carton_size/model/carton_size_model.dart'; import '../carton_size/model/carton_size_model.dart';
import '../fcs_shipment/model/fcs_shipment_model.dart'; import '../fcs_shipment/model/fcs_shipment_model.dart';
import '../main/util.dart'; import '../main/util.dart';
@@ -120,7 +122,8 @@ class _CartonSizeWidgetState extends State<CartonSizeWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<CartonSize> cartonSizes = context.watch<CartonSizeModel>().cartonSizes; List<CartonSize> cartonSizes =
context.watch<CartonSizeModel>().getCartonSizes;
bool isStandardSize = _cartonSizeType == standardCarton; bool isStandardSize = _cartonSizeType == standardCarton;
bool isCustomSize = _cartonSizeType == customCarton; bool isCustomSize = _cartonSizeType == customCarton;
bool isNoneDefinedSize = _cartonSizeType == packageCartion; bool isNoneDefinedSize = _cartonSizeType == packageCartion;
@@ -277,6 +280,11 @@ class _CartonSizeWidgetState extends State<CartonSizeWidget> {
underline: Container(height: 1, color: Colors.grey), underline: Container(height: 1, color: Colors.grey),
onChanged: (newValue) { onChanged: (newValue) {
setState(() { setState(() {
if (newValue?.name == MANAGE_CARTONSIZE) {
_selectStandardSize = null;
_manageCartonSize();
return;
}
_selectStandardSize = newValue!; _selectStandardSize = newValue!;
}); });
}, },
@@ -285,11 +293,17 @@ class _CartonSizeWidgetState extends State<CartonSizeWidget> {
cartonSizes.map<DropdownMenuItem<CartonSize>>((CartonSize value) { cartonSizes.map<DropdownMenuItem<CartonSize>>((CartonSize value) {
return DropdownMenuItem<CartonSize>( return DropdownMenuItem<CartonSize>(
value: value, value: value,
child: Row( child: value.name == MANAGE_CARTONSIZE
? Text("${value.name}",
style: TextStyle(
color: isStandardSize ? secondaryColor : labelColor))
: Row(
children: [ children: [
Text("${value.name} - ", Text("${value.name} - ",
style: TextStyle( style: TextStyle(
color: isStandardSize ? Colors.black : labelColor)), color: isStandardSize
? Colors.black
: labelColor)),
Text( Text(
"${value.length.toInt()}”x${value.width.toInt()}”x${value.height.toInt()}", "${value.length.toInt()}”x${value.width.toInt()}”x${value.height.toInt()}",
style: TextStyle(color: labelColor)), style: TextStyle(color: labelColor)),
@@ -484,4 +498,11 @@ class _CartonSizeWidgetState extends State<CartonSizeWidget> {
], ],
); );
} }
_manageCartonSize() {
Navigator.push(
context,
CupertinoPageRoute(builder: (context) => CartonSizeList()),
);
}
} }

View File

@@ -56,35 +56,32 @@ class _CartonSelectionWidgetState extends State<CartonSelectionWidget> {
_init() { _init() {
var model = context.read<CartonSelectionModel>(); var model = context.read<CartonSelectionModel>();
model.addDefaultCartons(widget.shipment.id!); _controller.text = model.query;
_query = model.query;
model.refresh(widget.shipment.id!, term: _query);
model.addSelectedCarton(widget.cartons); model.addSelectedCarton(widget.cartons);
_controller.text = model.query;
_query = model.query;
if (mounted) { if (mounted) {
setState(() {}); setState(() {});
} }
} }
@override // @override
void didUpdateWidget(covariant CartonSelectionWidget oldWidget) { // void didUpdateWidget(covariant CartonSelectionWidget oldWidget) {
_init(); // _init();
super.didUpdateWidget(oldWidget); // super.didUpdateWidget(oldWidget);
} // }
Future<void> _loadMoreData() async { Future<void> _loadMoreData() async {
if (_isLoadMore) return; if (_isLoadMore) return;
var model = context.read<CartonSelectionModel>(); var model = context.read<CartonSelectionModel>();
if (model.reachEnd || model.ended) return; if (model.ended) return;
setState(() { setState(() {
_isLoadMore = true; _isLoadMore = true;
}); });
if (_query != "") {
await model.loadMoreSearch(term: _query, shipmentId: widget.shipment.id!); await model.loadMoreData(widget.shipment.id!, term: _query);
} else {
await model.loadMoreData(widget.shipment.id!);
}
setState(() { setState(() {
_isLoadMore = false; _isLoadMore = false;
@@ -95,7 +92,7 @@ class _CartonSelectionWidgetState extends State<CartonSelectionWidget> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var model = context.watch<CartonSelectionModel>(); var model = context.watch<CartonSelectionModel>();
List<Carton> searchResults = model.cartons; List<Carton> searchResults = model.cartons;
List<Carton> selectedCartonList = model.selectedCartonList; List<Carton> selectedCartonList = model.selectedCartons;
final continueBtn = ContinueButton( final continueBtn = ContinueButton(
onTap: () { onTap: () {

View File

@@ -1,4 +1,5 @@
import 'package:fcs/pages/widgets/local_radio.dart'; import 'package:fcs/pages/widgets/local_radio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -6,6 +7,7 @@ import '../../../domain/constants.dart';
import '../../../domain/entities/carton_size.dart'; import '../../../domain/entities/carton_size.dart';
import '../../../domain/entities/fcs_shipment.dart'; import '../../../domain/entities/fcs_shipment.dart';
import '../../../helpers/theme.dart'; import '../../../helpers/theme.dart';
import '../../carton_size/carton_size_list.dart';
import '../../carton_size/model/carton_size_model.dart'; import '../../carton_size/model/carton_size_model.dart';
import '../../fcs_shipment/model/fcs_shipment_model.dart'; import '../../fcs_shipment/model/fcs_shipment_model.dart';
import '../../main/util.dart'; import '../../main/util.dart';
@@ -17,6 +19,7 @@ import '../../widgets/local_title.dart';
import '../../widgets/previous_button.dart'; import '../../widgets/previous_button.dart';
typedef OnPrevious = Function(); typedef OnPrevious = Function();
const manageStandardCartonSize = "Manage carton size";
typedef OnContinue = Function(FcsShipment shipment, String cartonSizeType, typedef OnContinue = Function(FcsShipment shipment, String cartonSizeType,
{CartonSize? standardSize, double? length, double? width, double? height}); {CartonSize? standardSize, double? length, double? width, double? height});
@@ -101,7 +104,9 @@ class _TypeWidgetState extends State<TypeWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<CartonSize> cartonSizes = context.watch<CartonSizeModel>().cartonSizes; List<CartonSize> cartonSizes =
context.watch<CartonSizeModel>().getCartonSizes;
bool isStandardSize = _cartionSizeType == standardCarton; bool isStandardSize = _cartionSizeType == standardCarton;
bool isCustomSize = _cartionSizeType == customCarton; bool isCustomSize = _cartionSizeType == customCarton;
bool isNoneDefinedSize = _cartionSizeType == packageCartion; bool isNoneDefinedSize = _cartionSizeType == packageCartion;
@@ -156,6 +161,11 @@ class _TypeWidgetState extends State<TypeWidget> {
underline: Container(height: 1, color: Colors.grey), underline: Container(height: 1, color: Colors.grey),
onChanged: (newValue) { onChanged: (newValue) {
setState(() { setState(() {
if (newValue?.name == MANAGE_CARTONSIZE) {
_selectStandardSize = null;
_manageCartonSize();
return;
}
_selectStandardSize = newValue!; _selectStandardSize = newValue!;
}); });
}, },
@@ -164,11 +174,17 @@ class _TypeWidgetState extends State<TypeWidget> {
cartonSizes.map<DropdownMenuItem<CartonSize>>((CartonSize value) { cartonSizes.map<DropdownMenuItem<CartonSize>>((CartonSize value) {
return DropdownMenuItem<CartonSize>( return DropdownMenuItem<CartonSize>(
value: value, value: value,
child: Row( child: value.name == MANAGE_CARTONSIZE
? Text("${value.name}",
style: TextStyle(
color: isStandardSize ? secondaryColor : labelColor))
: Row(
children: [ children: [
Text("${value.name} - ", Text("${value.name} - ",
style: TextStyle( style: TextStyle(
color: isStandardSize ? Colors.black : labelColor)), color: isStandardSize
? Colors.black
: labelColor)),
Text( Text(
"${value.length.toInt()}”x${value.width.toInt()}”x${value.height.toInt()}", "${value.length.toInt()}”x${value.width.toInt()}”x${value.height.toInt()}",
style: TextStyle(color: labelColor)), style: TextStyle(color: labelColor)),
@@ -355,4 +371,11 @@ class _TypeWidgetState extends State<TypeWidget> {
], ],
); );
} }
_manageCartonSize() {
Navigator.push(
context,
CupertinoPageRoute(builder: (context) => CartonSizeList()),
);
}
} }

View File

@@ -9,92 +9,36 @@ import '../../main/model/base_model.dart';
class CartonSelectionModel extends BaseModel { class CartonSelectionModel extends BaseModel {
final log = Logger("CartonSelectionModel"); final log = Logger("CartonSelectionModel");
// for search
String query = ""; String query = "";
int offset = 0;
bool reachEnd = false;
List<Carton> cartons = []; List<Carton> cartons = [];
List<Carton> selectedCartons = [];
bool isLoading = false; bool isLoading = false;
// for default carton
DocumentSnapshot? _lastDocument; DocumentSnapshot? _lastDocument;
bool ended = false; bool ended = false;
List<Carton> selectedCartonList = [];
Timer? t; Timer? t;
search(String term, {bool imm = false, required String shipmentId}) async { search(String term, {bool imm = false, required String shipmentId}) async {
query = term; query = term;
cartons.clear(); cartons.clear();
offset = 0; _lastDocument = null;
reachEnd = false; ended = false;
t?.cancel(); t?.cancel();
t = Timer(Duration(milliseconds: imm ? 0 : 800), () async { t = Timer(Duration(milliseconds: imm ? 0 : 800), () async {
await loadMoreSearch(term: term, shipmentId: shipmentId); await refresh(shipmentId, term: term);
}); });
} }
Future<void> loadMoreSearch( Future<void> refresh(String shipmentId, {String term = ""}) async {
{required String term, required String shipmentId}) async {
if (term == "") {
await _refresh(shipmentId);
return;
}
// int rowPerPage = 21;
// List<Carton> list = [];
// SearchPara searchPara = SearchPara(filters: [], term: term);
// isLoading = true;
// var path =
// "/search/$cartons_collection/${searchPara.escapeTerm}/$rowPerPage/$offset/${searchPara.escapeFilters}";
// var result = await requestAPI(path, "GET",
// token: await getToken(), url: Config.instance.searchURL);
// if (result != null) {
// for (var row in result) {
// var item = ArtistExt.fromMapForSearch(row);
// list.add(item);
// }
// }
// for (var p in list) {
// selectedArtistList.contains(p)
// ? p.isSelected = true
// : p.isSelected = false;
// }
// artists.addAll(list);
// offset += rowPerPage;
// if (list.length < rowPerPage) {
// reachEnd = true;
// }
notifyListeners();
}
addDefaultCartons(String shipmentId) async {
cartons.clear();
await _refresh(shipmentId);
}
selectCarton(Carton a) {
if (a.isSelected) {
selectedCartonList.add(a);
} else {
selectedCartonList.remove(a);
}
}
Future<void> _refresh(String shipmentId) async {
cartons.clear(); cartons.clear();
_lastDocument = null; _lastDocument = null;
ended = false; ended = false;
await loadMoreData(shipmentId); await loadMoreData(shipmentId, term: term);
notifyListeners(); notifyListeners();
} }
Future<void> loadMoreData(String shipmentId) async { Future<void> loadMoreData(String shipmentId, {String term = ""}) async {
int rowPerPage = 20; int rowPerPage = 20;
try { try {
@@ -104,9 +48,13 @@ class CartonSelectionModel extends BaseModel {
.collection(path) .collection(path)
// .where("fcs_shipment_id", isEqualTo: shipmentId) // .where("fcs_shipment_id", isEqualTo: shipmentId)
// .where("status", isEqualTo: carton_processing_status) // .where("status", isEqualTo: carton_processing_status)
// .where("carton_type", isEqualTo: carton_mix_box) .where("is_deleted", isEqualTo: false);
.where("is_deleted", isEqualTo: false)
.orderBy("created_at", descending: true); if (term != "") {
query = query.where("carton_number", isEqualTo: term);
}
query = query.orderBy("created_at", descending: true);
if (_lastDocument != null) { if (_lastDocument != null) {
query = query.startAfterDocument(_lastDocument!); query = query.startAfterDocument(_lastDocument!);
@@ -124,7 +72,7 @@ class CartonSelectionModel extends BaseModel {
}).toList(); }).toList();
for (var p in list) { for (var p in list) {
selectedCartonList.contains(p) selectedCartons.contains(p)
? p.isSelected = true ? p.isSelected = true
: p.isSelected = false; : p.isSelected = false;
} }
@@ -139,13 +87,21 @@ class CartonSelectionModel extends BaseModel {
} }
} }
selectCarton(Carton a) {
if (a.isSelected) {
selectedCartons.add(a);
} else {
selectedCartons.remove(a);
}
}
clearSelection() { clearSelection() {
selectedCartonList.clear(); selectedCartons.clear();
cartons.clear(); cartons.clear();
query = ""; query = "";
} }
addSelectedCarton(List<Carton> list) { addSelectedCarton(List<Carton> list) {
selectedCartonList = list; selectedCartons = list;
} }
} }

View File

@@ -9,20 +9,14 @@ import '../../main/model/base_model.dart';
class PackageSelectionModel extends BaseModel { class PackageSelectionModel extends BaseModel {
final log = Logger("PackageSelectionModel"); final log = Logger("PackageSelectionModel");
// for search
String query = ""; String query = "";
int offset = 0;
bool reachEnd = false;
List<Package> packages = []; List<Package> packages = [];
List<Package> selectedPackages = [];
bool isLoading = false; bool isLoading = false;
// for default package
DocumentSnapshot? _lastDocument; DocumentSnapshot? _lastDocument;
bool ended = false; bool ended = false;
List<Package> selectedPackageList = [];
Timer? t; Timer? t;
search(String term, search(String term,
{bool imm = false, {bool imm = false,
@@ -31,11 +25,11 @@ class PackageSelectionModel extends BaseModel {
required String consigneeId}) async { required String consigneeId}) async {
query = term; query = term;
packages.clear(); packages.clear();
offset = 0; _lastDocument = null;
reachEnd = false; ended = false;
t?.cancel(); t?.cancel();
t = Timer(Duration(milliseconds: imm ? 0 : 800), () async { t = Timer(Duration(milliseconds: imm ? 0 : 800), () async {
await loadMoreSearch( await refresh(
term: term, term: term,
shipmentId: shipmentId, shipmentId: shipmentId,
consigneeId: consigneeId, consigneeId: consigneeId,
@@ -43,85 +37,27 @@ class PackageSelectionModel extends BaseModel {
}); });
} }
Future<void> loadMoreSearch( Future<void> refresh(
{required String term,
required String shipmentId,
required String senderId,
required String consigneeId}) async {
if (term == "") {
await _refresh(
shipmentId: shipmentId, senderId: senderId, consigneeId: consigneeId);
return;
}
// int rowPerPage = 21;
// List<Carton> list = [];
// SearchPara searchPara = SearchPara(filters: [], term: term);
// isLoading = true;
// var path =
// "/search/$cartons_collection/${searchPara.escapeTerm}/$rowPerPage/$offset/${searchPara.escapeFilters}";
// var result = await requestAPI(path, "GET",
// token: await getToken(), url: Config.instance.searchURL);
// if (result != null) {
// for (var row in result) {
// var item = ArtistExt.fromMapForSearch(row);
// list.add(item);
// }
// }
// for (var p in list) {
// selectedArtistList.contains(p)
// ? p.isSelected = true
// : p.isSelected = false;
// }
// artists.addAll(list);
// offset += rowPerPage;
// if (list.length < rowPerPage) {
// reachEnd = true;
// }
notifyListeners();
}
addDefaultPackages(
{required String shipmentId, {required String shipmentId,
required String senderId, required String senderId,
required String consigneeId}) async { required String consigneeId,
packages.clear(); String term = ""}) async {
await _refresh(
shipmentId: shipmentId, senderId: senderId, consigneeId: consigneeId);
}
selectPackage(Package a) {
if (a.isChecked) {
selectedPackageList.add(a);
} else {
selectedPackageList.remove(a);
}
}
addSelectedPackage(List<Package> list){
selectedPackageList = list;
}
Future<void> _refresh(
{required String shipmentId,
required String senderId,
required String consigneeId}) async {
packages.clear(); packages.clear();
_lastDocument = null; _lastDocument = null;
ended = false; ended = false;
await loadMoreData( await loadMoreData(
shipmentId: shipmentId, senderId: senderId, consigneeId: consigneeId); shipmentId: shipmentId,
senderId: senderId,
consigneeId: consigneeId,
term: term);
notifyListeners(); notifyListeners();
} }
Future<void> loadMoreData( Future<void> loadMoreData(
{required String shipmentId, {required String shipmentId,
required String senderId, required String senderId,
required String consigneeId}) async { required String consigneeId,
String term = ""}) async {
int rowPerPage = 20; int rowPerPage = 20;
try { try {
@@ -131,9 +67,15 @@ class PackageSelectionModel extends BaseModel {
.collection(path) .collection(path)
// .where("fcs_shipment_id", isEqualTo: shipmentId) // .where("fcs_shipment_id", isEqualTo: shipmentId)
// .where("status", isEqualTo: package_processed_status) // .where("status", isEqualTo: package_processed_status)
.where("user_id", whereIn: [senderId, consigneeId]) .where("sender_id", isEqualTo: senderId)
.where("is_deleted", isEqualTo: false) .where("user_id", isEqualTo: consigneeId)
.orderBy("created_date", descending: true); .where("is_deleted", isEqualTo: false);
if (term != "") {
query = query.where("tracking_id", isEqualTo: term);
}
query = query.orderBy("created_date", descending: true);
if (_lastDocument != null) { if (_lastDocument != null) {
query = query.startAfterDocument(_lastDocument!); query = query.startAfterDocument(_lastDocument!);
@@ -151,9 +93,7 @@ class PackageSelectionModel extends BaseModel {
}).toList(); }).toList();
for (var p in list) { for (var p in list) {
selectedPackageList.contains(p) selectedPackages.contains(p) ? p.isChecked = true : p.isChecked = false;
? p.isChecked = true
: p.isChecked = false;
} }
packages.addAll(list); packages.addAll(list);
@@ -166,9 +106,43 @@ class PackageSelectionModel extends BaseModel {
} }
} }
selectPackage(Package a) {
if (a.isChecked) {
selectedPackages.add(a);
} else {
selectedPackages.remove(a);
}
}
addSelectedPackage(List<Package> list) {
selectedPackages = list;
}
clearSelection() { clearSelection() {
selectedPackageList.clear(); selectedPackages.clear();
packages.clear(); packages.clear();
query = ""; query = "";
} }
Future<List<Package>> getPackagesBySenderAndConsigneeId(
{required String senderId, required String consigneeId}) async {
List<Package> list = [];
try {
String path = "/$packages_collection";
var snaps = await FirebaseFirestore.instance
.collection(path)
.where("sender_id", isEqualTo: senderId)
.where("user_id", isEqualTo: consigneeId)
.where("is_deleted", isEqualTo: false)
.get(const GetOptions(source: Source.server));
list = snaps.docs
.map((documentSnapshot) =>
Package.fromMap(documentSnapshot.data(), documentSnapshot.id))
.toList();
} catch (e) {
log.warning("Error!! $e");
list = [];
}
return list;
}
} }

View File

@@ -43,36 +43,32 @@ class SenderSelectionModel extends BaseModel {
await _refresh(); await _refresh();
return; return;
} }
// int rowPerPage = 21;
// List<Carton> list = [];
// SearchPara searchPara = SearchPara(filters: [], term: term);
// isLoading = true;
// var path = // var bytes = utf8.encode(term);
// "/search/$cartons_collection/${searchPara.escapeTerm}/$rowPerPage/$offset/${searchPara.escapeFilters}"; // var base64Str = base64.encode(bytes);
// HtmlEscape htmlEscape = const HtmlEscape();
// String escapeSender = htmlEscape.convert(base64Str);
// var result = await requestAPI(path, "GET", // int rowPerPage = 20;
// token: await getToken(), url: Config.instance.searchURL); // List<User> list = [];
// var result = await requestAPI(
// "/api/fts/$user_collection/$escapeSender/$rowPerPage", "GET",
// url: Config.instance.reportURL, token: await getToken());
// if (result != null) { // if (result != null) {
// for (var row in result) { // for (var row in result) {
// var item = ArtistExt.fromMapForSearch(row); // var item = User.fromJson(row);
// list.add(item); // list.add(item);
// } // }
// } // }
// for (var p in list) { // _senders.addAll(list);
// selectedArtistList.contains(p)
// ? p.isSelected = true
// : p.isSelected = false;
// }
// artists.addAll(list);
// offset += rowPerPage; // offset += rowPerPage;
// if (list.length < rowPerPage) { // if (list.length < rowPerPage) {
// reachEnd = true; // reachEnd = true;
// } // }
notifyListeners(); // notifyListeners();
} }
addDefaultSenders() async { addDefaultSenders() async {

View File

@@ -62,16 +62,17 @@ class _PackageSelectionWidgetState extends State<PackageSelectionWidget> {
_init() { _init() {
var searchModel = context.read<PackageSelectionModel>(); var searchModel = context.read<PackageSelectionModel>();
searchModel.addDefaultPackages(
shipmentId: widget.shipment.id!,
consigneeId: widget.consignee.id!,
senderId: widget.sender.id!);
searchModel.addSelectedPackage(widget.packages);
_controller.text = searchModel.query; _controller.text = searchModel.query;
_query = searchModel.query; _query = searchModel.query;
searchModel.refresh(
shipmentId: widget.shipment.id!,
consigneeId: widget.consignee.id!,
senderId: widget.sender.id!,
term: _query);
searchModel.addSelectedPackage(widget.packages);
if (mounted) { if (mounted) {
setState(() {}); setState(() {});
} }
@@ -86,22 +87,16 @@ class _PackageSelectionWidgetState extends State<PackageSelectionWidget> {
Future<void> _loadMoreData() async { Future<void> _loadMoreData() async {
if (_isLoadMore) return; if (_isLoadMore) return;
var model = context.read<PackageSelectionModel>(); var model = context.read<PackageSelectionModel>();
if (model.reachEnd || model.ended) return; if (model.ended) return;
setState(() { setState(() {
_isLoadMore = true; _isLoadMore = true;
}); });
if (_query != "") {
await model.loadMoreSearch(
term: _query,
shipmentId: widget.shipment.id!,
consigneeId: widget.consignee.id!,
senderId: widget.sender.id!);
} else {
await model.loadMoreData( await model.loadMoreData(
shipmentId: widget.shipment.id!, shipmentId: widget.shipment.id!,
consigneeId: widget.consignee.id!, consigneeId: widget.consignee.id!,
senderId: widget.sender.id!); senderId: widget.sender.id!,
} term: _query);
setState(() { setState(() {
_isLoadMore = false; _isLoadMore = false;
@@ -112,7 +107,7 @@ class _PackageSelectionWidgetState extends State<PackageSelectionWidget> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var model = context.watch<PackageSelectionModel>(); var model = context.watch<PackageSelectionModel>();
List<Package> searchResults = model.packages; List<Package> searchResults = model.packages;
List<Package> selectedPackageList = model.selectedPackageList; List<Package> selectedPackageList = model.selectedPackages;
final senderBox = DisplayText( final senderBox = DisplayText(
text: widget.sender.name, text: widget.sender.name,
@@ -278,7 +273,7 @@ class _PackageSelectionWidgetState extends State<PackageSelectionWidget> {
isLoadingMore: _isLoadMore, isLoadingMore: _isLoadMore,
onLoadMore: _loadMoreData, onLoadMore: _loadMoreData,
onRefresh: () async { onRefresh: () async {
_search(); _init();
setState(() { setState(() {
_down = true; _down = true;
}); });

View File

@@ -46,7 +46,7 @@ class _CartonSizeListState extends State<CartonSizeList> {
Padding( Padding(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top: 8.0),
child: new Text( child: new Text(
"(L${p.length}xW${p.width}xH${p.height})", "(L${p.length.toInt()}xW${p.width.toInt()}xH${p.height.toInt()})",
style: new TextStyle(color: Colors.grey), style: new TextStyle(color: Colors.grey),
), ),
), ),