From 5d27ee830ebbc954a9ad078e46673368c1161db7 Mon Sep 17 00:00:00 2001 From: bicochan Date: Wed, 23 Sep 2026 09:35:35 +0900 Subject: [PATCH] =?UTF-8?q?[as]=20feat:=20=ED=96=89=EC=A0=95=EC=A7=80?= =?UTF-8?q?=EC=9B=90=20=EB=AC=B8=EC=84=9C=20=EC=B2=B4=ED=81=AC=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=83=AD=20=EB=85=B8=EC=B6=9C=20=EC=95=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=EC=A6=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/fnrs-cnsltn/lib/checklist-utils.ts | 34 ------------------- .../fnrs-cnsltn/lib/review-step-utils.ts | 21 ++++++++++++ .../src/pages/fnrs-cnsltn/model/view-types.ts | 2 -- .../pages/fnrs-cnsltn/ui/fnrs-view-page.tsx | 6 +++- .../ui/sections/checklist-section.tsx | 6 ++-- .../pages/instl-sncn/lib/review-step-utils.ts | 21 +++++++++++- .../ui/sections/checklist-section.tsx | 6 ++-- .../sewer-bsc-plan/lib/review-step-utils.ts | 21 ++++++++++++ .../ui/sections/checklist-section.tsx | 6 ++-- 9 files changed, 76 insertions(+), 47 deletions(-) diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/checklist-utils.ts b/apps/as/src/pages/fnrs-cnsltn/lib/checklist-utils.ts index e6f95db5b..4ae0ee1f9 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/checklist-utils.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/checklist-utils.ts @@ -4,7 +4,6 @@ import { type ChecklistFormState, type ChecklistProgress, type ChecklistRowKey, - type ChecklistStepMap, REVIEW_STEP_CODES, type ReviewStepCode, } from "../model/view-types"; @@ -17,15 +16,6 @@ export function buildChecklistRowKey( return `${row.taskSeComCd}_${row.cklstSn}_${row.cklstArtclSn}_${row.cklstRvwSn}_${step}`; } -export function groupByReviewStep(rows: CklstRvwRsltTreeDto[]): ChecklistStepMap { - const base: ChecklistStepMap = { LOCAL: [], ENV: [], KECO: [] }; - rows.forEach((row) => { - const step = (row.rvwStpComCd ?? "LOCAL") as ReviewStepCode; - if (REVIEW_STEP_CODES.includes(step)) base[step].push(row); - }); - return base; -} - export function extractTaskCodes(rows: CklstRvwRsltTreeDto[]): string[] { return Array.from(new Set(rows.map((row) => row.taskSeComCd).filter(Boolean))); } @@ -70,13 +60,6 @@ export function computeChecklistProgress( return { total, completed, percent }; } -export function filterChecklistRowsByReviewStep( - rows: CklstRvwRsltTreeDto[], - reviewStep: ReviewStepCode, -): CklstRvwRsltTreeDto[] { - return rows.filter((row) => row.rvwStpComCd === reviewStep); -} - export function computeReviewStepChecklistProgress( rows: CklstRvwRsltTreeDto[], results: ChecklistFormState["results"], @@ -93,23 +76,6 @@ export function computeReviewStepChecklistProgress( return { total, completed, percent }; } -export function buildChecklistFormState(rows: CklstRvwRsltTreeDto[]): ChecklistFormState { - const results: ChecklistFormState["results"] = {}; - const comments: ChecklistFormState["comments"] = {}; - rows.forEach((row) => { - const key = buildChecklistRowKey(row); - if (row.rvwRsltAnmlyYn === "Y" || row.rvwRsltAnmlyYn === "N") { - results[key] = row.rvwRsltAnmlyYn; - } - if (row.picRvwCn) comments[key] = row.picRvwCn; - }); - return { - results, - comments, - progress: computeChecklistProgress(rows, results), - }; -} - export function mergeChecklistFormStateFromServer( prev: ChecklistFormState, allRows: CklstRvwRsltTreeDto[], diff --git a/apps/as/src/pages/fnrs-cnsltn/lib/review-step-utils.ts b/apps/as/src/pages/fnrs-cnsltn/lib/review-step-utils.ts index 0ba84b926..f1d93361a 100644 --- a/apps/as/src/pages/fnrs-cnsltn/lib/review-step-utils.ts +++ b/apps/as/src/pages/fnrs-cnsltn/lib/review-step-utils.ts @@ -1,3 +1,5 @@ +import type { CklstRvwRsltTreeDto } from "@/entities/fnrs-cnsltn"; + import { PBADMS_PROGRESS_ORDER, REVIEW_STEP_CODES, @@ -28,6 +30,25 @@ export function getVisibleReviewSteps( return REVIEW_STEP_CODES.slice(0, count); } +export function resolveVisibleReviewSteps( + prgrsSttsComCd: string, + userRoleCode: string | undefined, + cklstResultList: CklstRvwRsltTreeDto[], +): ReviewStepCode[] { + const byProgressAndRole = getVisibleReviewSteps(prgrsSttsComCd, userRoleCode); + const currentStep = byProgressAndRole.at(-1); + const stepsWithData = new Set(); + + for (const row of cklstResultList) { + const step = row.rvwStpComCd as ReviewStepCode | undefined; + if (step && REVIEW_STEP_CODES.includes(step)) stepsWithData.add(step); + } + + return REVIEW_STEP_CODES.filter( + (step) => stepsWithData.has(step) || step === currentStep, + ); +} + export function getEditableReviewStep( dtlInstCd?: string, prgrsSttsComCd?: string, diff --git a/apps/as/src/pages/fnrs-cnsltn/model/view-types.ts b/apps/as/src/pages/fnrs-cnsltn/model/view-types.ts index c3a21fb94..582beafe8 100644 --- a/apps/as/src/pages/fnrs-cnsltn/model/view-types.ts +++ b/apps/as/src/pages/fnrs-cnsltn/model/view-types.ts @@ -44,8 +44,6 @@ export interface ChecklistFormState { progress: ChecklistProgress; } -export type ChecklistStepMap = Record; - export const REVIEW_STEP_CODES: ReviewStepCode[] = ["LOCAL", "ENV", "KECO"]; export const REVIEW_STEP_LABELS: Record = { diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-view-page.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-view-page.tsx index e0b0bb323..b87ead75a 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-view-page.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-view-page.tsx @@ -14,7 +14,11 @@ import { } from "@/widgets/pbadms-sprt"; import { Skeleton } from "@common/components"; -import { getAiPendingMessage, isAiPendingStatus, isRagIndexingInProgress } from "../lib/ai-pending-utils"; +import { + getAiPendingMessage, + isAiPendingStatus, + isRagIndexingInProgress, +} from "../lib/ai-pending-utils"; import { needsRoleUser01AtrzResolve } from "../lib/button-config"; import { getEditableReviewStep } from "../lib/review-step-utils"; import { EMPTY_CKLST_RESULT_LIST, useChecklistFormState } from "../lib/use-checklist-form-state"; diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/sections/checklist-section.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/sections/checklist-section.tsx index e50f5a6b8..cf08e4b65 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/sections/checklist-section.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/sections/checklist-section.tsx @@ -11,7 +11,7 @@ import { extractTaskCodes, getChecklistDisplayRows, } from "../../lib/checklist-utils"; -import { getVisibleReviewSteps } from "../../lib/review-step-utils"; +import { resolveVisibleReviewSteps } from "../../lib/review-step-utils"; import type { ReviewStepCode } from "../../model/view-types"; import { type ChecklistFormState, @@ -37,8 +37,8 @@ function ChecklistSection({ setFormState, }: ChecklistSectionProps) { const visibleReviewSteps = useMemo( - () => getVisibleReviewSteps(prgrsSttsComCd, userRoleCode), - [prgrsSttsComCd, userRoleCode], + () => resolveVisibleReviewSteps(prgrsSttsComCd, userRoleCode, cklstResultList), + [prgrsSttsComCd, userRoleCode, cklstResultList], ); const taskCodes = useMemo(() => extractTaskCodes(cklstResultList), [cklstResultList]); diff --git a/apps/as/src/pages/instl-sncn/lib/review-step-utils.ts b/apps/as/src/pages/instl-sncn/lib/review-step-utils.ts index 68f60f4c9..aae86858b 100644 --- a/apps/as/src/pages/instl-sncn/lib/review-step-utils.ts +++ b/apps/as/src/pages/instl-sncn/lib/review-step-utils.ts @@ -1,4 +1,4 @@ -import type { ReviewStepCode } from "@/entities/instl-sncn"; +import type { CklstRvwRsltTreeDto, ReviewStepCode } from "@/entities/instl-sncn"; import { INSTL_PROGRESS_ORDER, @@ -27,6 +27,25 @@ export function getVisibleReviewSteps( return REVIEW_STEP_CODES.slice(0, count); } +export function resolveVisibleReviewSteps( + prgrsSttsComCd: string, + userRoleCode: string | undefined, + cklstResultList: CklstRvwRsltTreeDto[], +): ReviewStepCode[] { + const byProgressAndRole = getVisibleReviewSteps(prgrsSttsComCd, userRoleCode); + const currentStep = byProgressAndRole.at(-1); + const stepsWithData = new Set(); + + for (const row of cklstResultList) { + const step = row.rvwStpComCd as ReviewStepCode | undefined; + if (step && REVIEW_STEP_CODES.includes(step)) stepsWithData.add(step); + } + + return REVIEW_STEP_CODES.filter( + (step) => stepsWithData.has(step) || step === currentStep, + ); +} + export function getEditableReviewStep( dtlInstCd?: string, prgrsSttsComCd?: string, diff --git a/apps/as/src/pages/instl-sncn/ui/sections/checklist-section.tsx b/apps/as/src/pages/instl-sncn/ui/sections/checklist-section.tsx index a24c7dd9b..0d3c0e09e 100644 --- a/apps/as/src/pages/instl-sncn/ui/sections/checklist-section.tsx +++ b/apps/as/src/pages/instl-sncn/ui/sections/checklist-section.tsx @@ -11,7 +11,7 @@ import { extractTaskCodes, getChecklistDisplayRows, } from "../../lib/checklist-utils"; -import { getVisibleReviewSteps } from "../../lib/review-step-utils"; +import { resolveVisibleReviewSteps } from "../../lib/review-step-utils"; import { type ChecklistFormState, REVIEW_STEP_LABELS, @@ -36,8 +36,8 @@ function ChecklistSection({ setFormState, }: ChecklistSectionProps) { const visibleReviewSteps = useMemo( - () => getVisibleReviewSteps(prgrsSttsComCd, userRoleCode), - [prgrsSttsComCd, userRoleCode], + () => resolveVisibleReviewSteps(prgrsSttsComCd, userRoleCode, cklstResultList), + [prgrsSttsComCd, userRoleCode, cklstResultList], ); const taskCodes = useMemo(() => extractTaskCodes(cklstResultList), [cklstResultList]); diff --git a/apps/as/src/pages/sewer-bsc-plan/lib/review-step-utils.ts b/apps/as/src/pages/sewer-bsc-plan/lib/review-step-utils.ts index bce365857..5fab31348 100644 --- a/apps/as/src/pages/sewer-bsc-plan/lib/review-step-utils.ts +++ b/apps/as/src/pages/sewer-bsc-plan/lib/review-step-utils.ts @@ -1,3 +1,5 @@ +import type { CklstRvwRsltTreeDto } from "@/entities/sewer-bsc-plan"; + import { PBADMS_PROGRESS_ORDER, REVIEW_STEP_CODES, @@ -28,6 +30,25 @@ export function getVisibleReviewSteps( return REVIEW_STEP_CODES.slice(0, count); } +export function resolveVisibleReviewSteps( + prgrsSttsComCd: string, + userRoleCode: string | undefined, + cklstResultList: CklstRvwRsltTreeDto[], +): ReviewStepCode[] { + const byProgressAndRole = getVisibleReviewSteps(prgrsSttsComCd, userRoleCode); + const currentStep = byProgressAndRole.at(-1); + const stepsWithData = new Set(); + + for (const row of cklstResultList) { + const step = row.rvwStpComCd as ReviewStepCode | undefined; + if (step && REVIEW_STEP_CODES.includes(step)) stepsWithData.add(step); + } + + return REVIEW_STEP_CODES.filter( + (step) => stepsWithData.has(step) || step === currentStep, + ); +} + export function getEditableReviewStep( dtlInstCd?: string, prgrsSttsComCd?: string, diff --git a/apps/as/src/pages/sewer-bsc-plan/ui/sections/checklist-section.tsx b/apps/as/src/pages/sewer-bsc-plan/ui/sections/checklist-section.tsx index 14123d871..1c00c7502 100644 --- a/apps/as/src/pages/sewer-bsc-plan/ui/sections/checklist-section.tsx +++ b/apps/as/src/pages/sewer-bsc-plan/ui/sections/checklist-section.tsx @@ -11,7 +11,7 @@ import { extractTaskCodes, getChecklistDisplayRows, } from "../../lib/checklist-utils"; -import { getVisibleReviewSteps } from "../../lib/review-step-utils"; +import { resolveVisibleReviewSteps } from "../../lib/review-step-utils"; import type { ReviewStepCode } from "../../model/view-types"; import { type ChecklistFormState, @@ -37,8 +37,8 @@ function ChecklistSection({ setFormState, }: ChecklistSectionProps) { const visibleReviewSteps = useMemo( - () => getVisibleReviewSteps(prgrsSttsComCd, userRoleCode), - [prgrsSttsComCd, userRoleCode], + () => resolveVisibleReviewSteps(prgrsSttsComCd, userRoleCode, cklstResultList), + [prgrsSttsComCd, userRoleCode, cklstResultList], ); const taskCodes = useMemo(() => extractTaskCodes(cklstResultList), [cklstResultList]);