Email.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <!--
  2. Champs de saisie de type Text dédié à la saisie d'emails
  3. -->
  4. <template>
  5. <UiInputText
  6. :data="data"
  7. :label="$t(fieldLabel)"
  8. :readonly="readonly"
  9. :rules="rules"
  10. :error="error || !!fieldViolations"
  11. :error-messages="
  12. errorMessage || fieldViolations ? $t(fieldViolations) : ''
  13. "
  14. @update:model-value="onUpdate($event)"
  15. />
  16. </template>
  17. <script setup lang="ts">
  18. import { useNuxtApp } from '#app'
  19. import type { PropType } from 'vue'
  20. import { useI18n } from 'vue-i18n'
  21. import { useFieldViolation } from '~/composables/form/useFieldViolation'
  22. import { useValidationUtils } from '~/composables/utils/useValidationUtils'
  23. const props = defineProps({
  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, Number],
  36. required: false,
  37. default: null,
  38. },
  39. readonly: {
  40. type: Boolean,
  41. required: false,
  42. default: false,
  43. },
  44. required: {
  45. type: Boolean,
  46. required: false,
  47. default: false,
  48. },
  49. error: {
  50. type: Boolean,
  51. required: false,
  52. },
  53. errorMessage: {
  54. type: String,
  55. required: false,
  56. default: null,
  57. },
  58. /**
  59. * @see https://vuetifyjs.com/en/api/v-autocomplete/#props-variant
  60. */
  61. variant: {
  62. type: String as PropType<
  63. | 'filled'
  64. | 'outlined'
  65. | 'plain'
  66. | 'underlined'
  67. | 'solo'
  68. | 'solo-inverted'
  69. | 'solo-filled'
  70. | undefined
  71. >,
  72. required: false,
  73. default: 'outlined',
  74. },
  75. })
  76. const i18n = useI18n()
  77. const fieldLabel = props.label ?? props.field
  78. const { fieldViolations, updateViolationState } = useFieldViolation(props.field)
  79. const validationUtils = useValidationUtils()
  80. const rules = [
  81. (email: string) => validationUtils.validEmail(email) || i18n.t('email_error'),
  82. ]
  83. if (props.required) {
  84. rules.push((email: string) => !!email || i18n.t('required'))
  85. }
  86. const emit = defineEmits(['update:model-value'])
  87. const onUpdate = (event: string) => {
  88. updateViolationState()
  89. emit('update:model-value', event)
  90. }
  91. onBeforeUnmount(() => {
  92. updateViolationState()
  93. })
  94. </script>