[as frontend] 체크 리스트 표시 여부 적용

This commit is contained in:
2026-06-02 11:30:30 +09:00
parent d8d98aee6d
commit fb148a77c1
2 changed files with 54 additions and 34 deletions
@@ -156,7 +156,7 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
// userInfo?.dtlInstCd 테스트 코드 ENV.ROLE_USER03 , KECO 권한 테스트용 (실제 권한에 맞게 변경 필요)
const userInfo = {
...userInfo2,
dtlInstCd: "ROLE_USER03",
dtlInstCd: "ROLE_USER02", //ROLE_USER03, ROLE_USER02, ROLE_USER01 KECO 권한 테스트용 (실제 권한에 맞게 변경 필요)
};
const alert = useAlertStore((state) => state.setMessage);
const qc = useQueryClient();
@@ -764,8 +764,10 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
if (!selectedReviewStep) {
return { total: 0, completed: 0, percent: 0 };
}
const total = cklstRows.length;
const completed = cklstRows.reduce((acc, row) => {
// only include rows that are marked for checkbox use (bchckUseYn === "Y")
const relevantRows = cklstRows.filter((row) => row.bchckUseYn === "Y");
const total = relevantRows.length;
const completed = relevantRows.reduce((acc, row) => {
const val = checkResults[cklstKey(row, selectedReviewStep)] ?? "";
return acc + (val ? 1 : 0);
}, 0);
@@ -782,8 +784,10 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
});
visibleReviewStepCodes.forEach((code) => persistedStepCodeSet.add(code));
// only persist rows that are enabled for checkbox (`bchckUseYn === "Y")
const relevantRows = cklstRows.filter((row) => row.bchckUseYn === "Y");
return Array.from(persistedStepCodeSet).flatMap((rvwStpComCd) =>
cklstRows.map((row) => ({
relevantRows.map((row) => ({
cklstSn: row.cklstSn,
cklstArtclSn: row.cklstArtclSn,
cklstRvwSn: row.cklstRvwSn,
@@ -804,9 +808,11 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
visibleReviewStepCodes.forEach((code) => persistedStepCodeSet.add(code));
const result: Record<string, any[]> = {};
// only persist rows that are enabled for checkbox
const relevantRows = cklstRows.filter((row) => row.bchckUseYn === "Y");
Array.from(persistedStepCodeSet).forEach((rvwStpComCd) => {
// use code as key (e.g., "LOCAL") and set rvwStpComCd to the same code
result[rvwStpComCd] = cklstRows.map((row) => ({
result[rvwStpComCd] = relevantRows.map((row) => ({
cklstSn: row.cklstSn,
cklstArtclSn: row.cklstArtclSn,
cklstRvwSn: row.cklstRvwSn,
@@ -987,6 +993,7 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
}
// 현재 입력 단계의 체크리스트 미선택 항목이 있으면 진행 불가
/*
const hasUncheckedChecklist = cklstRows.some(
(row) => !checkResults[cklstKey(row, editableReviewStep)],
);
@@ -994,6 +1001,7 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
alert("체크리스트를 모두 체크하세요.");
return false;
}
*/
// 저장 시: 필수 첨부파일(esntlAtchYn=Y) 업로드 여부 검증
if (mode === "SAVE") {
const missingRequiredFile = requiredAttachmentDefs.find((item) => {
@@ -1012,6 +1020,7 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
);
if (invalidYesRow) {
const invalidKey = cklstKey(invalidYesRow, editableReviewStep);
// console.warn("검토 결과가 예(Y)가 아닌 항목 발견:", invalidKey, invalidYesRow);
const invalidRowEl = cklstRowRefs.current[invalidKey];
invalidRowEl?.scrollIntoView({ behavior: "smooth", block: "center" });
const yesRadio = invalidRowEl?.querySelector<HTMLInputElement>(
@@ -1598,7 +1607,8 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
cklstRows.map((row) => {
const key = cklstKey(row, selectedReviewStep);
const rvwPaddingLeft = `${Math.max(0, row.treeLevel - 1) * 16 + 8}px`;
//bchckUseYn 의 값이 "Y"인 항목은 라디오 박스가 보이고 없으면 안보이게 처리
const showRadios = row.bchckUseYn === "Y";
return (
<tr
key={key}
@@ -1611,34 +1621,44 @@ function CnfmRegistPage({ initialData }: { initialData?: any } = {}) {
{row.treeLevel > 1 ? "└ " : ""}
{row.rvwCn}
</td>
<td className="text-center">
<label className="flex cursor-pointer items-center justify-center gap-1 text-[1.2rem] text-green-600">
<input
type="radio"
name={`chk_${key}`}
value="Y"
checked={checkResults[key] === "Y"}
disabled={editableReviewStep !== selectedReviewStep}
onChange={() => setCheckResults((prev) => ({ ...prev, [key]: "Y" }))}
/>
</label>
</td>
<td className="text-center">
<label className="flex cursor-pointer items-center justify-center gap-1 text-[1.2rem] text-red-500">
<input
type="radio"
name={`chk_${key}`}
value="N"
checked={checkResults[key] === "N"}
disabled={editableReviewStep !== selectedReviewStep}
onChange={() => setCheckResults((prev) => ({ ...prev, [key]: "N" }))}
/>
</label>
</td>
{selectedReviewStep !== "LOCAL" ? (
{!showRadios ? (
<>
<td className="text-center"></td>
<td className="text-center"></td>
</>
) : (
<>
<td className="text-center">
<label className="flex cursor-pointer items-center justify-center gap-1 text-[1.2rem] text-green-600">
<input
type="radio"
name={`chk_${key}`}
value="Y"
checked={checkResults[key] === "Y"}
disabled={editableReviewStep !== selectedReviewStep}
onChange={() => setCheckResults((prev) => ({ ...prev, [key]: "Y" }))}
/>
</label>
</td>
<td className="text-center">
<label className="flex cursor-pointer items-center justify-center gap-1 text-[1.2rem] text-red-500">
<input
type="radio"
name={`chk_${key}`}
value="N"
checked={checkResults[key] === "N"}
disabled={editableReviewStep !== selectedReviewStep}
onChange={() => setCheckResults((prev) => ({ ...prev, [key]: "N" }))}
/>
</label>
</td>
</>
)}
{showRadios && selectedReviewStep !== "LOCAL" ? (
<td className="text-left">
<textarea
className="cnfm-input w-full h-20"
className="cnfm-input w-full"
value={checkComments[key] ?? ""}
readOnly={editableReviewStep !== selectedReviewStep}
onChange={(e) =>
@@ -418,9 +418,9 @@ function CnfmViewPage({ id }: { id: string }) {
</tr>
) : (
selectedChecklistRows.map((row: any) => {
const key = `${row.cklstSn}_${row.cklstRvwSn}_${row.rvwStpComCd ?? "STEP01"}`;
const key = `${row.cklstSn}_${row.cklstRvwSn}_${row.rvwStpComCd ?? "LOCAL"}`;
const hasResult = row.rvwRsltAnmlyYn === "Y" || row.rvwRsltAnmlyYn === "N";
const showRadios = row.bchckUseYn === "Y" || hasResult;
const showRadios = row.bchckUseYn === "Y" ;
return (
<tr key={key}>