123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. defineEmits(['update:modelValue'])
  67. const isError = computed(() => (props.error ? true : false))
  68. const forLabel = computed(() => props.label.toLowerCase().replace(/\s+/g, '-'))
  69. const ariaDescribedbyLabel = computed(
  70. () => props.label.toLowerCase().replace(/\s+/g, '-') + '-help'
  71. )
  72. </script>
  73. <template>
  74. <div class="field">
  75. <label :for="forLabel">{{ label }}</label>
  76. <InputNumber
  77. class="w-full"
  78. input-class="w-full"
  79. :currency="currency"
  80. :currency-display="currencyDisplay"
  81. :locale="locale"
  82. :class="{ 'p-invalid': isError }"
  83. :id="forLabel"
  84. :aria-describedby="ariaDescribedbyLabel"
  85. :placeholder="placeholder"
  86. :model-value="modelValue"
  87. :disabled="disabled"
  88. :prefix="prefix"
  89. :suffix="suffix"
  90. :step="step"
  91. :min="min"
  92. :max="max"
  93. :mode="mode"
  94. :use-grouping="useGrouping"
  95. :show-buttons="showButtons"
  96. @input="$emit('update:modelValue', $event.value)"
  97. />
  98. <small
  99. v-if="error"
  100. :id="ariaDescribedbyLabel"
  101. :class="{ 'p-error': isError }"
  102. >
  103. {{ error }}
  104. </small>
  105. </div>
  106. </template>