Email.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <!--
  2. Champs de saisie de type Text dédié à la saisie d'emails
  3. -->
  4. <template>
  5. <UiInputText
  6. :data="data"
  7. :label="label"
  8. :readonly="readonly"
  9. :error="error"
  10. :rules="rules"
  11. @update="onChange"
  12. />
  13. </template>
  14. <script lang="ts">
  15. import { defineComponent, useContext } from '@nuxtjs/composition-api'
  16. import {$useError} from "~/composables/form/useError";
  17. export default defineComponent({
  18. props: {
  19. label: {
  20. type: String,
  21. required: false,
  22. default: ''
  23. },
  24. field: {
  25. type: String,
  26. required: false,
  27. default: null
  28. },
  29. data: {
  30. type: [String, Number],
  31. required: false,
  32. default: null
  33. },
  34. readonly: {
  35. type: Boolean,
  36. required: false,
  37. default: false
  38. },
  39. required: {
  40. type: Boolean,
  41. required: false,
  42. default: false
  43. }
  44. },
  45. setup (props, {emit}) {
  46. const { app: { i18n } } = useContext()
  47. const {error, onChange} = $useError(props.field, emit)
  48. const rules = [
  49. (email: string) => validEmail(email) || i18n.t('email_error')
  50. ]
  51. if (props.required) {
  52. rules.push(
  53. (email: string) => !!email || i18n.t('required')
  54. )
  55. }
  56. return {
  57. rules,
  58. error,
  59. onChange
  60. }
  61. }
  62. })
  63. function validEmail(email: string) {
  64. // regex from https://fr.vuejs.org/v2/cookbook/form-validation.html#Utiliser-une-validation-personnalisee
  65. 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,}))$/
  66. return re.test(email)
  67. }
  68. </script>