<template> <v-container> <v-dialog v-model="dialog" max-width="290"> <v-card> <v-card-title class="headline" >Transaktion ist länger als 5 Minuten her!</v-card-title > <v-card-text> Da die Transaktion länger als 5 Minutern her ist, kann eine Stornierung nicht durchgeführt werden. Wende dich bitte an den Finanzer. </v-card-text> <v-card-actions> <v-spacer /> <v-btn text @click="dialog = false"> Verstanden </v-btn> </v-card-actions> </v-card> </v-dialog> <AddAmountSkeleton v-if="loading" /> <v-navigation-drawer v-model="menu" right app clipped> <v-list-item-group :key="componentRenderer"> <v-list-item inactive> <v-list-item-title class="headline"> Verlauf </v-list-item-title> </v-list-item> <v-divider /> <div v-for="message in messages" three-line :key="messages.indexOf(message)" > <v-list-item three-line inactive @click="storno(message)"> <v-list-item-content> <v-progress-linear indeterminate v-if="message.loading" /> <v-list-item-title>{{ now(message.date) }}</v-list-item-title> <v-list-item-subtitle>{{ message.message }}</v-list-item-subtitle> <v-list-item-subtitle class="red--text" v-if="message.storno" >STORNIERT!!!</v-list-item-subtitle > <v-list-item-action-text >Klicken um zu Stornieren </v-list-item-action-text> </v-list-item-content> </v-list-item> </div> </v-list-item-group> </v-navigation-drawer> <v-card v-if="!loading" :loading="addLoading"> <v-card-title> {{ user.firstname }} {{ user.lastname }} <v-spacer /> <v-btn @click="menu = !menu" icon> <v-icon>{{ menuIcon }}</v-icon> </v-btn> </v-card-title> <v-card-text> <v-row> <v-col cols="10"> <v-row> <v-col cols="6" sm="4"> <v-btn class="creditBtn" block @click="addAmount(200)" :color="color" :disabled="user.locked" >2 €</v-btn > </v-col> <v-col cols="6" sm="4"> <v-btn class="creditBtn" block @click="addAmount(100)" :color="color" :disabled="user.locked" >1 €</v-btn > </v-col> <v-col cols="6" sm="4"> <v-btn class="creditBtn" block @click="addAmount(50)" :color="color" :disabled="user.locked" >0,50 €</v-btn > </v-col> <v-col cols="6" sm="4"> <v-btn class="creditBtn" block @click="addAmount(40)" :color="color" :disabled="user.locked" >0,40 €</v-btn > </v-col> <v-col cols="6" sm="4"> <v-btn class="creditBtn" block @click="addAmount(20)" :color="color" :disabled="user.locked" >0,20 €</v-btn > </v-col> <v-col cols="6" sm="4"> <v-btn class="creditBtn" block @click="addAmount(10)" :color="color" :disabled="user.locked" >0,10 €</v-btn > </v-col> <v-col cols="8"> <v-text-field outlined type="number" v-model="value" label="Benutzerdefinierter Betrag" :disabled="user.locked"></v-text-field> </v-col> <v-col cols="4"> <v-btn fab :color="color" @click="addAmountMore()" :disabled="user.locked"> <v-icon>{{plus}}</v-icon> </v-btn> </v-col> </v-row> </v-col> <v-col align-self="center"> <v-row> <v-list-item> <v-list-item-action-text :class="getColor(getAllSum())" >{{ (getAllSum() / 100).toFixed(2) }} €</v-list-item-action-text > </v-list-item> </v-row> </v-col> </v-row> <v-alert v-if="user.locked" type="error" >{{ user.firstname }} darf nicht mehr anschreiben. {{ user.firstname }} sollte sich lieber mal beim Finanzer melden.</v-alert > </v-card-text> </v-card> <v-snackbar v-for="message in messages" :key="messages.indexOf(message)" :color="message.error ? 'error' : 'success'" bottom :timeout="3000" :multi-line="true" v-model="message.visible" > {{ message.message }} </v-snackbar> </v-container> </template> <script> import { mapGetters, mapActions } from 'vuex' import { mdiMenu, mdiPlus } from '@mdi/js' import AddAmountSkeleton from './Skeleton/AddAmountSkeleton' export default { name: 'AddAmount', components: { AddAmountSkeleton }, data() { return { color: 'green accent-4', value: null, plus: mdiPlus, menu: false, dialog: false, componentRenderer: 0, timer: '', menuIcon: mdiMenu } }, created() { this.timer = setInterval(this.forceRender, 1000) }, methods: { ...mapActions({ addAmount: 'user/addAmount', commitStorno: 'user/storno' }), forceRender() { this.componentRenderer += 1 }, getColor(value) { return value >= 0 ? 'title green--text' : 'title red--text' }, getAllSum() { if (this.user) return ( this.user.creditList[this.year][2].sum + this.user.creditList[this.year][1].last ) return 0 }, storno(message) { if (!message.error) { if (!this.under5minutes(message.date)) this.dialog = true else { this.commitStorno({ amount: message.amount, date: message.date }) } } }, addAmountMore() { this.addAmount(this.value * 100) setTimeout(() => { this.value = null }, 300) } }, computed: { ...mapGetters({ user: 'user/user', year: 'user/year', loading: 'user/loading', addLoading: 'user/addLoading', messages: 'user/messages' }), under5minutes() { return now => { var actual = new Date() var zero = new Date(0) var date = new Date(actual - now) if ( date.getFullYear() === zero.getFullYear() && date.getMonth() === zero.getMonth() && date.getDate() === zero.getDate() ) { if (date.getMinutes() < 6) { return true } } return false } }, now() { return now => { var actual = new Date() var zero = new Date(0) var date = new Date(actual - now) if (date.getFullYear() === zero.getFullYear()) { if (date.getMonth() === zero.getMonth()) { if (date.getDate() === zero.getDate()) { if (date.getHours() === zero.getDate()) { if (date.getMinutes() < 1) { return 'vor ' + date.getSeconds() + ' Sekunden' } else if (date.getMinutes() < 10) { return 'vor ' + date.getMinutes() + ' Minuten' } else { return ( (now.getHours() < 10 ? '0' : '') + now.getHours() + ':' + (now.getMinutes() < 10 ? '0' : '') + now.getMinutes() ) } } else { return ( (now.getHours() < 10 ? '0' : '') + now.getHours() + ':' + (now.getMinutes() < 10 ? '0' : '') + now.getMinutes() ) } } } } return ( now.getDate() + '.' + now.getMonth() + '.' + now.getFullYear() + ' ' + (now.getHours() < 10 ? '0' : '') + now.getHours() + ':' + (now.getMinutes() < 10 ? '0' : '') + now.getMinutes() ) } } }, beforeDestroy() { clearInterval(this.timer) } } </script> <style scoped></style>