108 lines
3.0 KiB
TypeScript
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 };
|