-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwell_mask_money.js
101 lines (93 loc) · 3.39 KB
/
well_mask_money.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(() => {
function _getWellMaskedInputs(parentNode) {
return [...parentNode.querySelectorAll('[data-toggle="well-mask-money"]')];
}
function _setupWellMaskMoneyOn(input) {
let {
allowEmpty,
allowNegative,
useCurrencySymbol,
decimalPlaces,
locales,
currency,
} = input.dataset;
currency = currency || "BRL";
locales = locales || "pt-br";
allowEmpty = (allowEmpty || "true").toLocaleLowerCase() == "true";
allowNegative = (allowNegative || "true").toLocaleLowerCase() == "true";
useCurrencySymbol =
(useCurrencySymbol || "true").toLocaleLowerCase() == "true";
decimalPlaces = Number(decimalPlaces || 2);
// string usada para verificar se foi apagado o último dígito
// ex: se era 0,00 e agora é 0,0 então o usuário quis apagar o valor todo
const emptyTrigger = new Array(1 + decimalPlaces).join("0");
const _formatCurrency = (value) => {
if (value < 0 && !allowNegative) {
value = -value;
}
return Number(value).toLocaleString(
locales,
useCurrencySymbol
? {
minimumFractionDigits: decimalPlaces,
style: "currency",
currency: currency,
}
: { minimumFractionDigits: decimalPlaces }
);
};
const _wellMaskMoneyListener = () => {
const isNegative = input.value.includes("-");
const convertToPositive = input.value.includes("+");
const cleanedString = input.value.replace(/\D+/g, "");
let numberValue = Number(cleanedString || 0) / 10 ** decimalPlaces;
if (isNegative && !convertToPositive) {
// converte pra negativo somente se necessário
numberValue = -numberValue;
}
input.numberValue = cleanedString.length === 0 ? null : numberValue;
let newValue;
if (cleanedString === emptyTrigger || cleanedString.length === 0) {
// se o campo foi limpo
if (!allowEmpty || input.required) {
// se não permite vazio preenche o campo na força
newValue = _formatCurrency(0);
} else if (cleanedString.length === 0 || input.lastNumberValue === 0) {
// se o campo já está limpo mantém limpo ou o último valor já era 0
newValue = "";
} else {
// formata zerado pro usuário poder apertar mais uma vez no backspace
newValue = _formatCurrency(0);
}
} else {
newValue = _formatCurrency(numberValue);
}
input.lastNumberValue = numberValue;
input.value = newValue;
return newValue;
};
input.applyWellMaskMoney = _formatCurrency;
input.wellMaskMoneyListener = _wellMaskMoneyListener;
// add the events needed to the input
["input", "change", "focus"].forEach((eventType) =>
input.addEventListener(eventType, _wellMaskMoneyListener)
);
// the type needed is text
input.type = "text";
// runs for the first time
_wellMaskMoneyListener();
}
function _setupWellMaskMoneyOnInputs() {
const obvserver = new MutationObserver(() => {
const inputs = _getWellMaskedInputs(document);
inputs.forEach((input) => {
if (!input.wellMaskMoneyConfigured) {
_setupWellMaskMoneyOn(input);
input.wellMaskMoneyConfigured = true;
}
});
});
obvserver.observe(document, { subtree: true, childList: true });
}
_setupWellMaskMoneyOnInputs();
})();