From 3b914fbc2e675fcad52c3079c2b45b00aabe37ea Mon Sep 17 00:00:00 2001 From: bicochan Date: Mon, 28 Sep 2026 15:21:19 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[as]=20feat:=20=EB=B3=B4=EC=99=84=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81=20?= =?UTF-8?q?(20260928=5F1521)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/design-cnstn/model/columns.tsx | 13 +++- .../src/pages/fnrs-cnsltn/model/columns.tsx | 13 +++- .../as/src/pages/instl-sncn/model/columns.tsx | 13 +++- .../pages/sewer-bsc-plan/model/columns.tsx | 13 +++- .../ui/sewer-bsc-plan-form-page.tsx | 2 +- .../ui/attachments-form-section.tsx | 62 +++++++++---------- 6 files changed, 78 insertions(+), 38 deletions(-) diff --git a/apps/as/src/pages/design-cnstn/model/columns.tsx b/apps/as/src/pages/design-cnstn/model/columns.tsx index 429c209aa..93a453314 100644 --- a/apps/as/src/pages/design-cnstn/model/columns.tsx +++ b/apps/as/src/pages/design-cnstn/model/columns.tsx @@ -61,6 +61,13 @@ function buildProgressBadges(prgrsSttsComCd: string): ProgressBadge[] { ]; } +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + function getBadgeColor(state: BadgeState) { switch (state) { case "completed": @@ -110,7 +117,11 @@ export function createDesignCnstnColumns() { columnHelper.accessor("bizNm", { header: "사업명", meta: { align: "left" }, - cell: ({ getValue }) => formatOptional(getValue()), + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), }), columnHelper.accessor("taskSeCdNm", { header: "업무구분", diff --git a/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx b/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx index d033b290e..b6c4b24be 100644 --- a/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx @@ -102,6 +102,13 @@ function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N") ]; } +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + function getBadgeColor(state: BadgeState) { switch (state) { case "completed": @@ -152,7 +159,11 @@ export function createFnrsCnsltnColumns() { columnHelper.accessor("bizNm", { header: "사업명", meta: { align: "left" }, - cell: ({ getValue }) => formatOptional(getValue()), + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), }), columnHelper.accessor("taskSeCdNm", { header: "업무구분", diff --git a/apps/as/src/pages/instl-sncn/model/columns.tsx b/apps/as/src/pages/instl-sncn/model/columns.tsx index f00d05720..8dc617efa 100644 --- a/apps/as/src/pages/instl-sncn/model/columns.tsx +++ b/apps/as/src/pages/instl-sncn/model/columns.tsx @@ -103,6 +103,13 @@ function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N") ]; } +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + function getBadgeColor(state: BadgeState) { switch (state) { case "completed": @@ -153,7 +160,11 @@ export function createInstlSncnColumns() { columnHelper.accessor("bizNm", { header: "사업명", meta: { align: "left" }, - cell: ({ getValue }) => formatOptional(getValue()), + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), }), columnHelper.accessor("taskSeCdNm", { header: "업무구분", diff --git a/apps/as/src/pages/sewer-bsc-plan/model/columns.tsx b/apps/as/src/pages/sewer-bsc-plan/model/columns.tsx index e75312b0b..d0bc4e32c 100644 --- a/apps/as/src/pages/sewer-bsc-plan/model/columns.tsx +++ b/apps/as/src/pages/sewer-bsc-plan/model/columns.tsx @@ -101,6 +101,13 @@ function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N") ]; } +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + function getBadgeColor(state: BadgeState) { switch (state) { case "completed": @@ -151,7 +158,11 @@ export function createSewerBscPlanColumns() { columnHelper.accessor("sewerBscPlanNm", { header: "기본계획명", meta: { align: "left" }, - cell: ({ getValue }) => formatOptional(getValue()), + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), }), columnHelper.accessor("sewerBscPlanSeCdNm", { header: "계획구분", diff --git a/apps/as/src/pages/sewer-bsc-plan/ui/sewer-bsc-plan-form-page.tsx b/apps/as/src/pages/sewer-bsc-plan/ui/sewer-bsc-plan-form-page.tsx index 8c05521c3..7aed131ef 100644 --- a/apps/as/src/pages/sewer-bsc-plan/ui/sewer-bsc-plan-form-page.tsx +++ b/apps/as/src/pages/sewer-bsc-plan/ui/sewer-bsc-plan-form-page.tsx @@ -240,7 +240,7 @@ function SewerBscPlanFormPage({ return ( -
+
diff --git a/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx b/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx index 064691f14..b69640568 100644 --- a/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx +++ b/apps/as/src/widgets/pbadms-sprt/ui/attachments-form-section.tsx @@ -15,7 +15,11 @@ import { SectionCollapsible, UploadedFileChip, } from "@/shared/ui"; -import { attachService, useDownloadAttachmentByAtflCd, useDownloadAttachmentByAtflId } from "@/entities/attach"; +import { + attachService, + useDownloadAttachmentByAtflCd, + useDownloadAttachmentByAtflId, +} from "@/entities/attach"; import { useEsntlAtchFileMngTree } from "@/entities/esntl"; import { Button, @@ -373,32 +377,26 @@ function AttachmentsFormSection({ return (
-
-

필수 첨부파일

- - - - - - - - - - 파일명 - - 파일 확장자 - 파일첨부 - - - - {essentialFiles.length === 0 ? ( + {essentialFiles.length === 0 && ( +
+

필수 첨부파일

+
+ + + + + + - - 조회된 필수 첨부파일 항목이 없습니다. - + + 파일명 + + 파일 확장자 + 파일첨부 - ) : ( - essentialFiles.map((file) => { + + + {essentialFiles.map((file) => { const atflCd = file.atchFileGroupId ?? ""; return ( @@ -445,11 +443,11 @@ function AttachmentsFormSection({ ); - }) - )} - -
-
+ })} + + +
+ )}
@@ -468,9 +466,7 @@ function AttachmentsFormSection({ fileName={item.file?.name ?? item.fileName} isUploading={isUploading[item.fileKey] ?? false} onRemove={() => void removeEtcFile(idx)} - onDownload={ - item.atflId ? () => downloadByAtflId(item.atflId!) : undefined - } + onDownload={item.atflId ? () => downloadByAtflId(item.atflId!) : undefined} /> ))}
From 22ed78c87b111e5022413bbf7c8537a3e652a2f5 Mon Sep 17 00:00:00 2001 From: bicochan Date: Mon, 28 Sep 2026 16:37:20 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[as]=20feat:=20=ED=96=89=EC=A0=95=EC=A7=80?= =?UTF-8?q?=EC=9B=90=20=ED=8E=98=EC=9D=B4=EC=A7=80=20useSearchParamsState?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(with-base-layout)/design-cnstn/page.tsx | 10 ++- .../(with-base-layout)/fnrs-cnsltn/page.tsx | 10 ++- .../(with-base-layout)/instl-sncn/page.tsx | 10 ++- .../sewer-bsc-plan/page.tsx | 10 ++- .../ui/components/floating-action-buttons.tsx | 8 +- .../design-cnstn/ui/design-form-page.tsx | 10 +-- .../design-cnstn/ui/design-list-page.tsx | 67 ++++++++------ .../src/pages/design-cnstn/ui/design-list.tsx | 4 +- .../design-cnstn/ui/design-view-page.tsx | 4 +- .../ui/components/floating-action-buttons.tsx | 8 +- .../pages/fnrs-cnsltn/ui/fnrs-form-page.tsx | 12 +-- .../pages/fnrs-cnsltn/ui/fnrs-list-page.tsx | 67 ++++++++------ .../as/src/pages/fnrs-cnsltn/ui/fnrs-list.tsx | 4 +- .../ui/components/floating-action-buttons.tsx | 8 +- .../pages/instl-sncn/ui/instl-form-page.tsx | 12 +-- .../pages/instl-sncn/ui/instl-list-page.tsx | 56 +++++++----- .../as/src/pages/instl-sncn/ui/instl-list.tsx | 4 +- .../pages/instl-sncn/ui/instl-view-page.tsx | 4 +- .../ui/components/floating-action-buttons.tsx | 12 +-- .../ui/sewer-bsc-plan-form-page.tsx | 18 ++-- .../ui/sewer-bsc-plan-list-page.tsx | 73 +++++++++------ .../sewer-bsc-plan/ui/sewer-bsc-plan-list.tsx | 4 +- .../ui/sewer-bsc-plan-view-page.tsx | 4 +- apps/as/src/shared/lib/index.ts | 2 + apps/as/src/shared/lib/list-return-href.ts | 50 +++++++++++ .../src/shared/lib/use-search-params-state.ts | 90 +++++++++++++++++++ 26 files changed, 405 insertions(+), 156 deletions(-) create mode 100644 apps/as/src/shared/lib/list-return-href.ts create mode 100644 apps/as/src/shared/lib/use-search-params-state.ts diff --git a/apps/as/app/(main)/(with-base-layout)/design-cnstn/page.tsx b/apps/as/app/(main)/(with-base-layout)/design-cnstn/page.tsx index cced4a877..ec03c3be7 100644 --- a/apps/as/app/(main)/(with-base-layout)/design-cnstn/page.tsx +++ b/apps/as/app/(main)/(with-base-layout)/design-cnstn/page.tsx @@ -1,3 +1,11 @@ +import { Suspense } from "react"; + import { DesignListPage } from "@/pages/design-cnstn"; -export default DesignListPage; +export default function Page() { + return ( + + + + ); +} diff --git a/apps/as/app/(main)/(with-base-layout)/fnrs-cnsltn/page.tsx b/apps/as/app/(main)/(with-base-layout)/fnrs-cnsltn/page.tsx index 734a0afd9..bf6029a76 100644 --- a/apps/as/app/(main)/(with-base-layout)/fnrs-cnsltn/page.tsx +++ b/apps/as/app/(main)/(with-base-layout)/fnrs-cnsltn/page.tsx @@ -1,3 +1,11 @@ +import { Suspense } from "react"; + import { FnrsListPage } from "@/pages/fnrs-cnsltn"; -export default FnrsListPage; +export default function Page() { + return ( + + + + ); +} diff --git a/apps/as/app/(main)/(with-base-layout)/instl-sncn/page.tsx b/apps/as/app/(main)/(with-base-layout)/instl-sncn/page.tsx index a3d6e05ac..413df0c3d 100644 --- a/apps/as/app/(main)/(with-base-layout)/instl-sncn/page.tsx +++ b/apps/as/app/(main)/(with-base-layout)/instl-sncn/page.tsx @@ -1,3 +1,11 @@ +import { Suspense } from "react"; + import { InstlListPage } from "@/pages/instl-sncn"; -export default InstlListPage; +export default function Page() { + return ( + + + + ); +} diff --git a/apps/as/app/(main)/(with-base-layout)/sewer-bsc-plan/page.tsx b/apps/as/app/(main)/(with-base-layout)/sewer-bsc-plan/page.tsx index d07ca4b43..b7b96e246 100644 --- a/apps/as/app/(main)/(with-base-layout)/sewer-bsc-plan/page.tsx +++ b/apps/as/app/(main)/(with-base-layout)/sewer-bsc-plan/page.tsx @@ -1,3 +1,11 @@ +import { Suspense } from "react"; + import { SewerBscPlanListPage } from "@/pages/sewer-bsc-plan"; -export default SewerBscPlanListPage; +export default function Page() { + return ( + + + + ); +} diff --git a/apps/as/src/pages/design-cnstn/ui/components/floating-action-buttons.tsx b/apps/as/src/pages/design-cnstn/ui/components/floating-action-buttons.tsx index 37af44b48..94088f228 100644 --- a/apps/as/src/pages/design-cnstn/ui/components/floating-action-buttons.tsx +++ b/apps/as/src/pages/design-cnstn/ui/components/floating-action-buttons.tsx @@ -8,7 +8,7 @@ import { useQueryClient } from "@tanstack/react-query"; import { AxiosError } from "axios"; import { ENDPOINT } from "@/shared/config"; -import { useAlertStore, useUserStore } from "@/shared/lib"; +import { getListHref, useAlertStore, useUserStore, withListQs } from "@/shared/lib"; import { type DesignCnstnApplySaveRequestDto, designCnstnKeys, @@ -103,11 +103,11 @@ function FloatingActionButtons({ isRegister && actionButtons.some((button) => button === DESIGN_CNSTN_VIEW_BUTTON_ACTION.strg); function handleGoToList() { - router.push("/design-cnstn"); + router.push(getListHref("/design-cnstn")); } function handleEdit() { - router.push(`/design-cnstn/${designCnstnDocNo}/edit`); + router.push(withListQs(`/design-cnstn/${designCnstnDocNo}/edit`)); } function shouldShowButton(action: DesignCnstnViewButtonAction) { @@ -177,7 +177,7 @@ function FloatingActionButtons({ action: DESIGN_CNSTN_VIEW_BUTTON_ACTION.del, successMessage: "삭제되었습니다.", }); - router.push("/design-cnstn"); + router.push(getListHref("/design-cnstn")); } function getReviewOpinionFormData() { diff --git a/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx b/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx index 254a7a010..276073307 100644 --- a/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx +++ b/apps/as/src/pages/design-cnstn/ui/design-form-page.tsx @@ -8,7 +8,7 @@ import { useConfirm } from "@frontend-opensource/use-react-hooks"; import { zodResolver } from "@hookform/resolvers/zod"; import { useQueryClient } from "@tanstack/react-query"; -import { useAlertStore, useUserStore } from "@/shared/lib"; +import { getListHref, useAlertStore, useUserStore, withListQs } from "@/shared/lib"; import { RhfDevTool, SectionCollapsibleGroup, SectionCollapsibleToggle } from "@/shared/ui"; import { designCnstnKeys, @@ -91,7 +91,7 @@ function DesignFormPage({ mode, initialData, createDefaults }: DesignFormPagePro alert("저장되었습니다."); queryClient.invalidateQueries({ queryKey: designCnstnKeys.all }); - router.push(`/design-cnstn/${designCnstnDocNo}/edit`); + router.push(withListQs(`/design-cnstn/${designCnstnDocNo}/edit`)); } catch (error) { console.error("저장 실패:", error); alert("저장 중 오류가 발생했습니다."); @@ -115,7 +115,7 @@ function DesignFormPage({ mode, initialData, createDefaults }: DesignFormPagePro alert("신청 완료되었습니다."); queryClient.invalidateQueries({ queryKey: designCnstnKeys.all }); - router.push(`/design-cnstn/${designCnstnDocNo}`); + router.push(withListQs(`/design-cnstn/${designCnstnDocNo}`)); } catch (error) { console.error("신청 실패:", error); alert("신청 중 오류가 발생했습니다."); @@ -144,7 +144,7 @@ function DesignFormPage({ mode, initialData, createDefaults }: DesignFormPagePro await designCnstnMngService.delete(docNo); alert("삭제되었습니다."); queryClient.invalidateQueries({ queryKey: designCnstnKeys.list() }); - router.push("/design-cnstn"); + router.push(getListHref("/design-cnstn")); } catch (error) { console.error("삭제 실패:", error); alert("삭제 중 오류가 발생했습니다."); @@ -184,7 +184,7 @@ function DesignFormPage({ mode, initialData, createDefaults }: DesignFormPagePro