polygon-website-foss/js/polygon/groups.js

722 lines
24 KiB
JavaScript

polygon.groups =
{
allies_page: 1,
display_allies: function(page)
{
if(!$(".allies-container").length) return false;
if(page == undefined) page = this.allies_page;
else this.allies_page = page;
$(".allies-container .items").empty();
$(".allies-container .no-items").addClass("d-none");
$(".allies-container .pagination").addClass("d-none");
$(".allies-container .loading").removeClass("d-none");
$.post('/api/groups/get-related', { GroupID: $(".app").attr("data-group-id"), Type: "Allies", Page: page }, function(data)
{
$(".allies-container .loading").addClass("d-none");
polygon.pagination.handle("allies", page, data.pages);
if(!data.success) return polygon.insertAlert({text: "An error occurred while fetching group allies", parent: ".allies-container"});
if(data.items == undefined) return $(".allies-container .no-items").text(data.message).removeClass("d-none");
polygon.populateRow("allies", data.items);
$(".allies-tab-item").removeClass("d-none");
});
return true;
},
enemies_page: 1,
display_enemies: function(page)
{
if(!$(".enemies-container").length) return false;
if(page == undefined) page = this.allies_page;
else this.allies_page = page;
$(".enemies-container .items").empty();
$(".enemies-container .no-items").addClass("d-none");
$(".enemies-container .pagination").addClass("d-none");
$(".enemies-container .loading").removeClass("d-none");
$.post('/api/groups/get-related', { GroupID: $(".app").attr("data-group-id"), Type: "Enemies", Page: page }, function(data)
{
$(".enemies-container .loading").addClass("d-none");
polygon.pagination.handle("enemies", page, data.pages);
if(!data.success) return polygon.insertAlert({text: "An error occurred while fetching group enemies", parent: ".enemies-container"});
if(data.items == undefined) return $(".enemies-container .no-items").text(data.message).removeClass("d-none");
polygon.populateRow("enemies", data.items);
$(".enemies-tab-item").removeClass("d-none");
});
return true;
},
members_rank: 1,
members_page: 1,
display_members: function(page, rank)
{
if(!$(".members-container").length) return false;
if(page == undefined) page = this.members_page;
else this.members_page = page;
if(rank == undefined) rank = $("select#ranks").val();
this.members_rank = rank;
$(".members-container .items").empty();
$(".members-container .no-items").addClass("d-none");
$(".members-container .pagination").addClass("d-none");
$(".members-container .loading").removeClass("d-none");
$.post('/api/groups/get-members', {GroupID: $(".app").attr("data-group-id"), RankLevel: rank, Page: page}, function(data)
{
$(".members-container .loading").addClass("d-none");
polygon.pagination.handle("members", page, data.pages);
if(!data.success) return polygon.insertAlert({text: "An error occurred while fetching group members", parent: ".members-container"});
var select = $("select#ranks option[value=\"" + rank + "\"]");
if(select.attr("data-loaded") == "false")
{
if(data.count == undefined) select.text(select.text() + " (0)");
else select.text(select.text() + " (" + data.count + ")");
select.attr("data-loaded", "true")
}
if(data.items == undefined) return $(".members-container .no-items").text(data.message).removeClass("d-none");
polygon.populateRow("members", data.items);
});
return true;
},
wall_page: 1,
display_wall: function(page)
{
if(!$(".wall-container").length) return false;
if(page == undefined) page = this.wall_page;
else this.wall_page = page;
$(".wall-container .items").empty();
$(".wall-container .no-items").addClass("d-none");
$(".wall-container .pagination").addClass("d-none");
$(".wall-container .loading").removeClass("d-none");
$.post('/api/groups/get-wall', {GroupID: $(".app").attr("data-group-id"), Page: page}, function(data)
{
$(".wall-container .loading").addClass("d-none");
polygon.pagination.handle("wall", page, data.pages);
if(!data.success) return polygon.insertAlert({text: "An error occurred while fetching group wall", parent: ".wall-container"});
if(data.items == undefined) return $(".wall-container .no-items").text(data.message).removeClass("d-none");
polygon.populateRow("wall", data.items);
});
return true;
},
post_wall: function()
{
$(".post-wall-error").text("");
polygon.button.busy(".post-wall");
$.post('/api/groups/post-wall', {GroupID: $(".app").attr("data-group-id"), Content: $(".post-wall-input").val()}, function(data)
{
polygon.button.active(".post-wall");
if(data.success) polygon.groups.display_wall(1);
else $(".post-wall-error").text(data.message);
});
},
delete_wall_post: function(event)
{
event.preventDefault();
$.post('/api/groups/delete-wall-post', {GroupID: $(".app").attr("data-group-id"), PostID: $(event.target).attr("data-post-id")}, function(data)
{
if(data.success) polygon.groups.display_wall();
else polygon.buildModal({ header: "Error", body: data.message, buttons: [{'class':'btn btn-primary px-4', 'dismiss':true, 'text':'OK'}]});
});
},
post_shout: function()
{
$(".post-shout-error").text("");
polygon.button.busy(".post-shout");
$.post('/api/groups/post-shout', {GroupID: $(".app").attr("data-group-id"), Content: $(".post-shout-input").val()}, function(data)
{
polygon.button.active(".post-shout");
if(data.success) window.location.reload();
else $(".post-shout-error").text(data.message);
});
},
join_group: function()
{
if(!polygon.user.logged_in)
return window.location = "/login?ReturnUrl="+encodeURI(window.location.pathname+window.location.search);
$.post('/api/groups/join-group', {GroupID: $(".app").attr("data-group-id")}, function(data)
{
if(data.success) window.location.reload();
else polygon.buildModal({ header: "Error", body: data.message, buttons: [{'class':'btn btn-primary px-4', 'dismiss':true, 'text':'OK'}]});
});
},
leave_group_prompt: function()
{
polygon.buildModal({
header: "Leave Group",
body: 'Are you sure you want to leave this group?',
buttons: [{class:'btn btn-primary px-4 leave-group', text:'Yes'}, {class:'btn btn-secondary px-4', dismiss:true, text:'No'}]
});
},
leave_group: function()
{
$.post('/api/groups/leave-group', {GroupID: $(".app").attr("data-group-id")}, function(data)
{
if(data.success) window.location.reload();
else polygon.buildModal({ header: "Error", body: data.message, buttons: [{'class':'btn btn-primary px-4', 'dismiss':true, 'text':'OK'}]});
});
}
}
polygon.groups.admin =
{
roles: [],
role_permissions:
[
{
"Title": "Posts",
"Permissions":
[
{"Title": "View group wall", "Name": "CanViewGroupWall", "Value": false},
{"Title": "View group status", "Name": "CanViewGroupStatus", "Value": false},
{"Title": "Post on group wall", "Name": "CanPostOnGroupWall", "Value": false},
{"Title": "Post group status", "Name": "CanPostGroupStatus", "Value": false},
{"Title": "Delete group wall posts", "Name": "CanDeleteGroupWallPosts", "Value": false}
]
},
{
"Title": "Members",
"Permissions":
[
{"Title": "Accept join requests", "Name": "CanAcceptJoinRequests", "Value": false},
{"Title": "Kick lower-ranked members", "Name": "CanKickLowerRankedMembers", "Value": false},
{"Title": "Manage lower-ranked member roles", "Name": "CanRoleLowerRankedMembers", "Value": false},
{"Title": "Manage allies and enemies", "Name": "CanManageRelationships", "Value": false}
]
},
{
"Title": "Assets",
"Permissions":
[
{"Title": "Create group items", "Name": "CanCreateAssets", "Value": false},
{"Title": "Configure group items", "Name": "CanConfigureAssets", "Value": false},
{"Title": "Spend group funds", "Name": "CanSpendFunds", "Value": false},
{"Title": "Create and edit group games", "Name": "CanManageGames", "Value": false}
]
},
{
"Title": "Miscellaneous",
"Permissions":
[
{"Title": "Manage group admin", "Name": "CanManageGroupAdmin", "Value": false},
{"Title": "View audit log", "Name": "CanViewAuditLog", "Value": false}
]
}
],
roles_cap: 10,
get_roles: function()
{
$.post('/api/groups/admin/get-roles', {GroupID: $(".app").attr("data-group-id")}, function(data)
{
if(!data.success) return options.on_error();
$(".template select#MemberRanks").empty();
$.each(data.items, function(index, item)
{
data.items[index].ID = Math.round(Math.random()*10000); // not the actual role id, just a unique identifier for when we create/remove roles
if(item.Rank == 0 || item.Rank == 255) return;
$(".template select#MemberRanks").append("<option value=\"" + item.Rank + "\">" + item.Name + "</option>");
});
polygon.groups.admin.roles = data.items;
polygon.groups.admin.display_roles();
polygon.groups.admin.display_members();
});
},
display_roles: function()
{
if(!$(".roles-container").length) return false;
if(polygon.groups.admin.roles.length >= polygon.groups.admin.roles_cap) $(".roles-create").attr("disabled", "disabled");
else $(".roles-create").removeAttr("disabled");
$(".roles-container tbody").empty("")
$(".roles-container .loading").addClass("d-none");
// owner rank must be first
if(polygon.groups.admin.roles[0].Rank != 255)
polygon.groups.admin.roles.reverse()
$.each(polygon.groups.admin.roles, function(index, item)
{
var row = "";
row += "<tr data-role-identifier=\""+ item.ID +"\">";
if(item.Rank == 0)
{
row += "<td class=\"p-2\"><input type=\"text\" class=\"form-control form-control-sm role-name\" value=\""+ item.Name +"\" disabled=\"disabled\"></td>";
row += "<td class=\"p-2\"><input type=\"text\" class=\"form-control form-control-sm role-description\" value=\""+ item.Description +"\" disabled=\"disabled\"></td>";
}
else
{
row += "<td class=\"p-2\"><input type=\"text\" class=\"form-control form-control-sm role-name\" value=\""+ item.Name +"\"></td>";
row += "<td class=\"p-2\"><input type=\"text\" class=\"form-control form-control-sm role-description\" value=\""+ item.Description +"\"></td>";
}
if(item.Rank == 0 || item.Rank == 255)
{
row += "<td class=\"p-2\"><input type=\"text\" class=\"form-control form-control-sm role-rank\" value=\""+ item.Rank +"\" disabled=\"disabled\"></td>";
}
else
{
row += "<td class=\"p-2\"><input type=\"text\" class=\"form-control form-control-sm role-rank\" value=\""+ item.Rank +"\"></td>";
}
row += "<td class=\"p-2\">";
if(item.Rank != 255)
{
row += "<button class=\"btn btn-sm btn-light role-edit-permissions\">Permissions</button>";
}
if(item.Rank != 0 && item.Rank != 255 && polygon.groups.admin.roles.length > 3)
{
row += "<button class=\"btn btn-sm btn-outline-danger role-delete-prompt mx-2\"><i class=\"far fa-trash-alt\"></i></button>";
}
row += "</td>";
row += "</tr>";
$(row).appendTo(".roles-container tbody");
});
return true;
},
update_roles: function()
{
polygon.button.busy(".roles-save");
$(".roles-container tbody tr").each(function(_, item)
{
var ID = +$(item).attr("data-role-identifier");
var Role = polygon.groups.admin.roles.find(Role => Role.ID == ID);
Role.Name = $(item).find(".role-name").val();
Role.Description = $(item).find(".role-description").val();
Role.Rank = +$(item).find(".role-rank").val();
});
$.post('/api/groups/admin/update-roles', {GroupID: $(".app").attr("data-group-id"), Roles: JSON.stringify(polygon.groups.admin.roles)}, function(data)
{
polygon.button.active(".roles-save");
if(!data.success) return toastr["error"](data.message);
toastr["success"](data.message);
polygon.groups.admin.get_roles({reload: true});
});
},
add_role: function()
{
if(polygon.groups.admin.roles.length >= polygon.groups.admin.roles_cap)
return toastr["error"]("You can only have a maximum of "+polygon.groups.admin.roles_cap+" roles");
var GuestPermissions = polygon.groups.admin.roles.find(Role => Role.Rank == 0).Permissions;
// basically just get the minimum available rank
var DefaultRank = 1;
var DefaultIndex = polygon.groups.admin.roles.length-1;
var DefaultRankCalculated = false;
while (!DefaultRankCalculated)
{
if(polygon.groups.admin.roles.find(Role => Role.Rank == DefaultRank))
{
DefaultRank++;
DefaultIndex--;
}
else
{
DefaultRankCalculated = true;
}
}
polygon.groups.admin.roles.splice(DefaultIndex, 0,
{
ID: Math.round(Math.random()*10000),
Name: "New Role",
Description: "Describe your role!",
Rank: DefaultRank,
Permissions: GuestPermissions
});
polygon.groups.admin.display_roles();
},
delete_role: function(RoleID)
{
var RoleIndex = polygon.groups.admin.roles.findIndex(Role => Role.ID == +RoleID);
if(RoleIndex == -1) return;
polygon.groups.admin.roles.splice(RoleIndex, 1);
polygon.groups.admin.display_roles();
},
delete_role_prompt: function(RoleID)
{
polygon.buildModal({
header: "Delete Role",
body: 'Are you sure you want to delete this role? <br> Deleting this role will move all members assigned with this role to the lowest ranked role.',
buttons:
[
{
class: 'btn btn-primary px-4 role-delete',
text: 'Yes',
dismiss: true,
attributes: {'data-role-identifier':RoleID}
},
{
class: 'btn btn-secondary px-4',
text: 'No',
dismiss: true
}
]
});
},
configure_role_permissions: function(RoleID)
{
var Role = polygon.groups.admin.roles.find(Role => Role.ID == +RoleID);
if(!Role) return;
var Body = "<span class=\"jumbo spinner-border loading\" role=\"status\"></span>";
Body += "<div class=\"role-permissions-container d-none\">";
Body += "<div class=\"accordion\">";
$.each(polygon.groups.admin.role_permissions, function(_, Category)
{
Body += "<button class=\"accordion-header btn btn-sm btn-light btn-block mt-2 text-left\"><i class=\"fas fa-angle-down accordion-arrow\"></i> "+ Category.Title +"</button>";
Body += "<div class=\"accordion-body text-left px-4\">";
$.each(Category.Permissions, function(_, Permission)
{
Permission.Value = Role.Permissions[Permission.Name];
Body += "<div class=\"form-check px-0\">";
Body += "<input class=\"form-check-input role-change-permission\" type=\"checkbox\" data-toggle=\"toggle\" data-size=\"xs\" data-permission=\""+ Permission.Name +"\"";
if(Permission.Value) Body += " checked=\"checked\"";
Body += ">";
Body += "<label class=\"form-check-label px-2\">"+ Permission.Title +"</label>";
Body += "</div>";
});
Body += "</div>";
});
Body += "</div>";
Body += "</div>";
polygon.buildModal({
header: "Change Permissions For " + Role.Name,
body: Body,
buttons:
[
{
class: 'btn btn-success role-save-permissions px-4',
text: 'Save',
dismiss: true,
attributes: {'data-role-identifier':RoleID}
},
{
class: 'btn btn-secondary px-4',
text: 'Cancel',
dismiss: true
}
]
});
// if these are called too early, they wont work correctly
setTimeout(function()
{
$(".modal-body .loading").addClass("d-none");
$(".modal-body .role-permissions-container").removeClass("d-none");
polygon.registerHandlers("role-permissions");
}, 500);
},
change_role_permission: function(PermissionToChange, Value)
{
// having to do two array finds is kinda wasteful. maybe find a better way to do this?
polygon.groups.admin.role_permissions.find(Category => Category.Permissions.find(Permission => Permission.Name == PermissionToChange))
.Permissions.find(Permission => Permission.Name == PermissionToChange)
.Value = Value;
},
save_role_permissions: function(RoleID)
{
var StagingPermissions = polygon.groups.admin.roles.find(Role => Role.ID == +RoleID).Permissions;
$.each(polygon.groups.admin.role_permissions, function(_, Category)
{
$.each(Category.Permissions, function(_, Permission)
{
StagingPermissions[Permission.Name] = Permission.Value;
});
});
polygon.groups.admin.roles.find(Role => Role.ID == +RoleID).Permissions = StagingPermissions;
},
members_page: 1,
display_members: function(page)
{
if(!$(".members-container").length) return false;
if(page == undefined) page = this.members_page;
else this.members_page = page;
$(".members-container .items").empty();
$(".members-container .no-items").addClass("d-none");
$(".members-container .pagination").addClass("d-none");
$(".members-container .loading").removeClass("d-none");
$.post('/api/groups/admin/get-members', {GroupID: $(".app").attr("data-group-id"), Page: page}, function(data)
{
$(".members-container .loading").addClass("d-none");
polygon.pagination.handle("members", page, data.pages);
if(!data.success) return polygon.insertAlert({text:"An error occurred while fetching group members", parent:".members-container"});
if(data.items == undefined) return $(".members-container .no-items").text(data.message).removeClass("d-none");
polygon.populateRow("members", data.items);
$.each(data.items, function(_, item)
{
$("select#MemberRanks[data-user-id=\"" + item.UserID + "\"] option[value=\"" + item.RoleLevel + "\"]").prop("selected", "selected");
});
});
return true;
},
update_member: function(options = {})
{
options.GroupID = $(".app").attr("data-group-id");
$.post('/api/groups/admin/update-member', options, function(data)
{
toastr[data.success ? "success" : "error"](data.message);
});
},
update_member_rank: function(event)
{
var option = $(event.target);
polygon.groups.admin.update_member({UserID: option.attr("data-user-id"), RoleLevel: option.val()});
},
pending_allies_page: 1,
display_pending_allies: function(page)
{
if(!$(".pending-allies-container").length) return false;
if(page == undefined) page = this.pending_allies_page;
else this.pending_allies_page = page;
$(".pending-allies-container .items").empty();
$(".pending-allies-container .no-items").addClass("d-none");
$(".pending-allies-container .pagination").addClass("d-none");
$(".pending-allies-container .loading").removeClass("d-none");
$.post('/api/groups/get-related', { GroupID: $(".app").attr("data-group-id"), Type: "Pending Allies", Page: page }, function(data)
{
$(".pending-allies-container .loading").addClass("d-none");
polygon.pagination.handle("pending-allies", page, data.pages);
if(!data.success) return polygon.insertAlert({text: "An error occurred while fetching group allies", parent: ".pending.allies-container"});
if(data.items == undefined) $(".pending-allies-container").addClass("d-none"); else $(".pending-allies-container").removeClass("d-none");
polygon.populateRow("pending-allies", data.items);
});
return true;
},
request_relationship: function()
{
var Button = this;
var Type = $(Button).attr("data-type");
if(!$("input.request-" + Type).length) return;
var GroupName = $("input.request-" + Type).val();
polygon.button.busy(Button);
$.post('/api/groups/admin/request-relationship', { GroupID: $(".app").attr("data-group-id"), Recipient: GroupName, Type: Type }, function(data)
{
polygon.button.active(Button);
toastr[data.success ? "success" : "error"](data.message);
if(data.success)
{
polygon.groups.display_allies();
polygon.groups.display_enemies();
polygon.groups.admin.display_pending_allies();
}
});
},
update_relationship: function()
{
var Button = this;
var GroupID = parseInt($(Button).parents(".card").attr("data-group-id"));
var Action = $(Button).attr("data-action");
polygon.button.busy(Button);
$.post('/api/groups/admin/update-relationship', { GroupID: $(".app").attr("data-group-id"), Recipient: GroupID, Action: Action }, function(data)
{
polygon.button.active(Button);
toastr[data.success ? "success" : "error"](data.message);
if(data.success)
{
polygon.groups.display_allies();
polygon.groups.display_enemies();
polygon.groups.admin.display_pending_allies();
}
});
}
};
polygon.groups.audit =
{
Page: 1,
ReachedEnd: false,
Loading: true,
Control: "audit",
Filter: "All Actions",
Display: function(append, Filter)
{
if(!$(".audit-container").length) return false;
if(Filter == undefined) Filter = polygon.groups.audit.Filter;
else polygon.groups.audit.Filter = Filter;
if(append) polygon.groups.audit.Page += 1;
else polygon.groups.audit.Page = 1;
$(".audit-container .loading").removeClass("d-none");
$(".audit-container .no-items").addClass("d-none");
$(".audit-container .show-more").addClass("d-none");
if(!append) $("tbody").empty();
polygon.groups.audit.Loading = true;
$.post('/api/groups/get-audit', {GroupID: $(".app").attr("data-group-id"), Filter: polygon.groups.audit.Filter, Page: polygon.groups.audit.Page}, function(data)
{
$(".audit-container .loading").addClass("d-none");
polygon.groups.audit.Loading = false;
if(data.items == undefined) return $(".audit-container .no-items").text(data.message).removeClass("d-none");
$.each(data.items, function(_, Item)
{
$("\
<tr>\
<td>"+Item.Date+"</td>\
<td class=\"py-1\"><img src=\""+Item.UserAvatar+"\" style=\"max-height:40px\"> <a href=\"/user?ID="+Item.UserID+"\">"+Item.UserName+"</a></td>\
<td>"+Item.Rank+"</td>\
<td>"+Item.Description+"</td>\
</tr>\
").appendTo(".audit-container tbody");
});
polygon.appendination.handle(polygon.groups.audit, data);
});
},
Initialize: function()
{
if (!$(".audit-container").length) return;
$(function()
{
$(".audit-container .audit-filter-action").change(function(){ polygon.groups.audit.Display(null, $(this).val()); });
polygon.appendination.register(polygon.groups.audit, 300);
});
}
};
$(function()
{
if(window.location.pathname == "/my/groupadmin")
{
polygon.groups.admin.get_roles();
polygon.pagination.register("members", polygon.groups.admin.display_members);
}
else
{
if(polygon.groups.display_members()) polygon.pagination.register("members", polygon.groups.display_members);
}
if(polygon.groups.display_wall()) polygon.pagination.register("wall", polygon.groups.display_wall);
if(polygon.groups.display_allies()) polygon.pagination.register("allies", polygon.groups.display_allies);
if(polygon.groups.display_enemies()) polygon.pagination.register("enemies", polygon.groups.display_enemies);
if(polygon.groups.admin.display_pending_allies()) polygon.pagination.register("pending-allies", polygon.groups.admin.display_pending_allies);
});
$(".post-shout").click(polygon.groups.post_shout);
$(".post-wall").click(polygon.groups.post_wall);
$("body").on("click", ".delete-wall-post", polygon.groups.delete_wall_post);
$(".join-group").click(polygon.groups.join_group);
$(".leave-group-prompt").click(polygon.groups.leave_group_prompt);
$("body").on("click", ".leave-group", polygon.groups.leave_group);
$("select#ranks").change(function(){ polygon.groups.display_members(1, $(this).val()); });
$("body").on("change", "select#MemberRanks", polygon.groups.admin.update_member_rank);
$(".roles-create").click(polygon.groups.admin.add_role);
$(".roles-save").click(polygon.groups.admin.update_roles);
$("body").on("click", ".role-delete-prompt", function(){ polygon.groups.admin.delete_role_prompt($(this).parents("tr").attr("data-role-identifier")); });
$("body").on("click", ".role-delete", function(){ polygon.groups.admin.delete_role($(this).attr("data-role-identifier")); });
$("body").on("click", ".role-edit-permissions", function(){ polygon.groups.admin.configure_role_permissions($(this).parents("tr").attr("data-role-identifier")); });
$("body").on("change", ".role-change-permission", function(){ polygon.groups.admin.change_role_permission($(this).attr("data-permission"), $(this).is(':checked')); });
$("body").on("click", ".role-save-permissions", function(){ polygon.groups.admin.save_role_permissions($(this).attr("data-role-identifier")); });
$("body").on("click", ".request-relationship", polygon.groups.admin.request_relationship);
$("body").on("click", ".update-relationship", polygon.groups.admin.update_relationship);
polygon.groups.audit.Initialize();