Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W4uKaV4ZBhsJN4GHG7yRj4
66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
/* =============================================================================
|
|
* 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<ShareChoice> {
|
|
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 = 함께 잇기(기본)
|
|
});
|
|
}
|