Finished up implementing channel-based user bans.
This commit is contained in:
parent
ef79e9941c
commit
96953979a2
19 changed files with 518 additions and 202 deletions
|
|
@ -21,8 +21,9 @@ class canopyAdminUtils{
|
|||
|
||||
//Statics
|
||||
static banUserPopup = class{
|
||||
constructor(target){
|
||||
constructor(target, cb){
|
||||
this.target = target;
|
||||
this.cb = cb;
|
||||
this.popup = new canopyUXUtils.popup("userBan", true, this.asyncConstruction.bind(this));
|
||||
}
|
||||
|
||||
|
|
@ -61,12 +62,12 @@ class canopyAdminUtils{
|
|||
this.popup.closePopup();
|
||||
|
||||
//Submit the user ban based on input
|
||||
const bans = await adminUtil.banUser(this.target, this.permBan.checked, this.expiration.value);
|
||||
const data = await adminUtil.banUser(this.target, this.permBan.checked, this.expiration.value);
|
||||
|
||||
//For some reason comparing this against undefined or null wasnt working in and of itself...
|
||||
if(typeof userBanList != "undefined" && bans != null){
|
||||
if(data != null){
|
||||
//Why add an extra get request when we already have the data? :P
|
||||
await userBanList.renderBanList(bans);
|
||||
await this.cb(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -197,8 +198,7 @@ class adminUserList{
|
|||
|
||||
banPopup(event){
|
||||
const user = event.target.id.replace("admin-user-list-ban-icon-","");
|
||||
|
||||
new canopyAdminUtils.banUserPopup(user);
|
||||
new canopyAdminUtils.banUserPopup(user, userBanList.renderBanList.bind(userBanList));
|
||||
}
|
||||
|
||||
updateSelect(update, select){
|
||||
|
|
@ -283,14 +283,10 @@ class adminUserBanList{
|
|||
|
||||
renderBanList(banList){
|
||||
this.clearBanList();
|
||||
console.log(banList);
|
||||
banList.forEach((ban) => {
|
||||
//Calculate expiration date and expiration days
|
||||
const expirationDate = new Date(ban.expirationDate);
|
||||
const expirationDays = ((expirationDate - new Date()) / (1000 * 60 * 60 * 24)).toFixed(1);
|
||||
var expirationDateString = `${expirationDate.toDateString()} (${expirationDays} day(s) left)`;
|
||||
var banActionString = ban.permanent ? "Account Deletion" : "Un-Ban";
|
||||
console.log(ban);
|
||||
var expirationDateString = `${new Date(ban.expirationDate).toDateString()}<br>(${ban.daysUntilExpiration} day(s) left)`;
|
||||
var banActionString = ban.permanent ? "Nuke<br>Accounts" : "Un-Ban";
|
||||
if(ban.user == null){
|
||||
//Fudge the user object if it's already been deleted
|
||||
ban.user = {
|
||||
|
|
@ -302,8 +298,8 @@ class adminUserBanList{
|
|||
|
||||
//Fake the display string
|
||||
var signUpDateString = "-"
|
||||
expirationDateString = "Accounts Nuked"
|
||||
banActionString = "Accounts Nuked"
|
||||
expirationDateString = "Accounts<br>Nuked"
|
||||
banActionString = "Accounts<br>Nuked"
|
||||
|
||||
}else{
|
||||
var signUpDateString = new Date(ban.user.date).toDateString()
|
||||
|
|
@ -331,59 +327,28 @@ class adminUserBanList{
|
|||
nukeAccount.title = `Nuke accounts`;
|
||||
nukeAccount.addEventListener("click",console.log);
|
||||
|
||||
//Append cells to row
|
||||
entryRow.appendChild(newCell(imgNode, true));
|
||||
entryRow.appendChild(newCell(ban.user.id));
|
||||
entryRow.appendChild(newCell(ban.user.user));
|
||||
entryRow.appendChild(newCell(signUpDateString));
|
||||
entryRow.appendChild(newCell(new Date(ban.banDate).toDateString()));
|
||||
entryRow.appendChild(newCell(expirationDateString));
|
||||
entryRow.appendChild(newCell(banActionString));
|
||||
entryRow.appendChild(newCell(ban.user.deleted ? unbanIcon : [unbanIcon, nukeAccount]));
|
||||
//append img cell to row
|
||||
entryRow.appendChild(utils.ux.newTableCell(imgNode, true));
|
||||
|
||||
//Append standard cells to row
|
||||
[
|
||||
ban.user.id,
|
||||
ban.user.user,
|
||||
signUpDateString,
|
||||
new Date(ban.banDate).toDateString(),
|
||||
expirationDateString,
|
||||
banActionString,
|
||||
(ban.user.deleted ? unbanIcon : [unbanIcon, nukeAccount])
|
||||
].forEach((content)=>{
|
||||
//I don't like repeating myself, and this didn't really need it's own function
|
||||
//though we could make one where each is an object that contains ever property needed and pass it to a mktable function
|
||||
//I just don't see us using it enough to justify it :P
|
||||
entryRow.appendChild(utils.ux.newTableCell(content));
|
||||
});
|
||||
|
||||
//Append row to table
|
||||
this.table.appendChild(entryRow);
|
||||
});
|
||||
|
||||
//We should really move this over to uxutils along with newrow & newtable functions
|
||||
function newCell(content, firstCol = false){
|
||||
//Create a new 'td' element
|
||||
const cell = document.createElement('td');
|
||||
cell.classList.add("admin-list-entry","admin-list-entry-item");
|
||||
|
||||
//If it's not the first column, mention it!
|
||||
if(!firstCol){
|
||||
cell.classList.add("admin-list-entry-not-first-col");
|
||||
}
|
||||
|
||||
//check for arrays
|
||||
if(content.forEach == null){
|
||||
//add single items
|
||||
addContent(content);
|
||||
}else{
|
||||
//Crawl through content array
|
||||
content.forEach((item)=>{
|
||||
//add each item
|
||||
addContent(item);
|
||||
});
|
||||
}
|
||||
|
||||
//return the resulting cell
|
||||
return cell;
|
||||
|
||||
|
||||
function addContent(ct){
|
||||
//If we're adding as node
|
||||
if(ct.cloneNode != null){
|
||||
//append it like it's a node
|
||||
cell.appendChild(ct);
|
||||
}else{
|
||||
//otherwise use it as innerHTML
|
||||
cell.innerHTML = ct;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue