import React, { useState, useEffect, useRef } from "react"; import DataGrid, {Column} from "devextreme-react/data-grid"; import {Alert} from "./AlertDialog.js"; import {addNumbersToGrid, numbersToArrOfArr, afterCommaLen} from "./helpers.js"; import "./App.css"; let imdtRes; let imdtResIdx; let resArr = []; let noOfDigits = 0; function Addition() { const [input, setInput] = useState(""); // initial user input like 34+56.7 const [realResult, setRealResult] = useState(0); // real result of calculation const [carryArr, setCarryArr] = useState([]); // array of carries ["1","0"] const [commaIdx, setCommaIdx] = useState(0); // int: comma position const [numbers, setNumbers] = useState(0); // array of arrays with input numbers const [showAlert, setShowAlert] = useState(false); const [numbersGrid, setNumbersGrid] = useState([{id: 1, number: ""}]); const [resultsGrid, setResultsGrid] = useState([{id: 1, number: ""}]); const [stepsGrid, setStepsGrid] = useState([{id: 1, step: ""}]); // focus the input field let calculationInput = useRef(null); useEffect(()=>{ if(calculationInput.current && calculationInput.current.value === ""){ calculationInput.current.focus(); } },[]) const handleInput = (e) => { setInput(e.target.value); } const handleResChange = (e, nosLeft) => { if(typeof e === "string"){ imdtRes = e; }else{ imdtRes = e.target.value; } // remove deleted input if(imdtRes === ""){ resArr.shift(); }else{ // add input number to result array resArr.unshift(imdtRes); } } const handleCarryChange = (e, noOfDigits, nosLeft) => { let carryArrCopy = [...carryArr]; carryArrCopy.unshift(e.target.value); setCarryArr(carryArrCopy); let noCarry = carryArrCopy[0] === "0" || carryArrCopy[0] === undefined if((nosLeft === 1 && noCarry) || // if stop after first iteration, numbers left is undefined at first (nosLeft !== nosLeft && realResult.toString().length === 1 && noCarry)){ nosLeft = 0; handleResChange(" ", 0) } if(nosLeft === 0){ createIdmtResults() setShowAlert(true); } } const handleSubmit = (e) => { startCalculation(); e.preventDefault(); // avoid page reload } const startCalculation = () => { if (input.includes("+")){ let numbers = input.split("+").map(x => parseFloat(x.replace(",","."))); let realRes = numbers.reduce((x,y) => x+y, 0); let afterComma = Math.max(...numbers.map(x => afterCommaLen(x))); realRes = parseFloat(realRes.toFixed(afterComma)); setRealResult(realRes); console.log("real result: ", realRes); let [numbersArr, commaIdx] = numbersToArrOfArr(numbers); setNumbers(numbersArr); setCommaIdx(commaIdx); setNumbersGrid(addNumbersToGrid(numbersArr, "+")); } } const ResultCarryForm = ({handleResChange, handleCarryChange}) => { let resInputField = useRef(null); let carryInputField = useRef(null); let labelText = ""; let nosLeft = imdtResIdx + 1; let carryText = "Übertrag = "; if(typeof numbers === "object" && imdtResIdx !== -1){ // set the digit index, start with the last digit if(typeof imdtResIdx === "undefined" || imdtResIdx === null){ noOfDigits = Math.min(...numbers.map(n => n.length)); imdtResIdx = noOfDigits - 1; } // skip over comma if(imdtResIdx === commaIdx){ if(!resArr.includes(".")){ handleResChange(".", nosLeft); } imdtResIdx = imdtResIdx - 1; nosLeft = nosLeft - 1; } // iterate numbers for this digit index for (let n in numbers){ // skip last empty number if no carry if(nosLeft === 1 && carryArr[0] === "0"){ nosLeft = 0; imdtResIdx = -1; return <>> } // create label text like: d + d + .. = input let digit = numbers[parseInt(n)][imdtResIdx]; if(digit === "" || digit === " "){ digit = 0; } labelText += digit; if (parseInt(n) === numbers.length - 1){ if(carryArr[0] !== undefined && carryArr[0] > 0){ labelText += " + " + carryArr[0].toString(); } labelText += " = "; }else{ labelText += " + "; } } imdtResIdx -= 1; nosLeft -= 1; return (
); }else{ return ( <> > ); } } const addButtonsToImdtSteps = () => { if(stepsGrid[0]["step"]!==""){ let table = document.getElementById("idmtResultSteps").getElementsByTagName("table")[0] let trs = table.getElementsByTagName("tr"); for(let trIdx in trs){ let tr = trs[trIdx]; if(tr instanceof HTMLElement && trIdx < trs.length-1){ let td = tr.getElementsByTagName("td")[0]; let btn = document.createElement("button"); btn.innerHTML = "hier starten"; btn.classList = "btn btn-secondary btn-sm"; btn.id = "btn-" + trIdx; btn.addEventListener("click", () => startOver(trIdx)); td.appendChild(btn); } } } } const showIdmtResults = () => { setShowAlert(false); document.getElementById("idmtResultSteps").style.display = "inline-block"; addButtonsToImdtSteps() } const createIdmtResults = () => { let realResArr = realResult.toString().split(""); while(realResArr.length < resArr.length){ realResArr.unshift(" "); // add " " before } let carries = carryArr.map(x => x || "0") carries.push("0"); while(carries.length < resArr.length){ carries.unshift("0"); // add "0" before } let foundComma = false; let stepsGridCopy = []; for (let i=0; i" + message + "
" document.getElementById("finishCalculation").innerHTML = message } return (