Neue Liste Erstellen
diff --git a/frontend/src/services/Board.ts b/frontend/src/services/Board.ts
index 4e48b99..445d83a 100644
--- a/frontend/src/services/Board.ts
+++ b/frontend/src/services/Board.ts
@@ -4,23 +4,41 @@ import { v4 as uuidv4 } from 'uuid'
export class Board {
name: string
- users: Array
+ users: Set
+ spendings: Array
creationDate: Date
guid: string
constructor(name: string) {
this.name = name
- this.users = Array()
+ this.users = new Set()
+ this.spendings = new Array()
this.creationDate = new Date()
this.guid = uuidv4()
}
addUser(user: User): void {
- this.users.push(user)
+ this.users.add(user)
}
- addSpendingByUserName(userName: string, spendingName: string, amountCt: number) {
- const user = this.users.filter((u) => u.name === userName)[0]
- user?.addSpending(new Spending(spendingName, amountCt))
+ addSpending(user: User, spending: Spending): void {
+ spending.setSpender(user)
+ this.users.add(user)
+ this.spendings.push(spending)
+ }
+
+ getUsers(): User[] {
+ return Array.from(this.users)
+ }
+
+ getUserSpendingTotals(): Map {
+ const totals = new Map()
+ for (const spending of this.spendings) {
+ if (spending.spender) {
+ const current = totals.get(spending.spender.name) || 0
+ totals.set(spending.spender.name, current + spending.amountCt)
+ }
+ }
+ return totals
}
}
diff --git a/frontend/src/services/User.ts b/frontend/src/services/User.ts
index 741b372..01e6109 100644
--- a/frontend/src/services/User.ts
+++ b/frontend/src/services/User.ts
@@ -1,21 +1,8 @@
-import type { Spending } from './Spending'
-
export class User {
name: string
- spendings: Array
constructor(name: string) {
this.name = name
- this.spendings = Array()
- }
-
- addSpending(spending: Spending): void {
- spending.setSpender(this)
- this.spendings.push(spending)
- }
-
- getTotalSpending(): number {
- return this.spendings.map((w) => w.amountCt).reduce((acc, num) => acc + num, 0)
}
getInitials(): string {
diff --git a/frontend/src/stores/boardStore.ts b/frontend/src/stores/boardStore.ts
index 65d4960..b95cead 100644
--- a/frontend/src/stores/boardStore.ts
+++ b/frontend/src/stores/boardStore.ts
@@ -2,43 +2,23 @@ import { defineStore } from 'pinia'
import { useRoute } from 'vue-router'
import { Board } from '@/services/Board'
import { User } from '@/services/User'
-import { Spending } from '@/services/Spending'
-import { useUserStore } from './userStore'
export const useBoardStore = defineStore('boardStore', () => {
const route = useRoute()
const boards = new Map()
- let testBoard: Board | undefined
- const userStore = useUserStore()
- function createBoard(name: string): Board {
+ function createBoard(owner: User, name: string): Board {
const newBoard = new Board(name)
+ newBoard.addUser(owner)
boards.set(newBoard.guid, newBoard)
return newBoard
}
- function getBoard(guid: string): Board {
- const board = boards.get(guid)
- if (board != undefined) {
- return board
- } else {
- if (testBoard === undefined) {
- testBoard = new Board('Grill and Chill')
- const elias = userStore.getUser('Elias') || new User('Elias')
- elias.addSpending(new Spending('Burger', 1230))
- elias.addSpending(new Spending('Kaffee', 510))
- testBoard.addUser(elias)
- const max = userStore.getUser('Max') || new User('Max')
- max.addSpending(new Spending('Omlett', 1822))
- max.addSpending(new Spending('Kaffee', 3073))
- testBoard.addUser(max)
- return testBoard
- }
- return testBoard
- }
+ function getBoard(guid: string): Board | undefined {
+ return boards.get(guid)
}
- function getCurrentBoard(): Board {
+ function getCurrentBoard(): Board | undefined {
if (typeof route.params.boardId === 'string') {
return getBoard(route.params.boardId)
} else {
@@ -46,5 +26,11 @@ export const useBoardStore = defineStore('boardStore', () => {
}
}
- return { createBoard, getBoard, getCurrentBoard }
+ function getBoardsForUser(user: User): Board[] {
+ return Array.from(boards.values()).filter(board =>
+ board.getUsers().some(u => u.name === user.name)
+ )
+ }
+
+ return { createBoard, getBoard, getCurrentBoard, getBoardsForUser }
})
diff --git a/frontend/src/stores/userStore.ts b/frontend/src/stores/userStore.ts
index c16f429..a8daaa1 100644
--- a/frontend/src/stores/userStore.ts
+++ b/frontend/src/stores/userStore.ts
@@ -4,6 +4,7 @@ import { User } from '@/services/User'
export const useUserStore = defineStore('userStore', () => {
const users = ref>([])
+ const useSampleUsers = ref(true)
function addUser(user: User) {
users.value.push(user)
@@ -14,12 +15,27 @@ export const useUserStore = defineStore('userStore', () => {
}
function getUser(userName: string) {
- return users.value.find((user: User) => user.name === userName)
+ return getAllUsers().find((user: User) => user.name === userName)
+ }
+
+ function getLoggedInUser() {
+ return getAllUsers().find((user: User) => user.name === "Elias")
}
function getAllUsers() {
+ if (useSampleUsers.value) {
+ // Return sample users
+ return [
+ new User('Elias'),
+ new User('Daniel'),
+ new User('Max'),
+ new User('Alice Example'),
+ new User('Bob Demo'),
+ new User('Charlie Test')
+ ]
+ }
return users.value
}
- return { addUser, removeUser, getUser, getAllUsers }
+ return { addUser, removeUser, getUser, getAllUsers, useSampleUsers, getLogedInUser: getLoggedInUser }
})
diff --git a/frontend/src/views/BoardInfoView.vue b/frontend/src/views/BoardInfoView.vue
index 1609d3a..c373f12 100644
--- a/frontend/src/views/BoardInfoView.vue
+++ b/frontend/src/views/BoardInfoView.vue
@@ -11,12 +11,12 @@ const board = ref(store.getCurrentBoard())
-
-
+
+
import ItemList from '@/components/ItemList.vue'
-
+import ItemListElement from '@/components/ItemListElement.vue'
import { useBoardStore } from '@/stores/boardStore'
+import { useUserStore } from '@/stores/userStore'
+import { computed, ref } from 'vue'
+
+const boardStore = useBoardStore()
+const userStore = useUserStore()
+const selectedUserName = ref('')
+
+const availableUsers = computed(() => {
+ const allUsers = userStore.getAllUsers()
+ const boardUsers = boardStore.getCurrentBoard()?.getUsers()
+ const boardUserNames = new Set(boardUsers?.map(u => u.name))
+ return allUsers.filter(u => !boardUserNames.has(u.name))
+})
+
+function addUser() {
+ if (selectedUserName.value) {
+ const user = userStore.getAllUsers().find(u => u.name === selectedUserName.value)
+ if (user) {
+ boardStore.getCurrentBoard()?.addUser(user)
+ selectedUserName.value = '' // reset
+ }
+ }
+}
-
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/BoardSpendingsView.vue b/frontend/src/views/BoardSpendingsView.vue
index 3489eab..d5c3a08 100644
--- a/frontend/src/views/BoardSpendingsView.vue
+++ b/frontend/src/views/BoardSpendingsView.vue
@@ -6,7 +6,7 @@ import { useBoardStore } from '@/stores/boardStore'
import { ref } from 'vue'
const store = useBoardStore()
-const spendings = ref(store.getCurrentBoard().users.flatMap((u) => u.spendings))
+const spendings = ref(store.getCurrentBoard()?.spendings)
diff --git a/frontend/src/views/BoardUsersView.vue b/frontend/src/views/BoardUsersView.vue
index 1d21c12..e75db63 100644
--- a/frontend/src/views/BoardUsersView.vue
+++ b/frontend/src/views/BoardUsersView.vue
@@ -7,7 +7,8 @@ import { useBoardStore } from '@/stores/boardStore'
import { ref } from 'vue'
const store = useBoardStore()
-const users = ref(store.getCurrentBoard().users)
+const users = ref(store.getCurrentBoard()?.getUsers())
+const totals = ref(store.getCurrentBoard()?.getUserSpendingTotals())
@@ -17,7 +18,7 @@ const users = ref(store.getCurrentBoard().users)
:key="user.name"
:icon="user.getInitials()"
:title="user.name"
- :subtitle="(user.getTotalSpending() / 100).toFixed(2) + '€'"
+ :subtitle="((totals?.get(user.name) || 0) / 100).toFixed(2) + '€'"
subtitle-class="text-green-700"
>
diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue
index eb8ee45..dd6a821 100644
--- a/frontend/src/views/HomeView.vue
+++ b/frontend/src/views/HomeView.vue
@@ -1,9 +1,33 @@
-