Untitled
user_8225015
plain_text
a year ago
12 kB
9
Indexable
import { Typography, Stack, Card, Table, TableBody, TableCell, TableHead, TableRow } from '@mui/material';
import debounce from 'lodash.debounce';
import SearchBox from 'ui-component/SearchBox/searchBox';
import { createStyles } from '@mui/material/styles';
import useEdcList from './useEdcList';
import React, { useState, useRef, useCallback } from 'react';
import { TagRequestContext } from '../../../context/tagRequestContext.js';
import { useContext } from 'react';
import PerfectScrollbar from 'react-perfect-scrollbar';
import StatusStyles from 'views/utilities/status-styles/statusStyles';
import AssetStatus from 'views/utilities/status-styles/assetStatus';
import CloseDialogBtn from 'ui-component/closeDialogBtn/CloseDialogBtn';
import MediumButton from 'ui-component/Button/mediumButton';
import TextSwitch from '../../textSwitch/TextSwitch';
export const styles = createStyles({
th: {
fontSize: '14px',
fontWeight: '700',
color: '#000',
position: 'sticky',
'@media screen and (max-width:1024px)': {
fontSize: '12px'
}
},
tBody: {
fontSize: '12px',
fontWeight: '400'
},
card: {
height: 'fit-content',
maxHeight: '100%',
width: '50%',
position: 'relative',
padding: '20px',
backgroundColor: '#F9FAFC',
display: 'flex',
flexDirection: 'column',
justifyContent: 'start',
'@media screen and (max-width:1024px)': {
width: '80%'
},
'@media screen and (max-width:700px)': {
width: '100%'
}
},
contentWrapper: {
height: '90%',
width: '100%'
},
dialogTitle: {
fontSize: '20px',
fontWeight: '700',
color: '#000000',
whiteSpace: 'nowrap',
'@media screen and (max-width:1024px)': {
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis'
}
}
});
const EdcList = () => {
const { setSelectedIds, selectedIds, setSelectedSN, selectedSN, asset_request_id, onClose, setContent } = useContext(TagRequestContext);
const [pageNumber, setPageNumber] = useState(1);
const [selectAll, setSelectAll] = useState(false);
const [searchValue, setSearchValue] = useState('');
const { loading, data, setData, totalPages, hasMore, maxLimit } = useEdcList(asset_request_id, pageNumber, searchValue);
const [contentSwitch, setContentSwitch] = useState('box');
const onSearchChange = debounce((event) => {
const newValue = event.target.value;
setSearchValue(newValue);
setPageNumber(1);
setData([]);
}, 500);
const observer = useRef();
const lastItemElementRef = useCallback(
(node) => {
if (loading) return;
if (observer.current) observer.current.disconnect();
observer.current = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting && hasMore && pageNumber < totalPages) {
// Periksa pageNumber < totalPages
setPageNumber((prevPageNumber) => prevPageNumber + 1);
}
});
if (node) observer.current.observe(node);
},
[loading, hasMore, pageNumber, totalPages]
);
const toggleSelectAll = () => {
setSelectAll(!selectAll);
if (!selectAll) {
const allIds = data.map((item) => ({ id: item.id }));
const allSN = data.map((item) => item.serial_number);
const newIds = allIds.filter((item) => !selectedIds.some((selectedId) => selectedId.id === item.id));
const newSN = allSN.filter((sn) => !selectedSN.includes(sn));
const limitedIds = newIds.slice(0, maxLimit - selectedIds.length);
const limitedSN = newSN.slice(0, maxLimit - selectedIds.length);
setSelectedIds([...selectedIds, ...limitedIds]);
setSelectedSN([...selectedSN, ...limitedSN]);
} else {
setSelectedIds([]);
setSelectedSN([]);
}
};
const handleRowCheckboxChange = (id, serial_number) => {
if (selectedIds.some((ids) => ids.id === id)) {
const updatedIds = selectedIds.filter((ids) => ids.id !== id);
setSelectedIds(updatedIds);
const updatedSN = selectedSN.filter((sn) => sn !== serial_number);
setSelectedSN(updatedSN);
} else {
const updatedIds = [...selectedIds, { id }];
setSelectedIds(updatedIds);
const updatedSN = [...selectedSN, serial_number];
setSelectedSN(updatedSN);
}
};
const handleClose = () => {
onClose();
};
return (
<>
<Card sx={styles.card}>
<Stack direction="row" spacing={1.5} alignItems="center" justifyContent="space-between">
<Stack direction="row" alignItems="center" spacing={2}>
<Typography sx={{ ...styles.dialogTitle }}> Select EDC from :</Typography>
<TextSwitch contentSwitch={contentSwitch} setContentSwitch={setContentSwitch} />
</Stack>
<CloseDialogBtn onClose={handleClose} />
</Stack>
<Stack
direction="column"
justifyContent="space-between"
height="95%"
sx={{
'@media screen and (max-width:1200px)': {
height: '95%'
}
}}
>
<Stack sx={styles.contentWrapper}>
{/* Search */}
<Stack direction="column" width="100%" height="100%" alignItems="start" justifyContent="center" spacing={0.5}>
<SearchBox fullWidth="true" onChange={onSearchChange} />
<PerfectScrollbar style={{ height: '100%', overflowX: 'hidden', width: '100%' }}>
<Table stickyHeader sx={{ backgroundColor: '#fff' }}>
<TableHead>
<TableRow>
<TableCell sx={{ backgroundColor: '#fff', borderTopLeftRadius: '12px' }}>
<Stack direction="row" spacing={1}>
<input type="checkbox" checked={selectAll} onChange={toggleSelectAll} />
<Typography sx={styles.th}>No</Typography>
</Stack>
</TableCell>
<TableCell sx={{ backgroundColor: '#fff', borderTopLeftRadius: '12px' }}>
<Typography sx={styles.th}>Box Number</Typography>
</TableCell>
<TableCell sx={{ backgroundColor: '#fff', borderTopLeftRadius: '12px' }}>
<Typography sx={styles.th}>EDC Quantity</Typography>
</TableCell>
<TableCell sx={{ backgroundColor: '#fff' }}>
<Typography sx={styles.th}>Status</Typography>
</TableCell>
</TableRow>
</TableHead>
<TableBody>
{data?.map((item, index) => {
const isSelected = selectedIds.some((ids) => ids.id === item.id);
if (data.length === index + 1) {
return (
<React.Fragment key={index}>
<TableRow
ref={lastItemElementRef}
sx={{
root: {
height: 10
},
backgroundColor: isSelected ? '#F2EDFF' : '#fff'
}}
>
<TableCell>
<div style={{ display: 'flex' }}>
<input
type="checkbox"
checked={selectedIds.some((ids) => ids.id === item.id)}
onChange={() => handleRowCheckboxChange(item?.id, item?.serial_number)}
disabled={selectedIds.length >= maxLimit && !selectedIds.some((ids) => ids.id === item.id)}
/>
<Typography sx={{ ...styles.tBody, fontWeight: isSelected ? '700' : '400' }}>{index + 1}</Typography>
</div>
</TableCell>
<TableCell>
<Typography sx={{ ...styles.tBody, fontWeight: isSelected ? '700' : '400' }}>{item?.cycle}</Typography>
</TableCell>
<TableCell>
<Typography sx={{ ...styles.tBody, fontWeight: isSelected ? '700' : '400' }}>
{item?.serial_number}
</Typography>
</TableCell>
<TableCell>
<Typography sx={{ ...StatusStyles.statusChip, width: 'fit-content', ...AssetStatus(item?.status) }}>
{item?.status}
</Typography>
</TableCell>
</TableRow>
{loading && (
<TableRow sx={{ width: '100%' }}>
<Typography
sx={{
textAlign: 'center',
fontWeight: '700',
backgroundColor: '#764AF1',
color: '#fff',
padding: '4px',
width: '100%'
}}
>
Loading...
</Typography>
</TableRow>
)}
</React.Fragment>
);
} else {
return (
<TableRow
key={index}
sx={{
root: {
height: 10
},
backgroundColor: isSelected ? '#F2EDFF' : '#fff'
}}
>
<TableCell>
<Stack direction="row" spacing={0.5}>
<input
type="checkbox"
checked={selectedIds.some((ids) => ids.id === item.id)}
onChange={() => handleRowCheckboxChange(item.id, item?.serial_number)}
disabled={selectedIds.length >= maxLimit && !selectedIds.some((ids) => ids.id === item.id)}
/>
<Typography sx={{ ...styles.tBody, fontWeight: isSelected ? '700' : '400' }}>{index + 1}</Typography>
</Stack>
</TableCell>
<TableCell>
<Typography sx={{ ...styles.tBody, fontWeight: isSelected ? '700' : '400' }}>
{item?.serial_number}
</Typography>
</TableCell>
<TableCell>
<Typography sx={{ ...StatusStyles.statusChip, width: 'fit-content', ...AssetStatus(item?.status) }}>
{item?.status}
</Typography>
</TableCell>
</TableRow>
);
}
})}
</TableBody>
</Table>
</PerfectScrollbar>
</Stack>
</Stack>
<Stack direction="row" spacing={1.5}>
<MediumButton
width="30%"
onClick={() => {
handleClose();
}}
variant="outlined"
>
cancel
</MediumButton>
<MediumButton
onClick={() => {
setContent(1);
}}
variant="contained"
disabled={selectedIds.length === 0}
>
Next
</MediumButton>
</Stack>
</Stack>
</Card>
</>
);
};
export default EdcList;
Editor is loading...
Leave a Comment