diff options
Diffstat (limited to 'tools/gui/resources/web/main.js')
-rw-r--r-- | tools/gui/resources/web/main.js | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/tools/gui/resources/web/main.js b/tools/gui/resources/web/main.js new file mode 100644 index 0000000..b4fe38b --- /dev/null +++ b/tools/gui/resources/web/main.js @@ -0,0 +1,129 @@ +Notification.requestPermission(); + +$.get("/api/cwd").done(cwd => { + $("#cwd").append(cwd[0]); +}).fail(e => notifyFail(e)); + +document.body.onkeydown = function (event) { + if (event.keyCode == 27) + hidePopup(); +}; + +$("#create-project")[0].disabled = false; + +let dependencies = []; + +function getFlags() { + return "readme/" + $("#readme-flag")[0].checked + + " dotty/" + $("#dotty-flag")[0].checked + + " uberJar/" + $("#uberJar-flag")[0].checked + + " wartremover/" + $("#wartremover-flag")[0].checked; +} + +function createProject() { + let button = $("#create-project")[0]; + let buttonText = button.innerHTML; + button.innerHTML = "..."; + button.blur(); + button.disabled = true; + $.post("/api/project", { + name: $("#name").val(), + pack: $("#package").val(), + dependencies: dependencies.length == 0 ? "" : + dependencies.map(l => l.group + "/" + l.artifact + "/" + l.version).reduce((a, b) => a + " " + b), + flags: getFlags() + }).done(() => { + notify("Done."); + }).fail(e => + notifyFail(e) + ).always(() => { + button.innerHTML = buttonText; + button.disabled = false; + }); +} + +function handleSearchInput(event) { + if (event.keyCode == 13) + search(); +} +function search() { + let query = $("#query").val(); + if (query) { + $.get("/api/dependency", { query: query }).done(data => { + let entries = data.response.docs.map(x => ({ + group: x.g, + artifact: x.a + })); + showPopup(makeRowsFrom(entries, selectDependency)); + }).fail(e => notifyFail(e)); + document.activeElement.blur(); + } +} +function selectDependency(selected) { + $.get("/api/dependency/version", { group: selected.group, artifact: selected.artifact }).done(data => { + let versions = data.response.docs.map(x => ({ version: x.v })); + $("#popup-table").html(makeRowsFrom(versions, function (version) { + selectDependencyVersion(selected.group, selected.artifact, version.version); + })); + }).fail(e => notifyFail(e)); +} +function selectDependencyVersion(group, artifact, version) { + let dependency = { group: group, artifact: artifact, version: version }; + dependencies.push(dependency); + let scalaName = artifact.match(/^(.+)_\d+\.\d+$/); + let name = scalaName && scalaName[1] ? scalaName[1] : artifact; + var depDiv = $("<div class='entry removable'>" + name + " " + version + "</div>"); + depDiv.click(function () { + removeDependency(dependency, depDiv); + }); + $("#dependencies").append(depDiv); + hidePopup(); +} +function removeDependency(d, div) { + dependencies.splice(dependencies.indexOf(d), 1); + div.remove(); +} + +function showPopup(contents) { + $("#popup").show(); + $("#popup-table").html(contents); +} +function hidePopup() { + $("#popup").hide(); + $("#popup-table").html(""); +} + +function makeRowsFrom(results, rowAction) { + if (results.length == 0) { + return []; + } else { + let rows = []; + let row = $("<tr></tr>"); + rows.push(row); + let fields = []; + for (let field in results[0]) + if (results[0].hasOwnProperty(field)) { + fields.push(field); + $("<td>" + field + "</td>").appendTo(row); + } + results.forEach(result => { + let row = $("<tr></tr>"); + row.click(function () { + rowAction(result); + }); + rows.push(row); + fields.forEach(field => $("<td>" + result[field] + "</td>").appendTo(row)); + }); + return rows; + } +} + +function notify(text, title) { + new Notification(title || "", { body: text }); +} + +function notifyFail(e) { + let head = e.status == 0 ? "Error" : e.status + " " + e.statusText; + let body = e.status == 0 ? "No response from UI server." : e.responseText; + notify(body, head); +} |