"use client"; import { getRelativeTime } from "../lib/getRelativeTime"; import { InsertModal, UpdateModal } from "./InsertModal"; import { callServerPromise } from "./callServerPromise"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { type MachineType } from "@/db/schema"; import type { AccessType } from "@/lib/AccessType"; import { addCustomMachineSchema, addMachineSchema, } from "@/server/addMachineSchema"; import { addCustomMachine, addMachine, buildMachine, deleteMachine, disableMachine, enableMachine, updateCustomMachine, updateMachine, } from "@/server/curdMachine"; import type { ColumnDef, ColumnFiltersState, SortingState, VisibilityState, } from "@tanstack/react-table"; import { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table"; import { ArrowUpDown, MoreHorizontal } from "lucide-react"; import * as React from "react"; import { useState } from "react"; import type { z } from "zod"; export type Machine = MachineType; export const columns: ColumnDef[] = [ { accessorKey: "id", id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="Select all" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" /> ), enableSorting: false, enableHiding: false, }, { accessorKey: "name", header: ({ column }) => { return ( ); }, cell: ({ row }) => { return ( //
{row.getValue("name")} {row.original.disabled && ( Disabled )} {!row.original.disabled && row.original.status && ( {row.original.status} )}
// ); }, }, { accessorKey: "endpoint", header: () =>
Endpoint
, cell: ({ row }) => { return (
{row.original.endpoint}
); }, }, { accessorKey: "type", header: () =>
Type
, cell: ({ row }) => { return (
{row.original.type}
); }, }, { accessorKey: "date", sortingFn: "datetime", enableSorting: true, header: ({ column }) => { return ( ); }, cell: ({ row }) => (
{getRelativeTime(row.original.updated_at)}
), }, { id: "actions", enableHiding: false, cell: ({ row }) => { const machine = row.original; const [open, setOpen] = useState(false); return ( Actions { callServerPromise(deleteMachine(machine.id)); }} > Delete Machine {machine.disabled ? ( { callServerPromise(enableMachine(machine.id)); }} > Enable Machine ) : ( { callServerPromise(disableMachine(machine.id)); }} > Disable Machine )} {machine.type === "comfy-deploy-serverless" && ( <> Open ComfyUI { buildMachine({ id: machine.id, }); }} > Rebuild )} setOpen(true)}> Edit {machine.type === "comfy-deploy-serverless" ? ( ) : ( )} ); }, }, ]; export function MachineList({ data, userMetadata, }: { data: Machine[]; userMetadata: z.infer; }) { const [sorting, setSorting] = React.useState([]); const [columnFilters, setColumnFilters] = React.useState( [] ); const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const table = useReactTable({ data, columns, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), onColumnVisibilityChange: setColumnVisibility, onRowSelectionChange: setRowSelection, state: { sorting, columnFilters, columnVisibility, rowSelection, }, }); return (
table.getColumn("name")?.setFilterValue(event.target.value) } className="max-w-sm" />
machine.type === "comfy-deploy-serverless" ) && !userMetadata.betaFeaturesAccess } tooltip={ data.some((machine) => machine.type === "comfy-deploy-serverless") ? "Only one hosted machine at preview stage" : undefined } title="New Machine" description="Add custom ComfyUI machines to your account." serverAction={addCustomMachine} formSchema={addCustomMachineSchema} fieldConfig={{ type: { fieldType: "fallback", inputProps: { disabled: true, showLabel: false, type: "hidden", }, }, snapshot: { fieldType: "snapshot", inputProps: { showLabel: false, }, }, models: { fieldType: "models", inputProps: { showLabel: false, }, }, gpu: { fieldType: !userMetadata.betaFeaturesAccess ? "fallback" : "select", inputProps: { disabled: !userMetadata.betaFeaturesAccess, }, }, }} />
{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. )}
{table.getFilteredSelectedRowModel().rows.length} of{" "} {table.getFilteredRowModel().rows.length} row(s) selected.
); }