/* ============================================================================= * spreadsheet_link_ask.ts (주인 D) * 같은 칸에 이미 다른 알약 — [함께 잇기](기본 · Enter) · [바꾸기] · [취소](Esc) 물음(40 마무리). * 알약 누름 · 끌어 놓기(`spreadsheet_links`) · M02 칸 지정 모달 · 엑셀 칸 고르기가 같이 씀 · * 모양은 공용 확인창(`ui-confirm`) 그대로. * ========================================================================== */ import { createButton, el } from "@ui/ui_template_elements"; const TEXT = { ask: "{cell} 칸에 이미 {names} — 이 알약도 함께 이을까?", together: "함께 잇기", replace: "바꾸기", cancel: "취소", }; /** 「함께」 = 그 칸 다른 알약 그대로 · 「바꾸기」 = 다른 알약을 뺌 · null = 그만둠 */ export type ShareChoice = "함께" | "바꾸기" | null; export function askShare(cell: string, names: string[]): Promise { return new Promise((resolve) => { const overlay = el("div", { className: "ui-confirm" }); const back = document.activeElement as HTMLElement | null; // 닫힐 때 초점을 돌려놓을 자리 const done = (choice: ShareChoice): void => { overlay.remove(); if (back?.isConnected && back !== document.body) back.focus({ preventScroll: true }); resolve(choice); }; const together = createButton({ label: TEXT.together, variant: "filled", onClick: () => done("함께"), }); overlay.addEventListener("keydown", (ev) => { if (ev.key !== "Escape") return; ev.stopPropagation(); // 뒤 창 · 페이지 Esc 까지 닫지 않음 done(null); }); const message = TEXT.ask .replace("{cell}", cell) .replace("{names}", names.map((n) => `「${n}」`).join(" · ")); overlay.append( el("div", { className: "ui-confirm__panel", children: [ el("p", { className: "ui-confirm__message", text: message }), el("div", { className: "ui-confirm__actions", children: [ createButton({ label: TEXT.cancel, variant: "ghost", onClick: () => done(null) }), createButton({ label: TEXT.replace, variant: "ghost", onClick: () => done("바꾸기"), }), together, ], }), ], }), ); document.body.append(overlay); together.focus(); // Enter = 함께 잇기(기본) }); }