Files
sure/app/javascript/controllers/money_field_controller.js
Louis cc8d6ca2a0 fix: allow high precision for security prices in trade forms (to solve #1323) (#1342)
* fix: allow high precision for security prices in trade forms (to solve #1323)

* fix: prevent race conditions on currency selection in money field

* fix: silently ignore currency fetch errors in money field
2026-04-07 12:19:17 +02:00

52 lines
1.7 KiB
JavaScript

import { Controller } from "@hotwired/stimulus";
import { CurrenciesService } from "services/currencies_service";
import parseLocaleFloat from "utils/parse_locale_float";
// Connects to data-controller="money-field"
// when currency select change, update the input value with the correct placeholder and step
export default class extends Controller {
static targets = ["amount", "currency", "symbol"];
static values = {
precision: Number,
step: String,
};
requestSequence = 0;
handleCurrencyChange(e) {
const selectedCurrency = e.target.value;
this.updateAmount(selectedCurrency);
}
updateAmount(currency) {
const requestId = ++this.requestSequence;
new CurrenciesService().get(currency).then((currencyData) => {
if (requestId !== this.requestSequence) return;
this.amountTarget.step =
this.hasStepValue &&
this.stepValue !== "" &&
(this.stepValue === "any" || Number.isFinite(Number(this.stepValue)))
? this.stepValue
: currencyData.step;
const rawValue = this.amountTarget.value.trim();
if (rawValue !== "") {
const parsedAmount = parseLocaleFloat(rawValue);
if (Number.isFinite(parsedAmount)) {
const precision =
this.hasPrecisionValue && Number.isInteger(this.precisionValue)
? this.precisionValue
: currencyData.default_precision;
this.amountTarget.value = parsedAmount.toFixed(precision);
}
}
this.symbolTarget.innerText = currencyData.symbol;
}).catch(() => {
// Catch prevents Unhandled Promise Rejection for network failures.
// Silently ignored as they are unactionable by the user.
});
}
}