From d9db90eb5856d91dc301b79daffaa56c77c47814 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Thu, 20 Apr 2023 11:06:25 +0200 Subject: [PATCH 01/25] chore: init --- src/components/UserCard.vue | 31 +++++++++++++++++++++++++++++++ src/views/HouseholdView.vue | 10 ++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/components/UserCard.vue create mode 100644 src/views/HouseholdView.vue diff --git a/src/components/UserCard.vue b/src/components/UserCard.vue new file mode 100644 index 0000000..875f22a --- /dev/null +++ b/src/components/UserCard.vue @@ -0,0 +1,31 @@ +<template> + <el-card + shadow="never" + :body-style="{ + padding: '30px', + overflow: 'hidden', + }" + class="relative m-2 w-full max-w-xl overflow-visible" + > + <h2 class="mb-5">Bruker</h2> + <p class="text-[#868e96]"> + Front-end developer and open source enthusiast. We hope to develop a UI platform that can help + many people in the future. I still working hard to make this dream come true. + </p> + <div class="absolute -top-10 right-5"> + <el-avatar src="https://avatars.githubusercontent.com/u/27342882?v=4" :size="80" /> + </div> + <footer class="mt-2 text-right"> + <el-link href="https://github.com/ryuhangyeong" type="primary" target="_blank"> + Utnevn til superbruker + </el-link> + </footer> + </el-card> +</template> + +<script setup lang="ts"></script> + +<style scoped> +.component-name-wrapper { +} +</style> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue new file mode 100644 index 0000000..3a2f029 --- /dev/null +++ b/src/views/HouseholdView.vue @@ -0,0 +1,10 @@ +<template> + <main id="component-name" class="component-name-wrapper">Component content</main> +</template> + +<script setup lang="ts"></script> + +<style scoped> +.component-name-wrapper { +} +</style> -- GitLab From 8c0da87dbe1ed10657d249919fe3afaa13b72897 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 09:37:56 +0200 Subject: [PATCH 02/25] chore: add householdtopbar --- src/views/HouseholdView.vue | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 3a2f029..657d107 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,10 +1,37 @@ <template> - <main id="component-name" class="component-name-wrapper">Component content</main> + <main id="component-name" class="component-name-wrapper"> + <div><HouseholdTopBar /></div> + <div> + <el-row :gutter="20"> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="16" class="mb-5"> + <UserCard user-name="Trond Kåre" /> + </el-col> + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="8" class="mb-5"> + <UserCard user-name="Test Testesen"/> + </el-col> + </el-row> + </div> + </main> + + </template> -<script setup lang="ts"></script> +<script setup lang="ts"> +import UserCard from "@/components/UserCard.vue"; +import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; + +const user = [ + { + id: 1, + name: "trond arild", + }, + { + id: 2, + name: "Kåre Konradsen", + }, +]; +</script> <style scoped> -.component-name-wrapper { -} + </style> -- GitLab From 766a2fdea53a455e4ad466ab04b8a14bc0d36a3a Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 09:39:14 +0200 Subject: [PATCH 03/25] chore: add householdtopbar --- src/components/HouseholdTopBar.vue | 53 ++++++++++++++++++++++++++++++ src/components/UserCard.vue | 24 +++++++++----- 2 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/components/HouseholdTopBar.vue diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue new file mode 100644 index 0000000..a3ea328 --- /dev/null +++ b/src/components/HouseholdTopBar.vue @@ -0,0 +1,53 @@ +<template> + <el-menu :default-active="activeIndex" mode="horizontal" :ellipsis="false" @select="handleSelect" class="menu"> + + <el-text type="primary" size="large" class="menu-item-text"> + Legg til nytt medlem i husholdningen + </el-text> + + <el-button type="primary" class="menu-item-button"> + <el-icon> + <Plus /> + </el-icon> + </el-button> + <div class="flex-grow" /> + <el-button type="danger" class="menu-item-button"> + <span>Slett Husholdning</span> + </el-button> + </el-menu> +</template> + +<script setup lang="ts"> + +import { Plus } from '@element-plus/icons-vue'; +import { ref } from "vue"; + + +const activeIndex = ref("1"); + + + +const handleSelect = (key: string, keyPath: string[]) => { + console.log(key, keyPath); +}; + +</script> + +<style> +.menu { + padding: 10px; +} + +.flex-grow { + flex-grow: 1; +} + +.menu-item-button { + margin: auto 1rem; + align-content: center; +} + +.menu-item-text{ + padding-left: 20px; +} +</style> \ No newline at end of file diff --git a/src/components/UserCard.vue b/src/components/UserCard.vue index 875f22a..2a35e68 100644 --- a/src/components/UserCard.vue +++ b/src/components/UserCard.vue @@ -7,25 +7,33 @@ }" class="relative m-2 w-full max-w-xl overflow-visible" > - <h2 class="mb-5">Bruker</h2> + <h2 class="mb-5">{{ props.userName }}</h2> <p class="text-[#868e96]"> - Front-end developer and open source enthusiast. We hope to develop a UI platform that can help - many people in the future. I still working hard to make this dream come true. + Superbruker </p> <div class="absolute -top-10 right-5"> - <el-avatar src="https://avatars.githubusercontent.com/u/27342882?v=4" :size="80" /> + <el-icon color="black" size="80" > + <UserFilled /> + </el-icon> </div> <footer class="mt-2 text-right"> - <el-link href="https://github.com/ryuhangyeong" type="primary" target="_blank"> + <el-link href="https://vg.no" type="primary" target="_blank"> Utnevn til superbruker </el-link> </footer> </el-card> </template> -<script setup lang="ts"></script> +<script setup lang="ts"> + +import { UserFilled } from '@element-plus/icons-vue' + + + +const props = defineProps<{ + userName: string; +}>(); +</script> <style scoped> -.component-name-wrapper { -} </style> -- GitLab From 8ad930c0da0682ffd0ca25c4e44087bab4d9cec9 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 09:50:49 +0200 Subject: [PATCH 04/25] chore: add householdview to router --- src/router/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/router/index.ts b/src/router/index.ts index 792c312..8e9871f 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -3,6 +3,7 @@ import HomeView from "../views/HomeView.vue"; import NotFoundView from "../views/NotFoundView.vue"; import { useSessionStore } from "@/stores/session"; import { AccountApi } from "@/services/index"; +import HouseholdView from "@/views/HouseholdView.vue"; let startup = true; const router = createRouter({ @@ -56,6 +57,11 @@ const router = createRouter({ fullScreen: true, }, }, + { + path: "/household", + name: "household", + component: HouseholdView, + }, ], }); -- GitLab From f17e755bf55d864e59d226f7857ed87c9f46b049 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 10:29:15 +0200 Subject: [PATCH 05/25] chore: fixes formatting issues --- src/components/HouseholdTopBar.vue | 60 ++++++++++++------------- src/components/UserCard.vue | 14 ++---- src/views/HouseholdView.vue | 70 +++++++++++++++++++++++------- 3 files changed, 88 insertions(+), 56 deletions(-) diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index a3ea328..b254bea 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -1,53 +1,53 @@ <template> - <el-menu :default-active="activeIndex" mode="horizontal" :ellipsis="false" @select="handleSelect" class="menu"> - - <el-text type="primary" size="large" class="menu-item-text"> - Legg til nytt medlem i husholdningen - </el-text> - - <el-button type="primary" class="menu-item-button"> - <el-icon> - <Plus /> - </el-icon> - </el-button> - <div class="flex-grow" /> - <el-button type="danger" class="menu-item-button"> - <span>Slett Husholdning</span> - </el-button> - </el-menu> + <el-menu + :default-active="activeIndex" + mode="horizontal" + :ellipsis="false" + @select="handleSelect" + class="menu" + > + <el-text type="primary" size="large" class="menu-item-text"> + Legg til nytt medlem i husholdningen + </el-text> + + <el-button type="primary" class="menu-item-button"> + <el-icon> + <Plus /> + </el-icon> + </el-button> + <div class="flex-grow" /> + <el-button type="danger" class="menu-item-button"> + <span>Slett Husholdning</span> + </el-button> + </el-menu> </template> <script setup lang="ts"> - -import { Plus } from '@element-plus/icons-vue'; +import { Plus } from "@element-plus/icons-vue"; import { ref } from "vue"; - const activeIndex = ref("1"); - - const handleSelect = (key: string, keyPath: string[]) => { - console.log(key, keyPath); + console.log(key, keyPath); }; - </script> <style> .menu { - padding: 10px; + padding: 10px; } .flex-grow { - flex-grow: 1; + flex-grow: 1; } .menu-item-button { - margin: auto 1rem; - align-content: center; + margin: auto 1rem; + align-content: center; } -.menu-item-text{ - padding-left: 20px; +.menu-item-text { + padding-left: 20px; } -</style> \ No newline at end of file +</style> diff --git a/src/components/UserCard.vue b/src/components/UserCard.vue index 2a35e68..696a4ef 100644 --- a/src/components/UserCard.vue +++ b/src/components/UserCard.vue @@ -8,11 +8,9 @@ class="relative m-2 w-full max-w-xl overflow-visible" > <h2 class="mb-5">{{ props.userName }}</h2> - <p class="text-[#868e96]"> - Superbruker - </p> + <p class="text-[#868e96]">Superbruker</p> <div class="absolute -top-10 right-5"> - <el-icon color="black" size="80" > + <el-icon color="black" size="80"> <UserFilled /> </el-icon> </div> @@ -25,15 +23,11 @@ </template> <script setup lang="ts"> - -import { UserFilled } from '@element-plus/icons-vue' - - +import { UserFilled } from "@element-plus/icons-vue"; const props = defineProps<{ userName: string; }>(); </script> -<style scoped> -</style> +<style scoped></style> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 657d107..0682cb5 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,37 +1,75 @@ <template> - <main id="component-name" class="component-name-wrapper"> - <div><HouseholdTopBar /></div> + <el-main id="component-name" class="component-name-wrapper"> + <div class="top-bar"><HouseholdTopBar /></div> <div> - <el-row :gutter="20"> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="16" class="mb-5"> - <UserCard user-name="Trond Kåre" /> - </el-col> - <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="8" class="mb-5"> - <UserCard user-name="Test Testesen"/> - </el-col> - </el-row> - </div> - </main> - - + <el-row gutter="20"> + <el-col + v-for="user in users" + :key="user.id" + :xs="24" + :sm="12" + :md="12" + :lg="12" + :xl="16" + class="mb-5" + > + <UserCard :user-name="user.name" /> + </el-col> + </el-row> + </div> + </el-main> </template> <script setup lang="ts"> import UserCard from "@/components/UserCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; -const user = [ +const users = [ { id: 1, - name: "trond arild", + name: "Trond Arild", }, { id: 2, name: "Kåre Konradsen", }, + { + id: 3, + name: "Trond Arild", + }, + { + id: 4, + name: "Kåre Konradsen", + }, + { + id: 5, + name: "Kåre Konradsen", + }, + { + id: 6, + name: "Kåre Konradsen", + }, + { + id: 7, + name: "Kåre Konradsen", + }, + { + id: 8, + name: "Kåre Konradsen", + }, + { + id: 9, + name: "Kåre Konradsen", + }, ]; </script> <style scoped> +.el-col { + margin-bottom: 20px; +} +.top-bar { + margin-bottom: 20px; +} </style> -- GitLab From be33549ab8ed1c38ef0dfd060662c04a21fc2603 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 11:13:22 +0200 Subject: [PATCH 06/25] chore: adds types --- src/components/HouseholdTopBar.vue | 2 +- src/components/UserCard.vue | 10 +++---- src/views/HouseholdView.vue | 46 +++++++----------------------- 3 files changed, 17 insertions(+), 41 deletions(-) diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index b254bea..3f0f2c7 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -33,7 +33,7 @@ const handleSelect = (key: string, keyPath: string[]) => { }; </script> -<style> +<style scoped> .menu { padding: 10px; } diff --git a/src/components/UserCard.vue b/src/components/UserCard.vue index 696a4ef..9b6fabb 100644 --- a/src/components/UserCard.vue +++ b/src/components/UserCard.vue @@ -7,26 +7,26 @@ }" class="relative m-2 w-full max-w-xl overflow-visible" > - <h2 class="mb-5">{{ props.userName }}</h2> + <h2 class="mb-5">{{ user.firstName }}</h2> <p class="text-[#868e96]">Superbruker</p> + <p class="text-[#868e96]">{{ user.email }}</p> <div class="absolute -top-10 right-5"> <el-icon color="black" size="80"> <UserFilled /> </el-icon> </div> <footer class="mt-2 text-right"> - <el-link href="https://vg.no" type="primary" target="_blank"> - Utnevn til superbruker - </el-link> + <el-button type="primary"> Utnevn til superbruker </el-button> </footer> </el-card> </template> <script setup lang="ts"> +import type { UserFull } from "@/services"; import { UserFilled } from "@element-plus/icons-vue"; const props = defineProps<{ - userName: string; + user: UserFull; }>(); </script> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 0682cb5..75e95ea 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -13,7 +13,7 @@ :xl="16" class="mb-5" > - <UserCard :user-name="user.name" /> + <UserCard :user="user" /> </el-col> </el-row> </div> @@ -21,47 +21,23 @@ </template> <script setup lang="ts"> +import { ref } from "vue"; +import type { UserFull } from "@/services"; import UserCard from "@/components/UserCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; -const users = [ +const users = ref<UserFull[]>([ { id: 1, - name: "Trond Arild", - }, + email: "trond@gmail.com", + firstName: "Trond", + } as UserFull, { id: 2, - name: "Kåre Konradsen", - }, - { - id: 3, - name: "Trond Arild", - }, - { - id: 4, - name: "Kåre Konradsen", - }, - { - id: 5, - name: "Kåre Konradsen", - }, - { - id: 6, - name: "Kåre Konradsen", - }, - { - id: 7, - name: "Kåre Konradsen", - }, - { - id: 8, - name: "Kåre Konradsen", - }, - { - id: 9, - name: "Kåre Konradsen", - }, -]; + email: "gjøran@gmail.com", + firstName: "Gjøran", + } as UserFull, +]); </script> <style scoped> -- GitLab From ea1e4fb501b5cc515856f2e9ea1c27491e35fefb Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 13:40:32 +0200 Subject: [PATCH 07/25] chore: makes promote and demote buttons reflect user priveliges --- src/components/HouseholdTopBar.vue | 10 ++------ src/components/UserCard.vue | 14 ++++++++--- src/views/HouseholdView.vue | 38 ++++++++++++++++++++---------- 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index 3f0f2c7..6971d51 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -1,11 +1,5 @@ <template> - <el-menu - :default-active="activeIndex" - mode="horizontal" - :ellipsis="false" - @select="handleSelect" - class="menu" - > + <el-container> <el-text type="primary" size="large" class="menu-item-text"> Legg til nytt medlem i husholdningen </el-text> @@ -19,7 +13,7 @@ <el-button type="danger" class="menu-item-button"> <span>Slett Husholdning</span> </el-button> - </el-menu> +</el-container> </template> <script setup lang="ts"> diff --git a/src/components/UserCard.vue b/src/components/UserCard.vue index 9b6fabb..a25d17f 100644 --- a/src/components/UserCard.vue +++ b/src/components/UserCard.vue @@ -8,7 +8,7 @@ class="relative m-2 w-full max-w-xl overflow-visible" > <h2 class="mb-5">{{ user.firstName }}</h2> - <p class="text-[#868e96]">Superbruker</p> + <p class="text-[#868e96]">{{ userType }}</p> <p class="text-[#868e96]">{{ user.email }}</p> <div class="absolute -top-10 right-5"> <el-icon color="black" size="80"> @@ -16,7 +16,12 @@ </el-icon> </div> <footer class="mt-2 text-right"> - <el-button type="primary"> Utnevn til superbruker </el-button> + <el-button v-if="userType == 'Bruker'" type="primary"> + Utnevn til superbruker + </el-button> + <el-button v-else type="primary"> + Degrader til bruker + </el-button> </footer> </el-card> </template> @@ -27,7 +32,10 @@ import { UserFilled } from "@element-plus/icons-vue"; const props = defineProps<{ user: UserFull; + userType: String, }>(); </script> -<style scoped></style> +<style scoped> + +</style> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 75e95ea..47360b2 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,11 +1,12 @@ <template> <el-main id="component-name" class="component-name-wrapper"> + <h1>{{ household.name }}</h1> <div class="top-bar"><HouseholdTopBar /></div> <div> <el-row gutter="20"> <el-col v-for="user in users" - :key="user.id" + :key="user.user.id" :xs="24" :sm="12" :md="12" @@ -13,7 +14,7 @@ :xl="16" class="mb-5" > - <UserCard :user="user" /> + <UserCard :user="user.user" :user-type="user.userType" /> </el-col> </el-row> </div> @@ -22,22 +23,35 @@ <script setup lang="ts"> import { ref } from "vue"; -import type { UserFull } from "@/services"; +import type { UserFull, Household } from "@/services"; import UserCard from "@/components/UserCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; -const users = ref<UserFull[]>([ +const users = ref([ { - id: 1, - email: "trond@gmail.com", - firstName: "Trond", - } as UserFull, + user: { + id: 1, + email: "tore@gmail.com", + firstName: "Tore" + } as UserFull, + userType: "Superbruker" as String + }, { - id: 2, - email: "gjøran@gmail.com", - firstName: "Gjøran", - } as UserFull, + user: { + id: 2, + email: "trond@gmail.com", + firstName: "Trond" + } as UserFull, + userType: "Bruker" as String + }, ]); + +const household = ref<Household>( + { + id: 1, + name: "Husholdning 1", + } as Household, +); </script> <style scoped> -- GitLab From 920269ad8c53744db574d53f55b3128104e9153f Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 14:21:53 +0200 Subject: [PATCH 08/25] chore: adds non functional form for adding new user to household --- src/components/HouseholdTopBar.vue | 43 +++++++++++++++++++++++++----- src/components/UserCard.vue | 14 +++------- src/views/HouseholdView.vue | 18 ++++++------- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index 6971d51..0fd349d 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -4,27 +4,56 @@ Legg til nytt medlem i husholdningen </el-text> - <el-button type="primary" class="menu-item-button"> + <el-button class="menu-item-button" @click="dialogFormVisible = true" type="primary"> <el-icon> <Plus /> </el-icon> </el-button> + + <el-dialog v-model="dialogFormVisible" title="Legg til nytt medlem i husholdningen"> + <el-form :model="form"> + <el-form-item label="Brukerens epost" :label-width="formLabelWidth"> + <el-input v-model="form.name" autocomplete="off" /> + </el-form-item> + <el-form-item label="nivå" :label-width="formLabelWidth"> + <el-select v-model="form.region" placeholder="Velg brukerens rettighets nivå"> + <el-option label="suberbruker" value="SUPERBRUKER" /> + <el-option label="bruker" value="BRUKER" /> + </el-select> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="dialogFormVisible = false">Cancel</el-button> + <el-button type="primary" @click="dialogFormVisible = false"> Confirm </el-button> + </span> + </template> + </el-dialog> + <div class="flex-grow" /> <el-button type="danger" class="menu-item-button"> <span>Slett Husholdning</span> </el-button> -</el-container> + </el-container> </template> <script setup lang="ts"> import { Plus } from "@element-plus/icons-vue"; -import { ref } from "vue"; +import { ref, reactive } from "vue"; -const activeIndex = ref("1"); +const dialogFormVisible = ref(false); +const formLabelWidth = "140px"; -const handleSelect = (key: string, keyPath: string[]) => { - console.log(key, keyPath); -}; +const form = reactive({ + name: "", + region: "", + date1: "", + date2: "", + delivery: false, + type: [], + resource: "", + desc: "", +}); </script> <style scoped> diff --git a/src/components/UserCard.vue b/src/components/UserCard.vue index a25d17f..1268a1a 100644 --- a/src/components/UserCard.vue +++ b/src/components/UserCard.vue @@ -16,12 +16,8 @@ </el-icon> </div> <footer class="mt-2 text-right"> - <el-button v-if="userType == 'Bruker'" type="primary"> - Utnevn til superbruker - </el-button> - <el-button v-else type="primary"> - Degrader til bruker - </el-button> + <el-button v-if="userType == 'Bruker'" type="primary"> Utnevn til superbruker </el-button> + <el-button v-else type="primary"> Degrader til bruker </el-button> </footer> </el-card> </template> @@ -32,10 +28,8 @@ import { UserFilled } from "@element-plus/icons-vue"; const props = defineProps<{ user: UserFull; - userType: String, + userType: String; }>(); </script> -<style scoped> - -</style> +<style scoped></style> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 47360b2..1d9ff8c 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -32,26 +32,24 @@ const users = ref([ user: { id: 1, email: "tore@gmail.com", - firstName: "Tore" + firstName: "Tore", } as UserFull, - userType: "Superbruker" as String + userType: "Superbruker" as String, }, { user: { id: 2, email: "trond@gmail.com", - firstName: "Trond" + firstName: "Trond", } as UserFull, - userType: "Bruker" as String + userType: "Bruker" as String, }, ]); -const household = ref<Household>( - { - id: 1, - name: "Husholdning 1", - } as Household, -); +const household = ref<Household>({ + id: 1, + name: "Husholdning 1", +} as Household); </script> <style scoped> -- GitLab From 7ac8eaf27fb2938218d76fef9adc3cc2d1b6ed6e Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 14:59:49 +0200 Subject: [PATCH 09/25] chore: adds confirmaion on delete household button --- src/components/HouseholdTopBar.vue | 31 ++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index 0fd349d..e19ca9f 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -15,8 +15,8 @@ <el-form-item label="Brukerens epost" :label-width="formLabelWidth"> <el-input v-model="form.name" autocomplete="off" /> </el-form-item> - <el-form-item label="nivå" :label-width="formLabelWidth"> - <el-select v-model="form.region" placeholder="Velg brukerens rettighets nivå"> + <el-form-item label="Rettighetsnivå" :label-width="formLabelWidth"> + <el-select v-model="form.region" placeholder="Velg rettighetsnivå"> <el-option label="suberbruker" value="SUPERBRUKER" /> <el-option label="bruker" value="BRUKER" /> </el-select> @@ -31,15 +31,27 @@ </el-dialog> <div class="flex-grow" /> - <el-button type="danger" class="menu-item-button"> - <span>Slett Husholdning</span> - </el-button> + <el-popconfirm + confirm-button-text="Yes" + cancel-button-text="No" + :icon="Plus" + icon-color="#626AEF" + title="Are you sure to delete this?" + @confirm="deleteHousehold" + > + <template #reference> + <el-button type="danger" class="menu-item-button"> + <span>Slett Husholdning</span> + </el-button> + </template> + </el-popconfirm> </el-container> </template> <script setup lang="ts"> -import { Plus } from "@element-plus/icons-vue"; import { ref, reactive } from "vue"; +import { Plus } from "@element-plus/icons-vue"; +import { ElMessage } from "element-plus"; const dialogFormVisible = ref(false); const formLabelWidth = "140px"; @@ -54,6 +66,13 @@ const form = reactive({ resource: "", desc: "", }); + +const deleteHousehold = () => { + ElMessage({ + message: "Husholdningen er blitt slettet", + type: "success", + }); +}; </script> <style scoped> -- GitLab From 82d78bb00e783c9cc0e42eacfdaf169e0ad5917a Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Fri, 21 Apr 2023 15:14:38 +0200 Subject: [PATCH 10/25] chore: tweaks confirmation dialog --- src/components/HouseholdTopBar.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index e19ca9f..305ebff 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -34,8 +34,8 @@ <el-popconfirm confirm-button-text="Yes" cancel-button-text="No" - :icon="Plus" - icon-color="#626AEF" + :icon="WarnTriangleFilled" + icon-color="#F89898" title="Are you sure to delete this?" @confirm="deleteHousehold" > @@ -50,7 +50,7 @@ <script setup lang="ts"> import { ref, reactive } from "vue"; -import { Plus } from "@element-plus/icons-vue"; +import { Plus, WarnTriangleFilled } from "@element-plus/icons-vue"; import { ElMessage } from "element-plus"; const dialogFormVisible = ref(false); -- GitLab From ad03ba4bc3e462f296ecff7932d99dee989d30b7 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Sat, 22 Apr 2023 16:02:26 +0200 Subject: [PATCH 11/25] chore: adds routing and store --- src/router/index.ts | 6 +++--- src/views/HouseholdView.vue | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/router/index.ts b/src/router/index.ts index 8e9871f..8d53044 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -58,9 +58,9 @@ const router = createRouter({ }, }, { - path: "/household", - name: "household", - component: HouseholdView, + path: "/edit-household", + name: "edit household", + component: () => import("@/views/HouseholdView.vue"), }, ], }); diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 1d9ff8c..05dce0e 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,6 +1,6 @@ <template> <el-main id="component-name" class="component-name-wrapper"> - <h1>{{ household.name }}</h1> + <h1>{{ householdStore.getHousehold()?.name }}</h1> <div class="top-bar"><HouseholdTopBar /></div> <div> <el-row gutter="20"> @@ -22,10 +22,13 @@ </template> <script setup lang="ts"> -import { ref } from "vue"; +import { onMounted, ref } from "vue"; import type { UserFull, Household } from "@/services"; import UserCard from "@/components/UserCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; +import { useHouseholdStore } from "@/stores/household"; + +const householdStore = useHouseholdStore(); const users = ref([ { @@ -46,10 +49,13 @@ const users = ref([ }, ]); -const household = ref<Household>({ - id: 1, - name: "Husholdning 1", -} as Household); +onMounted(() => { + householdStore.setHousehold({ + id: 1, + name: "Husholdning 15", + } as Household); + console.log("mounted"); +}); </script> <style scoped> -- GitLab From 86d67d768fbe7f6e81a7651b48a194a85466f9cb Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Sat, 22 Apr 2023 16:24:45 +0200 Subject: [PATCH 12/25] chore: small fixes --- src/components/{UserCard.vue => HouseholdCard.vue} | 0 src/views/HouseholdView.vue | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/components/{UserCard.vue => HouseholdCard.vue} (100%) diff --git a/src/components/UserCard.vue b/src/components/HouseholdCard.vue similarity index 100% rename from src/components/UserCard.vue rename to src/components/HouseholdCard.vue diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 05dce0e..f20c419 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -51,8 +51,8 @@ const users = ref([ onMounted(() => { householdStore.setHousehold({ - id: 1, - name: "Husholdning 15", + id: 234, + name: "Hjemme", } as Household); console.log("mounted"); }); -- GitLab From f223f18761171ce967a502ba8c66f0064add0993 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Mon, 24 Apr 2023 14:00:35 +0200 Subject: [PATCH 13/25] chore: adds remove user api call --- src/components/HouseholdCard.vue | 20 ++++++++++-- src/components/HouseholdTopBar.vue | 46 +++++++++++++------------- src/views/HouseholdView.vue | 52 +++++++++++++++++++++++++++--- 3 files changed, 88 insertions(+), 30 deletions(-) diff --git a/src/components/HouseholdCard.vue b/src/components/HouseholdCard.vue index 1268a1a..026fa93 100644 --- a/src/components/HouseholdCard.vue +++ b/src/components/HouseholdCard.vue @@ -16,8 +16,19 @@ </el-icon> </div> <footer class="mt-2 text-right"> - <el-button v-if="userType == 'Bruker'" type="primary"> Utnevn til superbruker </el-button> - <el-button v-else type="primary"> Degrader til bruker </el-button> + <el-button + v-if="userType == 'Bruker'" + type="primary" + @click="emit('updateUserPrivelige', user)" + > + Utnevn til superbruker + </el-button> + <el-button v-else type="primary" @click="emit('updateUserPrivelige', user)"> + Degrader til bruker + </el-button> + <el-button type="danger" @click="emit('removeUser', user)"> + Fjern bruker fra husholdning + </el-button> </footer> </el-card> </template> @@ -26,6 +37,11 @@ import type { UserFull } from "@/services"; import { UserFilled } from "@element-plus/icons-vue"; +const emit = defineEmits<{ + (event: "removeUser", args: UserFull): void; + (event: "updateUserPrivelige", args: UserFull): void; +}>(); + const props = defineProps<{ user: UserFull; userType: String; diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index 305ebff..07c2f8e 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -13,19 +13,21 @@ <el-dialog v-model="dialogFormVisible" title="Legg til nytt medlem i husholdningen"> <el-form :model="form"> <el-form-item label="Brukerens epost" :label-width="formLabelWidth"> - <el-input v-model="form.name" autocomplete="off" /> - </el-form-item> - <el-form-item label="Rettighetsnivå" :label-width="formLabelWidth"> - <el-select v-model="form.region" placeholder="Velg rettighetsnivå"> - <el-option label="suberbruker" value="SUPERBRUKER" /> - <el-option label="bruker" value="BRUKER" /> - </el-select> + <el-input v-model="form.newUserEmail" autocomplete="off" /> </el-form-item> </el-form> <template #footer> <span class="dialog-footer"> <el-button @click="dialogFormVisible = false">Cancel</el-button> - <el-button type="primary" @click="dialogFormVisible = false"> Confirm </el-button> + <el-button + type="primary" + @click=" + dialogFormVisible = false; + printTest(); + " + > + Confirm + </el-button> </span> </template> </el-dialog> @@ -37,7 +39,7 @@ :icon="WarnTriangleFilled" icon-color="#F89898" title="Are you sure to delete this?" - @confirm="deleteHousehold" + @confirm="emit('deleteHousehold')" > <template #reference> <el-button type="danger" class="menu-item-button"> @@ -51,28 +53,24 @@ <script setup lang="ts"> import { ref, reactive } from "vue"; import { Plus, WarnTriangleFilled } from "@element-plus/icons-vue"; -import { ElMessage } from "element-plus"; const dialogFormVisible = ref(false); const formLabelWidth = "140px"; const form = reactive({ - name: "", - region: "", - date1: "", - date2: "", - delivery: false, - type: [], - resource: "", - desc: "", + newUserEmail: "" as String, }); -const deleteHousehold = () => { - ElMessage({ - message: "Husholdningen er blitt slettet", - type: "success", - }); -}; +//delete this +function printTest() { + console.log(form.newUserEmail); + form.newUserEmail = ""; +} + +const emit = defineEmits<{ + (event: "addUser", args: String): void; + (event: "deleteHousehold"): void; +}>(); </script> <style scoped> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index f20c419..002e4ba 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,7 +1,9 @@ <template> <el-main id="component-name" class="component-name-wrapper"> <h1>{{ householdStore.getHousehold()?.name }}</h1> - <div class="top-bar"><HouseholdTopBar /></div> + <div class="top-bar"> + <HouseholdTopBar :newUserEmail="users" @delete-household="deleteHousehold()" /> + </div> <div> <el-row gutter="20"> <el-col @@ -14,7 +16,12 @@ :xl="16" class="mb-5" > - <UserCard :user="user.user" :user-type="user.userType" /> + <UserCard + :user="user.user" + :user-type="user.userType" + @remove-user="removeUser(user.user)" + @update-user-privelige="updateUserPrivelige(user.user)" + /> </el-col> </el-row> </div> @@ -24,13 +31,17 @@ <script setup lang="ts"> import { onMounted, ref } from "vue"; import type { UserFull, Household } from "@/services"; -import UserCard from "@/components/UserCard.vue"; +import UserCard from "@/components/HouseholdCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; import { useHouseholdStore } from "@/stores/household"; +import { HouseholdApi } from "@/services/index"; +import { ElMessage } from "element-plus"; const householdStore = useHouseholdStore(); +const householdApi = new HouseholdApi(); -const users = ref([ +//test data +let users = ref([ { user: { id: 1, @@ -49,6 +60,39 @@ const users = ref([ }, ]); +//test data +const testHousehold = { + id: 234, + name: "Hjemme", +} as Household; + +function removeUser(user: UserFull) { + return householdApi + .removeUserFromHousehold(testHousehold.id !== undefined ? testHousehold.id : -1, user.id!) + .then((data) => { + ElMessage.success("Fjernet bruker fra husholdning"); + console.log("removed user: " + user.firstName + ", status: " + data.status); + }) + .catch((error) => { + ElMessage.error("Kunne ikke fjerne bruker fra husholdning" + error); + console.log(error); + }); +} + +function updateUserPrivelige(user: UserFull) { + console.log("updated user privelige: " + user.firstName); +} + +/* +function addUser(email: String) { + console.log("added user: " + email); +} + */ +function deleteHousehold() { + console.log("deleted household"); +} + +//test store onMounted(() => { householdStore.setHousehold({ id: 234, -- GitLab From 0b9a00978a452a8defc204e2f348b8655584dade Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Mon, 24 Apr 2023 14:41:30 +0200 Subject: [PATCH 14/25] chore: adds conditional rendering for usercard --- src/components/HouseholdCard.vue | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/components/HouseholdCard.vue b/src/components/HouseholdCard.vue index 026fa93..9aed655 100644 --- a/src/components/HouseholdCard.vue +++ b/src/components/HouseholdCard.vue @@ -17,16 +17,20 @@ </div> <footer class="mt-2 text-right"> <el-button - v-if="userType == 'Bruker'" + v-if="userType == 'Bruker' && currentUser.id != user.id" type="primary" @click="emit('updateUserPrivelige', user)" > Utnevn til superbruker </el-button> - <el-button v-else type="primary" @click="emit('updateUserPrivelige', user)"> + <el-button + v-else-if="currentUser.id != user.id" + type="primary" + @click="emit('updateUserPrivelige', user)" + > Degrader til bruker </el-button> - <el-button type="danger" @click="emit('removeUser', user)"> + <el-button v-if="currentUser.id != user.id" type="danger" @click="emit('removeUser', user)"> Fjern bruker fra husholdning </el-button> </footer> @@ -34,8 +38,21 @@ </template> <script setup lang="ts"> +import { ref } from "vue"; import type { UserFull } from "@/services"; import { UserFilled } from "@element-plus/icons-vue"; +import { useSessionStore } from "@/stores/session"; + +const sessionStore = useSessionStore(); + +//make use of sessionstore +const currentUser = ref({ + id: 1, + email: "tore@gmail.com", + firstName: "Tore", +} as UserFull); + +const currentUserFromStore = ref(sessionStore.getUser); const emit = defineEmits<{ (event: "removeUser", args: UserFull): void; -- GitLab From 15d243659a84e6f4a20d94e804a0af17005b97f9 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Mon, 24 Apr 2023 15:18:40 +0200 Subject: [PATCH 15/25] chore: removes user when user is removed --- src/components/HouseholdCard.vue | 2 +- src/components/HouseholdTopBar.vue | 8 ++++---- src/views/HouseholdView.vue | 31 +++++++++++------------------- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/components/HouseholdCard.vue b/src/components/HouseholdCard.vue index 9aed655..c75bd14 100644 --- a/src/components/HouseholdCard.vue +++ b/src/components/HouseholdCard.vue @@ -17,7 +17,7 @@ </div> <footer class="mt-2 text-right"> <el-button - v-if="userType == 'Bruker' && currentUser.id != user.id" + v-if="userType == 'USER' && currentUser.id != user.id" type="primary" @click="emit('updateUserPrivelige', user)" > diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index 07c2f8e..c9af1bd 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -4,7 +4,7 @@ Legg til nytt medlem i husholdningen </el-text> - <el-button class="menu-item-button" @click="dialogFormVisible = true" type="primary"> + <el-button class="menu-item-add-button" @click="dialogFormVisible = true" type="primary"> <el-icon> <Plus /> </el-icon> @@ -82,12 +82,12 @@ const emit = defineEmits<{ flex-grow: 1; } -.menu-item-button { +.menu-item-add-button { margin: auto 1rem; - align-content: center; + align-content: right; } .menu-item-text { - padding-left: 20px; + padding-left: 0px; } </style> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 002e4ba..10a7bab 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -34,32 +34,21 @@ import type { UserFull, Household } from "@/services"; import UserCard from "@/components/HouseholdCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; import { useHouseholdStore } from "@/stores/household"; +import { useSessionStore } from "@/stores/session"; import { HouseholdApi } from "@/services/index"; import { ElMessage } from "element-plus"; const householdStore = useHouseholdStore(); +const sessionStore = useSessionStore(); const householdApi = new HouseholdApi(); //test data -let users = ref([ - { - user: { - id: 1, - email: "tore@gmail.com", - firstName: "Tore", - } as UserFull, - userType: "Superbruker" as String, - }, - { - user: { - id: 2, - email: "trond@gmail.com", - firstName: "Trond", - } as UserFull, - userType: "Bruker" as String, - }, -]); - +let users = ref([]); +//test api +householdApi.getUsers(23).then((data) => { + users.value = data.data; + console.log("users: " + users.value); +}); //test data const testHousehold = { id: 234, @@ -70,7 +59,8 @@ function removeUser(user: UserFull) { return householdApi .removeUserFromHousehold(testHousehold.id !== undefined ? testHousehold.id : -1, user.id!) .then((data) => { - ElMessage.success("Fjernet bruker fra husholdning"); + ElMessage.success("Fjernet " + user.firstName + " fra husholdning"); + users.value = users.value.filter((u) => u.user.id !== user.id); console.log("removed user: " + user.firstName + ", status: " + data.status); }) .catch((error) => { @@ -98,6 +88,7 @@ onMounted(() => { id: 234, name: "Hjemme", } as Household); + console.log("mounted"); }); </script> -- GitLab From 368450a9e72c0f6d46079f7b906e32eac366f27e Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Mon, 24 Apr 2023 19:35:37 +0200 Subject: [PATCH 16/25] chore: adds api call for changing users priveliges --- src/views/HouseholdView.vue | 44 ++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 10a7bab..39af933 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -44,20 +44,16 @@ const householdApi = new HouseholdApi(); //test data let users = ref([]); -//test api + +//use household store householdApi.getUsers(23).then((data) => { users.value = data.data; console.log("users: " + users.value); }); -//test data -const testHousehold = { - id: 234, - name: "Hjemme", -} as Household; function removeUser(user: UserFull) { return householdApi - .removeUserFromHousehold(testHousehold.id !== undefined ? testHousehold.id : -1, user.id!) + .removeUserFromHousehold(23, user.id!) .then((data) => { ElMessage.success("Fjernet " + user.firstName + " fra husholdning"); users.value = users.value.filter((u) => u.user.id !== user.id); @@ -70,7 +66,39 @@ function removeUser(user: UserFull) { } function updateUserPrivelige(user: UserFull) { - console.log("updated user privelige: " + user.firstName); + console.log(user.email); + let userToUpdate = users.value.filter((u) => u.user.id === user.id)[0]; + console.log("userToUpdateType: " + userToUpdate.userType); + if (userToUpdate.userType === "SUPERUSER") { + userToUpdate.userType = "USER"; + } else { + userToUpdate.userType = "SUPERUSER"; + } + return householdApi + .updateHouseholdMemberRole(23, userToUpdate?.id, userToUpdate.userType) + .then((data) => { + ElMessage.success("Oppdaterte bruker " + user.firstName + " til " + userToUpdate.userType); + users.value = users.value.map((u) => { + if (u.user.id === user.id && u.userType === "USER") { + u.userType = "USER"; + } else if (u.user.id === user.id && u.userType === "SUPERUSER") { + u.userType = "SUPERUSER"; + } + return u; + }); + console.log( + "updated user: " + + user.firstName + + ", status: " + + data.status + + " to " + + userToUpdate.userType + ); + }) + .catch((error) => { + ElMessage.error("Kunne ikke oppdatere bruker" + error); + console.log(error); + }); } /* -- GitLab From bc5f45fca8c28187049b460688a2f82aa9eca90b Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Mon, 24 Apr 2023 21:09:49 +0200 Subject: [PATCH 17/25] chore: adds api call adding user to household --- src/components/HouseholdCard.vue | 2 -- src/components/HouseholdTopBar.vue | 5 ++-- src/views/HouseholdView.vue | 43 ++++++++++++++++++++++++------ 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/components/HouseholdCard.vue b/src/components/HouseholdCard.vue index c75bd14..5539200 100644 --- a/src/components/HouseholdCard.vue +++ b/src/components/HouseholdCard.vue @@ -52,8 +52,6 @@ const currentUser = ref({ firstName: "Tore", } as UserFull); -const currentUserFromStore = ref(sessionStore.getUser); - const emit = defineEmits<{ (event: "removeUser", args: UserFull): void; (event: "updateUserPrivelige", args: UserFull): void; diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index c9af1bd..f3e0599 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -23,6 +23,7 @@ type="primary" @click=" dialogFormVisible = false; + emit('addUser', form.newUserEmail as string); printTest(); " > @@ -58,7 +59,7 @@ const dialogFormVisible = ref(false); const formLabelWidth = "140px"; const form = reactive({ - newUserEmail: "" as String, + newUserEmail: "" as string, }); //delete this @@ -68,7 +69,7 @@ function printTest() { } const emit = defineEmits<{ - (event: "addUser", args: String): void; + (event: "addUser", args: string): void; (event: "deleteHousehold"): void; }>(); </script> diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 39af933..af13a45 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -2,7 +2,7 @@ <el-main id="component-name" class="component-name-wrapper"> <h1>{{ householdStore.getHousehold()?.name }}</h1> <div class="top-bar"> - <HouseholdTopBar :newUserEmail="users" @delete-household="deleteHousehold()" /> + <HouseholdTopBar @delete-household="deleteHousehold()" @add-user="addUser" /> </div> <div> <el-row gutter="20"> @@ -35,12 +35,13 @@ import UserCard from "@/components/HouseholdCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; import { useHouseholdStore } from "@/stores/household"; import { useSessionStore } from "@/stores/session"; -import { HouseholdApi } from "@/services/index"; +import { HouseholdApi, AccountApi } from "@/services/index"; import { ElMessage } from "element-plus"; const householdStore = useHouseholdStore(); const sessionStore = useSessionStore(); const householdApi = new HouseholdApi(); +const accountApi = new AccountApi(); //test data let users = ref([]); @@ -75,9 +76,9 @@ function updateUserPrivelige(user: UserFull) { userToUpdate.userType = "SUPERUSER"; } return householdApi - .updateHouseholdMemberRole(23, userToUpdate?.id, userToUpdate.userType) + .updateHouseholdMemberRole(23, userToUpdate.id, userToUpdate.userType) .then((data) => { - ElMessage.success("Oppdaterte bruker " + user.firstName + " til " + userToUpdate.userType); + ElMessage.success("Oppdaterte bruker " + user.firstName + " til: " + userToUpdate.userType); users.value = users.value.map((u) => { if (u.user.id === user.id && u.userType === "USER") { u.userType = "USER"; @@ -101,11 +102,37 @@ function updateUserPrivelige(user: UserFull) { }); } -/* -function addUser(email: String) { - console.log("added user: " + email); +//This currently works with id and not email :( backend should return user +function addUser(value: string) { + console.log("add user: " + value); + let userId: number = 3; + return householdApi + .addUser(23, { userId }) + .then((data) => { + ElMessage.success("La til " + value + " i husholdning"); + addUserLocally(userId); + console.log("added user: " + value + ", status: " + data.status); + }) + .catch((error) => { + ElMessage.error("Kunne ikke legge til bruker" + error); + console.log(error); + }); } - */ + +function addUserLocally(id: number) { + console.log("add user locally: " + id); + return accountApi + .getUserById(id) + .then((data) => { + users.value.push({ user: data.data, userType: "USER" }); + + console.log("added user: " + data.data.firstName); + }) + .catch((error) => { + console.log(error); + }); +} + function deleteHousehold() { console.log("deleted household"); } -- GitLab From 2516d3c9e55517607afbf5c7aae79086a31f1b08 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Mon, 24 Apr 2023 21:42:50 +0200 Subject: [PATCH 18/25] chore: users are now sorted by role --- src/views/HouseholdView.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index af13a45..5e6669f 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -7,7 +7,7 @@ <div> <el-row gutter="20"> <el-col - v-for="user in users" + v-for="user in users.sort((a, b) => a.userType.localeCompare(b.userType))" :key="user.user.id" :xs="24" :sm="12" @@ -125,7 +125,6 @@ function addUserLocally(id: number) { .getUserById(id) .then((data) => { users.value.push({ user: data.data, userType: "USER" }); - console.log("added user: " + data.data.firstName); }) .catch((error) => { -- GitLab From 018dd8f31f231c55c70deab7f32ecde223d2836d Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Tue, 25 Apr 2023 09:43:40 +0200 Subject: [PATCH 19/25] chore: small fixes --- src/views/HouseholdView.vue | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 5e6669f..7a8dc56 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -137,14 +137,7 @@ function deleteHousehold() { } //test store -onMounted(() => { - householdStore.setHousehold({ - id: 234, - name: "Hjemme", - } as Household); - - console.log("mounted"); -}); +onMounted(() => {}); </script> <style scoped> -- GitLab From d69dc56ea3a8fe800f28e0ce59816d695222b333 Mon Sep 17 00:00:00 2001 From: Arunan Gnanasekaran <arunan2212@gmail.com> Date: Tue, 25 Apr 2023 11:06:42 +0200 Subject: [PATCH 20/25] chore: remove unused import --- src/router/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/router/index.ts b/src/router/index.ts index 8d53044..d28271c 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -3,7 +3,6 @@ import HomeView from "../views/HomeView.vue"; import NotFoundView from "../views/NotFoundView.vue"; import { useSessionStore } from "@/stores/session"; import { AccountApi } from "@/services/index"; -import HouseholdView from "@/views/HouseholdView.vue"; let startup = true; const router = createRouter({ -- GitLab From 416ffd9e1d298d06aeb9342785fbe54a13f44d02 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Tue, 25 Apr 2023 11:28:23 +0200 Subject: [PATCH 21/25] chore: fixes issue of horizontal scrollbar --- src/components/HouseholdCard.vue | 2 +- src/views/HouseholdView.vue | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/HouseholdCard.vue b/src/components/HouseholdCard.vue index 5539200..4a0d281 100644 --- a/src/components/HouseholdCard.vue +++ b/src/components/HouseholdCard.vue @@ -45,7 +45,7 @@ import { useSessionStore } from "@/stores/session"; const sessionStore = useSessionStore(); -//make use of sessionstore +//make use of sessionstore (remove) const currentUser = ref({ id: 1, email: "tore@gmail.com", diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 7a8dc56..6ddba6a 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,5 +1,5 @@ <template> - <el-main id="component-name" class="component-name-wrapper"> + <div id="householdview" class="householdview-wrapper"> <h1>{{ householdStore.getHousehold()?.name }}</h1> <div class="top-bar"> <HouseholdTopBar @delete-household="deleteHousehold()" @add-user="addUser" /> @@ -25,7 +25,7 @@ </el-col> </el-row> </div> - </el-main> + </div> </template> <script setup lang="ts"> @@ -148,4 +148,12 @@ onMounted(() => {}); .top-bar { margin-bottom: 20px; } + +.householdview-wrapper { + width: 100%; + height: 100%; + padding: 1rem 2rem; + margin: 0; + overflow: hidden; +} </style> -- GitLab From 54c07341a428aa6cda76695eec269a1d0530f52a Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Tue, 25 Apr 2023 13:24:02 +0200 Subject: [PATCH 22/25] chore: gets users from household in householdstore --- src/views/HouseholdView.vue | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 6ddba6a..640bb98 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -43,13 +43,10 @@ const sessionStore = useSessionStore(); const householdApi = new HouseholdApi(); const accountApi = new AccountApi(); -//test data let users = ref([]); -//use household store -householdApi.getUsers(23).then((data) => { +householdApi.getUsers(householdStore.getHousehold()?.id!).then((data) => { users.value = data.data; - console.log("users: " + users.value); }); function removeUser(user: UserFull) { -- GitLab From 52ca0429294eee301bff1afa7bb77dc13b7429cb Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Tue, 25 Apr 2023 14:18:41 +0200 Subject: [PATCH 23/25] chore: displays select household if no household exists --- src/views/HouseholdView.vue | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index 640bb98..e87a929 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,6 +1,7 @@ <template> <div id="householdview" class="householdview-wrapper"> - <h1>{{ householdStore.getHousehold()?.name }}</h1> + <h1 v-if="currentHousehold?.id">{{ currentHousehold?.name }}</h1> + <h1 v-else>Velg husholdning</h1> <div class="top-bar"> <HouseholdTopBar @delete-household="deleteHousehold()" @add-user="addUser" /> </div> @@ -44,18 +45,19 @@ const householdApi = new HouseholdApi(); const accountApi = new AccountApi(); let users = ref([]); +const currentHousehold = householdStore.getHousehold(); -householdApi.getUsers(householdStore.getHousehold()?.id!).then((data) => { +householdApi.getUsers(currentHousehold?.id!).then((data) => { users.value = data.data; }); function removeUser(user: UserFull) { return householdApi .removeUserFromHousehold(23, user.id!) - .then((data) => { + .then(() => { ElMessage.success("Fjernet " + user.firstName + " fra husholdning"); users.value = users.value.filter((u) => u.user.id !== user.id); - console.log("removed user: " + user.firstName + ", status: " + data.status); + console.log("removed user: " + user.firstName); }) .catch((error) => { ElMessage.error("Kunne ikke fjerne bruker fra husholdning" + error); @@ -102,9 +104,10 @@ function updateUserPrivelige(user: UserFull) { //This currently works with id and not email :( backend should return user function addUser(value: string) { console.log("add user: " + value); + //todo: fix this let userId: number = 3; return householdApi - .addUser(23, { userId }) + .addUser(currentHousehold?.id!, { userId }) .then((data) => { ElMessage.success("La til " + value + " i husholdning"); addUserLocally(userId); @@ -130,10 +133,19 @@ function addUserLocally(id: number) { } function deleteHousehold() { + householdApi + .deleteHousehold(currentHousehold?.id!) + .then(() => { + ElMessage.success("Slettet husholdning"); + console.log("deleted household: " + currentHousehold?.name); + }) + .catch((error) => { + ElMessage.error("Kunne ikke slette husholdning" + error); + console.log(error); + }); console.log("deleted household"); } -//test store onMounted(() => {}); </script> -- GitLab From abfd50430628f2fbc97a7309054dee3a7263380c Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Tue, 25 Apr 2023 22:20:26 +0200 Subject: [PATCH 24/25] chore: adds vitest for household --- src/components/HouseholdCard.vue | 13 +-- src/components/HouseholdTopBar.vue | 1 + .../__tests__/HouseholdCard.spec.ts | 89 +++++++++++++++++++ src/views/HouseholdView.vue | 10 +-- 4 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 src/components/__tests__/HouseholdCard.spec.ts diff --git a/src/components/HouseholdCard.vue b/src/components/HouseholdCard.vue index 4a0d281..5ddcab8 100644 --- a/src/components/HouseholdCard.vue +++ b/src/components/HouseholdCard.vue @@ -24,13 +24,13 @@ Utnevn til superbruker </el-button> <el-button - v-else-if="currentUser.id != user.id" + v-else-if="currentUser?.id != user.id" type="primary" @click="emit('updateUserPrivelige', user)" > Degrader til bruker </el-button> - <el-button v-if="currentUser.id != user.id" type="danger" @click="emit('removeUser', user)"> + <el-button v-if="currentUser?.id != user.id" type="danger" @click="emit('removeUser', user)"> Fjern bruker fra husholdning </el-button> </footer> @@ -38,19 +38,20 @@ </template> <script setup lang="ts"> -import { ref } from "vue"; import type { UserFull } from "@/services"; import { UserFilled } from "@element-plus/icons-vue"; import { useSessionStore } from "@/stores/session"; const sessionStore = useSessionStore(); -//make use of sessionstore (remove) -const currentUser = ref({ +//make use of sessionstore (remove) prop +/* var currentUser = ref({ id: 1, email: "tore@gmail.com", firstName: "Tore", -} as UserFull); +} as UserFull); */ + +const currentUser = sessionStore.getUser(); const emit = defineEmits<{ (event: "removeUser", args: UserFull): void; diff --git a/src/components/HouseholdTopBar.vue b/src/components/HouseholdTopBar.vue index f3e0599..d417fac 100644 --- a/src/components/HouseholdTopBar.vue +++ b/src/components/HouseholdTopBar.vue @@ -20,6 +20,7 @@ <span class="dialog-footer"> <el-button @click="dialogFormVisible = false">Cancel</el-button> <el-button + ref="confirmButton" type="primary" @click=" dialogFormVisible = false; diff --git a/src/components/__tests__/HouseholdCard.spec.ts b/src/components/__tests__/HouseholdCard.spec.ts new file mode 100644 index 0000000..fdbf329 --- /dev/null +++ b/src/components/__tests__/HouseholdCard.spec.ts @@ -0,0 +1,89 @@ +import { beforeEach, describe, expect, it } from "vitest"; +import { mount } from "@vue/test-utils"; +import { setActivePinia, createPinia } from "pinia"; +import { useSessionStore } from "@/stores/session"; + +import HouseholdCard from "../HouseholdCard.vue"; +import type { UserFull } from "@/services/index"; + +let user: UserFull = {}; +let userType: string = ""; + +beforeEach(() => { + user = { + id: 13, + firstName: "Joe", + email: "shmoe@gmail.com", + } as UserFull; + userType = "SUPERUSER"; + setActivePinia(createPinia()); +}); + +describe("HouseholdCard", () => { + it("has users first name in title", () => { + const wrapper = mount(HouseholdCard as any, { + props: { + user, + userType, + }, + }); + expect(wrapper.text()).toContain(user.firstName); + }); + it("has users email in text", () => { + const wrapper = mount(HouseholdCard as any, { + props: { + user, + }, + }); + expect(wrapper.text()).toContain(user.email); + }); + it("has users type in text", () => { + const wrapper = mount(HouseholdCard as any, { + props: { + user, + userType, + }, + }); + expect(wrapper.text()).toContain(userType); + }); + it("has demote to user button if user is superuser", () => { + const wrapper = mount(HouseholdCard as any, { + props: { + user, + userType, + }, + }); + expect(wrapper.find("el-button[type=primary]").text()).toContain("Degrader til bruker"); + }); + it("emits demote event when demote button is clicked", async () => { + const wrapper = mount(HouseholdCard as any, { + props: { + user, + userType, + }, + }); + await wrapper.find("el-button[type=primary]").trigger("click"); + expect(wrapper.emitted("updateUserPrivelige")).toBeTruthy(); + }); + it("has remove from household button", () => { + const wrapper = mount(HouseholdCard as any, { + props: { + user, + userType, + }, + }); + expect(wrapper.find("el-button[type=danger]").text()).toContain("Fjern bruker fra husholdning"); + }); + it("user with same id as logged in user does not have remove from household button, demote or promote", () => { + useSessionStore().authenticate(user); + const wrapper = mount(HouseholdCard as any, { + props: { + user, + userType, + }, + }); + + expect(wrapper.find("el-button[type=danger]").exists()).toBeFalsy(); + expect(wrapper.find("el-button[type=primary]").exists()).toBeFalsy(); + }); +}); diff --git a/src/views/HouseholdView.vue b/src/views/HouseholdView.vue index e87a929..c7ed754 100644 --- a/src/views/HouseholdView.vue +++ b/src/views/HouseholdView.vue @@ -1,8 +1,8 @@ <template> <div id="householdview" class="householdview-wrapper"> <h1 v-if="currentHousehold?.id">{{ currentHousehold?.name }}</h1> - <h1 v-else>Velg husholdning</h1> - <div class="top-bar"> + <h1 v-else>Velg husholdning i meny</h1> + <div class="top-bar" v-if="currentHousehold?.id"> <HouseholdTopBar @delete-household="deleteHousehold()" @add-user="addUser" /> </div> <div> @@ -31,7 +31,7 @@ <script setup lang="ts"> import { onMounted, ref } from "vue"; -import type { UserFull, Household } from "@/services"; +import type { UserFull } from "@/services"; import UserCard from "@/components/HouseholdCard.vue"; import HouseholdTopBar from "@/components/HouseholdTopBar.vue"; import { useHouseholdStore } from "@/stores/household"; @@ -40,7 +40,7 @@ import { HouseholdApi, AccountApi } from "@/services/index"; import { ElMessage } from "element-plus"; const householdStore = useHouseholdStore(); -const sessionStore = useSessionStore(); +/* const sessionStore = useSessionStore(); */ const householdApi = new HouseholdApi(); const accountApi = new AccountApi(); @@ -101,7 +101,7 @@ function updateUserPrivelige(user: UserFull) { }); } -//This currently works with id and not email :( backend should return user +//This currently works with id and not email :( backend should return user? function addUser(value: string) { console.log("add user: " + value); //todo: fix this -- GitLab From 2fc4e43dbacb5edefd80667acddb6b17371dabd4 Mon Sep 17 00:00:00 2001 From: JonasKos <jonas.kosmo@gmail.com> Date: Wed, 26 Apr 2023 09:47:54 +0200 Subject: [PATCH 25/25] fix: fixes userCurrent is undefined bug --- src/components/HouseholdCard.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/HouseholdCard.vue b/src/components/HouseholdCard.vue index 5ddcab8..23537b8 100644 --- a/src/components/HouseholdCard.vue +++ b/src/components/HouseholdCard.vue @@ -17,7 +17,7 @@ </div> <footer class="mt-2 text-right"> <el-button - v-if="userType == 'USER' && currentUser.id != user.id" + v-if="userType == 'USER' && currentUser?.id != user.id" type="primary" @click="emit('updateUserPrivelige', user)" > -- GitLab