- D02 걷음 — 길 · 단계(PLAN 단계 둘 = 노선 분석 · 확정) · [>] · 대시보드 단계 점 · 서버 길 · 폴더 만들기 · 캐시 등록 · 글 · 가이드 폴더 - 등록 [등록] · 받은 예정노선 [보기] = D03 으로 곧바로 - D03 지점 = 긋기에 붙는 점 · 목록 칸(여섯 색 · 「지점 N」 · 🗑) · 핀 끌기 = 그 자리 노선 노드 같이 · [저장] 몸에 실음 · [초기화] = 선만 지우고 지점 남김 - 지도 우클릭 메뉴(부품 상자) — 여기서 긋기 시작(빈 땅 = 새 본선) · 갈래 시작 · 이어 긋기 · 지점 놓기 · 지점 지우기 · 긋기 끝 - 받기 — 처음 = 등록 기준점 둘레 ± 1 km(지점 · 선 없을 때) · 지점 · 선 · 지도 보기 가운데가 받은 범위 밖이면 조용히 이어 받음(단추 · 막는 창 걷음 · 실패만 [다시 받기]) - 좌표계 = 파일 머리 · 없으면 기준점 경도 TM 띠 - 시험: 529_3(D02 지점 API) 지움 → 591_2 로 갈음 · 280_2 · 528 · 530_2 · 547_1 · 548 · 553_4 · 556_2 · 560_4 · 401 · 54_2 = D02 단계 · 페이지 걷음에 맞춤 · 590_1 · 530_2_analyze = 사업연도 · 기준점 한 번에 읽음 · 591_1 D04 씨앗 시험 = 590-1 이 씨앗 줄 걷음에 맞춤 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
/* =============================================================================
|
|
* B01_Dashboard_UI_View_Assigned.ts
|
|
* 세부 페이지 「받은 예정노선」(549-1) — 산림청이 우리 회사에 지정한 예정노선 연도 표.
|
|
* 0 건이어도 메뉴 · 페이지 보임 · 줄 끝 ⋯ = 보기(D03) · 연결(모달)
|
|
* ========================================================================== */
|
|
|
|
import { ROUTES } from "@config/config_frontend";
|
|
import { goToWorkflowStage } from "../A00_Common/b_workflow_nav";
|
|
import { kstText } from "../common_util/common_util_time_kst";
|
|
import { fetchAssignedPlans, type AssignedPlan } from "./B01_Dashboard_UI_AssignedPlans";
|
|
import { L } from "./B01_Dashboard_UI_Common";
|
|
import {
|
|
badge,
|
|
dataTable,
|
|
emptyState,
|
|
nameCell,
|
|
pageFrame,
|
|
rowMenu,
|
|
type Cell,
|
|
type Column,
|
|
} from "./B01_Dashboard_UI_PageKit";
|
|
import { openPlanLinkModal } from "./B01_Dashboard_UI_PlanLink";
|
|
import type { ViewCtx } from "./B01_Dashboard_UI_Views";
|
|
|
|
const COLUMNS: Column[] = [
|
|
{ label: L("DE_New_Plan") },
|
|
{ label: L("DE_Assigned_Year"), width: "220px" },
|
|
{ label: L("D04_Col_Confirmed"), width: "150px" },
|
|
{ label: L("DE_Assigned_State"), width: "220px" },
|
|
{ label: "", width: "44px" },
|
|
];
|
|
|
|
function stateCell(plan: AssignedPlan): HTMLElement {
|
|
const cell = document.createElement("span");
|
|
cell.className = "b01-pg-inline";
|
|
cell.append(
|
|
plan.linked_project_id
|
|
? badge(L("DE_Assigned_Linked"), "success")
|
|
: badge(L("DE_Assigned_Unlinked"), "neutral"),
|
|
);
|
|
if (plan.update_available) cell.append(badge(L("DE_Assigned_Update"), "warning"));
|
|
return cell;
|
|
}
|
|
|
|
function planRow(plan: AssignedPlan): Cell[] {
|
|
const view = (): void => void goToWorkflowStage(plan.project_id, ROUTES.D03_PLAN_ANALYSIS);
|
|
return [
|
|
nameCell(plan.project_name),
|
|
plan.piece_label ? `${plan.year} · ${plan.piece_label}` : String(plan.year),
|
|
kstText(plan.confirmed_at),
|
|
stateCell(plan),
|
|
rowMenu([
|
|
{ label: L("DE_Assigned_View"), onClick: view },
|
|
{
|
|
label: L("DE_Assigned_Link"),
|
|
onClick: () =>
|
|
void openPlanLinkModal(
|
|
plan.assignee_id,
|
|
[plan.project_name, plan.year, plan.piece_label].filter(Boolean).join(" "),
|
|
),
|
|
},
|
|
]),
|
|
];
|
|
}
|
|
|
|
export async function mountAssigned(host: HTMLElement, ctx: ViewCtx): Promise<void> {
|
|
const page = pageFrame(
|
|
host,
|
|
L("DE_Assigned_Title"),
|
|
"산림청이 지정한 예정노선이 여기 모임 · 연결하면 임도 설계가 그 노선으로 시작됨",
|
|
);
|
|
const plans = await fetchAssignedPlans().catch(() => []);
|
|
if (!host.isConnected) return;
|
|
page.body.append(
|
|
plans.length
|
|
? dataTable(COLUMNS, plans.map(planRow))
|
|
: emptyState({
|
|
icon: "route",
|
|
text: "아직 받은 예정노선이 없음",
|
|
hint: "산림청이 우리 회사에 예정노선을 지정하면 여기에 나타남",
|
|
onGuide: () => ctx.go("guide"),
|
|
}),
|
|
);
|
|
}
|