f0ckv2/public/s/js/admin.js
2021-12-25 13:12:53 +01:00

231 lines
6.6 KiB
JavaScript

let flashActive = false;
const flashTypes = [ "error", "success", "warn" ];
const flash = ({ type, msg }) => {
let flashContainer;
if(tmp = document.querySelector("div#flash"))
flashContainer = tmp;
else {
flashContainer = document.createElement("div");
flashContainer.id = "flash";
document.body.insertAdjacentElement("afterbegin", flashContainer);
}
flashContainer.innerHTML = msg;
if(flashTypes.includes(type)) {
flashContainer.className = "";
flashContainer.classList.add(type);
}
if(flashActive)
return false;
flashActive = true;
flashContainer.animate(
[ { bottom: "-28px" }, { bottom: 0 } ], {
duration: 500,
fill: "both"
}
).onfinish = () => setTimeout(() => {
flashContainer.animate(
[ { bottom: 0 }, { bottom: "-28px" } ], {
duration: 500,
fill: "both"
}
).onfinish = () => flashActive = false;
}, 4 * 1e3);
return true;
};
(async () => {
if(_addtag = document.querySelector("a#a_addtag")) {
const postid = +document.querySelector("a.id-link").innerText;
const poster = document.querySelector("a#a_username").innerText;
let tags = [...document.querySelectorAll("#tags > .badge")].map(t => t.innerText.slice(0, -2));
const deleteEvent = async e => {
e.preventDefault();
if(!confirm("Do you really want to delete this tag?"))
return;
const tagid = +e.target.parentElement.dataset.tagid;
/*if(!tags.includes(tag))
return alert("wtf");*/
const res = await deleteTag(postid, tagid);
if(!res.success)
return alert("uff");
tags = res.tags.map(t => t.tag);
renderTags(res.tags);
};
const post = async (url, data) => fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
});
const getTags = async postid => await (await fetch("/api/v2/admin/tags/get/" + postid)).json();
const deletePost = async postid => await (await fetch("/api/v2/admin/deletepost/" + postid)).json();
const addTag = async (postid, tag) => await (await post("/api/v2/admin/tags/add", {
postid: postid,
tag: tag
})).json();
const deleteTag = async (postid, tagid) => await (await post("/api/v2/admin/tags/delete", {
postid: postid,
tagid: tagid
})).json();
const renderTags = _tags => {
[...document.querySelectorAll("#tags > .badge")].forEach(tag => tag.parentElement.removeChild(tag));
_tags.reverse().forEach(tag => {
const a = document.createElement("a");
a.href = `/tag/${tag.tag}`;
a.target = "_blank";
a.style = "color: inherit !important";
a.innerHTML = tag.tag;
const span = document.createElement("span");
span.classList.add("badge", "badge-light", "mr-2");
span.title = tag.user;
span.dataset.tagid = tag.id;
if(tag.tag == "sfw") {
span.classList.remove("badge-light");
span.classList.add("badge-success");
}
if(tag.tag == "nsfw") {
span.classList.remove("badge-light");
span.classList.add("badge-danger");
}
if(tag.tag.startsWith(">")) {
span.classList.add("badge-greentext");
}
const delbutton = document.createElement("a");
delbutton.innerHTML = " ×";
delbutton.href = "#";
delbutton.addEventListener("click", deleteEvent);
span.insertAdjacentElement("beforeend", a);
span.insertAdjacentElement("beforeend", delbutton);
document.querySelector("#tags").insertAdjacentElement("afterbegin", span);
});
};
const addtagClick = (ae = false) => {
if(ae)
ae.preventDefault();
const insert = document.querySelector("a#a_addtag");
const span = document.createElement("span");
span.classList.add("badge", "badge-light", "mr-2");
const input = document.createElement("input");
input.size = "10";
input.value = "";
let tt;
input.addEventListener("keydown", async e => {
if(e.key === "Enter") {
const tmptag = input.value;
if(tags.includes(tmptag))
return alert("tag already exists");
const res = await addTag(postid, tmptag);
if(!res.success) {
return flash({
type: "error",
msg: res.msg
});
}
tags = res.tags.map(t => t.tag);
renderTags(res.tags);
addtagClick();
}
else if(e.key === "Escape") {
span.parentElement.removeChild(span);
}
return true;
});
span.insertAdjacentElement("afterbegin", input);
insert.insertAdjacentElement("beforebegin", span);
input.focus();
input.addEventListener("focusout", ie => {
if(input.value.length === 0)
input.parentElement.parentElement.removeChild(input.parentElement);
});
};
const toggleEvent = async (e = false) => {
if(e)
e.preventDefault();
let res;
if(tags.includes("sfw")) {
await deleteTag(postid, "sfw");
res = await addTag(postid, "nsfw");
}
else if(tags.includes("nsfw")) {
await deleteTag(postid, "nsfw");
res = await addTag(postid, "sfw");
}
else
res = await addTag(postid, "sfw");
if(!res.success)
return flash({
type: "error",
msg: res.msg
});
renderTags(res.tags);
tags = res.tags.map(t => t.tag);
flash({
type: "success",
msg: tags.join()
});
};
const deleteButtonEvent = async e => {
if(e)
e.preventDefault();
if(!confirm(`Reason for deleting f0ckpost ${postid} by ${poster} (Weihnachten™)`))
return;
const res = await deletePost(postid);
if(res.success) {
flash({
type: "success",
msg: "post was successfully deleted"
});
}
else {
flash({
type: "error",
msg: res.msg
});
}
};
_addtag.addEventListener("click", addtagClick);
document.querySelector("a#a_toggle").addEventListener("click", toggleEvent);
[...document.querySelectorAll("#tags > .badge > a:last-child")].map(t => t.addEventListener("click", deleteEvent));
document.querySelector("a#a_delete").addEventListener("click", deleteButtonEvent);
document.addEventListener("keyup", e => {
if(e.target.tagName === "INPUT")
return;
if(e.key === "p")
toggleEvent();
else if(e.key === "i")
addtagClick();
else if(e.key === "x")
deleteButtonEvent();
});
}
})();