import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; class PaginationControls extends StatelessWidget { final int currentPage; final int itemsPerPage; final int totalItems; final Function(int) onPageChanged; final Function(int) onItemsPerPageChanged; final Color? activeColor; const PaginationControls({ Key? key, required this.currentPage, required this.itemsPerPage, required this.totalItems, required this.onPageChanged, required this.onItemsPerPageChanged, this.activeColor = Colors.blue, // fallback if no color given }) : super(key: key); @override Widget build(BuildContext context) { // int totalPages = (totalItems / itemsPerPage).ceil(); final int totalPages = (totalItems / itemsPerPage).ceil(); // return Row( // mainAxisAlignment: MainAxisAlignment.end, // children: [ // Padding( // padding: const EdgeInsets.symmetric(vertical: 12), // child: Row( // mainAxisAlignment: MainAxisAlignment.center, // children: [ // DropdownButton( // value: itemsPerPage, // items: // [5, 10, 15, 20, 50].map((int value) { // return DropdownMenuItem( // value: value, // child: Text( // ' $value ', // style: GoogleFonts.poppins(fontSize: 15), // ), // ); // }).toList(), // onChanged: (newValue) { // if (newValue != null) { // onItemsPerPageChanged(newValue); // onPageChanged(1); // reset to first page // } // }, // ), // IconButton( // onPressed: // currentPage > 1 // ? () => onPageChanged(currentPage - 1) // : null, // icon: Icon(Icons.chevron_left), // ), // for (int i = 1; i <= totalPages - 1; i++) // Padding( // padding: const EdgeInsets.symmetric(horizontal: 4), // child: ElevatedButton( // style: ElevatedButton.styleFrom( // backgroundColor: // currentPage == i - 1 ? activeColor : Colors.grey[300], // foregroundColor: // currentPage == i - 1 ? Colors.white : Colors.black, // minimumSize: Size(36, 36), // padding: EdgeInsets.zero, // ), // onPressed: () => onPageChanged(i - 1), // child: Text(i.toString()), // ), // ), // IconButton( // onPressed: // currentPage < totalPages - 1 // ? () => onPageChanged(currentPage + 1) // : null, // icon: Icon(Icons.chevron_right), // ), // ], // ), // ), // ], // ); return Row( mainAxisAlignment: MainAxisAlignment.end, children: [ // Text( // 'Items per page:', // style: TextStyle( // fontSize: 12, // fontWeight: FontWeight.w400, // color: Colors.black87, // fontFamily: "Inter", // ), // ), // SizedBox(width: 8), DropdownButton( value: itemsPerPage, items: [10, 20, 50, 100] .map( (value) => DropdownMenuItem( value: value, child: Text( '$value', style: TextStyle(fontSize: 12, fontFamily: "Inter"), ), ), ) .toList(), onChanged: (value) { if (value != null) { onItemsPerPageChanged(value); } }, style: TextStyle( fontSize: 12, color: Colors.black, fontFamily: "Inter", ), underline: SizedBox(), iconSize: 16, ), SizedBox(width: 16), IconButton( icon: Icon(Icons.arrow_back_ios_new, size: 10), onPressed: currentPage > 0 ? () => onPageChanged(currentPage - 1) : null, ), // SingleChildScrollView( // scrollDirection: Axis.horizontal, // child: Row( // children: List.generate(totalPages, (index) { // print("totalPagesList - $totalPages"); // // Only show 2 pages: currentPage and currentPage + 1 // if (index == currentPage || index == currentPage + 1) { // return Padding( // padding: const EdgeInsets.symmetric(horizontal: 4), // child: ElevatedButton( // onPressed: () => onPageChanged(index), // style: ElevatedButton.styleFrom( // backgroundColor: // currentPage == index // ? activeColor // : Colors.grey[300]!, // minimumSize: Size(30, 30), // padding: EdgeInsets.zero, // ), // child: Text( // '${index + 1}', // style: TextStyle( // fontSize: 12, // fontFamily: "Inter", // color: // currentPage == index ? Colors.white : Colors.black, // ), // ), // ), // ); // } else { // return SizedBox.shrink(); // Don't show other pages // } // }), // ), // ), SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row(children: _buildPageButtons()), ), IconButton( icon: Icon(Icons.arrow_forward_ios, size: 10), onPressed: (currentPage + 1) * itemsPerPage < totalItems ? () => onPageChanged(currentPage + 1) : null, ), ], ); } List _buildPageButtons() { final int totalPages = (totalItems / itemsPerPage).ceil(); List buttons = []; // Always show first page buttons.add(_buildPageButton(0)); // Add left ellipsis if needed if (currentPage > 2) { buttons.add(_buildEllipsis()); } // Add previous, current, next page if in range for (int i = currentPage - 1; i <= currentPage + 1; i++) { if (i > 0 && i < totalPages - 1) { buttons.add(_buildPageButton(i)); } } // Add right ellipsis if needed if (currentPage < totalPages - 3) { buttons.add(_buildEllipsis()); } // Always show last page if (totalPages > 1) { buttons.add(_buildPageButton(totalPages - 1)); } return buttons; } Widget _buildPageButton(int pageIndex) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: ElevatedButton( onPressed: () => onPageChanged(pageIndex), style: ElevatedButton.styleFrom( backgroundColor: currentPage == pageIndex ? activeColor : Colors.grey[300], foregroundColor: currentPage == pageIndex ? Colors.white : Colors.black, minimumSize: Size(36, 36), padding: EdgeInsets.zero, ), child: Text('${pageIndex + 1}'), ), ); } Widget _buildEllipsis() { return Padding( padding: const EdgeInsets.symmetric(horizontal: 6), child: Text('...', style: TextStyle(fontSize: 16)), ); } }