"use client"; import { Button, Chip, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, // Input, Pagination, Table, TableBody, TableCell, TableColumn, TableHeader, TableRow, User, } from "@nextui-org/react"; import React from "react"; import { columns, Provider, providers, statusColorMap, statusOptions, } from "../../../app/(prowler)/providers/data"; import { // ChevronDownIcon, PlusIcon, // SearchIcon, VerticalDotsIcon, } from "../../icons/Icons"; interface CustomTableProps { initialVisibleColumns: string[]; initialRowsPerPage?: number; selectionMode: "single" | "multiple" | "none"; } type SortDirection = "ascending" | "descending"; interface SortDescriptor { column: string; direction: SortDirection; } export const CustomTable: React.FC = ({ initialVisibleColumns, initialRowsPerPage = 5, selectionMode = "none", }) => { const [filterValue, setFilterValue] = React.useState(""); // const [selectedKeys, setSelectedKeys] = React.useState(new Set([])); const selectedKeys = new Set([]); // const [visibleColumns, setVisibleColumns] = React.useState< // string | Set // >(new Set(initialVisibleColumns)); const visibleColumns = new Set(initialVisibleColumns); // const [statusFilter, setStatusFilter] = React.useState("all"); const statusFilter: string = "all"; const [rowsPerPage, setRowsPerPage] = React.useState(initialRowsPerPage); // const [sortDescriptor, setSortDescriptor] = React.useState({ // column: "age", // direction: "ascending", // }); const sortDescriptor: SortDescriptor = { column: "age", direction: "ascending", }; const [page, setPage] = React.useState(1); const pages = Math.ceil(providers.length / rowsPerPage); const hasSearchFilter = Boolean(filterValue); const headerColumns = React.useMemo(() => { // if (visibleColumns === "all") return columns; return columns.filter((column) => Array.from(visibleColumns).includes(column.uid), ); }, [visibleColumns]); const filteredItems = React.useMemo(() => { let filteredUsers = [...providers]; if (hasSearchFilter) { filteredUsers = filteredUsers.filter((provider) => provider.account.toLowerCase().includes(filterValue.toLowerCase()), ); } if ( statusFilter !== "all" && Array.from(statusFilter).length !== statusOptions.length ) { filteredUsers = filteredUsers.filter((provider) => Array.from(statusFilter).includes(provider.group), ); } return filteredUsers; }, [providers, filterValue, statusFilter]); const items = React.useMemo(() => { const start = (page - 1) * rowsPerPage; const end = start + rowsPerPage; return filteredItems.slice(start, end); }, [page, filteredItems, rowsPerPage]); const sortedItems = React.useMemo(() => { // The type "any" for a and b will removed in the next iteration. return [...items].sort((a: any, b: any) => { const first = a[sortDescriptor.column]; const second = b[sortDescriptor.column]; const cmp: number = first < second ? -1 : first > second ? 1 : 0; return sortDescriptor.direction === "descending" ? -cmp : cmp; }); }, [sortDescriptor, items]); const renderCell = React.useCallback( (provider: Provider, columnKey: keyof Provider) => { // eslint-disable-next-line security/detect-object-injection const cellValue = provider[columnKey]; switch (columnKey) { case "account": return ( ); case "group": return (

{cellValue}

{provider.group}

); case "scan_status": return ( {cellValue} ); case "actions": return (
Manage Delete
); default: return cellValue; } }, [], ); const onRowsPerPageChange = React.useCallback( (e: React.ChangeEvent) => { setRowsPerPage(Number(e.target.value)); setPage(1); }, [], ); const onSearchChange = React.useCallback((value: string) => { if (value) { setFilterValue(value); setPage(1); } else { setFilterValue(""); } }, []); const topContent = React.useMemo(() => { return (
{/* } value={filterValue} variant="bordered" onClear={() => setFilterValue("")} onValueChange={onSearchChange} /> */}
{/* {statusOptions.map((status) => ( {capitalize(status.name)} ))} {columns.map((column) => ( {capitalize(column.name)} ))} */}
Total {providers.length} entries {items.length < initialRowsPerPage &&
hi hi que pasa
}
); }, [ filterValue, statusFilter, visibleColumns, onSearchChange, onRowsPerPageChange, providers.length, hasSearchFilter, ]); const bottomContent = React.useMemo(() => { return (
{/* {selectionMode !== "none" && ( {selectedKeys === "all" ? "All items selected" : `${selectedKeys.size} of ${items.length} selected`} )} */}
); }, [selectedKeys, items.length, page, pages, hasSearchFilter]); const classNames = React.useMemo( () => ({ wrapper: ["max-h-[382px]", "max-w-3xl"], th: ["bg-transparent", "text-default-500", "border-b", "border-divider"], td: [ // changing the rows border radius // first "group-data-[first=true]:first:before:rounded-none", "group-data-[first=true]:last:before:rounded-none", // middle "group-data-[middle=true]:before:rounded-none", // last "group-data-[last=true]:first:before:rounded-none", "group-data-[last=true]:last:before:rounded-none", ], }), [], ); return ( {(column) => ( {column.name} )} {(item) => { return ( {(columnKey) => ( // @ts-expect-error: Disable type checking for this line {renderCell(item, columnKey)} )} ); }}
); };