polygon-website-foss/directory_admin/moderate-user.php

227 lines
9.6 KiB
PHP

<?php require $_SERVER['DOCUMENT_ROOT'].'/api/private/core.php';
use pizzaboxer\ProjectPolygon\Database;
use pizzaboxer\ProjectPolygon\Users;
use pizzaboxer\ProjectPolygon\PageBuilder;
Users::RequireAdmin([Users::STAFF_MODERATOR, Users::STAFF_CATALOG, Users::STAFF_ADMINISTRATOR]);
$query = Database::singleton()->run("SELECT * FROM bans ORDER BY id DESC");
$pageBuilder = new PageBuilder(["title" => "Moderate User"]);
$pageBuilder->addResource("stylesheets", "https://cdn.jsdelivr.net/gh/gitbrent/bootstrap4-toggle@3.6.1/css/bootstrap4-toggle.min.css");
$pageBuilder->addResource("stylesheets", "/css/bootstrap-datepicker.min.css");
$pageBuilder->addResource("scripts", "https://cdn.jsdelivr.net/gh/gitbrent/bootstrap4-toggle@3.6.1/js/bootstrap4-toggle.min.js");
$pageBuilder->addResource("scripts", "/js/bootstrap-datepicker.min.js");
$pageBuilder->buildHeader();
?>
<h2 class="font-weight-normal">User Moderation</h2>
<nav>
<div class="nav nav-tabs" id="nav-tab" role="tablist">
<a class="nav-item nav-link active" id="nav-home-tab" data-toggle="tab" href="#nav-home" role="tab" aria-controls="nav-home" aria-selected="true">Moderate</a>
<a class="nav-item nav-link" id="nav-contact-tab" data-toggle="tab" href="#nav-contact" role="tab" aria-controls="nav-contact" aria-selected="false">Moderation history</a>
</div>
</nav>
<div class="tab-content" id="nav-tabContent">
<div class="tab-pane show active" id="nav-home" role="tabpanel" aria-labelledby="nav-home-tab">
<div class="row">
<div class="col-lg-5 pt-4 divider-right">
<div class="form-group row">
<label for="username" class="col-sm-3 col-form-label">Username</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="username" value="<?=isset($_GET["username"]) ? $_GET["username"].'" disabled="disabled' : ''?>">
</div>
</div>
<div class="form-group row">
<div class="col-sm-3">Type</div>
<div class="col-sm-9">
<select class="form-control" id="banType">
<option value="1">Warning</option>
<option value="2">Ban</option>
<option value="3">Permanent Ban</option>
<option value="4">Undo moderation</option>
</select>
</div>
</div>
<div class="form-group row" data-control="deleteUsername">
<div class="col-sm-3"></div>
<div class="col-sm-9">
<div class="form-check pl-0">
<input class="form-check-input" type="checkbox" data-toggle="toggle" data-size="xs" id="deleteUsername">
<label class="form-check-label" for="deleteUsername">Content Delete Username</label>
</div>
</div>
</div>
<div class="form-group row" data-control="reason">
<label for="reason" class="col-sm-3 col-form-label">Reason</label>
<div class="col-sm-9">
<textarea class="form-control" id="reason" placeholder="markdown is supported"></textarea>
</div>
</div>
<div class="form-group row">
<label for="note-internal" class="col-sm-3 col-form-label">Staff note</label>
<div class="col-sm-9">
<textarea class="form-control" id="staffnote"></textarea>
</div>
</div>
<div class="form-group row" data-control="bannedUntil" style="display:none">
<label for="bannedUntil" class="col-sm-3 col-form-label">Until</label>
<div class="col-sm-9">
<div class="input-group date" data-provide="datepicker">
<input type="text" class="form-control" id="bannedUntil" placeholder="mm/dd/yyyy" value="<?=date('m/d/Y', strtotime('tomorrow'))?>">
<div class="input-group-addon">
<span class="glyphicon glyphicon-th"></span>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-8 px-0">
<button class="btn btn-warning btn-block text-light" data-control="moderateUser"><span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" style="display:none"></span> Moderate User</button>
</div>
<div class="col-sm-4">
<button class="btn btn-outline-primary btn-block" data-control="previewModeration"><span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" style="display:none"></span> Preview</button>
</div>
</div>
</div>
<div class="col-lg-7 pt-3">
<h2 class="font-weight-normal">Preview</h2>
<div class="card">
<div class="card-header">
<?=SITE_CONFIG["site"]["name"]?> Moderation
</div>
<div class="card-body moderation-preview">
<h2 class="font-weight-normal">Warning</h2>
<p class="card-text">This is just a heads-up to remind you to follow the rules</p>
<p class="card-text">Done at: <?=date('j/n/Y g:i:s A \G\M\T')?></p>
<p class="card-text mb-0">Reason: </p>
<p><i>No moderation note set</i></p>
<p class="card-text">Please re-read the <a href="/info/rules">rules</a> and abide by them to prevent yourself from facing a ban</p>
<a href="#" class="btn btn-primary disabled">Reactivate</a>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="nav-contact" role="tabpanel" aria-labelledby="nav-contact-tab">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Started</th>
<th scope="col">User</th>
<th scope="col">Type</th>
<th scope="col">Done by</th>
<th scope="col">Ends</th>
<th scope="col">Undone</th>
<th scope="col">Reason</th>
<th scope="col">Staff note</th>
</tr>
</thead>
<tbody>
<tr>
<?php while($row = $query->fetch(\PDO::FETCH_OBJ)) { ?>
<tr>
<td title="<?=date('j/n/Y g:i:s A \G\M\T', $row->timeStarted)?>">
<?=date('j/n/Y', $row->timeStarted)?>
</td>
<td>
<a href="/user?ID=<?=$row->userId?>"><?=Users::GetNameFromID($row->userId)?></a>
</td>
<td>
<?=[1=>"Warning", 2=>"Ban", 3=>"Permanent ban"][$row->banType]?>
</td>
<td>
<a href="/user?ID=<?=$row->userId?>"><?=Users::GetNameFromID($row->bannerId)?></a>
</td>
<td title="<?=$row->banType == 2 ? date('j/n/Y g:i:s A \G\M\T', $row->timeEnds) : 'Not Applicable'?>">
<?=$row->banType == 2 ? date('j/n/Y', $row->timeEnds) : "N/A"?>
</td>
<td>
<?=$row->isDismissed?"Yes":"No"?>
</td>
<td>
<button class="btn btn-outline-primary" data-title="Ban reason for <?=Users::GetNameFromID($row->userId)?>" data-text="<?=htmlspecialchars($row->reason)?>" data-control="openModal">View</button>
</td>
<td>
<?php if($row->note){ ?>
<button class="btn btn-outline-primary" data-title="Staff note for <?=Users::GetNameFromID($row->userId)?>" data-text="<?=htmlspecialchars($row->note)?>" data-control="openModal">View</button>
<?php } else { echo "N/A"; } ?>
</td>
</tr>
<?php } ?>
</tr>
</tbody>
</table>
</div>
</div>
<script>
//admin.js
$('button[data-control$="previewModeration"]').on('click', this, function()
{
var button = this;
$(button).attr("disabled", "disabled").find("span").show();
$.post('/api/admin/previewModeration', {"banType":$("#banType").val(), "moderationNote":$("#reason").val(), "until":$("#bannedUntil").val()}, function(data)
{
if(data.success)
{
$(".moderation-preview").empty();
$(".moderation-preview").html(data.message);
toastr["success"]("Updated moderation preview");
}
else{ toastr["error"](data.message); }
$(button).removeAttr("disabled").find("span").hide();
});
});
$('button[data-control$="moderateUser"]').on('click', this, function()
{
var button = this;
$(button).attr("disabled", "disabled").find("span").show();
$.post('/api/admin/moderateUser', {"username":$("#username").val(), "banType":$("#banType").val(), "moderationNote":$("#reason").val(), "staffNote":$("#staffnote").val(), "until":$("#bannedUntil").val(), "deleteUsername":$("#deleteUsername").is(":checked")}, function(data)
{
if(data.success){ toastr["success"](data.message); }
else{ toastr["error"](data.message); }
$(button).removeAttr("disabled").find("span").hide();
});
});
$('#banType').on('change', this, function()
{
if($(this).val() == 2)
{
$('[data-control$="bannedUntil"]').show(400);
}
else
{
$('[data-control$="bannedUntil"]').hide(400);
}
if($(this).val() == 4)
{
$('[data-control$="reason"]').hide(400);
$('[data-control$="deleteUsername"]').hide(400);
$('button[data-control$="previewModeration"]').attr("disabled", "disabled");
}
else
{
$('[data-control$="reason"]').show(400);
$('[data-control$="deleteUsername"]').show(400);
$('button[data-control$="previewModeration"]').removeAttr("disabled");
}
});
$('button[data-control$="openModal"]').on('click', this, function()
{
polygon.buildModal({
header: $(this).attr("data-title"),
body: $(this).attr("data-text"),
buttons: [{class: 'btn btn-outline-secondary', dismiss: true, text: 'Close'}]
});
});
</script>
<?php $pageBuilder->buildFooter(); ?>