Checkbox.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <!--
  2. Case à cocher, à placer dans un composant `UiForm`
  3. @see https://vuetifyjs.com/en/components/checkboxes/
  4. -->
  5. <template>
  6. <v-checkbox
  7. :model-value="modelValue"
  8. :label="$t(fieldLabel)"
  9. :disabled="readonly"
  10. density="compact"
  11. :error="error || !!fieldViolations"
  12. :error-messages="errorMessage || fieldViolations ? $t(fieldViolations) : ''"
  13. class="checkbox py-1"
  14. @update:model-value="onUpdate"
  15. />
  16. </template>
  17. <script setup lang="ts">
  18. import { useFieldViolation } from '~/composables/form/useFieldViolation'
  19. const props = defineProps({
  20. /**
  21. * v-model
  22. */
  23. modelValue: {
  24. type: Boolean,
  25. required: false,
  26. },
  27. /**
  28. * Nom de la propriété d'une entité lorsque l'input concerne cette propriété
  29. * - Utilisé par la validation
  30. * - Laisser null si le champ ne s'applique pas à une entité
  31. */
  32. field: {
  33. type: String,
  34. required: false,
  35. default: null,
  36. },
  37. /**
  38. * Label du champ
  39. * Si non défini, c'est le nom de propriété qui est utilisé
  40. */
  41. label: {
  42. type: String,
  43. required: false,
  44. default: null,
  45. },
  46. /**
  47. * Définit si le champ est en lecture seule
  48. */
  49. readonly: {
  50. type: Boolean,
  51. required: false,
  52. default: false,
  53. },
  54. /**
  55. * Règles de validation
  56. * @see https://vuetify.cn/en/components/forms/#validation-with-submit-clear
  57. */
  58. rules: {
  59. type: Array,
  60. required: false,
  61. default: () => [],
  62. },
  63. /**
  64. * Le champ est-il actuellement en état d'erreur
  65. */
  66. error: {
  67. type: Boolean,
  68. required: false,
  69. },
  70. /**
  71. * Si le champ est en état d'erreur, quel est le message d'erreur?
  72. */
  73. errorMessage: {
  74. type: String,
  75. required: false,
  76. default: null,
  77. },
  78. })
  79. const { fieldViolations, updateViolationState } = useFieldViolation(props.field)
  80. const fieldLabel: string = props.label ?? props.field
  81. const emit = defineEmits(['update:model-value'])
  82. const onUpdate = (event: boolean) => {
  83. updateViolationState()
  84. emit('update:model-value', event)
  85. }
  86. onUnmounted(() => {
  87. updateViolationState()
  88. })
  89. </script>
  90. <style scoped lang="scss">
  91. .checkbox {
  92. margin-top: -4px;
  93. margin-bottom: 8px;
  94. }
  95. @media (min-width: 600px) {
  96. :deep(.v-input__control) {
  97. max-height: 32px;
  98. }
  99. }
  100. :deep(.v-label) {
  101. padding-left: 8px;
  102. }
  103. </style>