Docstrings, AdminDashboard button loading, new BannerStateEnums

This commit is contained in:
2024-11-06 18:22:03 +01:00
parent 9ec8e382cf
commit 844898bb3c
5 changed files with 128 additions and 43 deletions

View File

@@ -170,7 +170,11 @@
"bandDeleteError": "Fehler beim Löschen der Band", "bandDeleteError": "Fehler beim Löschen der Band",
"bandDeleteSuccessful": "Band erfolgreich gelöscht", "bandDeleteSuccessful": "Band erfolgreich gelöscht",
"bandSavedError": "Fehler beim Speichern der Band", "bandSavedError": "Fehler beim Speichern der Band",
"bandSavedSuccessful": "Band erfolgreich gespeichert" "bandSavedSuccessful": "Band erfolgreich gespeichert",
"genreDeleteError": "Fehler beim Löschen des Genres",
"genreDeleteSuccessful": "Genre erfolgreich gelöscht",
"genreSavedError": "Genre erfolgreich gespeichert",
"genreSavedSuccessful": "Fehler beim Speichern des Genres"
}, },
"misc": { "misc": {
"404": { "404": {
@@ -212,5 +216,8 @@
"title": "Ersteinrichtung", "title": "Ersteinrichtung",
"description": "Die Datenbank wird eingerichtet. Dies kann 1-2 Minuten dauern. Bitte warten..." "description": "Die Datenbank wird eingerichtet. Dies kann 1-2 Minuten dauern. Bitte warten..."
} }
},
"genre": {
"withoutBand": "ohne Band"
} }
} }

View File

@@ -170,7 +170,11 @@
"bandDeleteError": "Error on deleting band", "bandDeleteError": "Error on deleting band",
"bandDeleteSuccessful": "Band successfully deleted", "bandDeleteSuccessful": "Band successfully deleted",
"bandSavedError": "Error on saving band", "bandSavedError": "Error on saving band",
"bandSavedSuccessful": "Band successfully saved" "bandSavedSuccessful": "Band successfully saved",
"genreDeleteError": "Error on deleting Genre",
"genreDeleteSuccessful": "Genre successfully deleted",
"genreSavedError": "Genre successfully saved",
"genreSavedSuccessful": "Error on saving genre"
}, },
"misc": { "misc": {
"404": { "404": {
@@ -212,5 +216,8 @@
"title": "First startup", "title": "First startup",
"description": "Creating database. This could take 1-2 minutes. Please wait..." "description": "Creating database. This could take 1-2 minutes. Please wait..."
} }
},
"genre": {
"withoutBand": "without Band"
} }
} }

View File

@@ -6,7 +6,6 @@ import { useConcertStore } from '@/stores/concert.store';
import { useBandStore } from '@/stores/band.store'; import { useBandStore } from '@/stores/band.store';
import { useAccountStore } from '@/stores/account.store'; import { useAccountStore } from '@/stores/account.store';
import { useLocationStore } from '@/stores/location.store'; import { useLocationStore } from '@/stores/location.store';
import { ref } from 'vue';
import { useExerciseStore } from '@/stores/exercise.store'; import { useExerciseStore } from '@/stores/exercise.store';
import { useGenreStore } from '@/stores/genre.store'; import { useGenreStore } from '@/stores/genre.store';
import { usePreferencesStore } from '@/stores/preferences.store'; import { usePreferencesStore } from '@/stores/preferences.store';
@@ -45,6 +44,7 @@ concertStore.getConcerts()
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/bands')" @click="router.push('/admin/bands')"
:loading="bandStore.fetchInProgress"
> >
{{ $t('misc.actions.more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
@@ -74,6 +74,7 @@ concertStore.getConcerts()
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/concerts')" @click="router.push('/admin/concerts')"
:loading="concertStore.fetchInProgress"
> >
{{ $t('misc.actions.more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
@@ -106,6 +107,7 @@ concertStore.getConcerts()
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/locations')" @click="router.push('/admin/locations')"
:loading="locationStore.fetchInProgress"
> >
{{ $t('misc.actions.more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
@@ -115,7 +117,6 @@ concertStore.getConcerts()
</v-row> </v-row>
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
@@ -129,6 +130,7 @@ concertStore.getConcerts()
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/accounts')" @click="router.push('/admin/accounts')"
:loading="accountStore.fetchInProgress"
> >
{{ $t('misc.actions.more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
@@ -145,9 +147,16 @@ concertStore.getConcerts()
{{ genreStore.genres.length }} {{ $t('band.genre', 2) }} {{ genreStore.genres.length }} {{ $t('band.genre', 2) }}
</div> </div>
<div class="text-h6 text-center text-disabled">
{{ genreStore.genres.reduce((counter, obj) => {
return obj.bands.length == 0 ? counter += 1 : counter
}, 0) }} {{ $t('genre.withoutBand') }}
</div>
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/genres')" @click="router.push('/admin/genres')"
:loading="genreStore.fetchInProgress"
> >
{{ $t('misc.actions.more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>
@@ -173,6 +182,7 @@ concertStore.getConcerts()
<template #actions> <template #actions>
<outlined-button <outlined-button
@click="router.push('/admin/files')" @click="router.push('/admin/files')"
:loading="preferencesStore.fetchInProgress"
> >
{{ $t('misc.actions.more') }} {{ $t('misc.actions.more') }}
</outlined-button> </outlined-button>

View File

@@ -7,6 +7,7 @@ import { BannerStateEnum } from "@/data/enums/bannerStateEnum";
export const useExerciseStore = defineStore("exerciseStore", { export const useExerciseStore = defineStore("exerciseStore", {
state: () => ({ state: () => ({
/** All exercise groups with sub-exercises */
exerciseGroups: ref<Array<ExerciseGroupApiModel>>([]), exerciseGroups: ref<Array<ExerciseGroupApiModel>>([]),
/** Request to server sent, waiting for data response */ /** Request to server sent, waiting for data response */
@@ -14,68 +15,83 @@ export const useExerciseStore = defineStore("exerciseStore", {
}), }),
actions: { actions: {
getAllExercises() { /**
* Get all exercises and exercise groups from server
*/
async getAllExercises() {
this.fetchInProgress = true this.fetchInProgress = true
fetchAllExerciseGroups() await fetchAllExerciseGroups()
.then(result => { .then(result => {
this.exerciseGroups = result.data this.exerciseGroups = result.data
this.fetchInProgress = false this.fetchInProgress = false
}) })
}, },
solveExercise(exerciseGroupNr: number, exerciseNr: number) { /**
* Mark an exercise as solved
*
* @param exerciseGroupNr Exercise group number (0-3)
* @param exerciseNr Exercise number (1-3)
*/
async solveExercise(exerciseGroupNr: number, exerciseNr: number) {
// Request all exercises from server
await this.getAllExercises()
const feedbackStore = useFeedbackStore() const feedbackStore = useFeedbackStore()
this.fetchInProgress = true this.fetchInProgress = true
updateExercise(exerciseGroupNr, exerciseNr, true) // Change only if the exercise is not solved
.then(result => { if(!this.exerciseGroups[exerciseGroupNr].exercises[exerciseNr - 1].solved) {
let bannerState = BannerStateEnum.ERROR updateExercise(exerciseGroupNr, exerciseNr, true)
.then(result => {
let bannerState = BannerStateEnum.ERROR
switch(exerciseGroupNr) { switch(exerciseGroupNr) {
case 0: { case 0: {
switch(exerciseNr) { switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED01; break; case 1: bannerState = BannerStateEnum.EXERCISESOLVED01; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED02; break; case 2: bannerState = BannerStateEnum.EXERCISESOLVED02; break;
}
break;
} }
break; case 1: {
} switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED11; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED12; break;
case 3: bannerState = BannerStateEnum.EXERCISESOLVED13; break;
}
case 1: { break;
switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED11; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED12; break;
case 3: bannerState = BannerStateEnum.EXERCISESOLVED13; break;
} }
break; case 2: {
} switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED21; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED22; break;
case 3: bannerState = BannerStateEnum.EXERCISESOLVED23; break;
}
case 2: { break;
switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED21; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED22; break;
case 3: bannerState = BannerStateEnum.EXERCISESOLVED23; break;
} }
break; case 3: {
} switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED31; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED32; break;
case 3: bannerState = BannerStateEnum.EXERCISESOLVED33; break;
}
case 3: { break;
switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED31; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED32; break;
case 3: bannerState = BannerStateEnum.EXERCISESOLVED33; break;
} }
break;
} }
}
feedbackStore.changeBanner(bannerState) feedbackStore.changeBanner(bannerState)
this.getAllExercises() this.getAllExercises()
}) })
}
} }
} }
}) })

View File

@@ -9,10 +9,19 @@ import { Composer } from 'vue-i18n';
*/ */
export const useFeedbackStore = defineStore("feedbackStore", { export const useFeedbackStore = defineStore("feedbackStore", {
state: () => ({ state: () => ({
/** Show notification banner in top right corner */
showBanner: ref(false), showBanner: ref(false),
/** Text in the notification banner */
title: ref(""), title: ref(""),
/** Color of the notification banner */
color: ref(""), color: ref(""),
/** Prepend icon of the notification banner */
icon: ref(""), icon: ref(""),
/** Programmatically access to language translation module */
$i18n: {}, $i18n: {},
/** Band, Location or concert on URL does not exist, redirect to 404 page */ /** Band, Location or concert on URL does not exist, redirect to 404 page */
@@ -26,6 +35,11 @@ export const useFeedbackStore = defineStore("feedbackStore", {
}, },
actions: { actions: {
/**
* Change the state of the banner, displays it immediately
*
* @param bannerState New banner state
*/
changeBanner(bannerState: BannerStateEnum) { changeBanner(bannerState: BannerStateEnum) {
// Banner message // Banner message
switch (bannerState) { switch (bannerState) {
@@ -153,6 +167,25 @@ export const useFeedbackStore = defineStore("feedbackStore", {
case BannerStateEnum.BANDSAVEDSUCCESSFUL: { case BannerStateEnum.BANDSAVEDSUCCESSFUL: {
this.title = this.i18n.t('bannerMessages.bandSavedSuccessful'); break; this.title = this.i18n.t('bannerMessages.bandSavedSuccessful'); break;
} }
////////// API Endpoint /genres //////////
case BannerStateEnum.GENREDELETEERROR: {
this.title = this.i18n.t('bannerMessages.genreDeleteError'); break;
}
case BannerStateEnum.GENREDELETESUCCESSFUL: {
this.title = this.i18n.t('bannerMessages.genreDeleteSuccessful'); break;
}
case BannerStateEnum.GENRESAVEDERROR: {
this.title = this.i18n.t('bannerMessages.genreSavedError'); break;
}
case BannerStateEnum.GENRESAVEDSUCCESSFUL: {
this.title = this.i18n.t('bannerMessages.genreSavedSuccessful'); break;
}
} }
@@ -166,6 +199,8 @@ export const useFeedbackStore = defineStore("feedbackStore", {
case BannerStateEnum.ACCOUNTREGISTERUSERNAMEINUSE: case BannerStateEnum.ACCOUNTREGISTERUSERNAMEINUSE:
case BannerStateEnum.BANDDELETEERROR: case BannerStateEnum.BANDDELETEERROR:
case BannerStateEnum.BANDSAVEDERROR: case BannerStateEnum.BANDSAVEDERROR:
case BannerStateEnum.GENREDELETEERROR:
case BannerStateEnum.GENRESAVEDERROR:
this.color = "red" this.color = "red"
break; break;
@@ -179,6 +214,8 @@ export const useFeedbackStore = defineStore("feedbackStore", {
case BannerStateEnum.BANDDELETESUCCESSFUL: case BannerStateEnum.BANDDELETESUCCESSFUL:
case BannerStateEnum.BANDSAVEDSUCCESSFUL: case BannerStateEnum.BANDSAVEDSUCCESSFUL:
case BannerStateEnum.EXERCISEPROGRESSRESETSUCCESSFUL: case BannerStateEnum.EXERCISEPROGRESSRESETSUCCESSFUL:
case BannerStateEnum.GENREDELETESUCCESSFUL:
case BannerStateEnum.GENRESAVEDSUCCESSFUL:
this.color = "green" this.color = "green"
break; break;
@@ -231,6 +268,7 @@ export const useFeedbackStore = defineStore("feedbackStore", {
case BannerStateEnum.DATABASERESETSUCCESSFUL: case BannerStateEnum.DATABASERESETSUCCESSFUL:
case BannerStateEnum.EXERCISEPROGRESSRESETSUCCESSFUL:
this.icon = "mdi-database-refresh" this.icon = "mdi-database-refresh"
break; break;
@@ -265,6 +303,13 @@ export const useFeedbackStore = defineStore("feedbackStore", {
case BannerStateEnum.BANDSAVEDSUCCESSFUL: case BannerStateEnum.BANDSAVEDSUCCESSFUL:
this.icon = "mdi-guitar-electric" this.icon = "mdi-guitar-electric"
break; break;
case BannerStateEnum.GENREDELETEERROR:
case BannerStateEnum.GENREDELETESUCCESSFUL:
case BannerStateEnum.GENRESAVEDERROR:
case BannerStateEnum.GENRESAVEDSUCCESSFUL:
this.icon = "mdi-music"
break;
} }
this.showBanner = true this.showBanner = true