import { ScrollArea } from '@mantine/core'; import { FC, useEffect, useState } from 'react'; import { Button, Stack } from '../../components'; import { Dialog } from '../../components/Dialog'; import { Pagination } from '../../components/Pagination'; import { LeaveApplication, soriAPIClient } from '../../lib/sori'; import { ApproveLeaveForm } from './ApproveLeaveForm'; import { CreateLeaveApplicationForm } from './CreateLeaveApplicationForm'; import { RejectLeaveForm } from './RejectLeaveForm'; export const AdminLeaveApplicationScene: FC = () => { const [createOpen, setCreateOpen] = useState(false); const [approveOpen, setApproveOpen] = useState(false); const [rejectOpen, setRejectOpen] = useState(false); const [leaveApplications, setLeaveApplications] = useState< LeaveApplication[] >([]); const [selectedLeaveApplication, setSelectedLeaveApplication] = useState(null); const [currentPage, setCurrentPage] = useState(1); const pageSize = 20; const paginatedstaffs = leaveApplications.slice( (currentPage - 1) * pageSize, currentPage * pageSize, ); const loadLeaveApplications = async () => { const leaveApplicationsResult = await soriAPIClient.leaveApplications.actions.getLeaveApplications(); const leaveApplications = leaveApplicationsResult.unwrap(); setLeaveApplications(leaveApplications); }; useEffect(() => { loadLeaveApplications(); }, []); // const onSubmit = (project: Partial) => { // setProjects([...projects, project as Project]); // setOpen(false); // }; return ( <> setCreateOpen(false)}> { setCreateOpen(false); loadLeaveApplications(); }} open={createOpen} /> setApproveOpen(false)}> {selectedLeaveApplication && ( { setApproveOpen(false); setSelectedLeaveApplication(null); loadLeaveApplications(); // refresh list after delete }} /> )} setRejectOpen(false)}> {selectedLeaveApplication && ( { setRejectOpen(false); setSelectedLeaveApplication(null); loadLeaveApplications(); // refresh list after delete }} /> )}
Leave Application Management (Admin)
{ setSelectedLeaveApplication(leaveApplication); setApproveOpen(true); }} onRejectClick={(leaveApplication) => { setSelectedLeaveApplication(leaveApplication); setRejectOpen(true); }} />
); }; const LeaveAppTable: FC<{ leaveApplications: LeaveApplication[]; onApproveClick: (leaveApplication: LeaveApplication) => void; onRejectClick: (leaveApplication: LeaveApplication) => void; }> = ({ leaveApplications, onApproveClick, onRejectClick }) => { return ( {leaveApplications.map((leaveApplication) => ( ))}
Leave Type From Date To Date Duration (Days) Full/Half Last Updated Status
); }; const LeaveAppTr: FC<{ LeaveApplication: LeaveApplication; onApproveClick: (leaveApplication: LeaveApplication) => void; onRejectClick: (leaveApplication: LeaveApplication) => void; }> = ({ LeaveApplication, onApproveClick, onRejectClick }) => { const getLastUpdatedTime = (updatedAt: Date) => { const lastUpdated = new Date(updatedAt); const today = new Date(); const diffMs = lastUpdated.getTime() - today.getTime(); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); if (-diffDays >= 30) { return `> ${Math.trunc(-diffDays / 30)} 個月`; } return `${-diffDays} day(s)`; }; const workDayType = LeaveApplication.leaves[0].workDay.type; let leaveDuration = 0; if (workDayType === 'full') { leaveDuration = LeaveApplication.leaves.length; } else { leaveDuration = 0.5; } return ( {LeaveApplication.leaves[0].type[0].toUpperCase() + LeaveApplication.leaves[0].type.slice(1)} {LeaveApplication.leaves[0].workDay.date} { LeaveApplication.leaves[LeaveApplication.leaves.length - 1].workDay .date } {leaveDuration} {LeaveApplication.leaves[0].workDay.type} {`${getLastUpdatedTime(LeaveApplication.updatedAt)}`} {LeaveApplication.status} ); };