Autocomplete.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <!--
  2. Liste déroulante avec autocompletion
  3. @see https://vuetifyjs.com/en/components/autocompletes/#usage
  4. -->
  5. <template>
  6. <main>
  7. <v-autocomplete
  8. :items="itemsToDisplayed"
  9. :label="$t(label)"
  10. item-text="textDisplay"
  11. :item-value="itemValue"
  12. :multiple="multiple"
  13. :loading="isLoading"
  14. :return-object="returnObject"
  15. @change="$emit('update', $event, field)"
  16. />
  17. </main>
  18. </template>
  19. <script lang="ts">
  20. import { computed, defineComponent, ComputedRef } from '@nuxtjs/composition-api'
  21. import { AnyJson } from '~/types/interfaces'
  22. export default defineComponent({
  23. props: {
  24. label: {
  25. type: String,
  26. required: false,
  27. default: null
  28. },
  29. field: {
  30. type: String,
  31. required: false,
  32. default: null
  33. },
  34. data: {
  35. type: String,
  36. required: false,
  37. default: null
  38. },
  39. items: {
  40. type: Array,
  41. required: false,
  42. default: () => []
  43. },
  44. readonly: {
  45. type: Boolean,
  46. required: false
  47. },
  48. itemValue: {
  49. type: String,
  50. default: 'id'
  51. },
  52. itemText: {
  53. type: Array,
  54. required: true
  55. },
  56. returnObject: {
  57. type: Boolean,
  58. default: false
  59. },
  60. multiple: {
  61. type: Boolean,
  62. default: false
  63. },
  64. isLoading: {
  65. type: Boolean,
  66. default: false
  67. }
  68. },
  69. setup (props) {
  70. // On reconstruit les items à afficher car le text de l'Item doit être construit par rapport au itemText passé en props
  71. const itemsToDisplayed: ComputedRef<Array<AnyJson>> = computed(() => {
  72. return props.items.map((item: any) => {
  73. const textDisplay: Array<string> = []
  74. for (const text of props.itemText) {
  75. textDisplay.push(item[text as string])
  76. }
  77. return Object.assign({}, item, { textDisplay: textDisplay.join(' ') })
  78. })
  79. })
  80. return {
  81. label_field: props.label ?? props.field,
  82. itemsToDisplayed
  83. }
  84. }
  85. })
  86. </script>
  87. <style scoped>
  88. </style>