<template> <div> <v-dialog v-model="editUser"> <v-card> <v-card-title> {{ this.editedItem.firstname + ' ' + this.editedItem.lastname + ' bearbeiten' }} </v-card-title> <v-card-text> <v-container> <v-row> <v-col> <v-autocomplete v-model="editedItem.statusgroup" label="Status" outlined :items="status" item-value="id" item-text="name" return-object @change="clickItem(editedItem.statusgroup)" > </v-autocomplete> </v-col> <v-col> <v-autocomplete v-model="editedItem.voting" label="Stimmrecht" outlined :items="[ { value: true, text: 'ja' }, { value: false, text: 'nein' } ]" item-text="text" item-value="value" :disabled="disableVoting" return-object /> </v-col> </v-row> </v-container> </v-card-text> <v-card-actions> <v-spacer /> <v-btn color="primary" text @click="close()">Abbrechen</v-btn> <v-btn color="primary" text @click="save()">Speichern</v-btn> </v-card-actions> </v-card> </v-dialog> <v-data-table :headers="header" :items="users" :search="search" :loading="usersLoading || statusLoading"> <template v-slot:top> <v-toolbar flat color="white"> <v-toolbar-title>Mitgliederliste</v-toolbar-title> <v-spacer></v-spacer> <v-text-field v-model="search" label="Sucher Mitglied" single-line hide-details > <template v-slot:append> <v-icon>{{ searchIcon }}</v-icon> </template> </v-text-field> </v-toolbar> </template> <template v-slot:item.statusgroup="{ item }"> {{ computeStatus(item.statusgroup) }} </template> <template v-slot:item.voting="{ item }"> <v-chip small :color="item.voting ? 'green' : 'red'"> {{ item.voting ? 'ja' : 'nein' }} </v-chip> </template> <template v-slot:item.actions="{ item }"> <v-icon small @click="editItem(item)">{{ editIcon }}</v-icon> </template> </v-data-table> <v-divider /> <v-card> <v-card-text> <v-container> <v-row> <v-col v-bind:class="{ fulllineText: isFulllineText }"> <v-text-field outlined :value="users.length" label="Anzahl aller Mitglieder" readonly /> </v-col> <v-col v-bind:class="{ fulllineText: isFulllineText }"> <v-text-field outlined :value="allActiveUsers" label="Anzahl aller aktiven Mitglieder" readonly /> </v-col> <v-col v-bind:class="{ fulllineText: isFulllineText }"> <v-text-field outlined :value="allVotings" label="Anzahl aller Stimmberechtigten" readonly /> </v-col> </v-row> </v-container> </v-card-text> </v-card> </div> </template> <script> import { mdiPencil, mdiMagnify, } from '@mdi/js' import { mapActions, mapGetters } from 'vuex' export default { name: 'UserManager', data() { return { editIcon: mdiPencil, searchIcon: mdiMagnify, isFulllineText: false, editUser: false, disableVoting: null, search: null, header: [ { text: 'Nachname', value: 'lastname' }, { text: 'Vorname(n)', value: 'firstname' }, { text: 'Status', value: 'statusgroup' }, { text: 'Stimmrecht', value: 'voting' }, { text: 'Aktionen', value: 'actions', sortable: false, filterable: false } ], editedItem: { id: -1, firstname: null, lastname: null, username: null, statusgroup: { id: -1, name: null }, voting: { value: false, text: 'nein' } }, defaultItem: { id: -1, username: null, statusgroup: { id: -1, name: null }, voting: { value: false, text: 'nein' } } } }, mounted() { this.$nextTick(function() { window.addEventListener('resize', this.getWindowWidth); this.getWindowWidth() }) }, methods: { ...mapActions({ getUsers: 'usermanager/getUsers', getStatus: 'usermanager/getStatus', updateStatusUser: 'usermanager/updateStatusUser', updateVoting: 'usermanager/updateVoting' }), getWindowWidth() { this.isFulllineText = document.documentElement.clientWidth <= 750; }, close() { this.editUser = false setTimeout(() => { this.editedItem = Object.assign({}, this.defaultItem) }, 300) }, editItem(item) { this.editedItem = Object.assign({}, item) this.editedItem.statusgroup = Object.assign( {}, this.status.find(a => a.id == item.statusgroup) ) this.editedItem.voting = Object.assign({}, item.voting ? {value: true, text: 'ja'} : {value: false, text: 'nein'}) this.clickItem(this.editedItem.statusgroup) this.editUser = true }, clickItem(item) { switch (item.id) { case 1: this.editedItem.voting = { value: true, text: 'ja' } this.disableVoting = true break case 2: this.disableVoting = false break case 3: this.disableVoting = true this.editedItem.voting = { value: false, text: 'nein' } break case 4: this.editedItem.voting = { value: false, text: 'nein' } this.disableVoting = true break case 5: this.editedItem.voting = { value: false, text: 'nein' } this.disableVoting = true break } }, save() { this.updateStatusUser({username: this.editedItem.username, status: this.editedItem.statusgroup}) this.updateVoting({username: this.editedItem.username, voting: this.editedItem.voting.value}) this.close() } }, computed: { ...mapGetters({ users: 'usermanager/users', status: 'usermanager/status', usersLoading: 'usermanager/usersLoading', statusLoading: 'usermanager/statusLoading' }), computeStatus() { return id => { return this.status.find(a => { return a.id === id }).name } }, allVotings() { return this.users.filter(a => { return a.voting }).length }, allActiveUsers(){ return this.users.filter(a => { return a.statusgroup === 1 }).length } }, created() { this.getUsers() this.getStatus() } } </script> <style scoped> .fulllineText{ flex-basis: unset; } </style>