Exercise 3.1 fully implemented

This commit is contained in:
2024-11-20 12:27:41 +01:00
parent cfc466b92e
commit 5eab947b8c
5 changed files with 34 additions and 16 deletions

View File

@@ -6,7 +6,8 @@ const router = useRouter()
const path = ref("https://www.eventmaster.com" + router.currentRoute.value.fullPath) const path = ref("https://www.eventmaster.com" + router.currentRoute.value.fullPath)
function navigate() { function navigate() {
router.replace({ path: path.value.substring(path.value.indexOf('.com') + 4) }) let newPath = path.value.substring(path.value.indexOf('.com') + 4)
router.push(newPath)
} }
watch(() => router.currentRoute.value.fullPath, () => { watch(() => router.currentRoute.value.fullPath, () => {

View File

@@ -1,12 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import cardView from '@/components/basics/cardView.vue'; import cardView from '@/components/basics/cardView.vue';
import { useBandStore } from '@/stores/band.store';
import outlinedButton from '@/components/basics/outlinedButton.vue'; import outlinedButton from '@/components/basics/outlinedButton.vue';
import { GenreModel } from '@/data/models/acts/genreModel'; import { GenreModel } from '@/data/models/acts/genreModel';
import { useGenreStore } from '@/stores/genre.store'; import { useGenreStore } from '@/stores/genre.store';
import { useRouter } from 'vue-router';
const bandStore = useBandStore()
const genreStore = useGenreStore() const genreStore = useGenreStore()
const router = useRouter()
genreStore.getGenres() genreStore.getGenres()
@@ -15,6 +15,9 @@ function itemProps(item: GenreModel) {
title: item.name title: item.name
} }
} }
// Select genre from query parameter
genreStore.setGenreByName(String(router.currentRoute.value.query["genreName"]))
</script> </script>
<template> <template>
@@ -25,21 +28,19 @@ function itemProps(item: GenreModel) {
<v-row> <v-row>
<v-col> <v-col>
<v-select <v-select
v-model="genreStore.filteredGenres" v-model="genreStore.genre"
:items="genreStore.genres" :items="genreStore.genres"
variant="outlined" variant="outlined"
:label="$t('band.genre', 2)" :label="$t('band.genre', 2)"
:item-props="itemProps" :item-props="itemProps"
chips
clearable clearable
hide-details hide-details
multiple
/> />
</v-col> </v-col>
<v-col cols="auto"> <v-col cols="auto">
<outlined-button <outlined-button
@click="bandStore.getBands" @click="router.push({ path: '/bands', query: { genreName: genreStore.genre.name }})"
height="100%" height="100%"
> >
{{ $t('misc.actions.filtering') }} {{ $t('misc.actions.filtering') }}

View File

@@ -3,10 +3,18 @@ import { useBandStore } from '@/stores/band.store';
import cardViewHorizontal from '@/components/basics/cardViewHorizontal.vue'; import cardViewHorizontal from '@/components/basics/cardViewHorizontal.vue';
import bandListItem from '@/components/pageParts/bandListItem.vue'; import bandListItem from '@/components/pageParts/bandListItem.vue';
import bandFilterbar from './bandFilterbar.vue'; import bandFilterbar from './bandFilterbar.vue';
import { watch } from 'vue';
import { useRouter } from 'vue-router';
const bandStore = useBandStore() const bandStore = useBandStore()
const router = useRouter()
bandStore.getBands() bandStore.getBands()
// Refetch bands if query parameter changes
watch(() => router.currentRoute.value.query, () => {
bandStore.getBands()
})
</script> </script>
<template> <template>

View File

@@ -33,16 +33,14 @@ export const useBandStore = defineStore("bandStore", {
await fetchAllBands() await fetchAllBands()
.then(result => { .then(result => {
this.bands = result.data.filter((band: BandApiModel) => { this.bands = result.data.filter((band: BandApiModel) => {
if (genreStore.filteredGenres.length == 0) { if (genreStore.genre == null) {
return true return true
} }
for (let bandGenre of band.genres) { for (let bandGenre of band.genres) {
for (let filteredGenres of genreStore.filteredGenres) { if (bandGenre.name == genreStore.genre.name) {
if (bandGenre.name == filteredGenres.name) {
return true return true
} }
}
} }
return false return false

View File

@@ -10,11 +10,8 @@ export const useGenreStore = defineStore("genreStore", {
/** All available genres from server */ /** All available genres from server */
genres: ref<Array<GenreApiModel>>([]), genres: ref<Array<GenreApiModel>>([]),
/** Currently edited genre */ /** Currently selected genre */
genre: ref<GenreApiModel>(new GenreApiModel()), genre: ref<GenreApiModel>(null),
/** Genres to filter bands for */
filteredGenres: ref<Array<GenreApiModel>>([]),
/** Show or hide edit dialog for Genre object */ /** Show or hide edit dialog for Genre object */
showEditDialog: ref(false), showEditDialog: ref(false),
@@ -107,6 +104,19 @@ export const useGenreStore = defineStore("genreStore", {
feedbackStore.addSnackbar(BannerStateEnum.GENREDELETEERROR) feedbackStore.addSnackbar(BannerStateEnum.GENREDELETEERROR)
} }
}) })
},
setGenreByName(name: string) {
this.genre = null
name = name.replace("+", " ")
let newGenre = this.genres.find(genre => {
return genre.name == name
})
if (newGenre != undefined) {
this.genre = newGenre
}
} }
} }
}) })