import React, { useMemo } from "react"; import { Table, Form } from "react-bootstrap"; import { CheckBoxSelect } from "../Shared/Select"; import cx from "classnames"; export interface IColumn { label: string; value: string; mandatory?: boolean; } export const ColumnSelector: React.FC<{ selected: string[]; allColumns: IColumn[]; setSelected: (selected: string[]) => void; }> = ({ selected, allColumns, setSelected }) => { const disableOptions = useMemo(() => { return allColumns.map((col) => { return { ...col, disabled: col.mandatory, }; }); }, [allColumns]); const selectedColumns = useMemo(() => { return disableOptions.filter((col) => selected.includes(col.value)); }, [selected, disableOptions]); return ( { setSelected(v.map((col) => col.value)); }} /> ); }; interface IListTableProps { className?: string; items: T[]; columns: string[]; setColumns: (columns: string[]) => void; allColumns: IColumn[]; selectedIds: Set; onSelectChange: (id: string, selected: boolean, shiftKey: boolean) => void; renderCell: (column: IColumn, item: T, index: number) => React.ReactNode; } export const ListTable = ( props: IListTableProps ) => { const { className, items, columns, setColumns, allColumns, selectedIds, onSelectChange, renderCell, } = props; const visibleColumns = useMemo(() => { return allColumns.filter( (col) => col.mandatory || columns.includes(col.value) ); }, [columns, allColumns]); const renderObjectRow = (item: T, index: number) => { let shiftKey = false; return ( {visibleColumns.map((column) => ( {renderCell(column, item, index)} ))} ); }; const columnHeaders = useMemo(() => { return visibleColumns.map((column) => ( {column.label} )); }, [visibleColumns]); return (
{columnHeaders} {items.map(renderObjectRow)}
); };