Email.vue 2.1 KB

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