diff --git a/src/components/BaseComponents/CommunityHeader.vue b/src/components/BaseComponents/CommunityHeader.vue index ba09d59f309de8f11d6f51ff20970e8ec9fea59f..6e2b31a722f7401e93c6d9d640ca911b85d1f251 100644 --- a/src/components/BaseComponents/CommunityHeader.vue +++ b/src/components/BaseComponents/CommunityHeader.vue @@ -28,14 +28,31 @@ </div> </div> <div> - <span class="hidden sm:block"> <!-- Legg dette til i button: v-if="adminStatus" --> + <span class="hidden sm:block"> + <!-- Legg dette til i button: v-if="adminStatus" --> - <svg @click="toggle" xmlns="http://www.w3.org/2000/svg" class="w-9 h-9 cursor-pointer" fill="none" viewBox="0 0 24 24" stroke="currentColor"> - <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> + <svg + @click="toggle" + xmlns="http://www.w3.org/2000/svg" + class="w-9 h-9 cursor-pointer" + fill="none" + viewBox="0 0 24 24" + stroke="currentColor" + > + <path + stroke-linecap="round" + stroke-linejoin="round" + stroke-width="2" + d="M4 6h16M4 12h16M4 18h16" + /> </svg> - <CommunityHamburger v-if="hamburgerOpen" class="origin-top-right absolute right-0" :community-i-d="community.communityId"/> <!-- class="absolute" --> - + <CommunityHamburger + v-if="hamburgerOpen" + class="origin-top-right absolute right-0" + :community-i-d="community.communityId" + /> + <!-- class="absolute" --> </span> </div> </div> @@ -48,10 +65,10 @@ export default { components: { CommunityHamburger, }, - data(){ - return{ + data() { + return { hamburgerOpen: false, - } + }; }, props: { adminStatus: Boolean, @@ -62,17 +79,16 @@ export default { visibility: Number, location: String, picture: String, - } + }, }, methods: { - toggle: function (){ - if(this.hamburgerOpen){ + toggle: function () { + if (this.hamburgerOpen) { this.hamburgerOpen = false; - } - else{ + } else { this.hamburgerOpen = true; } - } + }, }, }; </script> diff --git a/src/components/CommunityComponents/Admin/AdministrateMembers.vue b/src/components/CommunityComponents/Admin/AdministrateMembers.vue new file mode 100644 index 0000000000000000000000000000000000000000..54668d98c24f40673b2b93a44eb3b50a85f32e38 --- /dev/null +++ b/src/components/CommunityComponents/Admin/AdministrateMembers.vue @@ -0,0 +1,43 @@ +<template> + <ul> + <li v-for="member in memberlist" :key="member.userId"> + <UserListItemCard :admin="admin" :user="member" /> + </li> + </ul> +</template> + +<script> +import UserListItemCard from "../UserProfileComponents/UserListItemCard.vue"; +import { GetMembersOfCommunity, GetCommunity } from "@/utils/apiutil"; + +export default { + data() { + return { + memberlist: [], + community: {}, + }; + }, + components: { + UserListItemCard, + }, + props: { + admin: Boolean, + }, + methods: { + getAllMembersOfCommunity: async function () { + this.memberlist = await GetMembersOfCommunity( + this.$router.currentRoute.value.params.id + ); + }, + getCommunity: async function () { + this.community = await GetCommunity( + this.$router.currentRoute.value.params.id + ); + }, + }, + beforeMount() { + this.getAllMembersOfCommunity(); + this.getCommunity(); + }, +}; +</script> diff --git a/src/components/CommunityComponents/CommunityHamburger.vue b/src/components/CommunityComponents/CommunityHamburger.vue index 73e9d646ef59b404c97a090e9934b4834ecc535e..e32015c656c707bb8851e9915ff4f083aacec388 100644 --- a/src/components/CommunityComponents/CommunityHamburger.vue +++ b/src/components/CommunityComponents/CommunityHamburger.vue @@ -1,33 +1,33 @@ <template> <div - id="dropdown" - class="z-10 w-44 text-base list-none bg-white rounded divide-y divide-gray-100 shadow dark:bg-gray-700" + id="dropdown" + class="z-10 w-44 text-base list-none bg-white rounded divide-y divide-gray-100 shadow dark:bg-gray-700" > - <ul class="py-1" > + <ul class="py-1"> <li id="newItem"> <router-link - to="/addNewItem" - class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" - >Opprett Utleie</router-link + to="/addNewItem" + class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + >Opprett Utleie</router-link > </li> <li id="getMembers"> <router-link - :to="'/group/' + communityID + '/memberlist'" - class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" - >Se Medlemmer + :to="'/group/' + communityID + '/memberlist'" + class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + >Se Medlemmer </router-link> </li> <li id="adminGroup"> <router-link - :to="'/group/' + communityID + '/memberlist'" - class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" - >Administrer Gruppe</router-link + :to="'/group/' + communityID + '/admin'" + class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + >Administrer Gruppe</router-link > </li> <li id="leaveGroup"> <div - class="cursor-pointer block py-2 px-4 text-sm text-red-600 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" + class="cursor-pointer block py-2 px-4 text-sm text-red-600 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" > Forlat Gruppe </div> @@ -42,6 +42,5 @@ export default { props: { communityID: Number, }, -} +}; </script> - diff --git a/src/components/CommunityComponents/CommunityHome.vue b/src/components/CommunityComponents/CommunityHome.vue index 8004946f513cee97738fbd7b432d5651dd7e117c..8856f6ab0038aeea0ac9cb04effdf603b317a8dc 100644 --- a/src/components/CommunityComponents/CommunityHome.vue +++ b/src/components/CommunityComponents/CommunityHome.vue @@ -46,7 +46,6 @@ import CommunityHeader from "@/components/BaseComponents/CommunityHeader"; import { GetCommunity, GetListingsInCommunity } from "@/utils/apiutil"; export default { name: "SearchItemListComponent", - components: { CommunityHeader, ItemCard, diff --git a/src/components/CommunityComponents/MemberList.vue b/src/components/CommunityComponents/MemberList.vue index edd765faa9acf48700659998d0cbff63536a9adb..a86630f9520234f865c470238d0b53c70d1d6285 100644 --- a/src/components/CommunityComponents/MemberList.vue +++ b/src/components/CommunityComponents/MemberList.vue @@ -1,5 +1,4 @@ <template> - <CommunityHeader :admin-status="false" :community="community" class="mb-5 mt-5"/> <ul> <li v-for="member in memberlist" :key="member.userId"> <user-list-item-card :admin="admin" :user="member" /> @@ -10,7 +9,6 @@ <script> import UserListItemCard from "../UserProfileComponents/UserListItemCard.vue"; import { GetMembersOfCommunity, GetCommunity } from "@/utils/apiutil"; -import CommunityHeader from "@/components/BaseComponents/CommunityHeader"; export default { data() { @@ -20,23 +18,26 @@ export default { }; }, components: { - CommunityHeader, UserListItemCard, }, props: { admin: Boolean, }, - methods:{ - getAllMembersOfCommunity: async function(){ - this.memberlist = await GetMembersOfCommunity(this.$router.currentRoute.value.params.id); + methods: { + getAllMembersOfCommunity: async function () { + this.memberlist = await GetMembersOfCommunity( + this.$router.currentRoute.value.params.id + ); + }, + getCommunity: async function () { + this.community = await GetCommunity( + this.$router.currentRoute.value.params.id + ); }, - getCommunity: async function(){ - this.community = await GetCommunity(this.$router.currentRoute.value.params.id); - } }, beforeMount() { this.getAllMembersOfCommunity(); this.getCommunity(); - } + }, }; </script> diff --git a/src/router/index.js b/src/router/index.js index c8010e34653dc6042db7fa8c70679cd2d06d3473..f6b7cbb41342d6c4d0f2fc8e2e460531a9d873da 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -102,6 +102,11 @@ const routes = [ name: "test", component: () => import("../views/TestView.vue"), }, + { + path: "/group/:id/admin", + name: "CommunityAdmin", + component: () => import("@/views/CommunityViews/CommunityAdminView.vue"), + }, ]; const router = createRouter({ diff --git a/src/utils/apiutil.js b/src/utils/apiutil.js index 254d776260e8f64b495be6934b9ad0935b8a44d6..4d7daa48607baa8eea550f4e239b7c35711a3e7e 100644 --- a/src/utils/apiutil.js +++ b/src/utils/apiutil.js @@ -175,14 +175,14 @@ export async function GetListingsInCommunity(communityID) { } export async function GetMembersOfCommunity(communityID) { - return axios - .get(API_URL + "community/" + communityID + "/members", { - headers: tokenHeader(), - }) - .then((response) => { - return response.data; - }) - .catch((error) => { - console.error(error); - }); + return axios + .get(API_URL + "community/" + communityID + "/members", { + headers: tokenHeader(), + }) + .then((response) => { + return response.data; + }) + .catch((error) => { + console.error(error); + }); } diff --git a/src/views/CommunityViews/CommunityAdminView.vue b/src/views/CommunityViews/CommunityAdminView.vue new file mode 100644 index 0000000000000000000000000000000000000000..c7bbc03ff1dafdf0e275f4774fdd7443a6af478c --- /dev/null +++ b/src/views/CommunityViews/CommunityAdminView.vue @@ -0,0 +1,60 @@ +<template> + <div class="flex border-b border-gray-200 dark:border-gray-700"> + <button + v-for="(tab, index) in tabs" + :key="tab" + @click="changeTab(tab, index)" + class="h-10 px-4 py-2 -mb-px text-sm text-center bg-transparent border-b-2 sm:text-base whitespace-nowrap focus:outline-none" + :class="[activeTab === index ? activeClasses : inactiveClasses]" + > + {{ tabNames[index] }} + </button> + </div> + <MemberList v-if="loadedComponent === 'MemberList'" /> +</template> + +<script> +import MemberList from "@/components/CommunityComponents/MemberList.vue"; + +export default { + name: "CommunityAdminView", + components: { + MemberList, + }, + data() { + return { + tabs: ["MemberList", "Hey"], + tabNames: ["Medlemsliste", "Medlemsforespørsler"], + activeTab: 0, + loadedComponent: "MemberList", + }; + }, + methods: { + changeTab(tab, index) { + this.loadedComponent = tab; + this.activeTab = index; + }, + }, + computed: { + activeClasses() { + return { + "text-blue-600": true, + "border-blue-500": true, + "dark:border-blue-400": true, + "dark:text-blue-300": true, + }; + }, + inactiveClasses() { + return { + "text-gray-700": true, + "border-transparent": true, + "dark:text-white": true, + "cursor-base": true, + "hover:border-gray-400": true, + }; + }, + }, +}; +</script> + +<style></style> diff --git a/src/views/CommunityViews/MemberListView.vue b/src/views/CommunityViews/MemberListView.vue index f3b0bd4aed89b8682b0a98602e9fb43e49537a06..660cff6f880cc3abeedde2a324a9bd5c9674d7e4 100644 --- a/src/views/CommunityViews/MemberListView.vue +++ b/src/views/CommunityViews/MemberListView.vue @@ -1,12 +1,19 @@ <template> - <MemberList/> + <CommunityHeader + :admin-status="false" + :community="community" + class="mb-5 mt-5" + /> + <MemberList /> </template> <script> +import CommunityHeader from "@/components/BaseComponents/CommunityHeader"; import MemberList from "@/components/CommunityComponents/MemberList.vue"; export default { components: { + CommunityHeader, MemberList, }, }; diff --git a/tests/unit/apiutil-memberlist.spec.js b/tests/unit/apiutil-memberlist.spec.js index b3e41326b676400d5f708534b71d005eb1e57709..34fb55066190781d9d2aead4d106b2c6ea3c8098 100644 --- a/tests/unit/apiutil-memberlist.spec.js +++ b/tests/unit/apiutil-memberlist.spec.js @@ -1,37 +1,35 @@ -import {GetMembersOfCommunity} from "@/utils/apiutil"; +import { GetMembersOfCommunity } from "@/utils/apiutil"; import axios from "axios"; jest.mock("axios"); describe("testing mocking of apiutil.js", () => { + it("check that existing group returns correct members", async () => { + const expectedResponse = { + member1: { + userId: 2, + email: "erik@erik.com", + firstName: "erik", + lastName: "hansen", + address: "gløshaugen", + picture: "ok", + }, - it("check that existing group returns correct members", async () => { + member2: { + userId: 1, + email: "test@test.com", + firstName: "test", + lastName: "testesen", + address: "oslo", + picture: "ok", + }, + }; - const expectedResponse = { - member1: { - userId: 2, - email: "erik@erik.com", - firstName: "erik", - lastName: "hansen", - address: "gløshaugen", - picture: "ok" - }, + axios.get.mockImplementation(() => + Promise.resolve({ data: expectedResponse }) + ); - member2: { - userId: 1, - email: "test@test.com", - firstName: "test", - lastName: "testesen", - address: "oslo", - picture: "ok" - }, - }; - - axios.get.mockImplementation(() => - Promise.resolve({ data: expectedResponse }) - ); - - const communityMembersResponse = await GetMembersOfCommunity(4040); - expect(communityMembersResponse).toBe(expectedResponse); - }) + const communityMembersResponse = await GetMembersOfCommunity(4040); + expect(communityMembersResponse).toBe(expectedResponse); + }); }); diff --git a/tests/unit/community-hamburger.spec.js b/tests/unit/community-hamburger.spec.js index 658e30ee73eb2eb7ccee7b880151927f84c6e7b2..a6834e8680d1d61c29962436e568165fb8c2b937 100644 --- a/tests/unit/community-hamburger.spec.js +++ b/tests/unit/community-hamburger.spec.js @@ -2,12 +2,12 @@ import { shallowMount } from "@vue/test-utils"; import CommunityHamburger from "@/components/CommunityComponents/CommunityHamburger.vue"; describe("CommunityHamburger elements rendering", () => { - it("renders all li fields", () => { - const wrapper = shallowMount(CommunityHamburger); + it("renders all li fields", () => { + const wrapper = shallowMount(CommunityHamburger); - expect(wrapper.find("#newItem").text()).toMatch("Opprett Utleie"); - expect(wrapper.find("#getMembers").text()).toMatch("Se Medlemmer"); - expect(wrapper.find("#adminGroup").text()).toMatch("Administrer Gruppe"); - expect(wrapper.find("#leaveGroup").text()).toMatch("Forlat Gruppe"); - }); + expect(wrapper.find("#newItem").text()).toMatch("Opprett Utleie"); + expect(wrapper.find("#getMembers").text()).toMatch("Se Medlemmer"); + expect(wrapper.find("#adminGroup").text()).toMatch("Administrer Gruppe"); + expect(wrapper.find("#leaveGroup").text()).toMatch("Forlat Gruppe"); + }); });