- {{ $t('help.scoreBoard.personalSolutionKey') + ':' }}
+ {{ $t("help.scoreBoard.personalSolutionKey") + ":" }}
{{ generateExerciseKey() }}
@@ -86,49 +69,55 @@ function getDescriptionLanguage(exercise: ExerciseModel) {
icon="mdi-checkbox-marked-circle-auto-outline"
>
-
+
-
{{
- (preferencesStore.language == LanguageEnum.GERMAN
- ? exercise.exerciseGroup.nameDe
- : exercise.exerciseGroup.nameEn)
+ preferencesStore.language == LanguageEnum.GERMAN
+ ? exercise.exerciseGroup.nameDe
+ : exercise.exerciseGroup.nameEn
}}
{{
- (preferencesStore.language == LanguageEnum.GERMAN
- ? exercise.exerciseGroup.descriptionDe
- : exercise.exerciseGroup.descriptionEn)
+ preferencesStore.language == LanguageEnum.GERMAN
+ ? exercise.exerciseGroup.descriptionDe
+ : exercise.exerciseGroup.descriptionEn
}}
-
+
- {{ getDescriptionLanguage(exercise) }}
+ {{ getExerciseDescriptionLanguage(exercise) }}
@@ -138,4 +127,4 @@ function getDescriptionLanguage(exercise: ExerciseModel) {
-
\ No newline at end of file
+
diff --git a/src/pages/misc/preferencesPage/exerciseConfig/exerciseDialog.vue b/src/pages/misc/preferencesPage/exerciseConfig/exerciseDialog.vue
new file mode 100644
index 0000000..bb37992
--- /dev/null
+++ b/src/pages/misc/preferencesPage/exerciseConfig/exerciseDialog.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('misc.actions.cancel') }}
+
+
+ {{ $t("misc.actions.save") }}
+
+
+
+
diff --git a/src/pages/misc/preferencesPage/exerciseConfig/exerciseSection.vue b/src/pages/misc/preferencesPage/exerciseConfig/exerciseSection.vue
new file mode 100644
index 0000000..e436c6b
--- /dev/null
+++ b/src/pages/misc/preferencesPage/exerciseConfig/exerciseSection.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("preferences.exercises.edit") }}
+
+
+
+
+
+
diff --git a/src/pages/misc/preferencesPage/importExportSection.vue b/src/pages/misc/preferencesPage/importExportSection.vue
new file mode 100644
index 0000000..733efa8
--- /dev/null
+++ b/src/pages/misc/preferencesPage/importExportSection.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t("preferences.importExport.download") }}
+
+
+
+ {{ $t("preferences.importExport.upload") }}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/misc/preferencesPage/index.vue b/src/pages/misc/preferencesPage/index.vue
index 8827a5e..beafa4e 100644
--- a/src/pages/misc/preferencesPage/index.vue
+++ b/src/pages/misc/preferencesPage/index.vue
@@ -2,16 +2,29 @@
import pageSetup from './pageSetupSection.vue';
import systemSetup from './systemSetupSection.vue';
import aboutSection from './aboutSection.vue';
+import exerciseSection from './exerciseConfig/exerciseSection.vue';
+import importExportSection from './importExportSection.vue';
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/misc/preferencesPage/systemSetupSection.vue b/src/pages/misc/preferencesPage/systemSetupSection.vue
index b0317ca..f876a17 100644
--- a/src/pages/misc/preferencesPage/systemSetupSection.vue
+++ b/src/pages/misc/preferencesPage/systemSetupSection.vue
@@ -1,27 +1,24 @@
-
+
- {{ $t('preferences.serverState') + ':' }}
+ {{ $t("preferences.serverState") + ":" }}
@@ -29,9 +26,12 @@ preferenceStore.getServerState()
@click="preferenceStore.showDeleteDbDialog = true"
prepend-icon="mdi-database-refresh"
color="warning"
- :disabled="preferenceStore.serverState != ServerStateEnum.ONLINE || preferenceStore.fetchInProgress"
+ :disabled="
+ preferenceStore.serverState != ServerStateEnum.ONLINE ||
+ preferenceStore.fetchInProgress
+ "
>
- {{ $t('preferences.resetDatabase.resetDatabase') }}
+ {{ $t("preferences.resetDatabase.resetDatabase") }}
@@ -40,9 +40,12 @@ preferenceStore.getServerState()
@click="preferenceStore.showDeleteExerciseDialog = true"
prepend-icon="mdi-progress-close"
color="warning"
- :disabled="preferenceStore.serverState != ServerStateEnum.ONLINE || preferenceStore.fetchInProgress"
+ :disabled="
+ preferenceStore.serverState != ServerStateEnum.ONLINE ||
+ preferenceStore.fetchInProgress
+ "
>
- {{ $t('preferences.resetExerciseProgress.resetExerciseProgress') }}
+ {{ $t("preferences.resetExerciseProgress.resetExerciseProgress") }}
@@ -51,9 +54,12 @@ preferenceStore.getServerState()
@click="preferenceStore.showFactoryResetDialog = true"
prepend-icon="mdi-factory"
color="warning"
- :disabled="preferenceStore.serverState != ServerStateEnum.ONLINE || preferenceStore.fetchInProgress"
+ :disabled="
+ preferenceStore.serverState != ServerStateEnum.ONLINE ||
+ preferenceStore.fetchInProgress
+ "
>
- {{ $t('preferences.factoryReset.factoryReset') }}
+ {{ $t("preferences.factoryReset.factoryReset") }}
@@ -85,10 +91,12 @@ preferenceStore.getServerState()
:description="$t('preferences.factoryReset.dialog.description')"
v-model="preferenceStore.showFactoryResetDialog"
icon="mdi-factory"
- :onConfirm="() => {
- preferenceStore.resetToFactorySettings()
- router.push('/')
- }"
+ :onConfirm="
+ () => {
+ preferenceStore.resetToFactorySettings();
+ router.push('/');
+ }
+ "
:loading="preferenceStore.fetchInProgress"
/>
-
\ No newline at end of file
+
diff --git a/src/scripts/colorScripts.ts b/src/scripts/colorScripts.ts
index 4278d48..dd5d410 100644
--- a/src/scripts/colorScripts.ts
+++ b/src/scripts/colorScripts.ts
@@ -19,4 +19,20 @@ export function getSeatColor(surcharge: number, state: number): string {
case 1: return "grey"
case 2: return "orange"
}
+}
+
+/**
+ * Get color of exercise group
+ *
+ * @param exerciseGroupNr Number of exercise group
+ *
+ * @returns Color as string
+ */
+export function getExerciseDotColor(exerciseGroupNr: number) {
+ switch(exerciseGroupNr) {
+ case 0: return "purple"
+ case 1: return "orange"
+ case 2: return "blue"
+ case 3: return "pink"
+ }
}
\ No newline at end of file
diff --git a/src/scripts/languageScripts.ts b/src/scripts/languageScripts.ts
new file mode 100644
index 0000000..48a9e01
--- /dev/null
+++ b/src/scripts/languageScripts.ts
@@ -0,0 +1,37 @@
+import { LanguageEnum } from "@/data/enums/languageEnum";
+import { ExerciseGroupModel } from "@/data/models/exercises/exerciseGroupModel";
+import { ExerciseModel } from "@/data/models/exercises/exerciseModel";
+import { usePreferencesStore } from "@/stores/preferences.store";
+
+export function getExerciseNameLanguage(exercise: ExerciseModel) {
+ let preferencesStore = usePreferencesStore()
+
+ switch (preferencesStore.language) {
+ case LanguageEnum.GERMAN:
+ return exercise.nameDe;
+ case LanguageEnum.ENGLISH:
+ return exercise.nameEn;
+ }
+}
+
+export function getExerciseDescriptionLanguage(exercise: ExerciseModel) {
+ let preferencesStore = usePreferencesStore()
+
+ switch (preferencesStore.language) {
+ case LanguageEnum.GERMAN:
+ return exercise.descriptionDe;
+ case LanguageEnum.ENGLISH:
+ return exercise.descriptionEn;
+ }
+}
+
+export function getExerciseGroupNameLanguage(exerciseGroup: ExerciseGroupModel) {
+ let preferencesStore = usePreferencesStore()
+
+ switch (preferencesStore.language) {
+ case LanguageEnum.GERMAN:
+ return exerciseGroup.nameDe;
+ case LanguageEnum.ENGLISH:
+ return exerciseGroup.nameEn;
+ }
+}
\ No newline at end of file
diff --git a/src/stores/exercise.store.ts b/src/stores/exercise.store.ts
index 3e05478..7aaa2cd 100644
--- a/src/stores/exercise.store.ts
+++ b/src/stores/exercise.store.ts
@@ -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>(),
}),
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;
+ }
}
- })
- }
- }
-})
\ No newline at end of file
+
+ feedbackStore.addSnackbar(bannerState);
+ this.getAllExercises();
+ }
+ });
+ },
+ },
+});
diff --git a/src/stores/preferences.store.ts b/src/stores/preferences.store.ts
index d060b39..b22c819 100644
--- a/src/stores/preferences.store.ts
+++ b/src/stores/preferences.store.ts
@@ -3,7 +3,11 @@ import { useLocalStorage } from "@vueuse/core";
import { ThemeEnum } from "../data/enums/themeEnums";
import { LanguageEnum } from "../data/enums/languageEnum";
import { ref } from "vue";
-import { fetchServerState,resetDatabase, resetExerciseProgress } from "@/data/api/mainApi";
+import {
+ fetchServerState,
+ resetDatabase,
+ resetExerciseProgress,
+} from "@/data/api/mainApi";
import { ServerStateEnum } from "@/data/enums/serverStateEnum";
import { BannerStateEnum } from "@/data/enums/bannerStateEnum";
import { useFeedbackStore } from "./feedback.store";
@@ -12,13 +16,19 @@ import { useExerciseStore } from "./exercise.store";
import { useAccountStore } from "./account.store";
import { AccountApiModel } from "@/data/models/user/accountApiModel";
-export const usePreferencesStore = defineStore('preferencesStore', {
+export const usePreferencesStore = defineStore("preferencesStore", {
state: () => ({
/** Selected theme by user */
- theme: useLocalStorage("eventMaster/preferencesStore/theme", ThemeEnum.DARK),
+ theme: useLocalStorage(
+ "eventMaster/preferencesStore/theme",
+ ThemeEnum.DARK
+ ),
/** Selected language by user */
- language: useLocalStorage("eventMaster/preferencesStore/language", LanguageEnum.GERMAN),
+ language: useLocalStorage(
+ "eventMaster/preferencesStore/language",
+ LanguageEnum.GERMAN
+ ),
/** Request to server sent, waiting for data response */
fetchInProgress: ref(false),
@@ -36,13 +46,27 @@ export const usePreferencesStore = defineStore('preferencesStore', {
showFactoryResetDialog: ref(false),
/** Marks the first run of the app */
- firstStartup: useLocalStorage("eventMaster/preferencesStore/firstStartup", true),
+ firstStartup: useLocalStorage(
+ "eventMaster/preferencesStore/firstStartup",
+ true
+ ),
/** Full name of student */
- studentName: useLocalStorage("eventMaster/preferencesStore/studentName", ""),
+ studentName: useLocalStorage(
+ "eventMaster/preferencesStore/studentName",
+ ""
+ ),
/** Matrikel number */
- registrationNumber: useLocalStorage("eventMaster/preferencesStore/registrationNumber", "")
+ registrationNumber: useLocalStorage(
+ "eventMaster/preferencesStore/registrationNumber",
+ ""
+ ),
+
+ notAvailableExercises: useLocalStorage>(
+ "eventMaster/preferencesStore/notAvailableExercises",
+ []
+ ),
}),
actions: {
@@ -50,92 +74,90 @@ export const usePreferencesStore = defineStore('preferencesStore', {
* Request the state of the backend server
*/
async getServerState() {
- this.fetchInProgress = true
+ this.fetchInProgress = true;
fetchServerState()
- .then(result => {
+ .then((result) => {
if (result.status == 200) {
- this.serverState = ServerStateEnum.ONLINE
+ this.serverState = ServerStateEnum.ONLINE;
} else {
- this.serverState = ServerStateEnum.OFFLINE
+ this.serverState = ServerStateEnum.OFFLINE;
}
- this.fetchInProgress = false
- })
- .catch(error => {
- this.serverState = ServerStateEnum.OFFLINE
- this.fetchInProgress = false
+ this.fetchInProgress = false;
})
+ .catch((error) => {
+ this.serverState = ServerStateEnum.OFFLINE;
+ this.fetchInProgress = false;
+ });
},
/**
* Resets the database (without exercise tables)
*/
async resetDb() {
- const feedbackStore = useFeedbackStore()
- const accountStore = useAccountStore()
+ const feedbackStore = useFeedbackStore();
+ const accountStore = useAccountStore();
- this.serverState = ServerStateEnum.PENDING
- this.fetchInProgress = true
+ this.serverState = ServerStateEnum.PENDING;
+ this.fetchInProgress = true;
// Logout user
- accountStore.logout()
+ accountStore.logout();
- await resetDatabase()
- .then(result => {
- if (result.status == 200) {
- feedbackStore.addSnackbar(BannerStateEnum.DATABASERESETSUCCESSFUL)
- this.serverState = ServerStateEnum.ONLINE
- }
+ await resetDatabase().then((result) => {
+ if (result.status == 200) {
+ feedbackStore.addSnackbar(BannerStateEnum.DATABASERESETSUCCESSFUL);
+ this.serverState = ServerStateEnum.ONLINE;
+ }
- this.fetchInProgress = false
- this.showDeleteDbDialog = false
- })
+ this.fetchInProgress = false;
+ this.showDeleteDbDialog = false;
+ });
},
/**
* Resets the exercise progress
*/
async resetExerciseProg() {
- const feedbackStore = useFeedbackStore()
- const exerciseStore = useExerciseStore()
+ const feedbackStore = useFeedbackStore();
+ const exerciseStore = useExerciseStore();
- this.serverState = ServerStateEnum.PENDING
- this.fetchInProgress = true
+ this.serverState = ServerStateEnum.PENDING;
+ this.fetchInProgress = true;
- await resetExerciseProgress()
- .then(result => {
- if (result.status == 200) {
- feedbackStore.addSnackbar(BannerStateEnum.EXERCISEPROGRESSRESETSUCCESSFUL)
- this.serverState = ServerStateEnum.ONLINE
+ await resetExerciseProgress().then((result) => {
+ if (result.status == 200) {
+ feedbackStore.addSnackbar(
+ BannerStateEnum.EXERCISEPROGRESSRESETSUCCESSFUL
+ );
+ this.serverState = ServerStateEnum.ONLINE;
- exerciseStore.getAllExercises()
- }
+ exerciseStore.getAllExercises(true);
+ }
- this.fetchInProgress = false
- this.showDeleteExerciseDialog = false
- })
+ this.fetchInProgress = false;
+ this.showDeleteExerciseDialog = false;
+ });
},
/**
* Reset all store values to factory state
*/
resetToFactorySettings() {
- const basketStore = useBasketStore()
- const accountStore = useAccountStore()
+ const basketStore = useBasketStore();
+ const accountStore = useAccountStore();
- this.firstStartup = true
- this.studentName = ""
- this.registrationNumber = ""
- this.theme = "dark"
- this.language = LanguageEnum.GERMAN
- basketStore.itemsInBasket = []
- accountStore.userAccountToken = ""
- accountStore.userAccount = new AccountApiModel()
+ this.firstStartup = true;
+ this.studentName = "";
+ this.registrationNumber = "";
+ this.theme = "dark";
+ this.language = LanguageEnum.GERMAN;
+ basketStore.itemsInBasket = [];
+ accountStore.userAccountToken = "";
+ accountStore.userAccount = new AccountApiModel();
-
-
- this.showFactoryResetDialog = false
- }
- }
-})
\ No newline at end of file
+ this.showFactoryResetDialog = false;
+ },
+ },
+});