Exercises selection system

This commit is contained in:
2025-08-30 12:54:29 +02:00
parent b69c63ea53
commit 3c13bb88e1
16 changed files with 573 additions and 216 deletions

View File

@@ -4,6 +4,7 @@ import { ref } from "vue";
import { useFeedbackStore } from "./feedback.store";
import { BannerStateEnum } from "@/data/enums/bannerStateEnum";
import { ExerciseModel } from "@/data/models/exercises/exerciseModel";
import { usePreferencesStore } from "./preferences.store";
export const useExerciseStore = defineStore("exerciseStore", {
state: () => ({
@@ -13,106 +14,155 @@ export const useExerciseStore = defineStore("exerciseStore", {
/** Request to server sent, waiting for data response */
fetchInProgress: ref(false),
helpPageVisible: ref(false)
exercisePageVisible: ref(false),
/** All available exercise uuids are stored here */
exerciseConfig: ref<Array<string>>(),
}),
actions: {
/**
* Get all exercises and exercise groups from server
*
* @param firstLoad True sets all exercises as available, for first load after database was initialised
*/
async getAllExercises() {
this.fetchInProgress = true
async getAllExercises(firstLoad: boolean = false) {
const preferencesStore = usePreferencesStore();
this.fetchInProgress = true;
await fetchAllExerciseGroups()
.then(result => {
this.exercises = result.data
await fetchAllExerciseGroups().then((result) => {
this.exercises = result.data;
this.helpPageVisible = this.getExercise(1, 1).solved
this.fetchInProgress = false
})
if (firstLoad) {
preferencesStore.notAvailableExercises = []
}
result.data.forEach((exercise) => {
if (firstLoad) {
exercise.available = true
} else {
exercise.available =
preferencesStore.notAvailableExercises.find(
(availableExercise: string) => {
return availableExercise == exercise.uuid;
}
) == undefined;
}
});
this.helpPageVisible = this.getExercise(1, 1).solved;
this.fetchInProgress = false;
});
},
/**
* Get a exercise by group and exercise number
*
*
* @param exerciseGroupNr Number of group of exercise
* @param exerciseNr Number of exercise in group
*
*
* @returns ExerciseModel
*/
getExercise(exerciseGroupNr: number, exerciseNr: number): ExerciseModel {
return this.exercises.find((exercise: ExerciseModel) => {
return exercise.exerciseNr == exerciseNr && exercise.exerciseGroup.groupNr == exerciseGroupNr
})
return (
exercise.exerciseNr == exerciseNr &&
exercise.exerciseGroup.groupNr == exerciseGroupNr
);
});
},
/**
* 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()
await this.getAllExercises();
const feedbackStore = useFeedbackStore()
this.fetchInProgress = true
const feedbackStore = useFeedbackStore();
this.fetchInProgress = true;
// Change only if the exercise is not solved
updateExercise(exerciseGroupNr, exerciseNr, true)
.then(result => {
if (result.data.changed) {
updateExercise(exerciseGroupNr, exerciseNr, true).then((result) => {
if (result.data.changed) {
let bannerState = BannerStateEnum.ERROR;
let bannerState = BannerStateEnum.ERROR
switch(exerciseGroupNr) {
case 0: {
switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED01; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED02; break;
case 3: bannerState = BannerStateEnum.EXERCISESOLVED03; break;
}
break;
switch (exerciseGroupNr) {
case 0: {
switch (exerciseNr) {
case 1:
bannerState = BannerStateEnum.EXERCISESOLVED01;
break;
case 2:
bannerState = BannerStateEnum.EXERCISESOLVED02;
break;
case 3:
bannerState = BannerStateEnum.EXERCISESOLVED03;
break;
}
case 1: {
switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED11; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED12; 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 4: bannerState = BannerStateEnum.EXERCISESOLVED24; break;
case 5: bannerState = BannerStateEnum.EXERCISESOLVED25; break;
case 6: bannerState = BannerStateEnum.EXERCISESOLVED26; break;
}
break;
}
case 3: {
switch(exerciseNr) {
case 1: bannerState = BannerStateEnum.EXERCISESOLVED31; break;
case 2: bannerState = BannerStateEnum.EXERCISESOLVED32; break;
}
break;
}
break;
}
feedbackStore.addSnackbar(bannerState)
this.getAllExercises()
case 1: {
switch (exerciseNr) {
case 1:
bannerState = BannerStateEnum.EXERCISESOLVED11;
break;
case 2:
bannerState = BannerStateEnum.EXERCISESOLVED12;
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 4:
bannerState = BannerStateEnum.EXERCISESOLVED24;
break;
case 5:
bannerState = BannerStateEnum.EXERCISESOLVED25;
break;
case 6:
bannerState = BannerStateEnum.EXERCISESOLVED26;
break;
}
break;
}
case 3: {
switch (exerciseNr) {
case 1:
bannerState = BannerStateEnum.EXERCISESOLVED31;
break;
case 2:
bannerState = BannerStateEnum.EXERCISESOLVED32;
break;
}
break;
}
}
})
}
}
})
feedbackStore.addSnackbar(bannerState);
this.getAllExercises();
}
});
},
},
});