"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,
},
];
}