-
- setFinalApprovalYn(checked === true)}
- />
-
-
diff --git a/apps/as/src/entities/elapr/ui/elapr-doc-prgrs-status.tsx b/apps/as/src/entities/elapr/ui/elapr-doc-prgrs-status.tsx
new file mode 100644
index 000000000..731e39a07
--- /dev/null
+++ b/apps/as/src/entities/elapr/ui/elapr-doc-prgrs-status.tsx
@@ -0,0 +1,95 @@
+"use client";
+
+import { Fragment } from "react";
+
+import { ChevronRight } from "lucide-react";
+
+import type { ElaprDocPrgrsClientResponseDto } from "@/shared/model";
+import { Tooltip, TooltipContent, TooltipTrigger } from "@/shared/ui/tooltip";
+import { cn, Skeleton } from "@common/components";
+
+import { useElaprDocPrgrsByDocNo } from "../api/queries";
+import { getApproverStatus, sortByAtrzSeqNo } from "../lib/approval-utils";
+
+const REJECT_STATUS_CD = "ATRZ_PRGRS_004";
+
+interface ElaprDocPrgrsStatusProps {
+ elaprDocNo: string | null | undefined;
+}
+
+function ElaprDocPrgrsStep({ item }: { item: ElaprDocPrgrsClientResponseDto }) {
+ const status = getApproverStatus(item.atrzPrgrsSttsComCd);
+ const isRejected = item.atrzPrgrsSttsComCd === REJECT_STATUS_CD;
+ const rjctRsn = item.rjctRsn?.trim();
+ const metaParts = [item.ognzNm, item.jbpsSeNm].filter(Boolean);
+
+ const statusBadge = (
+
+ {status.label}
+
+ );
+
+ return (
+
+ {isRejected && rjctRsn ? (
+
+ {statusBadge}
+
+ {rjctRsn}
+
+
+ ) : (
+ statusBadge
+ )}
+
+
+ [{item.atrzSeComNm || "-"}]
+ {item.aprvrNm || item.aprvrUuid || "-"}
+
+ {metaParts.length > 0 && (
+
{metaParts.join(" · ")}
+ )}
+
+
+ );
+}
+
+function ElaprDocPrgrsStatus({ elaprDocNo }: ElaprDocPrgrsStatusProps) {
+ const { data, isLoading } = useElaprDocPrgrsByDocNo(elaprDocNo);
+ const steps = sortByAtrzSeqNo(data ?? []);
+
+ if (isLoading) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ if (steps.length === 0) {
+ return
결재 정보가 없습니다.
;
+ }
+
+ return (
+
+ {steps.map((item, index) => (
+
+
+ {index > 0 && }
+
+
+
+ ))}
+
+ );
+}
+
+export { ElaprDocPrgrsStatus };
diff --git a/apps/as/src/pages/instl-sncn/ui/components/sortable-prgrs-stts-row.tsx b/apps/as/src/entities/elapr/ui/sortable-prgrs-stts-row.tsx
similarity index 87%
rename from apps/as/src/pages/instl-sncn/ui/components/sortable-prgrs-stts-row.tsx
rename to apps/as/src/entities/elapr/ui/sortable-prgrs-stts-row.tsx
index b002f558d..601d272f2 100644
--- a/apps/as/src/pages/instl-sncn/ui/components/sortable-prgrs-stts-row.tsx
+++ b/apps/as/src/entities/elapr/ui/sortable-prgrs-stts-row.tsx
@@ -6,9 +6,9 @@ import { MoveVertical } from "lucide-react";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/shared/ui/tooltip";
import { findCodeLabel, useCodeList } from "@/entities/code";
-import { type ElaprPrgrsSttsRow, isPrgrsSttsRowEditable } from "@/entities/elapr";
import {
Button,
+ Checkbox,
cn,
Select,
SelectContent,
@@ -19,7 +19,12 @@ import {
TableRow,
} from "@common/components";
-import { getApproverStatus } from "../../lib/approval-utils";
+import { getApproverStatus } from "../lib/approval-utils";
+import {
+ type ElaprPrgrsSttsRow,
+ isPrgrsSttsRowDcarbable,
+ isPrgrsSttsRowEditable,
+} from "../lib/prgrs-stts-save-utils";
interface SortablePrgrsSttsRowProps {
row: ElaprPrgrsSttsRow;
@@ -33,6 +38,7 @@ interface SortablePrgrsSttsRowProps {
onDelete: () => void;
onChange: (patch: Partial
) => void;
onPickAprvr: () => void;
+ onToggleDcarb: (checked: boolean) => void;
}
function SortablePrgrsSttsRow({
@@ -47,6 +53,7 @@ function SortablePrgrsSttsRow({
onDelete,
onChange,
onPickAprvr,
+ onToggleDcarb,
}: SortablePrgrsSttsRowProps) {
const { data: atrzSeCodes } = useCodeList("ATRZSE");
const selectableAtrzSeCodes = atrzSeCodes?.filter((code) => code.lwpoCd !== "ATRZ01");
@@ -63,6 +70,7 @@ function SortablePrgrsSttsRow({
};
const isEditable = isPrgrsSttsRowEditable(row);
+ const isDcarbable = isPrgrsSttsRowDcarbable(row);
const rowDisabled = isLocked && !isEditing;
const atrzSeLabel = row.atrzSeComNm || findCodeLabel(atrzSeCodes, row.atrzSeComCd);
const status = getApproverStatus(row.atrzPrgrsSttsComCd);
@@ -139,6 +147,15 @@ function SortablePrgrsSttsRow({
)}
+