diff --git a/sail.js b/sail.js index 80448e7..224fae2 100644 --- a/sail.js +++ b/sail.js @@ -1,46 +1,52 @@ -function startReloadUI() { - const div = document.createElement("div") - div.className = "msgbox-overlay" - div.style.opacity = 1 - div.style.textAlign = "center" - div.innerHTML = `
-
Reloading container
-
` - document.querySelector(".monaco-workbench").appendChild(div) -} - -function removeElementsByClass(className) { - let elements = document.getElementsByClassName(className); - for (let e of elements) { - e.parentNode.removeChild(e) +(function() { + function startReloadUI() { + const div = document.createElement("div") + div.className = "msgbox-overlay" + div.style.opacity = 1 + div.style.textAlign = "center" + div.innerHTML = `
+
Rebuilding container
+
` + // Prevent keypresses. + document.body.onkeydown = ev => { + ev.stopPropagation() + } + document.querySelector(".monaco-workbench").appendChild(div) + } + + function removeElementsByClass(className) { + let elements = document.getElementsByClassName(className); + for (let e of elements) { + e.parentNode.removeChild(e) + } } -} -function stopReloadUI() { - removeElementsByClass("msgbox-overlay") -} + function stopReloadUI() { + removeElementsByClass("msgbox-overlay") + } -let tty -window.addEventListener("ide-ready", () => { - window.ide.workbench.onFileSaved((ev) => { - if (!ev.endsWith(".sail/Dockerfile")) { + let tty + let rebuilding + function rebuild() { + if (rebuilding) { return } + rebuilding = true - const srv = window.ide.workbench.terminalService + const tsrv = window.ide.workbench.terminalService if (tty == null) { - tty = srv.createTerminal({ + tty = tsrv.createTerminal({ name: "sail", isRendererOnly: true, }, false) } else { tty.clear() } - let oldTTY = srv.getActiveInstance() - srv.setActiveInstance(tty) + let oldTTY = tsrv.getActiveInstance() + tsrv.setActiveInstance(tty) // Show the panel and focus it to prevent the user from editing the Dockerfile. - srv.showPanel(true) + tsrv.showPanel(true) startReloadUI() @@ -52,11 +58,31 @@ window.addEventListener("ide-ready", () => { } ws.onclose = (ev) => { if (ev.code === 1000) { - srv.setActiveInstance(oldTTY) + tsrv.setActiveInstance(oldTTY) } else { alert("reload failed; please see logs in sail terminal") } stopReloadUI() + rebuilding = false } + } + + window.addEventListener("ide-ready", () => { + class rebuildAction extends window.ide.workbench.action { + run() { + rebuild() + } + } + + window.ide.workbench.actionsRegistry.registerWorkbenchAction(new window.ide.workbench.syncActionDescriptor(rebuildAction, "sail.rebuild", "Rebuild container", { + primary: ((1 << 11) >>> 0) | 48 // That's cmd + R. See vscode source for the magic numbers. + }), "sail: Rebuild container", "sail"); + + const statusBarService = window.ide.workbench.statusbarService + statusBarService.addEntry({ + text: "rebuild", + tooltip: "Rebuild sail container", + command: "sail.rebuild" + }, 0) }) -}) +}()) diff --git a/sail.js.go b/sail.js.go index b63dc92..10c30e1 100644 --- a/sail.js.go +++ b/sail.js.go @@ -1,4 +1,4 @@ package main //go:generate go run sail.js_gen.go -const sailJS = "function startReloadUI() {\n const div = document.createElement(\"div\")\n div.className = \"msgbox-overlay\"\n div.style.opacity = 1\n div.style.textAlign = \"center\"\n div.innerHTML = `
\n
Reloading container
\n
`\n document.querySelector(\".monaco-workbench\").appendChild(div)\n}\n\nfunction removeElementsByClass(className) {\n let elements = document.getElementsByClassName(className);\n for (let e of elements) {\n e.parentNode.removeChild(e)\n }\n}\n\nfunction stopReloadUI() {\n removeElementsByClass(\"msgbox-overlay\")\n}\n\nlet tty\nwindow.addEventListener(\"ide-ready\", () => {\n window.ide.workbench.onFileSaved((ev) => {\n if (!ev.endsWith(\".sail/Dockerfile\")) {\n return\n }\n\n const srv = window.ide.workbench.terminalService\n\n if (tty == null) {\n tty = srv.createTerminal({\n name: \"sail\",\n isRendererOnly: true,\n }, false)\n } else {\n tty.clear()\n }\n let oldTTY = srv.getActiveInstance()\n srv.setActiveInstance(tty)\n // Show the panel and focus it to prevent the user from editing the Dockerfile.\n srv.showPanel(true)\n\n startReloadUI()\n\n const ws = new WebSocket(\"ws://\" + location.host + \"/sail/api/v1/reload\")\n ws.onmessage = (ev) => {\n const msg = JSON.parse(ev.data)\n const out = atob(msg.v).replace(/\\n/g, \"\\n\\r\")\n tty.write(out)\n }\n ws.onclose = (ev) => {\n if (ev.code === 1000) {\n srv.setActiveInstance(oldTTY)\n } else {\n alert(\"reload failed; please see logs in sail terminal\")\n }\n stopReloadUI()\n }\n })\n})\n" +const sailJS = "(function() {\n function startReloadUI() {\n const div = document.createElement(\"div\")\n div.className = \"msgbox-overlay\"\n div.style.opacity = 1\n div.style.textAlign = \"center\"\n div.innerHTML = `
\n
Rebuilding container
\n
`\n // Prevent keypresses.\n document.body.onkeydown = ev => {\n ev.stopPropagation()\n }\n document.querySelector(\".monaco-workbench\").appendChild(div)\n }\n\n function removeElementsByClass(className) {\n let elements = document.getElementsByClassName(className);\n for (let e of elements) {\n e.parentNode.removeChild(e)\n }\n }\n\n function stopReloadUI() {\n removeElementsByClass(\"msgbox-overlay\")\n }\n\n let tty\n let rebuilding\n function rebuild() {\n if (rebuilding) {\n return\n }\n rebuilding = true\n\n const tsrv = window.ide.workbench.terminalService\n\n if (tty == null) {\n tty = tsrv.createTerminal({\n name: \"sail\",\n isRendererOnly: true,\n }, false)\n } else {\n tty.clear()\n }\n let oldTTY = tsrv.getActiveInstance()\n tsrv.setActiveInstance(tty)\n // Show the panel and focus it to prevent the user from editing the Dockerfile.\n tsrv.showPanel(true)\n\n startReloadUI()\n\n const ws = new WebSocket(\"ws://\" + location.host + \"/sail/api/v1/reload\")\n ws.onmessage = (ev) => {\n const msg = JSON.parse(ev.data)\n const out = atob(msg.v).replace(/\\n/g, \"\\n\\r\")\n tty.write(out)\n }\n ws.onclose = (ev) => {\n if (ev.code === 1000) {\n tsrv.setActiveInstance(oldTTY)\n } else {\n alert(\"reload failed; please see logs in sail terminal\")\n }\n stopReloadUI()\n rebuilding = false\n }\n }\n\n window.addEventListener(\"ide-ready\", () => {\n class rebuildAction extends window.ide.workbench.action {\n run() {\n rebuild()\n }\n }\n\n window.ide.workbench.actionsRegistry.registerWorkbenchAction(new window.ide.workbench.syncActionDescriptor(rebuildAction, \"sail.rebuild\", \"Rebuild container\", {\n primary: ((1 << 11) >>> 0) | 48 // That's cmd + R. See vscode source for the magic numbers.\n }), \"sail: Rebuild container\", \"sail\");\n\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"Rebuild sail container\",\n command: \"sail.rebuild\"\n }, 0)\n })\n}())\n"