/* ============================================================================= * M02_MasterTemplete_TreePanel_CopyTo.ts * 「〇〇로 복사…」(39-6) — 붙일 층의 나무를 읽어 대상 폴더를 고름(맨 위 · 폴더) → 경로 · 취소 = null. * 아직 만든 것이 없는 남의 층(404)은 맨 위만 — 첫 쓰기 때 서버가 소속을 보고 뼈대를 세움. * `copyToLayer` = 고름 → 붙여넣기 → 알림(구조물 조합 나무 `TreePanel` 에서 뗌 · 720-2). * ========================================================================== */ import { showToast } from "@ui/ui_template_elements"; import { t as L } from "@ui/ui_template_locale"; import type { Layer, TreeClip, TreeView } from "./M02_MasterTemplete_Api_Fetch"; import { askFolder } from "./M02_MasterTemplete_TreePanel_Dialogs"; import { buildFolders, listFolders } from "./M02_MasterTemplete_TreePanel_Model"; export interface CopyTarget { layer: Layer; owner: string | null; /** 메뉴 글 — `{n}` = 개수 */ label: string; } export async function askCopyFolder( fetchTree: (layer: Layer, owner: string | null) => Promise, to: CopyTarget, n: number, ): Promise { const view = await fetchTree(to.layer, to.owner).catch(() => null); const folders = view ? listFolders(buildFolders(view)) : []; const title = to.label.replace("{n}", String(n)); return askFolder(title, folders, () => false, [], L("M02_TreeCopyFolder")); } /** 「〇〇로 복사…」 — 그 층 폴더를 고름(`askCopyFolder`) → 새 키 · 같은 이름 「(2)」 · 부른 나무는 그대로 */ export async function copyToLayer( api: { fetch: (layer: Layer, owner: string | null) => Promise; paste: ( layer: Layer, owner: string | null, clip: TreeClip, dest: string[], ) => Promise; }, clip: TreeClip, to: CopyTarget, ): Promise { const n = String(clip.refs.length); try { const dest = await askCopyFolder(api.fetch, to, clip.refs.length); if (!dest) return; await api.paste(to.layer, to.owner, clip, dest); const where = to.label.replace(/ ?\(.*$/, "").replace(/(으로|로) 복사…?$/, ""); showToast( L("M02_TreeCopiedTo") .replace("{n}", n) .replace("{layer}", where) .replace("{folder}", dest.join(" / ") || L("M02_TreeTop")), "success", ); } catch (error) { showToast( L("M02_ActionFailed").replace("{value}", error instanceof Error ? error.message : ""), "error", ); } }