Löschen, Modifizieren und Hinzufügen von Freigetränken
Der Vorstand kann nun Freigetränke löschen, modifizieren und hinzufügen.
This commit is contained in:
		
							parent
							
								
									a28bbe8e0a
								
							
						
					
					
						commit
						8a442d029b
					
				| 
						 | 
				
			
			@ -9,83 +9,121 @@
 | 
			
		|||
          <template
 | 
			
		||||
              v-for="(free_drink_config, index) in free_drink_list_config">
 | 
			
		||||
            <v-list-item
 | 
			
		||||
                :key="index">
 | 
			
		||||
                :key="free_drink_config.label"
 | 
			
		||||
            >
 | 
			
		||||
              <v-list-item-content>
 | 
			
		||||
                <v-row>
 | 
			
		||||
                  <v-col>
 | 
			
		||||
                    <v-text-field
 | 
			
		||||
                        outlined
 | 
			
		||||
                        label="Label"
 | 
			
		||||
                        :value="free_drink_config.label"
 | 
			
		||||
                    />
 | 
			
		||||
                  </v-col>
 | 
			
		||||
                  <v-col>
 | 
			
		||||
                    <v-autocomplete
 | 
			
		||||
                        outlined
 | 
			
		||||
                        label="Zugeordnetes Getränk"
 | 
			
		||||
                        :items="priceList"
 | 
			
		||||
                        :item-text="item => {return item.name + '/' + (item.price_club/100).toFixed(2) + '€'}"
 | 
			
		||||
                        item-value="id"
 | 
			
		||||
                        :value="free_drink_config.drink"
 | 
			
		||||
                    />
 | 
			
		||||
                  </v-col>
 | 
			
		||||
                  <v-col>
 | 
			
		||||
                    <v-autocomplete
 | 
			
		||||
                        outlined
 | 
			
		||||
                        label="Freigetränkaufnahme"
 | 
			
		||||
                        multiple
 | 
			
		||||
                        :items="free_drink_types"
 | 
			
		||||
                        item-text="name"
 | 
			
		||||
                        item-value="id"
 | 
			
		||||
                        :value="free_drink_config.free_drink_types"
 | 
			
		||||
                    />
 | 
			
		||||
                  </v-col>
 | 
			
		||||
                  <v-col>
 | 
			
		||||
                    <v-text-field
 | 
			
		||||
                        outlined
 | 
			
		||||
                        label="Preis in €"
 | 
			
		||||
                        type="number"
 | 
			
		||||
                        :value="(free_drink_config.price / 100).toFixed(2)"
 | 
			
		||||
                    />
 | 
			
		||||
                  </v-col>
 | 
			
		||||
                </v-row>
 | 
			
		||||
                <FreeDrinkListConfigConfigItem :free_drink_config="free_drink_config" @save="save" @delete_free_drink_list_config="delete_free_drink_config" />
 | 
			
		||||
              </v-list-item-content>
 | 
			
		||||
            </v-list-item>
 | 
			
		||||
            <v-divider
 | 
			
		||||
                v-if="index + 1 < free_drink_list_config.length"
 | 
			
		||||
                v-if="(index + 1 < free_drink_list_config.length) || new_free_drink_list_config"
 | 
			
		||||
                :key="index"
 | 
			
		||||
            />
 | 
			
		||||
          </template>
 | 
			
		||||
          <v-list-item v-if="new_free_drink_list_config">
 | 
			
		||||
            <v-list-item-content>
 | 
			
		||||
              <FreeDrinkListConfigConfigItem :free_drink_config="default_model" @save="save" @delete_free_drink_config="new_free_drink_list_config=false"/>
 | 
			
		||||
            </v-list-item-content>
 | 
			
		||||
          </v-list-item>
 | 
			
		||||
        </v-list>
 | 
			
		||||
      </v-card-text>
 | 
			
		||||
      <v-card-actions>
 | 
			
		||||
        <v-btn @click="log">
 | 
			
		||||
          LOG
 | 
			
		||||
        <v-spacer />
 | 
			
		||||
        <v-btn fab color="success" @click="new_free_drink_list_config=true" v-if="!new_free_drink_list_config">
 | 
			
		||||
          <v-icon>mdi-plus</v-icon>
 | 
			
		||||
        </v-btn>
 | 
			
		||||
      </v-card-actions>
 | 
			
		||||
    </v-card>
 | 
			
		||||
    <v-card tile>
 | 
			
		||||
      <v-card-title>Gründe für Freigetränke</v-card-title>
 | 
			
		||||
    </v-card>
 | 
			
		||||
 | 
			
		||||
    <v-dialog v-model="check_delete_free_drink_list_config" max-width="400">
 | 
			
		||||
        <v-card>
 | 
			
		||||
          <v-card-title>
 | 
			
		||||
            Wirklich löschen?
 | 
			
		||||
          </v-card-title>
 | 
			
		||||
          <v-card-text>
 | 
			
		||||
            Willst du wirklich <span class="font-weight-black">{{check_model.label}}</span> mit dem Getränk <span class="font-weight-black">{{check_model.drink.name}}</span> löschen?
 | 
			
		||||
            Wenn du dies löscht, wird auch der ganze Verlauf gelöscht. Dh. es ist nicht mehr vollständig nachvollziehbar, was getrunken wurde.
 | 
			
		||||
          </v-card-text>
 | 
			
		||||
          <v-card-actions>
 | 
			
		||||
            <v-spacer/>
 | 
			
		||||
            <v-btn @click="cancel_delete()">Abbrechen</v-btn>
 | 
			
		||||
            <v-btn @click="accept_delete()" color="error">Löschen</v-btn>
 | 
			
		||||
          </v-card-actions>
 | 
			
		||||
        </v-card>
 | 
			
		||||
    </v-dialog>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { mapGetters } from 'vuex'
 | 
			
		||||
import { mapGetters, mapActions} from 'vuex'
 | 
			
		||||
import FreeDrinkListConfigConfigItem
 | 
			
		||||
  from '@/components/vorstand/FreeDrinkList/FreeDrinkListConfigComponents/FreeDrinkListConfigConfigItem'
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'FreeDrinkListConfig',
 | 
			
		||||
  components: { FreeDrinkListConfigConfigItem },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      new_free_drink_list_config: false,
 | 
			
		||||
      default_model: {
 | 
			
		||||
        id: -1,
 | 
			
		||||
        label: null,
 | 
			
		||||
        free_drink_types: null,
 | 
			
		||||
        drink: null,
 | 
			
		||||
        price: null
 | 
			
		||||
      },
 | 
			
		||||
      check_model: {
 | 
			
		||||
        label: null,
 | 
			
		||||
        drink: {name: null}
 | 
			
		||||
      },
 | 
			
		||||
      default_check_model: {
 | 
			
		||||
        label: null,
 | 
			
		||||
        drink: {name: null}
 | 
			
		||||
      },
 | 
			
		||||
      check_delete_free_drink_list_config: false
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    ...mapActions('freeDrinkList', ['set_free_drink_list_config', 'delete_free_drink_list_config', 'update_free_drink_list_config']),
 | 
			
		||||
    log() {
 | 
			
		||||
      console.log(this.free_drink_list_config)
 | 
			
		||||
    },
 | 
			
		||||
    reset(free_drink_config) {
 | 
			
		||||
      let data = this.model.find(item => {
 | 
			
		||||
        return item.id == free_drink_config.id
 | 
			
		||||
      })
 | 
			
		||||
      this.set_free_drink_config(data.origin)
 | 
			
		||||
      this.model.splice(this.model.indexOf(data), 1)
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    cancel_delete() {
 | 
			
		||||
      this.check_delete_free_drink_list_config = false
 | 
			
		||||
      this.check_model = Object.assign({}, this.default_check_model)
 | 
			
		||||
    },
 | 
			
		||||
    accept_delete() {
 | 
			
		||||
      this.delete_free_drink_list_config(this.check_model)
 | 
			
		||||
      this.cancel_delete()
 | 
			
		||||
    },
 | 
			
		||||
    delete_free_drink_config(free_drink_config) {
 | 
			
		||||
      Object.assign(this.check_model, free_drink_config)
 | 
			
		||||
      this.check_delete_free_drink_list_config = true
 | 
			
		||||
      console.log(this.check_delete_free_drink_list_config)
 | 
			
		||||
    },
 | 
			
		||||
    save(free_drink_config) {
 | 
			
		||||
      if (free_drink_config.id > 0) {
 | 
			
		||||
        this.update_free_drink_list_config(free_drink_config)
 | 
			
		||||
      } else {
 | 
			
		||||
        this.set_free_drink_list_config(free_drink_config)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapGetters('freeDrinkList', [
 | 
			
		||||
      'free_drink_list_config',
 | 
			
		||||
      'free_drink_list_reasons',
 | 
			
		||||
        'free_drink_types'
 | 
			
		||||
    ]),
 | 
			
		||||
    ...mapGetters('priceList', ["priceList"])
 | 
			
		||||
      'free_drink_list_reasons'
 | 
			
		||||
    ])
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,116 @@
 | 
			
		|||
<template>
 | 
			
		||||
<div>
 | 
			
		||||
  <v-form :ref="free_drink_config.id">
 | 
			
		||||
    <v-row>
 | 
			
		||||
      <v-col>
 | 
			
		||||
        <v-text-field
 | 
			
		||||
            outlined
 | 
			
		||||
            label="Label"
 | 
			
		||||
            :value="free_drink_config.label"
 | 
			
		||||
            @change="set_model($event, 'label')"
 | 
			
		||||
        />
 | 
			
		||||
      </v-col>
 | 
			
		||||
      <v-col>
 | 
			
		||||
        <v-autocomplete
 | 
			
		||||
            outlined
 | 
			
		||||
            label="Zugeordnetes Getränk"
 | 
			
		||||
            :items="priceList"
 | 
			
		||||
            :item-text="item => {return item.name + '/' + (item.price_club/100).toFixed(2) + '€'}"
 | 
			
		||||
            item-value="id"
 | 
			
		||||
            :value="free_drink_config.drink"
 | 
			
		||||
            @change="set_model($event, 'drink')"
 | 
			
		||||
            return-object
 | 
			
		||||
        />
 | 
			
		||||
      </v-col>
 | 
			
		||||
      <v-col>
 | 
			
		||||
        <v-autocomplete
 | 
			
		||||
            outlined
 | 
			
		||||
            label="Freigetränkaufnahme"
 | 
			
		||||
            multiple
 | 
			
		||||
            :items="free_drink_types"
 | 
			
		||||
            item-text="name"
 | 
			
		||||
            item-value="id"
 | 
			
		||||
            :value="free_drink_config.free_drink_types"
 | 
			
		||||
            return-object
 | 
			
		||||
            @change="set_model($event, 'free_drink_types')"
 | 
			
		||||
        />
 | 
			
		||||
      </v-col>
 | 
			
		||||
      <v-col>
 | 
			
		||||
        <v-text-field
 | 
			
		||||
            outlined
 | 
			
		||||
            label="Preis in €"
 | 
			
		||||
            type="number"
 | 
			
		||||
            :value="(free_drink_config.price/100).toFixed(2)"
 | 
			
		||||
            @change="set_model(Math.round($event*100), 'price')"
 | 
			
		||||
        />
 | 
			
		||||
      </v-col>
 | 
			
		||||
    </v-row>
 | 
			
		||||
  </v-form>
 | 
			
		||||
  <v-row justify="end">
 | 
			
		||||
    <v-btn
 | 
			
		||||
        v-if="free_drink_config.id > 0"
 | 
			
		||||
        icon
 | 
			
		||||
        class="mr-3"
 | 
			
		||||
        @click="$emit('delete_free_drink_list_config', free_drink_config)">
 | 
			
		||||
      <v-icon>mdi-delete</v-icon>
 | 
			
		||||
    </v-btn>
 | 
			
		||||
    <v-btn
 | 
			
		||||
      v-else
 | 
			
		||||
      fab
 | 
			
		||||
      color="error"
 | 
			
		||||
      x-small
 | 
			
		||||
      class="mr-4"
 | 
			
		||||
      @click="$emit('delete_free_drink_config')"
 | 
			
		||||
      >
 | 
			
		||||
      <v-icon>mdi-minus</v-icon>
 | 
			
		||||
    </v-btn>
 | 
			
		||||
    <v-btn
 | 
			
		||||
        v-if="!is_same || free_drink_config.id < 0"
 | 
			
		||||
        class="mr-3"
 | 
			
		||||
        color="success"
 | 
			
		||||
        @click="() => {$emit('save', model); $emit('delete_free_drink_config'); model = null}"
 | 
			
		||||
    >
 | 
			
		||||
      Save
 | 
			
		||||
    </v-btn>
 | 
			
		||||
  </v-row>
 | 
			
		||||
</div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import {mapGetters} from 'vuex'
 | 
			
		||||
export default {
 | 
			
		||||
name: "FreeDrinkListConfigConfigItem",
 | 
			
		||||
  props: ['free_drink_config'],
 | 
			
		||||
  data() {
 | 
			
		||||
  return {
 | 
			
		||||
    model: null
 | 
			
		||||
  }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    set_model(event, type) {
 | 
			
		||||
      console.log(!!this.model)
 | 
			
		||||
      if (!this.model) {
 | 
			
		||||
        this.model = Object.assign({}, this.free_drink_config)
 | 
			
		||||
      }
 | 
			
		||||
      if (type == 'drink') {
 | 
			
		||||
        this.model.drink_id = event.id
 | 
			
		||||
      }
 | 
			
		||||
      this.model[type] = event
 | 
			
		||||
      console.log(this.model)
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
  ...mapGetters('freeDrinkList', [
 | 
			
		||||
    'free_drink_types']),
 | 
			
		||||
    ...mapGetters('priceList', ["priceList"]),
 | 
			
		||||
    is_same() {
 | 
			
		||||
      console.log(this.model ? 'yo': 'no')
 | 
			
		||||
      return this.model ? JSON.stringify(this.model) == JSON.stringify(this.free_drink_config) : true
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ const url = {
 | 
			
		|||
  deleteDrinkListHistory: main + 'deleteDrinkListHistory',
 | 
			
		||||
  freeDrinkListReasons: main + 'freeDrinkListReasons',
 | 
			
		||||
  freeDrinkTypes: main + 'freeDrinkTypes',
 | 
			
		||||
  deleteFreeDrinkListConfig: main + 'deleteFreeDrinkListConfig',
 | 
			
		||||
  vorstand: {
 | 
			
		||||
    sm: {
 | 
			
		||||
      addUser: main + 'sm/addUser',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,12 @@ const mutations = {
 | 
			
		|||
  },
 | 
			
		||||
  set_free_drink_types_loading(state, loading) {
 | 
			
		||||
    state.free_drink_types_loading = loading
 | 
			
		||||
  },
 | 
			
		||||
  set_free_drink_config(state, data) {
 | 
			
		||||
    let config = state.free_drink_list_config.find(item => {
 | 
			
		||||
      return item.id == data.id
 | 
			
		||||
    })
 | 
			
		||||
    Object.assign(config, data)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -185,6 +191,63 @@ const actions = {
 | 
			
		|||
    } finally {
 | 
			
		||||
      commit('set_free_drink_types_loading', false)
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  async set_free_drink_list_config({commit, dispatch, rootState}, data) {
 | 
			
		||||
    try {
 | 
			
		||||
      commit('set_free_drink_list_config_loading', true)
 | 
			
		||||
      const response = await axios.post(url.freeDrinkListConfig, {...data},{
 | 
			
		||||
        headers: { Token: rootState.login.user.accessToken },
 | 
			
		||||
        timeout
 | 
			
		||||
      })
 | 
			
		||||
      commit('set_free_drink_list_config', response.data)
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      dispatch('connectionError/addError', null, { root: true })
 | 
			
		||||
      if (e.message == 'Network Error') {
 | 
			
		||||
        dispatch('connectionError/addError', null, { root: true })
 | 
			
		||||
      }
 | 
			
		||||
      if (e.response)
 | 
			
		||||
        if (e.response.status === 401) dispatch('logout', null, { root: true })
 | 
			
		||||
    } finally {
 | 
			
		||||
      commit('set_free_drink_list_config_loading', false)
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  async update_free_drink_list_config({commit, dispatch, rootState}, data) {
 | 
			
		||||
    try {
 | 
			
		||||
      commit('set_free_drink_list_config_loading', true)
 | 
			
		||||
      const response = await axios.put(url.freeDrinkListConfig, {...data},{
 | 
			
		||||
        headers: { Token: rootState.login.user.accessToken },
 | 
			
		||||
        timeout
 | 
			
		||||
      })
 | 
			
		||||
      commit('set_free_drink_list_config', response.data)
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      dispatch('connectionError/addError', null, { root: true })
 | 
			
		||||
      if (e.message == 'Network Error') {
 | 
			
		||||
        dispatch('connectionError/addError', null, { root: true })
 | 
			
		||||
      }
 | 
			
		||||
      if (e.response)
 | 
			
		||||
        if (e.response.status === 401) dispatch('logout', null, { root: true })
 | 
			
		||||
    } finally {
 | 
			
		||||
      commit('set_free_drink_list_config_loading', false)
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  async delete_free_drink_list_config({commit, dispatch, rootState}, data) {
 | 
			
		||||
    try {
 | 
			
		||||
      commit('set_free_drink_list_config_loading', true)
 | 
			
		||||
      const response = await axios.post(url.deleteFreeDrinkListConfig, {...data},{
 | 
			
		||||
        headers: { Token: rootState.login.user.accessToken },
 | 
			
		||||
        timeout
 | 
			
		||||
      })
 | 
			
		||||
      commit('set_free_drink_list_config', response.data)
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      dispatch('connectionError/addError', null, { root: true })
 | 
			
		||||
      if (e.message == 'Network Error') {
 | 
			
		||||
        dispatch('connectionError/addError', null, { root: true })
 | 
			
		||||
      }
 | 
			
		||||
      if (e.response)
 | 
			
		||||
        if (e.response.status === 401) dispatch('logout', null, { root: true })
 | 
			
		||||
    } finally {
 | 
			
		||||
      commit('set_free_drink_list_config_loading', false)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -267,6 +330,9 @@ const getters = {
 | 
			
		|||
  },
 | 
			
		||||
  free_drink_types_loading(state) {
 | 
			
		||||
    return state.free_drink_types_loading
 | 
			
		||||
  },
 | 
			
		||||
  free_drink_list_config_by_id: (state) => (id) => {
 | 
			
		||||
    return state.free_drink_list_config.find(item => { return item.id == id})
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue