forked from Ag/disspam
208 lines
5.7 KiB
JavaScript
208 lines
5.7 KiB
JavaScript
|
|
var update = async function ()
|
|
{
|
|
filterstatus.textContent = "Working...";
|
|
|
|
var response = await fetch("badusers.json");
|
|
var json = await response.json();
|
|
var badUsers = {};
|
|
for (var t of json)
|
|
{
|
|
badUsers[t] = true;
|
|
}
|
|
|
|
var response = await fetch("repos.json");
|
|
var json = await response.json();
|
|
console.log(json.length);
|
|
|
|
main.innerHTML = "";
|
|
|
|
var filterFn = null;
|
|
if (filter.value.trim())
|
|
{
|
|
filterFn = Function("with (arguments[1]) return eval(arguments[0]);").bind(null, filter.value);
|
|
}
|
|
|
|
var table = document.createElement("table");
|
|
table.setAttribute("border", "");
|
|
var thead = document.createElement("thead");
|
|
thead.innerHTML = `
|
|
<th>rowid</th>
|
|
<th>owner</th>
|
|
<th>name</th>
|
|
<th>desc</th>
|
|
<th>stars</th>
|
|
<th>forks</th>
|
|
<th>lang</th>
|
|
`;
|
|
table.appendChild(thead);
|
|
var tbody = document.createElement("tbody");
|
|
table.appendChild(tbody);
|
|
var numFilteredOut = 0;
|
|
for (var t of json)
|
|
{
|
|
if (filterFn)
|
|
{
|
|
try
|
|
{
|
|
if (!filterFn(t))
|
|
{
|
|
numFilteredOut++;
|
|
continue;
|
|
}
|
|
}
|
|
catch (e)
|
|
{
|
|
// want to catch syntax errors
|
|
alert(e);
|
|
break;
|
|
}
|
|
}
|
|
|
|
var tr = document.createElement("tr");
|
|
|
|
tr.setAttribute("class", "table-row");
|
|
if (t["flag"])
|
|
tr.setAttribute("data-flag", t["flag"]);
|
|
tr.setAttribute("data-rowid", t["rowid"]);
|
|
|
|
var tdRowid = document.createElement("td");
|
|
tdRowid.textContent = t["rowid"];
|
|
tdRowid.setAttribute("align", "right");
|
|
tr.appendChild(tdRowid);
|
|
|
|
var tdOwner = document.createElement("td");
|
|
if (badUsers[t["owner"]])
|
|
tdOwner.dataset.badUser = true;
|
|
var ownerLink = document.createElement("a");
|
|
ownerLink.className = "owner-link";
|
|
ownerLink.textContent = t["owner"];
|
|
ownerLink.href = `https://git.disroot.org/${t["owner"]}`;
|
|
ownerLink.target = "_blank";
|
|
tdOwner.appendChild(ownerLink);
|
|
tr.appendChild(tdOwner);
|
|
|
|
var tdName = document.createElement("td");
|
|
var repoLink = document.createElement("a");
|
|
repoLink.className = "repo-link";
|
|
repoLink.textContent = t["name"];
|
|
repoLink.href = `https://git.disroot.org/${t["owner"]}/${t["name"]}`;
|
|
repoLink.target = "_blank";
|
|
tdName.appendChild(repoLink);
|
|
tr.appendChild(tdName);
|
|
|
|
var tdDesc = document.createElement("td");
|
|
//~ tdDesc.textContent = t["desc"];
|
|
tdDesc.innerHTML = t["desc"];
|
|
tr.appendChild(tdDesc);
|
|
|
|
var tdStars = document.createElement("td");
|
|
tdStars.textContent = t["stars"];
|
|
tdStars.setAttribute("align", "right");
|
|
tr.appendChild(tdStars);
|
|
|
|
var tdForks = document.createElement("td");
|
|
tdForks.textContent = t["forks"];
|
|
tdForks.setAttribute("align", "right");
|
|
tr.appendChild(tdForks);
|
|
|
|
var tdLang = document.createElement("td");
|
|
tdLang.textContent = t["lang"];
|
|
tr.appendChild(tdLang);
|
|
|
|
tbody.appendChild(tr);
|
|
}
|
|
tbody.children[0].dataset.activeRow = true;
|
|
main.appendChild(table);
|
|
|
|
filterstatus.textContent = `Showing ${json.length-numFilteredOut} of ${json.length} results (${numFilteredOut} filtered out)`;
|
|
};
|
|
|
|
update();
|
|
|
|
var setFlag = async function (flag)
|
|
{
|
|
var ar = document.querySelector("[data-active-row]");
|
|
rowid = ar.dataset.rowid;
|
|
try
|
|
{
|
|
var response = await fetch("/flag", {
|
|
method: "POST",
|
|
body: `rowid=${encodeURIComponent(rowid)}&flag=${encodeURIComponent(flag)}`,
|
|
headers: {"Content-Type": "application/x-www-form-urlencoded"},
|
|
});
|
|
if (response.status !== 200)
|
|
throw new Error(`Request failed with status ${response.status}`);
|
|
ar.dataset.flag = flag;
|
|
}
|
|
catch (e)
|
|
{
|
|
alert(e);
|
|
}
|
|
};
|
|
|
|
document.onkeydown = function (event)
|
|
{
|
|
//~ console.log(event);
|
|
|
|
if (event.ctrlKey || event.altKey || event.shiftKey)
|
|
return;
|
|
|
|
if (event.srcElement.matches("input"))
|
|
return;
|
|
|
|
var dir = 1;
|
|
var nextOrPrev = null;
|
|
switch (event.key)
|
|
{
|
|
case "ArrowDown":
|
|
nextOrPrev = "nextElementSibling";
|
|
case "ArrowUp":
|
|
if (!nextOrPrev)
|
|
nextOrPrev = "previousElementSibling";
|
|
var ar = document.querySelector("[data-active-row]");
|
|
if (ar && ar[nextOrPrev])
|
|
{
|
|
ar[nextOrPrev].dataset.activeRow = true;
|
|
delete ar.dataset.activeRow;
|
|
event.preventDefault();
|
|
ar.scrollIntoView({block: "center"});
|
|
}
|
|
break;
|
|
case "a":
|
|
setFlag("spam");
|
|
break;
|
|
case "s":
|
|
setFlag("");
|
|
break;
|
|
case "d":
|
|
setFlag("notSpam");
|
|
break;
|
|
case "w":
|
|
var ar = document.querySelector("[data-active-row]");
|
|
if (ar)
|
|
ar.querySelector(".owner-link").click();
|
|
break;
|
|
case "e":
|
|
var ar = document.querySelector("[data-active-row]");
|
|
if (ar)
|
|
ar.querySelector(".repo-link").click();
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
};
|
|
|
|
document.onclick = function (event)
|
|
{
|
|
if (event.target.matches("tr, tr *"))
|
|
{
|
|
var newAr = event.target.closest("tr");
|
|
var ar = document.querySelector("[data-active-row]");
|
|
if (ar)
|
|
delete ar.dataset.activeRow;
|
|
newAr.dataset.activeRow = true;
|
|
}
|
|
};
|