diff --git a/ui/litellm-dashboard/src/components/view_users/table.tsx b/ui/litellm-dashboard/src/components/view_users/table.tsx index 9ae31014882..6b9380aaeec 100644 --- a/ui/litellm-dashboard/src/components/view_users/table.tsx +++ b/ui/litellm-dashboard/src/components/view_users/table.tsx @@ -1,15 +1,37 @@ -import { ColumnDef, flexRender, getCoreRowModel, SortingState, useReactTable } from "@tanstack/react-table"; +import { + ColumnDef, + flexRender, + getCoreRowModel, + SortingState, + useReactTable, +} from "@tanstack/react-table"; import React from "react"; -import { Table, TableHead, TableHeaderCell, TableBody, TableRow, TableCell, Select, SelectItem } from "@tremor/react"; -import { SwitchVerticalIcon, ChevronUpIcon, ChevronDownIcon } from "@heroicons/react/outline"; -import { Skeleton } from "antd"; +// eslint-disable-next-line litellm-ui/no-banned-ui-imports +import { + Table, + TableHead, + TableHeaderCell, + TableBody, + TableRow, + TableCell, + Select, + SelectItem, +} from "@tremor/react"; +import { + ArrowUpDown, + ChevronDown, + ChevronUp, + CircleUserRound, + Search, + User, +} from "lucide-react"; import { UserInfo } from "./types"; import UserInfoView from "./user_info_view"; import { columns as createColumns } from "./columns"; import { FilterInput } from "@/components/common_components/Filters/FilterInput"; import { FiltersButton } from "@/components/common_components/Filters/FiltersButton"; import { ResetFiltersButton } from "@/components/common_components/Filters/ResetFiltersButton"; -import { Search, User, CircleUserRound } from "lucide-react"; +import { cn } from "@/lib/utils"; interface FilterState { email: string; @@ -26,6 +48,7 @@ interface FilterState { interface UserDataTableProps { data: UserInfo[]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any columns: ColumnDef[]; isLoading?: boolean; onSortChange?: (sortBy: string, sortOrder: "asc" | "desc") => void; @@ -42,12 +65,12 @@ interface UserDataTableProps { selectedUsers?: UserInfo[]; onSelectionChange?: (selectedUsers: UserInfo[]) => void; enableSelection?: boolean; - // Filter-related props filters: FilterState; updateFilters: (update: Partial) => void; initialFilters: FilterState; + // eslint-disable-next-line @typescript-eslint/no-explicit-any teams: any[] | null; - // Pagination props + // eslint-disable-next-line @typescript-eslint/no-explicit-any userListResponse: any; currentPage: number; handlePageChange: (newPage: number) => void; @@ -165,6 +188,7 @@ export function UserDataTable({ state: { sorting, }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any onSortingChange: (updaterOrValue: any) => { const newSorting = typeof updaterOrValue === "function" ? updaterOrValue(sorting) : updaterOrValue; setSorting(newSorting); @@ -212,9 +236,9 @@ export function UserDataTable({ } return ( -
+
{/* Filter Section */} -
+
{/* Search and Filter Controls */}
@@ -295,16 +319,21 @@ export function UserDataTable({ {/* Results Count and Pagination */}
{isLoading ? ( - +
) : ( - + Showing{" "} - {userListResponse && userListResponse.users && userListResponse.users.length > 0 + {userListResponse && + userListResponse.users && + userListResponse.users.length > 0 ? (userListResponse.page - 1) * userListResponse.page_size + 1 : 0}{" "} -{" "} {userListResponse && userListResponse.users - ? Math.min(userListResponse.page * userListResponse.page_size, userListResponse.total) + ? Math.min( + userListResponse.page * userListResponse.page_size, + userListResponse.total, + ) : 0}{" "} of {userListResponse ? userListResponse.total : 0} results @@ -314,28 +343,38 @@ export function UserDataTable({
{isLoading ? ( <> - - +
+
) : ( <> @@ -357,11 +396,13 @@ export function UserDataTable({ {headerGroup.headers.map((header) => (
@@ -370,18 +411,23 @@ export function UserDataTable({ ? null : flexRender(header.column.columnDef.header, header.getContext())}
- {header.id !== "actions" && header.column.getCanSort() && ( -
- {header.column.getIsSorted() ? ( - { - asc: , - desc: , - }[header.column.getIsSorted() as string] - ) : ( - - )} -
- )} + {header.id !== "actions" && + header.column.getCanSort() && ( +
+ {header.column.getIsSorted() ? ( + { + asc: ( + + ), + desc: ( + + ), + }[header.column.getIsSorted() as string] + ) : ( + + )} +
+ )}
))} @@ -391,8 +437,11 @@ export function UserDataTable({ {isLoading ? ( - -
+ +

🚅 Loading users...

@@ -403,30 +452,34 @@ export function UserDataTable({ {row.getVisibleCells().map((cell) => ( { if (cell.column.id === "user_id") { handleUserClick(cell.getValue() as string, false); } }} - style={{ - cursor: cell.column.id === "user_id" ? "pointer" : "default", - color: cell.column.id === "user_id" ? "#3b82f6" : "inherit", - }} > - {flexRender(cell.column.columnDef.cell, cell.getContext())} + {flexRender( + cell.column.columnDef.cell, + cell.getContext(), + )} ))} )) ) : ( - -
+ +

No users found