import { Table } from '@tanstack/react-table' import { endOfDay, endOfHour, startOfDay, startOfHour } from 'date-fns' import { CalendarClock, CalendarDays, CalendarSearch, ChevronLeft, ChevronRight, Copy, Equal, Search, } from 'lucide-react' import { ComponentPropsWithRef } from 'react' import { DataTableFilterField } from 'components/ui/DataTable/DataTable.types' import { useCopyToClipboard } from 'hooks/ui/useCopyToClipboard' import { cn, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' interface DataTableSheetRowActionProps> extends ComponentPropsWithRef { fieldValue: TFields['value'] filterFields: TFields[] value: string | number table: Table } export function DataTableSheetRowAction>({ fieldValue, filterFields, value, children, className, table, onKeyDown, ...props }: DataTableSheetRowActionProps) { const { copy, isCopied } = useCopyToClipboard() const field = filterFields.find((field) => field.value === fieldValue) const column = table.getColumn(fieldValue.toString()) if (!field || !column) return null 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" > Include ) case 'input': return ( column?.setFilterValue(value)} className="flex items-center gap-2" > Include ) 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 ? (
Value copied
) : null}
{renderOptions()} copy(String(value), { timeout: 1000 })} className="flex items-center gap-2" > Copy value
) }