DefaultCurrencyInput.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <template>
  2. <DefaultInput
  3. ref="inputRef"
  4. v-model="formattedValue"
  5. v-bind="$attrs"
  6. :label="label"
  7. :rules="finalRules"
  8. :input-class="inputClass"
  9. />
  10. </template>
  11. <script setup>
  12. import { watch, onBeforeMount, ref } from "vue";
  13. import { useCurrencyInput } from "vue-currency-input";
  14. import { useI18n } from "vue-i18n";
  15. import { useInputRules } from "src/composables/useInputRules";
  16. import DefaultInput from "./DefaultInput.vue";
  17. const { inputRules } = useInputRules();
  18. const model = defineModel({ type: Number });
  19. const defaultRules = [inputRules.minValue(0)];
  20. const finalRules = ref([]);
  21. const { options, label, rules } = defineProps({
  22. options: {
  23. type: Object,
  24. default: () => ({
  25. locale: "pt-BR",
  26. currency: "BRL",
  27. currencyDisplay: "symbol",
  28. hideCurrencySymbolOnFocus: false,
  29. hideGroupingSeparatorOnFocus: false,
  30. hideNegligibleDecimalDigitsOnFocus: false,
  31. autoDecimalDigits: true,
  32. useGrouping: true,
  33. accountingSign: false,
  34. }),
  35. },
  36. label: {
  37. type: String,
  38. default: useI18n().t("common.terms.currency"),
  39. },
  40. errorMessage: {
  41. type: String,
  42. default: "",
  43. },
  44. inputClass: {
  45. type: String,
  46. default: "",
  47. },
  48. rules: {
  49. type: Array,
  50. default: () => [],
  51. },
  52. });
  53. const { inputRef, formattedValue, numberValue, setValue } =
  54. useCurrencyInput(options);
  55. watch(
  56. () => model.value,
  57. (newValue) => {
  58. setValue(newValue);
  59. },
  60. );
  61. watch(
  62. () => numberValue.value,
  63. (newValue) => {
  64. model.value = newValue;
  65. },
  66. );
  67. watch(
  68. () => rules,
  69. (value) => {
  70. finalRules.value = [...value, ...defaultRules];
  71. },
  72. );
  73. onBeforeMount(() => {
  74. finalRules.value = [...rules, ...defaultRules];
  75. });
  76. </script>