Autocomplete.vue 1.8 KB

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