import { swrFetcher } from "@/api/api" import { Checkbox } from "@/components/ui/checkbox" import { ServiceCard } from "@/components/service" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { ModelServiceResponse, ModelServiceResponseItem as Service } from "@/types" import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table" import useSWR from "swr" import { conv } from "@/lib/utils" import { useEffect, useMemo } from "react" import { serviceTypes } from "@/types" import { ActionButtonGroup } from "@/components/action-button-group" import { deleteService } from "@/api/service" import { HeaderButtonGroup } from "@/components/header-button-group" import { Skeleton } from "@/components/ui/skeleton" import { toast } from "sonner" export default function ServicePage() { const { data, mutate, error, isLoading } = useSWR('/api/v1/service', swrFetcher); useEffect(() => { if (error) toast("Error", { description: `Error fetching resource: ${error.message}.`, }) }, [error]) const columns: ColumnDef[] = [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="Select all" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" /> ), enableSorting: false, enableHiding: false, }, { header: "ID", accessorKey: "service.id", accessorFn: row => row.service.id, }, { header: "Name", accessorKey: "service.name", cell: ({ row }) => { const s = row.original; return (
{s.service.name}
) } }, { header: "Target", accessorKey: "service.target", cell: ({ row }) => { const s = row.original; return (
{s.service.target}
) } }, { header: "Coverage", accessorKey: "service.cover", accessorFn: row => { switch (row.service.cover) { case 0: { return "Cover All" } case 1: { return "Ignore All" } } } }, { header: "Specific Servers", accessorKey: "service.skipServers", accessorFn: row => Object.keys(row.service.skip_servers ?? {}), }, { header: "Type", accessorKey: "service.type", accessorFn: row => serviceTypes[row.service.type] || '', }, { header: "Interval", accessorKey: "service.duration", accessorFn: row => row.service.duration, }, { header: "Notification Group ID", accessorKey: "service.ngroup", accessorFn: row => row.service.notification_group_id, }, { header: "On Trigger", accessorKey: "service.triggerTask", accessorFn: row => row.service.enable_trigger_task ?? false, }, { header: "Tasks to trigger on an alarm", accessorKey: "service.failTriggerTasks", accessorFn: row => row.service.fail_trigger_tasks, }, { header: "Tasks to trigger after recovery", accessorKey: "service.recoverTriggerTasks", accessorFn: row => row.service.recover_trigger_tasks, }, { id: "actions", header: "Actions", cell: ({ row }) => { const s = row.original return ( ) }, }, ] const dataArr = useMemo(() => { return conv.recordToArr(data?.services ?? {}); }, [data?.services]); const table = useReactTable({ data: dataArr, columns, getCoreRowModel: getCoreRowModel(), }) const selectedRows = table.getSelectedRowModel().rows; return (

Service

r.original.service.id), mutate: mutate, }}>
{isLoading ? (
) : ( {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} ) })} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No results. )}
)}
) }