Bugfix order process/account update

This commit is contained in:
2024-11-15 11:36:17 +01:00
parent c61a628ed4
commit d92533ab6a
9 changed files with 194 additions and 206 deletions

View File

@@ -154,7 +154,8 @@ account.patch("/", verifyToken, (req: Request, res: Response) => {
} }
// Status: 200 OK // Status: 200 OK
res.status(200).json(account) let accountData = await Account.findByPk(req.body.id, { include: [ Payment, AccountRole, Address ]})
res.status(200).json(accountData)
}) })
.catch(error => { .catch(error => {
// Status: 400 Bad request // Status: 400 Bad request

View File

@@ -33,8 +33,7 @@ exerciseStore.getAllExercises()
</div> </div>
<v-btn <v-btn
v-if="accountStore.userAccountToken != '' && v-if="accountStore.adminPanelVisible"
accountStore.userAccount.accountRole.privilegeAdminPanel"
variant="plain" variant="plain"
icon="mdi-table-cog" icon="mdi-table-cog"
to="/admin" to="/admin"

View File

@@ -25,6 +25,13 @@ export async function createOrder(
} }
} }
console.log({
accountId: accountId,
tickets: tickets,
paymentId: paymentId,
addressId: addressId
})
return axios.post(BASE_URL, { return axios.post(BASE_URL, {
accountId: accountId, accountId: accountId,
tickets: tickets, tickets: tickets,

View File

@@ -6,5 +6,5 @@ import { PaymentModel } from "./paymentModel"
export class AccountApiModel extends AccountModel { export class AccountApiModel extends AccountModel {
addresses: Array<AddressModel> addresses: Array<AddressModel>
payments: Array<PaymentModel> payments: Array<PaymentModel>
accountRole: AccountRole accountRole: AccountRole = new AccountRole()
} }

View File

@@ -4,6 +4,8 @@ import { useBasketStore } from '@/stores/basket.store';
import outlinedButton from '@/components/basics/outlinedButton.vue'; import outlinedButton from '@/components/basics/outlinedButton.vue';
import { ModelRef, ref } from 'vue'; import { ModelRef, ref } from 'vue';
import { useAccountStore } from '@/stores/account.store'; import { useAccountStore } from '@/stores/account.store';
import { AddressModel } from '@/data/models/user/addressModel';
import { PaymentModel } from '@/data/models/user/paymentModel';
const basketStore = useBasketStore() const basketStore = useBasketStore()
const accountStore = useAccountStore() const accountStore = useAccountStore()
@@ -32,6 +34,20 @@ async function doOrder() {
orderingInProgress.value = false orderingInProgress.value = false
} }
function addressItemProps(item: AddressModel) {
return {
title: item.street + " " + item.houseNumber,
subtitle: item.postalCode + " " + item.city
}
}
function paymentItemProps(item: PaymentModel) {
return {
title: item.bankName,
subtitle: item.iban
}
}
</script> </script>
<template> <template>
@@ -42,64 +58,33 @@ async function doOrder() {
max-width="800" max-width="800"
persistent persistent
> >
<v-radio-group class="pa-0" v-model="basketStore.usedAddress"> <v-container>
<v-list-subheader> <v-row>
{{ $t('account.userData.address', accountStore.userAccount.addresses.length) }} <v-col>
</v-list-subheader> <v-select
v-model="basketStore.usedAddress"
<v-list-item :items="accountStore.userAccount.addresses"
v-for="address in accountStore.userAccount.addresses" :item-props="addressItemProps"
> :label="$t('account.userData.address')"
variant="outlined"
<v-list-item-title> hide-details
<v-radio :label="address.street + '' + address.houseNumber" />
</v-list-item-title>
<v-list-item-subtitle>
{{ address.postalCode }} {{ address.city }}
</v-list-item-subtitle>
<!-- <v-radio-group
v-model="basketStore.usedAddress"
:error="addressError"
>
<v-radio
v-for="address in accountStore.userAccount.addresses"
:value="address"
:label="address.street + ' ' + address.houseNumber + ', ' + address.postalCode + ' ' + address.city"
/> />
</v-radio-group> --> </v-col>
</v-list-item> </v-row>
</v-radio-group>
<v-list> <v-row>
<v-list-subheader> <v-col>
{{ $t('account.userData.payment', accountStore.userAccount.payments.length) }} <v-select
</v-list-subheader> v-model="basketStore.usedPayment"
:items="accountStore.userAccount.payments"
<v-list-item v-for="payment in accountStore.userAccount.payments"> :item-props="paymentItemProps"
<template #prepend="{ isActive }"> :label="$t('account.userData.payment')"
<v-list-item-action start> variant="outlined"
<v-radio :model-value="isActive" /> hide-details
</v-list-item-action>
</template>
<v-list-item-title>{{ payment.bankName }}</v-list-item-title>
<v-list-item-subtitle>{{ payment.iban }}</v-list-item-subtitle>
<!-- <v-radio-group
v-model="basketStore.usedPayment"
>
<v-radio
:value="payment"
:label="payment.bankName + ': ' + payment.iban"
:error="paymentError"
/> />
</v-radio-group> --> </v-col>
</v-list-item> </v-row>
</v-list> </v-container>
<template #actions> <template #actions>
<outlined-button <outlined-button

View File

@@ -49,137 +49,135 @@ watch(() => currentStep.value, () => {
max-width="800" max-width="800"
persistent persistent
> >
<template #borderless> <v-stepper
<v-stepper v-model="currentStep"
v-model="currentStep" alt-labels
alt-labels flat
flat >
> <template #default="{ prev, next }">
<template #default="{ prev, next}"> <!-- Header items -->
<!-- Header items --> <v-stepper-header>
<v-stepper-header> <template v-for="(step, n) in steps">
<template v-for="(step, n) in steps"> <v-stepper-item
<v-stepper-item :complete="currentStep > n + 1"
:complete="currentStep > n + 1" :title="step"
:title="step" :value="n + 1"
:value="n + 1" complete-icon="mdi-check"
complete-icon="mdi-check" color="green"
color="green" />
/>
<v-divider v-if="n < steps.length - 1" /> <v-divider v-if="n < steps.length - 1" />
</template> </template>
</v-stepper-header> </v-stepper-header>
<!-- Content --> <!-- Content -->
<v-stepper-window> <v-stepper-window>
<v-stepper-window-item <v-stepper-window-item
:value="1" :value="1"
class="text-h4 text-center" class="text-h4 text-center"
>
<div>
{{ $t('preferences.serverState') }}:
</div>
<server-state-text />
</v-stepper-window-item>
<v-stepper-window-item
:value="2"
>
<div v-if="preferencesStore.fetchInProgress" class="text-center text-h4 pb-4">
<div class="pb-4">
{{ $t('misc.firstStartup.createDatabase') }}
</div>
<v-progress-linear indeterminate />
</div>
<div v-else class="text-center text-h4 pb-4 text-green">
<v-icon icon="mdi-check" /> {{ $t('misc.firstStartup.finished') }}
</div>
</v-stepper-window-item>
<v-stepper-window-item
:value="3"
>
<div v-if="preferencesStore.fetchInProgress" class="text-center text-h4 pb-4">
<div class="pb-4">
{{ $t('misc.firstStartup.createExercises') }}
</div>
<v-progress-linear indeterminate />
</div>
<div v-else class="text-center text-h4 pb-4 text-green">
<v-icon icon="mdi-check" /> {{ $t('misc.firstStartup.finished') }}
</div>
</v-stepper-window-item>
<v-stepper-window-item
:value="4"
>
<v-container class="px-0 py-2">
<v-row>
<v-col>
<v-text-field
variant="outlined"
hide-details
:label="$t('misc.yourFullName')"
v-model="preferencesStore.studentName"
/>
</v-col>
</v-row>
<v-row>
<v-col>
<v-text-field
variant="outlined"
hide-details
:label="$t('misc.registrationNumber')"
v-model="preferencesStore.registrationNumber"
/>
</v-col>
</v-row>
</v-container>
</v-stepper-window-item>
</v-stepper-window>
<!-- Next/Previous buttons -->
<v-stepper-actions
@click:next="next"
> >
<template #prev="{ props }"> <div>
<v-spacer /> {{ $t('preferences.serverState') }}:
</template> </div>
<template #next="{ props }"> <server-state-text />
<outlined-button </v-stepper-window-item>
v-if="currentStep < 4"
@click="props.onClick()"
:disabled="preferencesStore.fetchInProgress"
>
{{ $t('misc.actions.next') }}
</outlined-button>
<outlined-button <v-stepper-window-item
v-else :value="2"
@click="showDialog = false; preferencesStore.firstStartup = false" >
:disabled="preferencesStore.studentName.length == 0 || <div v-if="preferencesStore.fetchInProgress" class="text-center text-h4 pb-4">
preferencesStore.registrationNumber.length == 0" <div class="pb-4">
prepend-icon="mdi-check" {{ $t('misc.firstStartup.createDatabase') }}
color="green" </div>
>
{{ $t('misc.firstStartup.complete') }} <v-progress-linear indeterminate />
</outlined-button> </div>
</template>
</v-stepper-actions> <div v-else class="text-center text-h4 pb-4 text-green">
</template> <v-icon icon="mdi-check" /> {{ $t('misc.firstStartup.finished') }}
</v-stepper> </div>
</template> </v-stepper-window-item>
<v-stepper-window-item
:value="3"
>
<div v-if="preferencesStore.fetchInProgress" class="text-center text-h4 pb-4">
<div class="pb-4">
{{ $t('misc.firstStartup.createExercises') }}
</div>
<v-progress-linear indeterminate />
</div>
<div v-else class="text-center text-h4 pb-4 text-green">
<v-icon icon="mdi-check" /> {{ $t('misc.firstStartup.finished') }}
</div>
</v-stepper-window-item>
<v-stepper-window-item
:value="4"
>
<v-container class="px-0 py-2">
<v-row>
<v-col>
<v-text-field
variant="outlined"
hide-details
:label="$t('misc.yourFullName')"
v-model="preferencesStore.studentName"
/>
</v-col>
</v-row>
<v-row>
<v-col>
<v-text-field
variant="outlined"
hide-details
:label="$t('misc.registrationNumber')"
v-model="preferencesStore.registrationNumber"
/>
</v-col>
</v-row>
</v-container>
</v-stepper-window-item>
</v-stepper-window>
<!-- Next/Previous buttons -->
<v-stepper-actions
@click:next="next"
>
<template #prev="{ props }">
<v-spacer />
</template>
<template #next="{ props }">
<outlined-button
v-if="currentStep < 4"
@click="props.onClick()"
:disabled="preferencesStore.fetchInProgress"
>
{{ $t('misc.actions.next') }}
</outlined-button>
<outlined-button
v-else
@click="showDialog = false; preferencesStore.firstStartup = false"
:disabled="preferencesStore.studentName.length == 0 ||
preferencesStore.registrationNumber.length == 0"
prepend-icon="mdi-check"
color="green"
>
{{ $t('misc.firstStartup.complete') }}
</outlined-button>
</template>
</v-stepper-actions>
</template>
</v-stepper>
</action-dialog> </action-dialog>
</template> </template>

View File

@@ -30,7 +30,11 @@ export const useAccountStore = defineStore("accountStore", {
registerData: ref<AccountModel>(new AccountModel()), registerData: ref<AccountModel>(new AccountModel()),
/** Request to server sent, waiting for data response */ /** Request to server sent, waiting for data response */
fetchInProgress: ref(false) fetchInProgress: ref(false),
adminPanelVisible: ref(false),
privilegeBuy: ref(false)
}), }),
actions: { actions: {
@@ -73,26 +77,11 @@ export const useAccountStore = defineStore("accountStore", {
feedbackStore.addSnackbar(BannerStateEnum.ACCOUNTLOGINSUCCESSFUL) feedbackStore.addSnackbar(BannerStateEnum.ACCOUNTLOGINSUCCESSFUL)
this.fetchInProgress = false this.fetchInProgress = false
this.privilegeBuy = true
this.adminPanelVisible = account.data.accountRole.privilegeAdminPanel
}) })
}) })
// await loginAccount(this.loginData.username, this.loginData.password)
// .then(async result => {
// this.userAccountId = result.data.id
// this.userLoggedIn = true
// fetchAddresses(result.data.id)
// .then(addresses => {
// })
// feedbackStore.addSnackbar(BannerStateEnum.ACCOUNTLOGINSUCCESSFUL)
// this.fetchInProgress = false
// return true
// })
.catch(error => { .catch(error => {
if (error.status == 400) { if (error.status == 400) {
feedbackStore.addSnackbar(BannerStateEnum.ACCOUNTLOGINERROR) feedbackStore.addSnackbar(BannerStateEnum.ACCOUNTLOGINERROR)
@@ -170,6 +159,8 @@ export const useAccountStore = defineStore("accountStore", {
this.userAccount = new AccountModel() this.userAccount = new AccountModel()
this.userAccountId = -1 this.userAccountId = -1
this.loggedIn = false this.loggedIn = false
this.privilegeBuy = false
this.adminPanelVisible = false
feedbackStore.addSnackbar(BannerStateEnum.ACCOUNTLOGOUTSUCCESSFUL) feedbackStore.addSnackbar(BannerStateEnum.ACCOUNTLOGOUTSUCCESSFUL)
}, },

View File

@@ -19,10 +19,10 @@ export const useBasketStore = defineStore('basketStore', {
itemsInBasket: useLocalStorage<Array<BasketItemModel>>("hackmycart/basketStore/itemsInBasket", []), itemsInBasket: useLocalStorage<Array<BasketItemModel>>("hackmycart/basketStore/itemsInBasket", []),
/** Address used in the order dialog */ /** Address used in the order dialog */
usedAddress: useLocalStorage("hackmycart/basketStore/usedAddress", new AddressModel()), usedAddress: ref(new AddressModel()),
/** Payment method used in the order dialog */ /** Payment method used in the order dialog */
usedPayment: useLocalStorage("hackmycart/basketStore/usedPayment", new PaymentModel()), usedPayment: ref(new PaymentModel()),
/** Selected seats in the booking page */ /** Selected seats in the booking page */
selectedSeats: ref<Array<SelectedSeatModel>>([]) selectedSeats: ref<Array<SelectedSeatModel>>([])

View File

@@ -9,6 +9,8 @@ import { BannerStateEnum } from "@/data/enums/bannerStateEnum";
import { useFeedbackStore } from "./feedback.store"; import { useFeedbackStore } from "./feedback.store";
import { useBasketStore } from "./basket.store"; import { useBasketStore } from "./basket.store";
import { useExerciseStore } from "./exercise.store"; 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: () => ({ state: () => ({
@@ -115,6 +117,7 @@ export const usePreferencesStore = defineStore('preferencesStore', {
*/ */
resetToFactorySettings() { resetToFactorySettings() {
const basketStore = useBasketStore() const basketStore = useBasketStore()
const accountStore = useAccountStore()
this.firstStartup = true this.firstStartup = true
this.studentName = "" this.studentName = ""
@@ -122,6 +125,10 @@ export const usePreferencesStore = defineStore('preferencesStore', {
this.theme = "dark" this.theme = "dark"
this.language = LanguageEnum.GERMAN this.language = LanguageEnum.GERMAN
basketStore.itemsInBasket = [] basketStore.itemsInBasket = []
accountStore.userAccountToken = ""
accountStore.userAccount = new AccountApiModel()
this.showFactoryResetDialog = false this.showFactoryResetDialog = false
} }