import { createColumnHelper } from '@tanstack/react-table'; import { Trash2 } from 'lucide-react'; import { Button } from '@@/buttons'; import { NEW_ROW_ID, UNSET_EDITABLE_ROW, } from '@@/datatables/editable/EditableDatatable'; import { isEditableTableMeta } from '@@/datatables/editable/isEditableTableMeta'; function defaultIsNewRow(row: unknown): boolean { if ( !row || typeof row !== 'object' || !('Id' in row) || typeof row.Id !== 'number' ) { // set custom isNewRow function if object does not use `Id` return false; } return isIdForNewRow(row.Id); } export function isIdForNewRow(id: number) { return id <= NEW_ROW_ID; } export function actionsColumn( onRemove: (item: T) => void, isNewRow: (row: T) => boolean = defaultIsNewRow ) { const columnHelper = createColumnHelper(); return columnHelper.accessor(() => '', { header: 'Actions', id: 'actions', enableSorting: false, cell: ({ row: { original, index }, table }) => { if (!isEditableTableMeta(table.options.meta)) { throw new Error( 'actionsColumn() should be used within the EditableDatatable component' ); } const { editRow, updateRow, getEditableRow, getEditableRowOriginalData, revertRow, acceptRow, } = table.options.meta; const editableRowIndex = getEditableRow(); return index === editableRowIndex || isNewRow(original) ? ( { if (isNewRow(original)) { acceptRow(index); } else { editRow(UNSET_EDITABLE_ROW, undefined); } }} revertRow={() => { if (isNewRow(original)) { revertRow(index); } else { updateRow(index, getEditableRowOriginalData()); editRow(UNSET_EDITABLE_ROW, undefined); } }} /> ) : ( onRemove={onRemove} editableRow={editableRowIndex} editRow={editRow} row={original} rowIndex={index} /> ); }, }); } function ActionsCell({ onRemove, editRow, editableRow, row, rowIndex, }: { onRemove: (item: T) => void; editRow: (index: number, original: T | undefined) => void; editableRow: number; row: T; rowIndex: number; }) { return (
); } function EditActionsCell({ acceptRow, revertRow, }: { acceptRow: () => void; revertRow: () => void; }) { return (
); }