From 6ac1a6e350e194f2fa2fbd01be54a7ad32f483ef Mon Sep 17 00:00:00 2001 From: "MSI\\2Fi" Date: Fri, 9 May 2025 15:55:22 +0800 Subject: [PATCH] Export Staff Current Info function --- src/app/api/reports/actions.ts | 15 ++++++++++- src/app/api/reports/index.ts | 4 +++ src/components/StaffSearch/StaffSearch.tsx | 30 ++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/app/api/reports/actions.ts b/src/app/api/reports/actions.ts index 60908b4..8a9361b 100644 --- a/src/app/api/reports/actions.ts +++ b/src/app/api/reports/actions.ts @@ -1,7 +1,7 @@ "use server"; import { serverFetchBlob } from "@/app/utils/fetchUtil"; -import { MonthlyWorkHoursReportRequest, ProjectCashFlowReportRequest, LateStartReportRequest, ProjectResourceOverconsumptionReportRequest, ProjectPandLReportRequest, ProjectCompletionReportRequest, ProjectPotentialDelayReportRequest, CostAndExpenseReportRequest, CrossTeamChargeReportRequest, ProjectManhourSummaryReportRequest, ProjectMonthlyReportRequest, LastModifiedReportRequest } from "."; +import { MonthlyWorkHoursReportRequest, ProjectCashFlowReportRequest, LateStartReportRequest, ProjectResourceOverconsumptionReportRequest, ProjectPandLReportRequest, ProjectCompletionReportRequest, ProjectPotentialDelayReportRequest, CostAndExpenseReportRequest, CrossTeamChargeReportRequest, ProjectManhourSummaryReportRequest, ProjectMonthlyReportRequest, LastModifiedReportRequest, ExportCurrentStaffInfoRequest } from "."; import { BASE_API_URL } from "@/config/api"; export interface FileResponse { @@ -176,3 +176,16 @@ export const fetchLastModifiedReport = async (data: LastModifiedReportRequest) = return reportBlob }; + +export const fetchStaffCurrentInfo = async (data: ExportCurrentStaffInfoRequest) => { + const reportBlob = await serverFetchBlob( + `${BASE_API_URL}/reports/export-staff-current-info`, + { + method: "POST", + body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }, + ); + + return reportBlob +}; diff --git a/src/app/api/reports/index.ts b/src/app/api/reports/index.ts index 109da96..d7079d6 100644 --- a/src/app/api/reports/index.ts +++ b/src/app/api/reports/index.ts @@ -155,4 +155,8 @@ export interface LastModifiedReportFilter { export interface LastModifiedReportRequest { dateString: string; +} + +export interface ExportCurrentStaffInfoRequest { + staffIds: number[]; } \ No newline at end of file diff --git a/src/components/StaffSearch/StaffSearch.tsx b/src/components/StaffSearch/StaffSearch.tsx index a13f9d1..4247083 100644 --- a/src/components/StaffSearch/StaffSearch.tsx +++ b/src/components/StaffSearch/StaffSearch.tsx @@ -14,6 +14,10 @@ import { MAINTAIN_STAFF, MAINTAIN_USER } from "@/middleware"; import { TeamResult } from "@/app/api/team"; import { Grade } from "@/app/api/grades"; import { PositionResult } from "@/app/api/positions"; +import { Button, Stack } from "@mui/material"; +import FileDownloadIcon from '@mui/icons-material/FileDownload'; +import { fetchStaffCurrentInfo } from "@/app/api/reports/actions"; +import { downloadFile } from "@/app/utils/commonUtil"; interface Props { staff: StaffResult[]; @@ -102,6 +106,16 @@ const StaffSearch: React.FC = ({ staff, teams, grades, positions, abiliti }, t); }, []); + const handleExport = useCallback(async (ids: number[]) => { + console.log(ids) + const response = await fetchStaffCurrentInfo( + {staffIds: ids} + ) + if (response) { + downloadFile(new Uint8Array(response.blobValue), response.filename!!) + } + },[filteredStaff]) + useEffect(() => { setFilteredStaff(staff) }, [staff]); @@ -147,6 +161,7 @@ const StaffSearch: React.FC = ({ staff, teams, grades, positions, abiliti return ( <> + … { @@ -165,6 +180,21 @@ const StaffSearch: React.FC = ({ staff, teams, grades, positions, abiliti }} /> items={filteredStaff} columns={columns} /> + + + + ); };