Email.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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(label_field)"
  8. :readonly="readonly"
  9. :error="error || !!violation"
  10. :error-messages="errorMessage || violation ? $t(violation) : ''"
  11. :rules="rules"
  12. @update="onChange"
  13. />
  14. </template>
  15. <script lang="ts">
  16. import { defineComponent, useContext } from '@nuxtjs/composition-api'
  17. import {useError} from "~/composables/form/useError";
  18. export default defineComponent({
  19. props: {
  20. label: {
  21. type: String,
  22. required: false,
  23. default: null
  24. },
  25. field: {
  26. type: String,
  27. required: false,
  28. default: null
  29. },
  30. data: {
  31. type: [String, Number],
  32. required: false,
  33. default: null
  34. },
  35. readonly: {
  36. type: Boolean,
  37. required: false,
  38. default: false
  39. },
  40. required: {
  41. type: Boolean,
  42. required: false,
  43. default: false
  44. },
  45. error: {
  46. type: Boolean,
  47. required: false
  48. },
  49. errorMessage: {
  50. type: String,
  51. required: false,
  52. default: null
  53. }
  54. },
  55. setup (props, {emit}) {
  56. const { app: { i18n }, store } = useContext()
  57. const {violation, onChange} = useError(props.field, emit, store)
  58. const rules = [
  59. (email: string) => validEmail(email) || i18n.t('email_error')
  60. ]
  61. if (props.required) {
  62. rules.push(
  63. (email: string) => !!email || i18n.t('required')
  64. )
  65. }
  66. return {
  67. label_field: props.label ?? props.field,
  68. rules,
  69. violation,
  70. onChange
  71. }
  72. }
  73. })
  74. function validEmail(email: string) {
  75. // regex from https://fr.vuejs.org/v2/cookbook/form-validation.html#Utiliser-une-validation-personnalisee
  76. const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  77. return re.test(email)
  78. }
  79. </script>