OrderDetailDialog

This commit is contained in:
2024-11-11 08:44:17 +01:00
parent b7291577b7
commit af26e64ad8
11 changed files with 82 additions and 30 deletions

View File

@@ -23,14 +23,10 @@ defineProps({
:icon="icon" :icon="icon"
:tonal="false" :tonal="false"
> >
<template #default v-if="$slots.default"> <template #borderless>
<slot></slot> <slot></slot>
</template> </template>
<template #borderless v-if="$slots.borderless">
<slot name="borderless"></slot>
</template>
<template #actions v-if="$slots.actions"> <template #actions v-if="$slots.actions">
<slot name="actions"></slot> <slot name="actions"></slot>
</template> </template>

View File

@@ -7,6 +7,10 @@ const router = useRouter()
defineProps({ defineProps({
addButtonString: String, addButtonString: String,
hideAddButton: {
type: Boolean,
default: false
},
onAddClick: { onAddClick: {
type: Function, type: Function,
default: () => {} default: () => {}
@@ -28,6 +32,7 @@ defineProps({
<v-col class="text-end"> <v-col class="text-end">
<outlined-button <outlined-button
v-if="!hideAddButton"
prepend-icon="mdi-plus" prepend-icon="mdi-plus"
color="green" color="green"
:disabled="fetchInProgress" :disabled="fetchInProgress"

View File

@@ -62,7 +62,7 @@
"withoutConcert": "ohne Konzert" "withoutConcert": "ohne Konzert"
}, },
"ticket": { "ticket": {
"tickets": "Ticket | Tickets" "ticket": "Ticket | Tickets"
}, },
"account": { "account": {
"account": "Account | Accounts", "account": "Account | Accounts",
@@ -112,7 +112,6 @@
"administrator": "Administrator | Administratoren" "administrator": "Administrator | Administratoren"
}, },
"order": { "order": {
"orders": "Bestellung | Bestellungen",
"oclock": "Uhr", "oclock": "Uhr",
"ordering": "Bestellabschluss", "ordering": "Bestellabschluss",
"orderSummary": "Bestellübersicht", "orderSummary": "Bestellübersicht",
@@ -120,7 +119,8 @@
"noOrders": "Keine Bestellungen gefunden", "noOrders": "Keine Bestellungen gefunden",
"orderedAt": "Bestellt am", "orderedAt": "Bestellt am",
"noOrdersText": "Bisher wurden keine Bestellungen von diesem Account getätigt. Gehe zum Warenkorb und bestelle!", "noOrdersText": "Bisher wurden keine Bestellungen von diesem Account getätigt. Gehe zum Warenkorb und bestelle!",
"ordersDescription": "Übersicht aller getätigten Bestellungen" "ordersDescription": "Übersicht aller getätigten Bestellungen",
"order": "Bestellung | Bestellungen"
}, },
"basket": { "basket": {
"addToBasket": "Zum Warenkorb hinzufügen", "addToBasket": "Zum Warenkorb hinzufügen",

View File

@@ -62,7 +62,7 @@
"withoutConcert": "without concert" "withoutConcert": "without concert"
}, },
"ticket": { "ticket": {
"tickets": "Ticket | Tickets" "ticket": "Ticket | Tickets"
}, },
"account": { "account": {
"account": "Account | Accounts", "account": "Account | Accounts",
@@ -112,7 +112,6 @@
"administrator": "Administrator" "administrator": "Administrator"
}, },
"order": { "order": {
"orders": "Order | Orders",
"oclock": "o'clock", "oclock": "o'clock",
"ordering": "Finish order process", "ordering": "Finish order process",
"orderSummary": "Order overview", "orderSummary": "Order overview",
@@ -120,7 +119,8 @@
"noOrders": "No orders found", "noOrders": "No orders found",
"orderedAt": "Ordered at", "orderedAt": "Ordered at",
"noOrdersText": "Bisher wurden keine Bestellungen von diesem Account getätigt. Gehe zum Warenkorb und bestelle!", "noOrdersText": "Bisher wurden keine Bestellungen von diesem Account getätigt. Gehe zum Warenkorb und bestelle!",
"ordersDescription": "Overview of all placed orders" "ordersDescription": "Overview of all placed orders",
"order": "Order | Orders"
}, },
"basket": { "basket": {
"addToBasket": "Add to basket", "addToBasket": "Add to basket",

View File

@@ -19,7 +19,7 @@ const router = useRouter()
<v-row> <v-row>
<v-col> <v-col>
<card-view <card-view
:title="$t('order.orders', 2)" :title="$t('order.order', 2)"
icon="mdi-basket-check" icon="mdi-basket-check"
@click="router.push('/account/orders')" @click="router.push('/account/orders')"
> >

View File

@@ -107,9 +107,9 @@ orderStore.getAllOrders()
/> />
<dashboard-card <dashboard-card
:title="$t('order.orders', 2)" :title="$t('order.order', 2)"
icon="mdi-basket" icon="mdi-basket"
:first-line="orderStore.orders.length + ' ' + $t('order.orders', 2)" :first-line="orderStore.orders.length + ' ' + $t('order.order', 2)"
second-line="todo" second-line="todo"
button-route="/admin/orders" button-route="/admin/orders"
:loading="orderStore.fetchInProgress" :loading="orderStore.fetchInProgress"

View File

@@ -1,7 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import actionDialog from '@/components/basics/actionDialog.vue'; import actionDialog from '@/components/basics/actionDialog.vue';
import outlinedButton from '@/components/basics/outlinedButton.vue'; import outlinedButton from '@/components/basics/outlinedButton.vue';
import { getStringRules } from '@/scripts/validationRules';
import { useGenreStore } from '@/stores/genre.store'; import { useGenreStore } from '@/stores/genre.store';
import { ref } from 'vue';
const valid = ref(false)
const genreStore = useGenreStore() const genreStore = useGenreStore()
</script> </script>
@@ -13,23 +17,27 @@ const genreStore = useGenreStore()
icon="mdi-pencil" icon="mdi-pencil"
max-width="500" max-width="500"
> >
<v-container> <v-form v-model="valid">
<v-row> <v-container>
<v-col> <v-row>
<v-text-field <v-col>
:label="$t('band.genre')" <v-text-field
v-model="genreStore.genre.name" :label="$t('band.genre')"
variant="outlined" v-model="genreStore.genre.name"
hide-details variant="outlined"
/> hide-details
</v-col> :rules="getStringRules(3)"
</v-row> />
</v-container> </v-col>
</v-row>
</v-container>
</v-form>
<template #actions> <template #actions>
<outlined-button <outlined-button
color="green" color="green"
@click="genreStore.saveGenre" @click="genreStore.saveGenre"
:disabled="!valid"
:loading="genreStore.fetchInProgress" :loading="genreStore.fetchInProgress"
> >
{{ $t('misc.actions.save') }} {{ $t('misc.actions.save') }}

View File

@@ -2,7 +2,7 @@
import adminDataLayout from '@/layouts/adminDataLayout.vue'; import adminDataLayout from '@/layouts/adminDataLayout.vue';
import { useOrderStore } from '@/stores/order.store'; import { useOrderStore } from '@/stores/order.store';
import moment from 'moment'; import moment from 'moment';
import { title } from 'process'; import OrderDetailDialog from './orderDetailDialog.vue';
const orderStore = useOrderStore() const orderStore = useOrderStore()
@@ -20,7 +20,9 @@ orderStore.getAllOrders()
</script> </script>
<template> <template>
<admin-data-layout> <admin-data-layout
:hide-add-button="true"
>
<v-data-table <v-data-table
:headers="headers" :headers="headers"
:items="orderStore.orders" :items="orderStore.orders"
@@ -52,6 +54,7 @@ orderStore.getAllOrders()
<v-btn <v-btn
icon="mdi-eye" icon="mdi-eye"
variant="plain" variant="plain"
@click="orderStore.openDetails(item)"
/> />
<v-btn <v-btn
@@ -64,4 +67,6 @@ orderStore.getAllOrders()
</v-data-table> </v-data-table>
</admin-data-layout> </admin-data-layout>
<order-detail-dialog />
</template> </template>

View File

@@ -0,0 +1,27 @@
<script setup lang="ts">
import actionDialog from '@/components/basics/actionDialog.vue';
import outlinedButton from '@/components/basics/outlinedButton.vue';
import { useOrderStore } from '@/stores/order.store';
import moment from 'moment';
const orderStore = useOrderStore()
</script>
<template>
<action-dialog
v-model="orderStore.showDetailDialog"
:title="$t('order.order')"
icon="mdi-basket"
>
<v-list>
<v-list-subheader>
{{ $t('ticket.ticket', 2) }}
</v-list-subheader>
<v-list-item v-for="ticket of orderStore.order.tickets">
{{ moment(ticket.concert.date).format("DD.MM.YYYY") }} -
{{ ticket.concert.band.name }} - {{ ticket.concert.name }}
</v-list-item>
</v-list>
</action-dialog>
</template>

View File

@@ -3,9 +3,11 @@ import { useFeedbackStore } from "@/stores/feedback.store"
/** /**
* Check a string for no numbers and more than four digits * Check a string for no numbers and more than four digits
* *
* @param [minChars=4] Minimal number of characters
*
* @returns Array of rules * @returns Array of rules
*/ */
export function getStringRules() { export function getStringRules(minChars = 4) {
const feedbackStore = useFeedbackStore() const feedbackStore = useFeedbackStore()
return [ return [
@@ -24,7 +26,7 @@ export function getStringRules() {
} }
}, },
value => { value => {
if (value?.length >= 4) { if (value?.length >= minChars) {
return true return true
} else { } else {
return feedbackStore.i18n.t('misc.validation.notEnoughChars') return feedbackStore.i18n.t('misc.validation.notEnoughChars')

View File

@@ -9,6 +9,10 @@ export const useOrderStore = defineStore("orderStore", {
/** All orders of one/all users */ /** All orders of one/all users */
orders: ref<Array<OrderApiModel>>([]), orders: ref<Array<OrderApiModel>>([]),
order: ref<OrderApiModel>(new OrderApiModel),
showDetailDialog: ref<boolean>(false),
/** Request to server sent, waiting for data response */ /** Request to server sent, waiting for data response */
fetchInProgress: ref(false) fetchInProgress: ref(false)
}), }),
@@ -42,6 +46,11 @@ export const useOrderStore = defineStore("orderStore", {
}) })
}, },
openDetails(order: OrderApiModel) {
this.order = order
this.showDetailDialog = true
},
async deleteOrder(order: OrderApiModel) { async deleteOrder(order: OrderApiModel) {
// todo // todo
} }