diff --git a/software/backend/scripts/databaseHelper.ts b/software/backend/scripts/databaseHelper.ts index 25a6379..f574c57 100644 --- a/software/backend/scripts/databaseHelper.ts +++ b/software/backend/scripts/databaseHelper.ts @@ -90,12 +90,12 @@ export async function prepopulateDatabase() { { await City.create(city) .then(async cityDataset => { - for (let location of city.locations) + for (let { ...location } of city.locations) { location["cityId"] = cityDataset.id location["urlName"] = location.name.replaceAll(" ", "-").toLowerCase() - location["imageIndoor"] = "http://localhost:3000/static/" + location["imageIndoor"] - location["imageOutdoor"] = "http://localhost:3000/static/" + location["imageOutdoor"] + location.imageIndoor = "http://localhost:3000/static/" + location["imageIndoor"] + location.imageOutdoor = "http://localhost:3000/static/" + location["imageOutdoor"] await Location.create(location) .then(async locationDataset => { @@ -240,7 +240,7 @@ export async function prepopulateDatabase() { let concerts = [] let ratings = [] - for(let band of bandsConcerts.bands) { + for(let { ...band } of bandsConcerts.bands) { band.imageMembers = "http://localhost:3000/static/" + band.imageMembers band.images = band.images.map(image => "http://localhost:3000/static/" + image) band.logo = "http://localhost:3000/static/" + band.logo @@ -282,11 +282,9 @@ export async function prepopulateDatabase() { } for (let member of band.members) { - member.image = "http://localhost:3000/static/" + member.image - bandMembers.push({ name: member.name, - image: member.image, + image: "http://localhost:3000/static/" + member.image, bandId: dataset.dataValues.id }) } diff --git a/software/src/App.vue b/software/src/App.vue index aa1e54e..9bb00f2 100644 --- a/software/src/App.vue +++ b/software/src/App.vue @@ -9,8 +9,6 @@ import { useFeedbackStore } from './stores/feedback.store'; import companyFooter from './components/navigation/companyFooter.vue'; import urlBar from './components/navigation/urlBar.vue'; import { useRouter } from 'vue-router'; -import actionDialog from './components/basics/actionDialog.vue'; -import CircularProgressIndeterminate from './components/basics/circularProgressIndeterminate.vue'; const preferencesStore = usePreferencesStore() const feedbackStore = useFeedbackStore() @@ -19,18 +17,18 @@ const router = useRouter() theme.global.name.value = preferencesStore.theme - -// First startup -if (preferencesStore.firstStartup) { - preferencesStore.firstStartupRoutine() -} - - // Global watcher +// Watch for language change watch(() => preferencesStore.language, () => { i18n.global.locale = preferencesStore.language }, { immediate: true }) +// Watch for theme change +watch(() => preferencesStore.theme, () => { + theme.global.name.value = preferencesStore.theme +}) + +// Watch for 404 page directions watch(() => feedbackStore.notFound, () => { if (feedbackStore.notFound) { feedbackStore.notFound = false @@ -92,23 +90,4 @@ watch(() => feedbackStore.notFound, () => { - - - - - {{ $t('misc.firstStartup.description') }} - - - - - - - - - \ No newline at end of file diff --git a/software/src/components/basics/actionDialog.vue b/software/src/components/basics/actionDialog.vue index b483a71..6ff8171 100644 --- a/software/src/components/basics/actionDialog.vue +++ b/software/src/components/basics/actionDialog.vue @@ -23,9 +23,11 @@ defineProps({ :icon="icon" :tonal="false" > - + + + - + diff --git a/software/src/components/pageParts/serverStateText.vue b/software/src/components/pageParts/serverStateText.vue new file mode 100644 index 0000000..983ae0a --- /dev/null +++ b/software/src/components/pageParts/serverStateText.vue @@ -0,0 +1,32 @@ + + + + + + Pending... + + + + + Online + + + + + Offline + + \ No newline at end of file diff --git a/software/src/data/enums/themeEnums.ts b/software/src/data/enums/themeEnums.ts index d1dd0a8..aadbc29 100644 --- a/software/src/data/enums/themeEnums.ts +++ b/software/src/data/enums/themeEnums.ts @@ -1,5 +1,4 @@ export enum ThemeEnum { - DARKBLUE = "dark", - LIGHTBLUE = "light", - + DARK = "dark", + LIGHT = "light", } \ No newline at end of file diff --git a/software/src/locales/de.json b/software/src/locales/de.json index cc3c2a7..77bdec7 100644 --- a/software/src/locales/de.json +++ b/software/src/locales/de.json @@ -148,7 +148,15 @@ "description": "Soll der Bearbeitungsfortschritt der Übungen wirklich zurückgesetzt werden? Dies kann nicht rückgänig gemacht werden!" } }, - "aboutProject": "Über das Projekt" + "aboutProject": "Über das Projekt", + "resetFirstStartup": "Einrichtungsassistenten starten", + "factoryReset": { + "factoryReset": "Zurücksetzen auf Werkseinstellungen", + "dialog": { + "title": "Aus Werkseinstellungen zurücksetzen?", + "description": "Sollen alle Einstellungen und Daten auf Werkseinstellungen zurückgesetzt werden? Alle Änderungen und Fortschritte gehen verloren!" + } + } }, "help": { "scoreBoard": { @@ -201,7 +209,8 @@ "filtering": "Filtern", "cancel": "Abbrechen", "more": "Mehr", - "confirm": "Bestätigen" + "confirm": "Bestätigen", + "next": "Weiter" }, "validation": { "required": "Darf nicht leer bleiben", @@ -216,8 +225,19 @@ "uploadFile": "Datei hochladen", "firstStartup": { "title": "Ersteinrichtung", - "description": "Die Datenbank wird eingerichtet. Dies kann 1-2 Minuten dauern. Bitte warten..." - } + "description": "Die Datenbank wird eingerichtet. Bitte warten...", + "createDatabase": "Erstelle Datenbank...", + "complete": "Fertig", + "finished": "Abgeschlossen", + "createExercises": "Erstelle Aufgaben...", + "connectToServer": "Server", + "database": "Datenbank", + "exercises": "Aufgaben", + "userData": "Persönliche Daten" + }, + "user": "Angaben zur Person", + "registrationNumber": "Matrikelnummer", + "yourFullName": "Vollständiger Name" }, "genre": { "withoutBand": "ohne Band" diff --git a/software/src/locales/en.json b/software/src/locales/en.json index 16f60bf..fc77c2e 100644 --- a/software/src/locales/en.json +++ b/software/src/locales/en.json @@ -148,7 +148,15 @@ "description": "Do you really want to reset the exercise progress? This is permanent!" } }, - "aboutProject": "About the project" + "aboutProject": "About the project", + "resetFirstStartup": "Start first startup dialog", + "factoryReset": { + "factoryReset": "Factory reset", + "dialog": { + "title": "Factory reset?", + "description": "Do you really want to reset everything? Every change will be lost!" + } + } }, "help": { "scoreBoard": { @@ -201,7 +209,8 @@ "filtering": "Filter", "cancel": "Cancel", "more": "More", - "confirm": "Confirm" + "confirm": "Confirm", + "next": "Next" }, "validation": { "required": "Must not remain empty", @@ -216,8 +225,19 @@ "uploadFile": "Upload file", "firstStartup": { "title": "First startup", - "description": "Creating database. This could take 1-2 minutes. Please wait..." - } + "description": "Creating database. Please wait...", + "createDatabase": "Create Database...", + "complete": "Complete", + "createExercises": "Create Exercises...", + "finished": "Finished", + "connectToServer": "Server", + "database": "Database", + "exercises": "Exercises", + "userData": "User data" + }, + "user": "About person", + "registrationNumber": "Matrikel number", + "yourFullName": "Full name" }, "genre": { "withoutBand": "without Band" diff --git a/software/src/pages/homePage/bandsSection.vue b/software/src/pages/misc/homePage/bandsSection.vue similarity index 100% rename from software/src/pages/homePage/bandsSection.vue rename to software/src/pages/misc/homePage/bandsSection.vue diff --git a/software/src/pages/homePage/index.vue b/software/src/pages/misc/homePage/index.vue similarity index 60% rename from software/src/pages/homePage/index.vue rename to software/src/pages/misc/homePage/index.vue index 1b51457..fad5e65 100644 --- a/software/src/pages/homePage/index.vue +++ b/software/src/pages/misc/homePage/index.vue @@ -4,20 +4,30 @@ import { useLocationStore } from '@/stores/location.store'; import bandSection from './bandsSection.vue'; import UpcomingConcertsSection from './upcomingConcertsSection.vue'; import TopLocationsSection from './topLocationsSection.vue'; +import { usePreferencesStore } from '@/stores/preferences.store'; +import welcomeDialog from './welcomeDialog.vue'; +import { ref } from 'vue'; const concertStore = useConcertStore() const locationStore = useLocationStore() +const preferencesStore = usePreferencesStore() +const showWelcomeDialog = ref(false) concertStore.getUpcomingConcerts() locationStore.getTopLocations() + +// First startup +if (preferencesStore.firstStartup) { + showWelcomeDialog.value = true +} - + - + @@ -30,4 +40,6 @@ locationStore.getTopLocations() + + \ No newline at end of file diff --git a/software/src/pages/homePage/topLocationsSection.vue b/software/src/pages/misc/homePage/topLocationsSection.vue similarity index 100% rename from software/src/pages/homePage/topLocationsSection.vue rename to software/src/pages/misc/homePage/topLocationsSection.vue diff --git a/software/src/pages/homePage/upcomingConcertsSection.vue b/software/src/pages/misc/homePage/upcomingConcertsSection.vue similarity index 100% rename from software/src/pages/homePage/upcomingConcertsSection.vue rename to software/src/pages/misc/homePage/upcomingConcertsSection.vue diff --git a/software/src/pages/misc/homePage/welcomeDialog.vue b/software/src/pages/misc/homePage/welcomeDialog.vue new file mode 100644 index 0000000..857b56b --- /dev/null +++ b/software/src/pages/misc/homePage/welcomeDialog.vue @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + {{ $t('preferences.serverState') }}: + + + + + + + + + {{ $t('misc.firstStartup.createDatabase') }} + + + + + + + {{ $t('misc.firstStartup.finished') }} + + + + + + + + {{ $t('misc.firstStartup.createExercises') }} + + + + + + + {{ $t('misc.firstStartup.finished') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ $t('misc.actions.next') }} + + + + {{ $t('misc.firstStartup.complete') }} + + + + + + + + \ No newline at end of file diff --git a/software/src/pages/misc/preferencesPage/index.vue b/software/src/pages/misc/preferencesPage/index.vue index 7685011..fcadc34 100644 --- a/software/src/pages/misc/preferencesPage/index.vue +++ b/software/src/pages/misc/preferencesPage/index.vue @@ -1,7 +1,8 @@ @@ -12,6 +13,12 @@ import aboutSection from './aboutSection.vue'; + + + + + + diff --git a/software/src/pages/misc/preferencesPage/pageSetup.vue b/software/src/pages/misc/preferencesPage/pageSetupSection.vue similarity index 72% rename from software/src/pages/misc/preferencesPage/pageSetup.vue rename to software/src/pages/misc/preferencesPage/pageSetupSection.vue index 123c8b8..22bb80b 100644 --- a/software/src/pages/misc/preferencesPage/pageSetup.vue +++ b/software/src/pages/misc/preferencesPage/pageSetupSection.vue @@ -1,21 +1,10 @@ @@ -29,7 +18,6 @@ function changeLanguage() { v-model="preferencesStore.theme" :items="themeEnums" :label="$t('preferences.selectedTheme')" - @update:model-value="changeTheme" variant="outlined" hide-details /> @@ -42,7 +30,6 @@ function changeLanguage() { v-model="preferencesStore.language" :items="$i18n.availableLocales" :label="$t('preferences.language')" - @update:model-value="changeLanguage" variant="outlined" hide-details /> diff --git a/software/src/pages/misc/preferencesPage/systemSetup.vue b/software/src/pages/misc/preferencesPage/systemSetup.vue deleted file mode 100644 index c518678..0000000 --- a/software/src/pages/misc/preferencesPage/systemSetup.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - {{ $t('preferences.serverState') }}: - - - Online - - - - - Offline - - - - - Pending... - - - - - - - - - - {{ $t('preferences.resetDatabase.resetDatabase') }} - - - - - - - - {{ $t('preferences.resetExerciseProgress.resetExerciseProgress') }} - - - - - - - - - - - \ No newline at end of file diff --git a/software/src/pages/misc/preferencesPage/systemSetupSection.vue b/software/src/pages/misc/preferencesPage/systemSetupSection.vue new file mode 100644 index 0000000..57b9ff3 --- /dev/null +++ b/software/src/pages/misc/preferencesPage/systemSetupSection.vue @@ -0,0 +1,91 @@ + + + + + + + + {{ $t('preferences.serverState') }}: + + + + + {{ $t('preferences.resetDatabase.resetDatabase') }} + + + + + + {{ $t('preferences.resetExerciseProgress.resetExerciseProgress') }} + + + + + + {{ $t('preferences.factoryReset.factoryReset') }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/software/src/pages/misc/preferencesPage/userSection.vue b/software/src/pages/misc/preferencesPage/userSection.vue new file mode 100644 index 0000000..e0692c4 --- /dev/null +++ b/software/src/pages/misc/preferencesPage/userSection.vue @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/software/src/router/routes.ts b/software/src/router/routes.ts index 82a215e..9ba53f7 100644 --- a/software/src/router/routes.ts +++ b/software/src/router/routes.ts @@ -1,5 +1,5 @@ import BasketPage from "@/pages/misc/basketPage/index.vue" -import HomePage from "@/pages/homePage/index.vue" +import HomePage from "@/pages/misc/homePage/index.vue" import { adminRoutes } from "./admin.routes"; import BandsPage from "@/pages/bands/bandsPage/index.vue" import BandDetailPage from "@/pages/bands/bandDetailPage/index.vue" diff --git a/software/src/stores/preferences.store.ts b/software/src/stores/preferences.store.ts index 14383b0..bb1b0e4 100644 --- a/software/src/stores/preferences.store.ts +++ b/software/src/stores/preferences.store.ts @@ -7,11 +7,12 @@ import { fetchFileNames, fetchServerState, resetDatabase, resetExerciseProgress import { ServerStateEnum } from "@/data/enums/serverStateEnum"; import { BannerStateEnum } from "@/data/enums/bannerStateEnum"; import { useFeedbackStore } from "./feedback.store"; +import { useBasketStore } from "./basket.store"; export const usePreferencesStore = defineStore('preferencesStore', { state: () => ({ /** Selected theme by user */ - theme: useLocalStorage("hackmycart/preferencesStore/theme", ThemeEnum.DARKBLUE), + theme: useLocalStorage("hackmycart/preferencesStore/theme", ThemeEnum.DARK), /** Selected language by user */ language: useLocalStorage("hackmycart/preferencesStore/language", LanguageEnum.GERMAN), @@ -28,11 +29,20 @@ export const usePreferencesStore = defineStore('preferencesStore', { /** Show the "Delete Exercise progress?" confirm dialog */ showDeleteExerciseDialog: ref(false), + /** Show the "Factory reset" confirm dialog */ + showFactoryResetDialog: ref(false), + /** List of files on the server */ staticFiles: ref([]), /** Marks the first run of the app */ - firstStartup: useLocalStorage("hackmycart/preferencesStore/firstStartup", true) + firstStartup: useLocalStorage("hackmycart/preferencesStore/firstStartup", true), + + /** Full name of student */ + studentName: useLocalStorage("hackmycart/preferencesStore/studentName", ""), + + /** Matrikel number */ + registrationNumber: useLocalStorage("hackmycart/preferencesStore/registrationNumber", "") }), actions: { @@ -108,11 +118,17 @@ export const usePreferencesStore = defineStore('preferencesStore', { }) }, - async firstStartupRoutine() { - await this.resetDb() - await this.resetExerciseProg() + resetToFactorySettings() { + const basketStore = useBasketStore() - this.firstStartup = false + this.firstStartup = true + this.studentName = "" + this.registrationNumber = "" + this.theme = "dark" + this.language = LanguageEnum.GERMAN + basketStore.itemsInBasket = [] + + this.showFactoryResetDialog = false } } }) \ No newline at end of file