/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
/**
* Internal dependencies
*/
import Pagination from '../pagination/Pagination';
import { ITableHeader, ITable, ITableCell } from './TableInterface';
import Input from '../inputs/Input';
/**
* Generate Default Props for Table component.
*/
export const defaultTableProps = {
headers: [],
rows: [],
showPagination: true,
totalItems: 0,
perPage: 10,
currentPage: 1,
checkedAll: false,
onChangePage: () => {},
onCheckAll: () => {},
noDataMessage: __('Sorry ! No data found.', 'jobplace'),
};
/**
* Get Header Row class name.
*
* @param header Table Header Definition
* @param index Table Header Index
* @param headers
*
* @return string
*/
export const getHeaderRowClassName = (
header: ITableHeader,
index: number,
headers: Array<object>
) => {
let className = `border-b border-gray-lite text-sm px-3 py-4 uppercase ${header.className}`;
// Add style for first header
className += `${index === 0 ? ' pl-6 w-0 ' : ' '}`;
// Add style for last header
className += headers.length === index + 1 ? 'text-right pr-7' : 'text-left';
// Add custom style
className += ` ${header.className ? header.className : ''}`;
return className;
};
/**
* Get Body Row class name.
*
* @param cells
* @param index int
* @param customClass string|undefined
*
* @return string
*/
export const getBodyCellClassName = (
cells: Array<ITableCell>,
index: number,
customClass: string | undefined
) => {
let className = `border-b border-gray-lite text-sm p-3 text-left`;
// Add style for first cell
className += `${index === 0 ? ' pl-6 w-0 ' : ' '}`;
// Add style for last cell
className += cells.length === index + 1 ? 'text-right pr-7 ' : 'text-left ';
// Add custom class
className += typeof customClass !== 'undefined' ? customClass : '';
return className;
};
/**
* Table Component.
*
* Handles table component rendering.
*
* @param props
*/
const Table = (props: ITable) => {
const {
headers,
rows,
showPagination,
totalItems,
perPage,
onChangePage,
currentPage,
checkedAll,
onCheckAll,
noDataMessage,
} = props;
const isChecked = typeof checkedAll === 'boolean' ? checkedAll : false;
return (
<>
<div className="table-outer overflow-x-auto">
<table className="table-auto border-collapse border border-gray-lite bg-white mb-2 w-full">
<thead>
<tr className="h-12">
{headers.map((header, index) => (
<th
key={header.key}
className={getHeaderRowClassName(
header,
index,
headers
)}
>
{header.key === 'checkbox' ? (
<Input
type="checkbox"
value={isChecked ? '1' : '0'}
onChange={() =>
typeof onCheckAll ===
'function' &&
onCheckAll(!isChecked)
}
/>
) : (
header.title
)}
</th>
))}
</tr>
</thead>
<tbody>
{rows.length === 0 && (
<tr>
<td colSpan={headers.length}>
<div className="text-center text-gray-dark p-3">
<p>{noDataMessage}</p>
</div>
</td>
</tr>
)}
{rows.map((row, index) => (
<tr key={index} className="h-12">
{row.cells.map(
(cell: ITableCell, indexCell: number) => (
<td
key={indexCell}
className={getBodyCellClassName(
row.cells,
indexCell,
cell.className
)}
>
{cell.value}
</td>
)
)}
</tr>
))}
</tbody>
</table>
</div>
{showPagination && (
<Pagination
perPage={
typeof perPage !== 'undefined'
? perPage
: defaultTableProps.perPage
}
currentPage={
typeof currentPage !== 'undefined'
? currentPage
: defaultTableProps.currentPage
}
total={
typeof totalItems !== 'undefined'
? totalItems
: defaultTableProps.totalItems
}
paginate={(page: number) => {
typeof onChangePage === 'function'
? onChangePage(page)
: '';
}}
/>
)}
</>
);
};
Table.defaultProps = defaultTableProps;
export default Table;
|