"use client"; import React, { useMemo } from "react"; import SearchBox, { Criterion } from "../SearchBox"; import { useTranslation } from "react-i18next"; import { ProjectPotentialDelayReportFilter } from "@/app/api/reports"; import { fetchProjectPotentialDelayReport } from "@/app/api/reports/actions"; import { downloadFile } from "@/app/utils/commonUtil"; import { TeamResult } from "@/app/api/team"; import { Customer } from "@/app/api/customer"; interface Props { teams: TeamResult[]; clients: Customer[]; } type SearchQuery = Partial>; type SearchParamNames = keyof SearchQuery; const GenerateProjectPotentialDelayReport: React.FC = ({ teams, clients }) => { const { t } = useTranslation("report"); const teamCombo = teams.map(team => `${team.code} - ${team.name}`) const clientCombo = clients.map(client => `${client.code} - ${client.name}`) const [errors, setErrors] = React.useState({ numberOfDays: false, projectCompletion: false, }) const searchCriteria: Criterion[] = useMemo( () => [ { label: t("Team"), paramName: "team", type: "select", options: teamCombo }, { label: t("Client"), paramName: "client", type: "select", options: clientCombo }, { label: t("Number Of Days"), paramName: "numberOfDays", type: "text", textType: "number", error: errors.numberOfDays, helperText: t("Can not be null and decimal, and should be >= 0") }, { label: t("Project Completion (<= %)"), paramName: "projectCompletion", type: "text", textType: "number", error: errors.projectCompletion, helperText: t("Can not be null and decimal, and should be in range of 0 - 100") }, ], [t, errors], ); return ( <> { let hasError = false if (query.numberOfDays.length === 0 || !Number.isInteger(parseFloat(query.numberOfDays)) || parseInt(query.numberOfDays) < 0) { setErrors((prev) => ({...prev, numberOfDays: true})) hasError = true } else { setErrors((prev) => ({...prev, numberOfDays: false})) } if (query.projectCompletion.length === 0 || !Number.isInteger(parseFloat(query.projectCompletion)) || parseInt(query.projectCompletion) < 0 || parseInt(query.projectCompletion) > 100) { setErrors((prev) => ({...prev, projectCompletion: true})) hasError = true } else { setErrors((prev) => ({...prev, projectCompletion: false})) } if (hasError) return false const teamIndex = teamCombo.findIndex(team => team === query.team) const clientIndex = clientCombo.findIndex(client => client === query.client) const response = await fetchProjectPotentialDelayReport({ teamId: teams[teamIndex]?.id ?? "All", clientId: clients[clientIndex]?.id ?? "All", numberOfDays: parseInt(query.numberOfDays), projectCompletion: parseInt(query.projectCompletion) }) if (response) { downloadFile(new Uint8Array(response.blobValue), response.filename!!) } }} formType={"download"} /> ); }; export default GenerateProjectPotentialDelayReport;