import { Table } from '@tanstack/react-table' import { endOfDay, endOfHour, startOfDay, startOfHour } from 'date-fns' import { CalendarClock, CalendarDays, CalendarSearch, ChevronLeft, ChevronRight, Copy, Equal, Filter, } from 'lucide-react' import { ComponentPropsWithRef } from 'react' import { cn, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' import { DataTableFilterField } from '@/components/ui/DataTable/DataTable.types' import { useCopyToClipboard } from '@/hooks/ui/useCopyToClipboard' interface DataTableSheetRowActionProps< TData, TFields extends DataTableFilterField, > extends ComponentPropsWithRef { fieldValue?: TFields['value'] filterFields: TFields[] value: string | number table: Table label?: string } export function DataTableSheetRowAction>({ fieldValue, filterFields, value, children, className, table, label, onKeyDown, ...props }: DataTableSheetRowActionProps) { const { copy, isCopied } = useCopyToClipboard() const field = !!fieldValue ? filterFields.find((f) => f.value === fieldValue) : undefined const column = !!fieldValue && !!field ? table.getAllColumns().find((c) => c.id === fieldValue.toString()) : undefined function renderOptions() { if (!field) return null switch (field.type) { case 'checkbox': return ( { const filterValue = column?.getFilterValue() as undefined | Array const newValue = filterValue?.includes(value) ? filterValue : [...(filterValue || []), value] column?.setFilterValue(newValue) }} className="flex items-center gap-2" > Add as filter for {column?.id} ) case 'input': return ( column?.setFilterValue(value)} className="flex items-center gap-2" > Add as filter for {column?.id} ) case 'slider': return ( column?.setFilterValue([0, value])} className="flex items-center gap-2" > {/* FIXME: change icon as it is not clear */} Less or equal than column?.setFilterValue([value, 5000])} className="flex items-center gap-2" > {/* FIXME: change icon as it is not clear */} Greater or equal than column?.setFilterValue([value])} className="flex items-center gap-2" > Equal to ) case 'timerange': const date = new Date(value) return ( column?.setFilterValue([date])} className="flex items-center gap-2" > Exact timestamp { const start = startOfHour(date) const end = endOfHour(date) column?.setFilterValue([start, end]) }} className="flex items-center gap-2" > Same hour { const start = startOfDay(date) const end = endOfDay(date) column?.setFilterValue([start, end]) }} className="flex items-center gap-2" > Same day ) default: return null } } return ( { if (e.key === 'ArrowDown') { // REMINDER: default behavior is to open the dropdown menu // But because we use it to navigate between rows, we need to prevent it // and only use "Enter" to select the option e.preventDefault() } onKeyDown?.(e) }} {...props} > {children} {isCopied ? (
Copied
) : null}
{!!field && !!column && ( <> {renderOptions()} )} copy(String(value), { timeout: 1000 })} className="flex items-center gap-2" > Copy {label}
) }