import {
AllCommunityModule,
ClientSideRowModelModule,
ModuleRegistry,
TextFilterModule,
themeQuartz,
} from "ag-grid-community";
import { AgGridReact } from "ag-grid-react";
import type { ReactNode } from "react";
import { useCallback, useMemo, useRef, useState } from "react";
import { Card } from "../Card";
import { Paginator } from "../Paginator";
import { Skeleton } from "../Skeleton";
import styles from "./index.module.scss";
import type { TableGridProps } from "./table-grid-props";
// Register all Community features
ModuleRegistry.registerModules([
AllCommunityModule,
TextFilterModule,
ClientSideRowModelModule,
]);
const SkeletonCellRenderer = (props: { value?: ReactNode }) => {
if (!props.value) {
return (
);
}
return {props.value}
;
};
const DEFAULT_COL_DEF = {
cellRenderer: SkeletonCellRenderer,
flex: 1,
};
export const TableGrid = >({
rowData,
columnDefs,
loading,
cardProps,
pagination,
...props
}: TableGridProps) => {
const gridRef = useRef>(null);
const [pageSize, setPageSize] = useState(10);
const [currentPage, setCurrentPage] = useState(1);
const [totalPages, setTotalPages] = useState(1);
const mappedColDefs = useMemo(() => {
return columnDefs.map((colDef) => {
return {
...colDef,
// the types in ag-grid are `any` for the cellRenderers which is throwing an error here
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
cellRenderer: loading
? (colDef.loadingCellRenderer ?? SkeletonCellRenderer)
: colDef.cellRenderer,
};
});
}, [columnDefs, loading]);
const onPaginationChanged = useCallback(() => {
const api = gridRef.current?.api;
if (!api) return;
setPageSize(api.paginationGetPageSize());
setCurrentPage(api.paginationGetCurrentPage() + 1);
setTotalPages(api.paginationGetTotalPages());
}, []);
const onPageChange = useCallback((newPage: number) => {
gridRef.current?.api.paginationGoToPage(newPage - 1);
}, []);
const tableGrid = (
className={styles.tableGrid}
// @ts-expect-error empty row data, which is throwing an error here btu required to display 1 row in the loading state
rowData={loading ? [[]] : rowData}
defaultColDef={DEFAULT_COL_DEF}
columnDefs={mappedColDefs}
theme={themeQuartz}
domLayout="autoHeight"
pagination={pagination ?? false}
paginationPageSize={pageSize}
suppressPaginationPanel
onPaginationChanged={onPaginationChanged}
ref={gridRef}
{...props}
/>
);
if (!cardProps && !pagination) {
return tableGrid;
}
return (
)
}
{...cardProps}
>
{tableGrid}
);
};