Advertisement
kunbata

Incident table

May 11th, 2024
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //incident table
  2.  
  3. import React, { useState } from "react";
  4. import Pagination from "@/components/general/pagination/"
  5. import {
  6.   DataGrid,
  7.   DataGridHeader,
  8.   DataGridRow,
  9.   DataGridHeaderCell,
  10.   DataGridBody,
  11.   DataGridCell,
  12.   RowRenderer,
  13.   DataGridProps,
  14. } from "@fluentui-contrib/react-data-grid-react-window";
  15. import { TableColumnDefinition, useFluent, useScrollbarWidth } from "@fluentui/react-components";
  16.  
  17. interface TableProps<TItem> {
  18.   items: Array<TItem>;
  19.   columns: TableColumnDefinition<TItem>[];
  20.   columnSizingOptions: any;
  21.   sortState: Parameters<NonNullable<DataGridProps["onSortChange"]>>[1];
  22.   onSortChange: (e: React.MouseEvent, sortState: Parameters<NonNullable<DataGridProps["onSortChange"]>>[1]) => void;
  23. }
  24.  
  25. const tableStyles: React.CSSProperties = {
  26.   backgroundColor: "transparent",
  27.   borderRadius: "5px",
  28.   width: "80vw",
  29.   marginTop: "4.5em",
  30. };
  31. const headerStyles = {
  32.   borderBottom: "1px solid lightgrey",
  33.   backgroundColor: "white"
  34. };
  35.  
  36. const Table = ({ items, columns, columnSizingOptions, sortState, onSortChange }: TableProps<any>) => {
  37.   const [currentPage, setCurrentPage] = useState(1);
  38.   const { targetDocument } = useFluent();
  39.   const scrollbarWidth = useScrollbarWidth({ targetDocument });
  40.   const [sortedItems, setSortedItems] = useState(items)
  41.  
  42.   const handlePageChange = (pageNumber: number) => {
  43.     setCurrentPage(pageNumber);
  44.   };
  45.  
  46.   const itemsPerPage = 13;
  47.  
  48.   const startIndex = (currentPage - 1) * itemsPerPage;
  49.   const endIndex = Math.min(startIndex + itemsPerPage, items.length);
  50.   let visibleItems = items.slice(startIndex, endIndex);
  51.  
  52.   const RenderRow: RowRenderer<any> = ({ item, rowId }) => {
  53.     const [isHovered, setIsHovered] = useState(false);
  54.  
  55.     const handleMouseEnter = () => {
  56.       setIsHovered(true);
  57.     };
  58.  
  59.     const handleMouseLeave = () => {
  60.       setIsHovered(false);
  61.     };
  62.  
  63.     const rowStyle = {
  64.       borderBottom: "1px solid lightgrey",
  65.       height: "4em",
  66.       backgroundColor: "#f6f6f6",
  67.       ...(isHovered && { backgroundColor: "#e5e5e5" })
  68.     };
  69.  
  70.     return (
  71.         <DataGridRow<any>
  72.             key={rowId}
  73.             style={rowStyle}
  74.             onMouseEnter={handleMouseEnter}
  75.             onMouseLeave={handleMouseLeave}
  76.         >
  77.           {({ renderCell }) => <DataGridCell>{renderCell(item)}</DataGridCell>}
  78.         </DataGridRow>
  79.     );
  80.   };
  81.  
  82.   return (
  83.       <div style={tableStyles}>
  84.         <>
  85.           <DataGrid
  86.               items={visibleItems}
  87.               columns={columns}
  88.               focusMode="composite"
  89.               sortable
  90.               resizableColumns
  91.               style={{ width: "max-content" }}
  92.               size="extra-small"
  93.               columnSizingOptions={
  94.                 columnSizingOptions ? columnSizingOptions : null
  95.               }
  96.               sortState={sortState}
  97.               onSortChange={onSortChange}
  98.           >
  99.             <DataGridHeader style={{ paddingRight: scrollbarWidth, ...headerStyles }}>
  100.               <DataGridRow>
  101.                 {({ renderHeaderCell }) => (
  102.                     <DataGridHeaderCell>{renderHeaderCell()}</DataGridHeaderCell>
  103.                 )}
  104.               </DataGridRow>
  105.             </DataGridHeader>
  106.             <DataGridBody itemSize={50} height={visibleItems.length * 50}>
  107.               {RenderRow}
  108.             </DataGridBody>
  109.           </DataGrid>
  110.           <Pagination
  111.               totalItems={items.length}
  112.               itemsPerPage={itemsPerPage}
  113.               currentPage={currentPage}
  114.               onPageChange={handlePageChange}
  115.           />
  116.         </>
  117.       </div>
  118.   );
  119. };
  120.  
  121. export default Table;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement