Add basic autocomplete component
This commit is contained in:
parent
84b2a2bf70
commit
0c247866c4
85
src/components/autocomplete/ByjoveAutocomplete.vue
Normal file
85
src/components/autocomplete/ByjoveAutocomplete.vue
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
<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.value)
|
||||||
|
},
|
||||||
|
|
||||||
|
// 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>
|
27
src/components/autocomplete/index.js
Normal file
27
src/components/autocomplete/index.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import ByjoveAutocomplete from './ByjoveAutocomplete.vue'
|
||||||
|
|
||||||
|
// Declare install function executed by Vue.use()
|
||||||
|
export function install(Vue) {
|
||||||
|
if (install.installed) return;
|
||||||
|
install.installed = true;
|
||||||
|
Vue.component('ByjoveAutocomplete', ByjoveAutocomplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create module definition for Vue.use()
|
||||||
|
const plugin = {
|
||||||
|
install,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Auto-install when vue is found (eg. in browser via <script> tag)
|
||||||
|
let GlobalVue = null;
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
GlobalVue = window.Vue;
|
||||||
|
} else if (typeof global !== 'undefined') {
|
||||||
|
GlobalVue = global.Vue;
|
||||||
|
}
|
||||||
|
if (GlobalVue) {
|
||||||
|
GlobalVue.use(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
// To allow use as module (npm/webpack/etc.) export component
|
||||||
|
export default ByjoveAutocomplete
|
|
@ -2,6 +2,7 @@ import ByjoveApp from './app'
|
||||||
import ByjoveMenu from './menu'
|
import ByjoveMenu from './menu'
|
||||||
import ByjoveLogo from './logo'
|
import ByjoveLogo from './logo'
|
||||||
import ByjoveFeedback from './feedback'
|
import ByjoveFeedback from './feedback'
|
||||||
|
import ByjoveAutocomplete from './autocomplete'
|
||||||
import ByjoveModelIndex from './model-index'
|
import ByjoveModelIndex from './model-index'
|
||||||
import ByjoveModelCrud from './model-crud'
|
import ByjoveModelCrud from './model-crud'
|
||||||
|
|
||||||
|
@ -10,6 +11,7 @@ export {
|
||||||
ByjoveMenu,
|
ByjoveMenu,
|
||||||
ByjoveLogo,
|
ByjoveLogo,
|
||||||
ByjoveFeedback,
|
ByjoveFeedback,
|
||||||
|
ByjoveAutocomplete,
|
||||||
ByjoveModelIndex,
|
ByjoveModelIndex,
|
||||||
ByjoveModelCrud,
|
ByjoveModelCrud,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue