finished ##172
edit and add pricelist edit and add drinktypes
This commit is contained in:
parent
afa8945f66
commit
f0a2231a5b
|
@ -8,6 +8,9 @@
|
||||||
<v-btn icon v-if="isFinanzer" disabled>
|
<v-btn icon v-if="isFinanzer" disabled>
|
||||||
<v-icon>{{attach_money}}</v-icon>
|
<v-icon>{{attach_money}}</v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
<v-btn icon v-if="isGastro" disabled>
|
||||||
|
<v-icon>{{gastro}}</v-icon>
|
||||||
|
</v-btn>
|
||||||
<v-btn icon v-if="isBar" disabled>
|
<v-btn icon v-if="isBar" disabled>
|
||||||
<v-icon>{{local_bar}}</v-icon>
|
<v-icon>{{local_bar}}</v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
@ -22,7 +25,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapActions, mapGetters } from 'vuex'
|
import { mapActions, mapGetters } from 'vuex'
|
||||||
import { mdiCurrencyEur, mdiGlassCocktail, mdiAccount, mdiFileMultiple } from '@mdi/js'
|
import { mdiCurrencyEur, mdiGlassCocktail, mdiAccount, mdiFileMultiple, mdiFoodForkDrink } from '@mdi/js'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TitleBar',
|
name: 'TitleBar',
|
||||||
|
@ -31,11 +34,12 @@ export default {
|
||||||
attach_money: mdiCurrencyEur,
|
attach_money: mdiCurrencyEur,
|
||||||
local_bar: mdiGlassCocktail,
|
local_bar: mdiGlassCocktail,
|
||||||
person: mdiAccount,
|
person: mdiAccount,
|
||||||
list: mdiFileMultiple
|
list: mdiFileMultiple,
|
||||||
|
gastro: mdiFoodForkDrink
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['isBar', 'isFinanzer', 'isUser', 'isLoggedIn'])
|
...mapGetters(['isBar', 'isFinanzer', 'isUser', 'isLoggedIn', 'isGastro'])
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions(['logout'])
|
...mapActions(['logout'])
|
||||||
|
|
|
@ -7,12 +7,6 @@
|
||||||
</v-list-item-icon>
|
</v-list-item-icon>
|
||||||
<v-list-item-title>Gesamtübersicht</v-list-item-title>
|
<v-list-item-title>Gesamtübersicht</v-list-item-title>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-list-item link to="/main/finanzer/servicemanagement">
|
|
||||||
<v-list-item-icon>
|
|
||||||
<v-icon>{{work}}</v-icon>
|
|
||||||
</v-list-item-icon>
|
|
||||||
<v-list-item-title>Dienstverwaltung</v-list-item-title>
|
|
||||||
</v-list-item>
|
|
||||||
</v-list>
|
</v-list>
|
||||||
<v-divider />
|
<v-divider />
|
||||||
<v-list>
|
<v-list>
|
||||||
|
@ -34,25 +28,18 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters, mapActions } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import {mdiHome, mdiBriefcase} from '@mdi/js'
|
import {mdiHome} from '@mdi/js'
|
||||||
export default {
|
export default {
|
||||||
name: 'FinanzerNavigation',
|
name: 'FinanzerNavigation',
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
home: mdiHome,
|
home: mdiHome
|
||||||
work: mdiBriefcase
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
|
||||||
...mapActions({
|
|
||||||
addUser: 'finanzerUsers/addUser'
|
|
||||||
})
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters({
|
...mapGetters({
|
||||||
users: 'finanzerUsers/users',
|
users: 'finanzerUsers/users',
|
||||||
allUsers: 'finanzerUsers/allUsers',
|
|
||||||
loading: 'finanzerUsers/usersLoading'
|
loading: 'finanzerUsers/usersLoading'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
<template>
|
||||||
|
<v-list>
|
||||||
|
<v-list-item class="title" link to="/main/gastro/pricelist">
|
||||||
|
<v-list-item-icon>
|
||||||
|
<v-icon>{{list}}</v-icon>
|
||||||
|
</v-list-item-icon>
|
||||||
|
<v-list-item-title>
|
||||||
|
Preisliste
|
||||||
|
</v-list-item-title>
|
||||||
|
</v-list-item>
|
||||||
|
</v-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mdiFileMultiple } from '@mdi/js'
|
||||||
|
export default {
|
||||||
|
name: "GastroNavigation",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
list: mdiFileMultiple
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
|
@ -1,10 +1,10 @@
|
||||||
<template>
|
<template>
|
||||||
<v-content>
|
<div>
|
||||||
<v-container>
|
<v-data-table :headers="headers" :items="priceList" :search="search">
|
||||||
<v-card>
|
<template v-slot:top>
|
||||||
<v-card-title>
|
<v-toolbar flat color="white">
|
||||||
Preisliste
|
<v-toolbar-title>Preisliste</v-toolbar-title>
|
||||||
<v-spacer />
|
<v-spacer></v-spacer>
|
||||||
<v-text-field
|
<v-text-field
|
||||||
v-model="search"
|
v-model="search"
|
||||||
label="Suche Getränk"
|
label="Suche Getränk"
|
||||||
|
@ -15,8 +15,136 @@
|
||||||
<v-icon>{{ searchIcon }}</v-icon>
|
<v-icon>{{ searchIcon }}</v-icon>
|
||||||
</template>
|
</template>
|
||||||
</v-text-field>
|
</v-text-field>
|
||||||
|
<v-dialog v-model="dialog" v-if="isGastro">
|
||||||
|
<template v-slot:activator="{ on }">
|
||||||
|
<v-btn
|
||||||
|
fab
|
||||||
|
x-small
|
||||||
|
color="primary"
|
||||||
|
class="mb-2"
|
||||||
|
v-on="on"
|
||||||
|
style="margin: 5px"
|
||||||
|
>
|
||||||
|
<v-icon>{{ plus }}</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</template>
|
||||||
|
<v-card>
|
||||||
|
<v-card-title>
|
||||||
|
<span class="headline">{{ formTitle }}</span>
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<v-data-table :headers="headers" :items="priceList" :search="search">
|
|
||||||
|
<v-card-text>
|
||||||
|
<v-container>
|
||||||
|
<v-row>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.name"
|
||||||
|
label="Name"
|
||||||
|
outlined
|
||||||
|
></v-text-field>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-autocomplete
|
||||||
|
return-object
|
||||||
|
v-model="editedItem.type"
|
||||||
|
label="Kategorie"
|
||||||
|
item-text="name"
|
||||||
|
item-value="id"
|
||||||
|
:items="types"
|
||||||
|
outlined
|
||||||
|
:search-input.sync="searchType"
|
||||||
|
no-data-text="Kategorie nicht vorhanden."
|
||||||
|
>
|
||||||
|
<template v-slot:append-item>
|
||||||
|
<v-list-item v-if="!inType(searchType)">
|
||||||
|
<v-list-item-title>
|
||||||
|
{{ searchType }}
|
||||||
|
</v-list-item-title>
|
||||||
|
<v-btn
|
||||||
|
dark
|
||||||
|
x-small
|
||||||
|
color="blue darken-1"
|
||||||
|
@click="addType()"
|
||||||
|
:disabled="inType(searchType)"
|
||||||
|
fab
|
||||||
|
>
|
||||||
|
<v-icon>
|
||||||
|
{{ plus }}
|
||||||
|
</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</v-list-item>
|
||||||
|
</template>
|
||||||
|
</v-autocomplete>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.price"
|
||||||
|
label="Preis in €"
|
||||||
|
outlined
|
||||||
|
></v-text-field>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.price_big"
|
||||||
|
label="Preis groß in €"
|
||||||
|
outlined
|
||||||
|
></v-text-field>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.price_club"
|
||||||
|
label="Preis Club in €"
|
||||||
|
outlined
|
||||||
|
></v-text-field>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.price_club_big"
|
||||||
|
label="Preis Club groß in €"
|
||||||
|
outlined
|
||||||
|
></v-text-field>
|
||||||
|
</v-col>
|
||||||
|
<v-col col="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.premium"
|
||||||
|
label="Aufpreis in €"
|
||||||
|
outlined
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.premium_club"
|
||||||
|
label="Aufpreis Club in €"
|
||||||
|
outlined
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="4">
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedItem.price_extern_club"
|
||||||
|
label="Preis extern Club in €"
|
||||||
|
outlined
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</v-container>
|
||||||
|
</v-card-text>
|
||||||
|
|
||||||
|
<v-card-actions>
|
||||||
|
<v-spacer></v-spacer>
|
||||||
|
<v-btn color="blue darken-1" text @click="close"
|
||||||
|
>Abbrechen</v-btn
|
||||||
|
>
|
||||||
|
<v-btn color="blue darken-1" text @click="save"
|
||||||
|
>Speichern</v-btn
|
||||||
|
>
|
||||||
|
</v-card-actions>
|
||||||
|
</v-card>
|
||||||
|
</v-dialog>
|
||||||
|
</v-toolbar>
|
||||||
|
</template>
|
||||||
|
<template v-slot:item.type="{ item }">
|
||||||
|
{{ computeType(item.type) }}
|
||||||
|
</template>
|
||||||
<template v-slot:item.price="{ item }">
|
<template v-slot:item.price="{ item }">
|
||||||
{{ item.price ? (item.price / 100).toFixed(2) : '' }}
|
{{ item.price ? (item.price / 100).toFixed(2) : '' }}
|
||||||
</template>
|
</template>
|
||||||
|
@ -33,9 +161,7 @@
|
||||||
}}
|
}}
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:item.price_club_big="{ item }">
|
<template v-slot:item.price_club_big="{ item }">
|
||||||
{{
|
{{ item.price_club_big ? (item.price_club_big / 100).toFixed(2) : '' }}
|
||||||
item.price_club_big ? (item.price_club_big / 100).toFixed(2) : ''
|
|
||||||
}}
|
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:item.premium="{ item }">
|
<template v-slot:item.premium="{ item }">
|
||||||
{{ item.premium ? (item.premium / 100).toFixed(2) : '' }}
|
{{ item.premium ? (item.premium / 100).toFixed(2) : '' }}
|
||||||
|
@ -50,21 +176,95 @@
|
||||||
: ''
|
: ''
|
||||||
}}
|
}}
|
||||||
</template>
|
</template>
|
||||||
|
<template v-slot:item.action="{ item }">
|
||||||
|
<v-icon small class="mr-2" @click="editItem(item)">
|
||||||
|
{{ editIcon }}
|
||||||
|
</v-icon>
|
||||||
|
<v-icon small @click="deleteItem(item)">
|
||||||
|
{{ deleteIcon }}
|
||||||
|
</v-icon>
|
||||||
|
</template>
|
||||||
</v-data-table>
|
</v-data-table>
|
||||||
|
<v-card tile v-if="isGastro">
|
||||||
|
<v-card-title>
|
||||||
|
Kategorien
|
||||||
|
<v-spacer />
|
||||||
|
<v-btn fab x-small @click="dialogType = true" color="primary">
|
||||||
|
<v-icon>{{ plus }}</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</v-card-title>
|
||||||
|
<v-card-text>
|
||||||
|
<div tile v-for="type in types" :key="type.id">
|
||||||
|
<v-card tile>
|
||||||
|
<v-card-text class="black--text">
|
||||||
|
<v-row class="ml-3 mr-3">
|
||||||
|
{{ type.name }}
|
||||||
|
<v-spacer />
|
||||||
|
<v-btn icon @click="editType(type)">
|
||||||
|
<v-icon>
|
||||||
|
{{ editIcon }}
|
||||||
|
</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
<v-btn icon @click="deleteType(type)">
|
||||||
|
<v-icon>
|
||||||
|
{{ deleteIcon }}
|
||||||
|
</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</v-row>
|
||||||
|
</v-card-text>
|
||||||
</v-card>
|
</v-card>
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
|
<v-dialog v-model="dialogType">
|
||||||
|
<v-card>
|
||||||
|
<v-card-title>
|
||||||
|
{{ dialogTypeTitle }}
|
||||||
|
</v-card-title>
|
||||||
|
<v-card-text>
|
||||||
|
<v-container>
|
||||||
|
<v-text-field
|
||||||
|
v-model="editedType.name"
|
||||||
|
outlined
|
||||||
|
label="Name der Kategorie"
|
||||||
|
/>
|
||||||
</v-container>
|
</v-container>
|
||||||
</v-content>
|
</v-card-text>
|
||||||
|
<v-card-actions>
|
||||||
|
<v-spacer />
|
||||||
|
<v-btn text color="blue darken-1" @click="closeType()">
|
||||||
|
Abbrechen
|
||||||
|
</v-btn>
|
||||||
|
<v-btn
|
||||||
|
text
|
||||||
|
color="blue darken-1"
|
||||||
|
@click="saveType()"
|
||||||
|
:disabled="inType(editedType.name)"
|
||||||
|
>
|
||||||
|
Speichern
|
||||||
|
</v-btn>
|
||||||
|
</v-card-actions>
|
||||||
|
</v-card>
|
||||||
|
</v-dialog>
|
||||||
|
</v-card>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters, mapActions } from 'vuex'
|
import { mapGetters, mapActions } from 'vuex'
|
||||||
import { mdiMagnify } from '@mdi/js'
|
import { mdiMagnify, mdiPlus, mdiPencil, mdiDelete } from '@mdi/js'
|
||||||
export default {
|
export default {
|
||||||
name: 'PriceList',
|
name: 'PriceList',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
editIcon: mdiPencil,
|
||||||
|
deleteIcon: mdiDelete,
|
||||||
searchIcon: mdiMagnify,
|
searchIcon: mdiMagnify,
|
||||||
|
plus: mdiPlus,
|
||||||
|
searchType: null,
|
||||||
search: null,
|
search: null,
|
||||||
|
dialog: null,
|
||||||
|
dialogType: null,
|
||||||
|
editedIndex: -1,
|
||||||
headers: [
|
headers: [
|
||||||
{
|
{
|
||||||
text: 'Name',
|
text: 'Name',
|
||||||
|
@ -103,21 +303,188 @@ export default {
|
||||||
value: 'price_extern_club'
|
value: 'price_extern_club'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
items: []
|
editedItem: {
|
||||||
|
name: null,
|
||||||
|
type: { id: -1, name: null },
|
||||||
|
price: null,
|
||||||
|
price_big: null,
|
||||||
|
price_club: null,
|
||||||
|
price_club_big: null,
|
||||||
|
premium: null,
|
||||||
|
premium_club: null,
|
||||||
|
price_extern_club: null
|
||||||
|
},
|
||||||
|
defaultItem: {
|
||||||
|
name: null,
|
||||||
|
type: { id: -1, name: null },
|
||||||
|
price: null,
|
||||||
|
price_big: null,
|
||||||
|
price_club: null,
|
||||||
|
price_club_big: null,
|
||||||
|
premium: null,
|
||||||
|
premium_club: null,
|
||||||
|
price_extern_club: null
|
||||||
|
},
|
||||||
|
editedType: {
|
||||||
|
id: -1,
|
||||||
|
name: null
|
||||||
|
},
|
||||||
|
defaultType: {
|
||||||
|
id: -1,
|
||||||
|
name: null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions({
|
...mapActions({
|
||||||
getPriceList: 'priceList/getPriceList'
|
getPriceList: 'priceList/getPriceList',
|
||||||
})
|
getTypes: 'priceList/getTypes',
|
||||||
|
setDrink: 'priceList/setDrink',
|
||||||
|
updateDrink: 'priceList/updateDrink',
|
||||||
|
deleteDrink: 'priceList/deleteDrink',
|
||||||
|
setDrinkType: 'priceList/setDrinkType',
|
||||||
|
updateDrinkType: 'priceList/updateDrinkType',
|
||||||
|
deleteDrinkType: 'priceList/deleteDrinkType'
|
||||||
|
}),
|
||||||
|
editType(item) {
|
||||||
|
console.log(item)
|
||||||
|
this.editedType = Object.assign({}, item)
|
||||||
|
this.dialogType = true
|
||||||
|
},
|
||||||
|
closeType() {
|
||||||
|
this.dialogType = false
|
||||||
|
setTimeout(() => {
|
||||||
|
this.editedType = Object.assign({}, this.defaultType)
|
||||||
|
}, 300)
|
||||||
|
},
|
||||||
|
saveType() {
|
||||||
|
this.editedType.id === -1
|
||||||
|
? this.setDrinkType(this.editedType)
|
||||||
|
: this.updateDrinkType(this.editedType)
|
||||||
|
this.closeType()
|
||||||
|
},
|
||||||
|
deleteType(item) {
|
||||||
|
confirm('Bist du sicher, dass die diese Kategorie entfernen wills?') &&
|
||||||
|
this.deleteDrinkType({ id: item.id })
|
||||||
|
},
|
||||||
|
addType() {
|
||||||
|
this.setDrinkType({ name: this.searchType })
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
this.dialog = false
|
||||||
|
setTimeout(() => {
|
||||||
|
this.editedItem = Object.assign({}, this.defaultItem)
|
||||||
|
this.editedIndex = -1
|
||||||
|
}, 300)
|
||||||
|
},
|
||||||
|
editItem(item) {
|
||||||
|
this.editedIndex = item.id
|
||||||
|
console.log('item', item)
|
||||||
|
this.editedItem = Object.assign({}, item)
|
||||||
|
for (let i in this.editedItem) {
|
||||||
|
this.editedItem[i] = isNaN(this.editedItem[i])
|
||||||
|
? this.editedItem[i]
|
||||||
|
: this.editedItem[i] == null || this.editedItem[i] == 0
|
||||||
|
? null
|
||||||
|
: (this.editedItem[i] / 100).toFixed(2)
|
||||||
|
}
|
||||||
|
console.log(this.editedItem)
|
||||||
|
this.editedItem.type = Object.assign(
|
||||||
|
{},
|
||||||
|
this.types.find(a => a.id == item.type)
|
||||||
|
)
|
||||||
|
this.dialog = true
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteItem(item) {
|
||||||
|
confirm('Bist du sicher, dass die dieses Getränk entfernen wills?') &&
|
||||||
|
this.deleteDrink({ id: item.id })
|
||||||
|
},
|
||||||
|
save() {
|
||||||
|
console.log(this.editedItem)
|
||||||
|
console.log(this.editedIndex)
|
||||||
|
console.log(!isNaN(this.editedItem.price_extern_club))
|
||||||
|
var drink = {
|
||||||
|
id: this.editedIndex,
|
||||||
|
name: this.editedItem.name,
|
||||||
|
type: this.editedItem.type.id,
|
||||||
|
price: !isNaN(this.editedItem.price)
|
||||||
|
? this.editedItem.price * 100
|
||||||
|
: null,
|
||||||
|
price_big: !isNaN(this.editedItem.price_big)
|
||||||
|
? this.editedItem.price_big * 100
|
||||||
|
: null,
|
||||||
|
price_club: !isNaN(this.editedItem.price_club)
|
||||||
|
? this.editedItem.price_club * 100
|
||||||
|
: null,
|
||||||
|
price_club_big: !isNaN(this.editedItem.price_club_big)
|
||||||
|
? this.editedItem.price_club_big * 100
|
||||||
|
: null,
|
||||||
|
premium: !isNaN(this.editedItem.premium)
|
||||||
|
? this.editedItem.premium * 100
|
||||||
|
: null,
|
||||||
|
premium_club: !isNaN(this.editedItem.premium_club)
|
||||||
|
? this.editedItem.premium_club * 100
|
||||||
|
: null,
|
||||||
|
price_extern_club: !isNaN(this.editedItem.price_extern_club)
|
||||||
|
? this.editedItem.price_extern_club * 100
|
||||||
|
: null
|
||||||
|
}
|
||||||
|
console.log(drink)
|
||||||
|
drink.id === -1 ? this.setDrink(drink) : this.updateDrink(drink)
|
||||||
|
this.editedItem = Object.assign({}, this.defaultItem)
|
||||||
|
this.close()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters({
|
...mapGetters({
|
||||||
priceList: 'priceList/priceList'
|
priceList: 'priceList/priceList',
|
||||||
|
types: 'priceList/types',
|
||||||
|
isGastro: 'isGastro'
|
||||||
|
}),
|
||||||
|
formTitle() {
|
||||||
|
return this.editedIndex === -1 ? 'Neues Getränk' : 'Bearbeite Getränk'
|
||||||
|
},
|
||||||
|
inType() {
|
||||||
|
return text => {
|
||||||
|
return !!this.types.find(a => {
|
||||||
|
if (a.name === null || text === null) {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return a.name.toLowerCase() === text.toLowerCase()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dialogTypeTitle() {
|
||||||
|
return this.editedType.id === -1
|
||||||
|
? 'Neue Kategorie'
|
||||||
|
: 'Bearbeite Kategorie'
|
||||||
|
},
|
||||||
|
computeType() {
|
||||||
|
return id => {
|
||||||
|
return this.types.find(a => {
|
||||||
|
return a.id === id
|
||||||
|
}).name
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.getPriceList()
|
this.getPriceList()
|
||||||
|
if (this.isGastro) {
|
||||||
|
this.headers.push({
|
||||||
|
text: 'Aktion',
|
||||||
|
value: 'action',
|
||||||
|
sortable: false,
|
||||||
|
filterable: false
|
||||||
|
})
|
||||||
|
this.getTypes()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
dialog(val) {
|
||||||
|
val || this.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
<template>
|
||||||
|
<v-list>
|
||||||
|
<v-list-item link to="/main/management/servicemanagement">
|
||||||
|
<v-list-item-icon>
|
||||||
|
<v-icon>{{ work }}</v-icon>
|
||||||
|
</v-list-item-icon>
|
||||||
|
<v-list-item-title>
|
||||||
|
Dienstverwaltung
|
||||||
|
</v-list-item-title>
|
||||||
|
</v-list-item>
|
||||||
|
</v-list>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mdiBriefcase } from '@mdi/js'
|
||||||
|
export default {
|
||||||
|
name: 'ManagementNavigation',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
work: mdiBriefcase
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
|
@ -1,6 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<v-content>
|
|
||||||
<v-toolbar>
|
<v-toolbar>
|
||||||
<v-toolbar-title>
|
<v-toolbar-title>
|
||||||
Dienstverwaltung
|
Dienstverwaltung
|
||||||
|
@ -45,7 +44,6 @@
|
||||||
</v-row>
|
</v-row>
|
||||||
</v-card-text>
|
</v-card-text>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-content>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -100,7 +98,12 @@ export default {
|
||||||
for (var week in this.month) {
|
for (var week in this.month) {
|
||||||
for (var dayint in this.month[week].days) {
|
for (var dayint in this.month[week].days) {
|
||||||
var day = this.month[week].days[dayint]
|
var day = this.month[week].days[dayint]
|
||||||
this.lockDay({year: day.date.getFullYear(), month: day.date.getMonth() + 1, day: day.date.getDate(), locked: value})
|
this.lockDay({
|
||||||
|
year: day.date.getFullYear(),
|
||||||
|
month: day.date.getMonth() + 1,
|
||||||
|
day: day.date.getDate(),
|
||||||
|
locked: value
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
//const main = 'https://192.168.5.128:5000/'
|
//const main = 'https://192.168.5.128:5000/'
|
||||||
//const main = 'http://localhost:5000/'
|
//const main = 'http://localhost:5000/'
|
||||||
//const main = 'http://192.168.5.118:5000/'
|
const main = 'http://192.168.5.118:5000/'
|
||||||
const main = 'https://groeger-clan.duckdns.org:5000/'
|
//const main = 'https://groeger-clan.duckdns.org:5000/'
|
||||||
|
|
||||||
const url = {
|
const url = {
|
||||||
login: main + 'login',
|
login: main + 'login',
|
||||||
pricelist: main + 'pricelist',
|
pricelist: main + 'pricelist',
|
||||||
|
getTypes: main + 'drinkTypes',
|
||||||
getFinanzerMain: main + 'getFinanzerMain',
|
getFinanzerMain: main + 'getFinanzerMain',
|
||||||
bar: main + 'bar',
|
bar: main + 'bar',
|
||||||
barGetUser: main + 'barGetUser',
|
barGetUser: main + 'barGetUser',
|
||||||
|
@ -43,6 +44,14 @@ const url = {
|
||||||
},
|
},
|
||||||
barU: {
|
barU: {
|
||||||
storno: main + 'bar/storno'
|
storno: main + 'bar/storno'
|
||||||
|
},
|
||||||
|
gastro: {
|
||||||
|
setDrink: main + 'gastro/setDrink',
|
||||||
|
updateDrink: main + 'gastro/updateDrink',
|
||||||
|
deleteDrink: main + 'gastro/deleteDrink',
|
||||||
|
setType: main + 'gastro/setDrinkType',
|
||||||
|
updateType: main + 'gastro/updateDrinkType',
|
||||||
|
deleteType: main + 'gastro/deleteDrinkType'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,10 @@ import ServiceManagement from '../components/vorstand/ServiceManagement'
|
||||||
import Config from '@/components/user/Config'
|
import Config from '@/components/user/Config'
|
||||||
import Jobs from '@/components/user/Jobs'
|
import Jobs from '@/components/user/Jobs'
|
||||||
import JobRequests from '@/components/user/JobRequests'
|
import JobRequests from '@/components/user/JobRequests'
|
||||||
import PriceList from "@/components/pricelist/PriceList";
|
import PriceList from '@/components/pricelist/PriceList'
|
||||||
|
import ManagementNavigation from "@/components/vorstand/ManagementNavigation";
|
||||||
|
import GastroNavigation from "@/components/gastro/GastroNavigation";
|
||||||
|
import PriceListView from "@/views/contents/PriceListView";
|
||||||
|
|
||||||
Vue.use(VueRouter)
|
Vue.use(VueRouter)
|
||||||
|
|
||||||
|
@ -26,7 +29,7 @@ const routes = [
|
||||||
{
|
{
|
||||||
path: '/pricelist',
|
path: '/pricelist',
|
||||||
name: 'priceListNoLogin',
|
name: 'priceListNoLogin',
|
||||||
component: PriceList
|
component: PriceListView
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/login',
|
path: '/login',
|
||||||
|
@ -38,10 +41,21 @@ const routes = [
|
||||||
name: 'main',
|
name: 'main',
|
||||||
component: MainView,
|
component: MainView,
|
||||||
children: [
|
children: [
|
||||||
|
{
|
||||||
|
path: 'management',
|
||||||
|
name: 'management',
|
||||||
|
components: { nav: ManagementNavigation, default: BarView},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'servicemanagement',
|
||||||
|
component: ServiceManagement
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: 'user',
|
path: 'user',
|
||||||
name: 'user',
|
name: 'user',
|
||||||
components: { userNav: UserNavigation, default: UserView },
|
components: { nav: UserNavigation, default: UserView },
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'add',
|
path: 'add',
|
||||||
|
@ -73,7 +87,7 @@ const routes = [
|
||||||
{
|
{
|
||||||
path: 'bar',
|
path: 'bar',
|
||||||
name: 'bar',
|
name: 'bar',
|
||||||
components: { userNav: BarNavigation, default: BarView },
|
components: { nav: BarNavigation, default: BarView },
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'geruecht',
|
path: 'geruecht',
|
||||||
|
@ -85,7 +99,7 @@ const routes = [
|
||||||
{
|
{
|
||||||
path: 'finanzer',
|
path: 'finanzer',
|
||||||
name: 'finanzer',
|
name: 'finanzer',
|
||||||
components: { default: FinanzerView, finanzerNav: FinanzerNavigation },
|
components: { default: FinanzerView, nav: FinanzerNavigation },
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'overview',
|
path: 'overview',
|
||||||
|
@ -96,10 +110,18 @@ const routes = [
|
||||||
name: 'activeUser',
|
name: 'activeUser',
|
||||||
props: true,
|
props: true,
|
||||||
component: User
|
component: User
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'servicemanagement',
|
path: 'gastro',
|
||||||
component: ServiceManagement
|
name: 'gastro',
|
||||||
|
components: { nav: GastroNavigation, default: BarView},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'pricelist',
|
||||||
|
name: 'gastroPricelist',
|
||||||
|
component: PriceList
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,27 +115,41 @@ const getters = {
|
||||||
},
|
},
|
||||||
isBar: state => {
|
isBar: state => {
|
||||||
try {
|
try {
|
||||||
return state.user.group.includes('bar') ? true : false
|
return state.user.group.includes('bar')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
isFinanzer: state => {
|
isFinanzer: state => {
|
||||||
try {
|
try {
|
||||||
return state.user.group.includes('moneymaster') ? true : false
|
return state.user.group.includes('moneymaster')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
isUser: state => {
|
isUser: state => {
|
||||||
try {
|
try {
|
||||||
return state.user.group.includes('user') ? true : false
|
return state.user.group.includes('user')
|
||||||
|
} catch (e) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
isGastro: state => {
|
||||||
|
try {
|
||||||
|
return state.user.group.includes('gastro')
|
||||||
|
} catch (e) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
isManagement: state => {
|
||||||
|
try {
|
||||||
|
return state.user.group.includes('management') || state.user.group.includes('gastro') || state.user.group.includes('moneymaster')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
isLoggedIn: state => {
|
isLoggedIn: state => {
|
||||||
return state.user.accessToken ? true : false
|
return state.user.accessToken
|
||||||
},
|
},
|
||||||
user: state => {
|
user: state => {
|
||||||
return state.user
|
return state.user
|
||||||
|
|
|
@ -2,12 +2,87 @@ import url from '@/plugins/routes'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
priceList: []
|
priceList: [],
|
||||||
|
types: []
|
||||||
}
|
}
|
||||||
|
|
||||||
const mutations = {
|
const mutations = {
|
||||||
setPriceList: (state, priceList) => {
|
setPriceList: (state, priceList) => {
|
||||||
state.priceList = priceList
|
state.priceList = priceList
|
||||||
|
},
|
||||||
|
setTypes: (state, types) => {
|
||||||
|
state.types = types
|
||||||
|
state.types.sort((a, b) => {
|
||||||
|
const low = b.name.toLowerCase()
|
||||||
|
const high = a.name.toLowerCase()
|
||||||
|
if (high < low) return -1
|
||||||
|
if (high > low) return 1
|
||||||
|
return 0
|
||||||
|
})
|
||||||
|
},
|
||||||
|
updatePriceList: (state, drink) => {
|
||||||
|
var a = state.priceList.find(b => {
|
||||||
|
return b.id === drink.id
|
||||||
|
})
|
||||||
|
if (a) {
|
||||||
|
a.name = drink.name
|
||||||
|
a.type = drink.type
|
||||||
|
a.price = drink.price
|
||||||
|
a.price_big = drink.price_big
|
||||||
|
a.price_club = drink.price_club
|
||||||
|
a.price_club_big = drink.price_club_big
|
||||||
|
a.premium = drink.premium
|
||||||
|
a.premium_club = drink.premium_club
|
||||||
|
a.price_extern_club = drink.price_extern_club
|
||||||
|
} else {
|
||||||
|
state.priceList.push({
|
||||||
|
id: drink.id,
|
||||||
|
name: drink.name,
|
||||||
|
type: drink.type,
|
||||||
|
price: drink.price,
|
||||||
|
price_big: drink.price_big,
|
||||||
|
price_club: drink.price_club,
|
||||||
|
price_club_big: drink.price_club_big,
|
||||||
|
premium: drink.premium,
|
||||||
|
premium_club: drink.premium_club,
|
||||||
|
price_extern_club: drink.price_extern_club
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deleteDrinkPrice: (state, data) => {
|
||||||
|
var index = state.priceList.indexOf(
|
||||||
|
state.priceList.find(a => {
|
||||||
|
return a.id === data.id
|
||||||
|
})
|
||||||
|
)
|
||||||
|
state.priceList.splice(index, 1)
|
||||||
|
},
|
||||||
|
updateDrinkType: (state, type) => {
|
||||||
|
var a = state.types.find(b => {
|
||||||
|
return b.id === type.id
|
||||||
|
})
|
||||||
|
if (a) {
|
||||||
|
a.name = type.name
|
||||||
|
} else {
|
||||||
|
state.types.push({
|
||||||
|
...type
|
||||||
|
})
|
||||||
|
}
|
||||||
|
state.types.sort((a, b) => {
|
||||||
|
const low = b.name.toLowerCase()
|
||||||
|
const high = a.name.toLowerCase()
|
||||||
|
if (high < low) return -1
|
||||||
|
if (high > low) return 1
|
||||||
|
return 0
|
||||||
|
})
|
||||||
|
},
|
||||||
|
deleteDrinkType: (state, type) => {
|
||||||
|
var index = state.types.indexOf(
|
||||||
|
state.types.find(a => {
|
||||||
|
return a.id === type.id
|
||||||
|
})
|
||||||
|
)
|
||||||
|
state.types.splice(index, 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,12 +94,102 @@ const actions = {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
async getTypes({ commit, dispatch }) {
|
||||||
|
try {
|
||||||
|
const response = await axios.get(url.getTypes)
|
||||||
|
commit('setTypes', response.data)
|
||||||
|
} catch (e) {
|
||||||
|
if (e.response)
|
||||||
|
if (e.response.status === 401) dispatch('logout', null, { root: true })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setDrink({ commit, rootState, dispatch }, data) {
|
||||||
|
try {
|
||||||
|
const response = await axios.post(
|
||||||
|
url.gastro.setDrink,
|
||||||
|
{ ...data },
|
||||||
|
{ headers: { Token: rootState.login.user.accessToken } }
|
||||||
|
)
|
||||||
|
commit('updatePriceList', response.data)
|
||||||
|
} catch (e) {
|
||||||
|
if (e.response)
|
||||||
|
if (e.response.status === 401) dispatch('logout', null, { root: true })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async updateDrink({ commit, rootState, dispatch }, data) {
|
||||||
|
try {
|
||||||
|
const response = await axios.post(
|
||||||
|
url.gastro.updateDrink,
|
||||||
|
{ ...data },
|
||||||
|
{ headers: { Token: rootState.login.user.accessToken } }
|
||||||
|
)
|
||||||
|
commit('updatePriceList', response.data)
|
||||||
|
} catch (e) {
|
||||||
|
if (e.response)
|
||||||
|
if (e.response.status === 401) dispatch('logout', null, { root: true })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async deleteDrink({ commit, rootState, dispatch }, data) {
|
||||||
|
try {
|
||||||
|
await axios.post(
|
||||||
|
url.gastro.deleteDrink,
|
||||||
|
{ ...data },
|
||||||
|
{ headers: { Token: rootState.login.user.accessToken } }
|
||||||
|
)
|
||||||
|
commit('deleteDrinkPrice', data)
|
||||||
|
} catch (e) {
|
||||||
|
if (e.response)
|
||||||
|
if (e.response.status === 401) dispatch('logout', null, { root: true })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setDrinkType({ commit, rootState, dispatch }, data) {
|
||||||
|
try {
|
||||||
|
const response = await axios.post(
|
||||||
|
url.gastro.setType,
|
||||||
|
{ ...data },
|
||||||
|
{ headers: { Token: rootState.login.user.accessToken } }
|
||||||
|
)
|
||||||
|
commit('updateDrinkType', response.data)
|
||||||
|
} catch (e) {
|
||||||
|
if (e.response)
|
||||||
|
if (e.response.status === 401) dispatch('logout', null, { root: true })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async updateDrinkType({ commit, rootState, dispatch }, data) {
|
||||||
|
try {
|
||||||
|
const response = await axios.post(
|
||||||
|
url.gastro.updateType,
|
||||||
|
{ ...data },
|
||||||
|
{ headers: { Token: rootState.login.user.accessToken } }
|
||||||
|
)
|
||||||
|
commit('updateDrinkType', response.data)
|
||||||
|
} catch (e) {
|
||||||
|
if (e.response)
|
||||||
|
if (e.response.status === 401) dispatch('logout', null, { root: true })
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async deleteDrinkType({ commit, rootState, dispatch }, data) {
|
||||||
|
try {
|
||||||
|
await axios.post(
|
||||||
|
url.gastro.deleteType,
|
||||||
|
{ ...data },
|
||||||
|
{ headers: { Token: rootState.login.user.accessToken } }
|
||||||
|
)
|
||||||
|
commit('deleteDrinkType', data)
|
||||||
|
} catch (e) {
|
||||||
|
if (e.response)
|
||||||
|
if (e.response.status === 401) dispatch('logout', null, { root: true })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const getters = {
|
const getters = {
|
||||||
priceList: state => {
|
priceList: state => {
|
||||||
return state.priceList
|
return state.priceList
|
||||||
|
},
|
||||||
|
types: state => {
|
||||||
|
return state.types
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,22 @@
|
||||||
Bar
|
Bar
|
||||||
</v-list-item-title>
|
</v-list-item-title>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
|
<v-list-item v-if="isManagement" class="title" link to="/main/management/servicemanagement">
|
||||||
|
<v-list-item-icon>
|
||||||
|
<v-icon>{{king}}</v-icon>
|
||||||
|
</v-list-item-icon>
|
||||||
|
<v-list-item-title>
|
||||||
|
Vorstand
|
||||||
|
</v-list-item-title>
|
||||||
|
</v-list-item>
|
||||||
|
<v-list-item v-if="isGastro" class="title" link to="/main/gastro/pricelist">
|
||||||
|
<v-list-item-icon>
|
||||||
|
<v-icon>{{gastro}}</v-icon>
|
||||||
|
</v-list-item-icon>
|
||||||
|
<v-list-item-title>
|
||||||
|
Gastro
|
||||||
|
</v-list-item-title>
|
||||||
|
</v-list-item>
|
||||||
<v-list-item v-if="isFinanzer" class="title" link to="/main/finanzer/overview">
|
<v-list-item v-if="isFinanzer" class="title" link to="/main/finanzer/overview">
|
||||||
<v-list-item-icon>
|
<v-list-item-icon>
|
||||||
<v-icon>{{attach_money}}</v-icon>
|
<v-icon>{{attach_money}}</v-icon>
|
||||||
|
@ -32,9 +48,7 @@
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
<v-divider />
|
<v-divider />
|
||||||
<router-view name="finanzerNav" />
|
<router-view name="nav" />
|
||||||
<router-view name="userNav"/>
|
|
||||||
<router-view name="barNav"/>
|
|
||||||
<template v-slot:append>
|
<template v-slot:append>
|
||||||
<v-list>
|
<v-list>
|
||||||
<v-list-item>
|
<v-list-item>
|
||||||
|
@ -54,7 +68,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapActions, mapGetters } from 'vuex'
|
import { mapActions, mapGetters } from 'vuex'
|
||||||
import {mdiAccount, mdiCurrencyEur, mdiExitToApp, mdiGlassCocktail} from '@mdi/js'
|
import {mdiAccount, mdiCurrencyEur, mdiExitToApp, mdiGlassCocktail, mdiChessKing, mdiFoodForkDrink} from '@mdi/js'
|
||||||
export default {
|
export default {
|
||||||
name: 'MainView',
|
name: 'MainView',
|
||||||
data () {
|
data () {
|
||||||
|
@ -62,7 +76,9 @@ export default {
|
||||||
person: mdiAccount,
|
person: mdiAccount,
|
||||||
attach_money: mdiCurrencyEur,
|
attach_money: mdiCurrencyEur,
|
||||||
exit_to_app: mdiExitToApp,
|
exit_to_app: mdiExitToApp,
|
||||||
glass_cocktail: mdiGlassCocktail
|
glass_cocktail: mdiGlassCocktail,
|
||||||
|
king: mdiChessKing,
|
||||||
|
gastro: mdiFoodForkDrink
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: { },
|
components: { },
|
||||||
|
@ -79,6 +95,8 @@ export default {
|
||||||
isBar: 'isBar',
|
isBar: 'isBar',
|
||||||
isUser: 'isUser',
|
isUser: 'isUser',
|
||||||
isFinanzer: 'isFinanzer',
|
isFinanzer: 'isFinanzer',
|
||||||
|
isGastro: 'isGastro',
|
||||||
|
isManagement: 'isManagement',
|
||||||
isLoggedIn: 'isLoggedIn',
|
isLoggedIn: 'isLoggedIn',
|
||||||
user: 'user'
|
user: 'user'
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
<template>
|
||||||
|
<v-content>
|
||||||
|
<PriceList />
|
||||||
|
</v-content>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import PriceList from "@/components/pricelist/PriceList";
|
||||||
|
export default {
|
||||||
|
name: "PriceListView",
|
||||||
|
components: {PriceList}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
Loading…
Reference in New Issue