Presupuestador_web/client/src/components/DataTable/DataTableRowActions.tsx

74 lines
2.1 KiB
TypeScript
Raw Normal View History

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>
);
}