import { ReactNode } from 'react'; import classNames from 'classnames'; import { Banner, Loading, SearchField } from 'react-basics'; import { useMessages, useNavigation } from 'components/hooks'; import Empty from 'components/common/Empty'; import Pager from 'components/common/Pager'; import { PagedQueryResult } from 'lib/types'; import styles from './DataTable.module.css'; const DEFAULT_SEARCH_DELAY = 600; export interface DataTableProps { queryResult: PagedQueryResult; searchDelay?: number; allowSearch?: boolean; allowPaging?: boolean; children: ReactNode | ((data: any) => ReactNode); } export function DataTable({ queryResult, searchDelay = 600, allowSearch = true, allowPaging = true, children, }: DataTableProps) { const { formatMessage, labels, messages } = useMessages(); const { result, params, setParams, query: { error, isLoading }, } = queryResult || {}; const { page, pageSize, count, data } = result || {}; const { query } = params || {}; const hasData = Boolean(!isLoading && data?.length); const noResults = Boolean(!isLoading && query && !hasData); const { router, renderUrl } = useNavigation(); const handleSearch = (query: string) => { setParams({ ...params, query, page: params.page ? page : 1 }); }; const handlePageChange = (page: number) => { setParams({ ...params, query, page }); router.push(renderUrl({ page })); }; if (error) { return {formatMessage(messages.error)}; } return ( <> {allowSearch && (hasData || query) && ( )}
{hasData ? (typeof children === 'function' ? children(result) : children) : null} {isLoading && } {!isLoading && !hasData && !query && } {noResults && }
{allowPaging && hasData && ( )} ); } export default DataTable;