add deselect option to context menu

This commit is contained in:
andrzej 2024-06-29 16:26:46 +02:00
parent 97a537f5a2
commit c6496130e3
2 changed files with 23 additions and 7 deletions

View File

@ -6,17 +6,23 @@ import { Trash2 } from "lucide-react"
import Link from "next/link" import Link from "next/link"
import { ContextMenuSeparator } from "@radix-ui/react-context-menu" import { ContextMenuSeparator } from "@radix-ui/react-context-menu"
export default function FormContextMenu({ pathname, row }) { export default function FormContextMenu({ pathname, row, selectedRows, deselect }) {
return ( return (
<Dialog> <Dialog modal={true}>
<ContextMenuContent > <ContextMenuContent >
{pathname !== "/submission" ? {pathname !== "/submission" && selectedRows.length <= 1 ?
<Link href={`${pathname}/${row.original.id}`}> <Link href={`${pathname}/${row.original.id}`}>
<ContextMenuItem>Inspect</ContextMenuItem> <ContextMenuItem>Inspect</ContextMenuItem>
</Link> </Link>
: "" : ""
} }
{
selectedRows ?
<ContextMenuItem onClick={deselect}>Deselect</ContextMenuItem>
: ""
}
<ContextMenuSeparator /> <ContextMenuSeparator />
<DialogTrigger asChild> <DialogTrigger asChild>
<ContextMenuItem className="text-destructive">Delete</ContextMenuItem> <ContextMenuItem className="text-destructive">Delete</ContextMenuItem>

View File

@ -15,7 +15,7 @@ import {
DropdownMenuRadioGroup DropdownMenuRadioGroup
} from "@/components/ui/dropdown-menu" } from "@/components/ui/dropdown-menu"
import { Input } from "@/components/ui/input" import { Input } from "@/components/ui/input"
import { Component, ComponentProps, useState } from "react" import { Component, ComponentProps, use, useState } from "react"
import { import {
ColumnDef, ColumnDef,
flexRender, flexRender,
@ -82,8 +82,12 @@ export function DataTable<TData, TValue>({
columnVisibility, columnVisibility,
} }
}) })
const pathname: Pathname = usePathname() const pathname: Pathname = usePathname()
const [filterBy, setFilterBy] = useState(table.getAllColumns()[0]) const [filterBy, setFilterBy] = useState(table.getAllColumns()[0])
const [isContextMenuOpen, setIsContextMenuOpen] = useState(false)
return (<> return (<>
<div className="flex justify-between items-center py-4"> <div className="flex justify-between items-center py-4">
<div className="flex gap-2"> <div className="flex gap-2">
@ -204,20 +208,26 @@ export function DataTable<TData, TValue>({
<TableBody> <TableBody>
{table.getRowModel().rows?.length ? ( {table.getRowModel().rows?.length ? (
table.getRowModel().rows.map((row) => ( table.getRowModel().rows.map((row) => (
<ContextMenu> <ContextMenu onOpenChange={open => setIsContextMenuOpen(open)}>
<ContextMenuTrigger asChild> <ContextMenuTrigger asChild>
<TableRow <TableRow
key={row.id} key={row.id}
data-state={row.getIsSelected() && "selected"} data-state={row.getIsSelected() && "selected"}
tabIndex={0} tabIndex={0}
onClick={() => row.toggleSelected()} //check if context menu is open, so as not to select the row on clicking a menu item
onClick={() => { if (!isContextMenuOpen) { row.toggleSelected() } }}
> >
{row.getVisibleCells().map((cell) => ( {row.getVisibleCells().map((cell) => (
<TableCell key={cell.id}> <TableCell key={cell.id}>
{flexRender(cell.column.columnDef.cell, cell.getContext())} {flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell> </TableCell>
))} ))}
<FormContextMenu pathname={pathname} row={row} /> <FormContextMenu
pathname={pathname}
row={row}
selectedRows={table.getSelectedRowModel().flatRows}
deselect={table.resetRowSelection}
/>
</TableRow> </TableRow>
</ContextMenuTrigger> </ContextMenuTrigger>
</ContextMenu> </ContextMenu>