/* ---------------------------------- @mui ---------------------------------- */ import { styled } from '@mui/material/styles'; import { Paper, Table as TableContent, TableBody, TableCell, TableContainer, TableHead, TableRow, TextField, Button, TableSortLabel, Box, Card, Grid, FormControl, InputLabel, Select, MenuItem, SelectChangeEvent, Stack, Typography, LinearProgress, linearProgressClasses, } from '@mui/material'; import { visuallyHidden } from '@mui/utils'; /* ---------------------------------- axios --------------------------------- */ import axios from '../utils/axios'; /* ---------------------------------- react --------------------------------- */ import { Fragment, useContext, useEffect, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; /* -------------------------------- component ------------------------------- */ import BaseTablePagination from './BaseTablePagination'; /* ---------------------------------- theme --------------------------------- */ import palette from '../theme/palette'; /* ---------------------------------- utils --------------------------------- */ import { UserCurrentCorporateContext } from '../contexts/UserCurrentCorporate'; import { fSplit } from '../utils/formatNumber'; import { Download, Search as SearchIcon, Upload } from '@mui/icons-material'; /* ---------------------------------- types --------------------------------- */ import { DivisionDataProps, Order, PaginationTableProps, TableListProps } from '../@types/table'; import { InputAdornment } from '@mui/material'; import GetAppIcon from '@mui/icons-material/GetApp'; /* --------------------------------- styled --------------------------------- */ const BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({ height: 10, borderRadius: 6, [`&.${linearProgressClasses.colorPrimary}`]: { backgroundColor: '#D1F1F1', }, [`& .${linearProgressClasses.bar}`]: { borderRadius: 6, backgroundColor: theme.palette.primary.main, }, })); /* -------------------------------------------------------------------------- */ export default function Table({ headCells, rows, paginations, orders, loadings, params, filters, filterStatus, filterStartDate, filterEndDate, searchs, exportReport, }: TableListProps) { /* ------------------------------- handle sort ------------------------------ */ const handleRequestSort = async (event: React.MouseEvent, property: string) => { const isAsc = orders?.orderBy === property && orders?.order === 'asc'; orders?.setOrder(isAsc ? 'desc' : 'asc'); orders?.setOrderBy(property); const parameters = Object.fromEntries([ ...params.searchParams.entries(), ['order', isAsc ? 'desc' : 'asc'], ['orderBy', property], ]); params.setAppliedParams(parameters); }; /* -------------------------------------------------------------------------- */ /* -------------------------- enchanced table head -------------------------- */ const EnhancedTableHead = () => { const createSortHandler = (property: string) => (event: React.MouseEvent) => { handleRequestSort(event, property); }; return ( {headCells && headCells.map((headCell, index) => ( {headCell.isSort ? ( {headCell.label} {orders?.orderBy === headCell.id ? ( {orders.order === 'desc' ? 'sorted descending' : 'sorted ascending'} ) : null} ) : ( headCell.label )} ))} ); }; /* -------------------------------------------------------------------------- */ /* ------------------------ button change pagination ------------------------ */ const onPageChangeHandle = async ( event: React.MouseEvent | null, newPage: number ) => { const parameters = Object.fromEntries([ ...params.searchParams.entries(), ['page', newPage + 1], ['per_page', paginations.rowsPerPage] ]); paginations.setPage(newPage); await new Promise((resolve) => setTimeout(resolve, 500)); params.setAppliedParams(parameters); }; /* -------------------------------------------------------------------------- */ /* --------------------------- row page per limit --------------------------- */ const onRowsPerPageChangeHandle = async (event: React.ChangeEvent) => { params.searchParams.delete('page'); const parameters = Object.fromEntries([ ...params.searchParams.entries(), ['per_page', parseInt(event.target.value, 10)], ]); paginations.setPage(0); paginations.setRowsPerPage(parseInt(event.target.value, 10)); await new Promise((resolve) => setTimeout(resolve, 500)); params.setAppliedParams(parameters); }; /* -------------------------------------------------------------------------- */ return ( // {/* Field 1 */} {filters && filters.useFilter ? ( Division
searchs.setSearchText(event.target.value)} value={searchs.searchText} fullWidth />
) : null } {searchs && searchs.useSearchs ? ( {filterStatus && filterStatus.useFilter ? (
searchs.setSearchText(event.target.value)} value={searchs.searchText} fullWidth InputProps={{ startAdornment: ( ), }} placeholder="Search Name or Member ID... " />
) :
searchs.setSearchText(event.target.value)} value={searchs.searchText} fullWidth InputProps={{ startAdornment: ( ), }} placeholder="Search Name or Member ID... " />
}
) : null } {/* Start date */} {filterStartDate && filterStartDate.useFilter ? (
filterStartDate.setStartDate(event.target.value)} fullWidth label="Start Date" InputLabelProps={{ shrink: true, }} />
) : null } {/* End Date */} {filterEndDate && filterEndDate.useFilter ? (
filterEndDate.setEndDate(event.target.value)} fullWidth label="End Date" InputLabelProps={{ shrink: true, }} />
) : null } {/* Filter status */} {filterStatus && filterStatus.useFilter ? ( Status ) : null } {/* Export Report */} {exportReport && exportReport.useExport ? ( ) : null }
{/* End Field 1 */} {/* Field 2 */} {/* Table */} {/* Table Header */} {/* End Table Header */} {/* Table Body */} {loadings.isLoading && rows.length >= 1 ? ( Loading . . . ) : rows && rows.length >= 1 ? ( rows.map((row, rowIndex) => ( {headCells && //@ts-ignore headCells.map((head, headIndex) => ( //@ts-ignore {row[head.id]} ))} )) ) : ( No Data Found )} {/* End Table Body */} {/* End Table */} {/* Pagination */} {/* End Pagination */} {/* End Field 2 */}
//
); }