"use client"; import { ColumnDef } from "@tanstack/react-table"; import { AlertTriangle, Container, Eye } from "lucide-react"; import { ActionDropdown, ActionDropdownItem, } from "@/components/shadcn/dropdown"; import { EntityInfo } from "@/components/shadcn/entities"; import { DataTableColumnHeader } from "@/components/shadcn/table"; import { getGroupLabel } from "@/lib/categories"; import { getRegionFlag } from "@/lib/region-flags"; import { ProviderType, ResourceProps } from "@/types"; const getResourceData = ( row: { original: ResourceProps }, field: keyof ResourceProps["attributes"], ) => { return row.original.attributes?.[field]; }; const getProviderData = ( row: { original: ResourceProps }, field: keyof ResourceProps["relationships"]["provider"]["data"]["attributes"], ) => { return ( row.original.relationships?.provider?.data?.attributes?.[field] ?? `No ${field} found in provider` ); }; const ResourceNameCell = ({ row }: { row: { original: ResourceProps } }) => { const resourceName = row.original.attributes?.name; const resourceUid = row.original.attributes?.uid; const entityAlias = typeof resourceName === "string" && resourceName.trim().length > 0 ? resourceName : "Unnamed resource"; return (
} entityAlias={entityAlias} entityId={ resourceUid && typeof resourceUid === "string" ? resourceUid : undefined } />
); }; // Component for failed findings badge with warning style const FailedFindingsBadge = ({ count }: { count: number }) => { if (count === 0) { return ( 0 ); } return ( {count} ); }; interface GetColumnResourcesOptions { onViewDetails: (resource: ResourceProps) => void; } export function getColumnResources({ onViewDetails, }: GetColumnResourcesOptions): ColumnDef[] { return [ // Name column { accessorKey: "resourceName", header: ({ column }) => ( ), cell: ({ row }) => , enableSorting: false, }, // Provider Account column { accessorKey: "provider", header: ({ column }) => ( ), cell: ({ row }) => { const provider = getProviderData(row, "provider"); const alias = getProviderData(row, "alias"); const uid = getProviderData(row, "uid"); return ( ); }, enableSorting: false, }, // Failed Findings column { accessorKey: "failedFindings", header: ({ column }) => ( ), cell: ({ row }) => { const failedFindingsCount = getResourceData( row, "failed_findings_count", ) as number; return ; }, enableSorting: false, }, // Group column { accessorKey: "groups", header: ({ column }) => ( ), cell: ({ row }) => { const groups = getResourceData(row, "groups") as string[] | null; if (!groups || groups.length === 0) { return

-

; } const displayLabel = getGroupLabel(groups[0]); const extraCount = groups.length - 1; return (

{displayLabel}

{extraCount > 0 && ( +{extraCount} )}
); }, enableSorting: false, }, // Type column { accessorKey: "type", header: ({ column }) => ( ), cell: ({ row }) => { const type = getResourceData(row, "type"); return (

{typeof type === "string" ? type : "-"}

); }, }, // Region column { accessorKey: "region", header: ({ column }) => ( ), cell: ({ row }) => { const region = getResourceData(row, "region"); const regionText = typeof region === "string" ? region : "-"; const regionFlag = typeof region === "string" ? getRegionFlag(region) : ""; return ( {regionFlag && ( {regionFlag} )} {regionText} ); }, }, // Service column { accessorKey: "service", header: ({ column }) => ( ), cell: ({ row }) => { const service = getResourceData(row, "service"); return (

{typeof service === "string" ? service : "-"}

); }, }, // Actions column { id: "actions", header: () =>
, cell: ({ row }) => (
event.stopPropagation()} > } label="View Details" onSelect={() => onViewDetails(row.original)} />
), enableSorting: false, }, ]; }