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(""); }); 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 += ""; if(item.Rank == 0) { row += ""; row += ""; } else { row += ""; row += ""; } if(item.Rank == 0 || item.Rank == 255) { row += ""; } else { row += ""; } row += ""; if(item.Rank != 255) { row += ""; } if(item.Rank != 0 && item.Rank != 255 && polygon.groups.admin.roles.length > 3) { row += ""; } row += ""; row += ""; $(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?
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 = ""; Body += "
"; Body += "
"; $.each(polygon.groups.admin.role_permissions, function(_, Category) { Body += ""; Body += "
"; $.each(Category.Permissions, function(_, Permission) { Permission.Value = Role.Permissions[Permission.Name]; Body += "
"; Body += ""+ Permission.Title +""; Body += "
"; }); Body += "
"; }); Body += "
"; Body += "
"; 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) { $("\ \ "+Item.Date+"\ "+Item.UserName+"\ "+Item.Rank+"\ "+Item.Description+"\ \ ").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();