- 프로젝트 표 「종류」 열(임도설계 · 예정노선 · 안정성평가 · 사방설계 · 칸 없음 = 임도) - 단계 막대 = 종류별(ROAD B03~B09 그대로 · PLAN D02~D04 · STABILITY E02~E05) · 누름 = 그 단계 화면 - 받은 예정노선(회사관리자 · 사용자 · 받은 것 있을 때만) = 예정노선 · 연도 · 연결 상태 · 업데이트 배지 · [보기] = D02 · [연결] 자리만(531-3) - E01 [등록] 고르기 칸 setError 없음 오류 걷음(목록 비면 단추 꺼짐) - tsconfig D0* · E0* → 폴더 안까지(D0*/**/*) — 앞 판은 폴더 안 파일을 안 잡아 타입 검사가 빠졌음 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
85 lines
3.1 KiB
TypeScript
85 lines
3.1 KiB
TypeScript
import { createButton } from "@ui/ui_template_elements";
|
|
import { table, text } from "@ui/ui_template_general_blocks";
|
|
import { createStepBar } from "@ui/ui_template_workflow_layout";
|
|
import { workflowSteps } from "../A00_Common/b_page_scaffold";
|
|
import { goToWorkflowStage, WORKFLOW_STEP_ROUTES } from "../A00_Common/b_workflow_nav";
|
|
import { groupFlowOf } from "../A00_Common/group_workflow";
|
|
import type { DashboardUser, ProjectItem } from "./B01_Dashboard_Api_Fetch";
|
|
import { canDeleteProject, canEditProject } from "./B01_Dashboard_UI_Helper";
|
|
import { openDeleteProjectModal, openEditProjectModal } from "./B01_Dashboard_UI_Modals";
|
|
import { DASHBOARD_VISIBLE_ROWS, formatDate, L } from "./B01_Dashboard_UI_Common";
|
|
|
|
/** 종류 열 글(528-2) — 칸이 없는 옛 응답 = 임도 */
|
|
const KIND_LABEL = {
|
|
ROAD: "DE_New_Road",
|
|
PLAN: "DE_New_Plan",
|
|
STABILITY: "DE_New_Stability",
|
|
EROSION: "DE_New_Erosion",
|
|
} as const;
|
|
const kindText = (project: ProjectItem): string =>
|
|
L(KIND_LABEL[(project.project_kind ?? "ROAD") as keyof typeof KIND_LABEL] ?? "DE_New_Road");
|
|
|
|
export function projectTable(projects: ProjectItem[], currentUser: DashboardUser): HTMLElement {
|
|
return table(
|
|
[
|
|
L("B01_Dashboard_Table_Project"),
|
|
L("DE_Kind_Column"),
|
|
L("B01_Dashboard_Table_Region"),
|
|
// 진행도(%) 열은 없앴다 (2026-09-06 사용자 지시) — 워크플로 배지가 같은 것을 보여 준다.
|
|
L("B01_Dashboard_Table_Workflow"),
|
|
L("B01_Dashboard_Table_Updated"),
|
|
L("B01_Dashboard_Table_Action"),
|
|
],
|
|
projects.map((project) => {
|
|
const actCell = document.createElement("div");
|
|
actCell.className = "b01-dashboard__actions";
|
|
|
|
if (canEditProject(currentUser, project)) {
|
|
actCell.append(
|
|
createButton({
|
|
label: L("Common_Btn_Edit"),
|
|
variant: "ghost",
|
|
onClick: () => openEditProjectModal(currentUser, project),
|
|
}),
|
|
);
|
|
}
|
|
if (canDeleteProject(currentUser)) {
|
|
actCell.append(
|
|
createButton({
|
|
label: L("Common_Btn_Delete"),
|
|
variant: "danger",
|
|
onClick: () => openDeleteProjectModal(currentUser, project),
|
|
}),
|
|
);
|
|
}
|
|
|
|
return [
|
|
text(project.name),
|
|
text(kindText(project)),
|
|
text(project.region),
|
|
workflow(project),
|
|
text(formatDate(project.updated_at)),
|
|
actCell,
|
|
];
|
|
}),
|
|
DASHBOARD_VISIBLE_ROWS,
|
|
);
|
|
}
|
|
|
|
/** 단계 막대 — 종류별 단계(ROAD = B03~B09 · PLAN = D02~D04 · STABILITY = E02~E05) · 누름 = 그 단계 화면 */
|
|
export function workflow(project: ProjectItem): HTMLElement {
|
|
const group = groupFlowOf(project.project_kind);
|
|
const routes = group?.routes ?? WORKFLOW_STEP_ROUTES;
|
|
return createStepBar(
|
|
group?.steps ?? workflowSteps(),
|
|
project.workflow_state?.current_stage ?? project.workflow_stage,
|
|
{
|
|
stages: project.workflow_state?.stages,
|
|
currentStage: project.workflow_state?.current_stage,
|
|
routes,
|
|
compact: true,
|
|
onStepClick: (stepIndex) => goToWorkflowStage(project.id, routes[stepIndex]),
|
|
},
|
|
);
|
|
}
|