diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a78581..542289a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,13 @@ - Icons on exercise groups on help page - Welcome dialog: New page for look and feel, merge database and exercise creation in one step - Add links to GitHub and project page on settings +- New section on homepage for popular genres +## 🐛 Bugfixes + +- Filter on band page changes visible bands on homepage +- No startup after packaging +- Infinity loading on concert booking page is user comes from band page # v.0.3.0 (2025-02-28) ## 🚀 Features diff --git a/src/locales/de.json b/src/locales/de.json index 7862def..280ae74 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -297,7 +297,8 @@ }, "genre": { "withoutBand": "ohne Band", - "popular": "Beliebte Genres" + "popular": "Beliebte Genres", + "allGenres": "Alle Genres" }, "admin": { "adminpanel": "Admin Panel" diff --git a/src/locales/en.json b/src/locales/en.json index e167ab5..0c2738c 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -297,7 +297,8 @@ }, "genre": { "withoutBand": "without Band", - "popular": "Popular Genres" + "popular": "Popular Genres", + "allGenres": "All Genres" }, "admin": { "adminpanel": "Admin Panel" diff --git a/src/pages/misc/homePage/index.vue b/src/pages/misc/homePage/index.vue index 0958e6d..908a133 100644 --- a/src/pages/misc/homePage/index.vue +++ b/src/pages/misc/homePage/index.vue @@ -7,7 +7,7 @@ import TopLocationsSection from "./topLocationsSection.vue"; import { usePreferencesStore } from "@/stores/preferences.store"; import welcomeDialog from "./welcomeDialog/dialog.vue"; import { ref } from "vue"; -import genresSection from "./genresSection.vue"; +import genresSection from "./topGenresSection.vue"; const concertStore = useConcertStore(); const locationStore = useLocationStore(); diff --git a/src/pages/misc/homePage/genresSection.vue b/src/pages/misc/homePage/topGenresSection.vue similarity index 77% rename from src/pages/misc/homePage/genresSection.vue rename to src/pages/misc/homePage/topGenresSection.vue index 2b22eb6..dd7d8b4 100644 --- a/src/pages/misc/homePage/genresSection.vue +++ b/src/pages/misc/homePage/topGenresSection.vue @@ -6,6 +6,7 @@ import { GenreApiModel } from "@/data/models/acts/genreApiModel"; import { useGenreStore } from "@/stores/genre.store"; import { ref, watch } from "vue"; import { useRouter } from "vue-router"; +import outlinedButton from "@/components/basics/outlinedButton.vue"; const genreStore = useGenreStore(); const genresByNumberOfBands = ref>([]); @@ -37,7 +38,7 @@ watch( - + + + diff --git a/src/stores/genre.store.ts b/src/stores/genre.store.ts index 3d306a2..11533e4 100644 --- a/src/stores/genre.store.ts +++ b/src/stores/genre.store.ts @@ -1,4 +1,9 @@ -import { deleteGenre, fetchAllGenres, patchGenre, postGenre } from "@/data/api/genreApi"; +import { + deleteGenre, + fetchAllGenres, + patchGenre, + postGenre, +} from "@/data/api/genreApi"; import { GenreApiModel } from "@/data/models/acts/genreApiModel"; import { defineStore } from "pinia"; import { ref } from "vue"; @@ -10,6 +15,8 @@ export const useGenreStore = defineStore("genreStore", { /** All available genres from server */ genres: ref>([]), + topGenres: ref>([]), + /** Currently selected genre */ genre: ref(null), @@ -17,7 +24,7 @@ export const useGenreStore = defineStore("genreStore", { showEditDialog: ref(false), /** Request to server sent, waiting for data response */ - fetchInProgress: ref(false) + fetchInProgress: ref(false), }), actions: { @@ -25,98 +32,103 @@ export const useGenreStore = defineStore("genreStore", { * Get all genres from the database */ getGenres() { - this.fetchInProgress = true + this.fetchInProgress = true; - fetchAllGenres() - .then(response => { - this.genres = response.data - this.fetchInProgress = false - }) + fetchAllGenres().then((response) => { + this.genres = response.data; + + let genresByNumberOfBands = this.genres; + + genresByNumberOfBands.sort((a, b) => { + return b.bands.length - a.bands.length; + }); + + this.topGenres = genresByNumberOfBands.splice(0, 8) + + this.fetchInProgress = false; + }); }, /** * Prepare edit dialog for new genre, opens it */ newGenre() { - this.genre = new GenreApiModel() - this.showEditDialog = true + this.genre = new GenreApiModel(); + this.showEditDialog = true; }, /** * Edit a Genre object, move parameter to this.genre, opens dialog - * + * * @param genre Selected Genre object */ editGenre(genre: GenreApiModel) { - this.genre = genre - this.showEditDialog = true + this.genre = genre; + this.showEditDialog = true; }, /** * Save edited genre to the backend server */ saveGenre() { - const feedbackStore = useFeedbackStore() - this.fetchInProgress = true + const feedbackStore = useFeedbackStore(); + this.fetchInProgress = true; if (this.genre.id == undefined) { // Creating new Genre - postGenre(this.genre) - .then(response => { - if (response.status == 200) { - feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDSUCCESSFUL) - this.getGenres() - this.showEditDialog = false - } else { - feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDERROR) - } - }) + postGenre(this.genre).then((response) => { + if (response.status == 200) { + feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDSUCCESSFUL); + this.getGenres(); + this.showEditDialog = false; + } else { + feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDERROR); + } + }); } else { // Update existing Genre - patchGenre(this.genre) - .then(response => { - if (response.status == 200) { - feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDSUCCESSFUL) - this.getGenres() - this.showEditDialog = false - } else { - feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDERROR) - } - }) + patchGenre(this.genre).then((response) => { + if (response.status == 200) { + feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDSUCCESSFUL); + this.getGenres(); + this.showEditDialog = false; + } else { + feedbackStore.addSnackbar(BannerStateEnum.GENRESAVEDERROR); + } + }); } }, /** * Delete a Genre object - * + * * @param genre Genre to delete */ deleteGenre(genre: GenreApiModel) { - const feedbackStore = useFeedbackStore() - this.fetchInProgress = true + const feedbackStore = useFeedbackStore(); + this.fetchInProgress = true; - deleteGenre(genre) - .then(response => { - if (response.status == 200) { - feedbackStore.addSnackbar(BannerStateEnum.GENREDELETESUCCESSFUL) - this.getGenres() - } else { - feedbackStore.addSnackbar(BannerStateEnum.GENREDELETEERROR) - } - }) + deleteGenre(genre).then((response) => { + if (response.status == 200) { + feedbackStore.addSnackbar(BannerStateEnum.GENREDELETESUCCESSFUL); + this.getGenres(); + } else { + feedbackStore.addSnackbar(BannerStateEnum.GENREDELETEERROR); + } + }); }, setGenreByName(name: string) { - this.genre = null - name = name.replace("+", " ") + this.genre = null; + name = name.replace("+", " "); - let newGenre = this.genres.find(genre => { - return genre.name == name - }) + let newGenre = this.genres.find((genre) => { + return genre.name == name; + }); if (newGenre != undefined) { - this.genre = newGenre + this.genre = newGenre; } - } - } -}) \ No newline at end of file + }, + }, +});