"use client" import * as React from "react" import { SelectTrigger } from "@radix-ui/react-select" import { type Table } from "@tanstack/react-table" import { ArrowUp, CheckCircle2, Download, Loader, Trash2, X, } from "lucide-react" import { toast } from "sonner" import { exportTableToExcel } from "@/lib/export" import { Button } from "@/components/ui/button" import { Portal } from "@/components/ui/portal" import { Select, SelectContent, SelectGroup, SelectItem, } from "@/components/ui/select" import { Separator } from "@/components/ui/separator" import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip" import { Kbd } from "@/components/kbd" import { ActionConfirmDialog } from "@/components/ui/action-dialog" import { Vendor, vendors } from "@/db/schema/vendors" import { modifyVendors } from "../service" interface VendorsTableFloatingBarProps { table: Table } export function VendorsTableFloatingBar({ table }: VendorsTableFloatingBarProps) { const rows = table.getFilteredSelectedRowModel().rows const [isPending, startTransition] = React.useTransition() const [action, setAction] = React.useState< "update-status" | "export" | "delete" >() const [popoverOpen, setPopoverOpen] = React.useState(false) // Clear selection on Escape key press React.useEffect(() => { function handleKeyDown(event: KeyboardEvent) { if (event.key === "Escape") { table.toggleAllRowsSelected(false) } } window.addEventListener("keydown", handleKeyDown) return () => window.removeEventListener("keydown", handleKeyDown) }, [table]) // 공용 confirm dialog state const [confirmDialogOpen, setConfirmDialogOpen] = React.useState(false) const [confirmProps, setConfirmProps] = React.useState<{ title: string description?: string onConfirm: () => Promise | void }>({ title: "", description: "", onConfirm: () => { }, }) // 2) function handleSelectStatus(newStatus: Vendor["status"]) { setAction("update-status") setConfirmProps({ title: `Update ${rows.length} vendor${rows.length > 1 ? "s" : ""} with status: ${newStatus}?`, description: "This action will override their current status.", onConfirm: async () => { startTransition(async () => { const { error } = await modifyVendors({ ids: rows.map((row) => String(row.original.id)), status: newStatus, }) if (error) { toast.error(error) return } toast.success("Vendors updated") setConfirmDialogOpen(false) }) }, }) setConfirmDialogOpen(true) } return (
{rows.length} selected

Clear selection

Esc

Export vendors

{/* 공용 Confirm Dialog */}
) }