Reactivate Admin Panel, implement exercise 2.1, add feedback if exercise solved
This commit is contained in:
@@ -33,7 +33,16 @@
|
|||||||
"nameDe": "Broken Access Control",
|
"nameDe": "Broken Access Control",
|
||||||
"nameEn": "Broken Access Control",
|
"nameEn": "Broken Access Control",
|
||||||
"groupNr": 2,
|
"groupNr": 2,
|
||||||
"exercises": []
|
"exercises": [
|
||||||
|
{
|
||||||
|
"nameDe": "Admin-Panel aufrufen",
|
||||||
|
"nameEn": "Access Admin Panel",
|
||||||
|
"exerciseNr": 1,
|
||||||
|
"descriptionDe": "Manipuliere die URL so, dass du das Admin-Panel erreichen kannst",
|
||||||
|
"descriptionEn": "Manipulate the URL and access the admin panel",
|
||||||
|
"solved": false
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nameDe": "Cross-Site Scripting (XSS)",
|
"nameDe": "Cross-Site Scripting (XSS)",
|
||||||
|
|||||||
@@ -9,6 +9,31 @@ export enum BannerStateEnum {
|
|||||||
BASKETPRODUCTREMOVED,
|
BASKETPRODUCTREMOVED,
|
||||||
|
|
||||||
|
|
||||||
|
////////// Exercise feedback //////////
|
||||||
|
|
||||||
|
EXERCISESOLVED01,
|
||||||
|
|
||||||
|
EXERCISESOLVED02,
|
||||||
|
|
||||||
|
EXERCISESOLVED11,
|
||||||
|
|
||||||
|
EXERCISESOLVED12,
|
||||||
|
|
||||||
|
EXERCISESOLVED13,
|
||||||
|
|
||||||
|
EXERCISESOLVED21,
|
||||||
|
|
||||||
|
EXERCISESOLVED22,
|
||||||
|
|
||||||
|
EXERCISESOLVED23,
|
||||||
|
|
||||||
|
EXERCISESOLVED31,
|
||||||
|
|
||||||
|
EXERCISESOLVED32,
|
||||||
|
|
||||||
|
EXERCISESOLVED33,
|
||||||
|
|
||||||
|
|
||||||
////////// API Endpoint /api //////////
|
////////// API Endpoint /api //////////
|
||||||
|
|
||||||
// Status: 200 OK
|
// Status: 200 OK
|
||||||
@@ -45,21 +70,6 @@ export enum BannerStateEnum {
|
|||||||
ACCOUNTLOGOUTSUCCESSFUL,
|
ACCOUNTLOGOUTSUCCESSFUL,
|
||||||
|
|
||||||
|
|
||||||
////////// API Endpoint /categories //////////
|
|
||||||
|
|
||||||
// Status: 201 Created
|
|
||||||
CATEGORYCREATESUCCESSFUL,
|
|
||||||
|
|
||||||
// Status: 200 OK
|
|
||||||
CATEGORYDELETESUCESSFUL,
|
|
||||||
|
|
||||||
// Status: 400 Bad request
|
|
||||||
CATEGORYCREATEERROR,
|
|
||||||
|
|
||||||
// Status: 400 Bad request
|
|
||||||
CATEGORYDELETEERROR,
|
|
||||||
|
|
||||||
|
|
||||||
////////// API Endpoint /orders //////////
|
////////// API Endpoint /orders //////////
|
||||||
|
|
||||||
// Status: 201 Created
|
// Status: 201 Created
|
||||||
|
|||||||
@@ -49,22 +49,21 @@
|
|||||||
"bankName": "Name der Bank",
|
"bankName": "Name der Bank",
|
||||||
"iban": "IBAN"
|
"iban": "IBAN"
|
||||||
},
|
},
|
||||||
"account": {
|
"account": "Account | Accounts",
|
||||||
"username": "Username",
|
"username": "Username",
|
||||||
"password": "Passwort",
|
"password": "Passwort",
|
||||||
"noAccountRegister": "Neuen Account erstellen!",
|
"noAccountRegister": "Neuen Account erstellen!",
|
||||||
"register": "Account erstellen",
|
"register": "Account erstellen",
|
||||||
"backToLogin": "Zurück zum Login",
|
"backToLogin": "Zurück zum Login",
|
||||||
"delete": "Account löschen",
|
"delete": "Account löschen",
|
||||||
"managingAccount": "Account verwalten",
|
"managingAccount": "Account verwalten",
|
||||||
"address": "Adresse | Addressen",
|
"address": "Adresse | Addressen",
|
||||||
"payment": "Bezahlart | Bezahlarten",
|
"payment": "Bezahlart | Bezahlarten",
|
||||||
"masterData": "Stammdaten",
|
"masterData": "Stammdaten",
|
||||||
"noAddresses": "Keine Adressen gefunden",
|
"noAddresses": "Keine Adressen gefunden",
|
||||||
"noPayments": "Keine Bezahlarten gefunden",
|
"noPayments": "Keine Bezahlarten gefunden",
|
||||||
"newPayment": "New Payment",
|
"newPayment": "New Payment",
|
||||||
"email": "E-Mail-Adresse"
|
"email": "E-Mail-Adresse",
|
||||||
},
|
|
||||||
"bannerMessages": {
|
"bannerMessages": {
|
||||||
"loginSuccessful": "Login erfolgreich!",
|
"loginSuccessful": "Login erfolgreich!",
|
||||||
"wrongLogin": "Falscher Username oder falsches Passwort!",
|
"wrongLogin": "Falscher Username oder falsches Passwort!",
|
||||||
@@ -84,7 +83,18 @@
|
|||||||
"productDeleteSuccessful": "Produkt erfolgreich entfernt",
|
"productDeleteSuccessful": "Produkt erfolgreich entfernt",
|
||||||
"productDeleteError": "Fehler beim Entfernen des Produktes",
|
"productDeleteError": "Fehler beim Entfernen des Produktes",
|
||||||
"basketProductAdded": "Artikel zum Warenkorb hinzugefügt",
|
"basketProductAdded": "Artikel zum Warenkorb hinzugefügt",
|
||||||
"basketProductRemoved": "Artikel aus Warenkorb entfernt"
|
"basketProductRemoved": "Artikel aus Warenkorb entfernt",
|
||||||
|
"exerciseSolved01": "Aufgabe 0.1 gelöst!",
|
||||||
|
"exerciseSolved02": "Aufgabe 0.2 gelöst!",
|
||||||
|
"exerciseSolved11": "Aufgabe 1.1 gelöst!",
|
||||||
|
"exerciseSolved12": "Aufgabe 1.2 gelöst!",
|
||||||
|
"exerciseSolved13": "Aufgabe 1.3 gelöst!",
|
||||||
|
"exerciseSolved21": "Aufgabe 2.1 gelöst!",
|
||||||
|
"exerciseSolved22": "Aufgabe 2.2 gelöst!",
|
||||||
|
"exerciseSolved23": "Aufgabe 2.3 gelöst!",
|
||||||
|
"exerciseSolved31": "Aufgabe 3.1 gelöst!",
|
||||||
|
"exerciseSolved32": "Aufgabe 3.2 gelöst!",
|
||||||
|
"exerciseSolved33": "Aufgabe 3.3 gelöst!"
|
||||||
},
|
},
|
||||||
"oclock": "Uhr",
|
"oclock": "Uhr",
|
||||||
"ordering": {
|
"ordering": {
|
||||||
|
|||||||
@@ -49,22 +49,21 @@
|
|||||||
"bankName": "Bank name",
|
"bankName": "Bank name",
|
||||||
"iban": "IBAN"
|
"iban": "IBAN"
|
||||||
},
|
},
|
||||||
"account": {
|
"account": "Account | Accounts",
|
||||||
"backToLogin": "Back to Login",
|
"backToLogin": "Back to Login",
|
||||||
"username": "Username",
|
"username": "Username",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"noAccountRegister": "Create new Account!",
|
"noAccountRegister": "Create new Account!",
|
||||||
"register": "Create Account",
|
"register": "Create Account",
|
||||||
"delete": "Delete Account",
|
"delete": "Delete Account",
|
||||||
"managingAccount": "Managing Account",
|
"managingAccount": "Managing Account",
|
||||||
"address": "Address | Addresses",
|
"address": "Address | Addresses",
|
||||||
"payment": "Payment | Payments",
|
"payment": "Payment | Payments",
|
||||||
"masterData": "Master data",
|
"masterData": "Master data",
|
||||||
"noAddresses": "No Addresses found",
|
"noAddresses": "No Addresses found",
|
||||||
"noPayments": "No payments found",
|
"noPayments": "No payments found",
|
||||||
"newPayment": "New Payment",
|
"newPayment": "New Payment",
|
||||||
"email": "E-Mail address"
|
"email": "E-Mail address",
|
||||||
},
|
|
||||||
"bannerMessages": {
|
"bannerMessages": {
|
||||||
"loginSuccessful": "Login erfolgreich!",
|
"loginSuccessful": "Login erfolgreich!",
|
||||||
"wrongLogin": "Falscher Username oder falsches Passwort!",
|
"wrongLogin": "Falscher Username oder falsches Passwort!",
|
||||||
@@ -84,7 +83,18 @@
|
|||||||
"productDeleteSuccessful": "Product successfully deleted",
|
"productDeleteSuccessful": "Product successfully deleted",
|
||||||
"productDeleteError": "Error on product delete",
|
"productDeleteError": "Error on product delete",
|
||||||
"basketProductAdded": "Add product to basket",
|
"basketProductAdded": "Add product to basket",
|
||||||
"basketProductRemoved": "Product removed from basket"
|
"basketProductRemoved": "Product removed from basket",
|
||||||
|
"exerciseSolved01": "Exercise 0.1 solved!",
|
||||||
|
"exerciseSolved02": "Exercise 0.2 solved!",
|
||||||
|
"exerciseSolved11": "Exercise 1.1 solved!",
|
||||||
|
"exerciseSolved12": "Exercise 1.2 solved!",
|
||||||
|
"exerciseSolved13": "Exercise 1.3 solved!",
|
||||||
|
"exerciseSolved21": "Exercise 2.1 solved!",
|
||||||
|
"exerciseSolved22": "Exercise 2.2 solved!",
|
||||||
|
"exerciseSolved23": "Exercise 2.3 solved!",
|
||||||
|
"exerciseSolved31": "Exercise 3.1 solved!",
|
||||||
|
"exerciseSolved32": "Exercise 3.2 solved!",
|
||||||
|
"exerciseSolved33": "Exercise 3.3 solved!"
|
||||||
},
|
},
|
||||||
"oclock": "o'clock",
|
"oclock": "o'clock",
|
||||||
"ordering": {
|
"ordering": {
|
||||||
|
|||||||
6
software/src/pages/admin/accountsAdminPage/index.vue
Normal file
6
software/src/pages/admin/accountsAdminPage/index.vue
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
Accounts Admin Page
|
||||||
|
</template>
|
||||||
@@ -2,5 +2,5 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
Accounts Page
|
Bands Admin Page
|
||||||
</template>
|
</template>
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import cardView from '@/components/basics/cardView.vue';
|
|
||||||
// import { useProductStore } from '@/data/stores/productStore';
|
|
||||||
|
|
||||||
// const productStore = useProductStore()
|
|
||||||
|
|
||||||
const headers = [
|
|
||||||
{ title: "Name", value: "name" },
|
|
||||||
{ title: "Edit", value: "edit" },
|
|
||||||
]
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<!-- <v-container max-width="800">
|
|
||||||
<v-row>
|
|
||||||
<v-col>
|
|
||||||
<card-view
|
|
||||||
:title="$t('brand', 2)"
|
|
||||||
icon="mdi-label"
|
|
||||||
:subtitle="productStore.brands.length + ' ' + $t('brand', productStore.brands.length)"
|
|
||||||
>
|
|
||||||
<v-data-table
|
|
||||||
:items="productStore.brands"
|
|
||||||
:headers="headers"
|
|
||||||
>
|
|
||||||
</v-data-table>
|
|
||||||
</card-view>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
</v-container> -->
|
|
||||||
</template>
|
|
||||||
6
software/src/pages/admin/categoriesAdminPage/index.vue
Normal file
6
software/src/pages/admin/categoriesAdminPage/index.vue
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
Categories Admin Page
|
||||||
|
</template>
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import cardView from '@/components/basics/cardView.vue';
|
|
||||||
|
|
||||||
const headers = [
|
|
||||||
{ title: "Name", value: "name" },
|
|
||||||
{ title: "Icon", value: "icon" },
|
|
||||||
{ title: "Edit", value: "edit" },
|
|
||||||
]
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
6
software/src/pages/admin/concertsAdminPage/index.vue
Normal file
6
software/src/pages/admin/concertsAdminPage/index.vue
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
Concerts Admin Page
|
||||||
|
</template>
|
||||||
@@ -1,6 +1,149 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { useRouter } from 'vue-router';
|
||||||
|
import outlinedButton from '@/components/basics/outlinedButton.vue';
|
||||||
|
import cardView from '@/components/basics/cardView.vue';
|
||||||
|
import { useConcertStore } from '@/stores/concert.store';
|
||||||
|
import { useBandStore } from '@/stores/band.store';
|
||||||
|
import { useAccountStore } from '@/stores/account.store';
|
||||||
|
import { useLocationStore } from '@/stores/location.store';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useExerciseStore } from '@/stores/exercise.store';
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
const concertStore = useConcertStore()
|
||||||
|
const bandStore = useBandStore()
|
||||||
|
const accountStore = useAccountStore()
|
||||||
|
const locationStore = useLocationStore()
|
||||||
|
const soldOutConcerts = ref(0)
|
||||||
|
const exerciseStore = useExerciseStore()
|
||||||
|
|
||||||
|
exerciseStore.solveExercise(2, 1)
|
||||||
|
|
||||||
|
bandStore.getBands()
|
||||||
|
locationStore.getLocations()
|
||||||
|
concertStore.getConcerts()
|
||||||
|
.then(result => {
|
||||||
|
for(let concert of concertStore.concerts) {
|
||||||
|
concert.inStock == 0 ? soldOutConcerts.value++ : ""
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
Admin Dashboard Page
|
<v-container>
|
||||||
|
<v-row>
|
||||||
|
<v-col>
|
||||||
|
<card-view
|
||||||
|
:title="$t('band', 2)"
|
||||||
|
icon="mdi-guitar-electric"
|
||||||
|
>
|
||||||
|
<div class="text-h4 text-center">
|
||||||
|
{{ bandStore.bands.length }} {{ $t('band', 2) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #actions>
|
||||||
|
<outlined-button
|
||||||
|
@click="router.push('/admin/bands')"
|
||||||
|
>
|
||||||
|
{{ $t('more') }}
|
||||||
|
</outlined-button>
|
||||||
|
</template>
|
||||||
|
</card-view>
|
||||||
|
</v-col>
|
||||||
|
|
||||||
|
<v-col>
|
||||||
|
<card-view
|
||||||
|
:title="$t('concert', 2)"
|
||||||
|
icon="mdi-ticket"
|
||||||
|
>
|
||||||
|
<div class="text-h4 text-center">
|
||||||
|
{{ concertStore.concerts.length }} {{ $t('concert', 2) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text-disabled text-center">
|
||||||
|
{{ soldOutConcerts }} {{ $t('soldOut') }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #actions>
|
||||||
|
<outlined-button
|
||||||
|
@click="router.push('/admin/concerts')"
|
||||||
|
>
|
||||||
|
{{ $t('more') }}
|
||||||
|
</outlined-button>
|
||||||
|
</template>
|
||||||
|
</card-view>
|
||||||
|
</v-col>
|
||||||
|
|
||||||
|
|
||||||
|
<v-col>
|
||||||
|
<card-view
|
||||||
|
:title="$t('location', 2)"
|
||||||
|
icon="mdi-city"
|
||||||
|
>
|
||||||
|
<div class="text-h4 text-center">
|
||||||
|
{{ locationStore.locations.length }} {{ $t('location', 2) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #actions>
|
||||||
|
<outlined-button
|
||||||
|
@click="router.push('/admin/locations')"
|
||||||
|
>
|
||||||
|
{{ $t('more') }}
|
||||||
|
</outlined-button>
|
||||||
|
</template>
|
||||||
|
</card-view>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<v-row>
|
||||||
|
<v-col>
|
||||||
|
<card-view
|
||||||
|
:title="$t('account', 2)"
|
||||||
|
icon="mdi-account"
|
||||||
|
>
|
||||||
|
</card-view>
|
||||||
|
</v-col>
|
||||||
|
|
||||||
|
<v-col>
|
||||||
|
<card-view
|
||||||
|
:title="$t('category', 2)"
|
||||||
|
icon="mdi-account"
|
||||||
|
>
|
||||||
|
<div class="text-h4 text-center">
|
||||||
|
{{ bandStore.availableGenres.length }} {{ $t('genres', 2) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #actions>
|
||||||
|
<outlined-button
|
||||||
|
@click="router.push('/admin/genres')"
|
||||||
|
>
|
||||||
|
{{ $t('more') }}
|
||||||
|
</outlined-button>
|
||||||
|
</template>
|
||||||
|
</card-view>
|
||||||
|
</v-col>
|
||||||
|
|
||||||
|
<v-col>
|
||||||
|
<card-view
|
||||||
|
:title="$t('genres', 2)"
|
||||||
|
icon="mdi-guitar-electric"
|
||||||
|
>
|
||||||
|
<div class="text-h4 text-center">
|
||||||
|
{{ bandStore.availableGenres.length }} {{ $t('genres', 2) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #actions>
|
||||||
|
<outlined-button
|
||||||
|
@click="router.push('/admin/genres')"
|
||||||
|
>
|
||||||
|
{{ $t('more') }}
|
||||||
|
</outlined-button>
|
||||||
|
</template>
|
||||||
|
</card-view>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
|
</v-container>
|
||||||
</template>
|
</template>
|
||||||
6
software/src/pages/admin/genresAdminPage/index.vue
Normal file
6
software/src/pages/admin/genresAdminPage/index.vue
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
Genres Admin Page
|
||||||
|
</template>
|
||||||
6
software/src/pages/admin/locationsAdminPage/index.vue
Normal file
6
software/src/pages/admin/locationsAdminPage/index.vue
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
Locations Admin Page
|
||||||
|
</template>
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import cardView from '@/components/basics/cardView.vue';
|
|
||||||
import productEditDialog from './productEditDialog.vue';
|
|
||||||
import { ref } from 'vue';
|
|
||||||
|
|
||||||
// const productStore = useProductStore()
|
|
||||||
// const editProduct = ref(new ProductModel())
|
|
||||||
const showEditProductDialog = ref(false)
|
|
||||||
|
|
||||||
const headers = [
|
|
||||||
{ title: "Category", value: "category.name" },
|
|
||||||
{ title: "Brand", value: "brand.name" },
|
|
||||||
{ title: "Name", value: "name" },
|
|
||||||
{ title: "Price", value: "price" },
|
|
||||||
{ title: "Discount", value: "discount" },
|
|
||||||
{ title: "Rating", value: "rating" },
|
|
||||||
{ title: "In stock", value: "inStock" },
|
|
||||||
{ title: "Edit", value: "edit" },
|
|
||||||
]
|
|
||||||
|
|
||||||
// function openEditProductDialog(product: ProductModel) {
|
|
||||||
// editProduct.value = product
|
|
||||||
// showEditProductDialog.value = true
|
|
||||||
// }
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<v-container>
|
|
||||||
<v-row>
|
|
||||||
<!-- <v-col>
|
|
||||||
<card-view
|
|
||||||
:title="$t('product.product', 2)"
|
|
||||||
:subtitle="productStore.products.length + ' ' + $t('product.product', productStore.products.length)"
|
|
||||||
icon="mdi-store"
|
|
||||||
>
|
|
||||||
<v-data-table
|
|
||||||
:headers="headers"
|
|
||||||
:items="productStore.products"
|
|
||||||
>
|
|
||||||
<template v-slot:item.price="{ item }">
|
|
||||||
{{ item.price }} €
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template v-slot:item.discount="{ item }">
|
|
||||||
<div v-if="item.discount > 0">
|
|
||||||
{{ item.discount }} %
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template v-slot:item.inStock="{ item }">
|
|
||||||
<div v-if="item.inStock > 5" class="text-green-lighten-1">
|
|
||||||
<v-icon icon="mdi-check" />
|
|
||||||
{{ $t("product.storedItemsAvailable", [item.inStock]) }}
|
|
||||||
</div>
|
|
||||||
<div v-else-if="item.inStock > 0" class="text-orange-lighten-1">
|
|
||||||
<v-icon icon="mdi-alert" />
|
|
||||||
{{ $t("product.storedItemsAvailable", [item.inStock]) }}
|
|
||||||
</div>
|
|
||||||
<div v-else class="text-red">
|
|
||||||
<v-icon icon="mdi-alert-circle" />
|
|
||||||
{{ $t("product.soldOut") }}
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template v-slot:item.edit="{ item }">
|
|
||||||
<v-btn
|
|
||||||
icon="mdi-pencil"
|
|
||||||
color="orange"
|
|
||||||
variant="text"
|
|
||||||
@click="openEditProductDialog(item)"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<v-btn
|
|
||||||
icon="mdi-store-off"
|
|
||||||
color="red"
|
|
||||||
variant="text"
|
|
||||||
v-if="item.offered"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<v-btn
|
|
||||||
icon="mdi-store"
|
|
||||||
color="green"
|
|
||||||
variant="text"
|
|
||||||
v-if="!item.offered"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
</v-data-table>
|
|
||||||
</card-view>
|
|
||||||
</v-col> -->
|
|
||||||
</v-row>
|
|
||||||
</v-container>
|
|
||||||
|
|
||||||
<!-- <product-edit-dialog
|
|
||||||
v-model="showEditProductDialog"
|
|
||||||
:edit-product="editProduct" /> -->
|
|
||||||
</template>
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import actionDialog from '@/components/basics/actionDialog.vue';
|
|
||||||
import { ProductModel } from '@/data/models/productModel';
|
|
||||||
import outlinedButton from '@/components/basics/outlinedButton.vue';
|
|
||||||
import { useProductStore } from '@/data/stores/productStore';
|
|
||||||
import { ModelRef } from 'vue';
|
|
||||||
|
|
||||||
const showDialog: ModelRef<boolean> = defineModel()
|
|
||||||
const editProduct = defineModel("editProduct", { type: ProductModel, required: true})
|
|
||||||
const productStore = useProductStore()
|
|
||||||
|
|
||||||
function saveProduct() {
|
|
||||||
// todo
|
|
||||||
showDialog.value = false
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<action-dialog
|
|
||||||
:title="$t('editProduct')"
|
|
||||||
icon="mdi-store-edit"
|
|
||||||
v-model="showDialog"
|
|
||||||
>
|
|
||||||
<v-row>
|
|
||||||
<v-col>
|
|
||||||
<v-select
|
|
||||||
:items="productStore.categories"
|
|
||||||
v-model="editProduct.category"
|
|
||||||
:label="$t('category')"
|
|
||||||
>
|
|
||||||
<template v-slot:item="{ props, item }">
|
|
||||||
<v-list-item v-bind="props" :prepend-icon="item.raw.icon" :title="item.raw.name" />
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template v-slot:selection="{ item }">
|
|
||||||
<v-list-item :prepend-icon="item.raw.icon" :title="item.raw.name" />
|
|
||||||
</template>
|
|
||||||
</v-select>
|
|
||||||
</v-col>
|
|
||||||
|
|
||||||
<v-col>
|
|
||||||
<v-select
|
|
||||||
:items="productStore.brands"
|
|
||||||
v-model="editProduct.brand"
|
|
||||||
:label="$t('brand')"
|
|
||||||
>
|
|
||||||
<template v-slot:item="{ props, item }">
|
|
||||||
<v-list-item v-bind="props" :title="item.raw.name" />
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template v-slot:selection="{ item }">
|
|
||||||
<v-list-item :title="item.raw.name" />
|
|
||||||
</template>
|
|
||||||
</v-select>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
|
|
||||||
<v-row>
|
|
||||||
<v-col>
|
|
||||||
<v-text-field
|
|
||||||
v-model="editProduct.name"
|
|
||||||
:label="$t('product.productName')"
|
|
||||||
/>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
|
|
||||||
<v-row>
|
|
||||||
<v-col>
|
|
||||||
<v-textarea
|
|
||||||
v-model="editProduct.description"
|
|
||||||
:label="$t('product.description')"
|
|
||||||
/>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
|
|
||||||
<v-row>
|
|
||||||
<v-col>
|
|
||||||
<v-text-field
|
|
||||||
v-model="editProduct.price"
|
|
||||||
:label="$t('product.productPrice')"
|
|
||||||
suffix="€"
|
|
||||||
/>
|
|
||||||
</v-col>
|
|
||||||
|
|
||||||
<v-col>
|
|
||||||
<v-text-field
|
|
||||||
v-model="editProduct.discount"
|
|
||||||
:label="$t('product.discount')"
|
|
||||||
/>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
|
|
||||||
<v-row>
|
|
||||||
<v-col>
|
|
||||||
<v-text-field
|
|
||||||
v-model="editProduct.inStock"
|
|
||||||
:label="$t('product.inStock')"
|
|
||||||
/>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
|
|
||||||
<!-- todo -->
|
|
||||||
{{ editProduct.images }}
|
|
||||||
{{ editProduct.specs }}
|
|
||||||
|
|
||||||
<template #actions>
|
|
||||||
<outlined-button
|
|
||||||
color="green"
|
|
||||||
prepend-icon="mdi-content-save"
|
|
||||||
@click="saveProduct"
|
|
||||||
>
|
|
||||||
{{ $t('save') }}
|
|
||||||
</outlined-button>
|
|
||||||
</template>
|
|
||||||
</action-dialog>
|
|
||||||
</template>
|
|
||||||
@@ -1,28 +1,38 @@
|
|||||||
import DashboardPage from "@/pages/admin/dashboardPage/index.vue"
|
import DashboardPage from "@/pages/admin/dashboardPage/index.vue"
|
||||||
import CategoriesPage from "@/pages/admin/categoriesPage/index.vue"
|
import ConcertsAdminPage from "@/pages/admin/concertsAdminPage/index.vue"
|
||||||
import AccountsPage from "@/pages/admin/accountsPage/index.vue"
|
import BandsAdminPage from "@/pages/admin/bandsAdminPage/index.vue"
|
||||||
import ProductsPage from "@/pages/admin/productsPage/index.vue"
|
import AccountsAdminPage from "@/pages/admin/accountsAdminPage/index.vue"
|
||||||
import BrandsPage from "@/pages/admin/brandsPage/index.vue"
|
import GenresAdminPage from "@/pages/admin/genresAdminPage/index.vue"
|
||||||
|
import CategoriesAdminPage from "@/pages/admin/categoriesAdminPage/index.vue"
|
||||||
|
import LocationsAdminPage from "@/pages/admin/locationsAdminPage/index.vue"
|
||||||
|
|
||||||
export const adminRoutes = [
|
export const adminRoutes = [
|
||||||
{
|
{
|
||||||
path: '/admin/dashboard',
|
path: '/admin',
|
||||||
component: DashboardPage
|
component: DashboardPage
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/admin/categories',
|
path: '/admin/concerts',
|
||||||
component: CategoriesPage
|
component: ConcertsAdminPage
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/admin/bands',
|
||||||
|
component: BandsAdminPage
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/admin/accounts',
|
path: '/admin/accounts',
|
||||||
component: AccountsPage
|
component: AccountsAdminPage
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/admin/products',
|
path: '/admin/genres',
|
||||||
component: ProductsPage
|
component: GenresAdminPage
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/admin/brands',
|
path: '/admin/categories',
|
||||||
component: BrandsPage
|
component: CategoriesAdminPage
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
path: '/admin/locations',
|
||||||
|
component: LocationsAdminPage
|
||||||
|
},
|
||||||
]
|
]
|
||||||
@@ -2,6 +2,8 @@ import { fetchAllExerciseGroups, updateExercise } from "@/data/api/exerciseApi";
|
|||||||
import { ExerciseGroupApiModel } from "@/data/models/exercises/exerciseGroupApiModel";
|
import { ExerciseGroupApiModel } from "@/data/models/exercises/exerciseGroupApiModel";
|
||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
import { useFeedbackStore } from "./feedback.store";
|
||||||
|
import { BannerStateEnum } from "@/data/enums/bannerStateEnum";
|
||||||
|
|
||||||
export const useExerciseStore = defineStore("exerciseStore", {
|
export const useExerciseStore = defineStore("exerciseStore", {
|
||||||
state: () => ({
|
state: () => ({
|
||||||
@@ -23,10 +25,55 @@ export const useExerciseStore = defineStore("exerciseStore", {
|
|||||||
},
|
},
|
||||||
|
|
||||||
solveExercise(exerciseGroupNr: number, exerciseNr: number) {
|
solveExercise(exerciseGroupNr: number, exerciseNr: number) {
|
||||||
|
const feedbackStore = useFeedbackStore()
|
||||||
this.fetchInProgress = true
|
this.fetchInProgress = true
|
||||||
|
|
||||||
updateExercise(exerciseGroupNr, exerciseNr, true)
|
updateExercise(exerciseGroupNr, exerciseNr, true)
|
||||||
.then(result => {
|
.then(result => {
|
||||||
|
let bannerState = BannerStateEnum.ERROR
|
||||||
|
|
||||||
|
switch(exerciseGroupNr) {
|
||||||
|
case 0: {
|
||||||
|
switch(exerciseNr) {
|
||||||
|
case 1: bannerState = BannerStateEnum.EXERCISESOLVED01; break;
|
||||||
|
case 2: bannerState = BannerStateEnum.EXERCISESOLVED02; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 3: {
|
||||||
|
switch(exerciseNr) {
|
||||||
|
case 1: bannerState = BannerStateEnum.EXERCISESOLVED31; break;
|
||||||
|
case 2: bannerState = BannerStateEnum.EXERCISESOLVED32; break;
|
||||||
|
case 3: bannerState = BannerStateEnum.EXERCISESOLVED33; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
feedbackStore.changeBanner(bannerState)
|
||||||
this.getAllExercises()
|
this.getAllExercises()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,6 +41,53 @@ export const useFeedbackStore = defineStore("feedbackStore", {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////// Exercise feedback //////////
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED01: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved01"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED02: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved02"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED11: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved11"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED12: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved12"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED13: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved13"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED21: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved21"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED22: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved22"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED23: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved23"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED31: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved31"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED32: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved32"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED33: {
|
||||||
|
this.title = this.i18n.t("bannerMessages.exerciseSolved33"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////// API Endpoint /api //////////
|
////////// API Endpoint /api //////////
|
||||||
|
|
||||||
case BannerStateEnum.DATABASERESETSUCCESSFUL: {
|
case BannerStateEnum.DATABASERESETSUCCESSFUL: {
|
||||||
@@ -79,25 +126,6 @@ export const useFeedbackStore = defineStore("feedbackStore", {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////// API Endpoint /categories //////////
|
|
||||||
|
|
||||||
case BannerStateEnum.CATEGORYCREATESUCCESSFUL: {
|
|
||||||
this.title = this.i18n.t('bannerMessages.categoryCreateSuccessful'); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BannerStateEnum.CATEGORYDELETESUCESSFUL: {
|
|
||||||
this.title = this.i18n.t('bannerMessages.categoryDeleteSuccessful'); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BannerStateEnum.CATEGORYCREATEERROR: {
|
|
||||||
this.title = this.i18n.t('bannerMessages.categoryCreateError'); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case BannerStateEnum.CATEGORYDELETEERROR: {
|
|
||||||
this.title = this.i18n.t('bannerMessages.categoryDeleteError'); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////// API Endpoint /orders //////////
|
////////// API Endpoint /orders //////////
|
||||||
|
|
||||||
case BannerStateEnum.ORDERPLACESUCCESSFUL: {
|
case BannerStateEnum.ORDERPLACESUCCESSFUL: {
|
||||||
@@ -133,8 +161,6 @@ export const useFeedbackStore = defineStore("feedbackStore", {
|
|||||||
case BannerStateEnum.ACCOUNTLOGINWRONGLOGIN:
|
case BannerStateEnum.ACCOUNTLOGINWRONGLOGIN:
|
||||||
case BannerStateEnum.ACCOUNTREGISTERERROR:
|
case BannerStateEnum.ACCOUNTREGISTERERROR:
|
||||||
case BannerStateEnum.ACCOUNTREGISTERUSERNAMEINUSE:
|
case BannerStateEnum.ACCOUNTREGISTERUSERNAMEINUSE:
|
||||||
case BannerStateEnum.CATEGORYCREATEERROR:
|
|
||||||
case BannerStateEnum.CATEGORYDELETEERROR:
|
|
||||||
case BannerStateEnum.PRODUCTDELETESUCCESSFUL:
|
case BannerStateEnum.PRODUCTDELETESUCCESSFUL:
|
||||||
case BannerStateEnum.PRODUCTDELETEERROR:
|
case BannerStateEnum.PRODUCTDELETEERROR:
|
||||||
this.color = "red"
|
this.color = "red"
|
||||||
@@ -146,14 +172,26 @@ export const useFeedbackStore = defineStore("feedbackStore", {
|
|||||||
case BannerStateEnum.ACCOUNTREGISTERSUCCESSFUL:
|
case BannerStateEnum.ACCOUNTREGISTERSUCCESSFUL:
|
||||||
case BannerStateEnum.ACCOUNTUPDATESUCCESSFUL:
|
case BannerStateEnum.ACCOUNTUPDATESUCCESSFUL:
|
||||||
case BannerStateEnum.ACCOUNTLOGOUTSUCCESSFUL:
|
case BannerStateEnum.ACCOUNTLOGOUTSUCCESSFUL:
|
||||||
case BannerStateEnum.CATEGORYCREATESUCCESSFUL:
|
|
||||||
case BannerStateEnum.CATEGORYDELETESUCESSFUL:
|
|
||||||
case BannerStateEnum.ORDERPLACESUCCESSFUL:
|
case BannerStateEnum.ORDERPLACESUCCESSFUL:
|
||||||
case BannerStateEnum.PRODUCTCREATESUCCESSFUL:
|
case BannerStateEnum.PRODUCTCREATESUCCESSFUL:
|
||||||
case BannerStateEnum.PRODUCTCREATEERROR:
|
case BannerStateEnum.PRODUCTCREATEERROR:
|
||||||
this.color = "green"
|
this.color = "green"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED01:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED02:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED11:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED12:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED13:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED21:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED22:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED23:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED31:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED32:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED33:
|
||||||
|
this.color = "purple"
|
||||||
|
break;
|
||||||
|
|
||||||
case BannerStateEnum.BASKETPRODUCTREMOVED:
|
case BannerStateEnum.BASKETPRODUCTREMOVED:
|
||||||
this.color = "blue"
|
this.color = "blue"
|
||||||
}
|
}
|
||||||
@@ -173,12 +211,6 @@ export const useFeedbackStore = defineStore("feedbackStore", {
|
|||||||
this.icon = "mdi-account"
|
this.icon = "mdi-account"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BannerStateEnum.CATEGORYCREATEERROR:
|
|
||||||
case BannerStateEnum.CATEGORYDELETEERROR:
|
|
||||||
case BannerStateEnum.CATEGORYCREATESUCCESSFUL:
|
|
||||||
case BannerStateEnum.CATEGORYDELETESUCESSFUL:
|
|
||||||
this.icon = "mdi-label"
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BannerStateEnum.PRODUCTDELETESUCCESSFUL:
|
case BannerStateEnum.PRODUCTDELETESUCCESSFUL:
|
||||||
case BannerStateEnum.PRODUCTDELETEERROR:
|
case BannerStateEnum.PRODUCTDELETEERROR:
|
||||||
@@ -187,6 +219,20 @@ export const useFeedbackStore = defineStore("feedbackStore", {
|
|||||||
this.icon = "mdi-store"
|
this.icon = "mdi-store"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BannerStateEnum.EXERCISESOLVED01:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED02:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED11:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED12:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED13:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED21:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED22:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED23:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED31:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED32:
|
||||||
|
case BannerStateEnum.EXERCISESOLVED33:
|
||||||
|
this.icon = "mdi-check-circle-outline"
|
||||||
|
break;
|
||||||
|
|
||||||
case BannerStateEnum.DATABASERESETSUCCESSFUL:
|
case BannerStateEnum.DATABASERESETSUCCESSFUL:
|
||||||
this.icon = "mdi-database-refresh"
|
this.icon = "mdi-database-refresh"
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user