diff --git a/apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/team-stats-table.tsx b/apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/team-stats-table.tsx index 076ac9fc0..984583aff 100644 --- a/apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/team-stats-table.tsx +++ b/apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/team-stats-table.tsx @@ -3,6 +3,7 @@ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; +import { PaginationDropdown } from '@/lib/settings/page-dropdown'; import { format } from 'date-fns'; import { ITimerLogGrouped } from '@/app/interfaces'; import { Spinner } from '@/components/ui/loaders/spinner'; @@ -34,8 +35,6 @@ const formatPercentage = (value: number) => { return `${Math.round(value)}%`; }; -const ITEMS_PER_PAGE = 10; - export function TeamStatsTable({ rapportDailyActivity, isLoading @@ -44,9 +43,10 @@ export function TeamStatsTable({ isLoading?: boolean; }) { const [currentPage, setCurrentPage] = useState(1); - const totalPages = rapportDailyActivity ? Math.ceil(rapportDailyActivity.length / ITEMS_PER_PAGE) : 0; - const startIndex = (currentPage - 1) * ITEMS_PER_PAGE; - const endIndex = startIndex + ITEMS_PER_PAGE; + const [pageSize, setPageSize] = useState(10); + const totalPages = rapportDailyActivity ? Math.ceil(rapportDailyActivity.length / pageSize) : 0; + const startIndex = (currentPage - 1) * pageSize; + const endIndex = startIndex + pageSize; const { openModal, closeModal, isOpen } = useModal(); const paginatedData = rapportDailyActivity?.slice(startIndex, endIndex); @@ -68,7 +68,11 @@ export function TeamStatsTable({ } if (!rapportDailyActivity?.length) { - return
No data available
; + return ( +
+ No data available +
+ ); } return ( @@ -94,9 +98,7 @@ export function TeamStatsTable({ {paginatedData?.map((dayData) => ( - + {format(new Date(dayData.date), 'EEEE dd MMM yyyy')} @@ -188,11 +190,7 @@ export function TeamStatsTable({ -
-
- Showing {startIndex + 1} to {Math.min(endIndex, rapportDailyActivity.length)} of{' '} - {rapportDailyActivity.length} entries -
+
+
+ { + setPageSize(value); + setCurrentPage(1); + }} + total={rapportDailyActivity?.length} + /> +
+ Showing {startIndex + 1} to {Math.min(endIndex, rapportDailyActivity?.length || 0)} of{' '} + {rapportDailyActivity?.length || 0} entries +
+
); diff --git a/apps/web/lib/settings/page-dropdown.tsx b/apps/web/lib/settings/page-dropdown.tsx index 2ec58e82e..0899827b5 100644 --- a/apps/web/lib/settings/page-dropdown.tsx +++ b/apps/web/lib/settings/page-dropdown.tsx @@ -10,11 +10,29 @@ import { ChevronDownIcon } from 'lucide-react'; export const PaginationDropdown = ({ setValue, - active + active, + total }: { setValue: Dispatch>; active?: IPagination | null; + total?: number; }) => { + const calculatePaginationOptions = useCallback((total = 0) => { + const baseOptions = [10, 20, 30,40, 50]; + + if (total > 50) { + const nextOption = Math.ceil(total / 10) * 10; + if (!baseOptions.includes(nextOption)) { + baseOptions.push(nextOption); + } + } + baseOptions.sort((a, b) => a - b); + + return baseOptions.map(size => ({ + title: size.toString() + })); + }, []); + const [paginationList, setPagination] = useState([ { title: '10' @@ -33,6 +51,12 @@ export const PaginationDropdown = ({ } ]); + useEffect(() => { + if (total) { + setPagination(calculatePaginationOptions(total)); + } + }, [total, calculatePaginationOptions]); + const items: PaginationItems[] = useMemo(() => mappaginationItems(paginationList), [paginationList]); const [open, setOpen] = useState(false); const [paginationItem, setPaginationItem] = useState(); @@ -72,9 +96,9 @@ export const PaginationDropdown = ({ onClick={() => setOpen(!open)} className={clsxm( 'input-border', - 'w-full flex justify-between rounded-xl px-3 py-2 text-sm items-center', + 'flex justify-between items-center px-3 py-2 w-full text-sm rounded-xl', 'font-normal outline-none', - 'py-0 font-medium h-[45px] w-[145px] z-10 outline-none dark:bg-dark--theme-light' + 'z-10 py-0 font-medium outline-none h-[45px] w-[145px] dark:bg-dark--theme-light' )} > {paginationItem?.selectedLabel || (paginationItem?.Label && )}{' '}