580 lines
20 KiB
PHP
580 lines
20 KiB
PHP
<?php
|
|
|
|
use Fobe\Groups\Group;
|
|
|
|
$groupid = (int)$_GET['id'];
|
|
|
|
if ($groupid)
|
|
{
|
|
if (!is_int($groupid) || !Group::Exists($groupid) || !Group::ConfigPermission($user->id, $groupid))
|
|
{
|
|
http_response_code(404);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
http_response_code(404);
|
|
}
|
|
|
|
$body = <<<EOT
|
|
<div class="container">
|
|
<div id = "error_alert" class="alert alert-danger" role="alert" style="display:none;"></div>
|
|
<div class="row">
|
|
<div class="col-sm-3 mb-4">
|
|
<div class="card">
|
|
<div class="card-body text-center">
|
|
<div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
|
|
<a class="nav-link active red-a-nounder" id="v-pills-general-tab" data-toggle="pill" href="#v-pills-general" role="tab" aria-controls="v-pills-general" aria-selected="true">General</a>
|
|
<a class="nav-link red-a-nounder" id="v-pills-members-tab" data-toggle="pill" href="#v-pills-members" role="tab" aria-controls="v-pills-members" aria-selected="false">Members</a>
|
|
<a class="nav-link red-a-nounder" id="v-pills-roles-tab" data-toggle="pill" href="#v-pills-roles" role="tab" aria-controls="v-pills-roles" aria-selected="false">Roles</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<div class="tab-content" id="v-pills-tabContent">
|
|
<div class="tab-content" id="v-pills-tabContent">
|
|
<div class="tab-pane fade show active" id="v-pills-general" role="tabpanel" aria-labelledby="v-pills-general-tab">
|
|
<div class="container text-center">
|
|
<h5>General</h5>
|
|
<hr>
|
|
<img class="img-fluid mb-2" style="width:14rem;" id="group_emblem" src="https://t7.rbxcdn.com/842728e0a8e241d132cafbee29f10a57">
|
|
<div class="input-group mb-2">
|
|
<div class="custom-file">
|
|
<input type="file" name="icon_file" class="custom-file-input" id="inputIconFile">
|
|
<label class="custom-file-label" for="inputIconFile">Group Icon File</label>
|
|
</div>
|
|
</div>
|
|
<textarea class="form-control mb-2" style="height:12rem;max-height:12rem;min-height:12rem;" name="gdesc" id = "group_description" autocomplete="off"></textarea>
|
|
<div class="custom-control custom-checkbox custom-control-inline mb-2">
|
|
<input type="checkbox" name="manual_checkbox" class="custom-control-input" id="manual_join_requests">
|
|
<label class="custom-control-label" for="manual_join_requests">Manual Join Requests</label>
|
|
</div>
|
|
<h5>Join Requests</h5>
|
|
<hr>
|
|
<div class="card w-100 mb-2">
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-sm">
|
|
<div class="group-approval-container">
|
|
<ul id="join_requests">
|
|
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="text-center">
|
|
<div class="btn-group mb-3" id="join_requests_buttons">
|
|
|
|
</div>
|
|
</div>
|
|
<button class="btn btn-danger w-100" onclick="configGroup()">Update</button>
|
|
</div>
|
|
</div>
|
|
<div class="tab-pane fade" id="v-pills-members" role="tabpanel" aria-labelledby="v-pills-members-tab">
|
|
<div class="container text-center">
|
|
<h5>Members</h5>
|
|
<hr>
|
|
<div class="row mb-2">
|
|
<div class="col-sm" id="members_manage_list">
|
|
|
|
</div>
|
|
</div>
|
|
<div class="text-center">
|
|
<div class="btn-group mt-2 mb-2" role="group" aria-label="First group" id="members_manage_buttons">
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="tab-pane fade" id="v-pills-roles" role="tabpanel" aria-labelledby="v-pills-roles-tab">
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
|
|
<h6 class="text-center">Roles</h6>
|
|
<div id = "current_group_roles">
|
|
|
|
</div>
|
|
<button type="button" class="btn btn-sm btn-danger mt-3" data-toggle="modal" data-target="#createnewrole">Create New</button>
|
|
<div class="modal fade" id="createnewrole" tabindex="-1" role="dialog" aria-labelledby="createnewroleLabel" aria-hidden="true">
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="exampleModalLabel">Create New Role</h5>
|
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
|
<span aria-hidden="true">×</span>
|
|
</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<label>Role Name</label>
|
|
<input class="form-control mb-3" type="text" id="new_role_name" autocomplete="off" placeholder="Role Name">
|
|
<label>Rank</label>
|
|
<input class="form-control" type="text" id="new_role_rank" autocomplete="off" placeholder="0 - 254">
|
|
<strong class="mt-1">This will cost you 15 Alphabux</strong>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-danger" onclick="createRole()">Create Role</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm">
|
|
<div id="reg_role_configuration">
|
|
<h5 class="text-center" id="role_name"></h5>
|
|
<label>Role Name</label>
|
|
<input class="form-control mb-3" type="text" name="rolename" id="rolename_input" placeholder="Role Name">
|
|
<div id="reg_config_elements">
|
|
<label>Rank</label>
|
|
<input class="form-control" type="text" name="rolerank" id="rolerank_input" placeholder="0 - 255">
|
|
<hr>
|
|
<h5 class="text-center">Permissions</h5>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>View group wall</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="groupwallaccess" value="viewgroupwall" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>Post on group wall</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="grouppostaccess" value="postgroupwall" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>Delete group wall posts</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="groupdeleteaccess" value="deletegroupwall" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>Post group shout</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="groupshoutaccess" value="postgroupshout" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>Manage lower ranked members ranks</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="groupmanagelowerranks" value="managelowermemranks" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>Kick lower ranked members</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="groupkicklowerranks" value="kicklowermemranks" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>Accept join requests</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="groupacceptjoinrequests" value="accjoinrequests" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-2 border-top border-bottom">
|
|
<div class="col-sm">
|
|
<strong>View Audit Log</strong>
|
|
</div>
|
|
<div class="col-sm-3">
|
|
<div class="form-check float-right">
|
|
<input class="form-check-input position-static" type="checkbox" id="groupauditaccess" value="viewauditlog" aria-label="...">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<button class="btn btn-sm btn-danger w-100" onclick="updateRole()">Save</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
//global vars
|
|
var currentRolesRank = -1;
|
|
var groupid = new URLSearchParams(window.location.search).get('id');
|
|
var image = "";
|
|
|
|
//picture upload handling
|
|
function readEmblem(input)
|
|
{
|
|
if (input.files && input.files[0])
|
|
{
|
|
var reader = new FileReader();
|
|
reader.onload = function(e) {
|
|
image = e.target.result;
|
|
$('#group_emblem').attr('src', image);
|
|
}
|
|
reader.readAsDataURL(input.files[0]);
|
|
}
|
|
}
|
|
|
|
$("#inputIconFile").change(function() {
|
|
readEmblem(this);
|
|
});
|
|
|
|
//roles tab
|
|
|
|
function createRole()
|
|
{
|
|
postJSONCDS("https://api.idk16.xyz/group/update?id="+groupid+"&newrole=true", JSON.stringify({"name":$('#new_role_name').val(),"rank":parseInt($('#new_role_rank').val())}))
|
|
.done(function(object) {
|
|
var alert = object.alert;
|
|
var messageid = "#error_alert";
|
|
if (alert == "Group Updated") {
|
|
$('#new_role_name').val('');
|
|
$('#new_role_rank').val('');
|
|
currentRoles();
|
|
}
|
|
else
|
|
{
|
|
$(messageid).text(alert);
|
|
$(messageid).show();
|
|
|
|
setTimeout(function()
|
|
{
|
|
$(messageid).hide();
|
|
}, 3000);
|
|
}
|
|
$("#createnewrole").modal('hide');
|
|
});
|
|
}
|
|
|
|
function updateRole()
|
|
{
|
|
postJSONCDS("https://api.idk16.xyz/group/update?id="+groupid+"&updaterole=true", JSON.stringify({
|
|
"rank":currentRolesRank,
|
|
"NewRank":parseInt($('#rolerank_input').val()),
|
|
"Name":$("#rolename_input").val(),
|
|
"AccessGroupWall":$('#groupwallaccess').prop('checked'),
|
|
"PostGroupWall":$('#grouppostaccess').prop('checked'),
|
|
"DeleteGroupWallPosts":$('#groupdeleteaccess').prop('checked'),
|
|
"PostGroupShout":$('#groupshoutaccess').prop('checked'),
|
|
"ManageLowerRanks":$('#groupmanagelowerranks').prop('checked'),
|
|
"KickLowerRanks":$('#groupkicklowerranks').prop('checked'),
|
|
"AcceptJoinRequests":$('#groupacceptjoinrequests').prop('checked'),
|
|
"ViewAuditLog":$('#groupauditaccess').prop('checked')
|
|
}))
|
|
.done(function(object) {
|
|
var alert = object.alert;
|
|
var messageid = "#error_alert";
|
|
if (alert == "Group Updated") {
|
|
currentRolesRank = $('#rolerank_input').val();
|
|
}
|
|
else
|
|
{
|
|
$(messageid).text(alert);
|
|
$(messageid).show();
|
|
|
|
setTimeout(function()
|
|
{
|
|
$(messageid).hide();
|
|
}, 3000);
|
|
}
|
|
currentRoles();
|
|
openRole(currentRolesRank);
|
|
window.scrollTo({top: 0, behavior: "smooth"});
|
|
});
|
|
}
|
|
|
|
function openRole(rank="")
|
|
{
|
|
getJSONCDS("https://api.idk16.xyz/group/roles?id="+groupid+"&rank="+rank)
|
|
.done(function(jsonData) {
|
|
var data = jsonData[0];
|
|
if (data)
|
|
{
|
|
if (!rank)
|
|
{
|
|
currentRolesRank = data.rank;
|
|
rank = data.rank;
|
|
}
|
|
|
|
if (rank == 255) {
|
|
$("#reg_config_elements").hide();
|
|
} else {
|
|
$("#reg_config_elements").show();
|
|
}
|
|
|
|
var roleTabExists = setInterval(function()
|
|
{
|
|
if ($("#"+currentRolesRank+"-tab").length)
|
|
{
|
|
$("#"+currentRolesRank+"-tab").removeClass("active")
|
|
currentRolesRank = data.rank;
|
|
console.log("#"+currentRolesRank+"-tab");
|
|
$("#role_name").html(data.name+" Role");
|
|
$("#rolename_input").val(data.name);
|
|
$("#rolerank_input").val(data.rank);
|
|
$("#groupwallaccess").prop('checked', data.wallViewPermission);
|
|
$("#grouppostaccess").prop('checked', data.wallPostPermission);
|
|
$("#groupdeleteaccess").prop('checked', data.wallDeletePermission);
|
|
$("#groupshoutaccess").prop('checked', data.postShoutPermission);
|
|
$("#groupmanagelowerranks").prop('checked', data.manageLowerRankPermission);
|
|
$("#groupkicklowerranks").prop('checked', data.kickLowerRankPermission);
|
|
$("#groupacceptjoinrequests").prop('checked', data.acceptJoinRequestPermission);
|
|
$("#groupauditaccess").prop('checked', data.viewAuditLogPermission);
|
|
$("#"+currentRolesRank+"-tab").addClass("active");
|
|
clearInterval(roleTabExists);
|
|
}
|
|
}, 100); //100 ms
|
|
}
|
|
});
|
|
}
|
|
|
|
function currentRoles()
|
|
{
|
|
var html = '<a class="nav-link red-a-nounder mouse-hover" id="{rank}-tab" onclick="openRole({rank})">{name}</a>';
|
|
|
|
staticPageHelper("https://api.idk16.xyz/group/roles", "https://api.idk16.xyz/logo", "#current_group_roles", html, "", 100, "", "Error occurred", "&id="+groupid);
|
|
|
|
openRole();
|
|
}
|
|
|
|
//group config
|
|
|
|
function configGroup()
|
|
{
|
|
var approvals = false;
|
|
if ($('#manual_join_requests').is(":checked"))
|
|
{
|
|
approvals = true;
|
|
}
|
|
|
|
postJSONCDS("https://api.idk16.xyz/group/update?id="+groupid+"&updateinfo=true", JSON.stringify({"description": $("#group_description").val(), "approvals": approvals, "emblem":image}))
|
|
.done(function(object) {
|
|
var alert = object.alert;
|
|
var messageid = "#error_alert";
|
|
if (alert == "Group Updated") {
|
|
initialize();
|
|
}
|
|
else
|
|
{
|
|
$(messageid).text(alert);
|
|
$(messageid).show();
|
|
|
|
setTimeout(function()
|
|
{
|
|
$(messageid).hide();
|
|
}, 3000);
|
|
}
|
|
window.scrollTo({top: 0, behavior: "smooth"});
|
|
});
|
|
}
|
|
|
|
//member management
|
|
|
|
function changeRank(userid, rank)
|
|
{
|
|
postJSONCDS("https://api.idk16.xyz/group/update?id="+groupid+"&userrank=true", JSON.stringify({"userid": userid, "rank": rank}))
|
|
.done(function(object) {
|
|
var alert = object.alert;
|
|
var messageid = "#error_alert";
|
|
if (alert == "Group Updated") {
|
|
membersPage(1);
|
|
}
|
|
else
|
|
{
|
|
$(messageid).text(alert);
|
|
$(messageid).show();
|
|
window.scrollTo({top: 0, behavior: "smooth"});
|
|
setTimeout(function()
|
|
{
|
|
$(messageid).hide();
|
|
}, 3000);
|
|
}
|
|
});
|
|
}
|
|
|
|
function exileUser(userid)
|
|
{
|
|
postJSONCDS("https://api.idk16.xyz/group/update?id="+groupid+"&exileuser=true", JSON.stringify({"userid": userid}))
|
|
.done(function(object) {
|
|
var alert = object.alert;
|
|
var messageid = "#error_alert";
|
|
if (alert == "Group Updated") {
|
|
membersPage(1);
|
|
}
|
|
else
|
|
{
|
|
$(messageid).text(alert);
|
|
$(messageid).show();
|
|
window.scrollTo({top: 0, behavior: "smooth"});
|
|
setTimeout(function()
|
|
{
|
|
$(messageid).hide();
|
|
}, 3000);
|
|
}
|
|
});
|
|
}
|
|
|
|
function approveRequest(userid)
|
|
{
|
|
postJSONCDS("https://api.idk16.xyz/group/update?id="+groupid+"&approverequest=true", JSON.stringify({"userid": userid}))
|
|
.done(function(object) {
|
|
var alert = object.alert;
|
|
var messageid = "#error_alert";
|
|
if (alert == "Group Updated") {
|
|
initialize();
|
|
}
|
|
else
|
|
{
|
|
$(messageid).text(alert);
|
|
$(messageid).show();
|
|
window.scrollTo({top: 0, behavior: "smooth"});
|
|
setTimeout(function()
|
|
{
|
|
$(messageid).hide();
|
|
}, 3000);
|
|
}
|
|
});
|
|
}
|
|
function denyRequest(userid)
|
|
{
|
|
postJSONCDS("https://api.idk16.xyz/group/update?id="+groupid+"&denyrequest=true", JSON.stringify({"userid": userid}))
|
|
.done(function(object) {
|
|
var alert = object.alert;
|
|
var messageid = "#error_alert";
|
|
if (alert == "Group Updated") {
|
|
initialize();
|
|
}
|
|
else
|
|
{
|
|
$(messageid).text(alert);
|
|
$(messageid).show();
|
|
window.scrollTo({top: 0, behavior: "smooth"});
|
|
setTimeout(function()
|
|
{
|
|
$(messageid).hide();
|
|
}, 3000);
|
|
}
|
|
});
|
|
}
|
|
|
|
//join requests page
|
|
function requestsPage(page)
|
|
{
|
|
getRequestsPage(page, 4);
|
|
}
|
|
function getRequestsPage(page, limit)
|
|
{
|
|
var html = '<li>';
|
|
html += '<div class="card mb-1">';
|
|
html += '<div class="card-body">';
|
|
html += '<a class="red-a-nounder">';
|
|
html += '<img class="img-fluid" src="{thumbnail}">';
|
|
html += '<p>{username}</p>';
|
|
html += '</a>';
|
|
html += '<div class="row mb-1">';
|
|
html += '<div class="col-sm">';
|
|
html += '<button class="btn btn-success w-100" onclick="approveRequest({userid})">Approve</button>';
|
|
html += '</div>';
|
|
html += '</div>';
|
|
html += '<div class="row">';
|
|
html += '<div class="col-sm">';
|
|
html += '<button class="btn btn-danger w-100" onclick="denyRequest({userid})">Deny</button>';
|
|
html += '</div>';
|
|
html += '</div>';
|
|
html += '</div>';
|
|
html += '</div>';
|
|
html += '</li>';
|
|
|
|
multiPageHelper("requestsPage", [], "https://api.idk16.xyz/group/joinrequests", "https://api.idk16.xyz/logo", "#join_requests", "#join_requests_buttons", html, page, limit, "", "No join requests", "&id="+groupid);
|
|
}
|
|
|
|
//members page
|
|
function membersAvailableRoles(userid)
|
|
{
|
|
var html = '<li class="dropdown-custom bootstrap-toggle-dropdown" onclick="changeRank('+userid+',{rank})">{name}</li>';
|
|
|
|
staticPageHelper("https://api.idk16.xyz/group/roles?id="+groupid, "", "#member"+userid+"dropdown", html, "", 100, "", "Error occurred", "&excluderank=255");
|
|
}
|
|
function membersPage(page)
|
|
{
|
|
getMembersPage(page, 6)
|
|
}
|
|
function getMembersPage(page, limit)
|
|
{
|
|
var html = '<div class="card gaytempfix float-left text-center p-2 m-1 group-user-card" style="width:15.15rem;">';
|
|
html += '<a href="/profile/view?id={userid}"><img class="img-fluid" src="{thumbnail}" style="width:8rem;"></a>';
|
|
html += '<div class="text-center">';
|
|
html += '<a class="red-a-nounder no-overflow">{username}</a>';
|
|
html += '</div>';
|
|
html += '<div class="mb-2 mt-2 dropdown">';
|
|
html += '<button class="dropdown-custom dropdown" type="button" data-toggle="dropdown" onclick="membersAvailableRoles({userid})">{rankname}</button>';
|
|
html += '<ul class="bootstrap-dropdown-parent dropdown-menu" id="member{userid}dropdown">';
|
|
html += '</ul>';
|
|
html += '</div>';
|
|
html += '<button class="btn btn-sm btn-danger" onclick="exileUser({userid})">Exile</button>';
|
|
html += '</div>';
|
|
|
|
multiPageHelper("membersPage", [], "https://api.idk16.xyz/group/members", "https://api.idk16.xyz/logo", "#members_manage_list", "#members_manage_buttons", html, page, limit, "", "No members", "&id="+groupid+"&excluderank=255");
|
|
}
|
|
|
|
//initialize
|
|
function initialize()
|
|
{
|
|
getJSONCDS("https://api.idk16.xyz/group/info?id=" + groupid)
|
|
.done(function(jsonData) {
|
|
var data = jsonData[0];
|
|
$("#group_name").val(data.name);
|
|
$("#group_emblem").attr("src", data.emblem);
|
|
$("#group_description").val(data.description);
|
|
$("#manual_join_requests").prop('checked', data.manualJoinRequests);
|
|
});
|
|
requestsPage(1);
|
|
membersPage(1);
|
|
currentRoles();
|
|
}
|
|
initialize();
|
|
</script>
|
|
|
|
EOT;
|
|
pageHandler();
|
|
$ph->pageTitle("Group Config");
|
|
$ph->body = $body;
|
|
$ph->output(); |