1
0
mirror of https://github.com/gusaul/grpcox.git synced 2025-06-15 08:55:43 +00:00
grpcox/index/js/style.js
2021-09-28 23:58:46 +07:00

315 lines
8.1 KiB
JavaScript

var target, use_tls, editor, targetScroll, mode;
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
switch (e.target.innerHTML) {
case "Mode 1":
mode = 'select';
break;
case "Mode 2":
mode = 'input';
break;
}
});
$('#select-server-target').change(function () {
if ($(this).val() == "") {
return
}
$('#select-get-services').click();
});
$('.get-services').click(function () {
var t = get_valid_target();
use_tls = "false";
var restart = "0"
if ($('#restart-conn').is(":checked")) {
restart = "1"
}
// determine whether the proto connection will use local proto or not
const use_proto = $('#local-proto').is(":checked");
if (target != t || restart == "1" || use_proto) {
target = t;
} else {
return false;
}
// prepare ajax options beforehand
// makes it easier for local proto to modify some of its properties
const ajaxProps = {
url: "server/" + target + "/services?restart=" + restart,
global: true,
method: "GET",
success: function (res) {
if (res.error) {
target = "";
use_tls = "";
alert(res.error);
return;
}
$("#select-service").html(new Option("Choose Service", ""));
$.each(res.data, (_, item) => $("#select-service").append(new Option(item, item)));
$('#choose-service').show();
},
error: function (_, _, errorThrown) {
target = "";
use_tls = "";
alert(errorThrown);
},
beforeSend: function (xhr) {
$('#choose-service').hide();
xhr.setRequestHeader('use_tls', use_tls);
$(this).html("Loading...");
show_loading();
},
complete: function () {
applyConnCount();
$(this).html(button);
hide_loading();
}
};
// modify ajax options if use local proto
if (use_proto) {
ajaxProps.method = "POST";
ajaxProps.enctype = "multipart/form-data";
ajaxProps.processData = false;
ajaxProps.contentType = false;
ajaxProps.cache = false;
ajaxProps.data = getProtos();
}
$('.other-elem').hide();
var button = $(this).html();
$.ajax(ajaxProps);
});
$('#select-service').change(function () {
var selected = $(this).val();
if (selected == "") {
return false;
}
$('#body-request').hide();
$('#response').hide();
$.ajax({
url: "server/" + target + "/service/" + selected + "/functions",
global: true,
method: "GET",
success: function (res) {
if (res.error) {
alert(res.error);
return;
}
$("#select-function").html(new Option("Choose Method", ""));
$.each(res.data, (_, item) => $("#select-function").append(new Option(item.substr(selected.length), item)));
$('#choose-function').show();
},
error: err,
beforeSend: function (xhr) {
$('#choose-function').hide();
xhr.setRequestHeader('use_tls', use_tls);
show_loading();
},
complete: function () {
hide_loading();
}
});
});
$('#select-function').change(function () {
var selected = $(this).val();
if (selected == "") {
return false;
}
$('#response').hide();
$.ajax({
url: "server/" + target + "/function/" + selected + "/describe",
global: true,
method: "GET",
success: function (res) {
if (res.error) {
alert(res.error);
return;
}
generate_editor(res.data.template);
$("#schema-proto").html(PR.prettyPrintOne(res.data.schema));
$('#body-request').show();
},
error: err,
beforeSend: function (xhr) {
$('#body-request').hide();
xhr.setRequestHeader('use_tls', use_tls);
show_loading();
},
complete: function () {
hide_loading();
}
});
});
$('#invoke-func').click(function () {
// use metadata if there is any
ctxArr = [];
$(".ctx-metadata-input-field").each(function (index, val) {
ctxArr.push($(val).text())
});
var func = $('#select-function').val();
if (func == "") {
return false;
}
var body = editor.getValue();
var button = $(this).html();
$.ajax({
url: "server/" + target + "/function/" + func + "/invoke",
global: true,
method: "POST",
data: body,
dataType: "json",
success: function (res) {
if (res.error) {
alert(res.error);
return;
}
$("#json-response").html(PR.prettyPrintOne(res.data.result));
$("#timer-resp span").html(res.data.timer);
$('#response').show();
},
error: err,
beforeSend: function (xhr) {
$('#response').hide();
xhr.setRequestHeader('use_tls', use_tls);
if (ctxUse) {
xhr.setRequestHeader('Metadata', ctxArr);
}
$(this).html("Loading...");
show_loading();
},
complete: function () {
$(this).html(button);
hide_loading();
$('html, body').animate({
scrollTop: targetScroll
}, 500);
}
});
});
function generate_editor(content) {
if (editor) {
editor.setValue(content);
return true;
}
$("#editor").html(content);
editor = ace.edit("editor");
editor.setOptions({
maxLines: Infinity
});
editor.renderer.setScrollMargin(10, 10, 10, 10);
editor.setTheme("ace/theme/github");
editor.session.setMode("ace/mode/json");
editor.renderer.setShowGutter(false);
}
function get_valid_target() {
el = $(`#${mode}-server-target`)
t = el.val().trim();
if (t == "") {
return target;
}
ts = t.split("://");
if (ts.length > 1) {
el.val(ts[1]);
return ts[1];
}
return ts[0];
}
function err(_, _, errorThrown) {
alert(errorThrown);
}
function show_loading() {
$('.spinner').show();
}
function hide_loading() {
$('.spinner').hide();
}
$(".connections ul").on("click", "i", function () {
$icon = $(this);
$parent = $(this).parent("li");
var ip = $(this).siblings("span").text();
$.ajax({
url: "active/close/" + ip,
global: true,
method: "DELETE",
success: function (res) {
$('[data-toggle="tooltip"]').tooltip('hide');
if (res.data.success) {
$parent.remove();
updateCountNum();
}
},
error: err,
beforeSend: function (xhr) {
$icon.attr('class', 'fa fa-spinner');
},
});
});
function updateCountNum() {
$(".connections .title span").html($(".connections ul li").length);
}
function applyConnCount() {
$('[data-toggle="tooltip"]').tooltip('hide');
$.ajax({
url: "active/get",
global: true,
method: "GET",
success: function (res) {
$(".connections .title span").html(res.data.length);
$(".connections .nav").html("");
res.data.forEach(function (item) {
$list = $("#conn-list-template").clone();
$list.find(".ip").html(item);
$(".connections .nav").append($list.html());
});
refreshToolTip();
},
error: function (_, _, thrownError) {
console.warn("Failed to update active connections", thrownError)
},
});
}
function refreshConnCount() {
applyConnCount();
setTimeout(refreshConnCount, 10000);
}
function refreshToolTip() {
$(function () {
$('[data-toggle="tooltip"]').tooltip('dispose');
$('[data-toggle="tooltip"]').tooltip();
})
}
$(document).ready(function () {
mode = 'select'
refreshConnCount();
targetScroll = window.innerHeight + 50;
});