- 구조물 조합 나무 「〇〇로 복사…」 몸을 TreePanel_CopyTo 로 뗌(TreePanel 700 → 688 줄 · 동작 같음) - 낡은 시험 test_m02_layer_screen(복사 대상 글 자리 = CopyTo) · test_m02_precombo_scope(층 줄 add 인자) 새 꼴로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
/* =============================================================================
|
|
* 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<TreeView>,
|
|
to: CopyTarget,
|
|
n: number,
|
|
): Promise<string[] | null> {
|
|
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<TreeView>;
|
|
paste: (
|
|
layer: Layer,
|
|
owner: string | null,
|
|
clip: TreeClip,
|
|
dest: string[],
|
|
) => Promise<TreeView>;
|
|
},
|
|
clip: TreeClip,
|
|
to: CopyTarget,
|
|
): Promise<void> {
|
|
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",
|
|
);
|
|
}
|
|
}
|