diff --git a/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts b/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts index b47de0782..38ce8e69a 100644 --- a/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts +++ b/apps/as/src/entities/instl-sncn/api/instl-sncn-service.ts @@ -4,11 +4,14 @@ import type { PageResponse } from "@/shared/model"; import type { AdstZoneResponseDto, + DocPrgrsUpdateRequestDto, InstlSncnApplySaveRequestDto, InstlSncnMngDetResponse, InstlSncnMngResponseDto, + InstlSncnMngSaveRequestDto, InstlSncnMngSearchParams, InstlSncnMngService, + InstlSncnMngUpdateRequestDto, } from "../model/instl-sncn-interface"; async function getSidoCombo(): Promise { @@ -30,32 +33,58 @@ async function getSigunguCombo(sidoCd: string): Promise { const BASE = ENDPOINT.AS_SERVICE.INSTL_SNCN; -export class InstlSncnApiService implements InstlSncnMngService { - public async getPage( - params: InstlSncnMngSearchParams, - ): Promise> { - const response = await client.get>(BASE, { - params, - }); - return response.data; - } - - public async getById(id: string): Promise { - const response = await client.get(`${BASE}/${id}`); - return response.data; - } - - public async saveApply(payload: InstlSncnApplySaveRequestDto): Promise { - const response = await client.post(`${BASE}/save-apply`, payload); - return response.data; - } - public async techReview(id: string, payload: InstlSncnApplySaveRequestDto): Promise { - await client.post(`${BASE}/${id}/tech-review`, payload); - } +async function getPage( + params: InstlSncnMngSearchParams, +): Promise> { + const response = await client.get>(BASE, { + params, + }); + return response.data; } -export const InstlSncnApi = new InstlSncnApiService(); +async function getById(id: string): Promise { + const response = await client.get(`${BASE}/${id}`); + return response.data; +} +async function save(payload: InstlSncnMngSaveRequestDto): Promise { + const response = await client.post(BASE, payload); + return response.data; +} + +async function saveApply(payload: InstlSncnApplySaveRequestDto): Promise { + const response = await client.post(`${BASE}/save-apply`, payload); + return response.data; +} + +async function update(id: string, payload: InstlSncnMngUpdateRequestDto): Promise { + await client.put(`${BASE}/${id}`, payload); +} + +async function techReview(id: string, payload: InstlSncnApplySaveRequestDto): Promise { + await client.post(`${BASE}/${id}/tech-review`, payload); +} + +async function remove(id: string): Promise { + await client.delete(`${BASE}/${id}`); +} + +async function changePrgrsSttsComCd(payload: DocPrgrsUpdateRequestDto): Promise { + await client.post(`${BASE}/doc/updatePrgrsStts`, payload); +} + +export const instlSncnService = { + getPage, + getById, + save, + saveApply, + update, + techReview, + remove, + changePrgrsSttsComCd, +} satisfies InstlSncnMngService; + +// TODO: st-anls-mst service 로 분리 export const instlSncnRegionService = { getSidoCombo, getSigunguCombo, diff --git a/apps/as/src/entities/instl-sncn/api/queries.ts b/apps/as/src/entities/instl-sncn/api/queries.ts index 46f56d231..4b5f4dd10 100644 --- a/apps/as/src/entities/instl-sncn/api/queries.ts +++ b/apps/as/src/entities/instl-sncn/api/queries.ts @@ -1,14 +1,20 @@ -import { useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { ENDPOINT } from "@/shared/config"; -import type { InstlSncnMngSearchParams } from "../model/instl-sncn-interface"; +import type { + DocPrgrsUpdateRequestDto, + InstlSncnApplySaveRequestDto, + InstlSncnMngSaveRequestDto, + InstlSncnMngSearchParams, + InstlSncnMngUpdateRequestDto, +} from "../model/instl-sncn-interface"; -import { InstlSncnApi, instlSncnRegionService } from "./instl-sncn-service"; +import { instlSncnRegionService, instlSncnService } from "./instl-sncn-service"; export const instlSncnKeys = { all: ["instl-sncn"] as const, - list: (params: InstlSncnMngSearchParams) => [...instlSncnKeys.all, "list", params] as const, + list: () => [...instlSncnKeys.all, "list"] as const, detail: (id: string) => [...instlSncnKeys.all, "detail", id] as const, sidoCombo: () => [ENDPOINT.STATVERIFY_SERVICE.ST_ANLS_MST, "sido"] as const, sigunguCombo: (sidoCd: string) => @@ -17,15 +23,15 @@ export const instlSncnKeys = { export function useInstlSncnList(params: InstlSncnMngSearchParams) { return useQuery({ - queryKey: instlSncnKeys.list(params), - queryFn: () => InstlSncnApi.getPage(params), + queryKey: instlSncnKeys.list(), + queryFn: () => instlSncnService.getPage(params), }); } export function useInstlSncnDetail(id: string) { return useQuery({ queryKey: instlSncnKeys.detail(id), - queryFn: () => InstlSncnApi.getById(id), + queryFn: () => instlSncnService.getById(id), enabled: Boolean(id), }); } @@ -44,3 +50,77 @@ export function useInstlSncnSigunguCombo(sidoCd: string) { enabled: Boolean(sidoCd), }); } + +export function useInstlSncnSave() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (payload: InstlSncnMngSaveRequestDto) => instlSncnService.save(payload), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + }, + }); +} + +export function useInstlSncnSaveApply() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (payload: InstlSncnApplySaveRequestDto) => instlSncnService.saveApply(payload), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + }, + }); +} + +export function useInstlSncnUpdate() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: ({ id, payload }: { id: string; payload: InstlSncnMngUpdateRequestDto }) => + instlSncnService.update(id, payload), + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + queryClient.invalidateQueries({ queryKey: instlSncnKeys.detail(variables.id) }); + }, + }); +} + +export function useInstlSncnTechReview() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: ({ id, payload }: { id: string; payload: InstlSncnApplySaveRequestDto }) => + instlSncnService.techReview(id, payload), + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + queryClient.invalidateQueries({ queryKey: instlSncnKeys.detail(variables.id) }); + }, + }); +} + +export function useInstlSncnRemove() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (id: string) => instlSncnService.remove(id), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + }, + }); +} + +export function useInstlSncnChangePrgrsStts() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (payload: DocPrgrsUpdateRequestDto) => + instlSncnService.changePrgrsSttsComCd(payload), + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + queryClient.invalidateQueries({ + queryKey: instlSncnKeys.detail(variables.docNo), + }); + }, + }); +} diff --git a/apps/as/src/entities/instl-sncn/index.ts b/apps/as/src/entities/instl-sncn/index.ts index 146c16215..875a1e162 100644 --- a/apps/as/src/entities/instl-sncn/index.ts +++ b/apps/as/src/entities/instl-sncn/index.ts @@ -1,4 +1,4 @@ -export { InstlSncnApi, instlSncnRegionService } from "./api/instl-sncn-service"; +export { instlSncnRegionService, instlSncnService } from "./api/instl-sncn-service"; export { instlSncnKeys, useInstlSncnDetail, @@ -12,6 +12,7 @@ export { type BizCstTreeDto, type BizSclTreeDto, type CklstRvwRsltTreeDto, + type DocPrgrsUpdateRequestDto, type ElaprDocPrgrsClientResponseDto, type EsntlAtchFileMngTreeResponseDto, INSTL_SNCN_REGISTER_SELECTION_KEY, @@ -19,6 +20,7 @@ export { type InstlSncnBizCstSaveRequestDto, type InstlSncnBzScaleSaveDto, type InstlSncnCklstResultSaveDto, + type InstlSncnEsntlAtchFileSaveDto, type InstlSncnMngDetResponse, type InstlSncnMngResponseDto, type InstlSncnMngSaveRequestDto, diff --git a/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts b/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts index 433345b86..c8ab5e56f 100644 --- a/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts +++ b/apps/as/src/entities/instl-sncn/model/instl-sncn-interface.ts @@ -67,6 +67,19 @@ export interface InstlSncnMngSaveRequestDto { rtlztnUsgSeComCd?: string; } +/** 설치인가관리 수정 요청 DTO */ +export type InstlSncnMngUpdateRequestDto = InstlSncnMngSaveRequestDto; + +/** 문서 진행상태 수정 요청 DTO */ +export interface DocPrgrsUpdateRequestDto { + /** 행정지원문서번호 */ + docNo: string; + /** 문서구분코드 */ + docSeComCd: string; + /** 진행상태공통코드 */ + prgrsSttsComCd: string; +} + /** 설치인가관리 응답 DTO */ export interface InstlSncnMngResponseDto extends InstlSncnMngSaveRequestDto { /** 설치인가문서번호 (필수로 재정의) */ @@ -334,6 +347,10 @@ export interface InstlSncnMngDetResponse { export interface InstlSncnMngService { getPage: (params: InstlSncnMngSearchParams) => Promise>; getById: (id: string) => Promise; + save: (payload: InstlSncnMngSaveRequestDto) => Promise; saveApply: (payload: InstlSncnApplySaveRequestDto) => Promise; + update: (id: string, payload: InstlSncnMngUpdateRequestDto) => Promise; techReview: (id: string, payload: InstlSncnApplySaveRequestDto) => Promise; + remove: (id: string) => Promise; + changePrgrsSttsComCd: (payload: DocPrgrsUpdateRequestDto) => Promise; } diff --git a/apps/as/src/pages/checklist-management/ui/cklst-preview-dialog.tsx b/apps/as/src/pages/checklist-management/ui/cklst-preview-dialog.tsx index 42f2edcf8..c6c1f3746 100644 --- a/apps/as/src/pages/checklist-management/ui/cklst-preview-dialog.tsx +++ b/apps/as/src/pages/checklist-management/ui/cklst-preview-dialog.tsx @@ -67,6 +67,7 @@ function CklstPreviewDialog({ {displayRows.map(({ row, depth }) => { const branchPrefix = formatTreeBranchPrefix(depth); + const showRadios = row.bchckUseYn !== "N"; if (row.useYn === "N") return null; @@ -82,16 +83,20 @@ function CklstPreviewDialog({ {row.rvwCn ?? "—"} - -
- - -
-
- - -
-
+ {showRadios ? ( + +
+ + +
+
+ + +
+
+ ) : ( + "—" + )}
); diff --git a/apps/as/src/pages/checklist-management/ui/cklst-rvw-grid.tsx b/apps/as/src/pages/checklist-management/ui/cklst-rvw-grid.tsx index 8eca3ce21..7b44ba2b5 100644 --- a/apps/as/src/pages/checklist-management/ui/cklst-rvw-grid.tsx +++ b/apps/as/src/pages/checklist-management/ui/cklst-rvw-grid.tsx @@ -113,6 +113,7 @@ function CklstRvwGrid({ selectedCklst }: CklstRvwGridProps) { rvwCnLvNo: 1, rvwCn: "", useYn: "Y", + bchckUseYn: "Y", sortSeq: maxSort + 1, isNew: true, isDirty: true, @@ -145,6 +146,7 @@ function CklstRvwGrid({ selectedCklst }: CklstRvwGridProps) { rvwCnLvNo: parentLv + 1, rvwCn: "", useYn: "Y", + bchckUseYn: "Y", sortSeq: maxSort + 1, isNew: true, isDirty: true, @@ -189,6 +191,8 @@ function CklstRvwGrid({ selectedCklst }: CklstRvwGridProps) { const handleSave = async () => { if (!cklstSn) return; + if (!(await confirm("체크리스트 항목을 저장하시겠습니까?"))) return; + const dirty = getDirtyRows().sort((a, b) => (a.rvwCnLvNo ?? 1) - (b.rvwCnLvNo ?? 1)); for (const row of dirty) { @@ -198,8 +202,6 @@ function CklstRvwGrid({ selectedCklst }: CklstRvwGridProps) { return; } - if (!(await confirm("체크리스트 항목을 저장하시겠습니까?"))) return; - if (row.isNew) { await createMutation.mutateAsync({ cklstSn: row.cklstSn, @@ -209,7 +211,7 @@ function CklstRvwGrid({ selectedCklst }: CklstRvwGridProps) { rvwCn: row.rvwCn, useYn: row.useYn, sortSeq: row.sortSeq, - bchckUseYn: "Y", + bchckUseYn: row.bchckUseYn ?? "Y", }); } else if (row.cklstRvwSn != null) { await updateMutation.mutateAsync({ @@ -277,17 +279,19 @@ function CklstRvwGrid({ selectedCklst }: CklstRvwGridProps) { ) : ( - - - + + + + - + 점검항목 주요 검토내용 사용 여부 + 체크 사용 구분 관리 diff --git a/apps/as/src/pages/checklist-management/ui/cklst-rvw-row.tsx b/apps/as/src/pages/checklist-management/ui/cklst-rvw-row.tsx index 9ea9094ce..c8bc7cb76 100644 --- a/apps/as/src/pages/checklist-management/ui/cklst-rvw-row.tsx +++ b/apps/as/src/pages/checklist-management/ui/cklst-rvw-row.tsx @@ -91,6 +91,22 @@ function CklstRvwRowComponent({ + + onChange({ bchckUseYn: v as "Y" | "N", isDirty: true })} + className="flex justify-center gap-4" + > +
+ + +
+
+ + +
+
+
{levelLabel}
diff --git a/apps/as/src/pages/instl-sncn-old/ui/cnfm-list-page.tsx b/apps/as/src/pages/instl-sncn-old/ui/cnfm-list-page.tsx index 8597baf69..2b8c56174 100644 --- a/apps/as/src/pages/instl-sncn-old/ui/cnfm-list-page.tsx +++ b/apps/as/src/pages/instl-sncn-old/ui/cnfm-list-page.tsx @@ -9,8 +9,8 @@ import { dayjs } from "@/shared/lib"; import { useCodeList } from "@/entities/code"; import { INSTL_SNCN_REGISTER_SELECTION_KEY, - InstlSncnApi, type InstlSncnMngSearchParams, + instlSncnService, } from "@/entities/instl-sncn"; import "./cnfm-page.css"; @@ -78,14 +78,14 @@ function CnfmListPage() { useEffect(() => { if (!taskDialogOpen) return; if (selectedTaskSeComCd.length) return; - if (fnrsCodeList.length === 0) return; - // setSelectedTaskSeComCd([fnrsCodeList[0].lwpoCd]); + if (fnrsCodeList.length === 0) return; + // setSelectedTaskSeComCd([fnrsCodeList[0].lwpoCd]); }, [taskDialogOpen, selectedTaskSeComCd, fnrsCodeList]); const query = useQuery({ queryKey: ["instl-sncn-list", search, pageIndex, pageSize], queryFn: () => - InstlSncnApi.getPage({ + instlSncnService.getPage({ ...search, page: pageIndex, size: pageSize, @@ -120,13 +120,15 @@ function CnfmListPage() { // prepare arrays of selected codes and names const selectedCodes = selectedTaskSeComCd; - const selectedNames = selectedTaskSeComCd.map((code) => fnrsCodeList.find((item) => item.lwpoCd === code)?.lwpoCdNm || ""); + const selectedNames = selectedTaskSeComCd.map( + (code) => fnrsCodeList.find((item) => item.lwpoCd === code)?.lwpoCdNm || "", + ); sessionStorage.setItem( INSTL_SNCN_REGISTER_SELECTION_KEY, JSON.stringify({ taskSeComCdList: selectedCodes, - taskSeComCdNmList: selectedNames - }) + taskSeComCdNmList: selectedNames, + }), ); setTaskDialogOpen(false); router.push("/instl-sncn/register"); @@ -138,7 +140,9 @@ function CnfmListPage() {
- +
- +
- +
- +
@@ -198,11 +214,7 @@ function CnfmListPage() {

설치인가 목록

-
@@ -237,12 +251,16 @@ function CnfmListPage() {
{query.isLoading && ( - + )} {!query.isLoading && (query.data?.content?.length ?? 0) === 0 && ( - + )} {(query.data?.content ?? []).map((row) => { @@ -254,7 +272,7 @@ function CnfmListPage() { onClick={() => router.push(`/instl-sncn/${row.instlSncnDocNo}`)} > - + @@ -267,10 +285,13 @@ function CnfmListPage() { index < currentStepIndex ? "completed" : index === currentStepIndex - ? "current" - : "pending"; + ? "current" + : "pending"; return ( - + {step.label} @@ -284,10 +305,13 @@ function CnfmListPage() { index < currentStepIndex ? "completed" : index === currentStepIndex - ? "current" - : "pending"; + ? "current" + : "pending"; return ( - + {step.label} @@ -378,7 +402,9 @@ function CnfmListPage() { checked={selectedTaskSeComCd.includes(item.lwpoCd)} onChange={() => { setSelectedTaskSeComCd((prev) => - prev.includes(item.lwpoCd) ? prev.filter((v) => v !== item.lwpoCd) : [...prev, item.lwpoCd], + prev.includes(item.lwpoCd) + ? prev.filter((v) => v !== item.lwpoCd) + : [...prev, item.lwpoCd], ); }} /> @@ -396,7 +422,7 @@ function CnfmListPage() { > 취소 - )} {shouldShowButton(INSTL_SNCN_VIEW_BUTTON_ACTION.strg) && ( - )} {shouldShowButton(INSTL_SNCN_VIEW_BUTTON_ACTION.aply) && ( - )} @@ -214,12 +296,7 @@ function FloatingActionButtons({ )} {shouldShowButton(INSTL_SNCN_VIEW_BUTTON_ACTION.envoSbmsn) && ( - )} @@ -238,6 +315,7 @@ function FloatingActionButtons({ )} {shouldShowButton(INSTL_SNCN_VIEW_BUTTON_ACTION.rvwRply) && ( )} {shouldShowButton(INSTL_SNCN_VIEW_BUTTON_ACTION.rqstTechRvw) && ( - )} @@ -315,14 +387,6 @@ function FloatingActionButtons({ onClose={() => setActiveDialog(null)} onSelect={handleElaprTmpltSelect} /> - setActiveDialog(null)} - title="반려 사유 입력" - placeholder="반려 사유를 입력하세요." - isSubmitting={isProcessing} - onConfirm={(value) => void handleRjctConfirm(value)} - /> setActiveDialog(null)} @@ -337,14 +401,26 @@ function FloatingActionButtons({ export { FloatingActionButtons }; -async function handleStrg(context: ActionHandlerContext): Promise { - // TODO: 저장 API 호출 - context.onSuccess?.(); +async function handleStrg( + context: ActionHandlerContext, +): Promise { + try { + await instlSncnService.saveApply(context.request); + context.onSuccess?.(); + } catch (error) { + context.onError?.(error as Error); + } } -async function handleAply(context: ActionHandlerContext): Promise { - // TODO: 신청완료 API 호출 - context.onSuccess?.(); +async function handleAply( + context: ActionHandlerContext, +): Promise { + try { + await instlSncnService.saveApply(context.request); + context.onSuccess?.(); + } catch (error) { + context.onError?.(error as Error); + } } async function handleDel(context: ActionHandlerContext): Promise { @@ -362,14 +438,24 @@ async function handleInstlSncnAncmnt(context: ActionHandlerContext): Promise { - // TODO: 환경청제출 API 호출 - context.onSuccess?.(); +async function handleEnvoSbmsn( + context: ActionHandlerContext, +): Promise { + try { + await instlSncnService.changePrgrsSttsComCd(context.request); + context.onSuccess?.(); + } catch (error) { + context.onError?.(error as Error); + } } -async function handleRjct(context: ActionHandlerContext): Promise { - // TODO: 반려 API 호출 - context.onSuccess?.(); +async function handleRjct(context: ActionHandlerContext): Promise { + try { + await instlSncnService.changePrgrsSttsComCd(context.request); + context.onSuccess?.(); + } catch (error) { + context.onError?.(error as Error); + } } async function handleSncnAprv(context: ActionHandlerContext): Promise { @@ -446,6 +532,7 @@ const buttonActionHandlers: Record = { grndsChck: handleGrndsChck, }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any interface ActionHandlerContext { request: T; data: InstlSncnMngDetResponse; diff --git a/apps/as/src/pages/instl-sncn/ui/instl-edit-page.tsx b/apps/as/src/pages/instl-sncn/ui/instl-edit-page.tsx index ba18c95af..2ba751435 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-edit-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-edit-page.tsx @@ -9,14 +9,10 @@ interface InstlEditPageProps { } function InstlEditPage({ id }: InstlEditPageProps) { - const { data, isLoading, isError } = useInstlSncnDetail(id); - - if (isLoading) { - return
수정 정보를 불러오는 중...
; - } + const { data, isError } = useInstlSncnDetail(id); if (isError || !data) { - return
수정 대상을 찾을 수 없습니다.
; + return
수정 대상을 찾을 수 없습니다.
; } return ; diff --git a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx index 41bc100ab..3e06ca069 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx @@ -7,7 +7,7 @@ import { useRouter } from "next/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; import { useAlertStore, useUserStore } from "@/shared/lib"; -import { InstlSncnApi, type InstlSncnMngDetResponse } from "@/entities/instl-sncn"; +import { type InstlSncnMngDetResponse, instlSncnService } from "@/entities/instl-sncn"; import { Button } from "@common/components"; import { @@ -67,7 +67,7 @@ function InstlFormPage({ mode, initialData }: InstlFormPageProps) { esntlAtchFileList: data.esntlAtchFileList, }; - const instlSncnDocNo = await InstlSncnApi.saveApply(payload); + const instlSncnDocNo = await instlSncnService.saveApply(payload); alert(isEditMode ? "수정되었습니다." : "저장되었습니다."); router.push(`/instl-sncn/${instlSncnDocNo}`); diff --git a/apps/as/src/pages/instl-sncn/ui/instl-view-page.tsx b/apps/as/src/pages/instl-sncn/ui/instl-view-page.tsx index 4a8886dd1..3eff839c1 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-view-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-view-page.tsx @@ -1,9 +1,13 @@ "use client"; +import { useState } from "react"; + import { useUserStore } from "@/shared/lib"; import { useInstlSncnDetail } from "@/entities/instl-sncn"; import { Skeleton } from "@common/components"; +import { type ChecklistFormState } from "../model/view-types"; + import { FloatingActionButtons } from "./components/floating-action-buttons"; import { AttachmentsSection } from "./sections/attachments-section"; import { BasicInfoSection } from "./sections/basic-info-section"; @@ -20,6 +24,10 @@ interface InstlViewPageProps { function InstlViewPage({ id }: InstlViewPageProps) { const userInfo = useUserStore((state) => state.userInfo); const { data, isLoading, isError } = useInstlSncnDetail(id); + const [checklistFormState, setChecklistFormState] = useState({ + results: {}, + comments: {}, + }); if (isLoading) { return ( @@ -64,14 +72,18 @@ function InstlViewPage({ id }: InstlViewPageProps) { cklstResultList={cklstResultList} prgrsSttsComCd={detDto.prgrsSttsComCd || ""} userRoleCode={userInfo?.dtlInstCd} + formState={checklistFormState} + setFormState={setChecklistFormState} /> ); diff --git a/apps/as/src/pages/instl-sncn/ui/sections/business-cost-form-section.tsx b/apps/as/src/pages/instl-sncn/ui/sections/business-cost-form-section.tsx index 86c442d9a..bd6434b57 100644 --- a/apps/as/src/pages/instl-sncn/ui/sections/business-cost-form-section.tsx +++ b/apps/as/src/pages/instl-sncn/ui/sections/business-cost-form-section.tsx @@ -3,8 +3,8 @@ import { useEffect, useMemo } from "react"; import { Controller, useFormContext, useWatch } from "react-hook-form"; -import { useAcntgSeMngTree } from "@/entities/acntg"; import { Field } from "@/shared/ui/field"; +import { useAcntgSeMngTree } from "@/entities/acntg"; import { Input, Skeleton, diff --git a/apps/as/src/pages/instl-sncn/ui/sections/business-scale-form-section.tsx b/apps/as/src/pages/instl-sncn/ui/sections/business-scale-form-section.tsx index c8c582239..f9d14f92f 100644 --- a/apps/as/src/pages/instl-sncn/ui/sections/business-scale-form-section.tsx +++ b/apps/as/src/pages/instl-sncn/ui/sections/business-scale-form-section.tsx @@ -3,8 +3,8 @@ import { useEffect } from "react"; import { Controller, useFormContext, useWatch } from "react-hook-form"; -import { useCnstpSeMngPage } from "@/entities/cnstp"; import { Field } from "@/shared/ui/field"; +import { useCnstpSeMngPage } from "@/entities/cnstp"; import { Input, Table, 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 b1739ff49..8eecd947a 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 @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useMemo, useState } from "react"; +import { type Dispatch, type SetStateAction, useEffect, useMemo, useState } from "react"; import type { CklstRvwRsltTreeDto, ReviewStepCode } from "@/entities/instl-sncn"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@common/components"; @@ -24,12 +24,16 @@ interface ChecklistSectionProps { cklstResultList: CklstRvwRsltTreeDto[]; prgrsSttsComCd: string; userRoleCode?: string; + formState: ChecklistFormState; + setFormState: Dispatch>; } function ChecklistSection({ cklstResultList, prgrsSttsComCd, userRoleCode, + formState, + setFormState, }: ChecklistSectionProps) { const visibleReviewSteps = useMemo( () => getVisibleReviewSteps(prgrsSttsComCd, userRoleCode), @@ -40,7 +44,6 @@ function ChecklistSection({ const [selectedReviewStep, setSelectedReviewStep] = useState("LOCAL"); const [selectedTaskCode, setSelectedTaskCode] = useState(null); - const [formState, setFormState] = useState({ results: {}, comments: {} }); useEffect(() => { if (visibleReviewSteps.length === 0) return;
조회 중입니다... + 조회 중입니다... +
조회 결과가 없습니다. + 조회 결과가 없습니다. +
{row.sido || "-"}{row.gugun|| "-"}{row.gugun || "-"} {row.bizNm || "-"} {row.taskSeCdNm || row.taskSeComCd || "-"} {row.aplcntNm || "-"}