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:
parent
afc9f54e5e
commit
e814e85daa
@ -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);
|
||||
}
|
||||
}
|
||||
|
140
public/global.js
140
public/global.js
@ -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,
|
||||
}, {
|
||||
|
120
public/init.js
120
public/init.js
@ -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 {
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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));
|
||||
});
|
||||
})()
|
@ -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");
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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"));
|
||||
}
|
||||
}
|
||||
|
@ -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";
|
||||
|
@ -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 });
|
||||
});
|
||||
|
@ -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 });
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user