Text.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <!--
  2. Champs de saisie de texte
  3. @see https://vuetifyjs.com/en/components/text-fields/
  4. -->
  5. <template>
  6. <v-text-field
  7. autocomplete="off"
  8. :value="data"
  9. :label="$t(label_field)"
  10. :rules="rules"
  11. :disabled="readonly"
  12. :type="type === 'password' ? (show ? 'text' : type) : type"
  13. :error="error || !!violation"
  14. :error-messages="errorMessage || (violation ? $t(violation) : '')"
  15. @change="onChange($event); $emit('change', $event)"
  16. @input="$emit('input', $event, field)"
  17. v-mask="mask"
  18. :append-icon="type === 'password' ? (show ? 'mdi-eye' : 'mdi-eye-off') : ''"
  19. @click:append="show = !show"
  20. />
  21. </template>
  22. <script setup lang="ts">
  23. import {mask} from 'vue-the-mask';
  24. import {ref} from "@vue/reactivity";
  25. import {useFieldViolation} from "~/composables/form/useFieldViolation";
  26. const props = defineProps({
  27. label: {
  28. type: String,
  29. required: false,
  30. default: null
  31. },
  32. field: {
  33. type: String,
  34. required: false,
  35. default: null
  36. },
  37. type: {
  38. type: String,
  39. required: false,
  40. default: null
  41. },
  42. data: {
  43. type: [String, Number],
  44. required: false,
  45. default: null
  46. },
  47. readonly: {
  48. type: Boolean,
  49. required: false
  50. },
  51. rules: {
  52. type: Array,
  53. required: false,
  54. default: () => []
  55. },
  56. error: {
  57. type: Boolean,
  58. required: false
  59. },
  60. errorMessage: {
  61. type: String,
  62. required: false,
  63. default: null
  64. },
  65. mask: {
  66. type: [Array, Boolean],
  67. required: false,
  68. default: false
  69. }
  70. })
  71. const { app, emit } = useNuxtApp()
  72. const { violation, onChange } = useFieldViolation(props.field, emit)
  73. const show = ref(false)
  74. const label_field = props.label ?? props.field
  75. app.directive('mask', {
  76. mask: (el: any, binding: any, vnode: any, oldVnode: any) => {
  77. if (!binding.value) return;
  78. mask(el, binding, vnode, oldVnode);
  79. }
  80. })
  81. </script>
  82. <style scoped>
  83. input:read-only{
  84. color: #666 !important;
  85. }
  86. </style>