feat(m02): 일위대가 사전조합 나무 = 자유 폴더 — 분류 고정 폴더 걷어 냄(158-1)

- 서버: 층 뿌리 precombo_폴더.json 에 폴더 · 문서 자리만 적음(문서 파일 제자리) · GET/POST /layers/{층}/precombo-tree · 새 폴더 · 이름 바꾸기 · 옮기기 · 지우기(빈 폴더만) · 판 409 · 층 권한 그대로
- 화면: 오른쪽 클릭 [새 폴더] · [여기에 새 사전조합] · [이름 바꾸기] · [지우기] · 빈 자리 = 뿌리 메뉴 · 끌어 옮기기(구조물 조합 부품) · 자리 없는 문서 = 뿌리
- 구분 · 상세구분은 문서 칸 그대로(고르기 창 거름 precomboClasses)
- 시험: test_m02_precombo_folders 새로 · test_m02_precombo_scope 나무 시험 갈음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SE9MxeXTu2uaDZ55BJowAY
This commit is contained in:
2026-10-09 21:30:49 +09:00
co-authored by Claude Opus 5.5
parent c08d321af4
commit 064d9ebae7
8 changed files with 587 additions and 161 deletions
@@ -159,6 +159,27 @@ export const newLibrary = (
body: JSON.stringify(body),
});
/** 사전조합 나무 자유 폴더(158-1) — 자리 없는 문서 = 뿌리 · 판이 다르면 409(`StaleError`) */
export interface PrecomboTree {
판: string;
폴더: string[][];
자리: Record<string, string[]>;
}
export const fetchPrecomboTree = (layer: Layer, owner: string | null): Promise<PrecomboTree> =>
call(owned(layer, `/layers/${layer}/precombo-tree`, owner));
export const editPrecomboTree = (
layer: Layer,
edit: Pick<TreeEdit, "경로" | "이름" | "새경로" | "키"> & {
op: "add-folder" | "rename" | "move" | "delete";
},
판: string,
owner: string | null,
): Promise<PrecomboTree> =>
call(owned(layer, `/layers/${layer}/precombo-tree`, owner), {
method: "POST",
body: JSON.stringify({ ...edit, 판 }),
});
/* --- 구조물 도면(종류 structure · 이름 = 구조물집계표 열 id) ---
* 읽기 · 저장 · 지우기는 위 readTemplate · saveTemplate · deleteTemplate 에 "structure" */