DefaultCurrencyInput.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <q-input
  3. ref="inputRef"
  4. v-model="formattedValue"
  5. outlined
  6. :error-message
  7. :error="!!errorMessageComp"
  8. :class="disable ? 'no-pointer-events' : ''"
  9. :label="newLabel"
  10. :disable
  11. :readonly
  12. >
  13. </q-input>
  14. </template>
  15. <script setup>
  16. import { useCurrencyInput } from "vue-currency-input";
  17. import { computed, watch } from "vue";
  18. import { useI18n } from "vue-i18n";
  19. const model = defineModel({
  20. type: Number,
  21. });
  22. defineEmits(['update:modelValue', 'change'])
  23. const { options, disable, readonly, label, error, errorMessage } = defineProps({
  24. options: {
  25. type: Object,
  26. default: () => ({
  27. locale: "pt-BR",
  28. currency: "BRL",
  29. currencyDisplay: "symbol",
  30. hideCurrencySymbolOnFocus: false,
  31. hideGroupingSeparatorOnFocus: false,
  32. hideNegligibleDecimalDigitsOnFocus: false,
  33. autoDecimalDigits: true,
  34. useGrouping: true,
  35. accountingSign: false,
  36. }),
  37. },
  38. disable: {
  39. type: Boolean,
  40. default: false,
  41. },
  42. readonly: {
  43. type: Boolean,
  44. default: false,
  45. },
  46. label: {
  47. type: String,
  48. default: () => useI18n().t("common.terms.currency"),
  49. },
  50. error: {
  51. type: Boolean,
  52. default: false,
  53. },
  54. errorMessage: {
  55. type: String,
  56. default: "",
  57. },
  58. });
  59. const { inputRef, formattedValue, numberValue, setValue } =
  60. useCurrencyInput(options);
  61. const errorMessageComp = computed(() => {
  62. numberValue.value < 0
  63. ? useI18n().t("validation.rules.value_smaller_than_zero")
  64. : undefined;
  65. return errorMessage ? errorMessage : (error ?? void 0);
  66. });
  67. const newLabel = computed(() => (label ? label : void 0));
  68. watch(
  69. () => model.value,
  70. (value) => {
  71. setValue(value);
  72. },
  73. );
  74. </script>