ajustes
This commit is contained in:
@@ -49,13 +49,35 @@ function parsePontuacaoInput(value: string): number {
|
|||||||
return Number.isFinite(parsed) ? parsed : Number.NaN;
|
return Number.isFinite(parsed) ? parsed : Number.NaN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Pontuação do modal de lançamento: só inteiros ≥ 0 (o tipo bonus/desconto define o sinal no backend). */
|
const PONTUACAO_LANCAMENTO_MAX_FRAC = 2;
|
||||||
|
|
||||||
|
/** Pontuação do modal de lançamento: ≥ 0, até duas casas decimais (o tipo bonus/desconto define o sinal no backend). */
|
||||||
function sanitizePontuacaoLancamentoDigitando(raw: string): string {
|
function sanitizePontuacaoLancamentoDigitando(raw: string): string {
|
||||||
const t = raw.trim();
|
const t = raw.trim().replace(/\s/g, "");
|
||||||
if (t === "") return "";
|
if (t === "") return "";
|
||||||
const n = parsePontuacaoInput(t);
|
if (t === "," || t === ".") return "0" + t;
|
||||||
if (!Number.isFinite(n) || n < 0) return "0";
|
|
||||||
return String(Math.trunc(Math.min(n, Number.MAX_SAFE_INTEGER)));
|
const c = t.indexOf(",");
|
||||||
|
const d = t.indexOf(".");
|
||||||
|
const si = c >= 0 && d >= 0 ? Math.min(c, d) : c >= 0 ? c : d >= 0 ? d : -1;
|
||||||
|
const sep = si >= 0 ? t[si]! : null;
|
||||||
|
|
||||||
|
if (sep == null) {
|
||||||
|
const digits = t.replace(/\D/g, "");
|
||||||
|
if (digits === "") return "";
|
||||||
|
const n = Number(digits);
|
||||||
|
if (n < 0) return "0";
|
||||||
|
return digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
const intStr = t.slice(0, si).replace(/\D/g, "");
|
||||||
|
const rawAfter = t.slice(si + 1);
|
||||||
|
const fracStr = rawAfter.replace(/\D/g, "").slice(0, PONTUACAO_LANCAMENTO_MAX_FRAC);
|
||||||
|
const intPart = intStr === "" ? "0" : intStr;
|
||||||
|
if (t.endsWith(sep) && fracStr.length === 0) {
|
||||||
|
return intPart + sep;
|
||||||
|
}
|
||||||
|
return intPart + sep + fracStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
function toPontuacaoInput(value: number): string {
|
function toPontuacaoInput(value: number): string {
|
||||||
@@ -303,7 +325,11 @@ export default function FechamentoDetalhes() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const descricao = lancamentoDescricao.trim();
|
const descricao = lancamentoDescricao.trim();
|
||||||
const pontuacao = Math.trunc(Number(lancamentoPontuacao));
|
const pontuacao = (() => {
|
||||||
|
const n = parsePontuacaoInput(lancamentoPontuacao);
|
||||||
|
if (!Number.isFinite(n)) return Number.NaN;
|
||||||
|
return Math.round(n * 100) / 100;
|
||||||
|
})();
|
||||||
if (!descricao) {
|
if (!descricao) {
|
||||||
toast.error("Informe a descrição do lançamento.");
|
toast.error("Informe a descrição do lançamento.");
|
||||||
return;
|
return;
|
||||||
@@ -837,17 +863,11 @@ export default function FechamentoDetalhes() {
|
|||||||
<Label htmlFor="lancamento-pontuacao">Pontuação</Label>
|
<Label htmlFor="lancamento-pontuacao">Pontuação</Label>
|
||||||
<Input
|
<Input
|
||||||
id="lancamento-pontuacao"
|
id="lancamento-pontuacao"
|
||||||
type="number"
|
type="text"
|
||||||
inputMode="numeric"
|
inputMode="decimal"
|
||||||
min={0}
|
|
||||||
step={1}
|
|
||||||
value={lancamentoPontuacao}
|
value={lancamentoPontuacao}
|
||||||
onKeyDown={(e) => {
|
|
||||||
if (e.key === "-" || e.key === "+" || e.key === "e" || e.key === "E" || e.key === "," || e.key === ".") {
|
|
||||||
e.preventDefault();
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
onChange={(e) => setLancamentoPontuacao(sanitizePontuacaoLancamentoDigitando(e.target.value))}
|
onChange={(e) => setLancamentoPontuacao(sanitizePontuacaoLancamentoDigitando(e.target.value))}
|
||||||
|
placeholder="Ex.: 1,5"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user