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 { toast } from "sonner"; import { useTranslation } from "react-i18next"; export default function ServicePage() { const { t } = useTranslation(); const { data, mutate, error, isLoading } = useSWR( "/api/v1/service", swrFetcher ); useEffect(() => { if (error) toast(t("Error"), { description: t("Results.ErrorFetchingResource", { error: error.message }), }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [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: t("Name"), accessorFn: (row) => row.service.name, accessorKey: "service.name", cell: ({ row }) => { const s = row.original; return
{s.service.name}
; }, }, { header: t("Target"), accessorFn: (row) => row.service.target, accessorKey: "service.target", cell: ({ row }) => { const s = row.original; return
{s.service.target}
; }, }, { header: t("Coverage"), accessorKey: "service.cover", accessorFn: (row) => row.service.cover, cell: ({ row }) => { const s = row.original.service; return (
{(() => { switch (s.cover) { case 0: { return {t("CoverAll")}; } case 1: { return {t("IgnoreAll")}; } } })()}
); }, }, { header: t("SpecificServers"), accessorKey: "service.skipServers", accessorFn: (row) => Object.keys(row.service.skip_servers ?? {}), }, { header: t("Type"), accessorKey: "service.type", accessorFn: (row) => row.service.type, cell: ({ row }) => serviceTypes[row.original.service.type] || "", }, { header: t("Interval"), accessorKey: "service.duration", accessorFn: (row) => row.service.duration, }, { header: t("NotifierGroupID"), accessorKey: "service.ngroup", accessorFn: (row) => row.service.notification_group_id, }, { header: t("Trigger"), accessorKey: "service.triggerTask", accessorFn: (row) => row.service.enable_trigger_task ?? false, }, { header: t("TasksToTriggerOnAlert"), accessorKey: "service.failTriggerTasks", accessorFn: (row) => row.service.fail_trigger_tasks, }, { header: t("TasksToTriggerAfterRecovery"), accessorKey: "service.recoverTriggerTasks", accessorFn: (row) => row.service.recover_trigger_tasks, }, { id: "actions", header: t("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 (

{t("Services")}

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