| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <!--
- 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>
|