@@ -8135,104 +8135,16 @@ context_menu: function(){
81358135 $('[name=triggeron]').trigger('change');
81368136
81378137 break;
8138- case 'Logs':
8139- var $refreshbutton = $('<button>').text('Refresh now').click(function(){
8140- $(this).text('Loading..');
8141- mist.send(function(){
8142- buildLogsTable();
8143- $refreshbutton.text('Refresh now');
8144- });
8145- }).css('padding','0.2em 0.5em').css('flex-grow',0);
8146-
8147- $main.append(UI.buildUI([{
8148- type: 'help',
8149- help: 'Here you have an overview of all edited settings within MistServer and possible warnings or errors MistServer has encountered. MistServer stores up to 100 logs at a time.'
8150- },{
8151- label: 'Refresh every',
8152- type: 'select',
8153- select: [
8154- [10,'10 seconds'],
8155- [30,'30 seconds'],
8156- [60,'minute'],
8157- [300,'5 minutes']
8158- ],
8159- value: 30,
8160- 'function': function(){
8161- UI.interval.clear();
8162- UI.interval.set(function(){
8163- mist.send(function(){
8164- buildLogsTable();
8165- });
8166- },$(this).val()*1e3);
8167- },
8168- help: 'How often the table below should be updated.'
8169- },{
8170- label: '..or',
8171- type: 'DOMfield',
8172- DOMfield: $refreshbutton,
8173- help: 'Instantly refresh the table below.'
8174- }]));
8175-
8176- $main.append(
8177- $('<button>').text('Purge logs').click(function(){
8178- mist.send(function(){
8179- mist.data.log = [];
8180- UI.navto('Logs');
8181- },{clearstatlogs:true});
8182- })
8183- );
8184- var $tbody = $('<tbody>').css('font-size','0.9em');
8185- $main.append(
8186- $('<table>').addClass('logs').append($tbody)
8187- );
8188-
8189- function color(string){
8190- var $s = $('<span>').text(string);
8191- switch (string) {
8192- case 'WARN':
8193- $s.addClass('orange');
8194- break;
8195- case 'ERROR':
8196- case 'FAIL':
8197- $s.addClass('red');
8198- break;
8199- }
8200- return $s;
8201- }
8202- function buildLogsTable(){
8203- var logs = mist.data.log;
8204- if (!logs) { return; }
8205-
8206- if ((logs.length >= 2) && (logs[0][0] < logs[logs.length-1][0])){
8207- logs.reverse();
8208- }
8209-
8210- $tbody.html('');
8211- for (var index in logs) {
8212- var $content = $('<span>').addClass('content');
8213- if ((logs[index].length >= 4) && (logs[index][3] != "")) $content.append($("<span>").text("["+logs[index][3]+"] "));
8214- var split = logs[index][2].split('|');
8215- for (var i in split) {
8216- $content.append(
8217- $('<span>').text(split[i])
8218- );
8219- }
8220-
8221-
8222- $tbody.append(
8223- $('<tr>').html(
8224- $('<td>').text(UI.format.dateTime(logs[index][0],'long')).css('white-space','nowrap')
8225- ).append(
8226- $('<td>').html(color(logs[index][1])).css('text-:align','center')
8227- ).append(
8228- $('<td>').html($content).css('text-align','left')
8229- )
8230- );
8231- }
8232- }
8233- buildLogsTable();
8234-
8138+ case 'Logs': {
8139+ let $buttons = $("<div>").addClass("buttons");
8140+ let $logs = UI.modules.logs();
8141+ $buttons.append($logs.find("> button").first());
8142+ $logs.find("> h3").remove();
8143+
8144+ $main.append($buttons).append($logs);
8145+
82358146 break;
8147+ }
82368148 case 'Statistics':
82378149 var $UI = $('<span>').text('Loading..');
82388150 $main.append($UI);
@@ -10250,62 +10162,7 @@ context_menu: function(){
1025010162 });
1025110163 },
1025210164 logs: function(streamname){
10253- var $logs = $("<div>").attr("onempty","None.").addClass("logs");
10254-
10255- var tab = false;
10256-
10257- UI.sockets.ws.active_streams.subscribe(function(type,data){
10258- if (type == "log") {
10259- var scroll = ($logs[0].scrollTop >= $logs[0].scrollHeight - $logs[0].clientHeight); //scroll to bottom unless scrolled elsewhere
10260-
10261- if (data[3] != "" && data[3] != streamname.split("+")[0]) { //filter out messages about other streams
10262- return;
10263- }
10264- if (data[1] == "ACCS") { return; } //the access log has its own container
10265-
10266- var $msg = $("<div>").attr("data-debuglevel",data[1]).html(
10267- $("<span>").addClass("description").text(UI.format.dateTime(data[0]))
10268- ).append(
10269- $("<span>").text(data[3]) //stream, if any
10270- ).append(
10271- $("<span>").text(data[1]+":") //debug level
10272- ).append(
10273- $("<span>").text(data[2]) //message
10274- );
10275- $logs.append($msg);
10276-
10277- if (scroll) $logs[0].scrollTop = $logs[0].scrollHeight;
10278-
10279- if (tab) {
10280- try {
10281- var scroll = (tab.document.scrollingElement.scrollTop >= tab.document.scrollingElement.scrollHeight - tab.document.scrollingElement.clientHeight);
10282- tab.document.write($msg[0].outerHTML);
10283- if (scroll) tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
10284- }
10285- catch (e) {}
10286- }
10287-
10288- }
10289- else if (type == "error") {
10290- var $msg = $("<div>").text(data);
10291- $logs.append($msg);
10292- }
10293- });
10294-
10295- return $("<section>").addClass("logs").append(
10296- $("<h3>").text("MistServer logs")
10297- ).append(
10298- $("<button>").text("Open raw").click(function(){
10299- tab = window.open("", "MistServer logs for "+streamname);
10300- tab.document.write(
10301- "<html><head><title>MistServer logs for '"+streamname+"'</title><meta http-equiv=\"content-type\" content=\"application/json; charset=utf-8\"><style>body{padding-left:2em;text-indent:-2em;}body>*>*:not(:last-child):not(:empty){padding-right:.5em;}.description{font-size:.9em;color:#777}</style></head><body>"
10302- );
10303- tab.document.write($logs[0].innerHTML);
10304- tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
10305- })
10306- ).append(
10307- $logs
10308- );
10165+ return UI.modules.logs(streamname);
1030910166 },
1031010167 accesslogs: function(streamname){
1031110168 var $accesslogs = $("<div>").attr("onempty","None.").addClass("accesslogs");
@@ -11378,6 +11235,117 @@ context_menu: function(){
1137811235 )
1137911236 }
1138011237 },
11238+ logs: function(streamname){
11239+ var scroll = true;
11240+ var $logs = $("<div>").attr("onempty","None.").attr("data-scrolling",scroll).addClass("logs").on("scroll",function(){
11241+ //scroll to bottom unless scrolled elsewhere
11242+ if (this.scrollTop + this.clientHeight >= this.scrollHeight - 5) {
11243+ scroll = true;
11244+ }
11245+ else {
11246+ scroll = false;
11247+ }
11248+ $logs.attr("data-scrolling",scroll);
11249+ });
11250+
11251+ var tab = false;
11252+
11253+ UI.sockets.ws.active_streams.subscribe(function(type,data){
11254+ if (type == "log") {
11255+ if (streamname && (data[3] != "") && (data[3] != streamname.split("+")[0])) { //filter out messages about other streams
11256+ return;
11257+ }
11258+ if (data[1] == "ACCS") { return; } //the access log has its own container
11259+
11260+ var $msg = $("<div>").addClass("message").attr("data-debuglevel",data[1]).html(
11261+ $("<span>").addClass("time").html(
11262+ $("<span>").append(
11263+ $("<span>").addClass("description").text("[")
11264+ ).append(
11265+ $("<span>").text(UI.format.dateTime(data[0]))
11266+ ).append(
11267+ $("<span>").addClass("description").text("] ")
11268+ ).children()
11269+ )
11270+ ).append(
11271+ $("<span>").addClass("binary").attr("title","binary name").text(data[5])
11272+ ).append(
11273+ $("<span>").addClass("stream").attr("title","stream name").html(
11274+ data[3] ? $("<span>").append(
11275+ $("<span>").addClass("description").text(":")
11276+ ).append(
11277+ $("<span>").text(data[3])
11278+ ).children() : ""
11279+ )
11280+ ).append(
11281+ $("<span>").addClass("pid").attr("title","pid").html(
11282+ data[4] ? $("<span>").append(
11283+ $("<span>").addClass("description").text(" (")
11284+ ).append(
11285+ $("<span>").text(data[4])
11286+ ).append(
11287+ $("<span>").addClass("description").text(")")
11288+ ).children() : ""
11289+ )
11290+ ).append(
11291+ $("<span>").addClass("debuglevel").attr("title","debug level").html(
11292+ $("<span>").append(
11293+ $("<span>").addClass("description").text(" [")
11294+ ).append(
11295+ $("<span>").text(data[1])
11296+ ).append(
11297+ $("<span>").addClass("description").text("]")
11298+ ).children()
11299+ )
11300+ ).append(
11301+ $("<span>").addClass("message").text(" "+data[2])
11302+ ).append(
11303+ $("<span>").addClass("line").addClass("copy_but_hide").attr("title","line number").html(data[6] ? " ("+data[6]+")" : "")
11304+ );
11305+ $logs.append($msg);
11306+
11307+ if ($logs.children().length > 1000) {
11308+ $logs.children().first().remove();
11309+ }
11310+
11311+ if (scroll) $logs[0].scrollTop = $logs[0].scrollHeight;
11312+
11313+ if (tab) {
11314+ try {
11315+ let s = (tab.document.scrollingElement.scrollTop >= tab.document.scrollingElement.scrollHeight - tab.document.scrollingElement.clientHeight);
11316+ tab.document.write($msg[0].outerHTML);
11317+ if (s) tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
11318+ }
11319+ catch (e) {}
11320+ }
11321+
11322+ }
11323+ else if (type == "error") {
11324+ var $msg = $("<div>").text(data);
11325+ $logs.append($msg);
11326+ }
11327+ });
11328+
11329+ return $("<section>").addClass("logs").append(
11330+ $("<h3>").text("MistServer logs")
11331+ ).append(
11332+ $("<button>").text("Open raw").click(function(){
11333+ tab = window.open("", "MistServer logs"+(streamname ? " for "+streamname : ""));
11334+ tab.document.write(
11335+ "<html><head><title>MistServer logs"+(streamname ? " for '"+streamname+"'" : "")+"</title><meta http-equiv=\"content-type\" content=\"application/json; charset=utf-8\"><style>body{padding-left:2em;text-indent:-2em;font-family:monospace}.description,.message :is(.time,.binary,.pid,.line){font-size:.9em;color:#777}.message:is([data-debuglevel=\"WARN\"],[data-debuglevel=\"ERROR\"],[data-debuglevel=\"FAIL\"]){font-weight:bold;}</style></head><body>"
11336+ );
11337+ tab.document.write($logs[0].innerHTML);
11338+ tab.document.scrollingElement.scrollTop = tab.document.scrollingElement.scrollHeight;
11339+ })
11340+ ).append(
11341+ $logs
11342+ ).append(
11343+ $("<button>").addClass("down").attr("data-icon","down").attr("title","Snap to bottom").click(function(){
11344+ scroll = true;
11345+ $logs[0].scrollTop = $logs[0].scrollHeight;
11346+ })
11347+ );
11348+ },
1138111349 pushes: function(options){
1138211350 if (!options) {
1138311351 options = {};
0 commit comments