From 602790e2ca33ad7f22235bf2ae548cef7db8b814 Mon Sep 17 00:00:00 2001 From: Mitch Riedstra Date: Sat, 9 Jan 2021 15:22:27 -0500 Subject: Add a progress bar to the UI for installation via HTTP. Uses polling, but whatever. --- cmd/web/js.go | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 cmd/web/js.go (limited to 'cmd/web/js.go') diff --git a/cmd/web/js.go b/cmd/web/js.go new file mode 100644 index 0000000..0d54fab --- /dev/null +++ b/cmd/web/js.go @@ -0,0 +1,109 @@ +package main + +import ( + // "io/ioutil" + "net/http" +) + +func jsHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-type", "application/javascript") + _, err := w.Write([]byte(` +// pretty print duration when given in seconds +function formatDuration(dur) { + var out = ""; + + var hours = 0; + var minutes = 0; + + if(dur > (60*60)){ + hours = Math.trunc(dur/(60*60)) + out = out + hours + " hours " + } + + if(dur > 60){ + minutes = Math.trunc((dur-(hours*60*60))/60) + out = out + minutes + " minutes " + } + + seconds = Math.trunc(dur - ( (hours*60*60) + (minutes*60) )) + out = out + seconds + " seconds " + + return out; +} + +function setStatus(stat) { + var elem = document.getElementById("installBar"); + var msg = document.getElementById("message"); + + // console.log(stat) + + if(stat.Running) { + percent = Math.round((stat.Transferred/stat.Size)*10000)/100; + + var t = Date.parse(stat.Start); + // var n = Date.now(); + var elapsed = Date.now() - t; + var trans = (stat.Transferred/1024/1024); + + console.log(trans) + console.log(elapsed / 1000) + + var rate = Math.round(trans / (elapsed / 1000)) + + elem.style.width = percent + "%"; + elem.innerHTML = percent + "%"; + elem.style.display = ""; + + // in seconds + var eta = Math.round(((stat.Size - trans)/1024/1024) / rate); + + msg.innerHTML = "Installing: " + stat.Url + + "\nRate: " + rate + "mb/s" + + "\nEta: " + formatDuration(eta); + msg.style.display = ""; + } + + if(!stat.Running && stat.Transferred >= 50 && stat.Error == null) { + elem.style.width = 100 + "%"; + elem.innerHTML = 100 + "%"; + msg.innerHTML = "Completed install for: " + stat.Url; + elem.style.display = ""; + msg.style.display = ""; + } + + if(stat.Error != null) { + msg.innerHTML = "Errors encountered while installing from: \n\n" + + stat.Url + "\n\n" + + JSON.stringify(stat.Error, undefined, 2); + elem.style.display = "hidden"; + msg.style.display = ""; + } +} + +function updateStatus() { +window.fetch('/status') + .then(function(response){ + return response.json(); + }).then(function(json){ + return setStatus(json); + }); +} + +document.addEventListener("DOMContentLoaded",function(){ + setInterval(updateStatus, 750); +}); +`)) + + /* + b, err := ioutil.ReadFile("C:\\Users\\mitch\\Documents\\my.js") + if err != nil { + Logger.Printf("While reading js: %s", err) + return + } + _, err = w.Write(b) + */ + + if err != nil { + Logger.Printf("While sending js: %s", err) + } +} -- cgit v1.2.3