From 8aa7b57a52481afc97adb3164c84993cabe1c539 Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Sun, 19 May 2019 20:25:00 -0400 Subject: [PATCH 1/4] Add rebuild button and command --- sail.js | 84 +++++++++++++++++++++++++++++++++--------------------- sail.js.go | 2 +- 2 files changed, 52 insertions(+), 34 deletions(-) diff --git a/sail.js b/sail.js index 80448e7..d2d2636 100644 --- a/sail.js +++ b/sail.js @@ -20,43 +20,61 @@ function stopReloadUI() { removeElementsByClass("msgbox-overlay") } -let tty -window.addEventListener("ide-ready", () => { - window.ide.workbench.onFileSaved((ev) => { - if (!ev.endsWith(".sail/Dockerfile")) { - return - } +function rebuild() { + const tsrv = window.ide.workbench.terminalService - const srv = window.ide.workbench.terminalService + if (tty == null) { + tty = tsrv.createTerminal({ + name: "sail", + isRendererOnly: true, + }, false) + } else { + tty.clear() + } + let oldTTY = tsrv.getActiveInstance() + tsrv.setActiveInstance(tty) + // Show the panel and focus it to prevent the user from editing the Dockerfile. + tsrv.showPanel(true) - if (tty == null) { - tty = srv.createTerminal({ - name: "sail", - isRendererOnly: true, - }, false) + startReloadUI() + + const ws = new WebSocket("ws://" + location.host + "/sail/api/v1/reload") + ws.onmessage = (ev) => { + const msg = JSON.parse(ev.data) + const out = atob(msg.v).replace(/\n/g, "\n\r") + tty.write(out) + } + ws.onclose = (ev) => { + if (ev.code === 1000) { + tsrv.setActiveInstance(oldTTY) } else { - tty.clear() - } - let oldTTY = srv.getActiveInstance() - srv.setActiveInstance(tty) - // Show the panel and focus it to prevent the user from editing the Dockerfile. - srv.showPanel(true) - - startReloadUI() - - const ws = new WebSocket("ws://" + location.host + "/sail/api/v1/reload") - ws.onmessage = (ev) => { - const msg = JSON.parse(ev.data) - const out = atob(msg.v).replace(/\n/g, "\n\r") - tty.write(out) + alert("reload failed; please see logs in sail terminal") } - ws.onclose = (ev) => { - if (ev.code === 1000) { - srv.setActiveInstance(oldTTY) - } else { - alert("reload failed; please see logs in sail terminal") - } - stopReloadUI() + stopReloadUI() + } +} + +let tty +window.addEventListener("ide-ready", () => { + const statusBarService = window.ide.workbench.statusbarService + statusBarService.addEntry({ + text: "rebuild", + tooltip: "press super+alt+r to rebuild", + command: "rebuild-sail-container" + // showBeak: true <- what does this do? + }, 0) + + const commandRegistry = window.ide.workbench.commandRegistry + commandRegistry.registerCommand({ + id: "rebuild-sail-container", + handler: (accessor, args) => { + rebuild() + }, + description: { + description: "Rebuild sail container", + args: [] } }) + + const }) diff --git a/sail.js.go b/sail.js.go index b63dc92..0a852d9 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 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\nfunction rebuild() {\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 }\n}\n\nlet tty\nwindow.addEventListener(\"ide-ready\", () => {\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"press super+alt+r to rebuild\",\n command: \"rebuild-sail-container\"\n // showBeak: true <- what does this do?\n }, 0)\n\n const commandRegistry = window.ide.workbench.commandRegistry\n commandRegistry.registerCommand({\n id: \"rebuild-sail-container\",\n handler: (accessor, args) => {\n rebuild()\n },\n description: {\n description: \"Rebuild sail container\",\n args: []\n }\n })\n})\n" From 8f5e2fe6a0fbb79fe770ddb74be7620ee57683ae Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Sun, 19 May 2019 20:27:40 -0400 Subject: [PATCH 2/4] Move all javascript into function scope --- sail.js | 135 ++++++++++++++++++++++++++--------------------------- sail.js.go | 2 +- 2 files changed, 68 insertions(+), 69 deletions(-) diff --git a/sail.js b/sail.js index d2d2636..b066463 100644 --- a/sail.js +++ b/sail.js @@ -1,80 +1,79 @@ -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 = `
+
Reloading container
+
` + document.querySelector(".monaco-workbench").appendChild(div) } -} - -function stopReloadUI() { - removeElementsByClass("msgbox-overlay") -} -function rebuild() { - const tsrv = window.ide.workbench.terminalService + function removeElementsByClass(className) { + let elements = document.getElementsByClassName(className); + for (let e of elements) { + e.parentNode.removeChild(e) + } + } - if (tty == null) { - tty = tsrv.createTerminal({ - name: "sail", - isRendererOnly: true, - }, false) - } else { - tty.clear() + function stopReloadUI() { + removeElementsByClass("msgbox-overlay") } - let oldTTY = tsrv.getActiveInstance() - tsrv.setActiveInstance(tty) - // Show the panel and focus it to prevent the user from editing the Dockerfile. - tsrv.showPanel(true) - startReloadUI() + let tty + function rebuild() { + const tsrv = window.ide.workbench.terminalService - const ws = new WebSocket("ws://" + location.host + "/sail/api/v1/reload") - ws.onmessage = (ev) => { - const msg = JSON.parse(ev.data) - const out = atob(msg.v).replace(/\n/g, "\n\r") - tty.write(out) - } - ws.onclose = (ev) => { - if (ev.code === 1000) { - tsrv.setActiveInstance(oldTTY) + if (tty == null) { + tty = tsrv.createTerminal({ + name: "sail", + isRendererOnly: true, + }, false) } else { - alert("reload failed; please see logs in sail terminal") + tty.clear() } - stopReloadUI() - } -} + let oldTTY = tsrv.getActiveInstance() + tsrv.setActiveInstance(tty) + // Show the panel and focus it to prevent the user from editing the Dockerfile. + tsrv.showPanel(true) -let tty -window.addEventListener("ide-ready", () => { - const statusBarService = window.ide.workbench.statusbarService - statusBarService.addEntry({ - text: "rebuild", - tooltip: "press super+alt+r to rebuild", - command: "rebuild-sail-container" - // showBeak: true <- what does this do? - }, 0) + startReloadUI() - const commandRegistry = window.ide.workbench.commandRegistry - commandRegistry.registerCommand({ - id: "rebuild-sail-container", - handler: (accessor, args) => { - rebuild() - }, - description: { - description: "Rebuild sail container", - args: [] + const ws = new WebSocket("ws://" + location.host + "/sail/api/v1/reload") + ws.onmessage = (ev) => { + const msg = JSON.parse(ev.data) + const out = atob(msg.v).replace(/\n/g, "\n\r") + tty.write(out) } - }) + ws.onclose = (ev) => { + if (ev.code === 1000) { + tsrv.setActiveInstance(oldTTY) + } else { + alert("reload failed; please see logs in sail terminal") + } + stopReloadUI() + } + } - const -}) + window.addEventListener("ide-ready", () => { + const statusBarService = window.ide.workbench.statusbarService + statusBarService.addEntry({ + text: "rebuild", + tooltip: "press super+alt+r to rebuild", + command: "rebuild-sail-container" + }, 0) + + const commandRegistry = window.ide.workbench.commandRegistry + commandRegistry.registerCommand({ + id: "rebuild-sail-container", + handler: (accessor, args) => { + rebuild() + }, + description: { + description: "Rebuild sail container", + args: [] + } + }) + }) +}()) \ No newline at end of file diff --git a/sail.js.go b/sail.js.go index 0a852d9..a933a73 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\nfunction rebuild() {\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 }\n}\n\nlet tty\nwindow.addEventListener(\"ide-ready\", () => {\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"press super+alt+r to rebuild\",\n command: \"rebuild-sail-container\"\n // showBeak: true <- what does this do?\n }, 0)\n\n const commandRegistry = window.ide.workbench.commandRegistry\n commandRegistry.registerCommand({\n id: \"rebuild-sail-container\",\n handler: (accessor, args) => {\n rebuild()\n },\n description: {\n description: \"Rebuild sail container\",\n args: []\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
Reloading container
\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 function rebuild() {\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 }\n }\n\n window.addEventListener(\"ide-ready\", () => {\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"press super+alt+r to rebuild\",\n command: \"rebuild-sail-container\"\n }, 0)\n\n const commandRegistry = window.ide.workbench.commandRegistry\n commandRegistry.registerCommand({\n id: \"rebuild-sail-container\",\n handler: (accessor, args) => {\n rebuild()\n },\n description: {\n description: \"Rebuild sail container\",\n args: []\n }\n })\n })\n}())" From 45af165709996e846b02258f58d6f7803be2cd6b Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Mon, 20 May 2019 17:44:48 -0400 Subject: [PATCH 3/4] Use actions registry --- sail.js | 26 ++++++++++++-------------- sail.js.go | 2 +- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/sail.js b/sail.js index b066463..1b3b4d2 100644 --- a/sail.js +++ b/sail.js @@ -57,23 +57,21 @@ } 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 sail container", { + primary: ((1 << 11) >>> 0) | 48 // That's cmd + R. See vscode source for the magic numbers. + }), "sail: Rebuild", "sail"); + const statusBarService = window.ide.workbench.statusbarService statusBarService.addEntry({ text: "rebuild", - tooltip: "press super+alt+r to rebuild", - command: "rebuild-sail-container" + tooltip: "press super+r to rebuild", + command: "sail.rebuild" }, 0) - - const commandRegistry = window.ide.workbench.commandRegistry - commandRegistry.registerCommand({ - id: "rebuild-sail-container", - handler: (accessor, args) => { - rebuild() - }, - description: { - description: "Rebuild sail container", - args: [] - } - }) }) }()) \ No newline at end of file diff --git a/sail.js.go b/sail.js.go index a933a73..140c8cc 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() {\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
Reloading container
\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 function rebuild() {\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 }\n }\n\n window.addEventListener(\"ide-ready\", () => {\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"press super+alt+r to rebuild\",\n command: \"rebuild-sail-container\"\n }, 0)\n\n const commandRegistry = window.ide.workbench.commandRegistry\n commandRegistry.registerCommand({\n id: \"rebuild-sail-container\",\n handler: (accessor, args) => {\n rebuild()\n },\n description: {\n description: \"Rebuild sail container\",\n args: []\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
Reloading container
\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 function rebuild() {\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 }\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 sail container\", {\n primary: ((1 << 11) >>> 0) | ((1 << 10) >>> 0) | 48 // That's cmd + shift + R. See vscode source.\n }), \"sail: Rebuild\", \"sail\");\n\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"press super+alt+r to rebuild\",\n command: \"sail.rebuild\"\n }, 0)\n })\n}())" From 10bf740fbb6d0d573859a33d20fc5fb47ff3ecdc Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Mon, 20 May 2019 18:24:32 -0400 Subject: [PATCH 4/4] Prevent keypresses while reload occurs Also prevent rebuild while rebuild is in progress, just in case. --- sail.js | 21 ++++++++++++++++----- sail.js.go | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/sail.js b/sail.js index 1b3b4d2..224fae2 100644 --- a/sail.js +++ b/sail.js @@ -5,8 +5,12 @@ div.style.opacity = 1 div.style.textAlign = "center" div.innerHTML = `
-
Reloading container
+
Rebuilding container
` + // Prevent keypresses. + document.body.onkeydown = ev => { + ev.stopPropagation() + } document.querySelector(".monaco-workbench").appendChild(div) } @@ -22,7 +26,13 @@ } let tty + let rebuilding function rebuild() { + if (rebuilding) { + return + } + rebuilding = true + const tsrv = window.ide.workbench.terminalService if (tty == null) { @@ -53,6 +63,7 @@ alert("reload failed; please see logs in sail terminal") } stopReloadUI() + rebuilding = false } } @@ -63,15 +74,15 @@ } } - window.ide.workbench.actionsRegistry.registerWorkbenchAction(new window.ide.workbench.syncActionDescriptor(rebuildAction, "sail.rebuild", "Rebuild sail container", { + 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", "sail"); + }), "sail: Rebuild container", "sail"); const statusBarService = window.ide.workbench.statusbarService statusBarService.addEntry({ text: "rebuild", - tooltip: "press super+r to rebuild", + tooltip: "Rebuild sail container", command: "sail.rebuild" }, 0) }) -}()) \ No newline at end of file +}()) diff --git a/sail.js.go b/sail.js.go index 140c8cc..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() {\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
Reloading container
\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 function rebuild() {\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 }\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 sail container\", {\n primary: ((1 << 11) >>> 0) | ((1 << 10) >>> 0) | 48 // That's cmd + shift + R. See vscode source.\n }), \"sail: Rebuild\", \"sail\");\n\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"press super+alt+r to rebuild\",\n command: \"sail.rebuild\"\n }, 0)\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"