diff --git a/apps/as/src/pages/design-cnstn/model/columns.tsx b/apps/as/src/pages/design-cnstn/model/columns.tsx index 2212b2cb1..bd4079a44 100644 --- a/apps/as/src/pages/design-cnstn/model/columns.tsx +++ b/apps/as/src/pages/design-cnstn/model/columns.tsx @@ -1,183 +1,183 @@ -"use client"; - -import { Fragment } from "react"; - -import { createColumnHelper } from "@tanstack/react-table"; - -import { dayjs } from "@/shared/lib"; -import type { DesignCnstnMngResponseDto } from "@/entities/design-cnstn"; -import { Badge } from "@common/components"; - -const columnHelper = createColumnHelper(); - -const MAIN_STEP_LABELS = { - apply: "설계자문 신청", - techReview: "기술검토", - reply: "검토결과 회신", -} as const; - -export const PROGRESS_STATUS_COLUMNS = [ - { label: "설계자문 신청 (시군)", sttsComCd: "CT" }, - { label: "기술검토", sttsComCd: "CS" }, - { label: "기술검토 회신", sttsComCd: "CP" }, -]; - -type BadgeState = "completed" | "current" | "pending"; - -interface ProgressBadge { - label: string; - state: BadgeState; -} - -function buildProgressBadges(prgrsSttsComCd: string): ProgressBadge[] { - if (prgrsSttsComCd === "CV") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "CT" || prgrsSttsComCd === "CS" || prgrsSttsComCd === "SL") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.techReview, state: "current" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "CP") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.techReview, state: "completed" }, - { label: MAIN_STEP_LABELS.reply, state: "completed" }, - ]; - } - - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; -} - -function getProgressStatusBadge(prgrsSttsComCd?: string | null) { - if (prgrsSttsComCd === "SL") { - return 보완요청; - } - return null; -} - -function getBadgeColor(state: BadgeState) { - switch (state) { - case "completed": - return "green"; - case "current": - return "blue"; - case "pending": - return "lightGray"; - } -} - -function getBadgeStateText(state: BadgeState) { - switch (state) { - case "completed": - return "완료"; - case "current": - return "진행중"; - case "pending": - return "대기"; - } -} - -/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ -function splitStepLabel(label: string) { - const [title = "", ...rest] = label.split(" "); - return { title, detail: rest.join(" ") }; -} - -function formatOptional(value: string | null | undefined) { - return value?.trim() ? value : "-"; -} - -interface ProgressStepBadgeProps { - prgrsSttsComCd: string; -} - -function ProgressStepBadge({ prgrsSttsComCd }: ProgressStepBadgeProps) { - const badges = buildProgressBadges(prgrsSttsComCd); - - return ( -
- {badges.map((badge, index) => ( - - {index > 0 && >} - {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} - - {splitStepLabel(badge.label).title} - - {splitStepLabel(badge.label).detail} - {getBadgeStateText(badge.state)} - - - - ))} -
- ); -} - -export function createDesignCnstnColumns() { - return [ - columnHelper.accessor("sido", { - header: "시도", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("gugun", { - header: "시군구", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("bizNm", { - header: "사업명", - meta: { align: "left" }, - cell: ({ row, getValue }) => ( - <> - {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} - - ), - }), - columnHelper.accessor("taskSeCdNm", { - header: "업무구분", - meta: { align: "center" }, - cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), - }), - columnHelper.accessor("aplcntNm", { - header: "담당자", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("envoSeCdNm", { - header: "해당기관", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.display({ - id: "progress", - header: "진행상황", - meta: { align: "center" }, - cell: ({ row }) => , - }), - columnHelper.accessor("regDt", { - header: "신청일", - meta: { align: "center" }, - cell: ({ getValue }) => { - const value = getValue(); - return value ? dayjs(value).format("YYYY-MM-DD") : "-"; - }, - }), - ]; -} +"use client"; + +import { Fragment } from "react"; + +import { createColumnHelper } from "@tanstack/react-table"; + +import { dayjs } from "@/shared/lib"; +import type { DesignCnstnMngResponseDto } from "@/entities/design-cnstn"; +import { Badge } from "@common/components"; + +const columnHelper = createColumnHelper(); + +const MAIN_STEP_LABELS = { + apply: "설계자문 신청", + techReview: "기술검토", + reply: "검토결과 회신", +} as const; + +export const PROGRESS_STATUS_COLUMNS = [ + { label: "설계자문 신청 (시군)", sttsComCd: "CT" }, + { label: "기술검토", sttsComCd: "CS" }, + { label: "기술검토 회신", sttsComCd: "CP" }, +]; + +type BadgeState = "completed" | "current" | "pending"; + +interface ProgressBadge { + label: string; + state: BadgeState; +} + +function buildProgressBadges(prgrsSttsComCd: string): ProgressBadge[] { + if (prgrsSttsComCd === "CV") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "CT" || prgrsSttsComCd === "CS" || prgrsSttsComCd === "SL") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.techReview, state: "current" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "CP") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.techReview, state: "completed" }, + { label: MAIN_STEP_LABELS.reply, state: "completed" }, + ]; + } + + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; +} + +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + +function getBadgeColor(state: BadgeState) { + switch (state) { + case "completed": + return "green"; + case "current": + return "blue"; + case "pending": + return "lightGray"; + } +} + +function getBadgeStateText(state: BadgeState) { + switch (state) { + case "completed": + return "완료"; + case "current": + return "진행중"; + case "pending": + return "대기"; + } +} + +/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ +function splitStepLabel(label: string) { + const [title = "", ...rest] = label.split(" "); + return { title, detail: rest.join(" ") }; +} + +function formatOptional(value: string | null | undefined) { + return value?.trim() ? value : "-"; +} + +interface ProgressStepBadgeProps { + prgrsSttsComCd: string; +} + +function ProgressStepBadge({ prgrsSttsComCd }: ProgressStepBadgeProps) { + const badges = buildProgressBadges(prgrsSttsComCd); + + return ( +
+ {badges.map((badge, index) => ( + + {index > 0 && >} + {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} + + {splitStepLabel(badge.label).title} + + {splitStepLabel(badge.label).detail} + {getBadgeStateText(badge.state)} + + + + ))} +
+ ); +} + +export function createDesignCnstnColumns() { + return [ + columnHelper.accessor("sido", { + header: "시도", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("gugun", { + header: "시군구", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("bizNm", { + header: "사업명", + meta: { align: "left" }, + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), + }), + columnHelper.accessor("taskSeCdNm", { + header: "업무구분", + meta: { align: "center" }, + cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), + }), + columnHelper.accessor("aplcntNm", { + header: "담당자", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("envoSeCdNm", { + header: "해당기관", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.display({ + id: "progress", + header: "진행상황", + meta: { align: "center" }, + cell: ({ row }) => , + }), + columnHelper.accessor("regDt", { + header: "신청일", + meta: { align: "center" }, + cell: ({ getValue }) => { + const value = getValue(); + return value ? dayjs(value).format("YYYY-MM-DD") : "-"; + }, + }), + ]; +} diff --git a/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx b/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx index 756fda118..7e2e1b1ae 100644 --- a/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/model/columns.tsx @@ -1,230 +1,230 @@ -"use client"; - -import { Fragment } from "react"; - -import { createColumnHelper } from "@tanstack/react-table"; - -import { dayjs } from "@/shared/lib"; -import type { FnrsCnsltnMngResponseDto } from "@/entities/fnrs-cnsltn"; -import { Badge } from "@common/components"; - -const columnHelper = createColumnHelper(); - -const MAIN_STEP_LABELS = { - apply: "재원협의 신청", - envoReview: "재원협의 검토", - techReview: "기술검토", - reply: "검토결과 회신", -} as const; - -export const PROGRESS_STATUS_COLUMNS = [ - { label: "재원협의 신청 (시군)", sttsComCd: "ST" }, - { label: "재원협의 신청 (시도)", sttsComCd: "LE" }, - { label: "재원협의 검토", sttsComCd: "ER" }, - { label: "기술검토", sttsComCd: "TE" }, - { label: "기술검토 회신", sttsComCd: "TP" }, - { label: "환경청 검토 결과 회신", sttsComCd: "EP" }, -]; - -type BadgeState = "completed" | "current" | "pending"; - -interface ProgressBadge { - label: string; - state: BadgeState; -} - -function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N"): ProgressBadge[] { - if (prgrsSttsComCd === "SV") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "ST") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "current" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "LE") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "current" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (["FV", "ER", "AC", "TE", "RB", "RA", "AV", "EV", "RK", "RR", "SL"].includes(prgrsSttsComCd)) { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { label: MAIN_STEP_LABELS.techReview, state: "current" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "TP") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { - label: MAIN_STEP_LABELS.techReview, - state: techRplyHstryYn === "Y" ? "completed" : "pending", - }, - { label: MAIN_STEP_LABELS.reply, state: "current" }, - ]; - } - - if (prgrsSttsComCd === "EP" || prgrsSttsComCd === "TA") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { - label: MAIN_STEP_LABELS.techReview, - state: techRplyHstryYn === "Y" ? "completed" : "pending", - }, - { label: MAIN_STEP_LABELS.reply, state: "completed" }, - ]; - } - - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; -} - -function getProgressStatusBadge(prgrsSttsComCd?: string | null) { - if (prgrsSttsComCd === "SL") { - return 보완요청; - } - return null; -} - -function getBadgeColor(state: BadgeState) { - switch (state) { - case "completed": - return "green"; - case "current": - return "blue"; - case "pending": - return "lightGray"; - } -} - -function getBadgeStateText(state: BadgeState) { - switch (state) { - case "completed": - return "완료"; - case "current": - return "진행중"; - case "pending": - return "대기"; - } -} - -/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ -function splitStepLabel(label: string) { - const [title = "", ...rest] = label.split(" "); - return { title, detail: rest.join(" ") }; -} - -function formatOptional(value: string | null | undefined) { - return value?.trim() ? value : "-"; -} - -interface ProgressStepBadgeProps { - prgrsSttsComCd: string; - techRplyHstryYn: "Y" | "N"; -} - -function ProgressStepBadge({ prgrsSttsComCd, techRplyHstryYn }: ProgressStepBadgeProps) { - const badges = buildProgressBadges(prgrsSttsComCd, techRplyHstryYn); - - return ( -
- {badges.map((badge, index) => ( - - {index > 0 && >} - {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} - - {splitStepLabel(badge.label).title} - - {splitStepLabel(badge.label).detail} - {getBadgeStateText(badge.state)} - - - - ))} -
- ); -} - -export function createFnrsCnsltnColumns() { - return [ - columnHelper.accessor("sido", { - header: "시도", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("gugun", { - header: "시군구", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("bizNm", { - header: "사업명", - meta: { align: "left" }, - cell: ({ row, getValue }) => ( - <> - {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} - - ), - }), - columnHelper.accessor("taskSeCdNm", { - header: "업무구분", - meta: { align: "center" }, - cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), - }), - columnHelper.accessor("aplcntNm", { - header: "담당자", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("envoSeCdNm", { - header: "해당기관", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.display({ - id: "progress", - header: "진행상황", - meta: { align: "center" }, - cell: ({ row }) => ( - - ), - }), - columnHelper.accessor("regDt", { - header: "신청일", - meta: { align: "center" }, - cell: ({ getValue }) => { - const value = getValue(); - return value ? dayjs(value).format("YYYY-MM-DD") : "-"; - }, - }), - ]; -} +"use client"; + +import { Fragment } from "react"; + +import { createColumnHelper } from "@tanstack/react-table"; + +import { dayjs } from "@/shared/lib"; +import type { FnrsCnsltnMngResponseDto } from "@/entities/fnrs-cnsltn"; +import { Badge } from "@common/components"; + +const columnHelper = createColumnHelper(); + +const MAIN_STEP_LABELS = { + apply: "재원협의 신청", + envoReview: "재원협의 검토", + techReview: "기술검토", + reply: "검토결과 회신", +} as const; + +export const PROGRESS_STATUS_COLUMNS = [ + { label: "재원협의 신청 (시군)", sttsComCd: "ST" }, + { label: "재원협의 신청 (시도)", sttsComCd: "LE" }, + { label: "재원협의 검토", sttsComCd: "ER" }, + { label: "기술검토", sttsComCd: "TE" }, + { label: "기술검토 회신", sttsComCd: "TP" }, + { label: "환경청 검토 결과 회신", sttsComCd: "EP" }, +]; + +type BadgeState = "completed" | "current" | "pending"; + +interface ProgressBadge { + label: string; + state: BadgeState; +} + +function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N"): ProgressBadge[] { + if (prgrsSttsComCd === "SV") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "ST") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "current" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "LE") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "current" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (["FV", "ER", "AC", "TE", "RB", "RA", "AV", "EV", "RK", "RR", "SL"].includes(prgrsSttsComCd)) { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { label: MAIN_STEP_LABELS.techReview, state: "current" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "TP") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { + label: MAIN_STEP_LABELS.techReview, + state: techRplyHstryYn === "Y" ? "completed" : "pending", + }, + { label: MAIN_STEP_LABELS.reply, state: "current" }, + ]; + } + + if (prgrsSttsComCd === "EP" || prgrsSttsComCd === "TA") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { + label: MAIN_STEP_LABELS.techReview, + state: techRplyHstryYn === "Y" ? "completed" : "pending", + }, + { label: MAIN_STEP_LABELS.reply, state: "completed" }, + ]; + } + + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; +} + +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + +function getBadgeColor(state: BadgeState) { + switch (state) { + case "completed": + return "green"; + case "current": + return "blue"; + case "pending": + return "lightGray"; + } +} + +function getBadgeStateText(state: BadgeState) { + switch (state) { + case "completed": + return "완료"; + case "current": + return "진행중"; + case "pending": + return "대기"; + } +} + +/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ +function splitStepLabel(label: string) { + const [title = "", ...rest] = label.split(" "); + return { title, detail: rest.join(" ") }; +} + +function formatOptional(value: string | null | undefined) { + return value?.trim() ? value : "-"; +} + +interface ProgressStepBadgeProps { + prgrsSttsComCd: string; + techRplyHstryYn: "Y" | "N"; +} + +function ProgressStepBadge({ prgrsSttsComCd, techRplyHstryYn }: ProgressStepBadgeProps) { + const badges = buildProgressBadges(prgrsSttsComCd, techRplyHstryYn); + + return ( +
+ {badges.map((badge, index) => ( + + {index > 0 && >} + {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} + + {splitStepLabel(badge.label).title} + + {splitStepLabel(badge.label).detail} + {getBadgeStateText(badge.state)} + + + + ))} +
+ ); +} + +export function createFnrsCnsltnColumns() { + return [ + columnHelper.accessor("sido", { + header: "시도", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("gugun", { + header: "시군구", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("bizNm", { + header: "사업명", + meta: { align: "left" }, + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), + }), + columnHelper.accessor("taskSeCdNm", { + header: "업무구분", + meta: { align: "center" }, + cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), + }), + columnHelper.accessor("aplcntNm", { + header: "담당자", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("envoSeCdNm", { + header: "해당기관", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.display({ + id: "progress", + header: "진행상황", + meta: { align: "center" }, + cell: ({ row }) => ( + + ), + }), + columnHelper.accessor("regDt", { + header: "신청일", + meta: { align: "center" }, + cell: ({ getValue }) => { + const value = getValue(); + return value ? dayjs(value).format("YYYY-MM-DD") : "-"; + }, + }), + ]; +} diff --git a/apps/as/src/pages/instl-sncn/model/columns.tsx b/apps/as/src/pages/instl-sncn/model/columns.tsx index 141fa8249..56ac3a6b0 100644 --- a/apps/as/src/pages/instl-sncn/model/columns.tsx +++ b/apps/as/src/pages/instl-sncn/model/columns.tsx @@ -1,231 +1,231 @@ -"use client"; - -import { Fragment } from "react"; - -import { createColumnHelper } from "@tanstack/react-table"; - -import { dayjs } from "@/shared/lib"; -import type { InstlSncnMngResponseDto } from "@/entities/instl-sncn"; -import { Badge } from "@common/components"; - -const columnHelper = createColumnHelper(); - -const MAIN_STEP_LABELS = { - apply: "설치인가 신청", - envoReview: "설치인가 검토", - techReview: "기술검토", - reply: "검토결과 회신", -} as const; - -export const PROGRESS_STATUS_COLUMNS = [ - { label: "설치인가 신청 (시군)", sttsComCd: "ST" }, - { label: "설치인가 신청 (시도)", sttsComCd: "LE" }, - { label: "설치인가 검토", sttsComCd: "ER" }, - { label: "기술검토", sttsComCd: "TE" }, - { label: "기술검토 회신", sttsComCd: "TP" }, - { label: "검토결과 회신", sttsComCd: "EP" }, - { label: "설치인가 승인", sttsComCd: "TA" }, -]; - -type BadgeState = "completed" | "current" | "pending"; - -interface ProgressBadge { - label: string; - state: BadgeState; -} - -function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N"): ProgressBadge[] { - if (prgrsSttsComCd === "SV") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "ST") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "current" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "LE") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "current" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "ER" || prgrsSttsComCd === "TE" || prgrsSttsComCd === "SL") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { label: MAIN_STEP_LABELS.techReview, state: "current" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "TP" || prgrsSttsComCd === "EP") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { - label: MAIN_STEP_LABELS.techReview, - state: techRplyHstryYn === "Y" ? "completed" : "pending", - }, - { label: MAIN_STEP_LABELS.reply, state: "current" }, - ]; - } - - if (prgrsSttsComCd === "TA" || prgrsSttsComCd === "TB") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { - label: MAIN_STEP_LABELS.techReview, - state: techRplyHstryYn === "Y" ? "completed" : "pending", - }, - { label: MAIN_STEP_LABELS.reply, state: "completed" }, - ]; - } - - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; -} - -function getProgressStatusBadge(prgrsSttsComCd?: string | null) { - if (prgrsSttsComCd === "SL") { - return 보완요청; - } - return null; -} - -function getBadgeColor(state: BadgeState) { - switch (state) { - case "completed": - return "green"; - case "current": - return "blue"; - case "pending": - return "lightGray"; - } -} - -function getBadgeStateText(state: BadgeState) { - switch (state) { - case "completed": - return "완료"; - case "current": - return "진행중"; - case "pending": - return "대기"; - } -} - -/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ -function splitStepLabel(label: string) { - const [title = "", ...rest] = label.split(" "); - return { title, detail: rest.join(" ") }; -} - -function formatOptional(value: string | null | undefined) { - return value?.trim() ? value : "-"; -} - -interface ProgressStepBadgeProps { - prgrsSttsComCd: string; - techRplyHstryYn: "Y" | "N"; -} - -function ProgressStepBadge({ prgrsSttsComCd, techRplyHstryYn }: ProgressStepBadgeProps) { - const badges = buildProgressBadges(prgrsSttsComCd, techRplyHstryYn); - - return ( -
- {badges.map((badge, index) => ( - - {index > 0 && >} - {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} - - {splitStepLabel(badge.label).title} - - {splitStepLabel(badge.label).detail} - {getBadgeStateText(badge.state)} - - - - ))} -
- ); -} - -export function createInstlSncnColumns() { - return [ - columnHelper.accessor("sido", { - header: "시도", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("gugun", { - header: "시군구", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("bizNm", { - header: "사업명", - meta: { align: "left" }, - cell: ({ row, getValue }) => ( - <> - {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} - - ), - }), - columnHelper.accessor("taskSeCdNm", { - header: "업무구분", - meta: { align: "center" }, - cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), - }), - columnHelper.accessor("aplcntNm", { - header: "담당자", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("envoSeCdNm", { - header: "해당기관", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.display({ - id: "progress", - header: "진행상황", - meta: { align: "center" }, - cell: ({ row }) => ( - - ), - }), - columnHelper.accessor("regDt", { - header: "신청일", - meta: { align: "center" }, - cell: ({ getValue }) => { - const value = getValue(); - return value ? dayjs(value).format("YYYY-MM-DD") : "-"; - }, - }), - ]; -} +"use client"; + +import { Fragment } from "react"; + +import { createColumnHelper } from "@tanstack/react-table"; + +import { dayjs } from "@/shared/lib"; +import type { InstlSncnMngResponseDto } from "@/entities/instl-sncn"; +import { Badge } from "@common/components"; + +const columnHelper = createColumnHelper(); + +const MAIN_STEP_LABELS = { + apply: "설치인가 신청", + envoReview: "설치인가 검토", + techReview: "기술검토", + reply: "검토결과 회신", +} as const; + +export const PROGRESS_STATUS_COLUMNS = [ + { label: "설치인가 신청 (시군)", sttsComCd: "ST" }, + { label: "설치인가 신청 (시도)", sttsComCd: "LE" }, + { label: "설치인가 검토", sttsComCd: "ER" }, + { label: "기술검토", sttsComCd: "TE" }, + { label: "기술검토 회신", sttsComCd: "TP" }, + { label: "검토결과 회신", sttsComCd: "EP" }, + { label: "설치인가 승인", sttsComCd: "TA" }, +]; + +type BadgeState = "completed" | "current" | "pending"; + +interface ProgressBadge { + label: string; + state: BadgeState; +} + +function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N"): ProgressBadge[] { + if (prgrsSttsComCd === "SV") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "ST") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "current" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "LE") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "current" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "ER" || prgrsSttsComCd === "TE" || prgrsSttsComCd === "SL") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { label: MAIN_STEP_LABELS.techReview, state: "current" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "TP" || prgrsSttsComCd === "EP") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { + label: MAIN_STEP_LABELS.techReview, + state: techRplyHstryYn === "Y" ? "completed" : "pending", + }, + { label: MAIN_STEP_LABELS.reply, state: "current" }, + ]; + } + + if (prgrsSttsComCd === "TA" || prgrsSttsComCd === "TB") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { + label: MAIN_STEP_LABELS.techReview, + state: techRplyHstryYn === "Y" ? "completed" : "pending", + }, + { label: MAIN_STEP_LABELS.reply, state: "completed" }, + ]; + } + + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; +} + +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + +function getBadgeColor(state: BadgeState) { + switch (state) { + case "completed": + return "green"; + case "current": + return "blue"; + case "pending": + return "lightGray"; + } +} + +function getBadgeStateText(state: BadgeState) { + switch (state) { + case "completed": + return "완료"; + case "current": + return "진행중"; + case "pending": + return "대기"; + } +} + +/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ +function splitStepLabel(label: string) { + const [title = "", ...rest] = label.split(" "); + return { title, detail: rest.join(" ") }; +} + +function formatOptional(value: string | null | undefined) { + return value?.trim() ? value : "-"; +} + +interface ProgressStepBadgeProps { + prgrsSttsComCd: string; + techRplyHstryYn: "Y" | "N"; +} + +function ProgressStepBadge({ prgrsSttsComCd, techRplyHstryYn }: ProgressStepBadgeProps) { + const badges = buildProgressBadges(prgrsSttsComCd, techRplyHstryYn); + + return ( +
+ {badges.map((badge, index) => ( + + {index > 0 && >} + {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} + + {splitStepLabel(badge.label).title} + + {splitStepLabel(badge.label).detail} + {getBadgeStateText(badge.state)} + + + + ))} +
+ ); +} + +export function createInstlSncnColumns() { + return [ + columnHelper.accessor("sido", { + header: "시도", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("gugun", { + header: "시군구", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("bizNm", { + header: "사업명", + meta: { align: "left" }, + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), + }), + columnHelper.accessor("taskSeCdNm", { + header: "업무구분", + meta: { align: "center" }, + cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), + }), + columnHelper.accessor("aplcntNm", { + header: "담당자", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("envoSeCdNm", { + header: "해당기관", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.display({ + id: "progress", + header: "진행상황", + meta: { align: "center" }, + cell: ({ row }) => ( + + ), + }), + columnHelper.accessor("regDt", { + header: "신청일", + meta: { align: "center" }, + cell: ({ getValue }) => { + const value = getValue(); + return value ? dayjs(value).format("YYYY-MM-DD") : "-"; + }, + }), + ]; +} 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 8d6be2b19..25e51234b 100644 --- a/apps/as/src/pages/sewer-bsc-plan/model/columns.tsx +++ b/apps/as/src/pages/sewer-bsc-plan/model/columns.tsx @@ -1,235 +1,235 @@ -"use client"; - -import { Fragment } from "react"; - -import { createColumnHelper } from "@tanstack/react-table"; - -import { dayjs } from "@/shared/lib"; -import type { SewerBscPlanResponseDto } from "@/entities/sewer-bsc-plan"; -import { Badge } from "@common/components"; - -const columnHelper = createColumnHelper(); - -const MAIN_STEP_LABELS = { - apply: "기본계획 신청", - envoReview: "기본계획 검토", - techReview: "기술검토", - reply: "검토결과 회신", -} as const; - -export const PROGRESS_STATUS_COLUMNS = [ - { label: "기본계획 신청 (시군)", sttsComCd: "LE" }, - { label: "기본계획 검토", sttsComCd: "ER" }, - { label: "기술검토", sttsComCd: "TE" }, - { label: "기술검토 회신", sttsComCd: "TP" }, - { label: "횐경청 검토 결과 회신", sttsComCd: "EP" }, -]; - -type BadgeState = "completed" | "current" | "pending"; - -interface ProgressBadge { - label: string; - state: BadgeState; -} - -function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N"): ProgressBadge[] { - if (prgrsSttsComCd === "SV") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "ST") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "current" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "LE") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "current" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "ER" || prgrsSttsComCd === "TE" || prgrsSttsComCd === "SL") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { label: MAIN_STEP_LABELS.techReview, state: "current" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; - } - - if (prgrsSttsComCd === "TP") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { - label: MAIN_STEP_LABELS.techReview, - state: techRplyHstryYn === "Y" ? "completed" : "pending", - }, - { label: MAIN_STEP_LABELS.reply, state: "current" }, - ]; - } - - if (prgrsSttsComCd === "EP") { - return [ - { label: MAIN_STEP_LABELS.apply, state: "completed" }, - { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, - { - label: MAIN_STEP_LABELS.techReview, - state: techRplyHstryYn === "Y" ? "completed" : "pending", - }, - { label: MAIN_STEP_LABELS.reply, state: "completed" }, - ]; - } - - return [ - { label: MAIN_STEP_LABELS.apply, state: "pending" }, - { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, - { label: MAIN_STEP_LABELS.techReview, state: "pending" }, - { label: MAIN_STEP_LABELS.reply, state: "pending" }, - ]; -} - -function getProgressStatusBadge(prgrsSttsComCd?: string | null) { - if (prgrsSttsComCd === "SL") { - return 보완요청; - } - return null; -} - -function getBadgeColor(state: BadgeState) { - switch (state) { - case "completed": - return "green"; - case "current": - return "blue"; - case "pending": - return "lightGray"; - } -} - -function getBadgeStateText(state: BadgeState) { - switch (state) { - case "completed": - return "완료"; - case "current": - return "진행중"; - case "pending": - return "대기"; - } -} - -/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ -function splitStepLabel(label: string) { - const [title = "", ...rest] = label.split(" "); - return { title, detail: rest.join(" ") }; -} - -function formatOptional(value: string | undefined) { - return value?.trim() ? value : "-"; -} - -interface ProgressStepBadgeProps { - prgrsSttsComCd: string; - techRplyHstryYn: "Y" | "N"; -} - -function ProgressStepBadge({ prgrsSttsComCd, techRplyHstryYn }: ProgressStepBadgeProps) { - const badges = buildProgressBadges(prgrsSttsComCd, techRplyHstryYn); - - return ( -
- {badges.map((badge, index) => ( - - {index > 0 && >} - {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} - - {splitStepLabel(badge.label).title} - - {splitStepLabel(badge.label).detail} - {getBadgeStateText(badge.state)} - - - - ))} -
- ); -} - -export function createSewerBscPlanColumns() { - return [ - columnHelper.accessor("sido", { - header: "시도", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("gugun", { - header: "시군구", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("sewerBscPlanNm", { - header: "기본계획명", - meta: { align: "left" }, - cell: ({ row, getValue }) => ( - <> - {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} - - ), - }), - columnHelper.accessor("sewerBscPlanSeCdNm", { - header: "계획구분", - meta: { align: "center" }, - cell: ({ row }) => - formatOptional(row.original.sewerBscPlanSeCdNm || row.original.sewerBscPlanSeComCd), - }), - columnHelper.accessor("taskSeCdNm", { - header: "업무구분", - meta: { align: "center" }, - cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), - }), - columnHelper.accessor("rgtrNm", { - header: "담당자", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.accessor("envoSeCdNm", { - header: "해당기관", - meta: { align: "center" }, - cell: ({ getValue }) => formatOptional(getValue()), - }), - columnHelper.display({ - id: "progress", - header: "진행상황", - meta: { align: "center" }, - cell: ({ row }) => ( - - ), - }), - columnHelper.accessor("regDt", { - header: "등록일", - meta: { align: "center" }, - cell: ({ getValue }) => { - const value = getValue(); - return value ? dayjs(value).format("YYYY-MM-DD") : "-"; - }, - }), - ]; -} +"use client"; + +import { Fragment } from "react"; + +import { createColumnHelper } from "@tanstack/react-table"; + +import { dayjs } from "@/shared/lib"; +import type { SewerBscPlanResponseDto } from "@/entities/sewer-bsc-plan"; +import { Badge } from "@common/components"; + +const columnHelper = createColumnHelper(); + +const MAIN_STEP_LABELS = { + apply: "기본계획 신청", + envoReview: "기본계획 검토", + techReview: "기술검토", + reply: "검토결과 회신", +} as const; + +export const PROGRESS_STATUS_COLUMNS = [ + { label: "기본계획 신청 (시군)", sttsComCd: "LE" }, + { label: "기본계획 검토", sttsComCd: "ER" }, + { label: "기술검토", sttsComCd: "TE" }, + { label: "기술검토 회신", sttsComCd: "TP" }, + { label: "횐경청 검토 결과 회신", sttsComCd: "EP" }, +]; + +type BadgeState = "completed" | "current" | "pending"; + +interface ProgressBadge { + label: string; + state: BadgeState; +} + +function buildProgressBadges(prgrsSttsComCd: string, techRplyHstryYn: "Y" | "N"): ProgressBadge[] { + if (prgrsSttsComCd === "SV") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "ST") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "current" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "LE") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "current" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "ER" || prgrsSttsComCd === "TE" || prgrsSttsComCd === "SL") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { label: MAIN_STEP_LABELS.techReview, state: "current" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; + } + + if (prgrsSttsComCd === "TP") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { + label: MAIN_STEP_LABELS.techReview, + state: techRplyHstryYn === "Y" ? "completed" : "pending", + }, + { label: MAIN_STEP_LABELS.reply, state: "current" }, + ]; + } + + if (prgrsSttsComCd === "EP") { + return [ + { label: MAIN_STEP_LABELS.apply, state: "completed" }, + { label: MAIN_STEP_LABELS.envoReview, state: "completed" }, + { + label: MAIN_STEP_LABELS.techReview, + state: techRplyHstryYn === "Y" ? "completed" : "pending", + }, + { label: MAIN_STEP_LABELS.reply, state: "completed" }, + ]; + } + + return [ + { label: MAIN_STEP_LABELS.apply, state: "pending" }, + { label: MAIN_STEP_LABELS.envoReview, state: "pending" }, + { label: MAIN_STEP_LABELS.techReview, state: "pending" }, + { label: MAIN_STEP_LABELS.reply, state: "pending" }, + ]; +} + +function getProgressStatusBadge(prgrsSttsComCd?: string | null) { + if (prgrsSttsComCd === "SL") { + return 보완요청; + } + return null; +} + +function getBadgeColor(state: BadgeState) { + switch (state) { + case "completed": + return "green"; + case "current": + return "blue"; + case "pending": + return "lightGray"; + } +} + +function getBadgeStateText(state: BadgeState) { + switch (state) { + case "completed": + return "완료"; + case "current": + return "진행중"; + case "pending": + return "대기"; + } +} + +/** 단계명을 2줄로 분리: "설치인가 신청" → ["설치인가", "신청"], "기술검토" → ["기술검토", ""] */ +function splitStepLabel(label: string) { + const [title = "", ...rest] = label.split(" "); + return { title, detail: rest.join(" ") }; +} + +function formatOptional(value: string | undefined) { + return value?.trim() ? value : "-"; +} + +interface ProgressStepBadgeProps { + prgrsSttsComCd: string; + techRplyHstryYn: "Y" | "N"; +} + +function ProgressStepBadge({ prgrsSttsComCd, techRplyHstryYn }: ProgressStepBadgeProps) { + const badges = buildProgressBadges(prgrsSttsComCd, techRplyHstryYn); + + return ( +
+ {badges.map((badge, index) => ( + + {index > 0 && >} + {/* 1줄: 단계명 / 2줄: 세부단계 + 상태 (예: 설치인가 / 신청완료, 기술검토 / 완료) */} + + {splitStepLabel(badge.label).title} + + {splitStepLabel(badge.label).detail} + {getBadgeStateText(badge.state)} + + + + ))} +
+ ); +} + +export function createSewerBscPlanColumns() { + return [ + columnHelper.accessor("sido", { + header: "시도", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("gugun", { + header: "시군구", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("sewerBscPlanNm", { + header: "기본계획명", + meta: { align: "left" }, + cell: ({ row, getValue }) => ( + <> + {getProgressStatusBadge(row.original.prgrsSttsComCd)} {formatOptional(getValue())} + + ), + }), + columnHelper.accessor("sewerBscPlanSeCdNm", { + header: "계획구분", + meta: { align: "center" }, + cell: ({ row }) => + formatOptional(row.original.sewerBscPlanSeCdNm || row.original.sewerBscPlanSeComCd), + }), + columnHelper.accessor("taskSeCdNm", { + header: "업무구분", + meta: { align: "center" }, + cell: ({ row }) => formatOptional(row.original.taskSeCdNm || row.original.taskSeComCd), + }), + columnHelper.accessor("rgtrNm", { + header: "담당자", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.accessor("envoSeCdNm", { + header: "해당기관", + meta: { align: "center" }, + cell: ({ getValue }) => formatOptional(getValue()), + }), + columnHelper.display({ + id: "progress", + header: "진행상황", + meta: { align: "center" }, + cell: ({ row }) => ( + + ), + }), + columnHelper.accessor("regDt", { + header: "등록일", + meta: { align: "center" }, + cell: ({ getValue }) => { + const value = getValue(); + return value ? dayjs(value).format("YYYY-MM-DD") : "-"; + }, + }), + ]; +} 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 4c15b9cef..ef9c40722 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 @@ -404,11 +404,17 @@ function AttachmentsFormSection({
- {file.esntlAtchFileNm} + + {file.esntlAtchFileNm} + {file.esntlAtchYn === "Y" && ( + + {" "}(*) + + )} + {atflCd ? (