ikibooru/static/tagbox.js

119 lines
4.3 KiB
JavaScript
Raw Normal View History

2024-07-18 22:53:44 +03:00
function createtag(name, tc, tagid) {
var newtag = document.createElement("div")
newtag.classList.toggle("tag")
newtag.classList.toggle("tc" + (tc || "New"))
if(tagid) {
newtag.setAttribute("data-tagid", tagid)
}
newtag.innerText = name
return newtag
}
2024-06-01 17:40:11 +03:00
var acTimer;
2024-07-18 22:53:44 +03:00
function tagbox_updateformdata() {
2024-06-01 17:40:11 +03:00
document.getElementById(document.querySelector("div.tagbox").getAttribute("data-formparaminputid")).value = Array.from(document.querySelectorAll("div.tagbox div.tag")).map(function(a) {return a.getAttribute("data-tagid")}).join(",")
2024-07-18 22:53:44 +03:00
}
document.getElementById(document.querySelector("div.tagbox").getAttribute("data-formid")).addEventListener("submit", tagbox_updateformdata)
2024-06-01 17:40:11 +03:00
document.querySelector("div.tagbox").onclick = function(ev) {
this.querySelector('span').focus()
}
2024-07-18 22:53:44 +03:00
var UnknownTagsMode = document.querySelector("div.tagbox").getAttribute("data-unknowntags") !== null
2024-06-01 17:40:11 +03:00
document.querySelector("div.tagbox span").onkeydown = function(ev) {
if(ev.keyCode == 13) {
ev.preventDefault()
if(document.querySelector("div.tagbox span").innerText.length) {
var from = document.querySelector("div.autocomplete > div.tag.selected") || document.querySelectorAll("div.autocomplete > div.tag")[0]
2024-07-18 22:53:44 +03:00
if(from) {
if(!document.querySelector("div.tagbox div.tag[data-tagid='"+from.getAttribute("data-tagid")+"']")) {
from.classList.remove("selected")
document.querySelector("div.tagbox").insertBefore(from, document.querySelector("div.tagbox span"))
document.querySelector("div.tagbox").insertBefore(document.createTextNode("\n"), document.querySelector("div.tagbox span"))
}
2024-06-01 17:40:11 +03:00
}
2024-07-18 22:53:44 +03:00
document.querySelector("div.tagbox span").innerText = ""
var ac = document.querySelector(".autocomplete")
ac.style.visibility = "hidden"
2024-06-01 17:40:11 +03:00
} else {
document.getElementById(document.querySelector("div.tagbox").getAttribute("data-formid")).querySelector("input[type='submit']").click()
}
} else if(ev.keyCode == 40) {
ev.preventDefault()
var sel = document.querySelector("div.autocomplete > div.tag.selected")
if(sel) {
sel.classList.toggle("selected")
sel = sel.nextElementSibling
} else {
sel = document.querySelectorAll("div.autocomplete > div.tag")[0]
}
if(sel) sel.classList.toggle("selected")
} else if(ev.keyCode == 38) {
ev.preventDefault()
var sel = document.querySelector("div.autocomplete > div.tag.selected")
if(sel) {
sel.classList.toggle("selected")
sel = sel.previousElementSibling
} else {
var asdf = document.querySelectorAll("div.autocomplete > div.tag")
sel = asdf[asdf.length - 1]
}
if(sel) sel.classList.toggle("selected")
} else if(ev.keyCode == 8 && !document.querySelector("div.tagbox span").innerText.length) {
ev.preventDefault()
var asdf = document.querySelectorAll("div.tagbox div.tag")
if(asdf.length > 0) {
asdf = asdf[asdf.length - 1]
if(asdf) asdf.parentNode.removeChild(asdf)
}
}
}
document.querySelector("div.tagbox span").oninput = function(ev) {
if(document.querySelector("div.tagbox span").innerText.length) {
document.querySelector("div.tagbox > p").style.visibility = "hidden"
if(acTimer) {
clearTimeout(acTimer)
}
acTimer = setTimeout(function() {
var ajax = new XMLHttpRequest()
ajax.open("GET", "/autocomp?q=" + encodeURIComponent(document.querySelector("div.tagbox span").innerText) + (document.querySelector("div.tagbox").getAttribute("data-over18") == "true" ? "&a=" : ""), true)
ajax.onreadystatechange = function() {
if(ajax.readyState == 4 && ajax.status == 200) {
var ac = document.querySelector(".autocomplete")
ac.style.visibility = ""
while(ac.firstChild) ac.removeChild(ac.firstChild)
2024-07-18 22:53:44 +03:00
if(!UnknownTagsMode && ajax.responseText == "") {
2024-06-01 17:40:11 +03:00
ac.innerText = "No such tags found"
2024-07-18 22:53:44 +03:00
} else {
ajax.responseText.split("\n").slice(0, -1).forEach(function(line) {
ac.insertBefore(createtag(line.split(",")[1], line.split(",")[2], line.split(",")[0]), null)
})
if(UnknownTagsMode) {
ac.insertBefore(createtag(document.querySelector("div.tagbox span").innerText, null, null), null);
}
}
2024-06-01 17:40:11 +03:00
}
}
ajax.send()
}, 250)
} else {
if(!document.querySelectorAll(".tagbox > div.tag").length) document.querySelector("div.tagbox > p").style.color = ""
document.querySelector(".autocomplete").style.visibility = "hidden"
clearTimeout(acTimer)
acTimer = undefined
}
2024-07-18 22:53:44 +03:00
}