69 lines
2.3 KiB
TypeScript
69 lines
2.3 KiB
TypeScript
// The spawn modal (issue #27): bottom-sheet/dialog chrome around the shared
|
|
// spawn form (spawnForm.ts). The modal coexists with the inline draft panes
|
|
// (#57) until a later issue deletes it.
|
|
|
|
import { createSpawnForm, type SpawnFormSeed } from "./spawnForm.js";
|
|
|
|
/** Seed values for the spawn form — used by "clone" to reopen the dialog with
|
|
* the same cwd, command, and name as an existing session. */
|
|
export type SpawnPrefill = SpawnFormSeed;
|
|
|
|
export function openSpawnModal(prefill?: SpawnPrefill): void {
|
|
const existing = document.getElementById("modal-host");
|
|
if (existing) existing.remove();
|
|
|
|
const host = document.createElement("div");
|
|
host.id = "modal-host";
|
|
host.className = "modal-backdrop";
|
|
host.innerHTML = `
|
|
<div class="modal spawn-modal" role="dialog" aria-modal="true" aria-labelledby="spawn-title">
|
|
<header class="modal-header">
|
|
<h2 id="spawn-title">Spawn session</h2>
|
|
<button type="button" class="btn btn-icon close" aria-label="Close">✕</button>
|
|
</header>
|
|
<div class="form-slot"></div>
|
|
</div>
|
|
`;
|
|
document.body.appendChild(host);
|
|
|
|
const formHandle = createSpawnForm({
|
|
seed: prefill,
|
|
class: "modal-body",
|
|
onSuccess(session) {
|
|
close();
|
|
location.hash = `#/attach/${encodeURIComponent(session.id)}`;
|
|
},
|
|
});
|
|
(host.querySelector(".form-slot") as HTMLElement).replaceWith(formHandle.el);
|
|
|
|
const close = () => {
|
|
formHandle.destroy();
|
|
host.remove();
|
|
};
|
|
// The modal keeps its Cancel affordance; the shared form ships only Submit.
|
|
const actions = formHandle.el.querySelector(".form-actions") as HTMLElement;
|
|
const cancel = document.createElement("button");
|
|
cancel.type = "button";
|
|
cancel.className = "btn btn-ghost cancel";
|
|
cancel.textContent = "Cancel";
|
|
cancel.addEventListener("click", close);
|
|
actions.prepend(cancel);
|
|
|
|
host.querySelector(".close")?.addEventListener("click", close);
|
|
host.addEventListener("click", (e) => {
|
|
if (e.target === host) close();
|
|
});
|
|
window.addEventListener(
|
|
"keydown",
|
|
(e) => {
|
|
if (e.key === "Escape") close();
|
|
},
|
|
{ once: true },
|
|
);
|
|
|
|
// ---- clone seed ------------------------------------------------------
|
|
if (prefill) {
|
|
(host.querySelector("#spawn-title") as HTMLElement).textContent = "Clone session";
|
|
}
|
|
}
|