|
|
<template lang="pug"> v-dialog( v-model='dialogOpen' max-width='650' ) v-card .dialog-header span {{$t('common:user.search')}} v-spacer v-progress-circular( indeterminate color='white' :size='20' :width='2' v-show='searchLoading' ) v-card-text.pt-5 v-text-field( outlined :label='$t(`common:user.searchPlaceholder`)' v-model='search' prepend-inner-icon='mdi-account-search-outline' color='primary' ref='searchIpt' hide-details ) v-list.grey.mt-3.py-0.radius-7( :class='$vuetify.theme.dark ? `darken-3-d5` : `lighten-3`' two-line dense ) template(v-for='(usr, idx) in items') v-list-item(:key='usr.id', @click='setUser(usr.id)') v-list-item-avatar(size='40', color='primary') span.body-1.white--text {{usr.name | initials}} v-list-item-content v-list-item-title.body-2 {{usr.name}} v-list-item-subtitle {{usr.email}} v-list-item-action v-icon(color='primary') mdi-arrow-right v-divider.my-0(v-if='idx < items.length - 1') v-card-chin v-spacer v-btn( text @click='close' :disabled='loading' ) {{$t('common:actions.cancel')}} </template>
<script> import _ from 'lodash'
import searchUsersQuery from 'gql/common/common-users-query-search.gql'
export default { filters: { initials(val) { return val.split(' ').map(v => v.substring(0, 1)).join('') } }, props: { multiple: { type: Boolean, default: false }, value: { type: Boolean, default: false } }, data() { return { loading: false, searchLoading: false, search: '', items: [] } }, computed: { dialogOpen: { get() { return this.value }, set(value) { this.$emit('input', value) } } }, watch: { value(newValue, oldValue) { if (newValue && !oldValue) { this.search = '' this.selectedItems = null _.delay(() => { this.$refs.searchIpt.focus() }, 100) } } }, methods: { close() { this.$emit('input', false) }, setUser(id) { this.$emit('select', id) this.close() }, searchFilter(item, queryText, itemText) { return _.includes(_.toLower(item.email), _.toLower(queryText)) || _.includes(_.toLower(item.name), _.toLower(queryText)) } }, apollo: { items: { query: searchUsersQuery, variables() { return { query: this.search } }, fetchPolicy: 'cache-and-network', skip() { return !this.search || this.search.length < 2 }, update: (data) => data.users.search, watchLoading (isLoading) { this.searchLoading = isLoading } } } } </script>
|