import React, { ChangeEvent, useCallback } from "react"; import { faSortAsc, faSortDesc } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import Column from "./columns"; import Input, { InputType } from "./Input"; export interface TableHeaderProps { sortColumn?: Column; columns: Column[]; showDelete?: boolean; showEdit?: boolean; showAudit?: boolean; showSecondaryAudit?: boolean; onSort?: (sortColumn: Column) => void; onSearch?: (name: string, value: string) => void; } export default function TableHeader({ sortColumn, columns, showEdit, showDelete, showAudit, showSecondaryAudit, onSort, onSearch, }: TableHeaderProps): JSX.Element { const columnsMatch = useCallback((left?: Column, right?: Column) => { return left?.key === right?.key; }, []); const raiseSort = useCallback( (column: Column) => { let sc = sortColumn; if (sc) { if (columnsMatch(column, sc)) { sc.order = sc.order === "asc" ? "desc" : "asc"; } else { sc = column; sc.order = "asc"; } if (onSort) onSort(sc); } }, [sortColumn, onSort, columnsMatch], ); const renderSortIcon = useCallback( (column: Column) => { if (!sortColumn) return null; if (!columnsMatch(column, sortColumn)) return null; return sortColumn.order === "asc" ? ( ) : ( ); }, [sortColumn, columnsMatch], ); const changeSearch = useCallback( (e: ChangeEvent) => { if (onSearch) onSearch(e.target.name, e.target.value); }, [onSearch], ); const searchRow = onSearch ? ( {columns.map((column) => ( {(column.searchable === undefined || column.searchable === true) && ( )} ))} {showEdit && } {showDelete && } {showAudit && } {showAudit && showSecondaryAudit && } ) : ( <> ); return ( {columns.map((column) => ( raiseSort(column)} > {column.label} {renderSortIcon(column)} ))} {showEdit && } {showDelete && } {showAudit && } {showAudit && showSecondaryAudit && } {searchRow} ); }