// @mui import { Box, Button, Card, Collapse, IconButton, MenuItem, Table, TableBody, TableCell, TableRow, TextField, Typography, Stack, Menu, ButtonGroup, Link, Chip, TableHead, Grid, Autocomplete, } from '@mui/material'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import AddIcon from '@mui/icons-material/Add'; import UploadIcon from '@mui/icons-material/Upload'; import CancelIcon from '@mui/icons-material/Cancel'; import FindInPageOutlinedIcon from '@mui/icons-material/FindInPageOutlined'; import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; // hooks import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; import { Navigate, useNavigate, useSearchParams } from 'react-router-dom'; import useSettings from '@/hooks/useSettings'; // components import axios from '../../utils/axios'; import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../@types/paginated-data'; import DataTable from '../../components/LaravelTable'; import { fCurrency } from '../../utils/formatNumber'; import EditRoundedIcon from '@mui/icons-material/EditRounded'; import { LoadingButton } from '@mui/lab'; import { enqueueSnackbar } from 'notistack'; import { Divider } from '@mui/material'; import Iconify from '@/components/Iconify'; import DialogDetailClaim from '@/components/dialogs/DialogDetailClaim'; import { fDateOnly, fDateTimesecond } from '@/utils/formatTime'; import { capitalizeFirstLetter } from '@/utils/formatString'; import Label from '@/components/Label'; import TableMoreMenu from '@/components/table/TableMoreMenu'; import { Import } from '@/@types/claims'; import { DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; // import LoadingButton from '@/theme/overrides/LoadingButton'; export default function List() { type ServiceCode = { value: string, label: string } const { themeColorPresets } = useSettings(); const [searchParams, setSearchParams] = useSearchParams(); const [importResult, setImportResult] = useState(null); const [selectedOptions, setSelectedOptions] = useState([]); // State untuk nilai terpilih const navigate = useNavigate() const defaultValue = [ { value: '-', label: '-' } ]; const [serviceCode, setServiceCode] = useState(defaultValue); const handleOptionService = () => { } const handleFilter = (event: React.SyntheticEvent, newValue: { value: string, label: string }[], name:string) => { // const serviceCodeArray :string[] = []; const codeArray :string[] = []; const typeArray :string[] = []; const planArray :string[] = []; if (name == 'service_code'){ newValue.map(row => { serviceCodeArray.push(row.value); }) setSelectedOptions(newValue) } var entries = [...searchParams.entries(), ['service_code', serviceCodeArray ?? '']]; const filter = Object.fromEntries(entries); loadDataTableData(filter); } function SearchInput(props: any) { // SEARCH const searchInput = useRef(null); const [searchText, setSearchText] = useState(''); const handleSearchChange = (event: any) => { const newSearchText = event.target.value ?? ''; setSearchText(newSearchText); }; const handleSearchSubmit = (event: any) => { event.preventDefault(); props.onSearch({ search: searchText }); // Trigger to Parent }; useEffect(() => { // Trigger First Search setSearchText(searchParams.get('search') ?? ''); }, []); return (
{ if (event.key === 'Enter') { handleSearchSubmit(event); } }} value={searchText} placeholder='Search Code or Name...' /> { try { if (value && !!Date.parse(value)) { const date:string = value ? fDateOnly(value) : ''; var entries = [...searchParams.entries(), ['start_date', date ?? '']]; const filter = Object.fromEntries(entries); setSearchParams(filter); loadDataTableData(filter); } } catch (e) {} }} renderInput={(params) => } /> { try { if (value && !!Date.parse(value)) { const date = fDateOnly(value); var entries = [...searchParams.entries(), ['end_date', date ?? '']]; const filter = Object.fromEntries(entries); setSearchParams(filter); loadDataTableData(filter); } } catch (e) {} }} renderInput={(params) => } /> handleFilter(event, newValue, 'service_code') } fullWidth disableCloseOnSelect getOptionLabel={(option) => option.label} renderInput={(params) => ( )} />
); } function ImportForm(props: any) { // IMPORT // Create Button Menu const [anchorEl, setAnchorEl] = React.useState(null); const createMenu = Boolean(anchorEl); const importForm = useRef(null); const [currentImportFileName, setCurrentImportFileName] = useState(null); const [importLoading, setImportLoading] = useState(false); const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; const handleImportButton = () => { if (importForm?.current) { handleClose(); importForm.current ? importForm.current.click() : console.log('No File selected'); } else { alert('No file selected'); } }; const handleCancelImportButton = () => { importForm.current.value = ''; importForm.current.dispatchEvent(new Event('change', { bubbles: true })); }; const handleImportChange = (event: any) => { if (event.target.files[0]) { setCurrentImportFileName(event.target.files[0].name); } else { setCurrentImportFileName(null); } }; const handleUpload = () => { if (importForm.current?.files.length) { const formData = new FormData(); formData.append('file', importForm.current?.files[0]); setImportLoading(true); axios .post(`claim-requests/import`, formData) .then((response) => { handleCancelImportButton(); loadDataTableData(); setImportResult(response.data); // alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows'); setImportLoading(false); }) .catch((response) => { enqueueSnackbar( 'Looks like something went wrong. Please check your data and try again. ' + response.message, { variant: 'error' } ); setImportLoading(false); }); } else { enqueueSnackbar('No File Selected', { variant: 'warning' }); } }; const handleGetTemplate = (type :string) => { axios.get('corporates/import-document-example/' + type) .then((response) => { const link = document.createElement('a'); link.href = response.data.data.file_url; link.setAttribute('download', response.data.data.file_name); document.body.appendChild(link); link.click(); handleClose(); }) } const handleGetData = (type :string) => { axios.get(`corporates/${corporate_id}/data-plan-benefit`) .then((response) => { const link = document.createElement('a'); link.href = response.data.data.file_url; link.setAttribute('download', response.data.data.file_name); document.body.appendChild(link); link.click(); handleClose(); }) } return (
{!currentImportFileName && ( Import {handleGetTemplate('claim-request')}}>Download Template {handleGetData('data-plan-benefit')}}>Download Claim Request )} {currentImportFileName && ( } sx={{ p: 1.8 }} onClick={handleUpload} loading={importLoading} > Upload )} {importResult && ( // // // Last Import Result Report :{' '} // // {importResult.result_file?.name ?? '-'} // // // Last Import Result :{' '} {importResult.result_file?.total_success_row ?? 0} {' '} Row Processed,{' '} {importResult.result_file?.total_failed_row} {' '} Failed, Report :{' '} {importResult.result_file?.name ?? '-'} )}
); } // Dummy Default Data const [dataTableIsLoading, setDataTableLoading] = useState(true); const [dataTableData, setDataTableData] = useState( LaravelPaginatedDataDefault ); const loadDataTableData = async (appliedFilter: any | null = null) => { axios.get('service').then((response) => { const formattedData = response.data.data.map(service => ({ value: service.code, label: service.name })); setServiceCode(formattedData); }); setDataTableLoading(true); const filter = appliedFilter ? appliedFilter : Object.fromEntries([...searchParams.entries()]); const response = await axios.get('/claim-requests', { params: filter }); console.log(response.data); setDataTableLoading(false); setDataTableData(response.data); }; const applyFilter = async (searchFilter: { search: string }) => { await loadDataTableData(searchFilter); setSearchParams(searchFilter); }; const handlePageChange = (event: ChangeEvent, value: number): void => { const filter = Object.fromEntries([...searchParams.entries(), ['page', value]]); loadDataTableData(filter); setSearchParams(filter); }; const handleApprove = (claimRequest) => { axios .post(`claim-requests/${claimRequest.id}/approve`) .then((response) => { enqueueSnackbar('Success Approve', { variant: 'success' }); loadDataTableData(); }) .catch(({ response }) => { enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); }); }; useEffect(() => { loadDataTableData(); }, []); const headStyle = { fontWeight: 'bold', }; // Called on every row to map the data to the columns function createData(data: any): any { return { ...data, }; } { /* ------------------ TABLE ROW ------------------ */ } function Row(props: { row: ReturnType }) { const { row } = props; const [open, setOpen] = React.useState(false); const [loadingApprove, setLoadingApprove] = React.useState(false); return ( *': { borderBottom: 'unset' } }}> {/* setOpen(!open)}> {open ? : } */ } { // handleShowClaim(row); // }} > {row.code} {row.member?.full_name} {row.service_name} {row.payment_type_name} { row.status == "requested" ? () : row.status == "submission" ? () : row.status == "declined" ? () : () } navigate(`/claim-requests/edit/${row.id}`)}> Edit navigate ('/claim-requests/detail/'+row.id+'')}> Detail } /> {/* { handleShowClaim(row); }} > */} {/* COLLAPSIBLE ROW */} } spacing={1} sx={{ marginY: 2 }} > Berkas Hasil Penunjang {/* {row.files_by_type?.claim_kondisi && row.files_by_type?.claim_kondisi.map((file, index) => ( -{' '} {file.name} ))} */} {row.files_by_type?.claim_kondisi && ( <> - Kondisi {row.files_by_type?.claim_kondisi.map((file, index) => ( {file.name} ))} )} {row.files_by_type?.claim_diagnosis && ( <> - Diagnosa {row.files_by_type?.claim_diagnosis.map((file, index) => ( {file.name} ))} )} {row.files_by_type?.claim_result && ( <> - Hasil {row.files_by_type?.claim_result.map((file, index) => ( {file.name} ))} )} {(!row.files_by_type?.claim_result && !row.files_by_type?.claim_diagnosis && !row.files_by_type?.claim_kondisi)&& Tidak ada berkas} ); } { /* ------------------ END TABLE ROW ------------------ */ } function TableContent() { return ( {/* ------------------ TABLE HEADER ------------------ */} {/* */} Code Name Date of Submission Service Type Claim Method Status {/* ------------------ END TABLE HEADER ------------------ */} {/* ------------------ TABLE ROW ------------------ */} {dataTableIsLoading ? ( Loading ) : dataTableData.data.length === 0 ? ( No Data ) : ( {dataTableData.data.map((row) => ( ))} )} {/* ------------------ END TABLE ROW ------------------ */}
); } // --------------------------------------------------------- // Dialog Detail Claim Request const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false); const [loadingClaimDetail, setLoadingClaimDetail] = useState(true); const [currentClaim, setCurrentClaim] = useState(null); function handleShowClaim(claimRequest) { setLoadingClaimDetail(true); setOpenDialogDetailClaim(true); axios .get(`/claim-requests/${claimRequest.id}`) .then(({ data }) => { setCurrentClaim(data.data); setLoadingClaimDetail(false); }) .catch((err) => { enqueueSnackbar(err.message, { variant: 'error' }); }); } function handleDownloadLog() {} return ( } /> ); }