2023-09-27 06:20:29 +00:00
|
|
|
import { Banner, Loading, SearchField } from 'react-basics';
|
2023-08-25 18:54:44 +00:00
|
|
|
import { useMessages } from 'components/hooks';
|
|
|
|
|
import Empty from 'components/common/Empty';
|
|
|
|
|
import Pager from 'components/common/Pager';
|
|
|
|
|
import styles from './DataTable.module.css';
|
2023-09-27 06:20:29 +00:00
|
|
|
import classNames from 'classnames';
|
2023-08-25 18:54:44 +00:00
|
|
|
|
2023-09-27 06:20:29 +00:00
|
|
|
const DEFAULT_SEARCH_DELAY = 600;
|
2023-08-25 18:54:44 +00:00
|
|
|
|
|
|
|
|
export const DataTableStyles = styles;
|
|
|
|
|
|
|
|
|
|
export function DataTable({
|
2023-09-27 06:20:29 +00:00
|
|
|
data = {},
|
|
|
|
|
params = {},
|
|
|
|
|
setParams,
|
|
|
|
|
isLoading,
|
|
|
|
|
error,
|
2023-08-25 18:54:44 +00:00
|
|
|
searchDelay,
|
|
|
|
|
showSearch = true,
|
|
|
|
|
showPaging = true,
|
|
|
|
|
children,
|
|
|
|
|
}) {
|
|
|
|
|
const { formatMessage, labels, messages } = useMessages();
|
2023-09-27 06:20:29 +00:00
|
|
|
const { pageSize, count } = data;
|
|
|
|
|
const { query, page } = params;
|
|
|
|
|
const hasData = Boolean(!isLoading && data?.data?.length);
|
|
|
|
|
const noResults = Boolean(!isLoading && query && !hasData);
|
2023-08-25 18:54:44 +00:00
|
|
|
|
2023-09-27 06:20:29 +00:00
|
|
|
const handleSearch = query => {
|
|
|
|
|
setParams({ ...params, query });
|
2023-08-25 18:54:44 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handlePageChange = page => {
|
2023-09-27 06:20:29 +00:00
|
|
|
setParams({ ...params, page });
|
2023-08-25 18:54:44 +00:00
|
|
|
};
|
|
|
|
|
|
2023-09-27 06:20:29 +00:00
|
|
|
if (error) {
|
|
|
|
|
return <Banner variant="error">{formatMessage(messages.error)}</Banner>;
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-25 18:54:44 +00:00
|
|
|
return (
|
2023-09-27 06:20:29 +00:00
|
|
|
<>
|
|
|
|
|
{(hasData || query || isLoading) && showSearch && (
|
2023-08-25 18:54:44 +00:00
|
|
|
<SearchField
|
|
|
|
|
className={styles.search}
|
|
|
|
|
value={query}
|
|
|
|
|
onChange={handleSearch}
|
|
|
|
|
delay={searchDelay || DEFAULT_SEARCH_DELAY}
|
|
|
|
|
autoFocus={true}
|
|
|
|
|
placeholder={formatMessage(labels.search)}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
2023-09-27 06:20:29 +00:00
|
|
|
<div
|
|
|
|
|
className={classNames(styles.body, { [styles.status]: isLoading || noResults || !hasData })}
|
|
|
|
|
>
|
|
|
|
|
{hasData && typeof children === 'function' ? children(data) : children}
|
|
|
|
|
{isLoading && <Loading icon="dots" />}
|
|
|
|
|
{!isLoading && !hasData && !query && (
|
|
|
|
|
<Empty message={formatMessage(messages.noDataAvailable)} />
|
|
|
|
|
)}
|
|
|
|
|
{noResults && <Empty message={formatMessage(messages.noResultsFound)} />}
|
|
|
|
|
</div>
|
2023-08-25 18:54:44 +00:00
|
|
|
{showPaging && (
|
|
|
|
|
<Pager
|
|
|
|
|
className={styles.pager}
|
|
|
|
|
page={page}
|
|
|
|
|
pageSize={pageSize}
|
|
|
|
|
count={count}
|
|
|
|
|
onPageChange={handlePageChange}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
2023-09-27 06:20:29 +00:00
|
|
|
</>
|
2023-08-25 18:54:44 +00:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default DataTable;
|