fix alerts erroring when you don't have any

reset mod floater status on page bind
alias console.log with log
reduce boilerplate
This commit is contained in:
Azareal 2020-07-23 14:02:16 +10:00
parent afc9f54e5e
commit e814e85daa
15 changed files with 203 additions and 202 deletions

View File

@ -8,7 +8,7 @@ function memStuff(window, document, Chartist) {
if(!chart instanceof Chartist.Line) return;
chart.on('created', function() {
console.log("running created")
log("running created")
const vbits = document.getElementsByClassName("ct-vertical");
if(vbits==null) return;
@ -16,7 +16,7 @@ function memStuff(window, document, Chartist) {
for(let i = 0; i < vbits.length; i++) {
tbits[i] = vbits[i].innerHTML;
}
console.log("tbits",tbits);
log("tbits",tbits);
const calc = (places) => {
if(places==3) return;
@ -47,7 +47,7 @@ function perfStuff(window, document, Chartist) {
if(!chart instanceof Chartist.Line) return;
chart.on('created', function() {
console.log("running created")
log("running created")
const vbits = document.getElementsByClassName("ct-vertical");
if(vbits==null) return;
@ -55,7 +55,7 @@ function perfStuff(window, document, Chartist) {
for(let i = 0; i < vbits.length; i++) {
tbits[i] = vbits[i].innerHTML;
}
console.log("tbits:",tbits);
log("tbits:",tbits);
const calc = (places) => {
if(places==3) return;
@ -122,8 +122,8 @@ function convertPerfUnit(quan, places = 0) {
// TODO: Fully localise this
// TODO: Load rawLabels and seriesData dynamically rather than potentially fiddling with nonces for the CSP?
function buildStatsChart(rawLabels, seriesData, timeRange, legendNames, typ=0) {
console.log("buildStatsChart");
console.log("seriesData",seriesData);
log("buildStatsChart");
log("seriesData",seriesData);
let labels = [];
let aphrases = phraseBox["analytics"];
if(timeRange=="one-year") {
@ -156,19 +156,19 @@ function buildStatsChart(rawLabels, seriesData, timeRange, legendNames, typ=0) {
continue;
}
let date = new Date(rawLabels[i]*1000);
console.log("date", date);
log("date",date);
let minutes = "0" + date.getMinutes();
let label = date.getHours() + ":" + minutes.substr(-2);
console.log("label", label);
log("label",label);
labels.push(label);
}
} else {
for(const i in rawLabels) {
let date = new Date(rawLabels[i]*1000);
console.log("date", date);
log("date",date);
let minutes = "0" + date.getMinutes();
let label = date.getHours() + ":" + minutes.substr(-2);
console.log("label", label);
log("label",label);
labels.push(label);
}
}

View File

@ -25,11 +25,11 @@ function pushNotice(msg) {
// TODO: Write a friendlier error handler which uses a .notice or something, we could have a specialised one for alerts
function ajaxError(xhr,status,e) {
console.log("The AJAX request failed");
console.log("xhr",xhr);
console.log("status",status);
console.log("e",e);
if(status=="parsererror") console.log("The server didn't respond with a valid JSON response");
log("The AJAX request failed");
log("xhr",xhr);
log("status",status);
log("e",e);
if(status=="parsererror") log("The server didn't respond with a valid JSON response");
console.trace();
}
@ -40,7 +40,7 @@ function postLink(ev) {
}
function bindToAlerts() {
console.log("bindToAlerts");
log("bindToAlerts");
$(".alertItem.withAvatar a").unbind("click");
$(".alertItem.withAvatar a").click(function(ev) {
ev.stopPropagation();
@ -93,6 +93,10 @@ function addAlert(msg,notice=false) {
}
function updateAlertList(menuAlerts) {
log("enter updateAlertList");
log("alertList:",alertList);
log("alertMapping:",alertMapping);
log("alertCount:",alertCount);
let alertListNode = menuAlerts.getElementsByClassName("alertList")[0];
let alertCounterNode = menuAlerts.getElementsByClassName("alert_counter")[0];
alertCounterNode.textContent = "0";
@ -119,7 +123,7 @@ function updateAlertList(menuAlerts) {
}
bindToAlerts();
console.log("alertCount",alertCount)
log("alertCount",alertCount)
runInitHook("after_update_alert_list",alertCount);
}
@ -152,7 +156,7 @@ function loadAlerts(menuAlerts,eTc=false) {
if(eTc && lastTc!=0) {
for(var i in data.msgs) wsAlertEvent(data.msgs[i]);
} else {*/
console.log("data",data);
log("data",data);
for(var i in data.msgs) addAlert(data.msgs[i]);
alertCount = data.count;
updateAlertList(menuAlerts);
@ -172,10 +176,10 @@ function loadAlerts(menuAlerts,eTc=false) {
let dat = JSON.parse(magic.responseText);
if("errmsg" in dat) errtxt = dat.errmsg;
} catch(e) {
console.log(magic.responseText);
console.log(e);
log(magic.responseText);
log(e);
}
console.log("er",er);
log("er",er);
setAlertError(menuAlerts,errtxt);
}
});
@ -201,7 +205,7 @@ function SplitN(data,ch,n) {
}
function wsAlertEvent(dat) {
console.log("wsAlertEvent",dat)
log("wsAlertEvent",dat)
addAlert(dat,true);
alertCount++;
@ -222,12 +226,12 @@ function runWebSockets(resume=false) {
conn = new WebSocket("ws"+s+"://" + document.location.host + "/ws/");
conn.onerror = e => {
console.log(e);
log(e);
}
// TODO: Sync alerts, topic list, etc.
conn.onopen = () => {
console.log("The WebSockets connection was opened");
log("The WebSockets connection was opened");
if(resume) conn.send("resume " + document.location.pathname + " " + Math.round((new Date()).getTime() / 1000) + '\r');
else conn.send("page " + document.location.pathname + '\r');
// TODO: Don't ask again, if it's denied. We could have a setting in the UCP which automatically requests this when someone flips desktop notifications on
@ -236,7 +240,7 @@ function runWebSockets(resume=false) {
conn.onclose = () => {
conn = false;
console.log("The WebSockets connection was closed");
log("The WebSockets connection was closed");
let backoff = 0.8;
if(wsBackoff < 0) wsBackoff = 0;
else if(wsBackoff > 12) backoff = 11;
@ -260,12 +264,12 @@ function runWebSockets(resume=false) {
conn.onmessage = (event) => {
if(!noAlerts && event.data[0] == "{") {
console.log("json message");
log("json message");
let data = "";
try {
data = JSON.parse(event.data);
} catch(e) {
console.log(e);
log(e);
return;
}
@ -295,13 +299,13 @@ function runWebSockets(resume=false) {
});
}
} else if("Topics" in data) {
console.log("topic in data");
console.log("data",data);
log("topic in data");
log("data",data);
// TODO: Handle desyncs more gracefully?
// TODO: Send less unneccessary data?
let topic = data.Topics[0];
if(topic===undefined){
console.log("empty topic list");
log("empty topic list");
return;
}
if("mod" in data) {
@ -323,7 +327,7 @@ function runWebSockets(resume=false) {
let node = $(renTopic);
node.addClass("new_item hide_ajax_topic");
console.log("Prepending to topic list");
log("Prepending to topic list");
$(".topic_list").prepend(node);
moreTopicCount++;
@ -333,17 +337,17 @@ function runWebSockets(resume=false) {
block.classList.remove("more_topic_block_initial");
block.classList.add("more_topic_block_active");
console.log("phraseBox",phraseBox);
log("phraseBox",phraseBox);
let msgBox = block.getElementsByClassName("more_topics")[0];
msgBox.innerText = phraseBox["topic_list"]["topic_list.changed_topics"].replace("%d",moreTopicCount);
}
} else console.log("unknown message",data);
} else log("unknown message",data);
}
let messages = event.data.split('\r');
for(var i=0; i<messages.length; i++) {
let message = messages[i];
//console.log("message",message);
//log("message",message);
let msgblocks = SplitN(message," ",3);
if(msgblocks.length < 3) continue;
if(message.startsWith("set ")) {
@ -369,11 +373,11 @@ function getExt(name) {
(() => {
addInitHook("pre_init", () => {
runInitHook("pre_global");
console.log("before notify on alert")
log("before notify on alert")
// We can only get away with this because template_alert has no phrases, otherwise it too would have to be part of the "dance", I miss Go concurrency :(
if(!noAlerts) {
notifyOnScriptW("tmpl_alert", e => {
if(e!=undefined) console.log("failed alert? why?",e)
if(e!=undefined) log("failed alert? why?",e)
}, () => {
if(!Tmpl_alert) throw("tmpl func not found");
addInitHook("after_phrases", () => {
@ -385,17 +389,17 @@ function getExt(name) {
let sAlertMapping = localStorage.getItem("alertMapping");
let sAlertCount = localStorage.getItem("alertCount");
if(sAlertList!=null && sAlertList!="" &&
sAlertMapping!=null && sAlertMapping!="" &&sAlertCount!=null && sAlertCount!=""
sAlertMapping!=null && sAlertMapping!="" &&sAlertCount!=null && sAlertCount!="" && sAlertCount!="0"
) {
console.log("sAlertList",sAlertList)
console.log("sAlertMapping",sAlertMapping)
console.log("sAlertCount",sAlertCount)
log("sAlertList",sAlertList)
log("sAlertMapping",sAlertMapping)
log("sAlertCount",sAlertCount)
alertList = JSON.parse(sAlertList)
alertMapping = JSON.parse(sAlertMapping)
alertCount = parseInt(sAlertCount)
console.log("alertList",alertList)
console.log("alertMapping",alertMapping)
console.log("alertCount",alertCount)
log("alertList",alertList)
log("alertMapping",alertMapping)
log("alertCount",alertCount)
for(var i=0; i<al.length; i++) loadAlerts(al[i],true);
} else for(var i=0; i<al.length; i++) loadAlerts(al[i]);
if(window["WebSocket"]) runWebSockets();
@ -469,12 +473,12 @@ function mainInit(){
ev.preventDefault();
//$(this).unbind("click");
let target = this.closest("a").getAttribute("href");
console.log("target",target);
log("target",target);
let controls = this.closest(".controls");
let hadLikes = controls.classList.contains("has_likes");
let likeCountNode = controls.getElementsByClassName("like_count")[0];
console.log("likeCountNode",likeCountNode);
log("likeCountNode",likeCountNode);
if(this.classList.contains("add_like")) {
this.classList.remove("add_like");
this.classList.add("remove_like");
@ -501,9 +505,9 @@ function mainInit(){
if("success" in dat && dat["success"] == "1") return;
// addNotice("Failed to add a like: {err}")
//likeCountNode.innerHTML = parseInt(likeCountNode.innerHTML)-1;
console.log("data",dat);
console.log("status",status);
console.log("xhr",xhr);
log("data",dat);
log("status",status);
log("xhr",xhr);
}
});
});
@ -553,7 +557,7 @@ function mainInit(){
}).then(dat => {
if(!"Topics" in dat) throw("no Topics in data");
let topics = dat["Topics"];
console.log("ajax navigated to different page");
log("ajax navigated to different page");
// TODO: Fix the data race where the function hasn't been loaded yet
let out = "";
@ -565,7 +569,7 @@ function mainInit(){
rebuildPaginator(dat.LastPage);
rebindPaginator();
}).catch(e => {
console.log("Unable to get script '"+url+q+"&js=1"+"'",e);
log("Unable to get script '"+url+q+"&js=1"+"'",e);
console.trace();
});
});
@ -585,10 +589,10 @@ function mainInit(){
if(!resp.ok) throw(url+"&js=1 failed to load");
return resp.json();
}).then(dat => {
console.log("data",dat);
log("data",dat);
if(!"Topics" in dat) throw("no Topics in data");
let topics = dat["Topics"];
console.log("ajax navigated to "+that.innerText);
log("ajax navigated to "+that.innerText);
// TODO: Fix the data race where the function hasn't been loaded yet
let out = "";
@ -610,7 +614,7 @@ function mainInit(){
that.classList.add("filter_selected");
$(".topic_list_title h1").text(that.innerText);
}).catch(e => {
console.log("Unable to get script '"+url+"&js=1"+"'",e);
log("Unable to get script '"+url+"&js=1"+"'",e);
console.trace();
});
});
@ -639,7 +643,7 @@ function mainInit(){
}).then(data => {
if(!"Topics" in data) throw("no Topics in data");
let topics = data["Topics"];
console.log("ajax navigated to search page");
log("ajax navigated to search page");
// TODO: Fix the data race where the function hasn't been loaded yet
let out = "";
@ -655,7 +659,7 @@ function mainInit(){
rebuildPaginator(data.LastPage);
rebindPaginator();
}).catch(e => {
console.log("Unable to get script '"+url+q+"&js=1"+"'",e);
log("Unable to get script '"+url+q+"&js=1"+"'",e);
console.trace();
});
});
@ -667,7 +671,7 @@ function mainInit(){
ev.preventDefault();
let bp = $(this).closest('.editable_parent');
let block = bp.find('.editable_block').eq(0);
block.html("<input name='edit_field'value='"+block.text()+"' type='text'><a href='"+$(this).closest('a').attr("href")+"'><button class='submit_edit'type='submit'>Update</button></a>");
block.html("<input name='edit_field'value='"+block.text()+"'type='text'><a href='"+$(this).closest('a').attr("href")+"'><button class='submit_edit'type='submit'>Update</button></a>");
$(".submit_edit").click(function(ev) {
ev.preventDefault();
@ -690,7 +694,7 @@ function mainInit(){
$(".edit_fields").click(function(ev) {
ev.preventDefault();
if($(this).find("input").length!==0) return;
//console.log("clicked .edit_fields");
//log("clicked .edit_fields");
var bp = $(this).closest('.editable_parent');
bp.find('.hide_on_edit').addClass("edit_opened");
bp.find('.show_on_edit').addClass("edit_opened");
@ -713,10 +717,10 @@ function mainInit(){
}
out += "<option "+sel+"value='"+i+"'>"+it[i]+"</option>";
}
this.innerHTML = "<select data-field='"+fieldName+"' name='"+fieldName+"'>"+out+"</select>";
this.innerHTML = "<select data-field='"+fieldName+"'name='"+fieldName+"'>"+out+"</select>";
}
else if(fieldType=="hidden") {}
else this.innerHTML = "<input name='"+fieldName+"' value='"+this.textContent+"' type='text'>";
else this.innerHTML = "<input name='"+fieldName+"'value='"+this.textContent+"'type='text'>";
});
// Remove any handlers already attached to the submitter
@ -744,8 +748,8 @@ function mainInit(){
});
let href = $(this).closest('a').attr("href");
//console.log("href",href);
//console.log(outData);
//log("href",href);
//log(outData);
$.ajax({ url: href+"?s="+me.User.S, type:"POST", dataType:"json", data: outData, error: ajaxError });
bp.find('.hide_on_edit').removeClass("edit_opened");
bp.find('.show_on_edit').removeClass("edit_opened");
@ -778,7 +782,7 @@ function mainInit(){
$("input,textarea,select,option").keyup(ev => ev.stopPropagation())
$("#themeSelectorSelect").change(function(){
console.log("Changing the theme to "+this.options[this.selectedIndex].getAttribute("value"));
log("Changing the theme to "+this.options[this.selectedIndex].getAttribute("value"));
$.ajax({
url: this.form.getAttribute("action")+"?s="+me.User.S,
type:"POST",
@ -786,10 +790,10 @@ function mainInit(){
data: { "theme": this.options[this.selectedIndex].getAttribute("value"), js: 1 },
error: ajaxError,
success: function (dat,status,xhr) {
console.log("Theme successfully switched");
console.log("dat",dat);
console.log("status",status);
console.log("xhr",xhr);
log("Theme successfully switched");
log("dat",dat);
log("status",status);
log("xhr",xhr);
window.location.reload();
}
});
@ -814,10 +818,10 @@ function mainInit(){
$(".unix_to_24_hour_time").each(function(){
let unixTime = this.innerText;
let date = new Date(unixTime*1000);
console.log("date",date);
log("date",date);
let mins = "0"+date.getMinutes();
let formattedTime = date.getHours()+":"+mins.substr(-2);
console.log("formattedTime",formattedTime);
log("formattedTime",formattedTime);
this.innerText = formattedTime;
});
@ -825,10 +829,10 @@ function mainInit(){
// TODO: Localise this
let monthList = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
let date = new Date(this.innerText * 1000);
console.log("date",date);
log("date",date);
let day = "0"+date.getDate();
let formattedTime = monthList[date.getMonth()]+" "+day.substr(-2)+" "+date.getFullYear();
console.log("formattedTime",formattedTime);
log("formattedTime",formattedTime);
this.innerText = formattedTime;
});
@ -888,9 +892,9 @@ function mainInit(){
let pro;
if(stripQ(getExt(res))=="css") pro = asyncGetSheet("/s/"+res)
else pro = asyncGetScript("/s/"+res)
pro.then(() => console.log("Loaded "+res))
pro.then(() => log("Loaded "+res))
.catch(e => {
console.log("Unable to get '"+res+"'",e);
log("Unable to get '"+res+"'",e);
console.trace();
});
}
@ -903,7 +907,7 @@ function mainInit(){
let obj = {Title:document.title,Url:base};
history.pushState(obj,obj.Title,obj.Url);
}).catch(e => {
console.log("Unable to get script '"+href+""+"'",e);
log("Unable to get script '"+href+""+"'",e);
console.trace();
});
}
@ -1066,13 +1070,13 @@ function bindTopic() {
ev.stopPropagation();
let src = this.closest(".post_item").getElementsByClassName("edit_source")[0];
let con = document.getElementById("input_content")
console.log("con.value",con.value);
log("con.value",con.value);
let item;
if(con.value=="") item = "<blockquote>"+src.innerHTML+"</blockquote>"
else item = "\r\n<blockquote>"+src.innerHTML+"</blockquote>";
con.value = con.value+item;
console.log("con.value",con.value);
log("con.value",con.value);
// For custom / third party text editors
quoteItemCallback(src.innerHTML,item);
@ -1093,13 +1097,13 @@ function bindTopic() {
}
if(allZero) {
$("#poll_results_"+pollID+" .poll_no_results").removeClass("auto_hide");
console.log("all zero")
log("all zero")
return;
}
$("#poll_results_"+pollID+" .user_content").html("<div id='poll_results_chart_"+pollID+"'></div>");
console.log("rawData",rawData);
console.log("series",data);
log("rawData",rawData);
log("series",data);
Chartist.Pie('#poll_results_chart_'+pollID, {
series: data,
}, {

View File

@ -5,39 +5,38 @@ if(tmplInits===undefined) var tmplInits={};
var tmplPhrases=[]; // [key] array of phrases indexed by order of use
var hooks={};
var ranInitHooks={}
var log = console.log;
function runHook(name,...args) {
if(!(name in hooks)) {
console.log("Couldn't find hook '"+name+"'");
log("Couldn't find hook "+name);
return;
}
console.log("Running hook '"+name+"'");
log("Running hook "+name);
let hook = hooks[name];
let ret;
for (const index in hook) ret = hook[index](...args);
return ret;
let o;
for (const index in hook) o = hook[index](...args);
return o;
}
function addHook(name,h) {
log("Add hook "+name);
if(hooks[name]===undefined) hooks[name]=[];
hooks[name].push(h);
}
// InitHooks are slightly special, as if they are run, then any adds after the initial run will run immediately, this is to deal with the async nature of script loads
function runInitHook(name,...args) {
let ret = runHook(name,...args);
ranInitHooks[name] = true;
return ret;
ranInitHooks[name]=true;
return runHook(name,...args);
}
function addInitHook(name,h) {
addHook(name, h);
addHook(name,h);
if(name in ranInitHooks) h();
}
// Temporary hack for templates
function len(it) {return it.length;}
function len(d) {return d.length}
function asyncGetScript(src) {
return new Promise((resolve,reject) => {
@ -45,16 +44,16 @@ function asyncGetScript(src) {
script.async = true;
const onloadHandler = (e,isAbort) => {
if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
script.onload = null;
script.onreadystatechange = null;
script = undefined;
if (isAbort||!script.readyState||/loaded|complete/.test(script.readyState)) {
script.onload=null;
script.onreadystatechange=null;
script=undefined;
isAbort ? reject(e) : resolve();
}
}
script.onerror = (e) => {
script.onerror = e => {
reject(e);
};
script.onload = onloadHandler;
@ -72,27 +71,27 @@ function notifyOnScript(src) {
let ss = src.replace("/s/","");
try {
let ssp = ss.charAt(0).toUpperCase() + ss.slice(1)
console.log("ssp",ssp)
log("ssp",ssp)
if(window[ssp]) {
resolve();
return;
}
} catch(e) {}
console.log("src",src)
let script = document.querySelectorAll('[src^="'+src+'"]')[0];
console.log("script",script);
log("src",src)
let script = document.querySelectorAll(`[src^="${src}"]`)[0];
log("script",script);
if(script===undefined) {
reject("no script found");
return;
}
const onloadHandler = (e) => {
script.onload = null;
script.onreadystatechange = null;
const onloadHandler = e => {
script.onload=null;
script.onreadystatechange=null;
resolve();
}
script.onerror = (e) => {
script.onerror = e => {
reject(e);
};
script.onload = onloadHandler;
@ -103,38 +102,35 @@ function notifyOnScript(src) {
function notifyOnScriptW(name,complete,success) {
notifyOnScript(name)
.then(() => {
console.log("Loaded "+name+".js");
log(`Loaded ${name}.js`);
complete();
if(success!==undefined) success();
}).catch(e => {
console.log("Unable to get '"+name+"'",e);
log("Unable to get "+name,e);
console.trace();
complete(e);
});
}
// TODO: Send data at load time so we don't have to rely on a fallback template here
function loadScript(name,callback,fail) {
function loadScript(name,h,fail) {
let fname = name;
let value = "; "+document.cookie;
let parts = value.split("; current_theme=");
if(parts.length==2) fname += "_"+parts.pop().split(";").shift();
let url = "/s/"+fname+".js"
let iurl = "/s/"+name+".js"
let url = `/s/${fname}.js`
let iurl = `/s/${name}.js`
asyncGetScript(url)
.then(callback)
.catch(e => {
console.log("Unable to get '"+url+"'");
.then(h).catch(e => {
log("Unable to get "+url,e);
if(fname!=name) {
asyncGetScript(iurl)
.then(callback)
.catch(e => {
console.log("Unable to get '"+iurl+"'",e);
.then(h).catch(e => {
log("Unable to get "+iurl,e);
console.trace();
});
}
console.log("e",e);
console.trace();
fail(e);
});
@ -143,8 +139,8 @@ function loadScript(name,callback,fail) {
function RelativeTime(date) {return date}
function initPhrases(member,acp=false) {
console.log("initPhrases")
console.log("tmlInits",tmplInits)
log("initPhrases")
log("tmlInits",tmplInits)
let e = "";
if(member && !acp) e=",status,topic_list,topic";
else if(acp) e=",analytics,panel"; // TODO: Request phrases for just one section of the acp?
@ -154,28 +150,25 @@ function initPhrases(member,acp=false) {
function fetchPhrases(plist) {
fetch("/api/phrases/?q="+plist,{cache:"no-cache"})
.then(resp => resp.json())
.then(data => {
console.log("loaded phrase endpoint data");
console.log("data",data);
.then(r => r.json())
.then(d => {
log("loaded phrase endpoint data",d);
Object.keys(tmplInits).forEach(key => {
let phrases=[];
let tmplInit = tmplInits[key];
for(let phraseName of tmplInit) phrases.push(data[phraseName]);
console.log("Adding phrases");
console.log("key",key);
console.log("phrases",phrases);
for(let phraseName of tmplInit) phrases.push(d[phraseName]);
log("Adding phrases for "+key,phrases);
tmplPhrases[key] = phrases;
});
let prefixes = {};
Object.keys(data).forEach(key => {
let prefixes={};
Object.keys(d).forEach(key => {
let prefix = key.split(".")[0];
if(prefixes[prefix]===undefined) prefixes[prefix] = {};
prefixes[prefix][key] = data[key];
if(prefixes[prefix]===undefined) prefixes[prefix]={};
prefixes[prefix][key] = d[key];
});
Object.keys(prefixes).forEach(prefix => {
console.log("adding phrase prefix '"+prefix+"' to box");
log(`adding phrase prefix ${prefix} to box`);
phraseBox[prefix] = prefixes[prefix];
});
@ -190,31 +183,32 @@ function fetchPhrases(plist) {
let toLoad = 1;
// TODO: Shunt this into member if there aren't any search and filter widgets?
let q = (f) => {
let q = f => {
toLoad--;
if(toLoad===0) initPhrases(member,acp);
if(f) throw("tmpl func not found");
};
let l = (n,h) => notifyOnScriptW("tmpl_"+n,h);
if(!acp) {
toLoad += 2;
if(member) {
toLoad += 3;
notifyOnScriptW("tmpl_topic_c_edit_post", () => q(!Tmpl_topic_c_edit_post));
notifyOnScriptW("tmpl_topic_c_attach_item", () => q(!Tmpl_topic_c_attach_item));
notifyOnScriptW("tmpl_topic_c_poll_input", () => q(!Tmpl_topic_c_poll_input));
l("topic_c_edit_post", () => q(!Tmpl_topic_c_edit_post));
l("topic_c_attach_item", () => q(!Tmpl_topic_c_attach_item));
l("topic_c_poll_input", () => q(!Tmpl_topic_c_poll_input));
}
notifyOnScriptW("tmpl_topics_topic", () => q(!Tmpl_topics_topic));
notifyOnScriptW("tmpl_paginator", () => q(!Tmpl_paginator));
l("topics_topic", () => q(!Tmpl_topics_topic));
l("paginator", () => q(!Tmpl_paginator));
}
notifyOnScriptW("tmpl_notice", () => q(!Tmpl_notice));
l("notice", () => q(!Tmpl_notice));
if(member) {
fetch("/api/me/")
.then(resp => resp.json())
.then(data => {
console.log("me data",data);
me=data;
.then(r => r.json())
.then(d => {
log("me",d);
me=d;
runInitHook("pre_init");
});
} else {

View File

@ -20,7 +20,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
let totalSize = 0;
for(let i=0; i<files.length; i++) {
console.log("file "+i,files[i]);
log("file "+i,files[i]);
totalSize += files[i]["size"];
}
if(totalSize > me.Site.MaxRequestSize) throw("You can't upload this much at once, max: "+me.Site.MaxRequestSize);
@ -59,7 +59,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
try {
uploadFileHandler(this.files, 5, () => {},
(e,hash,fname) => {
console.log("hash",hash);
log("hash",hash);
let formData = new FormData();
formData.append("s",me.User.S);
for(let i=0; i<this.files.length; i++) formData.append("upload_files",this.files[i]);
@ -68,7 +68,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
let req = new XMLHttpRequest();
req.addEventListener("load", () => {
let data = JSON.parse(req.responseText);
//console.log("rdata",data);
//log("rdata",data);
let fileItem = document.createElement("div");
let ext = getExt(fname);
// TODO: Push ImageFileExts to the client from the server in some sort of gen.js?
@ -92,7 +92,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
});
} catch(e) {
// TODO: Use a notice instead
console.log("e",e);
log("e",e);
alert(e);
}
}
@ -104,7 +104,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
// TODO: Use client templates here
let fileDock = document.getElementById("upload_file_dock");
let fileItem = document.createElement("label");
console.log("fileItem",fileItem);
log("fileItem",fileItem);
let ext = getExt(fname);
// TODO: Push ImageFileExts to the client from the server in some sort of gen.js?
@ -116,23 +116,23 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
fileDock.appendChild(fileItem);
},(e,hash,fname) => {
console.log("hash",hash);
log("hash",hash);
let ext = getExt(fname)
let con = document.getElementById("input_content")
console.log("con.value",con.value);
log("con.value",con.value);
let attachItem;
if(con.value=="") attachItem = "//"+window.location.host+"/attachs/"+hash+"."+ext;
else attachItem = "\r\n//"+window.location.host+"/attachs/"+hash+"."+ext;
con.value = con.value + attachItem;
console.log("con.value",con.value);
log("con.value",con.value);
// For custom / third party text editors
attachItemCallback(attachItem);
});
} catch(e) {
// TODO: Use a notice instead
console.log("e",e);
log("e",e);
alert(e);
}
}
@ -191,12 +191,12 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
for(let i = 0; i < elems.length; i++) {
let pathNode = elems[i].querySelector(".attach_item_path");
console.log("pathNode",pathNode);
log("pathNode",pathNode);
aidList += pathNode.getAttribute("aid")+",";
elems[i].remove();
}
if(aidList.length > 0) aidList = aidList.slice(0, -1);
console.log("aidList",aidList)
log("aidList",aidList)
formData.append("aids",aidList);
let ec = 0;
@ -214,9 +214,9 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
});
function addPollInput() {
console.log("clicked on pollinputinput");
log("clicked on pollinputinput");
let dataPollInput = $(this).parent().attr("data-pollinput");
console.log("dataPollInput",dataPollInput);
log("dataPollInput",dataPollInput);
if(dataPollInput==undefined) return;
if(dataPollInput!=(pollInputIndex-1)) return;
$(".poll_content_row .formitem").append(Tmpl_topic_c_poll_input({
@ -224,7 +224,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
Place: phraseBox["topic"]["topic.reply_add_poll_option"].replace("%d",pollInputIndex),
}));
pollInputIndex++;
console.log("new pollInputIndex",pollInputIndex);
log("new pollInputIndex",pollInputIndex);
$(".pollinputinput").off("click");
$(".pollinputinput").click(addPollInput);
}
@ -241,8 +241,11 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
});
//addInitHook("after_init_bind_page", () => {
addHook("end_bind_page", () => {
if(!$(".mod_floater").hasClass("auto_hide")) $(".mod_floater").addClass("auto_hide")
$(".moderate_link").unbind("click");
$(".mod_floater_submit").unbind("click");
selectedTopics=[];
$("topic_selected").removeClass("topic_selected");
$(".moderate_link").click(ev => {
ev.preventDefault();
$(".pre_opt").removeClass("auto_hide");
@ -298,7 +301,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
// Handle these specially
switch(action) {
case "move":
console.log("move action");
log("move action");
let modTopicMover = $("#mod_topic_mover");
$("#mod_topic_mover").removeClass("auto_hide");
$("#mod_topic_mover .pane_row").click(function(){
@ -306,7 +309,7 @@ var imageExts = ["png","jpg","jpe","jpeg","jif","jfi","jfif","svg","bmp","gif","
let fid = this.getAttribute("data-fid");
if(fid==null) return;
this.classList.add("pane_selected");
console.log("fid",fid);
log("fid",fid);
forumToMoveTo = fid;
$("#mover_submit").unbind("click");

View File

@ -8,26 +8,26 @@ formVars = {
var forums = {};
let items = document.getElementsByClassName("panel_forum_item");
for(let i=0; item=items[i]; i++) forums[i] = item.getAttribute("data-fid");
console.log("forums",forums);
log("forums",forums);
Sortable.create(document.getElementById("panel_forums"), {
sort: true,
onEnd: (evt) => {
console.log("pre forums",forums)
console.log("evt",evt)
log("pre forums",forums)
log("evt",evt)
let oldFid = forums[evt.newIndex];
forums[evt.oldIndex] = oldFid;
let newFid = evt.item.getAttribute("data-fid");
console.log("newFid",newFid);
log("newFid",newFid);
forums[evt.newIndex] = newFid;
console.log("post forums",forums);
log("post forums",forums);
}
});
document.getElementById("panel_forums_order_button").addEventListener("click", () => {
let req = new XMLHttpRequest();
if(!req) {
console.log("Failed to create request");
log("Failed to create request");
return false;
}
req.onreadystatechange = () => {
@ -37,7 +37,7 @@ document.getElementById("panel_forums_order_button").addEventListener("click", (
if(req.status!==200) return;
let resp = JSON.parse(req.responseText);
console.log("resp",resp);
log("resp",resp);
// TODO: Should we move other notices into TmplPhrases like this one?
pushNotice(phraseBox["panel"]["panel.forums_order_updated"]);
if(resp.success==1) return;

View File

@ -9,21 +9,21 @@ for(let i=0; item=items[i]; i++) menuItems[i] = item.getAttribute("data-miid");
Sortable.create(document.getElementById("panel_menu_item_holder"), {
sort: true,
onEnd: evt => {
console.log("pre menuItems",menuItems)
console.log("evt",evt)
log("pre menuItems",menuItems)
log("evt",evt)
let oldMiid = menuItems[evt.newIndex];
menuItems[evt.oldIndex] = oldMiid;
let newMiid = evt.item.getAttribute("data-miid");
console.log("newMiid",newMiid);
log("newMiid",newMiid);
menuItems[evt.newIndex] = newMiid;
console.log("post menuItems",menuItems);
log("post menuItems",menuItems);
}
});
document.getElementById("panel_menu_items_order_button").addEventListener("click", () => {
let req = new XMLHttpRequest();
if(!req) {
console.log("Failed to create request");
log("Failed to create request");
return false;
}
req.onreadystatechange = () => {
@ -32,7 +32,7 @@ document.getElementById("panel_menu_items_order_button").addEventListener("click
// TODO: Signal the error with a notice
if(req.status===200) {
let resp = JSON.parse(req.responseText);
console.log("resp",resp);
log("resp",resp);
// TODO: Should we move other notices into TmplPhrases like this one?
pushNotice(phraseBox["panel"]["panel.themes_menus_items_order_updated"]);
if(resp.success==1) return;

View File

@ -8,7 +8,7 @@ function handle_profile_hashbit() {
hash_class = "delete_posts_hash";
break;
default:
console.log("Unknown hashbit");
log("Unknown hashbit");
return;
}
$(".hash_hide").hide();

View File

@ -3,12 +3,12 @@
fetch("/api/watches/")
.then(resp => {
if(resp.status!==200) {
console.log("err");
console.log("resp",resp);
log("err");
log("resp",resp);
return;
}
resp.text().then(d => eval(d));
})
.catch(e => console.log("e",e));
.catch(e => log("e",e));
});
})()

View File

@ -1,7 +1,7 @@
"use strict";
$(document).ready(() => {
let clickHandle = function(ev){
console.log("in clickHandle")
log("in clickHandle")
ev.preventDefault();
let ep = $(this).closest(".editable_parent");
ep.find(".hide_on_block_edit").addClass("edit_opened");
@ -36,7 +36,7 @@ $(document).ready(() => {
$(".wtype_sel").change(changeHandle);
$(".widget_new a").click(function(ev){
console.log("clicked widget_new a")
log("clicked widget_new a")
let widgetList = this.closest(".panel_widgets");
let widgetNew = this.closest(".widget_new");
let widgetTmpl = document.getElementById("widgetTmpl").querySelector(".widget_item");
@ -50,7 +50,7 @@ $(document).ready(() => {
});
$(".widget_save").click(function(ev){
console.log("in .widget_save")
log("in .widget_save")
ev.preventDefault();
ev.stopPropagation();
let pform = this.closest("form");

View File

@ -7,7 +7,7 @@
{{range .Header.PreScriptsAsync}}
<script async src="/s/{{.}}"></script>{{end}}
{{if .CurrentUser.Loggedin}}<meta property="x-mem"content="1">{{end}}
<script src="/s/init.js?i=11"></script>
<script src="/s/init.js?i=12"></script>
{{range .Header.ScriptsAsync}}
<script async src="/s/{{.}}"></script>{{end}}
<script src="/s/jquery-3.1.1.min.js"></script>

View File

@ -18,7 +18,7 @@
<span data-field="forum_preset" data-type="list" data-value="{{.Preset}}" class="panel_tag editable_block forum_preset forum_preset_{{.Preset}}" title="{{.PresetLang}}"></span>
</span>
<span class="panel_buttons">
<a class="panel_tag edit_fields hide_on_edit panel_right_button edit_button" title="{{lang "panel.forums_edit_button_tooltip"}}" aria-label="{{lang "panel.forums_edit_button_aria"}}"></a>
<a class="panel_tag edit_fields hide_on_edit panel_right_button edit_button"title="{{lang "panel.forums_edit_button_tooltip"}}" aria-label="{{lang "panel.forums_edit_button_aria"}}"></a>
<a class="panel_right_button has_inner_button show_on_edit" href="/panel/forums/edit/submit/{{.ID}}"><button class='panel_tag submit_edit' type='submit'>{{lang "panel.forums_update_button"}}</button></a>
{{if gt .ID 1}}<a href="/panel/forums/delete/{{.ID}}?s={{$.CurrentUser.Session}}" class="panel_tag panel_right_button hide_on_edit delete_button" title="{{lang "panel.forums_delete_button_tooltip"}}" aria-label="{{lang "panel.forums_delete_button_aria"}}"></a>{{end}}
<a href="/panel/forums/edit/{{.ID}}" class="panel_tag panel_right_button has_inner_button show_on_edit"><button>{{lang "panel.forums_full_edit_button"}}</button></a>

View File

@ -66,7 +66,7 @@
// TODO: Refactor this to use `each` less
$('.button_menu').click(function(){
console.log(".button_menu");
log(".button_menu");
// The outer container
let buttonPane = newElement("div","button_menu_pane");
let postItem = $(this).parents('.post_item');
@ -103,13 +103,13 @@
// Fill in the placeholder grid nodes
let rowCount = 4;
console.log("rowCount",rowCount);
console.log("gridElementCount",gridElementCount);
log("rowCount",rowCount);
log("gridElementCount",gridElementCount);
if(gridElementCount%rowCount != 0) {
let fillerNodes = (rowCount - (gridElementCount%rowCount));
console.log("fillerNodes",fillerNodes);
log("fillerNodes",fillerNodes);
for(let i = 0; i < fillerNodes;i++ ) {
console.log("added a gridFiller");
log("added a gridFiller");
buttonGrid.appendChild(newElement("div","gridFiller"));
}
}

View File

@ -36,24 +36,24 @@ function noxMenuBind() {
function moveAlerts() {
// Move the alerts above the first header
let colSel = $(".colstack_right .colstack_head:first");
let colSelAlt = $(".colstack_right .colstack_item:first");
let colSelAltAlt = $(".colstack_right .coldyn_block:first");
if(colSel.length > 0) $('.alert').insertBefore(colSel);
else if (colSelAlt.length > 0) $('.alert').insertBefore(colSelAlt);
else if (colSelAltAlt.length > 0) $('.alert').insertBefore(colSelAltAlt);
let cSel = $(".colstack_right .colstack_head:first");
let cSelAlt = $(".colstack_right .colstack_item:first");
let cSelAltAlt = $(".colstack_right .coldyn_block:first");
if(cSel.length > 0) $('.alert').insertBefore(cSel);
else if (cSelAlt.length > 0) $('.alert').insertBefore(cSelAlt);
else if (cSelAltAlt.length > 0) $('.alert').insertBefore(cSelAltAlt);
else $('.alert').insertAfter(".rowhead:first");
}
addInitHook("after_update_alert_list", alertCount => {
console.log("misc.js");
console.log("alertCount",alertCount);
if(alertCount==0) {
addInitHook("after_update_alert_list", count => {
log("misc.js");
log("count",count);
if(count==0) {
$(".alerts").html(phraseBox["alerts"]["alerts.no_alerts_short"]);
$(".user_box").removeClass("has_alerts");
} else {
// TODO: Localise this
$(".alerts").html(alertCount + " new alerts");
$(".alerts").html(count+" new alerts");
$(".user_box").addClass("has_alerts");
}
});
@ -63,7 +63,7 @@ function noxMenuBind() {
addInitHook("end_init", () => {
$(".alerts").click(ev => {
ev.stopPropagation();
var alerts = $(".menu_alerts")[0];
let alerts = $(".menu_alerts")[0];
if($(alerts).hasClass("selectedAlert")) return;
if(!conn) loadAlerts(alerts);
alerts.className += " selectedAlert";

View File

@ -3,9 +3,9 @@ addInitHook("end_init", () => {
// TODO: Run this when the image is loaded rather than when the document is ready?
$(".topic_list img").each(function(){
let aspectRatio = this.naturalHeight / this.naturalWidth;
console.log("aspectRatio",aspectRatio);
console.log("height",this.naturalHeight);
console.log("width",this.naturalWidth);
log("aspectRatio",aspectRatio);
log("height",this.naturalHeight);
log("width",this.naturalWidth);
$(this).css({ height: aspectRatio * this.width });
});

View File

@ -3,9 +3,9 @@ addInitHook("end_init", () => {
// TODO: Run this when the image is loaded rather than when the document is ready?
$(".topic_list img").each(function(){
let aspectRatio = this.naturalHeight / this.naturalWidth;
console.log("aspectRatio",aspectRatio);
console.log("height",this.naturalHeight);
console.log("width",this.naturalWidth);
log("aspectRatio",aspectRatio);
log("height",this.naturalHeight);
log("width",this.naturalWidth);
$(this).css({ height: aspectRatio * this.width });
});