AppInputNumber.vue 2.0KB

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