2024-06-11 16:48:09 +00:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
Button,
|
|
|
|
|
DropdownMenu,
|
|
|
|
|
DropdownMenuContent,
|
|
|
|
|
DropdownMenuItem,
|
|
|
|
|
DropdownMenuLabel,
|
|
|
|
|
DropdownMenuSeparator,
|
|
|
|
|
DropdownMenuShortcut,
|
|
|
|
|
DropdownMenuTrigger,
|
|
|
|
|
} from "@/ui";
|
2024-06-29 19:39:25 +00:00
|
|
|
import { CellContext, Row } from "@tanstack/react-table";
|
|
|
|
|
import { t } from "i18next";
|
2024-06-11 16:48:09 +00:00
|
|
|
import { MoreHorizontalIcon } from "lucide-react";
|
|
|
|
|
|
2024-06-29 19:39:25 +00:00
|
|
|
type DataTableRowActionContext<TData, TValue> = CellContext<TData, TValue> & {
|
|
|
|
|
row: Row<TData>;
|
|
|
|
|
};
|
2024-06-11 16:48:09 +00:00
|
|
|
|
|
|
|
|
export type DataTablaRowActionFunction<TData, TValue> = (
|
2024-06-29 19:39:25 +00:00
|
|
|
props: DataTableRowActionContext<TData, TValue>
|
2024-06-11 16:48:09 +00:00
|
|
|
) => DataTableRowActionDefinition<TData, TValue>[];
|
|
|
|
|
|
|
|
|
|
export type DataTableRowActionDefinition<TData, TValue> = {
|
|
|
|
|
label: string | "-";
|
|
|
|
|
shortcut?: string;
|
2024-06-29 19:39:25 +00:00
|
|
|
onClick?: (props: DataTableRowActionContext<TData, TValue>, e: React.BaseSyntheticEvent) => void;
|
2024-06-11 16:48:09 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export type DataTableRowActionsProps<TData, TValue> = {
|
|
|
|
|
actions?: DataTablaRowActionFunction<TData, TValue>;
|
2024-06-29 19:39:25 +00:00
|
|
|
row?: DataTableRowActionContext<TData, TValue>;
|
2024-06-11 16:48:09 +00:00
|
|
|
};
|
|
|
|
|
|
2024-06-29 19:39:25 +00:00
|
|
|
export function DataTableRowActions<TData = any, TValue = any>({
|
2024-06-11 16:48:09 +00:00
|
|
|
actions,
|
|
|
|
|
...props
|
|
|
|
|
}: DataTableRowActionsProps<TData, TValue>) {
|
|
|
|
|
return (
|
|
|
|
|
<DropdownMenu>
|
|
|
|
|
<DropdownMenuTrigger asChild>
|
|
|
|
|
<Button
|
2024-06-29 19:39:25 +00:00
|
|
|
aria-haspopup='true'
|
|
|
|
|
size='icon'
|
|
|
|
|
variant='link'
|
|
|
|
|
className='w-4 h-4 translate-y-[2px]'
|
2024-06-11 16:48:09 +00:00
|
|
|
>
|
2024-06-29 19:39:25 +00:00
|
|
|
<MoreHorizontalIcon className='w-4 h-4' />
|
|
|
|
|
<span className='sr-only'>{t("common.open_menu")}</span>
|
2024-06-11 16:48:09 +00:00
|
|
|
</Button>
|
|
|
|
|
</DropdownMenuTrigger>
|
|
|
|
|
|
2024-06-29 19:39:25 +00:00
|
|
|
<DropdownMenuContent align='end'>
|
|
|
|
|
<DropdownMenuLabel>{t("common.actions")} </DropdownMenuLabel>
|
2024-06-11 16:48:09 +00:00
|
|
|
{actions &&
|
|
|
|
|
actions(props).map((action, index) =>
|
|
|
|
|
action.label === "-" ? (
|
|
|
|
|
<DropdownMenuSeparator key={index} />
|
|
|
|
|
) : (
|
|
|
|
|
<DropdownMenuItem
|
|
|
|
|
key={index}
|
2024-06-29 19:39:25 +00:00
|
|
|
onClick={(event) => (action.onClick ? action.onClick(props, event) : null)}
|
2024-06-11 16:48:09 +00:00
|
|
|
>
|
|
|
|
|
{action.label}
|
|
|
|
|
<DropdownMenuShortcut>{action.shortcut}</DropdownMenuShortcut>
|
|
|
|
|
</DropdownMenuItem>
|
2024-06-29 19:39:25 +00:00
|
|
|
)
|
2024-06-11 16:48:09 +00:00
|
|
|
)}
|
|
|
|
|
</DropdownMenuContent>
|
|
|
|
|
</DropdownMenu>
|
|
|
|
|
);
|
|
|
|
|
}
|