AppAutocompleteBasic.vue 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <script setup>
  2. import { Link } from '@inertiajs/inertia-vue3'
  3. import { computed } from 'vue'
  4. const props = defineProps({
  5. field: {
  6. type: String,
  7. required: true,
  8. },
  9. suggestions: {
  10. type: Array,
  11. required: true,
  12. },
  13. empty: {
  14. type: Boolean,
  15. default: false,
  16. },
  17. label: {
  18. type: String,
  19. required: true,
  20. },
  21. dropdown: {
  22. type: Boolean,
  23. default: false,
  24. },
  25. placeholder: {
  26. type: String,
  27. required: true,
  28. },
  29. error: {
  30. type: String,
  31. default: null,
  32. },
  33. modelValue: null,
  34. })
  35. defineEmits(['complete', 'itemSelect', 'update:modelValue'])
  36. const isError = computed(() => (props.error ? true : false))
  37. const forLabel = computed(() => props.label.toLowerCase().replace(/\s+/g, '-'))
  38. const ariaDescribedbyLabel = computed(() => props.label.toLowerCase().replace(/\s+/g, '-') + '-help')
  39. </script>
  40. <template>
  41. <div class="field">
  42. <label :for="forLabel">{{ label }}</label>
  43. <AutoComplete
  44. class="w-full"
  45. inputClass="w-full"
  46. :model-value="modelValue"
  47. :aria-describedby="ariaDescribedbyLabel"
  48. :id="forLabel"
  49. :class="{ 'p-invalid': isError }"
  50. :field="field"
  51. :placeholder="placeholder"
  52. :suggestions="suggestions"
  53. :auto-highlight="true"
  54. :dropdown="dropdown"
  55. @input="$emit('update:modelValue', $event.target.value)"
  56. @item-select="$emit('itemSelect', $event)"
  57. @complete="$emit('complete', $event)"
  58. >
  59. <template #item="slotProps">
  60. <slot name="item" :item="slotProps.item" />
  61. </template>
  62. </AutoComplete>
  63. <div class="flex flex-column">
  64. <small
  65. v-if="error"
  66. class="mt-1"
  67. :class="{ 'mb-2': suggestions.length === 0 || (modelValue.length === 0 && empty), 'p-error': isError }"
  68. :id="ariaDescribedbyLabel"
  69. >
  70. {{ error }}
  71. </small>
  72. <small v-if="suggestions.length === 0 || (modelValue.length === 0 && empty)" class="mt-1">
  73. <slot v-if="empty" name="empty" />
  74. </small>
  75. </div>
  76. </div>
  77. </template>