Phone.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <!--
  2. Champs de saisie d'un numéro de téléphone
  3. @see https://github.com/yogakurniawan/vue-tel-input-vuetify
  4. -->
  5. <template>
  6. <client-only>
  7. <vue-tel-input-vuetify
  8. :error="error"
  9. :field="field"
  10. :label="label"
  11. v-model="myPhone"
  12. :readonly="readonly"
  13. clearable
  14. valid-characters-only
  15. validate-on-blur
  16. :rules="rules"
  17. @input="onInput"
  18. @change="onChangeValue"
  19. />
  20. </client-only>
  21. </template>
  22. <script lang="ts">
  23. import { defineComponent, Ref, ref, useContext, computed } from '@nuxtjs/composition-api'
  24. import {$useError} from "~/composables/form/useError";
  25. export default defineComponent({
  26. props: {
  27. label: {
  28. type: String,
  29. required: false,
  30. default: ''
  31. },
  32. field: {
  33. type: String,
  34. required: false,
  35. default: null
  36. },
  37. data: {
  38. type: [String, Number],
  39. required: false,
  40. default: null
  41. },
  42. readonly: {
  43. type: Boolean,
  44. required: false
  45. }
  46. },
  47. setup (props, {emit}) {
  48. const { app: { i18n } } = useContext()
  49. const {error, onChange} = $useError(props.field, emit)
  50. const nationalNumber: Ref<string | number> = ref('')
  51. const internationalNumber: Ref<string | number> = ref('')
  52. const isValid: Ref<boolean> = ref(false)
  53. const onInit: Ref<boolean> = ref(true)
  54. const onInput = (_: any, { number, valid, countryChoice }: { number: any, valid: boolean, countryChoice: any }) => {
  55. isValid.value = valid
  56. nationalNumber.value = number.national
  57. internationalNumber.value = number.international
  58. onInit.value = false
  59. }
  60. const onChangeValue = () => {
  61. if (isValid.value) {
  62. onChange(internationalNumber.value)
  63. }
  64. }
  65. const myPhone = computed(
  66. {
  67. get:()=>{
  68. return onInit.value ? props.data : nationalNumber.value
  69. },
  70. set:(value)=>{
  71. return props.data
  72. }
  73. }
  74. )
  75. return {
  76. myPhone,
  77. error,
  78. onInput,
  79. onChangeValue,
  80. rules: [
  81. (phone: string) => (!phone || isValid.value) || i18n.t('phone_error')
  82. ]
  83. }
  84. }
  85. })
  86. </script>
  87. <style>
  88. input:read-only{
  89. color: #666 !important;
  90. }
  91. </style>