import { Checkbox as MantineCheckbox } from "@mantine/core"; import { forwardRef, useEffect, useRef } from "react"; import { CellProps, Column, ColumnInstance, ensurePluginOrder, HeaderProps, Hooks, MetaBase, TableInstance, TableToggleCommonProps, } from "react-table"; const pluginName = "useCustomSelection"; const checkboxId = "---selection---"; interface CheckboxProps { idIn: string; disabled?: boolean; } const Checkbox = forwardRef< HTMLInputElement, TableToggleCommonProps & CheckboxProps >(({ indeterminate, checked, disabled, idIn, ...rest }, ref) => { const defaultRef = useRef(null); const resolvedRef = ref || defaultRef; useEffect(() => { if (typeof resolvedRef === "object" && resolvedRef.current) { resolvedRef.current.indeterminate = indeterminate ?? false; if (disabled) { resolvedRef.current.checked = false; } else { resolvedRef.current.checked = checked ?? false; } } }, [resolvedRef, indeterminate, checked, disabled]); return ( ); }); function useCustomSelection(hooks: Hooks) { hooks.visibleColumns.push(visibleColumns); hooks.useInstance.push(useInstance); } useCustomSelection.pluginName = pluginName; function useInstance(instance: TableInstance) { const { plugins, rows, onSelect, canSelect, state: { selectedRowIds }, } = instance; ensurePluginOrder(plugins, ["useRowSelect"], pluginName); useEffect(() => { // Performance let items = Object.keys(selectedRowIds).flatMap( (v) => rows.find((n) => n.id === v)?.original ?? [] ); if (canSelect) { items = items.filter((v) => canSelect(v)); } onSelect && onSelect(items); }, [selectedRowIds, onSelect, rows, canSelect]); } function visibleColumns( columns: ColumnInstance[], meta: MetaBase ): Column[] { const { instance } = meta; const checkbox: Column = { id: checkboxId, Header: ({ getToggleAllRowsSelectedProps }: HeaderProps) => ( ), Cell: ({ row }: CellProps) => { const canSelect = instance.canSelect; const disabled = (canSelect && !canSelect(row.original)) ?? false; return ( ); }, }; return [checkbox, ...columns]; } export default useCustomSelection;