ReceivingTableData

 avatar
user_8225015
javascript
9 months ago
17 kB
4
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