Email.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. :error-message="errorMessage"
  11. :rules="rules"
  12. @change="$emit('update', $event, field)"
  13. />
  14. </template>
  15. <script lang="ts">
  16. import { defineComponent, useContext } from '@nuxtjs/composition-api'
  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. error: {
  45. type: Boolean,
  46. required: false
  47. },
  48. errorMessage: {
  49. type: String,
  50. required: false,
  51. default: null
  52. }
  53. },
  54. setup (props) {
  55. const { app: { i18n } } = useContext()
  56. const rules = [
  57. (email: string) => validEmail(email) || i18n.t('email_error')
  58. ]
  59. if (props.required) {
  60. rules.push(
  61. (email: string) => !!email || i18n.t('required')
  62. )
  63. }
  64. return {
  65. rules
  66. }
  67. }
  68. })
  69. function validEmail(email: string) {
  70. // regex from https://fr.vuejs.org/v2/cookbook/form-validation.html#Utiliser-une-validation-personnalisee
  71. 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,}))$/
  72. return re.test(email)
  73. }
  74. </script>