AppInputNumber.vue 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <script setup>
  2. import { computed } from 'vue'
  3. const props = defineProps({
  4. label: {
  5. type: String,
  6. required: true,
  7. },
  8. labelClass: {
  9. type: String,
  10. },
  11. disabled: {
  12. type: Boolean,
  13. default: false,
  14. },
  15. placeholder: {
  16. type: String,
  17. required: true,
  18. },
  19. error: {
  20. type: String,
  21. default: null,
  22. },
  23. useGrouping: {
  24. type: Boolean,
  25. default: true,
  26. },
  27. mode: {
  28. type: String,
  29. default: 'decimal',
  30. },
  31. currency: {
  32. type: String,
  33. default: undefined,
  34. },
  35. locale: {
  36. type: String,
  37. default: undefined,
  38. },
  39. currencyDisplay: {
  40. type: String,
  41. default: undefined,
  42. },
  43. showButtons: {
  44. type: Boolean,
  45. default: false,
  46. },
  47. min: {
  48. type: Number,
  49. default: null,
  50. },
  51. max: {
  52. type: Number,
  53. default: null,
  54. },
  55. step: {
  56. type: Number,
  57. default: 1,
  58. },
  59. prefix: {
  60. type: String,
  61. default: null,
  62. },
  63. suffix: {
  64. type: String,
  65. default: null,
  66. },
  67. modelValue: null,
  68. })
  69. const isError = computed(() => (props.error ? true : false))
  70. const forLabel = computed(() => props.label.toLowerCase().replace(/\s+/g, '-'))
  71. const ariaDescribedbyLabel = computed(
  72. () => props.label.toLowerCase().replace(/\s+/g, '-') + '-error'
  73. )
  74. </script>
  75. <template>
  76. <div class="field">
  77. <label :for="forLabel" :class="labelClass">{{ label }}</label>
  78. <InputNumber
  79. class="w-full"
  80. input-class="w-full"
  81. :currency="currency"
  82. :currency-display="currencyDisplay"
  83. :locale="locale"
  84. :class="{ 'p-invalid': isError }"
  85. :id="forLabel"
  86. :placeholder="placeholder"
  87. :model-value="modelValue"
  88. :disabled="disabled"
  89. :prefix="prefix"
  90. :suffix="suffix"
  91. :step="step"
  92. :min="min"
  93. :max="max"
  94. :mode="mode"
  95. :use-grouping="useGrouping"
  96. :show-buttons="showButtons"
  97. @input="$emit('update:modelValue', $event.value)"
  98. />
  99. <small
  100. v-if="error"
  101. :id="ariaDescribedbyLabel"
  102. :class="{ 'p-error': isError }"
  103. >
  104. {{ error }}
  105. </small>
  106. </div>
  107. </template>