* Add a search field to search for contacts by Name, Phone number or the property Shared. Note, the name and phone search use the wild card before and after the typed string. * Move call button outside the 3 dots menus for easier access. Change-Id: I2c135d744a66c921a028dcece4a889b482ccd33fmaster
parent
0340bd7e3c
commit
8b4f8b2e9b
@ -0,0 +1,162 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="row justify-center full-width q-gutter-x-sm"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="col-xs-12 col-md-2"
|
||||||
|
>
|
||||||
|
<q-select
|
||||||
|
v-model="filterType"
|
||||||
|
emit-value
|
||||||
|
map-options
|
||||||
|
dense
|
||||||
|
:options="filterTypeOptions"
|
||||||
|
:label="$t('Filter by')"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="col-xs-12 col-md-2"
|
||||||
|
>
|
||||||
|
<q-select
|
||||||
|
v-if="filterType === 'shared'"
|
||||||
|
v-model="typedFilter"
|
||||||
|
:options="sharedFilterOptions"
|
||||||
|
dense
|
||||||
|
:disable="filterType === null"
|
||||||
|
:label="$t('Is shared?')"
|
||||||
|
@update:model-value="triggerFilter"
|
||||||
|
/>
|
||||||
|
<q-input
|
||||||
|
v-else
|
||||||
|
v-model="typedFilter"
|
||||||
|
type="text"
|
||||||
|
dense
|
||||||
|
:disable="filterType === null"
|
||||||
|
:label="$t('Type something')"
|
||||||
|
@keypress.enter="triggerFilter"
|
||||||
|
>
|
||||||
|
<template
|
||||||
|
#append
|
||||||
|
>
|
||||||
|
<q-btn
|
||||||
|
icon="search"
|
||||||
|
color="primary"
|
||||||
|
dense
|
||||||
|
flat
|
||||||
|
@click="triggerFilter"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="row justify-center full-width q-gutter-x-sm"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="col-xs-12 col-md-4"
|
||||||
|
>
|
||||||
|
<q-chip
|
||||||
|
v-for="(filterItem, index) in filters"
|
||||||
|
:key="index"
|
||||||
|
:label="getFilterLabel(filterItem)"
|
||||||
|
:disable="false"
|
||||||
|
icon="filter_alt"
|
||||||
|
removable
|
||||||
|
dense
|
||||||
|
color="primary"
|
||||||
|
text-color="dark"
|
||||||
|
@remove="removeFilter(filterItem.name)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'CscSubscriberFilters',
|
||||||
|
emits: ['filter'],
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
filterType: null,
|
||||||
|
typedFilter: '',
|
||||||
|
filters: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
filterTypeOptions () {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: this.$t('Name'),
|
||||||
|
value: 'name'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$t('Number'),
|
||||||
|
value: 'number'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$t('Shared'),
|
||||||
|
value: 'shared'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
sharedFilterOptions () {
|
||||||
|
return [
|
||||||
|
{ label: this.$t('Yes'), value: '1' },
|
||||||
|
{ label: this.$t('No'), value: '0' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
triggerFilter () {
|
||||||
|
this.addFilter(this.filterType, this.typedFilter)
|
||||||
|
},
|
||||||
|
removeFilter (name) {
|
||||||
|
this.filters = this.filters.filter((item) => item.name !== name)
|
||||||
|
this.filter()
|
||||||
|
},
|
||||||
|
removeFilters () {
|
||||||
|
if (this.filters.length > 0) {
|
||||||
|
this.filters = []
|
||||||
|
this.filter()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
addFilter (name, value) {
|
||||||
|
const valueTrimmed = value?.value || value.trim()
|
||||||
|
if (valueTrimmed) {
|
||||||
|
this.typedFilter = ''
|
||||||
|
this.filters = this.filters.filter((item) => item.name !== name)
|
||||||
|
const filter = {
|
||||||
|
name,
|
||||||
|
value: valueTrimmed
|
||||||
|
}
|
||||||
|
this.filters.push(filter)
|
||||||
|
this.filter()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
filter () {
|
||||||
|
const params = {}
|
||||||
|
this.filters.forEach((filter) => {
|
||||||
|
params[filter.name] = filter.value
|
||||||
|
})
|
||||||
|
this.$emit('filter', params)
|
||||||
|
},
|
||||||
|
getFilterLabel (filterItem) {
|
||||||
|
const filterNameTranslation = {
|
||||||
|
name: this.$t('Name'),
|
||||||
|
number: this.$t('Number'),
|
||||||
|
shared: this.$t('Shared')
|
||||||
|
}
|
||||||
|
const filterNameTitle = filterNameTranslation[filterItem.name] || this.$t('Unknown name')
|
||||||
|
|
||||||
|
if (filterItem.name === 'shared') {
|
||||||
|
const yes = this.$t('Yes')
|
||||||
|
const no = this.$t('No')
|
||||||
|
return `${filterNameTitle}: ${filterItem.value === '1' ? yes : no}`
|
||||||
|
}
|
||||||
|
return `${filterNameTitle}: ${filterItem.value}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
Loading…
Reference in new issue