diff --git a/apps/as/src/entities/auth/api/auth-service.ts b/apps/as/src/entities/auth/api/auth-service.ts index 934471c50..5615f55f8 100644 --- a/apps/as/src/entities/auth/api/auth-service.ts +++ b/apps/as/src/entities/auth/api/auth-service.ts @@ -2,13 +2,7 @@ import { ACCESS_TOKEN, AUTH_USER_ID, CLAIM_NAME, ENDPOINT } from "@/shared/confi import { type AuthPayload, type AuthService, getRemainingMs } from "@common/auth"; import { clearDeviceId, getOrCreateDeviceId } from "../lib/device-id"; -import { - clearRefreshTimer, - removeToken, - setToken, - setupRefreshTimer, - tokenManager, -} from "../lib/token-manager"; +import { clearRefreshTimer, setToken, setupRefreshTimer, tokenManager } from "../lib/token-manager"; async function login(payload: AuthPayload): Promise { const response = await fetch(`/api/proxy${ENDPOINT.USER_SERVICE.LOGIN}`, { @@ -79,8 +73,6 @@ async function silentRefresh(): Promise { async function logout(): Promise { tokenManager.clearAuthToken(); - removeToken("site-id-key"); - removeToken("site-theme-key"); clearDeviceId(); if (typeof window !== "undefined") { diff --git a/apps/as/src/entities/elapr/lib/apln-validators.ts b/apps/as/src/entities/elapr/lib/apln-validators.ts index 3ab1bcd30..91f1a95cf 100644 --- a/apps/as/src/entities/elapr/lib/apln-validators.ts +++ b/apps/as/src/entities/elapr/lib/apln-validators.ts @@ -1,6 +1,5 @@ import type { ElaprAplnRow } from "../model/elapr-apln-row-types"; -const ATRZ_RECEIVER_CD = "ATRZ01"; const ATRZ_FINAL_CD = "ATRZ99"; interface AtrzOrderValidateRow { @@ -16,14 +15,6 @@ export function getVisibleRows(rows: ElaprAplnRow[]): ElaprAplnRow[] { export function validateAtrzOrder(rows: AtrzOrderValidateRow[]): string | null { const visibleRows = rows.filter((row) => !row.isDeleted); - const receiverCount = visibleRows.filter((row) => row.atrzSeComCd === ATRZ_RECEIVER_CD).length; - if (receiverCount === 0) { - return "접수자는 반드시 등록해야 합니다."; - } - if (receiverCount > 1) { - return "접수자는 한 명만 등록할 수 있습니다."; - } - const finalCount = visibleRows.filter((row) => row.atrzSeComCd === ATRZ_FINAL_CD).length; if (finalCount === 0) { return "최종승인자는 반드시 등록해야 합니다."; @@ -32,10 +23,6 @@ export function validateAtrzOrder(rows: AtrzOrderValidateRow[]): string | null { return "최종승인자는 한 명만 등록할 수 있습니다."; } - if (receiverCount === 1 && visibleRows[0]?.atrzSeComCd !== ATRZ_RECEIVER_CD) { - return "접수자는 결재선 첫 번째에 배치해야 합니다."; - } - if (finalCount === 1) { const lastRow = visibleRows[visibleRows.length - 1]; if (lastRow?.atrzSeComCd !== ATRZ_FINAL_CD) { diff --git a/apps/as/src/entities/elapr/lib/use-prgrs-stts-rows.ts b/apps/as/src/entities/elapr/lib/use-prgrs-stts-rows.ts index 297e574a4..40120db78 100644 --- a/apps/as/src/entities/elapr/lib/use-prgrs-stts-rows.ts +++ b/apps/as/src/entities/elapr/lib/use-prgrs-stts-rows.ts @@ -24,7 +24,7 @@ function toRow(item: ElaprDocPrgrsClientResponseDto): ElaprPrgrsSttsRow { elaprPrgrsId: item.elaprPrgrsId, elaprDmndId: item.elaprDmndId, aprvrUuid: item.aprvrUuid, - aprvrNm: item.aprvrUuidNm, + aprvrNm: item.aprvrNm, atrzSeComCd: item.atrzSeComCd, atrzSeComNm: item.atrzSeComNm, atrzSeqNo: item.atrzSeqNo, diff --git a/apps/as/src/entities/elapr/model/elapr-apln-interface.ts b/apps/as/src/entities/elapr/model/elapr-apln-interface.ts index a41add2cd..31e0d8a25 100644 --- a/apps/as/src/entities/elapr/model/elapr-apln-interface.ts +++ b/apps/as/src/entities/elapr/model/elapr-apln-interface.ts @@ -6,14 +6,14 @@ export const ELAPR_APLN_SAVE_MODE = { DELETE: "D", } as const; -export type ElaprAplnSaveMode = - (typeof ELAPR_APLN_SAVE_MODE)[keyof typeof ELAPR_APLN_SAVE_MODE]; +export type ElaprAplnSaveMode = (typeof ELAPR_APLN_SAVE_MODE)[keyof typeof ELAPR_APLN_SAVE_MODE]; export interface ElaprApln { aplnId: string; elaprTmpltId: string; aprvrUuid?: string; aprvrNm?: string; + aprvrUserId?: string; atrzSeComCd?: string; atrzSeComNm?: string; atrzSeqNo?: number; diff --git a/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts b/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts index 5a3fbc689..a4eb14c7c 100644 --- a/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts +++ b/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts @@ -1,4 +1,4 @@ -import type { PageableParams, PageResponse } from "@/shared/model"; +import type { ElaprDocPrgrsClientResponseDto, PageableParams, PageResponse } from "@/shared/model"; import type { ElaprPrgrsSttsSaveRequestDto } from "./elapr-prgrs-stts-interface"; @@ -33,23 +33,7 @@ export interface ElaprDmndSearchDto extends PageableParams { } /** 백엔드 ElaprDocPrgrsResponseDto */ -export interface ElaprDocPrgrsResponseDto { - elaprDocNo: string; - elaprDmndId: string; - elaprPrgrsId: string; - atrzSeqNo?: number; - atrzSeComCd: string; - atrzSeComNm?: string; - aprvrUuid?: string; - aprvrUuidNm?: string; - atrzPrgrsSttsComCd: string; - atrzPrgrsSttsComNm?: string; - rjctRsn?: string; - atrzDt?: string; - jbpsSeNm?: string; - jbgdSeNm?: string; - ognzNm?: string; -} +export type ElaprDocPrgrsResponseDto = ElaprDocPrgrsClientResponseDto; /** Controller public 메서드명·시그니처와 동일 */ export interface ElaprDmndService { diff --git a/apps/as/src/pages/approval-line-management/model/columns.tsx b/apps/as/src/pages/approval-line-management/model/columns.tsx index a7beb668b..35dcc4a74 100644 --- a/apps/as/src/pages/approval-line-management/model/columns.tsx +++ b/apps/as/src/pages/approval-line-management/model/columns.tsx @@ -14,10 +14,6 @@ interface CreateTmpltColumnsOptions { export function createTmpltColumns({ onEdit, onDelete }: CreateTmpltColumnsOptions) { return [ - columnHelper.accessor("elaprTmpltId", { - header: "전자결재서식아이디", - meta: { align: "left" }, - }), columnHelper.accessor("elaprTmpltNm", { header: "결재서식명", meta: { align: "left" }, diff --git a/apps/as/src/pages/approval-line-management/ui/approval-line-management-page.tsx b/apps/as/src/pages/approval-line-management/ui/approval-line-management-page.tsx index 11b9373ac..38b018809 100644 --- a/apps/as/src/pages/approval-line-management/ui/approval-line-management-page.tsx +++ b/apps/as/src/pages/approval-line-management/ui/approval-line-management-page.tsx @@ -11,7 +11,7 @@ function ApprovalLineManagementPage() { const [selectedTmplt, setSelectedTmplt] = useState(null); return ( -
+
- - + - + + - 결재선아이디 결재순서 결재구분 + 결재자 ID 결재자 등록일시 관리 diff --git a/apps/as/src/pages/approval-line-management/ui/sortable-apln-row.tsx b/apps/as/src/pages/approval-line-management/ui/sortable-apln-row.tsx index 94d28be22..b0a23ee1e 100644 --- a/apps/as/src/pages/approval-line-management/ui/sortable-apln-row.tsx +++ b/apps/as/src/pages/approval-line-management/ui/sortable-apln-row.tsx @@ -4,9 +4,18 @@ import { useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { Equal } from "lucide-react"; -import { CodeSelect, findCodeLabel, useCodeList } from "@/entities/code"; +import { findCodeLabel, useCodeList } from "@/entities/code"; import type { ElaprAplnRow } from "@/entities/elapr"; -import { Button, TableCell, TableRow } from "@common/components"; +import { + Button, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + TableCell, + TableRow, +} from "@common/components"; interface SortableAplnRowProps { row: ElaprAplnRow; @@ -36,6 +45,7 @@ function SortableAplnRow({ onPickAprvr, }: SortableAplnRowProps) { const { data: atrzSeCodes } = useCodeList("ATRZSE"); + const selectableAtrzSeCodes = atrzSeCodes?.filter((code) => code.lwpoCd !== "ATRZ01"); const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: row.rowKey, @@ -49,7 +59,7 @@ function SortableAplnRow({ }; const rowDisabled = isLocked && !isEditing; - const atrzSeLabel = row.atrzSeComNm || findCodeLabel(atrzSeCodes, row.atrzSeComCd); + const atrzSeLabel = row.atrzSeComNm || findCodeLabel(selectableAtrzSeCodes, row.atrzSeComCd); return ( @@ -66,31 +76,36 @@ function SortableAplnRow({ - {row.isNew ? "-" : (row.aplnId ?? "-")} {displaySeqNo} {isEditing ? ( - - onChange({ - atrzSeComCd: v, - atrzSeComNm: findCodeLabel(atrzSeCodes, v), - }) + onChange({ atrzSeComCd: v, atrzSeComNm: findCodeLabel(selectableAtrzSeCodes, v) }) } - placeholder="결재구분" - /> + > + + + + + {selectableAtrzSeCodes?.map((code) => ( + + {code.lwpoCdNm} + + ))} + + ) : ( atrzSeLabel || "-" )} + {row.aprvrUserId ?? "-"} -
- {row.aprvrNm || row.aprvrUuid || "-"} +
+ {row.aprvrNm || row.aprvrUuid || ""} {isEditing && ( - )} diff --git a/apps/as/src/pages/instl-sncn/ui/components/elapr-apln-picker-grid.tsx b/apps/as/src/pages/instl-sncn/ui/components/elapr-apln-picker-grid.tsx index a22a2e880..6268058f0 100644 --- a/apps/as/src/pages/instl-sncn/ui/components/elapr-apln-picker-grid.tsx +++ b/apps/as/src/pages/instl-sncn/ui/components/elapr-apln-picker-grid.tsx @@ -147,16 +147,14 @@ function ElaprAplnPickerGrid({
- - - + + - 결재선아이디 결재순서 결재구분 결재자 diff --git a/apps/as/src/pages/instl-sncn/ui/components/elapr-tmplt-select-table.tsx b/apps/as/src/pages/instl-sncn/ui/components/elapr-tmplt-select-table.tsx index 50bdb33b9..cd96ebe09 100644 --- a/apps/as/src/pages/instl-sncn/ui/components/elapr-tmplt-select-table.tsx +++ b/apps/as/src/pages/instl-sncn/ui/components/elapr-tmplt-select-table.tsx @@ -35,18 +35,10 @@ function ElaprTmpltSelectTable({ const columns = useMemo( () => [ - columnHelper.accessor("elaprTmpltId", { - header: "전자결재서식아이디", - meta: { align: "left" }, - }), columnHelper.accessor("elaprTmpltNm", { header: "결재서식명", meta: { align: "left" }, }), - columnHelper.accessor("docSeComNm", { - header: "문서구분", - cell: ({ getValue, row }) => getValue() ?? row.original.docSeComCd ?? "—", - }), ], [], ); diff --git a/apps/as/src/pages/instl-sncn/ui/components/sortable-apln-picker-row.tsx b/apps/as/src/pages/instl-sncn/ui/components/sortable-apln-picker-row.tsx index 46af147ca..07a9567cc 100644 --- a/apps/as/src/pages/instl-sncn/ui/components/sortable-apln-picker-row.tsx +++ b/apps/as/src/pages/instl-sncn/ui/components/sortable-apln-picker-row.tsx @@ -4,9 +4,18 @@ import { useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { MoveVertical } from "lucide-react"; -import { CodeSelect, findCodeLabel, useCodeList } from "@/entities/code"; +import { findCodeLabel, useCodeList } from "@/entities/code"; import type { ElaprAplnRow } from "@/entities/elapr"; -import { Button, TableCell, TableRow } from "@common/components"; +import { + Button, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + TableCell, + TableRow, +} from "@common/components"; interface SortableAplnPickerRowProps { row: ElaprAplnRow; @@ -36,6 +45,7 @@ function SortableAplnPickerRow({ onPickAprvr, }: SortableAplnPickerRowProps) { const { data: atrzSeCodes } = useCodeList("ATRZSE"); + const selectableAtrzSeCodes = atrzSeCodes?.filter((code) => code.lwpoCd !== "ATRZ01"); const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: row.rowKey, @@ -66,31 +76,35 @@ function SortableAplnPickerRow({ - {row.isNew ? "-" : (row.aplnId ?? "-")} {displaySeqNo} {isEditing ? ( - - onChange({ - atrzSeComCd: v, - atrzSeComNm: findCodeLabel(atrzSeCodes, v), - }) + onChange({ atrzSeComCd: v, atrzSeComNm: findCodeLabel(selectableAtrzSeCodes, v) }) } - placeholder="결재구분" - /> + > + + + + + {selectableAtrzSeCodes?.map((code) => ( + + {code.lwpoCdNm} + + ))} + + ) : ( atrzSeLabel || "-" )} -
- {row.aprvrNm || row.aprvrUuid || "-"} +
+ {row.aprvrNm || row.aprvrUuid || ""} {isEditing && ( - )} diff --git a/apps/as/src/pages/instl-sncn/ui/components/sortable-prgrs-stts-row.tsx b/apps/as/src/pages/instl-sncn/ui/components/sortable-prgrs-stts-row.tsx index 795c9d08d..b002f558d 100644 --- a/apps/as/src/pages/instl-sncn/ui/components/sortable-prgrs-stts-row.tsx +++ b/apps/as/src/pages/instl-sncn/ui/components/sortable-prgrs-stts-row.tsx @@ -5,9 +5,19 @@ import { CSS } from "@dnd-kit/utilities"; import { MoveVertical } from "lucide-react"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/shared/ui/tooltip"; -import { CodeSelect, findCodeLabel, useCodeList } from "@/entities/code"; +import { findCodeLabel, useCodeList } from "@/entities/code"; import { type ElaprPrgrsSttsRow, isPrgrsSttsRowEditable } from "@/entities/elapr"; -import { Button, cn, TableCell, TableRow } from "@common/components"; +import { + Button, + cn, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + TableCell, + TableRow, +} from "@common/components"; import { getApproverStatus } from "../../lib/approval-utils"; @@ -39,6 +49,7 @@ function SortablePrgrsSttsRow({ onPickAprvr, }: SortablePrgrsSttsRowProps) { const { data: atrzSeCodes } = useCodeList("ATRZSE"); + const selectableAtrzSeCodes = atrzSeCodes?.filter((code) => code.lwpoCd !== "ATRZ01"); const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: row.rowKey, @@ -89,18 +100,23 @@ function SortablePrgrsSttsRow({ {displaySeqNo} {isEditing ? ( - - onChange({ - atrzSeComCd: v, - atrzSeComNm: findCodeLabel(atrzSeCodes, v), - }) + onChange({ atrzSeComCd: v, atrzSeComNm: findCodeLabel(selectableAtrzSeCodes, v) }) } - placeholder="결재구분" - /> + > + + + + + {selectableAtrzSeCodes?.map((code) => ( + + {code.lwpoCdNm} + + ))} + + ) : ( atrzSeLabel || "-" )} diff --git a/apps/as/src/shared/model/pbadms-sprt.ts b/apps/as/src/shared/model/pbadms-sprt.ts index fc0722eb2..141d655bb 100644 --- a/apps/as/src/shared/model/pbadms-sprt.ts +++ b/apps/as/src/shared/model/pbadms-sprt.ts @@ -143,7 +143,8 @@ export interface ElaprDocPrgrsClientResponseDto { atrzSeComCd?: string; atrzSeComNm?: string; aprvrUuid?: string; - aprvrUuidNm?: string; + aprvrNm?: string; + aprvrUserId?: string; atrzPrgrsSttsComCd?: string; atrzPrgrsSttsComNm?: string; rjctRsn?: string | null;