| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- <!--
- Liste déroulante avec autocompletion (les données sont issues
- d'une api)
- @see https://vuetifyjs.com/en/components/autocompletes/#usage
- -->
- <template>
- <main>
- <UiInputAutocomplete
- :field="field"
- :label="label"
- :data="remoteData ? remoteData : data"
- :items="items"
- :isLoading="isLoading"
- :item-text="itemText"
- :slotText="slotText"
- :item-value="itemValue"
- :multiple="multiple"
- :chips="chips"
- prependIcon="mdi-magnify"
- :return-object="returnObject"
- @research="search"
- :no-filter="noFilter"
- @update="$emit('update', $event, field)"
- />
- </main>
- </template>
- <script setup lang="ts">
- import {ref, toRefs} from "@vue/reactivity";
- import type {Ref} from "@vue/reactivity";
- import UrlUtils from "~/services/utils/urlUtils";
- import {useFetch} from "#app";
- import {watch} from "@vue/runtime-core";
- const props = defineProps({
- label: {
- type: String,
- required: false,
- default: null
- },
- field: {
- type: String,
- required: false,
- default: null
- },
- searchFunction: {
- type: Function,
- required: true
- },
- data: {
- type: [String, Number, Object, Array],
- required: false,
- default: null
- },
- remoteUri: {
- type: [Array],
- required: false,
- default: null
- },
- remoteUrl: {
- type: String,
- required: false,
- default: null
- },
- readonly: {
- type: Boolean,
- required: false
- },
- itemValue: {
- type: String,
- default: 'id'
- },
- itemTitle: {
- type: Array,
- required: true
- },
- slotText: {
- type: Array,
- required: false
- },
- returnObject: {
- type: Boolean,
- default: false
- },
- noFilter: {
- type: Boolean,
- default: false
- },
- multiple: {
- type: Boolean,
- default: false
- },
- chips: {
- type: Boolean,
- default: false
- }
- })
- const { data } = toRefs(props)
- const items = ref([])
- const remoteData: Ref<Array<string> | null> = ref(null)
- const isLoading = ref(false)
- if (props.data) {
- items.value = props.multiple ? (data.value ?? []) : [data.value]
- } else if (props.remoteUri) {
- const ids:Array<any> = []
- for(const uri of props.remoteUri){
- ids.push(UrlUtils.extractIdFromUri(uri as string))
- }
- const options: FetchOptions = { method: 'GET', query: {key: 'id', value: ids.join(',')} }
- useFetch(async () => {
- isLoading.value = true
- const r: any = await $fetch(props.remoteUrl, options)
- isLoading.value = false
- remoteData.value = r.data
- items.value = r.data
- })
- }
- const search = async (research:string) => {
- isLoading.value = true
- const func: Function = props.searchFunction
- items.value = items.value.concat(await func(research, props.field))
- isLoading.value = false
- }
- const unwatch = watch(data,(d) => {
- items.value = props.multiple ? d : [d]
- })
- onUnmounted(() => {
- unwatch()
- })
- </script>
|