LSP: prevent double triggers when using enter on buttons in the input container
This commit is contained in:
		
							parent
							
								
									2fc49dc81e
								
							
						
					
					
						commit
						9501694165
					
				
					 2 changed files with 55 additions and 46 deletions
				
			
		|  | @ -22,52 +22,53 @@ function(){UI.popup.element.remove();UI.popup.element=null})})).append(a);$("bod | |||
| buildMenu:function(){function a(a,c){var b=$("<a>").addClass("button");b.html($("<span>").addClass("plain").text(a)).append($("<span>").addClass("highlighted").text(a));for(var d in c.classes)b.addClass(c.classes[d]);"LTSonly"in c&&b.addClass("LTSonly");"link"in c?b.attr("href",c.link).attr("target","_blank"):"submenu"in c||b.click(function(c){UI.navto(a);c.stopPropagation()});return b}var c=UI.elements.menu,e;for(e in UI.menu){0<e&&c.append($("<br>"));for(var b in UI.menu[e]){var d=UI.menu[e][b], | ||||
| i=a(b,d);c.append(i);if("submenu"in d){var m=$("<span>").addClass("submenu");i.addClass("arrowdown").append(m);for(var f in d.submenu)m.append(a(f,d.submenu[f]))}}}e=$("<div>").attr("id","ih_button").text("?").click(function(){$("body").toggleClass("helpme");UI.stored.saveOpt("helpme",$("body").hasClass("helpme"))}).attr("title","Click to toggle the display of integrated help");UI.stored.getOpts().helpme&&$("body").addClass("helpme");c.after(e).after($("<div>").addClass("separator"))},buildUI:function(a){var c= | ||||
| $("<div>").addClass("input_container"),e;for(e in a){var b=a[e];if(b instanceof jQuery)c.append(b);else if("help"==b.type){var d=$("<span>").addClass("text_container").append($("<span>").addClass("description").append(b.help));c.append(d);if("classes"in b)for(var i in b.classes)d.addClass(b.classes[i])}else if("text"==b.type)c.append($("<span>").addClass("text_container").append($("<span>").addClass("text").append(b.text)));else if("custom"==b.type)c.append(b.custom);else if("buttons"==b.type)for(i in d= | ||||
| $("<span>").addClass("button_container"),"css"in b&&d.css(b.css),c.append(d),b.buttons){var m=b.buttons[i],f=$("<button>").text(m.label).data("opts",m);"css"in m&&f.css(m.css);d.append(f);switch(m.type){case "cancel":f.addClass("cancel").click(m["function"]);break;case "save":f.addClass("save").click(function(){var a=$(this).closest(".input_container"),c=!1;a.find(".hasValidate").each(function(){if(c=$(this).data("validate")(this,!0))return!1});c||(a.find(".isSetting").each(function(){var a=$(this).getval(), | ||||
| c=$(this).data("pointer");if(""==a)if("default"in $(this).data("opts"))a=$(this).data("opts")["default"];else return delete c.main[c.index],!0;c.main[c.index]=a}),(a=$(this).data("opts")["function"])&&a(this))});break;default:f.click(m["function"])}}else{m=$("<label>").addClass("UIelement");c.append(m);"css"in b&&m.css(b.css);m.append($("<span>").addClass("label").html("label"in b?b.label+":":""));f=$("<span>").addClass("field_container");m.append(f);switch(b.type){case "password":d=$("<input>").attr("type", | ||||
| "password");break;case "int":d=$("<input>").attr("type","number");"min"in b&&d.attr("min",b.min);"max"in b&&d.attr("max",b.min);"validate"in b?b.validate.push("int"):b.validate=["int"];break;case "span":d=$("<span>");break;case "debug":b.select=[["","Default"],[0,"0 - All debugging messages disabled"],[1,"1 - Messages about failed operations"],[2,"2 - Previous level, and error messages"],[3,"3 - Previous level, and warning messages"],[4,"4 - Previous level, and status messages for development"],[5, | ||||
| "5 - Previous level, and more status messages for development"],[6,"6 - Previous level, and verbose debugging messages"],[7,"7 - Previous level, and very verbose debugging messages"],[8,"8 - Report everything in extreme detail"],[9,"9 - Report everything in insane detail"],[10,"10 - All messages enabled"]];case "select":d=$("<select>");for(i in b.select){var p=$("<option>");"string"==typeof b.select[i]?p.text(b.select[i]):p.val(b.select[i][0]).text(b.select[i][1]);d.append(p)}break;case "textarea":d= | ||||
| $("<span>").addClass("button_container").on("keydown",function(a){a.stopPropagation()}),"css"in b&&d.css(b.css),c.append(d),b.buttons){var m=b.buttons[i],f=$("<button>").text(m.label).data("opts",m);"css"in m&&f.css(m.css);d.append(f);switch(m.type){case "cancel":f.addClass("cancel").click(m["function"]);break;case "save":f.addClass("save").click(function(){var a=$(this).closest(".input_container"),c=!1;a.find(".hasValidate").each(function(){if(c=$(this).data("validate")(this,!0))return!1});c||(a.find(".isSetting").each(function(){var a= | ||||
| $(this).getval(),c=$(this).data("pointer");if(""==a)if("default"in $(this).data("opts"))a=$(this).data("opts")["default"];else return delete c.main[c.index],!0;c.main[c.index]=a}),(a=$(this).data("opts")["function"])&&a(this))});break;default:f.click(m["function"])}}else{m=$("<label>").addClass("UIelement");c.append(m);"css"in b&&m.css(b.css);m.append($("<span>").addClass("label").html("label"in b?b.label+":":""));f=$("<span>").addClass("field_container");m.append(f);switch(b.type){case "password":d= | ||||
| $("<input>").attr("type","password");break;case "int":d=$("<input>").attr("type","number");"min"in b&&d.attr("min",b.min);"max"in b&&d.attr("max",b.min);"validate"in b?b.validate.push("int"):b.validate=["int"];break;case "span":d=$("<span>");break;case "debug":b.select=[["","Default"],[0,"0 - All debugging messages disabled"],[1,"1 - Messages about failed operations"],[2,"2 - Previous level, and error messages"],[3,"3 - Previous level, and warning messages"],[4,"4 - Previous level, and status messages for development"], | ||||
| [5,"5 - Previous level, and more status messages for development"],[6,"6 - Previous level, and verbose debugging messages"],[7,"7 - Previous level, and very verbose debugging messages"],[8,"8 - Report everything in extreme detail"],[9,"9 - Report everything in insane detail"],[10,"10 - All messages enabled"]];case "select":d=$("<select>");for(i in b.select){var p=$("<option>");"string"==typeof b.select[i]?p.text(b.select[i]):p.val(b.select[i][0]).text(b.select[i][1]);d.append(p)}break;case "textarea":d= | ||||
| $("<textarea>").on("keydown",function(a){a.stopPropagation()});break;case "checkbox":d=$("<input>").attr("type","checkbox");break;case "hidden":d=$("<input>").attr("type","hidden");m.hide();break;case "email":d=$("<input>").attr("type","email").attr("autocomplete","on").attr("required","");break;case "browse":d=$("<input>").attr("type","text");"filetypes"in b&&d.data("filetypes",b.filetypes);break;case "geolimited":case "hostlimited":d=$("<input>").attr("type","hidden");break;case "radioselect":d= | ||||
| $("<div>").addClass("radioselect");for(e in b.radioselect){var n=$("<input>").attr("type","radio").val(b.radioselect[e][0]).attr("name",b.label);("LTSonly"in b&&!mist.data.LTS||b.readonly)&&n.prop("disabled",!0);p=$("<label>").append(n).append($("<span>").html(b.radioselect[e][1]));d.append(p);if(2<b.radioselect[e].length)for(i in n=$("<select>").change(function(){$(this).parent().find("input[type=radio]:enabled").prop("checked","true")}),p.append(n),("LTSonly"in b&&!mist.data.LTS||b.readonly)&&n.prop("disabled", | ||||
| !0),b.radioselect[e][2])p=$("<option>"),n.append(p),b.radioselect[e][2][i]instanceof Array?p.val(b.radioselect[e][2][i][0]).html(b.radioselect[e][2][i][1]):p.html(b.radioselect[e][2][i])}break;case "checklist":d=$("<div>").addClass("checkcontainer");$controls=$("<div>").addClass("controls");$checklist=$("<div>").addClass("checklist");d.append($controls).append($checklist);$controls.append($("<label>").text("All").prepend($("<input>").attr("type","checkbox").click(function(){$(this).is(":checked")? | ||||
| $(this).closest(".checkcontainer").find("input[type=checkbox]").prop("checked",!0):$(this).closest(".checkcontainer").find("input[type=checkbox]").prop("checked",!1)})));for(e in b.checklist)"string"==typeof b.checklist[e]&&(b.checklist[e]=[b.checklist[e],b.checklist[e]]),$checklist.append($("<label>").text(b.checklist[e][1]).prepend($("<input>").attr("type","checkbox").attr("name",b.checklist[e][0])));break;case "DOMfield":d=b.DOMfield;break;default:d=$("<input>").attr("type","text")}d.addClass("field").data("opts", | ||||
| b);"pointer"in b&&d.attr("name",b.pointer.index);f.append(d);if("classes"in b)for(i in b.classes)d.addClass(b.classes[i]);"placeholder"in b&&d.attr("placeholder",b.placeholder);"default"in b&&d.attr("placeholder",b["default"]);"unit"in b&&f.append($("<span>").addClass("unit").html(b.unit));"readonly"in b&&(d.attr("readonly","readonly"),d.click(function(){$(this).select()}));"qrcode"in b&&f.append($("<span>").addClass("unit").html($("<button>").text("QR").click(function(){var a=String($(this).closest(".field_container").find(".field").getval()), | ||||
| c=$("<div>").addClass("qrcode");UI.popup.show($("<span>").addClass("qr_container").append($("<p>").text(a)).append(c));c.qrcode({text:a,size:Math.min(c.width(),c.height())})})));"rows"in b&&d.attr("rows",b.rows);"LTSonly"in b&&!mist.data.LTS&&(f.addClass("LTSonly"),d.prop("disabled",!0));switch(b.type){case "browse":n=$("<div>").addClass("grouper").append(m);c.append(n);n=$("<button>").text("Browse");f.append(n);n.click(function(){function a(c){i.text("Loading..");mist.send(function(a){f.text(a.browse.path[0]); | ||||
| i.html(n.clone(true).text("..").attr("title","Folder up"));if(a.browse.subdirectories){a.browse.subdirectories.sort();for(var c in a.browse.subdirectories){var m=a.browse.subdirectories[c];i.append(n.clone(true).attr("title",f.text()+o+m).text(m))}}if(a.browse.files){a.browse.files.sort();for(c in a.browse.files){var m=a.browse.files[c],l=f.text()+o+m,m=$("<a>").text(m).addClass("file").attr("title",l);i.append(m);if(p){var s=true,v;for(v in p)if(typeof p[v]!="undefined"&&mist.inputMatch(p[v],l)){s= | ||||
| false;break}s&&m.hide()}m.click(function(){var a=$(this).attr("title");d.setval(a);e.show();b.remove()})}}},{browse:c})}var c=$(this).closest(".grouper"),b=$("<div>").addClass("browse_container"),d=c.find(".field"),e=$(this),f=$("<span>").addClass("field"),m=$("<button>").text("Select this folder"),i=$("<div>").addClass("browse_contents"),n=$("<a>").addClass("folder"),p=d.data("filetypes");c.append(b);b.append($("<label>").addClass("UIelement").append($("<span>").addClass("label").text("Current folder:")).append($("<span>").addClass("field_container").append(f).append(m))).append(i); | ||||
| m.click(function(){var a=f.text()+"/";d.setval(a);e.show();b.remove()});var o="/";mist.data.config.version.indexOf("indows")>-1&&(o="\\");n.click(function(){var c=f.text()+o+$(this).text();a(c)});c=d.getval();c=c.split(o);c.pop();c=c.join(o);e.hide();a(c)});break;case "geolimited":case "hostlimited":n={field:d};n.blackwhite=$("<select>").append($("<option>").val("-").text("Blacklist")).append($("<option>").val("+").text("Whitelist"));n.values=$("<span>").addClass("limit_value_list");switch(b.type){case "geolimited":n.prototype= | ||||
| $("<select>").append($("<option>").val("").text("[Select a country]"));for(e in UI.countrylist)n.prototype.append($("<option>").val(e).html(UI.countrylist[e]));break;case "hostlimited":n.prototype=$("<input>").attr("type","text").attr("placeholder","type a host")}n.prototype.on("change keyup",function(){$(this).closest(".field_container").data("subUI").blackwhite.trigger("change")});n.blackwhite.change(function(){var a=$(this).closest(".field_container").data("subUI"),c=[],b=false;a.values.children().each(function(){b= | ||||
| $(this).val();b!=""?c.push(b):$(this).remove()});a.values.append(a.prototype.clone(true));c.length>0?a.field.val($(this).val()+c.join(" ")):a.field.val("");a.field.trigger("change")});"LTSonly"in b&&!mist.data.LTS&&(n.blackwhite.prop("disabled",!0),n.prototype.prop("disabled",!0));n.values.append(n.prototype.clone(!0));f.data("subUI",n).addClass("limit_list").append(n.blackwhite).append(n.values)}"pointer"in b&&(d.data("pointer",b.pointer).addClass("isSetting"),n=b.pointer.main[b.pointer.index],"undefined"!= | ||||
| n&&d.setval(n));"value"in b&&d.setval(b.value);if("datalist"in b)for(e in n="datalist_"+e+MD5(d[0].outerHTML),d.attr("list",n),n=$("<datalist>").attr("id",n),f.append(n),b.datalist)n.append($("<option>").val(b.datalist[e]));f=$("<span>").addClass("help_container");m.append(f);"help"in b&&(f.append($("<span>").addClass("ih_balloon").html(b.help)),d.on("focus mouseover",function(){$(this).closest("label").addClass("active")}).on("blur mouseout",function(){$(this).closest("label").removeClass("active")})); | ||||
| if("validate"in b){m=[];for(i in b.validate){n=b.validate[i];if("function"!=typeof n)switch(n){case "required":n=function(a){return a==""?{msg:"This is a required field.",classes:["red"]}:false};break;case "int":n=function(a,c){var b=$(c).data("opts");if(!$(c)[0].validity.valid){var d=[];"min"in b&&d.push(" greater than or equal to "+b.min);"max"in b&&d.push(" smaller than or equal to "+b.max);return{msg:"Please enter an integer"+d.join(" and")+".",classes:["red"]}}if(parseInt(Number(a))!=a)return{msg:"Please enter an integer.", | ||||
| classes:["red"]}};break;case "streamname":n=function(a,c){if(!isNaN(a.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(a.toLowerCase()!=a)return{msg:"Uppercase letters are not allowed.",classes:["red"]};if(a.replace(/[^\da-z_]/g,"")!=a)return{msg:"Special characters (except for underscores) are not allowed.",classes:["red"]};if("streams"in mist.data&&a in mist.data.streams&&$(c).data("pointer").main.name!=a)return{msg:"This streamname already exists.<br>If you want to edit an existing stream, please click edit on the the streams tab.", | ||||
| classes:["red"]}};break;default:n=function(){}}m.push(n)}d.data("validate_functions",m).data("help_container",f).data("validate",function(a,c){var b=$(a).getval(),d=$(a).data("validate_functions"),e=$(a).data("help_container");e.find(".err_balloon").remove();for(var f in d){var m=d[f](b,a);if(m){$err=$("<span>").addClass("err_balloon").html(m.msg);for(var i in m.classes)$err.addClass(m.classes[i]);e.prepend($err);c&&$(a).focus();return true}}return false}).addClass("hasValidate").on("change keyup", | ||||
| function(){$(this).data("validate")($(this))});""!=d.getval()&&d.trigger("change")}"function"in b&&(d.on("change keyup",b["function"]),d.trigger("change"))}}c.on("keydown",function(a){switch(a.which){case 13:$(this).find("button.save").trigger("click");break;case 27:$(this).find("button.cancel").trigger("click")}});return c},buildVheaderTable:function(a){var c=$("<table>").css("margin","0.2em"),e=$("<tr>").addClass("header").append($("<td>").addClass("vheader").attr("rowspan",a.labels.length+1).append($("<span>").text(a.vheader))), | ||||
| b=[];e.append($("<td>"));for(var d in a.labels)b.push($("<tr>").append($("<td>").html(""==a.labels[d]?" ":a.labels[d]+":")));for(var i in a.content)for(d in e.append($("<td>").html(a.content[i].header)),a.content[i].body)b[d].append($("<td>").html(a.content[i].body[d]));c.append($("<tbody>").append(e).append(b));return c},plot:{addGraph:function(a,c){var e={id:a.id,xaxis:a.xaxis,datasets:[],elements:{cont:$("<div>").addClass("graph"),plot:$("<div>").addClass("plot"),legend:$("<div>").addClass("legend").attr("draggable", | ||||
| "true")}};UI.draggable(e.elements.legend);e.elements.cont.append(e.elements.plot).append(e.elements.legend);c.append(e.elements.cont);return e},go:function(a){if(!(1>Object.keys(a).length)){var c={totals:[],clients:[]},e;for(e in a)for(var b in a[e].datasets){var d=a[e].datasets[b];switch(d.datatype){case "clients":case "upbps":case "downbps":switch(d.origin[0]){case "total":c.totals.push({fields:[d.datatype],end:-15});break;case "stream":c.totals.push({fields:[d.datatype],streams:[d.origin[1]],end:-15}); | ||||
| break;case "protocol":c.totals.push({fields:[d.datatype],protocols:[d.origin[1]],end:-15})}break;case "cpuload":case "memload":c.capabilities={}}}0==c.totals.length&&delete c.totals;0==c.clients.length&&delete c.clients;mist.send(function(){for(var c in a){var b=a[c];if(1>b.datasets.length){b.elements.plot.html("");b.elements.legend.html("");break}switch(b.xaxis){case "time":var d=[];b.yaxes={};var e=[],n;for(n in b.datasets){var s=b.datasets[n];s.display&&(s.getdata(),s.yaxistype in b.yaxes||(d.push(UI.plot.yaxes[s.yaxistype]), | ||||
| b.yaxes[s.yaxistype]=d.length),s.yaxis=b.yaxes[s.yaxistype],e.push(s))}d[0]&&(d[0].color=0);b.plot=$.plot(b.elements.plot,e,{legend:{show:!1},xaxis:UI.plot.xaxes[b.xaxis],yaxes:d,grid:{hoverable:!0,borderWidth:{top:0,right:0,bottom:1,left:1},color:"black",backgroundColor:{colors:["rgba(0,0,0,0)","rgba(0,0,0,0.025)"]}},crosshair:{mode:"x"}});d=$("<table>").addClass("legend-list").addClass("nolay").html($("<tr>").html($("<td>").html($("<h3>").text(b.id))).append($("<td>").css("padding-right","2em").css("text-align", | ||||
| "right").html($("<span>").addClass("value")).append($("<button>").data("opts",b).text("X").addClass("close").click(function(){var c=$(this).data("opts");if(confirm("Are you sure you want to remove "+c.id+"?")){c.elements.cont.remove();var b=$(".graph_ids option:contains("+c.id+")"),d=b.parent();b.remove();UI.plot.del(c.id);delete a[c.id];d.trigger("change");UI.plot.go(a)}}))));b.elements.legend.html(d);var l=function(a){var c=b.elements.legend.find(".value"),d=1;if(typeof a=="undefined")c.eq(0).html("Latest:"); | ||||
| else{var e=b.plot.getXAxes()[0],a=Math.min(e.max,a),a=Math.max(e.min,a);c.eq(0).html(UI.format.time(a/1E3))}for(var f in b.datasets){var g=" ";if(b.datasets[f].display){var e=UI.plot.yaxes[b.datasets[f].yaxistype].tickFormatter,i=b.datasets[f].data;if(a)for(var l in i){if(i[l][0]==a){g=e(i[l][1]);break}if(i[l][0]>a){if(l!=0){g=i[l];i=i[l-1];g=e(g[1]+(a-g[0])*(i[1]-g[1])/(i[0]-g[0]))}break}}else g=e(b.datasets[f].data[b.datasets[f].data.length-1][1])}c.eq(d).html(g);d++}};b.plot.getOptions(); | ||||
| for(n in b.datasets)e=$("<input>").attr("type","checkbox").data("index",n).data("graph",b).click(function(){var a=$(this).data("graph");$(this).is(":checked")?a.datasets[$(this).data("index")].display=true:a.datasets[$(this).data("index")].display=false;var c={};c[a.id]=a;UI.plot.go(c)}),b.datasets[n].display&&e.attr("checked","checked"),d.append($("<tr>").html($("<td>").html($("<label>").html(e).append($("<div>").addClass("series-color").css("background-color",b.datasets[n].color)).append(b.datasets[n].label))).append($("<td>").css("padding-right", | ||||
| "2em").css("text-align","right").html($("<span>").addClass("value")).append($("<button>").text("X").addClass("close").data("index",n).data("graph",b).click(function(){var c=$(this).data("index"),b=$(this).data("graph");if(confirm("Are you sure you want to remove "+b.datasets[c].label+" from "+b.id+"?")){b.datasets.splice(c,1);if(b.datasets.length==0){b.elements.cont.remove();var c=$(".graph_ids option:contains("+b.id+")"),d=c.parent();c.remove();d.trigger("change");UI.plot.del(b.id);delete a[b.id]; | ||||
| UI.plot.go(a)}else{UI.plot.save(b);c={};c[b.id]=b;UI.plot.go(c)}}}))));l();var g=!1;b.elements.plot.on("plothover",function(a,c,b){if(c.x!=g){l(c.x);g=c.x}if(b){a=$("<span>").append($("<h3>").text(b.series.label).prepend($("<div>").addClass("series-color").css("background-color",b.series.color))).append($("<table>").addClass("nolay").html($("<tr>").html($("<td>").text("Time:")).append($("<td>").html(UI.format.dateTime(b.datapoint[0]/1E3,"long")))).append($("<tr>").html($("<td>").text("Value:")).append($("<td>").html(b.series.yaxis.tickFormatter(b.datapoint[1], | ||||
| b.series.yaxis)))));UI.tooltip.show(c,a.children())}else UI.tooltip.hide()}).on("mouseout",function(){l()})}}},c)}},save:function(a){var c={id:a.id,xaxis:a.xaxis,datasets:[]},e;for(e in a.datasets)c.datasets.push({origin:a.datasets[e].origin,datatype:a.datasets[e].datatype});a=mist.stored.get().graphs||{};a[c.id]=c;mist.stored.set("graphs",a)},del:function(a){var c=mist.stored.get().graphs||{};delete c[a];mist.stored.set("graphs",c)},datatype:{getOptions:function(a){var c=$.extend(!0,{},UI.plot.datatype.templates.general), | ||||
| e=$.extend(!0,{},UI.plot.datatype.templates[a.datatype]),a=$.extend(!0,e,a),a=$.extend(!0,c,a);switch(a.origin[0]){case "total":switch(a.datatype){case "cpuload":case "memload":break;default:a.label+=" (total)"}break;case "stream":case "protocol":a.label+=" ("+a.origin[1]+")"}var c=[],b;for(b in a.basecolor)e=a.basecolor[b],e+=50*(0.5-Math.random()),e=Math.round(e),e=Math.min(255,Math.max(0,e)),c.push(e);a.color="rgb("+c.join(",")+")";return a},templates:{general:{display:!0,datatype:"general",label:"", | ||||
| yaxistype:"amount",data:[],lines:{show:!0},points:{show:!1},getdata:function(){var a=mist.data.totals["stream"==this.origin[0]?this.origin[1]:"all_streams"]["protocol"==this.origin[0]?this.origin[1]:"all_protocols"][this.datatype];return this.data=a}},cpuload:{label:"CPU use",yaxistype:"percentage",basecolor:[237,194,64],cores:1,getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time-600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time, | ||||
| mist.data.capabilities.cpu_use/10]);return this.data}},memload:{label:"Memory load",yaxistype:"percentage",basecolor:[175,216,248],getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time-600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time,mist.data.capabilities.load.memory]);return this.data}},clients:{label:"Connections",basecolor:[203,75,75]},upbps:{label:"Bandwidth up",yaxistype:"bytespersec",basecolor:[77,167,77]},downbps:{label:"Bandwidth down", | ||||
| yaxistype:"bytespersec",basecolor:[148,64,237]}}},yaxes:{percentage:{name:"percentage",color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.addUnit(UI.format.number(a),"%")},tickLength:0,min:0,max:100},amount:{name:"amount",color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.number(a)},tickLength:0,min:0},bytespersec:{name:"bytespersec",color:"black",tickColor:0,tickDecimals:1,tickFormatter:function(a){return UI.format.bytes(a,!0)},tickLength:0, | ||||
| ticks:function(a){var c=0.3*Math.sqrt($(".graph").first().height()),c=(a.max-a.min)/c,e=Math.floor(Math.log(Math.abs(c))/Math.log(1024)),b=c/Math.pow(1024,e),d=-Math.floor(Math.log(b)/Math.LN10),i=a.tickDecimals;null!=i&&d>i&&(d=i);var m=Math.pow(10,-d),b=b/m,f;if(1.5>b)f=1;else if(3>b){if(f=2,2.25<b&&(null==i||d+1<=i))f=2.5,++d}else f=7.5>b?5:10;f=f*m*Math.pow(1024,e);null!=a.minTickSize&&f<a.minTickSize&&(f=a.minTickSize);a.delta=c;a.tickDecimals=Math.max(0,null!=i?i:d);a.tickSize=f;c=[];e=a.tickSize* | ||||
| Math.floor(a.min/a.tickSize);d=0;i=Number.NaN;do m=i,i=e+d*a.tickSize,c.push(i),++d;while(i<a.max&&i!=m);return c},min:0}},xaxes:{time:{name:"time",mode:"time",timezone:"browser",ticks:5}}},draggable:function(a){a.attr("draggable",!0);a.on("dragstart",function(a){$(this).css("opacity",0.4).data("dragstart",{click:{x:a.originalEvent.pageX,y:a.originalEvent.pageY},ele:{x:this.offsetLeft,y:this.offsetTop}})}).on("dragend",function(a){var e=$(this).data("dragstart"),b=e.ele.x-e.click.x+a.originalEvent.pageX, | ||||
| a=e.ele.y-e.click.y+a.originalEvent.pageY;$(this).css({opacity:1,top:a,left:b,right:"auto",bottom:"auto"})});a.parent().on("dragleave",function(){})},format:{time:function(a,c){var e=new Date(1E3*a),b=[];b.push(("0"+e.getHours()).slice(-2));b.push(("0"+e.getMinutes()).slice(-2));"short"!=c&&b.push(("0"+e.getSeconds()).slice(-2));return b.join(":")},date:function(a,c){var e=new Date(1E3*a),b="Sun Mon Tue Wed Thu Fri Sat".split(" "),d=[];"long"==c&&d.push(b[e.getDay()]);d.push(("0"+e.getDate()).slice(-2)); | ||||
| d.push("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")[e.getMonth()]);"short"!=c&&d.push(e.getFullYear());return d.join(" ")},dateTime:function(a,c){return UI.format.date(a,c)+", "+UI.format.time(a,c)},duration:function(a){var c=[0.001,1E3,60,60,24,7,1E9],e="ms sec min hr day week".split(" "),b={},d;for(d in e){var a=a/c[d],i=Math.round(a%c[Number(d)+1]);b[e[d]]=i;a-=i}var m;for(d=e.length-1;0<=d;d--)if(0<b[e[d]]){m=e[d];break}c=$("<span>");switch(m){case "week":c.append(UI.format.addUnit(b.week, | ||||
| "wks, ")).append(UI.format.addUnit(b.day,"days"));break;case "day":c.append(UI.format.addUnit(b.day,"days, ")).append(UI.format.addUnit(b.hr,"hrs"));break;default:c.append([("0"+b.hr).slice(-2),("0"+b.min).slice(-2),("0"+b.sec).slice(-2)+(b.ms?"."+b.ms:"")].join(":"))}return c[0].innerHTML},number:function(a){if(isNaN(Number(a))||0==a)return a;var c=Math.pow(10,3-Math.floor(Math.log(a)/Math.LN10)-1),a=Math.round(a*c)/c;if(1E4<a){number=a.toString().split(".");for(a=/(\d+)(\d{3})/;a.test(number[0]);)number[0]= | ||||
| number[0].replace(a,"$1 $2");a=number.join(".")}return a},status:function(a){var c=$("<span>");if("undefined"==typeof a.online)return c.text("Unknown, checking.."),"undefined"!=typeof a.error&&c.text(a.error),c;switch(a.online){case -1:c.text("Enabling");break;case 0:c.text("Unavailable").addClass("red");break;case 1:c.text("Active").addClass("green");break;case 2:c.text("Standby").addClass("orange");break;default:c.text(a.online)}"error"in a&&c.text(a.error);return c},capital:function(a){return a.charAt(0).toUpperCase()+ | ||||
| a.substring(1)},addUnit:function(a,c){var e=$("<span>").html(a);e.append($("<span>").addClass("unit").html(c));return e[0].innerHTML},bytes:function(a,c){var e="bytes KiB MiB GiB TiB PiB".split(" ");if(0==a)unit=e[0];else{var b=Math.floor(Math.log(Math.abs(a))/Math.log(1024));0>b?unit=e[0]:(a/=Math.pow(1024,b),unit=e[b])}return UI.format.addUnit(UI.format.number(a),unit+(c?"/s":""))}},navto:function(a,c){var e=location.hash,b=e.split("@");b[0]=[mist.user.name,mist.user.host].join("&");b[1]=[a,c].join("&"); | ||||
| "undefined"!=typeof screenlog&&screenlog.navto(b[1]);location.hash=b.join("@");location.hash==e&&$(window).trigger("hashchange")},showTab:function(a,c){var e,b,d=UI.elements.main;if(mist.user.loggedin&&!("ui_settings"in mist.data))d.html("Loading.."),mist.send(function(){UI.showTab(a,c)},{ui_settings:!0});else switch(e=UI.elements.menu.css("opacity","1").find(".button").filter(function(){if($(this).find(".plain").text()==a)return!0}),0<e.length&&(UI.elements.menu.find(".button.active").removeClass("active"), | ||||
| e.addClass("active")),UI.elements.secondary_menu.html(""),UI.interval.clear(),d.html($("<h2>").text(a)),a){case "Login":if(mist.user.loggedin){UI.navto("Overview");break}UI.elements.menu.css("opacity","0");UI.elements.connection.status.text("Disconnected").removeClass("green").addClass("red");d.append(UI.buildUI([{type:"help",help:"Please provide your account details.<br>You were asked to set these when MistController was started for the first time. If you did not yet set any account details, log in with your desired credentials to create a new account."}, | ||||
| {label:"Host",help:"Url location of the MistServer API. Generally located at http://MistServerIP:4242/api","default":"http://localhost:4242/api",pointer:{main:mist.user,index:"host"}},{label:"Username",help:"Please enter your username here.",validate:["required"],pointer:{main:mist.user,index:"name"}},{label:"Password",type:"password",help:"Please enter your password here.",validate:["required"],pointer:{main:mist.user,index:"password"}},{type:"buttons",buttons:[{label:"Login",type:"save","function":function(){mist.send(function(){UI.navto("Overview")})}}]}])); | ||||
| break;case "Create a new account":UI.elements.menu.css("visibility","hidden");d.append($("<p>").text("No account has been created yet in the MistServer at ").append($("<i>").text(mist.user.host)).append("."));d.append(UI.buildUI([{type:"buttons",buttons:[{label:"Select other host",type:"cancel",css:{"float":"left"},"function":function(){UI.navto("Login")}}]},{type:"custom",custom:$("<br>")},{label:"Desired username",type:"str",validate:["required"],help:"Enter your desired username. In the future, you will need this to access the Management Interface.", | ||||
| pointer:{main:mist.user,index:"name"}},{label:"Desired password",type:"password",validate:["required",function(a,c){$(".match_password").not($(c)).trigger("change");return false}],help:"Enter your desired password. In the future, you will need this to access the Management Interface.",pointer:{main:mist.user,index:"password"},classes:["match_password"]},{label:"Repeat password",type:"password",validate:["required",function(a,c){return a!=$(".match_password").not($(c)).val()?{msg:'The fields "Desired password" and "Repeat password" do not match.', | ||||
| b);"pointer"in b&&d.attr("name",b.pointer.index);f.append(d);if("classes"in b)for(i in b.classes)d.addClass(b.classes[i]);"placeholder"in b&&d.attr("placeholder",b.placeholder);"default"in b&&d.attr("placeholder",b["default"]);"unit"in b&&f.append($("<span>").addClass("unit").html(b.unit));"readonly"in b&&(d.attr("readonly","readonly"),d.click(function(){$(this).select()}));"qrcode"in b&&f.append($("<span>").addClass("unit").html($("<button>").text("QR").on("keydown",function(a){a.stopPropagation()}).click(function(){var a= | ||||
| String($(this).closest(".field_container").find(".field").getval()),c=$("<div>").addClass("qrcode");UI.popup.show($("<span>").addClass("qr_container").append($("<p>").text(a)).append(c));c.qrcode({text:a,size:Math.min(c.width(),c.height())})})));"rows"in b&&d.attr("rows",b.rows);"LTSonly"in b&&!mist.data.LTS&&(f.addClass("LTSonly"),d.prop("disabled",!0));switch(b.type){case "browse":n=$("<div>").addClass("grouper").append(m);c.append(n);n=$("<button>").text("Browse").on("keydown",function(a){a.stopPropagation()}); | ||||
| f.append(n);n.click(function(){function a(c){i.text("Loading..");mist.send(function(a){f.text(a.browse.path[0]);i.html(n.clone(true).text("..").attr("title","Folder up"));if(a.browse.subdirectories){a.browse.subdirectories.sort();for(var c in a.browse.subdirectories){var m=a.browse.subdirectories[c];i.append(n.clone(true).attr("title",f.text()+o+m).text(m))}}if(a.browse.files){a.browse.files.sort();for(c in a.browse.files){var m=a.browse.files[c],l=f.text()+o+m,m=$("<a>").text(m).addClass("file").attr("title", | ||||
| l);i.append(m);if(p){var s=true,v;for(v in p)if(typeof p[v]!="undefined"&&mist.inputMatch(p[v],l)){s=false;break}s&&m.hide()}m.click(function(){var a=$(this).attr("title");d.setval(a);e.show();b.remove()})}}},{browse:c})}var c=$(this).closest(".grouper"),b=$("<div>").addClass("browse_container"),d=c.find(".field"),e=$(this),f=$("<span>").addClass("field"),m=$("<button>").text("Select this folder").on("keydown",function(a){a.stopPropagation()}),i=$("<div>").addClass("browse_contents"),n=$("<a>").addClass("folder"), | ||||
| p=d.data("filetypes");c.append(b);b.append($("<label>").addClass("UIelement").append($("<span>").addClass("label").text("Current folder:")).append($("<span>").addClass("field_container").append(f).append(m))).append(i);m.click(function(){var a=f.text()+"/";d.setval(a);e.show();b.remove()});var o="/";mist.data.config.version.indexOf("indows")>-1&&(o="\\");n.click(function(){var c=f.text()+o+$(this).text();a(c)});c=d.getval();c=c.split(o);c.pop();c=c.join(o);e.hide();a(c)});break;case "geolimited":case "hostlimited":n= | ||||
| {field:d};n.blackwhite=$("<select>").append($("<option>").val("-").text("Blacklist")).append($("<option>").val("+").text("Whitelist"));n.values=$("<span>").addClass("limit_value_list");switch(b.type){case "geolimited":n.prototype=$("<select>").append($("<option>").val("").text("[Select a country]"));for(e in UI.countrylist)n.prototype.append($("<option>").val(e).html(UI.countrylist[e]));break;case "hostlimited":n.prototype=$("<input>").attr("type","text").attr("placeholder","type a host")}n.prototype.on("change keyup", | ||||
| function(){$(this).closest(".field_container").data("subUI").blackwhite.trigger("change")});n.blackwhite.change(function(){var a=$(this).closest(".field_container").data("subUI"),c=[],b=false;a.values.children().each(function(){b=$(this).val();b!=""?c.push(b):$(this).remove()});a.values.append(a.prototype.clone(true));c.length>0?a.field.val($(this).val()+c.join(" ")):a.field.val("");a.field.trigger("change")});"LTSonly"in b&&!mist.data.LTS&&(n.blackwhite.prop("disabled",!0),n.prototype.prop("disabled", | ||||
| !0));n.values.append(n.prototype.clone(!0));f.data("subUI",n).addClass("limit_list").append(n.blackwhite).append(n.values)}"pointer"in b&&(d.data("pointer",b.pointer).addClass("isSetting"),n=b.pointer.main[b.pointer.index],"undefined"!=n&&d.setval(n));"value"in b&&d.setval(b.value);if("datalist"in b)for(e in n="datalist_"+e+MD5(d[0].outerHTML),d.attr("list",n),n=$("<datalist>").attr("id",n),f.append(n),b.datalist)n.append($("<option>").val(b.datalist[e]));f=$("<span>").addClass("help_container"); | ||||
| m.append(f);"help"in b&&(f.append($("<span>").addClass("ih_balloon").html(b.help)),d.on("focus mouseover",function(){$(this).closest("label").addClass("active")}).on("blur mouseout",function(){$(this).closest("label").removeClass("active")}));if("validate"in b){m=[];for(i in b.validate){n=b.validate[i];if("function"!=typeof n)switch(n){case "required":n=function(a){return a==""?{msg:"This is a required field.",classes:["red"]}:false};break;case "int":n=function(a,c){var b=$(c).data("opts");if(!$(c)[0].validity.valid){var d= | ||||
| [];"min"in b&&d.push(" greater than or equal to "+b.min);"max"in b&&d.push(" smaller than or equal to "+b.max);return{msg:"Please enter an integer"+d.join(" and")+".",classes:["red"]}}if(parseInt(Number(a))!=a)return{msg:"Please enter an integer.",classes:["red"]}};break;case "streamname":n=function(a,c){if(!isNaN(a.charAt(0)))return{msg:"The first character may not be a number.",classes:["red"]};if(a.toLowerCase()!=a)return{msg:"Uppercase letters are not allowed.",classes:["red"]};if(a.replace(/[^\da-z_]/g, | ||||
| "")!=a)return{msg:"Special characters (except for underscores) are not allowed.",classes:["red"]};if("streams"in mist.data&&a in mist.data.streams&&$(c).data("pointer").main.name!=a)return{msg:"This streamname already exists.<br>If you want to edit an existing stream, please click edit on the the streams tab.",classes:["red"]}};break;default:n=function(){}}m.push(n)}d.data("validate_functions",m).data("help_container",f).data("validate",function(a,c){var b=$(a).getval(),d=$(a).data("validate_functions"), | ||||
| e=$(a).data("help_container");e.find(".err_balloon").remove();for(var f in d){var m=d[f](b,a);if(m){$err=$("<span>").addClass("err_balloon").html(m.msg);for(var i in m.classes)$err.addClass(m.classes[i]);e.prepend($err);c&&$(a).focus();return true}}return false}).addClass("hasValidate").on("change keyup",function(){$(this).data("validate")($(this))});""!=d.getval()&&d.trigger("change")}"function"in b&&(d.on("change keyup",b["function"]),d.trigger("change"))}}c.on("keydown",function(a){switch(a.which){case 13:$(this).find("button.save").trigger("click"); | ||||
| break;case 27:$(this).find("button.cancel").trigger("click")}});return c},buildVheaderTable:function(a){var c=$("<table>").css("margin","0.2em"),e=$("<tr>").addClass("header").append($("<td>").addClass("vheader").attr("rowspan",a.labels.length+1).append($("<span>").text(a.vheader))),b=[];e.append($("<td>"));for(var d in a.labels)b.push($("<tr>").append($("<td>").html(""==a.labels[d]?" ":a.labels[d]+":")));for(var i in a.content)for(d in e.append($("<td>").html(a.content[i].header)),a.content[i].body)b[d].append($("<td>").html(a.content[i].body[d])); | ||||
| c.append($("<tbody>").append(e).append(b));return c},plot:{addGraph:function(a,c){var e={id:a.id,xaxis:a.xaxis,datasets:[],elements:{cont:$("<div>").addClass("graph"),plot:$("<div>").addClass("plot"),legend:$("<div>").addClass("legend").attr("draggable","true")}};UI.draggable(e.elements.legend);e.elements.cont.append(e.elements.plot).append(e.elements.legend);c.append(e.elements.cont);return e},go:function(a){if(!(1>Object.keys(a).length)){var c={totals:[],clients:[]},e;for(e in a)for(var b in a[e].datasets){var d= | ||||
| a[e].datasets[b];switch(d.datatype){case "clients":case "upbps":case "downbps":switch(d.origin[0]){case "total":c.totals.push({fields:[d.datatype],end:-15});break;case "stream":c.totals.push({fields:[d.datatype],streams:[d.origin[1]],end:-15});break;case "protocol":c.totals.push({fields:[d.datatype],protocols:[d.origin[1]],end:-15})}break;case "cpuload":case "memload":c.capabilities={}}}0==c.totals.length&&delete c.totals;0==c.clients.length&&delete c.clients;mist.send(function(){for(var c in a){var b= | ||||
| a[c];if(1>b.datasets.length){b.elements.plot.html("");b.elements.legend.html("");break}switch(b.xaxis){case "time":var d=[];b.yaxes={};var e=[],n;for(n in b.datasets){var s=b.datasets[n];s.display&&(s.getdata(),s.yaxistype in b.yaxes||(d.push(UI.plot.yaxes[s.yaxistype]),b.yaxes[s.yaxistype]=d.length),s.yaxis=b.yaxes[s.yaxistype],e.push(s))}d[0]&&(d[0].color=0);b.plot=$.plot(b.elements.plot,e,{legend:{show:!1},xaxis:UI.plot.xaxes[b.xaxis],yaxes:d,grid:{hoverable:!0,borderWidth:{top:0,right:0,bottom:1, | ||||
| left:1},color:"black",backgroundColor:{colors:["rgba(0,0,0,0)","rgba(0,0,0,0.025)"]}},crosshair:{mode:"x"}});d=$("<table>").addClass("legend-list").addClass("nolay").html($("<tr>").html($("<td>").html($("<h3>").text(b.id))).append($("<td>").css("padding-right","2em").css("text-align","right").html($("<span>").addClass("value")).append($("<button>").data("opts",b).text("X").addClass("close").click(function(){var c=$(this).data("opts");if(confirm("Are you sure you want to remove "+c.id+"?")){c.elements.cont.remove(); | ||||
| var b=$(".graph_ids option:contains("+c.id+")"),d=b.parent();b.remove();UI.plot.del(c.id);delete a[c.id];d.trigger("change");UI.plot.go(a)}}))));b.elements.legend.html(d);var l=function(a){var c=b.elements.legend.find(".value"),d=1;if(typeof a=="undefined")c.eq(0).html("Latest:");else{var e=b.plot.getXAxes()[0],a=Math.min(e.max,a),a=Math.max(e.min,a);c.eq(0).html(UI.format.time(a/1E3))}for(var f in b.datasets){var g=" ";if(b.datasets[f].display){var e=UI.plot.yaxes[b.datasets[f].yaxistype].tickFormatter, | ||||
| i=b.datasets[f].data;if(a)for(var l in i){if(i[l][0]==a){g=e(i[l][1]);break}if(i[l][0]>a){if(l!=0){g=i[l];i=i[l-1];g=e(g[1]+(a-g[0])*(i[1]-g[1])/(i[0]-g[0]))}break}}else g=e(b.datasets[f].data[b.datasets[f].data.length-1][1])}c.eq(d).html(g);d++}};b.plot.getOptions();for(n in b.datasets)e=$("<input>").attr("type","checkbox").data("index",n).data("graph",b).click(function(){var a=$(this).data("graph");$(this).is(":checked")?a.datasets[$(this).data("index")].display=true:a.datasets[$(this).data("index")].display= | ||||
| false;var c={};c[a.id]=a;UI.plot.go(c)}),b.datasets[n].display&&e.attr("checked","checked"),d.append($("<tr>").html($("<td>").html($("<label>").html(e).append($("<div>").addClass("series-color").css("background-color",b.datasets[n].color)).append(b.datasets[n].label))).append($("<td>").css("padding-right","2em").css("text-align","right").html($("<span>").addClass("value")).append($("<button>").text("X").addClass("close").data("index",n).data("graph",b).click(function(){var c=$(this).data("index"), | ||||
| b=$(this).data("graph");if(confirm("Are you sure you want to remove "+b.datasets[c].label+" from "+b.id+"?")){b.datasets.splice(c,1);if(b.datasets.length==0){b.elements.cont.remove();var c=$(".graph_ids option:contains("+b.id+")"),d=c.parent();c.remove();d.trigger("change");UI.plot.del(b.id);delete a[b.id];UI.plot.go(a)}else{UI.plot.save(b);c={};c[b.id]=b;UI.plot.go(c)}}}))));l();var g=!1;b.elements.plot.on("plothover",function(a,c,b){if(c.x!=g){l(c.x);g=c.x}if(b){a=$("<span>").append($("<h3>").text(b.series.label).prepend($("<div>").addClass("series-color").css("background-color", | ||||
| b.series.color))).append($("<table>").addClass("nolay").html($("<tr>").html($("<td>").text("Time:")).append($("<td>").html(UI.format.dateTime(b.datapoint[0]/1E3,"long")))).append($("<tr>").html($("<td>").text("Value:")).append($("<td>").html(b.series.yaxis.tickFormatter(b.datapoint[1],b.series.yaxis)))));UI.tooltip.show(c,a.children())}else UI.tooltip.hide()}).on("mouseout",function(){l()})}}},c)}},save:function(a){var c={id:a.id,xaxis:a.xaxis,datasets:[]},e;for(e in a.datasets)c.datasets.push({origin:a.datasets[e].origin, | ||||
| datatype:a.datasets[e].datatype});a=mist.stored.get().graphs||{};a[c.id]=c;mist.stored.set("graphs",a)},del:function(a){var c=mist.stored.get().graphs||{};delete c[a];mist.stored.set("graphs",c)},datatype:{getOptions:function(a){var c=$.extend(!0,{},UI.plot.datatype.templates.general),e=$.extend(!0,{},UI.plot.datatype.templates[a.datatype]),a=$.extend(!0,e,a),a=$.extend(!0,c,a);switch(a.origin[0]){case "total":switch(a.datatype){case "cpuload":case "memload":break;default:a.label+=" (total)"}break; | ||||
| case "stream":case "protocol":a.label+=" ("+a.origin[1]+")"}var c=[],b;for(b in a.basecolor)e=a.basecolor[b],e+=50*(0.5-Math.random()),e=Math.round(e),e=Math.min(255,Math.max(0,e)),c.push(e);a.color="rgb("+c.join(",")+")";return a},templates:{general:{display:!0,datatype:"general",label:"",yaxistype:"amount",data:[],lines:{show:!0},points:{show:!1},getdata:function(){var a=mist.data.totals["stream"==this.origin[0]?this.origin[1]:"all_streams"]["protocol"==this.origin[0]?this.origin[1]:"all_protocols"][this.datatype]; | ||||
| return this.data=a}},cpuload:{label:"CPU use",yaxistype:"percentage",basecolor:[237,194,64],cores:1,getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time-600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time,mist.data.capabilities.cpu_use/10]);return this.data}},memload:{label:"Memory load",yaxistype:"percentage",basecolor:[175,216,248],getdata:function(){var a=!1,c;for(c in this.data)this.data[c][0]<1E3*(mist.data.config.time- | ||||
| 600)&&(a=c);!1!==a&&this.data.splice(0,Number(a)+1);this.data.push([1E3*mist.data.config.time,mist.data.capabilities.load.memory]);return this.data}},clients:{label:"Connections",basecolor:[203,75,75]},upbps:{label:"Bandwidth up",yaxistype:"bytespersec",basecolor:[77,167,77]},downbps:{label:"Bandwidth down",yaxistype:"bytespersec",basecolor:[148,64,237]}}},yaxes:{percentage:{name:"percentage",color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.addUnit(UI.format.number(a), | ||||
| "%")},tickLength:0,min:0,max:100},amount:{name:"amount",color:"black",tickColor:0,tickDecimals:0,tickFormatter:function(a){return UI.format.number(a)},tickLength:0,min:0},bytespersec:{name:"bytespersec",color:"black",tickColor:0,tickDecimals:1,tickFormatter:function(a){return UI.format.bytes(a,!0)},tickLength:0,ticks:function(a){var c=0.3*Math.sqrt($(".graph").first().height()),c=(a.max-a.min)/c,e=Math.floor(Math.log(Math.abs(c))/Math.log(1024)),b=c/Math.pow(1024,e),d=-Math.floor(Math.log(b)/Math.LN10), | ||||
| i=a.tickDecimals;null!=i&&d>i&&(d=i);var m=Math.pow(10,-d),b=b/m,f;if(1.5>b)f=1;else if(3>b){if(f=2,2.25<b&&(null==i||d+1<=i))f=2.5,++d}else f=7.5>b?5:10;f=f*m*Math.pow(1024,e);null!=a.minTickSize&&f<a.minTickSize&&(f=a.minTickSize);a.delta=c;a.tickDecimals=Math.max(0,null!=i?i:d);a.tickSize=f;c=[];e=a.tickSize*Math.floor(a.min/a.tickSize);d=0;i=Number.NaN;do m=i,i=e+d*a.tickSize,c.push(i),++d;while(i<a.max&&i!=m);return c},min:0}},xaxes:{time:{name:"time",mode:"time",timezone:"browser",ticks:5}}}, | ||||
| draggable:function(a){a.attr("draggable",!0);a.on("dragstart",function(a){$(this).css("opacity",0.4).data("dragstart",{click:{x:a.originalEvent.pageX,y:a.originalEvent.pageY},ele:{x:this.offsetLeft,y:this.offsetTop}})}).on("dragend",function(a){var e=$(this).data("dragstart"),b=e.ele.x-e.click.x+a.originalEvent.pageX,a=e.ele.y-e.click.y+a.originalEvent.pageY;$(this).css({opacity:1,top:a,left:b,right:"auto",bottom:"auto"})});a.parent().on("dragleave",function(){})},format:{time:function(a,c){var e= | ||||
| new Date(1E3*a),b=[];b.push(("0"+e.getHours()).slice(-2));b.push(("0"+e.getMinutes()).slice(-2));"short"!=c&&b.push(("0"+e.getSeconds()).slice(-2));return b.join(":")},date:function(a,c){var e=new Date(1E3*a),b="Sun Mon Tue Wed Thu Fri Sat".split(" "),d=[];"long"==c&&d.push(b[e.getDay()]);d.push(("0"+e.getDate()).slice(-2));d.push("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")[e.getMonth()]);"short"!=c&&d.push(e.getFullYear());return d.join(" ")},dateTime:function(a,c){return UI.format.date(a, | ||||
| c)+", "+UI.format.time(a,c)},duration:function(a){var c=[0.001,1E3,60,60,24,7,1E9],e="ms sec min hr day week".split(" "),b={},d;for(d in e){var a=a/c[d],i=Math.round(a%c[Number(d)+1]);b[e[d]]=i;a-=i}var m;for(d=e.length-1;0<=d;d--)if(0<b[e[d]]){m=e[d];break}c=$("<span>");switch(m){case "week":c.append(UI.format.addUnit(b.week,"wks, ")).append(UI.format.addUnit(b.day,"days"));break;case "day":c.append(UI.format.addUnit(b.day,"days, ")).append(UI.format.addUnit(b.hr,"hrs"));break;default:c.append([("0"+ | ||||
| b.hr).slice(-2),("0"+b.min).slice(-2),("0"+b.sec).slice(-2)+(b.ms?"."+b.ms:"")].join(":"))}return c[0].innerHTML},number:function(a){if(isNaN(Number(a))||0==a)return a;var c=Math.pow(10,3-Math.floor(Math.log(a)/Math.LN10)-1),a=Math.round(a*c)/c;if(1E4<a){number=a.toString().split(".");for(a=/(\d+)(\d{3})/;a.test(number[0]);)number[0]=number[0].replace(a,"$1 $2");a=number.join(".")}return a},status:function(a){var c=$("<span>");if("undefined"==typeof a.online)return c.text("Unknown, checking.."),"undefined"!= | ||||
| typeof a.error&&c.text(a.error),c;switch(a.online){case -1:c.text("Enabling");break;case 0:c.text("Unavailable").addClass("red");break;case 1:c.text("Active").addClass("green");break;case 2:c.text("Standby").addClass("orange");break;default:c.text(a.online)}"error"in a&&c.text(a.error);return c},capital:function(a){return a.charAt(0).toUpperCase()+a.substring(1)},addUnit:function(a,c){var e=$("<span>").html(a);e.append($("<span>").addClass("unit").html(c));return e[0].innerHTML},bytes:function(a, | ||||
| c){var e="bytes KiB MiB GiB TiB PiB".split(" ");if(0==a)unit=e[0];else{var b=Math.floor(Math.log(Math.abs(a))/Math.log(1024));0>b?unit=e[0]:(a/=Math.pow(1024,b),unit=e[b])}return UI.format.addUnit(UI.format.number(a),unit+(c?"/s":""))}},navto:function(a,c){var e=location.hash,b=e.split("@");b[0]=[mist.user.name,mist.user.host].join("&");b[1]=[a,c].join("&");"undefined"!=typeof screenlog&&screenlog.navto(b[1]);location.hash=b.join("@");location.hash==e&&$(window).trigger("hashchange")},showTab:function(a, | ||||
| c){var e,b,d=UI.elements.main;if(mist.user.loggedin&&!("ui_settings"in mist.data))d.html("Loading.."),mist.send(function(){UI.showTab(a,c)},{ui_settings:!0});else switch(e=UI.elements.menu.css("opacity","1").find(".button").filter(function(){if($(this).find(".plain").text()==a)return!0}),0<e.length&&(UI.elements.menu.find(".button.active").removeClass("active"),e.addClass("active")),UI.elements.secondary_menu.html(""),UI.interval.clear(),d.html($("<h2>").text(a)),a){case "Login":if(mist.user.loggedin){UI.navto("Overview"); | ||||
| break}UI.elements.menu.css("opacity","0");UI.elements.connection.status.text("Disconnected").removeClass("green").addClass("red");d.append(UI.buildUI([{type:"help",help:"Please provide your account details.<br>You were asked to set these when MistController was started for the first time. If you did not yet set any account details, log in with your desired credentials to create a new account."},{label:"Host",help:"Url location of the MistServer API. Generally located at http://MistServerIP:4242/api", | ||||
| "default":"http://localhost:4242/api",pointer:{main:mist.user,index:"host"}},{label:"Username",help:"Please enter your username here.",validate:["required"],pointer:{main:mist.user,index:"name"}},{label:"Password",type:"password",help:"Please enter your password here.",validate:["required"],pointer:{main:mist.user,index:"password"}},{type:"buttons",buttons:[{label:"Login",type:"save","function":function(){mist.send(function(){UI.navto("Overview")})}}]}]));break;case "Create a new account":UI.elements.menu.css("visibility", | ||||
| "hidden");d.append($("<p>").text("No account has been created yet in the MistServer at ").append($("<i>").text(mist.user.host)).append("."));d.append(UI.buildUI([{type:"buttons",buttons:[{label:"Select other host",type:"cancel",css:{"float":"left"},"function":function(){UI.navto("Login")}}]},{type:"custom",custom:$("<br>")},{label:"Desired username",type:"str",validate:["required"],help:"Enter your desired username. In the future, you will need this to access the Management Interface.",pointer:{main:mist.user, | ||||
| index:"name"}},{label:"Desired password",type:"password",validate:["required",function(a,c){$(".match_password").not($(c)).trigger("change");return false}],help:"Enter your desired password. In the future, you will need this to access the Management Interface.",pointer:{main:mist.user,index:"password"},classes:["match_password"]},{label:"Repeat password",type:"password",validate:["required",function(a,c){return a!=$(".match_password").not($(c)).val()?{msg:'The fields "Desired password" and "Repeat password" do not match.', | ||||
| classes:["red"]}:false}],help:"Repeat your desired password.",classes:["match_password"]},{type:"buttons",buttons:[{type:"save",label:"Create new account","function":function(){mist.send(function(){UI.navto("Account created")},{authorize:{new_username:mist.user.name,new_password:mist.user.password}})}}]}]));break;case "Account created":UI.elements.menu.css("visibility","hidden");d.append($("<p>").text("Your account has been created succesfully.")).append(UI.buildUI([{type:"text",text:"Would you like to enable all (currently) available protocols with their default settings?"}, | ||||
| {type:"buttons",buttons:[{label:"Enable protocols",type:"save","function":function(){if(mist.data.config.protocols)d.append("Unable to enable all protocols as protocol settings already exist.<br>");else{d.append("Retrieving available protocols..<br>");mist.send(function(a){var c=[],b;for(b in a.capabilities.connectors)if(a.capabilities.connectors[b].required)d.append('Could not enable protocol "'+b+'" because it has required settings.<br>');else{c.push({connector:b});d.append('Enabled protocol "'+ | ||||
| b+'".<br>')}d.append("Saving protocol settings..<br>");mist.send(function(){d.append("Protocols enabled. Redirecting..");setTimeout(function(){UI.navto("Overview")},5E3)},{config:{protocols:c}})},{capabilities:true})}}},{label:"Skip",type:"cancel","function":function(){UI.navto("Overview")}}]}]));break;case "Overview":var i=$("<span>").text("Loading.."),m=$("<span>"),f=$("<span>"),p=$("<span>");d.append(UI.buildUI([{type:"help",help:"You can find most basic information about your MistServer here.<br>You can also set the debug level and force a save to the config.json file that MistServer uses to save your settings. "}, | ||||
|  |  | |||
							
								
								
									
										16
									
								
								lsp/mist.js
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								lsp/mist.js
									
										
									
									
									
								
							|  | @ -307,7 +307,9 @@ var UI = { | |||
|         continue; | ||||
|       } | ||||
|       if (e.type == 'buttons') { | ||||
|         var $bc = $('<span>').addClass('button_container'); | ||||
|         var $bc = $('<span>').addClass('button_container').on('keydown',function(e){ | ||||
|           e.stopPropagation(); | ||||
|         }); | ||||
|         if ('css' in e) { | ||||
|           $bc.css(e.css); | ||||
|         } | ||||
|  | @ -557,7 +559,9 @@ var UI = { | |||
|       if ('qrcode' in e) { | ||||
|         $fc.append( | ||||
|           $('<span>').addClass('unit').html( | ||||
|             $('<button>').text('QR').click(function(){ | ||||
|             $('<button>').text('QR').on('keydown',function(e){ | ||||
|             e.stopPropagation(); | ||||
|           }).click(function(){ | ||||
|               var text = String($(this).closest('.field_container').find('.field').getval()); | ||||
|               var $qr = $('<div>').addClass('qrcode'); | ||||
|               UI.popup.show( | ||||
|  | @ -588,7 +592,9 @@ var UI = { | |||
|           $c.append($master); | ||||
|            | ||||
|            | ||||
|           var $browse_button = $('<button>').text('Browse'); | ||||
|           var $browse_button = $('<button>').text('Browse').on('keydown',function(e){ | ||||
|             e.stopPropagation(); | ||||
|           }); | ||||
|           $fc.append($browse_button); | ||||
|           $browse_button.click(function(){ | ||||
|             var $c = $(this).closest('.grouper'); | ||||
|  | @ -597,7 +603,9 @@ var UI = { | |||
|             var $browse_button = $(this); | ||||
|              | ||||
|             var $path = $('<span>').addClass('field'); | ||||
|             var $choose_folder = $('<button>').text('Select this folder') | ||||
|             var $choose_folder = $('<button>').text('Select this folder').on('keydown',function(e){ | ||||
|               e.stopPropagation(); | ||||
|             }); | ||||
|             var $folder_contents = $('<div>').addClass('browse_contents'); | ||||
|             var $folder = $('<a>').addClass('folder'); | ||||
|             var filetypes = $field.data('filetypes'); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 cat
						cat