248 lines
9.6 KiB
JavaScript
248 lines
9.6 KiB
JavaScript
import {initCore} from "../../js/nibblepoker-core.mjs";
|
|
//import {Decimal} from "../../../DecimalJs/10.6.0/decimal.mjs";
|
|
import {Decimal} from "../../../DecimalJs-Light/2.5.1/decimal.mjs";
|
|
import {getInputCount, getInputNumber} from "../../libs/input-utils.mjs";
|
|
|
|
// Tool-centric stuff
|
|
{
|
|
initCore();
|
|
|
|
const classesReadonly = ["bkgd-gray"];
|
|
|
|
const calcRadioGroupName = "vat_calc_target";
|
|
|
|
/** @type {HTMLLabelElement} */
|
|
const ePresetShortLabel = document.querySelector("label[for=vat-calculator-preset-short]");
|
|
/** @type {HTMLSelectElement} */
|
|
const ePresetShortSelect = document.getElementById("vat-calculator-preset-short");
|
|
|
|
/** @type {HTMLLabelElement} */
|
|
const ePresetDetailedLabel = document.querySelector("label[for=vat-calculator-preset-detailed]");
|
|
/** @type {HTMLSelectElement} */
|
|
const ePresetDetailedSelect = document.getElementById("vat-calculator-preset-detailed");
|
|
|
|
/** @type {HTMLInputElement} */
|
|
const eCheckboxDetailedPreset = document.getElementById("vat-calculator-detailed-presets");
|
|
|
|
/** @type {HTMLSpanElement} */
|
|
const ePresetEchoedCountry = document.getElementById("vat-calculator-preset-country-echo");
|
|
|
|
/** @type {HTMLButtonElement} */
|
|
const eButtonDecimalPlacesMinus = document.getElementById("vat-calculator-decimal-places-minus");
|
|
/** @type {HTMLInputElement} */
|
|
const eInputDecimalPlaces = document.getElementById("vat-calculator-option-decimal-places");
|
|
/** @type {HTMLButtonElement} */
|
|
const eButtonDecimalPlacesPlus = document.getElementById("vat-calculator-decimal-places-plus");
|
|
|
|
/* #vat-calculator-detailed-trim-zeroes */
|
|
|
|
/** @type {HTMLInputElement} */
|
|
const eCalcRateRadio = document.getElementById("vat-calculator-radio-rate");
|
|
/** @type {HTMLInputElement} */
|
|
const eCalcRateInput = document.getElementById("vat-calculator-input-rate");
|
|
|
|
/** @type {HTMLInputElement} */
|
|
const eCalcUntaxedRadio = document.getElementById("vat-calculator-radio-untaxed");
|
|
/** @type {HTMLInputElement} */
|
|
const eCalcUntaxedInput = document.getElementById("vat-calculator-input-untaxed");
|
|
|
|
/** @type {HTMLInputElement} */
|
|
const eCalcTaxedRadio = document.getElementById("vat-calculator-radio-taxed");
|
|
/** @type {HTMLInputElement} */
|
|
const eCalcTaxedInput = document.getElementById("vat-calculator-input-taxed");
|
|
|
|
/** @type {HTMLSelectElement} */
|
|
const eRoundingModeSelect = document.getElementById("vat-calculator-rounding-mode");
|
|
|
|
/**
|
|
* Handles the switch between the short and detailed standard rates selects
|
|
*/
|
|
function handlePresetDetailLevelChange() {
|
|
ePresetShortLabel.hidden = eCheckboxDetailedPreset.checked;
|
|
ePresetShortSelect.hidden = eCheckboxDetailedPreset.checked;
|
|
ePresetDetailedLabel.hidden = !eCheckboxDetailedPreset.checked;
|
|
ePresetDetailedSelect.hidden = !eCheckboxDetailedPreset.checked;
|
|
}
|
|
|
|
/** @returns {number} */
|
|
function getDecimalPlaces() {
|
|
return getInputCount(eInputDecimalPlaces, 0, 99);
|
|
}
|
|
|
|
function changeDecimalPlacesDesiredCount(difference = 0) {
|
|
if (difference !== 0) {
|
|
eInputDecimalPlaces.value = getInputCount(eInputDecimalPlaces, 0, 99) + difference;
|
|
}
|
|
eInputDecimalPlaces.value = getInputCount(eInputDecimalPlaces, 0, 99);
|
|
}
|
|
|
|
/**
|
|
* Handles the locking and unlocking of the calculator input fields.
|
|
* @param eInput {HTMLInputElement}
|
|
* @param isLocked {boolean}
|
|
*/
|
|
function setCalcFieldLockStatus(eInput, isLocked) {
|
|
eInput.readOnly = isLocked;
|
|
classesReadonly.forEach((roClass) => {
|
|
eInput.classList.remove(roClass);
|
|
if(isLocked) {
|
|
eInput.classList.add(roClass);
|
|
}
|
|
});
|
|
}
|
|
|
|
function handleCalcValueChange() {
|
|
let vatRate = getInputNumber(eCalcRateInput);
|
|
let untaxedValue = getInputNumber(eCalcUntaxedInput);
|
|
let taxedValue = getInputNumber(eCalcTaxedInput);
|
|
|
|
if(eCalcRateRadio.checked) {
|
|
if(untaxedValue === null || taxedValue === null || isNaN(untaxedValue) || isNaN(taxedValue)) {
|
|
return;
|
|
}
|
|
untaxedValue = new Decimal(eCalcUntaxedInput.value);
|
|
taxedValue = new Decimal(eCalcTaxedInput.value);
|
|
|
|
eCalcRateInput.value = taxedValue
|
|
.minus(untaxedValue)
|
|
.div(untaxedValue)
|
|
.times(100)
|
|
.toDecimalPlaces(getDecimalPlaces());
|
|
} else if(eCalcUntaxedRadio.checked) {
|
|
if(vatRate === null || taxedValue === null || isNaN(vatRate) || isNaN(taxedValue)) {
|
|
return;
|
|
}
|
|
vatRate = new Decimal(eCalcRateInput.value).dividedBy(100).plus(1);
|
|
taxedValue = new Decimal(eCalcTaxedInput.value);
|
|
|
|
eCalcUntaxedInput.value = taxedValue
|
|
.dividedBy(vatRate)
|
|
.toDecimalPlaces(getDecimalPlaces());
|
|
} else if(eCalcTaxedRadio.checked) {
|
|
if(vatRate === null || untaxedValue === null || isNaN(vatRate) || isNaN(untaxedValue)) {
|
|
return;
|
|
}
|
|
vatRate = new Decimal(eCalcRateInput.value).dividedBy(100).plus(1);
|
|
untaxedValue = new Decimal(eCalcUntaxedInput.value);
|
|
|
|
eCalcTaxedInput.value = untaxedValue
|
|
.times(vatRate)
|
|
.toDecimalPlaces(getDecimalPlaces());
|
|
}
|
|
}
|
|
|
|
function handleDecimalConfigChange() {
|
|
Decimal.set({
|
|
rounding: getInputCount(eRoundingModeSelect, 0, 8),
|
|
precision: 99,
|
|
defaults: true,
|
|
});
|
|
}
|
|
|
|
function handlePresetChange() {
|
|
if(ePresetShortSelect.value.length > 0) {
|
|
let eSelectedOption = ePresetShortSelect.querySelector('option:checked');
|
|
if(eSelectedOption === null) {
|
|
return;
|
|
}
|
|
|
|
let eSelectedOptionGroup = eSelectedOption.closest('optgroup');
|
|
if(eSelectedOptionGroup === null) {
|
|
return;
|
|
}
|
|
|
|
ePresetEchoedCountry.innerHTML = eSelectedOptionGroup.label;
|
|
} else {
|
|
ePresetEchoedCountry.innerHTML = "";
|
|
}
|
|
}
|
|
|
|
window.onload = function () {
|
|
// Handling the detailed rate toggle
|
|
eCheckboxDetailedPreset.addEventListener("click", function () {
|
|
handlePresetDetailLevelChange();
|
|
});
|
|
|
|
// Handling the rate select input
|
|
ePresetShortSelect.addEventListener("change", function () {
|
|
ePresetDetailedSelect.selectedIndex = ePresetShortSelect.selectedIndex;
|
|
eCalcRateInput.value = ePresetShortSelect.value;
|
|
handlePresetChange();
|
|
handleCalcValueChange();
|
|
});
|
|
ePresetDetailedSelect.addEventListener("change", function () {
|
|
ePresetShortSelect.selectedIndex = ePresetDetailedSelect.selectedIndex;
|
|
eCalcRateInput.value = ePresetDetailedSelect.value;
|
|
handlePresetChange();
|
|
handleCalcValueChange();
|
|
});
|
|
|
|
// Handling calc radio input change
|
|
document.addEventListener("change", (e) => {
|
|
if (e.target.type === "radio" && e.target.name === calcRadioGroupName) {
|
|
setCalcFieldLockStatus(eCalcRateInput, e.target.value === "0");
|
|
setCalcFieldLockStatus(eCalcUntaxedInput, e.target.value === "1");
|
|
setCalcFieldLockStatus(eCalcTaxedInput, e.target.value === "2");
|
|
|
|
ePresetDetailedSelect.disabled = e.target === eCalcRateRadio;
|
|
ePresetShortSelect.disabled = e.target === eCalcRateRadio;
|
|
}
|
|
});
|
|
eCalcRateRadio.addEventListener("change", function () {
|
|
ePresetShortSelect.selectedIndex = 0;
|
|
ePresetDetailedSelect.selectedIndex = 0;
|
|
handlePresetChange();
|
|
});
|
|
|
|
// Handling decimal places options
|
|
eButtonDecimalPlacesMinus.addEventListener("click", function () {
|
|
changeDecimalPlacesDesiredCount(-1);
|
|
handleDecimalConfigChange();
|
|
handleCalcValueChange();
|
|
});
|
|
eButtonDecimalPlacesPlus.addEventListener("click", function () {
|
|
changeDecimalPlacesDesiredCount(1);
|
|
handleDecimalConfigChange();
|
|
handleCalcValueChange();
|
|
});
|
|
eInputDecimalPlaces.addEventListener("change", function() {
|
|
changeDecimalPlacesDesiredCount(0);
|
|
handleDecimalConfigChange();
|
|
handleCalcValueChange();
|
|
});
|
|
eInputDecimalPlaces.addEventListener("mousewheel", function(e) {
|
|
// Handling wheel scroll on count field.
|
|
if(e.wheelDelta < 0) {
|
|
changeDecimalPlacesDesiredCount(-1);
|
|
} else {
|
|
changeDecimalPlacesDesiredCount(1);
|
|
}
|
|
handleDecimalConfigChange();
|
|
handleCalcValueChange();
|
|
});
|
|
|
|
// Handling other DecimalJs config fields
|
|
eRoundingModeSelect.addEventListener("change", function() {
|
|
handleDecimalConfigChange();
|
|
handleCalcValueChange();
|
|
});
|
|
|
|
// Handling the calculator field changes
|
|
eCalcRateInput.addEventListener("change", function() {
|
|
ePresetShortSelect.selectedIndex = 0;
|
|
ePresetDetailedSelect.selectedIndex = 0;
|
|
handleCalcValueChange();
|
|
handlePresetChange();
|
|
});
|
|
eCalcUntaxedInput.addEventListener("change", function() {
|
|
handleCalcValueChange();
|
|
});
|
|
eCalcTaxedInput.addEventListener("change", function() {
|
|
handleCalcValueChange();
|
|
});
|
|
|
|
handlePresetDetailLevelChange();
|
|
handleDecimalConfigChange();
|
|
handlePresetChange();
|
|
}
|
|
} |