mirror of
				https://github.com/pierre42100/ComunicWeb
				synced 2025-10-31 10:14:51 +00:00 
			
		
		
		
	Create group tabs
This commit is contained in:
		| @@ -35,3 +35,21 @@ | ||||
|     display: table; | ||||
|     margin: auto; | ||||
| } | ||||
|  | ||||
| .group-header .box-body { | ||||
|     display: flex; | ||||
| } | ||||
|  | ||||
| .group-header .box-body .spacer { | ||||
|     flex: 2; | ||||
| } | ||||
|  | ||||
|  | ||||
| .group-header .box-body .col-metadata { | ||||
|     flex: 1; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     align-items: baseline; | ||||
|     justify-content: center; | ||||
|     min-width: 160px; | ||||
| } | ||||
| @@ -11,7 +11,7 @@ | ||||
|  * @param {String} calloutMessage The message of the callout | ||||
|  * @param {String} calloutType The type of the callout (danger, info, warning, success) | ||||
|  */ | ||||
| ComunicWeb.common.messages.createCalloutElem = function(calloutTitle, calloutMessage, calloutType){ | ||||
| function createCallout(calloutTitle, calloutMessage, calloutType){ | ||||
|     //Prepare callout message | ||||
|     calloutMessage = "<p>" + calloutMessage + "</p>"; | ||||
|      | ||||
| @@ -39,6 +39,8 @@ ComunicWeb.common.messages.createCalloutElem = function(calloutTitle, calloutMes | ||||
|     return calloutElem; | ||||
| } | ||||
|  | ||||
| ComunicWeb.common.messages.createCalloutElem = createCallout; | ||||
|  | ||||
| /** | ||||
|  * Create loading callout element | ||||
|  *  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  * @author Pierre HUBERT | ||||
|  */ | ||||
|  | ||||
| ComunicWeb.pages.groups.main = { | ||||
| const GroupsPage = { | ||||
|  | ||||
| 	/** | ||||
| 	 * Open groups page | ||||
| @@ -12,10 +12,15 @@ ComunicWeb.pages.groups.main = { | ||||
| 	 * @param {object} args Optionnal arguments | ||||
| 	 * @param {HTMLElement} target The target for the page | ||||
| 	 */ | ||||
| 	open: function(args, target){ | ||||
| 	open: async function(args, target){ | ||||
|  | ||||
| 		try { | ||||
|  | ||||
| 			//Determine which page / group should be opened | ||||
| 		if(!args.subfolder) | ||||
| 			if(args.groupID) | ||||
| 				page = args.groupID; | ||||
|  | ||||
| 			else if(!args.subfolder) | ||||
| 				var page = "main"; | ||||
| 			 | ||||
| 			else { | ||||
| @@ -43,8 +48,8 @@ ComunicWeb.pages.groups.main = { | ||||
|  | ||||
| 			//Else determine which group page to open (specified after the ID of the group) | ||||
| 			var groupID = page; | ||||
| 		if(args.subfolder.split("/").length < 2){ | ||||
| 			page = "group"; | ||||
| 			if(!args.subfolder || args.subfolder.split("/").length < 2){ | ||||
| 				page = "posts"; | ||||
| 			} | ||||
| 			else { | ||||
| 				//Extract the page to open from the URL | ||||
| @@ -52,10 +57,50 @@ ComunicWeb.pages.groups.main = { | ||||
|  | ||||
| 				//Check if there is nothing after "/" | ||||
| 				if(page.length < 2) | ||||
| 				page = "group"; | ||||
| 					page = "posts"; | ||||
| 			} | ||||
|  | ||||
| 		//Check which page to open | ||||
| 			/** @type {AdvancedGroupInfo} Get information about the group*/ | ||||
| 			const group = await new Promise((res, rej) => GroupsInterface.getAdvancedInfo(groupID, function(result){ | ||||
|  | ||||
| 				//Check for errors | ||||
| 				if(result.error){ | ||||
| 	 | ||||
| 					//Check the code of the error | ||||
| 					if(result.error.code == 401) | ||||
| 						ComunicWeb.pages.groups.pages.forbidden.open(id, target); | ||||
| 					 | ||||
| 					//The group does not exists | ||||
| 					else  | ||||
| 						 | ||||
| 						ComunicWeb.common.error.pageNotFound({}, target); | ||||
| 					return; | ||||
| 				} | ||||
| 	 | ||||
| 				res(result); | ||||
| 	 | ||||
| 			})); | ||||
|  | ||||
| 			//Update page title | ||||
| 			ComunicWeb.common.pageTitle.setTitle(group.name); | ||||
| 	 | ||||
| 			// Display the header for the group | ||||
| 			GroupSectionHeader.display(group, target); | ||||
|  | ||||
| 			// Display the tabs of the group | ||||
| 			await GroupTabs.show(group, target, page); | ||||
|  | ||||
| 		} catch(e) { | ||||
| 			console.error(e); | ||||
| 			target.appendChild(createCallout( | ||||
| 				tr("Error"), | ||||
| 				tr("Failed to load group page!"), | ||||
| 				"danger" | ||||
| 			)) | ||||
| 		} | ||||
| 		 | ||||
| 		 | ||||
| 		/*//Check which page to open | ||||
| 		if(page == "group") | ||||
| 			ComunicWeb.pages.groups.pages.group.open(groupID, target); | ||||
| 		 | ||||
| @@ -68,7 +113,9 @@ ComunicWeb.pages.groups.main = { | ||||
|  | ||||
| 		//Unrecognized page | ||||
| 		else | ||||
| 			ComunicWeb.common.error.pageNotFound(args, target); | ||||
| 			ComunicWeb.common.error.pageNotFound(args, target);*/ | ||||
| 	} | ||||
| 	 | ||||
| }; | ||||
|  | ||||
| ComunicWeb.pages.groups.main = GroupsPage; | ||||
| @@ -1,110 +0,0 @@ | ||||
| /** | ||||
|  * Group page | ||||
|  *  | ||||
|  * @author Pierre HUBERT | ||||
|  */ | ||||
|  | ||||
| ComunicWeb.pages.groups.pages.group = { | ||||
|  | ||||
|     /** | ||||
|      * Open (display) a group page | ||||
|      *  | ||||
|      * @param {Number} id The ID of the group to display | ||||
|      * @param {HTMLElement} target The target for the page | ||||
|      */ | ||||
|     open: function(id, target){ | ||||
|          | ||||
|         //Get information about the group | ||||
|         ComunicWeb.components.groups.interface.getAdvancedInfo(id, function(result){ | ||||
|  | ||||
|             //Check for errors | ||||
|             if(result.error){ | ||||
|  | ||||
|                 //Check the code of the error | ||||
|                 if(result.error.code == 401){ | ||||
|                     ComunicWeb.pages.groups.pages.forbidden.open(id, target); | ||||
|                 } | ||||
|  | ||||
|                 else  | ||||
|                     //The group does not exists | ||||
|                     ComunicWeb.common.error.pageNotFound({}, target); | ||||
|  | ||||
|             } | ||||
|  | ||||
|             else | ||||
|                 //Display group page | ||||
|                 ComunicWeb.pages.groups.pages.group.display(id, result, target); | ||||
|  | ||||
|         }); | ||||
|  | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Display information about a group | ||||
|      *  | ||||
|      * @param {Number} id The ID of the group to display | ||||
|      * @param {Object} info Information about the group to display | ||||
|      * @param {HTMLElement} target The target for the page | ||||
|      */ | ||||
|     display: function(id, info, target){ | ||||
|  | ||||
|         //Update page title | ||||
|         ComunicWeb.common.pageTitle.setTitle(info.name); | ||||
|  | ||||
|         //Create page row | ||||
|         var pageRow = createElem2({ | ||||
|             appendTo: target, | ||||
|             type: "div", | ||||
|             class: "row group-page" | ||||
|         }); | ||||
|  | ||||
|         //Create header column | ||||
|         var headerColumn = createElem2({ | ||||
|             appendTo: pageRow, | ||||
|             type: "div", | ||||
|             class: "col-md-6" | ||||
|         }); | ||||
|  | ||||
|         //Display the header for the group | ||||
|         ComunicWeb.pages.groups.sections.header.display(info, headerColumn); | ||||
|  | ||||
|  | ||||
|         //Check if the user can create posts or not | ||||
|         if(ComunicWeb.components.groups.utils.canCreatePosts(info)){ | ||||
|              | ||||
|             //Intialize posts creation form | ||||
|             var postFormRow = createElem2({ | ||||
|                 appendTo: target, | ||||
|                 type: "div", | ||||
|                 class: "row group-page" | ||||
|             }); | ||||
|  | ||||
|             //Add column | ||||
|             var postFormCol = createElem2({ | ||||
|                 appendTo: postFormRow, | ||||
|                 type: "div", | ||||
|                 class: "col-md-6" | ||||
|             }); | ||||
|  | ||||
|             //Display form | ||||
|             ComunicWeb.components.posts.form.display("group", id, postFormCol); | ||||
|         } | ||||
|  | ||||
|         //Display group posts | ||||
|         var postsRow = createElem2({ | ||||
|             appendTo: target, | ||||
|             type: "div", | ||||
|             class: "row group-page" | ||||
|         }); | ||||
|  | ||||
|         var postsCol = createElem2({ | ||||
|             appendTo: postsRow, | ||||
|             type: "div", | ||||
|             class: "col-md-6" | ||||
|         }); | ||||
|  | ||||
|         ComunicWeb.pages.groups.sections.posts.display(info, postsCol); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										56
									
								
								assets/js/pages/groups/pages/posts.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								assets/js/pages/groups/pages/posts.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| /** | ||||
|  * Group page | ||||
|  *  | ||||
|  * @author Pierre HUBERT | ||||
|  */ | ||||
|  | ||||
| const GroupPostsPage = { | ||||
|  | ||||
|     /** | ||||
|      * Display information about a group | ||||
|      *  | ||||
|      * @param {Number} id The ID of the group to display | ||||
|      * @param {Object} info Information about the group to display | ||||
|      * @param {HTMLElement} target The target for the page | ||||
|      */ | ||||
|     display: function(id, info, target){ | ||||
|  | ||||
|         //Check if the user can create posts or not | ||||
|         if(ComunicWeb.components.groups.utils.canCreatePosts(info)){ | ||||
|              | ||||
|             //Intialize posts creation form | ||||
|             var postFormRow = createElem2({ | ||||
|                 appendTo: target, | ||||
|                 type: "div", | ||||
|                 class: "row group-page" | ||||
|             }); | ||||
|  | ||||
|             //Add column | ||||
|             var postFormCol = createElem2({ | ||||
|                 appendTo: postFormRow, | ||||
|                 type: "div", | ||||
|                 class: "col-md-6" | ||||
|             }); | ||||
|  | ||||
|             //Display form | ||||
|             ComunicWeb.components.posts.form.display("group", id, postFormCol); | ||||
|         } | ||||
|  | ||||
|         //Display group posts | ||||
|         var postsRow = createElem2({ | ||||
|             appendTo: target, | ||||
|             type: "div", | ||||
|             class: "row group-page" | ||||
|         }); | ||||
|  | ||||
|         var postsCol = createElem2({ | ||||
|             appendTo: postsRow, | ||||
|             type: "div", | ||||
|             class: "col-md-6" | ||||
|         }); | ||||
|  | ||||
|         ComunicWeb.pages.groups.sections.posts.display(info, postsCol); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -4,7 +4,7 @@ | ||||
|  * @author Pierre HUBERT | ||||
|  */ | ||||
|  | ||||
| ComunicWeb.pages.groups.sections.header = { | ||||
| const GroupSectionHeader = { | ||||
|  | ||||
|     /** | ||||
|      * Display groups page header | ||||
| @@ -14,29 +14,43 @@ ComunicWeb.pages.groups.sections.header = { | ||||
|      */ | ||||
|     display: function(info, target){ | ||||
|          | ||||
|         //Create header container | ||||
|         var headerContainer = createElem2({ | ||||
|         //Create page row | ||||
|         var pageRow = createElem2({ | ||||
|             appendTo: target, | ||||
|             type: "div", | ||||
|             class: "row group-page" | ||||
|         }); | ||||
|  | ||||
|         //Create header column | ||||
|         var headerColumn = createElem2({ | ||||
|             appendTo: pageRow, | ||||
|             type: "div", | ||||
|             class: "col-md-6" | ||||
|         }); | ||||
|  | ||||
|         //Create header container | ||||
|         const headerContainer = createElem2({ | ||||
|             appendTo: headerColumn, | ||||
|             type: "div", | ||||
|             class: "group-header box box-primary" | ||||
|         }); | ||||
|  | ||||
|         //Create a row | ||||
|         var row = createElem2({ | ||||
|         const row = createElem2({ | ||||
|             appendTo: headerContainer, | ||||
|             type: "div", | ||||
|             class: "box-body row" | ||||
|         }); | ||||
|  | ||||
|         //First column | ||||
|         var firstColumn = createElem2({ | ||||
|         const firstColumn = createElem2({ | ||||
|             appendTo: row, | ||||
|             type: "div", | ||||
|             class: "col-md-4 group-col-icon", | ||||
|         }); | ||||
|  | ||||
|         //Group icon | ||||
|         var groupIcon = createElem2({ | ||||
|         const groupIcon = createElem2({ | ||||
|             appendTo: firstColumn, | ||||
|             type: "img", | ||||
|             src: info.icon_url, | ||||
| @@ -44,7 +58,7 @@ ComunicWeb.pages.groups.sections.header = { | ||||
|         }); | ||||
|          | ||||
|         //Group name | ||||
|         var groupName = createElem2({ | ||||
|         const groupName = createElem2({ | ||||
|             appendTo: firstColumn, | ||||
|             type: "span", | ||||
|             class: "group-name", | ||||
| @@ -62,132 +76,29 @@ ComunicWeb.pages.groups.sections.header = { | ||||
|         } | ||||
|  | ||||
|  | ||||
|         //Second column : Information about the company | ||||
|         var secondColumn = createElem2({ | ||||
|         createElem2({ | ||||
|             appendTo: row, | ||||
|             type: "div", | ||||
|             class: "col-md-4 col-info" | ||||
|         }); | ||||
|             class: "spacer" | ||||
|         }) | ||||
|  | ||||
|         //Group URL (if any) | ||||
|         if(info.url != "null"){ | ||||
|             var urlElem = createElem2({ | ||||
|                 appendTo: secondColumn, | ||||
|                 type: "a", | ||||
|                 class: "a", | ||||
|                 href: info.url, | ||||
|                 innerHTML: "<i class='fa fa-link'></i> " + info.url | ||||
|             }); | ||||
|             urlElem.target = "_blank"; | ||||
|  | ||||
|         } | ||||
|      | ||||
|  | ||||
|         //Group description (if any) | ||||
|         if(info.description != "null") | ||||
|             createElem2({ | ||||
|                 appendTo: secondColumn, | ||||
|                 type: "div", | ||||
|                 innerHTML: "<i class='fa fa-file-text-o'></i> " + info.description | ||||
|             }); | ||||
|  | ||||
|         //Add separator | ||||
|         add_p(secondColumn, " "); | ||||
|  | ||||
|  | ||||
|  | ||||
|         //Third column : information about the group | ||||
|         // Second column : basic information about the group | ||||
|         var thirdColumn = createElem2({ | ||||
|             appendTo: row, | ||||
|             type: "div", | ||||
|             class: "col-md-4 col-metadata" | ||||
|         }); | ||||
|  | ||||
|         //Add join date | ||||
|         createElem2({ | ||||
|             appendTo: thirdColumn, | ||||
|             type: "div", | ||||
|             innerHTML: '<i class="fa fa-clock-o"></i> Created '+ComunicWeb.common.date.timeDiffToStr(info.time_create)+' ago' | ||||
|         }); | ||||
|  | ||||
|         //Add number of members | ||||
|         var members = createElem2({ | ||||
|             appendTo: thirdColumn, | ||||
|             type: "div", | ||||
|             innerHTML: '<i class="fa fa-group"></i> '+ info.number_members+' members' | ||||
|         }); | ||||
|  | ||||
|         //Check if the user is a moderator or an admin | ||||
|         if(info.membership == "administrator" || info.membership == "moderator"){ | ||||
|              | ||||
|             //Turn members information into a link | ||||
|             members.className = "a"; | ||||
|  | ||||
|             members.addEventListener("click", function(e){ | ||||
|  | ||||
|                 openPage("groups/" + info.id + "/members"); | ||||
|  | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         //Group visibility | ||||
|         var visibility = { | ||||
|             open: "Open group", | ||||
|             private: "Private group", | ||||
|             secrete: "Secrete group" | ||||
|         }; | ||||
|         createElem2({ | ||||
|             appendTo: thirdColumn, | ||||
|             type: "div", | ||||
|             innerHTML: "<i class='fa fa-lock'></i> " + visibility[info.visibility] | ||||
|         }); | ||||
|  | ||||
|         //Group registration | ||||
|         var levels = { | ||||
|             open: "Open registration", | ||||
|             moderated: "Moderated registration", | ||||
|             closed: "Closed registration" | ||||
|         } | ||||
|         createElem2({ | ||||
|             appendTo: thirdColumn, | ||||
|             type: "div", | ||||
|             innerHTML: "<i class='fa fa-pencil'></i> " + levels[info.registration_level] | ||||
|             class: "col-md-7 col-metadata" | ||||
|         }); | ||||
|          | ||||
|  | ||||
|         //Display membership level | ||||
|         if(signed_in()) | ||||
|         ComunicWeb.pages.groups.sections.membershipBlock.display(info, thirdColumn); | ||||
|          | ||||
|         //Display follow block | ||||
|         if(signed_in() && ComunicWeb.components.groups.utils.isGroupMember(info)) | ||||
|             ComunicWeb.pages.groups.sections.followBlock.display(info, thirdColumn); | ||||
|  | ||||
|         //If the user is an admin, add a link to configure the page | ||||
|         if(signed_in() && info.membership == "administrator"){ | ||||
|  | ||||
|             var settingsLink = createElem2({ | ||||
|                 appendTo: thirdColumn, | ||||
|                 type: "div", | ||||
|                 class: "a", | ||||
|                 innerHTML: " <i class='fa fa-gear'></i>Settings" | ||||
|             }); | ||||
|             settingsLink.addEventListener("click", function(e){ | ||||
|                 openPage("groups/" + info.id + "/settings"); | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         //Display likes block | ||||
|         ComunicWeb.components.like.button.display( | ||||
| 			"group", | ||||
| 			info.id, | ||||
| 			info.number_likes, | ||||
| 			info.is_liking, | ||||
| 			createElem2({ | ||||
|                 appendTo: thirdColumn, | ||||
|                 type: "div" | ||||
|             }) | ||||
| 		); | ||||
|     }, | ||||
|  | ||||
| }; | ||||
|  | ||||
| ComunicWeb.pages.groups.sections.header = GroupSectionHeader; | ||||
							
								
								
									
										38
									
								
								assets/js/pages/groups/sections/tabs.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								assets/js/pages/groups/sections/tabs.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| /** | ||||
|  * Group tags | ||||
|  *  | ||||
|  * @author Pierre Hubert | ||||
|  */ | ||||
|  | ||||
| const GroupTabs = { | ||||
|  | ||||
|     /** | ||||
|      * @param {AdvancedGroupInfo} group Group information | ||||
|      * @param {HTMLElement} target Target | ||||
|      * @param {String} activePage Current active page | ||||
|      */ | ||||
|     show: async function(group, target, activePage) { | ||||
|         // Load template | ||||
| 		const tpl = await Page.loadHTMLTemplate("pages/groups/sections/GroupTabs.html"); | ||||
| 		const el = document.createElement("div") | ||||
| 		el.innerHTML = tpl; | ||||
| 		target.appendChild(el); | ||||
|  | ||||
|         Vue.createApp({ | ||||
|              | ||||
|             data: () => { | ||||
|                 return { | ||||
|                     isAdmin: group.membership == "administrator", | ||||
|                     canSeeMembers: group.membership == "administrator" || group.membership == "moderator", | ||||
|                     activePage: activePage | ||||
|                 } | ||||
|             }, | ||||
|  | ||||
|             methods: { | ||||
|                 openPage: (uri) => openPage("groups/" + group.id + "/" + uri) | ||||
|             } | ||||
|  | ||||
|         }).mount(el); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -28,7 +28,7 @@ ComunicWeb.pages.virtualDirectory.page = { | ||||
|  | ||||
| 			//Check if the page is  a group | ||||
| 			if(r.kind == "group"){ | ||||
| 				ComunicWeb.pages.groups.pages.group.open(r.id, target); | ||||
| 				GroupsPage.open({groupID: r.id}, target); | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
|   | ||||
							
								
								
									
										26
									
								
								assets/js/typings/Group.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								assets/js/typings/Group.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| /** | ||||
|  * Group typings | ||||
|  *  | ||||
|  * @author Pierre Hubert | ||||
|  */ | ||||
|  | ||||
| declare interface Group { | ||||
|     id: Number, | ||||
|     name: String, | ||||
|     icon_url: String, | ||||
|     number_members: Number, | ||||
|     visibility: "open"|"private"|"secrete", | ||||
|     registration_level: "open"|"moderated"|"closed", | ||||
|     posts_level: "moderators"|"members", | ||||
|     virtual_directory: String, | ||||
|     membership: "administrator"|"moderator"|"member"|"invited"|"pending"|"visitor", | ||||
|     following: Boolean, | ||||
| } | ||||
|  | ||||
| declare interface AdvancedGroupInfo extends Group { | ||||
|     time_create: Number, | ||||
|     description: String, | ||||
|     url: String, | ||||
|     number_likes: Number, | ||||
|     is_liking: Boolean | ||||
| } | ||||
							
								
								
									
										13
									
								
								assets/templates/pages/groups/sections/GroupTabs.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/templates/pages/groups/sections/GroupTabs.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| <!-- Group tabs section --> | ||||
| <div class="row group-page"> | ||||
|     <div class="col-md-6"> | ||||
|  | ||||
|         <div class="nav-tabs-custom"> | ||||
|             <ul class="nav nav-tabs"> | ||||
|               <li v-bind:class="activePage == 'posts' ? 'active': ''"><a @click="openPage('posts')">tr("Posts")</a></li> | ||||
|               <li v-bind:class="activePage == 'members' ? 'active': ''"><a @click="openPage('members')" v-if="canSeeMembers">tr("Members")</a></li> | ||||
|               <li v-bind:class="activePage == 'about' ? 'active': ''"><a @click="openPage('about')">tr("About")</a></li> | ||||
|               <li class="pull-right" v-if="isAdmin" v-bind:class="activePage == 'admin' ? 'active': ''"><a  @click="openPage('admin')" class="text-muted"><i class="fa fa-gear"></i></a></li> | ||||
|             </ul> | ||||
|     </div> | ||||
| </div> | ||||
| @@ -529,7 +529,7 @@ class Dev { | ||||
| 				//Groups sub pages | ||||
| 				"js/pages/groups/pages/main.js", | ||||
| 				"js/pages/groups/pages/create.js", | ||||
| 				"js/pages/groups/pages/group.js", | ||||
| 				"js/pages/groups/pages/posts.js", | ||||
| 				"js/pages/groups/pages/settings.js", | ||||
| 				"js/pages/groups/pages/members.js", | ||||
| 				"js/pages/groups/pages/forbidden.js", | ||||
| @@ -539,6 +539,7 @@ class Dev { | ||||
| 				"js/pages/groups/sections/membershipBlock.js", | ||||
| 				"js/pages/groups/sections/posts.js", | ||||
| 				"js/pages/groups/sections/followBlock.js", | ||||
| 				"js/pages/groups/sections/tabs.js", | ||||
|  | ||||
|  | ||||
| 			//User settings page | ||||
|   | ||||
		Reference in New Issue
	
	Block a user