Autocomplete.vue 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. },
  28. field: {
  29. type: String,
  30. required: false
  31. },
  32. data: {
  33. type: String,
  34. required: false
  35. },
  36. items: {
  37. type: Array,
  38. required: false,
  39. default: []
  40. },
  41. readOnly: {
  42. type: Boolean,
  43. required: false
  44. },
  45. itemValue: {
  46. type: String,
  47. default: 'id'
  48. },
  49. itemText: {
  50. type: Array,
  51. required: true
  52. },
  53. returnObject: {
  54. type: Boolean,
  55. default: false
  56. },
  57. multiple: {
  58. type: Boolean,
  59. default: false
  60. },
  61. isLoading: {
  62. type: Boolean,
  63. default: false
  64. }
  65. },
  66. setup (props) {
  67. // On reconstruit les items à afficher car le text de l'Item doit être construit par rapport au itemText passé en props
  68. const itemsToDisplayed: ComputedRef<Array<AnyJson>> = computed(() => {
  69. return props.items.map((item: any) => {
  70. const textDisplay: Array<string> = []
  71. for (const text of props.itemText) {
  72. textDisplay.push(item[text as string])
  73. }
  74. return Object.assign({}, item, { textDisplay: textDisplay.join(' ') })
  75. })
  76. })
  77. return {
  78. label_field: props.label ?? props.field,
  79. itemsToDisplayed
  80. }
  81. }
  82. })
  83. </script>
  84. <style scoped>
  85. </style>