ReceivingTableData
user_8225015
javascript
2 years ago
17 kB
12
Indexable
import { Typography, Skeleton } from '@mui/material';
import { useState, useEffect } from 'react';
import debounce from 'lodash.debounce';
import axiosInstance from 'utils/axiosInstance';
import TagStyles from 'views/utilities/status-styles/tagStyles';
import TrackingStatus from 'views/utilities/status-styles/trackingStatus';
import ReceiveDialog from './receive-dialog/receiveDialog';
import ConfirmDialog from './confirm-dialog/confirmDialog';
import DetailDialogWarehouse from './detail-dialog/detail-warehouse/detailDialogWarehouse';
import StatusStyles from 'views/utilities/status-styles/statusStyles';
import DetailDialog from './detail-dialog/detail-serpo/detailDialog';
import FormatDateToString from 'views/utilities/formatDateToString';
import TagChipStyles from 'views/utilities/status-styles/tagChipStyles';
import checkPermission from 'utils/permissions';
import ActionButton from 'ui-component/Button/actionButton';
export default function Data(code) {
const [posts, setPosts] = useState([]);
const [searchValue, setSearchValue] = useState('');
const [startDate, setStartDate] = useState(null);
const [endDate, setEndDate] = useState(null);
const [isLoading, setIsLoading] = useState(true);
// const [from, setFrom] = useState('');
const [meta, setMeta] = useState({
page: 1,
per_page: 10,
total_pages: 1,
total_rows: 0
});
useEffect(() => {
code && setSearchValue(code);
}, [code]);
// fetch data
const fetchData = async (page, search, limit, tag, start_date, end_date, logistic_ids, status) => {
try {
const params = new URLSearchParams();
params.append('page', page);
params.append('limit', limit);
params.append('search', search);
if (tag.length > 0) {
tag.forEach((select) => {
params.append('tag', select);
});
}
if (start_date) {
params.append('start_date', start_date);
}
if (end_date) {
params.append('end_date', end_date);
}
if (logistic_ids.length > 0) {
logistic_ids.forEach((id) => {
params.append('logistic_ids', id);
});
}
if (status.length > 0) {
status.forEach((id) => {
params.append('status', id);
});
}
const hasPermission = checkPermission('List Table Receiving Package');
if (!hasPermission) {
return;
}
const response = await axiosInstance.get('/transfer/receiving-control', {
params: params
});
if (response?.data) {
setPosts(response.data.data);
setMeta(response.data.meta);
setIsLoading(false);
}
} catch (error) {
setIsLoading(false);
console.error('Error fetching data:', error);
}
};
const onSearchChange = debounce((event) => {
setIsLoading(true);
const newValue = event.target.value;
setSearchValue(newValue);
setMeta({ ...meta, page: 1 });
}, 500);
const setPage = (value) => {
setMeta({
...meta,
page: value
});
};
const setPerPage = (value) => {
setMeta({
...meta,
per_page: value
});
};
//isSelected untuk active filter
const [isSelectedTag, setIsSelectedTag] = useState(false);
const [isSelectedDate, setIsSelectedDate] = useState(false);
const [isSelectedLogistic, setIsSelectedLogistic] = useState(false);
const [isSelectedStatus, setIsSelectedStatus] = useState(false);
//untuk value yg dipilih tampil di chip
const [selectedTag, setSelectedTag] = useState([]);
const [selectedLogistic, setSelectedLogistic] = useState([]);
const [selectedStatus, setSelectedStatus] = useState([]);
//selected untuk menampilkan chip result filter
const [selected, setSelected] = useState([]);
useEffect(() => {
const formatDate = (dateString) => {
const [year, month, day] = dateString.split('-');
return `${day}/${month}/${year}`;
};
const formatRange = (startDate, endDate) => {
const formattedStartDate = formatDate(startDate);
const formattedEndDate = formatDate(endDate);
return `${formattedStartDate} - ${formattedEndDate}`;
};
const mergedSelections = [...selectedTag, ...selectedLogistic, ...selectedStatus];
if (startDate && endDate) {
mergedSelections.unshift(formatRange(startDate, endDate));
}
setSelected(mergedSelections);
}, [selectedTag, startDate, endDate, selectedLogistic, selectedStatus]);
//untuk mengubah active filter button
useEffect(() => {
setIsSelectedTag(selectedTag.length > 0);
setIsSelectedDate(startDate !== null);
setIsSelectedLogistic(selectedLogistic.length > 0);
setIsSelectedStatus(selectedStatus.length > 0);
}, [selectedTag, startDate, selectedLogistic, selectedStatus]);
const [selectedTagId, setSelectedTagId] = useState([]);
const handleCheckboxTagChange = (event, value, label) => {
const isChecked = event.target.checked;
const updateSelected = (arr, val) => {
if (isChecked && !arr.includes(val)) {
return [...arr, val];
} else {
return arr.filter((item) => item !== val);
}
};
const newSelectedTagId = updateSelected([...selectedTagId], value);
const newSelectedTagName = updateSelected([...selectedTag], label);
setSelectedTagId(newSelectedTagId);
setSelectedTag(newSelectedTagName);
setMeta({ ...meta, page: 1 });
};
const [selectedLogisticId, setSelectedLogisticId] = useState([]);
const handleCheckboxLogisticChange = (event, value, label) => {
const isChecked = event.target.checked;
const updateSelected = (arr, val) => {
if (isChecked && !arr.includes(val)) {
return [...arr, val];
} else {
return arr.filter((item) => item !== val);
}
};
const newSelectedLogisticId = updateSelected([...selectedLogisticId], value);
const newSelectedLogisticName = updateSelected([...selectedLogistic], label);
setSelectedLogisticId(newSelectedLogisticId);
setSelectedLogistic(newSelectedLogisticName);
setMeta({ ...meta, page: 1 });
};
const [selectedStatusId, setSelectedStatusId] = useState([]);
const handleCheckboxStatusChange = (event, value, label) => {
const isChecked = event.target.checked;
const updateSelected = (arr, val) => {
if (isChecked && !arr.includes(val)) {
return [...arr, val];
} else {
return arr.filter((item) => item !== val);
}
};
const newSelectedStatusId = updateSelected([...selectedStatusId], value);
const newSelectedStatusName = updateSelected([...selectedStatus], label);
setSelectedStatusId(newSelectedStatusId);
setSelectedStatus(newSelectedStatusName);
setMeta({ ...meta, page: 1 });
};
const handleDeleteFilter = (selectedItem) => {
const newSelected = selected.filter((item) => item !== selectedItem);
setSelected(newSelected);
if (selectedTag.includes(selectedItem)) {
const newSelectedTag = selectedTag.filter((item) => item !== selectedItem);
setSelectedTag(newSelectedTag);
const newSelectedTagId = selectedTagId.filter((item, index) => selectedTag[index] !== selectedItem);
setSelectedTagId(newSelectedTagId);
}
if (startDate !== null && endDate !== null) {
setStartDate(null);
setEndDate(null);
}
if (selectedLogistic.includes(selectedItem)) {
const newSelectedLogistic = selectedLogistic.filter((item) => item !== selectedItem);
setSelectedLogistic(newSelectedLogistic);
const newSelectedLogisticId = selectedLogisticId.filter((item, index) => selectedLogistic[index] !== selectedItem);
setSelectedLogisticId(newSelectedLogisticId);
}
if (selectedStatus.includes(selectedItem)) {
const newSelectedStatus = selectedStatus.filter((item) => item !== selectedItem);
setSelectedStatus(newSelectedStatus);
const newSelectedStatusId = selectedStatusId.filter((item, index) => selectedStatus[index] !== selectedItem);
setSelectedStatusId(newSelectedStatusId);
}
};
const handleDeleteAll = () => {
setSelected([]);
setSelectedTag([]);
setSelectedTagId([]);
setStartDate(null);
setEndDate(null);
setSelectedLogistic([]);
setSelectedLogisticId([]);
setSelectedStatus([]);
setSelectedStatusId([]);
};
// handle filter date
const formatDateToISO = (date) => {
if (date) {
// convert date to west indonesia time zone(GMT+0700
const gmtDate = new Date(date.getTime() - date.getTimezoneOffset() * 60000);
// ambil year,month,day
const year = gmtDate.getFullYear();
const month = String(gmtDate.getMonth() + 1).padStart(2, '0');
const day = String(gmtDate.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
return null;
};
//handle milih tanggal
const handleSelectDate = (event, value) => {
const today = new Date();
const formattedTodayDate = today.toISOString().split('T')[0];
const yesterday = new Date(today);
yesterday.setDate(today.getDate() - 1);
const formattedYesterday = yesterday.toISOString().split('T')[0];
const startOfWeek = new Date(today);
startOfWeek.setDate(today.getDate() - today.getDay());
const endOfWeek = new Date(startOfWeek);
endOfWeek.setDate(startOfWeek.getDate() + 6);
const formattedStartWeek = startOfWeek.toISOString().split('T')[0];
const formattedEndWeek = endOfWeek.toISOString().split('T')[0];
const sevenDaysAgo = new Date(today);
sevenDaysAgo.setDate(today.getDate() - 6);
const formattedSevendays = sevenDaysAgo.toISOString().split('T')[0];
const startOfMonth = new Date(today.getFullYear(), today.getMonth(), 1);
const endOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
const formattedStartMonth = startOfMonth.toISOString().split('T')[0];
const formattedEndMonth = endOfMonth.toISOString().split('T')[0];
const thirtyDaysAgo = new Date(today);
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 29);
const formattedThirtydays = thirtyDaysAgo.toISOString().split('T')[0];
switch (value) {
case 'today':
setStartDate(formattedTodayDate);
setEndDate(formattedTodayDate);
setMeta({ ...meta, page: 1 });
break;
case 'yesterday':
setStartDate(formattedYesterday);
setEndDate(formattedYesterday);
setMeta({ ...meta, page: 1 });
break;
case 'week':
setStartDate(formattedStartWeek);
setEndDate(formattedEndWeek);
setMeta({ ...meta, page: 1 });
break;
case 'sevendays':
setStartDate(formattedSevendays);
setEndDate(formattedTodayDate);
setMeta({ ...meta, page: 1 });
break;
case 'month':
setStartDate(formattedStartMonth);
setEndDate(formattedEndMonth);
setMeta({ ...meta, page: 1 });
break;
case 'thirtydays':
setStartDate(formattedThirtydays);
setEndDate(formattedTodayDate);
setMeta({ ...meta, page: 1 });
break;
default:
// Do something for an unknown value
break;
}
};
const handleDateChange = async (newDateRange) => {
const start = newDateRange[0];
const end = newDateRange[1];
const formattedStartDate = formatDateToISO(start);
const formattedEndDate = formatDateToISO(end);
setStartDate(formattedStartDate);
setEndDate(formattedEndDate);
setMeta({ ...meta, page: 1 });
};
// end filter
useEffect(() => {
fetchData(meta.page, searchValue, meta.per_page, selectedTag, startDate, endDate, selectedLogisticId, selectedStatusId);
}, [meta.page, searchValue, meta.per_page, selectedTag, startDate, endDate, selectedLogisticId, selectedStatusId]);
const receivePermission = checkPermission('Action Received');
const confirmPermission = checkPermission('Action Confirm');
// handle verify vendor
const handleVerifyVendor = async (id) => {
const formData = {
confirm: []
};
try {
await axiosInstance.post(`/transfer/receiving-control/${id}/verify-transfer`, formData);
const successMessage = 'Successfully Added New Data';
localStorage.setItem('successMessage', successMessage);
window.location.reload();
} catch (error) {
console.error('Error fetching data:', error);
}
};
return {
columns: [
{ accessor: 'no', Header: 'No' },
{ accessor: 'tag', Header: 'Tag' },
{ accessor: 'package_code', Header: 'Package Code' },
{ accessor: 'delivery_date', Header: 'Delivery Date' },
{ accessor: 'quantity', Header: 'Quantity' },
// { accessor: 'package_overview', Header: 'Package Overview' },
{ accessor: 'confirmed', Header: 'Confirmed' },
{ accessor: 'logistics', Header: 'Shipping' },
{ accessor: 'status', Header: 'Status' },
{ accessor: 'action', Header: 'Action' }
],
rows: posts
? posts?.map((data, index) => ({
no: <Typography sx={{ fontSize: '11px' }}>{meta.per_page * (meta.page - 1) + (index + 1)}</Typography>,
tag: (
<Typography
sx={{
...TagChipStyles.tagChip,
...TagStyles(data?.tag)
}}
>
{data?.tag}
</Typography>
),
package_code: <Typography sx={{ fontSize: '11px' }}>{data.package_code}</Typography>,
delivery_date: <Typography sx={{ fontSize: '11px' }}>{FormatDateToString(data?.delivery_date)}</Typography>,
quantity: (
<div style={{ display: 'flex', alignItems: 'center' }}>
<Typography sx={{ fontSize: '11px' }}>{data?.quantity}</Typography>{' '}
{data.tag === 'Warehouse' ? (
<DetailDialogWarehouse id={data.id} tag={data.tag} status={data.status} />
) : (
<DetailDialog id={data.id} tag={data.tag} />
)}
</div>
),
// package_overview:
// data.tag === 'Warehouse' ? (
// <DetailDialogWarehouse id={data.id} tag={data.tag} status={data.status} />
// ) : (
// <DetailDialog id={data.id} tag={data.tag} />
// ),
confirmed: (
<Typography sx={{ fontSize: '11px', color: data?.status === 'Verified' ? '#4CA726' : '#F28F27', fontWeight: '600' }}>
{data?.confirmed}
</Typography>
),
logistics: <Typography sx={{ fontSize: '11px' }}>{data?.logistic}</Typography>,
status: (
<Typography
sx={{
...StatusStyles.statusChip,
width: 'fit-content',
...TrackingStatus(data.status)
}}
>
{data.status === 'Verified' ? 'Completed' : data.status}
</Typography>
),
action:
data.status === 'In Delivery' || data.status === 'Preparing' ? (
receivePermission && <ReceiveDialog isDisabled={data.status === 'Preparing'} id={data?.id} />
) : (
<>
{data.tag === 'Vendor' || data.tag === 'Request Paper' ? (
<ActionButton
onClick={() => {
handleVerifyVendor(data?.id);
}}
disabled={data.status === 'Verified'}
variant={data.status === 'Verified' ? 'outlined' : null}
>
{data.status === 'Verified' ? 'Anything skipped ?' : 'Confirm'}
</ActionButton>
) : (
confirmPermission && <ConfirmDialog status={data.status} id={data?.id} />
)}
</>
)
}))
: [],
skeleton: [
{
no: <Skeleton />,
tag: <Skeleton />,
package_code: <Skeleton />,
delivery_date: <Skeleton />,
quantity: <Skeleton />,
confirmed: <Skeleton />,
logistics: <Skeleton />,
status: <Skeleton />,
action: <Skeleton />
}
],
isLoading,
receivingData: posts,
onSearchChange: onSearchChange,
meta: meta,
setPage: setPage,
setPerPage: setPerPage,
selectedTag,
isSelectedTag,
handleCheckboxTagChange,
startDate,
endDate,
isSelectedDate,
handleDateChange,
handleSelectDate,
handleDeleteFilter,
selected,
handleDeleteAll,
selectedLogistic,
isSelectedLogistic,
handleCheckboxLogisticChange,
selectedStatus,
isSelectedStatus,
handleCheckboxStatusChange
// handleFilterClick: handleFilterClick
};
}
Editor is loading...
Leave a Comment