byjove/src/components/autocomplete/ByjoveAutocomplete.vue

86 lines
2.2 KiB
Vue
Raw Normal View History

2019-11-12 11:51:00 -06:00
<template>
<div>
<b-autocomplete ref="autocomplete"
:name="name"
v-show="!selected"
v-model="autocompleteValue"
:data="data"
@typing="getAsyncData"
@select="selectionMade"
keep-first>
<template slot-scope="props">
{{ props.option.label }}
</template>
</b-autocomplete>
<b-button v-if="selected"
style="width: 100%; justify-content: left;"
@click="clearSelection()">
{{ selected.label }}
</b-button>
</div>
</template>
<script>
export default {
name: 'ByjoveAutocomplete',
props: {
name: String,
serviceUrl: String,
value: String,
initialLabel: String,
},
data() {
let selected = null
if (this.value) {
selected = {
value: this.value,
label: this.initialLabel,
}
}
return {
data: [],
selected: selected,
isFetching: false,
autocompleteValue: this.value,
}
},
methods: {
clearSelection() {
this.selected = null
this.$emit('input', null)
this.autocompleteValue = null
this.$nextTick(function() {
this.$refs.autocomplete.focus()
})
},
selectionMade(option) {
this.selected = option
this.$emit('input', option ? option.value : null)
2019-11-12 11:51:00 -06:00
},
// TODO: buefy example uses `debounce()` here and perhaps we should too?
// https://buefy.org/documentation/autocomplete
getAsyncData: function (entry) {
if (entry.length < 3) {
this.data = []
return
}
this.isFetching = true
this.$http.get(this.serviceUrl, {params: {term: entry}}).then((response) => {
this.data = response.data
}).catch((error) => {
this.data = []
throw error
}).finally(() => {
this.isFetching = false
})
},
},
}
</script>