my-datatable-sydyjo
Version:
A React table to manage and display employees
58 lines (57 loc) • 1.95 kB
JSX
// components/TableHeader.jsx
import PropTypes from 'prop-types'
/**
* TableHeader component renders the table's header row with column headers.
* Each header is clickable to allow sorting by that column.
*
* @param {Array} columns - Array of column objects { header, accessor }
* @param {string|null} sortColumn - The column currently sorted by (accessor key)
* @param {string} sortDirection - Sorting direction ('asc' or 'desc')
* @param {function} onSort - Callback function when a column header is clicked
*/
function TableHeader({ columns, sortColumn, sortDirection, onSort }) {
return (
<thead>
<tr role="row">
{columns.map((col) => (
<th
key={col.accessor}
onClick={() => onSort(col.accessor)}
className="sorting"
aria-label={`${col.accessor}: activate to sort column ${
sortDirection === 'asc' ? 'ascending' : 'descending'
}`}
>
{col.header}
<div className="sort-icon-wrapper">
<span
className={`arrow up ${sortColumn === col.accessor && sortDirection === 'asc' ? 'active' : ''}`}
>
{' '}
▲
</span>
<span
className={`arrow down ${sortColumn === col.accessor && sortDirection === 'desc' ? 'active' : ''}`}
>
▼
</span>
</div>
</th>
))}
</tr>
</thead>
)
}
TableHeader.propTypes = {
columns: PropTypes.arrayOf(
PropTypes.shape({
header: PropTypes.string.isRequired,
accessor: PropTypes.string.isRequired,
render: PropTypes.func,
}),
).isRequired,
sortColumn: PropTypes.string,
sortDirection: PropTypes.oneOf(['asc', 'desc']).isRequired,
onSort: PropTypes.func.isRequired,
}
export default TableHeader