import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { saveAs } from 'file-saver'; import { DataTable, OverflowMenu, OverflowMenuItem, Pagination, Table, TableBody, TableCell, TableContainer, TableHead, TableHeader, TableRow, TableToolbar, TableToolbarContent, TableToolbarSearch, Tile, } from '@carbon/react'; import { DocumentDownload } from '@carbon/react/icons'; import { isDesktop, useLayoutType, usePagination } from '@openmrs/esm-framework'; import { type DataTableRenderProps } from './types'; import styles from './table.scss'; type FilterProps = { rowIds: Array; headers: any; cellsById: any; inputValue: string; getCellId: (row, key) => string; }; interface ListProps { columns: any; data: any; children?: (renderProps: DataTableRenderProps) => React.ReactElement; totalItems?: number; goToPage?: (page: number) => void; hasToolbar?: boolean; } const DataList: React.FC = ({ columns, data, children, totalItems, goToPage, hasToolbar = true }) => { const { t } = useTranslation(); const layout = useLayoutType(); const [allRows, setAllRows] = useState([]); const isTablet = useLayoutType() === 'tablet'; const [list] = useState(data); const pageSizes = [10, 20, 30, 40, 50]; const [currentPageSize, setPageSize] = useState(10); const { goTo, results: paginatedList, currentPage } = usePagination(list, currentPageSize); useEffect(() => { const rows: Array> = []; paginatedList.map((item: any, index) => { return rows.push({ ...item, id: index++ }); }); setAllRows(rows); }, [paginatedList, allRows]); const handleFilter = ({ rowIds, headers, cellsById, inputValue, getCellId }: FilterProps): Array => { return rowIds.filter((rowId) => headers.some(({ key }) => { const cellId = getCellId(rowId, key); const filterableValue = cellsById[cellId].value; const filterTerm = inputValue?.toLowerCase(); if (typeof filterableValue === 'boolean') { return false; } return ('' + filterableValue)?.toLowerCase().includes(filterTerm); }), ); }; const handleExportCSV = () => { const csvString = convertToCSV(list, columns); const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8' }); saveAs(blob, 'data.csv'); }; const handleExportJSON = () => { const jsonString = JSON.stringify(list, null, 2); const jsonBlob = new Blob([jsonString], { type: 'application/json' }); saveAs(jsonBlob, 'data.json'); }; const convertToCSV = (data, columns) => { const header = columns.map((col) => col.header).join(','); const rows = data.map((row) => columns.map((col) => JSON.stringify(row[col.key])).join(',')); return [header, ...rows].join('\n'); }; return ( <> {({ rows, headers, getHeaderProps, getTableProps, onInputChange }) => (
{hasToolbar && ( {children ? ( children({ onInputChange, }) ) : ( <> )} )} {headers.map((header) => ( {header.header} ))} {rows.map((row) => ( {row.cells.map((cell) => ( {cell.value} ))} ))}
{rows.length === 0 ? (

{t('noData', 'No data to display')}

{t('checkFilters', 'Check the filters above')}

) : null} { if (pageSize !== currentPageSize) { setPageSize(pageSize); } if (page !== currentPage) { if (goToPage) { goToPage(page); return; } goTo(page); } }} />
)}
); }; export default DataList;