316 lines
9.3 KiB
TypeScript
316 lines
9.3 KiB
TypeScript
import DeleteIcon from '@mui/icons-material/Delete';
|
|
import FilterListIcon from '@mui/icons-material/FilterList';
|
|
import Box from '@mui/material/Box';
|
|
import Checkbox from '@mui/material/Checkbox';
|
|
import FormControlLabel from '@mui/material/FormControlLabel';
|
|
import IconButton from '@mui/material/IconButton';
|
|
import Paper from '@mui/material/Paper';
|
|
import { alpha } from '@mui/material/styles';
|
|
import Switch from '@mui/material/Switch';
|
|
import Table from '@mui/material/Table';
|
|
import TableBody from '@mui/material/TableBody';
|
|
import TableCell from '@mui/material/TableCell';
|
|
import TableContainer from '@mui/material/TableContainer';
|
|
import TableHead from '@mui/material/TableHead';
|
|
import TablePagination from '@mui/material/TablePagination';
|
|
import TableRow from '@mui/material/TableRow';
|
|
import TableSortLabel from '@mui/material/TableSortLabel';
|
|
import { visuallyHidden } from '@mui/utils';
|
|
import { GetServerSideProps } from 'next';
|
|
import { useEffect, useState } from 'react';
|
|
import getAPIClient from '../../services/ssrApi';
|
|
|
|
import { TableView, StyledStatus } from './TableView';
|
|
|
|
interface Data {
|
|
question: string,
|
|
answer: string,
|
|
status: string,
|
|
}
|
|
|
|
interface FaqTableInterface{
|
|
questionData: any,
|
|
onChange: any
|
|
}
|
|
|
|
function createData(
|
|
question: string,
|
|
answer: string,
|
|
status: string,
|
|
): Data {
|
|
return {
|
|
question,
|
|
answer,
|
|
status,
|
|
};
|
|
}
|
|
|
|
function descendingComparator<T>(a: T, b: T, orderBy: keyof T) {
|
|
if (b[orderBy] < a[orderBy]) {
|
|
return -1;
|
|
}
|
|
if (b[orderBy] > a[orderBy]) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
type Order = 'asc' | 'desc';
|
|
|
|
function getComparator<Key extends keyof any>(
|
|
order: Order,
|
|
orderBy: Key,
|
|
): (
|
|
a: { [key in Key]: any },
|
|
b: { [key in Key]: any },
|
|
) => number {
|
|
return order === 'desc'
|
|
? (a, b) => descendingComparator(a, b, orderBy)
|
|
: (a, b) => -descendingComparator(a, b, orderBy);
|
|
}
|
|
|
|
function stableSort<T>(array: readonly T[], comparator: (a: T, b: T) => number) {
|
|
const stabilizedThis = array.map((el, index) => [el, index] as [T, number]);
|
|
stabilizedThis.sort((a, b) => {
|
|
const order = comparator(a[0], b[0]);
|
|
if (order !== 0) {
|
|
return order;
|
|
}
|
|
return a[1] - b[1];
|
|
});
|
|
return stabilizedThis.map((el) => el[0]);
|
|
}
|
|
|
|
interface HeadCell {
|
|
disablePadding: boolean;
|
|
id: keyof Data | string;
|
|
label: string;
|
|
numeric: boolean;
|
|
}
|
|
|
|
const headCells: readonly HeadCell[] = [
|
|
{
|
|
id: 'question',
|
|
numeric: false,
|
|
disablePadding: true,
|
|
label: 'Pergunta',
|
|
},
|
|
{
|
|
id: 'answer',
|
|
numeric: true,
|
|
disablePadding: false,
|
|
label: 'Resposta',
|
|
},
|
|
{
|
|
id: 'status',
|
|
numeric: true,
|
|
disablePadding: false,
|
|
label: 'status',
|
|
},
|
|
];
|
|
|
|
interface EnhancedTableProps {
|
|
numSelected: number;
|
|
onRequestSort: (event: React.MouseEvent<unknown>, property: keyof Data) => void;
|
|
onSelectAllClick: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
order: Order;
|
|
orderBy: string;
|
|
rowCount: number;
|
|
}
|
|
|
|
function EnhancedTableHead(props: EnhancedTableProps) {
|
|
const { onSelectAllClick, order, orderBy, numSelected, rowCount, onRequestSort } =
|
|
props;
|
|
const createSortHandler =
|
|
(property: any) => (event: React.MouseEvent<unknown>) => {
|
|
onRequestSort(event, property);
|
|
};
|
|
|
|
return (
|
|
<TableHead>
|
|
<TableRow>
|
|
<TableCell padding="checkbox">
|
|
<Checkbox
|
|
color="primary"
|
|
indeterminate={numSelected > 0 && numSelected < rowCount}
|
|
checked={rowCount > 0 && numSelected === rowCount}
|
|
onChange={onSelectAllClick}
|
|
inputProps={{
|
|
'aria-label': 'select all desserts',
|
|
}}
|
|
/>
|
|
</TableCell>
|
|
{headCells.map((headCell) => (
|
|
<TableCell
|
|
key={headCell.id}
|
|
align='left'
|
|
padding={headCell.disablePadding ? 'none' : 'normal'}
|
|
sortDirection={orderBy === headCell.id ? order : false}
|
|
>
|
|
<TableSortLabel
|
|
active={orderBy === headCell.id}
|
|
direction={orderBy === headCell.id ? order : 'asc'}
|
|
onClick={createSortHandler(headCell.id)}
|
|
>
|
|
{headCell.label}
|
|
{orderBy === headCell.id ? (
|
|
<Box component="span" sx={visuallyHidden}>
|
|
{order === 'desc' ? 'sorted descending' : 'sorted ascending'}
|
|
</Box>
|
|
) : null}
|
|
</TableSortLabel>
|
|
</TableCell>
|
|
))}
|
|
</TableRow>
|
|
</TableHead>
|
|
);
|
|
}
|
|
|
|
export default function FaqTable({questionData, onChange}: FaqTableInterface) {
|
|
const [order, setOrder] = useState<Order>('asc');
|
|
const [orderBy, setOrderBy] = useState<keyof Data | string>('status');
|
|
const [selected, setSelected] = useState<readonly string[]>([]);
|
|
const [page, setPage] = useState<number>(0);
|
|
const [dense, setDense] = useState<boolean>(false);
|
|
const [rowsPerPage, setRowsPerPage] = useState<number>(5);
|
|
|
|
const handleRequestSort = (
|
|
event: React.MouseEvent<unknown>,
|
|
property: keyof Data,
|
|
) => {
|
|
const isAsc = orderBy === property && order === 'asc';
|
|
setOrder(isAsc ? 'desc' : 'asc');
|
|
setOrderBy(property);
|
|
};
|
|
|
|
const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
if (event.target.checked) {
|
|
const newSelecteds = questionData.map((n) => n.id);
|
|
setSelected(newSelecteds);
|
|
return;
|
|
}
|
|
setSelected([]);
|
|
};
|
|
|
|
const handleClick = (event: React.MouseEvent<unknown>, name: string) => {
|
|
const selectedIndex = selected.indexOf(name);
|
|
let newSelected: readonly string[] = [];
|
|
|
|
if (selectedIndex === -1) {
|
|
newSelected = newSelected.concat(selected, name);
|
|
} else if (selectedIndex === 0) {
|
|
newSelected = newSelected.concat(selected.slice(1));
|
|
} else if (selectedIndex === selected.length - 1) {
|
|
newSelected = newSelected.concat(selected.slice(0, -1));
|
|
} else if (selectedIndex > 0) {
|
|
newSelected = newSelected.concat(
|
|
selected.slice(0, selectedIndex),
|
|
selected.slice(selectedIndex + 1),
|
|
);
|
|
}
|
|
|
|
setSelected(newSelected);
|
|
};
|
|
|
|
const handleChangePage = (event: unknown, newPage: number) => {
|
|
setPage(newPage);
|
|
};
|
|
|
|
const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
setRowsPerPage(parseInt(event.target.value, 10));
|
|
setPage(0);
|
|
};
|
|
|
|
const isSelected = (name: string) => selected.indexOf(name) !== -1;
|
|
|
|
useEffect(() => {
|
|
onChange(selected)
|
|
}, [selected])
|
|
|
|
// Avoid a layout jump when reaching the last page with empty rows.
|
|
const emptyRows =
|
|
page > 0 ? Math.max(0, (1 + page) * rowsPerPage - questionData.length) : 0;
|
|
|
|
return (
|
|
<TableView>
|
|
<Paper sx={{ width: '100%', mb: 2 }}>
|
|
<TableContainer>
|
|
<Table
|
|
sx={{ minWidth: 750 }}
|
|
aria-labelledby="tableTitle"
|
|
size={dense ? 'small' : 'medium'}
|
|
>
|
|
<EnhancedTableHead
|
|
numSelected={selected.length}
|
|
order={order}
|
|
orderBy={orderBy}
|
|
onSelectAllClick={handleSelectAllClick}
|
|
onRequestSort={handleRequestSort}
|
|
rowCount={questionData.length}
|
|
/>
|
|
<TableBody>
|
|
{stableSort(questionData, getComparator(order, orderBy))
|
|
.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
|
|
.map((row, index) => {
|
|
const isItemSelected = isSelected(row.id);
|
|
const labelId = `enhanced-table-checkbox-${index}`;
|
|
|
|
return (
|
|
<TableRow
|
|
hover
|
|
onClick={(event) => handleClick(event, row.id)}
|
|
role="checkbox"
|
|
aria-checked={isItemSelected}
|
|
tabIndex={-1}
|
|
key={row.id}
|
|
selected={isItemSelected}
|
|
>
|
|
<TableCell padding="checkbox">
|
|
<Checkbox
|
|
color="primary"
|
|
checked={isItemSelected}
|
|
inputProps={{
|
|
'aria-labelledby': labelId,
|
|
}}
|
|
/>
|
|
</TableCell>
|
|
<TableCell
|
|
component="th"
|
|
id={labelId}
|
|
scope="row"
|
|
padding="none"
|
|
>
|
|
{row.question}
|
|
</TableCell>
|
|
<TableCell align="left">{row.answer}</TableCell>
|
|
<TableCell align="left"><StyledStatus status={'ativo'}> {'ativo'}</StyledStatus></TableCell>
|
|
</TableRow>
|
|
);
|
|
})}
|
|
{emptyRows > 0 && (
|
|
<TableRow
|
|
style={{
|
|
height: (dense ? 33 : 53) * emptyRows,
|
|
}}
|
|
>
|
|
<TableCell colSpan={6} />
|
|
</TableRow>
|
|
)}
|
|
</TableBody>
|
|
</Table>
|
|
</TableContainer>
|
|
<TablePagination
|
|
rowsPerPageOptions={[5, 10, 25]}
|
|
component="div"
|
|
count={questionData.length}
|
|
rowsPerPage={rowsPerPage}
|
|
page={page}
|
|
onPageChange={handleChangePage}
|
|
onRowsPerPageChange={handleChangeRowsPerPage}
|
|
/>
|
|
</Paper>
|
|
</TableView>
|
|
);
|
|
}
|
|
|