Autocomplete.vue 1.9 KB

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