Commit a80e1707 authored by Ilham Maulana's avatar Ilham Maulana 💻

feat: paging loans (admin access)

parent 126b9adc
...@@ -488,8 +488,8 @@ class AuthProvider with ChangeNotifier { ...@@ -488,8 +488,8 @@ class AuthProvider with ChangeNotifier {
url += '?near_outstanding=True'; url += '?near_outstanding=True';
} else if (type == "overdue") { } else if (type == "overdue") {
url += '?overdue=True'; url += '?overdue=True';
} else { } else if (pageNumber > 1) {
null; url += "?page=$pageNumber";
} }
if (token != null) { if (token != null) {
...@@ -512,6 +512,10 @@ class AuthProvider with ChangeNotifier { ...@@ -512,6 +512,10 @@ class AuthProvider with ChangeNotifier {
} else { } else {
loans = data["data"]; loans = data["data"];
} }
hasNextPage = data["has_next"];
hasPrevPage = data["has_prev"];
pageNumber = data["page_number"];
totalPages = data["total_pages"];
} else { } else {
final code = response.statusCode; final code = response.statusCode;
debugPrint("Error: Fetch upcoming loans failed, $code"); debugPrint("Error: Fetch upcoming loans failed, $code");
......
...@@ -36,6 +36,40 @@ class _AdminLoanList extends State<AdminLoanList> { ...@@ -36,6 +36,40 @@ class _AdminLoanList extends State<AdminLoanList> {
super.initState(); super.initState();
} }
ScrollController listScrollController = ScrollController();
void scrollToTop() {
if (listScrollController.hasClients) {
final position = listScrollController.position.minScrollExtent;
listScrollController.jumpTo(position);
}
}
Future<void> nextPage() async {
if (Provider.of<AuthProvider>(context, listen: false).hasNextPage) {
Provider.of<AuthProvider>(context, listen: false).setPage(
Provider.of<AuthProvider>(context, listen: false).pageNumber + 1,
);
} else {
Provider.of<AuthProvider>(context, listen: false).setPage(
Provider.of<AuthProvider>(context, listen: false).totalPages!);
}
Provider.of<AuthProvider>(context, listen: false).getMemberLoan();
scrollToTop();
}
Future<void> prevPage() async {
if (Provider.of<AuthProvider>(context, listen: false).hasPrevPage) {
Provider.of<AuthProvider>(context, listen: false).setPage(
Provider.of<AuthProvider>(context, listen: false).pageNumber - 1,
);
} else {
Provider.of<AuthProvider>(context, listen: false).setPage(1);
}
Provider.of<AuthProvider>(context, listen: false).getMemberLoan();
scrollToTop();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<AuthProvider>(builder: (context, loanProvider, child) { return Consumer<AuthProvider>(builder: (context, loanProvider, child) {
...@@ -63,13 +97,34 @@ class _AdminLoanList extends State<AdminLoanList> { ...@@ -63,13 +97,34 @@ class _AdminLoanList extends State<AdminLoanList> {
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [TopAppBar(title: title)]; return [TopAppBar(title: title)];
}, },
body: ListView( body: ListView.builder(
children: List.generate(loans.length, (index) { controller: listScrollController,
itemCount: loans.length + 1,
itemBuilder: (context, index) {
if (index < loans.length) {
return LoanItem( return LoanItem(
loans.elementAt(index), loans.elementAt(index),
user: loans.elementAt(index).user,
); );
}), } else {
return Container(
padding: const EdgeInsets.all(10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton(
onPressed: prevPage,
child: const Text('Prev'),
),
Text(loanProvider.pageNumber.toString()),
ElevatedButton(
onPressed: nextPage,
child: const Text('Next'),
),
],
),
);
}
},
), ),
); );
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment