Files
frontend/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-pjtco-ajmt-table.tsx
T
2026-10-11 13:16:56 +09:00

108 lines
3.0 KiB
TypeScript

"use client";
import type { PwrkCnsltnDocPjtcoAjmtMngResponseDto } from "@/entities/pwrk-cnsltn-doc-pjtco-ajmt-mng";
import { fmtNumber } from "@/widgets/pbadms-sprt";
import {
Skeleton,
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@common/components";
interface PwrkCnsltnDocPjtcoAjmtTableProps {
rows: PwrkCnsltnDocPjtcoAjmtMngResponseDto[];
isLoading: boolean;
isError: boolean;
}
function PwrkCnsltnDocPjtcoAjmtTable({
rows,
isLoading,
isError,
}: PwrkCnsltnDocPjtcoAjmtTableProps) {
if (isLoading) {
return (
<div className="space-y-2 p-3">
<Skeleton className="h-10 w-full" />
<Skeleton className="h-24 w-full" />
<Skeleton className="h-24 w-full" />
</div>
);
}
if (isError) {
return (
<p className="px-3 py-10 text-center text-muted-foreground">
사업비조정 정보를 불러오지 못했습니다.
</p>
);
}
return (
<Table caption="금액검증결과 목록으로 구분, 검증결과, 검증금액 정보 제공" variant="secondary">
<colgroup>
<col width="30%" />
<col width="50%" />
<col width="20%" />
</colgroup>
<TableHeader className="sticky top-0">
<TableRow>
<TableHead>구분</TableHead>
<TableHead>검증결과</TableHead>
<TableHead className="text-right">
<div className="flex flex-col gap-1">
<span>검증금액</span>
<span className="text-sm">(단위: 백만 원)</span>
</div>
</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{rows.length === 0 ? (
<TableRow>
<TableCell colSpan={3} className="py-10 text-center text-muted-foreground">
조회된 사업비조정 항목이 없습니다.
</TableCell>
</TableRow>
) : (
rows.map((row) => (
<TableRow key={getPjtcoAjmtRowKey(row)}>
<TableCell>{formatDivision(row)}</TableCell>
<TableCell>
<p className="whitespace-pre-wrap">{formatVrfcCn(row.vrfcCn)}</p>
</TableCell>
<TableCell className="text-right">{formatVrfcAmt(row.vrfcTpcoAmt)}</TableCell>
</TableRow>
))
)}
</TableBody>
</Table>
);
}
function getPjtcoAjmtRowKey(row: PwrkCnsltnDocPjtcoAjmtMngResponseDto) {
return [row.pwrkCnsltnDocNo, row.rvwOpnnSn, row.acntgSeCd].join("::");
}
function formatDivision(row: PwrkCnsltnDocPjtcoAjmtMngResponseDto) {
const label = row.acntgSeCdNm?.trim() || row.acntgSeCd?.trim();
return label || "-";
}
function formatVrfcCn(value: string | undefined) {
const text = value?.trim();
return text || "-";
}
function formatVrfcAmt(value: number | undefined) {
if (value === undefined || value === null) return "-";
const formatted = fmtNumber(value);
return formatted || "-";
}
export { PwrkCnsltnDocPjtcoAjmtTable };
export type { PwrkCnsltnDocPjtcoAjmtTableProps };