|
8 | 8 | <div class="calc-fields"> |
9 | 9 | {{ .Inner | .Page.RenderString (dict "wrapperId" $wrapperId) }} |
10 | 10 | </div> |
11 | | - <button class="calc-btn" onclick="calc_('{{$wrapperId}}')">Calculate</button> |
12 | | - <div class="calc-answer" id="answer-{{ $wrapperId }}">Result: </div> |
| 11 | + <button class="calc-btn" onclick="calc_('{{ $wrapperId }}')">Calculate</button> |
13 | 12 | </div> |
14 | | - |
15 | 13 | <script> |
16 | 14 | function calc_(Id) { |
17 | | - // Use the wrapper ID to find the correct elements |
18 | | - var wrapper = document.getElementById(Id); |
19 | | - {{/* var wrapper = document.getElementById('{{ $wrapperId }}'); */}} |
| 15 | + var wrapper = document.getElementById(Id); |
20 | 16 | var inputs = wrapper.querySelectorAll('input[data-calc-var]'); |
21 | 17 | var vars = {}; |
22 | 18 | inputs.forEach(function(input) { |
23 | 19 | var name = input.getAttribute('data-calc-var'); |
24 | 20 | vars[name] = parseFloat(input.value) || 0; |
25 | 21 | }); |
26 | | - var formulaInput = wrapper.querySelector('input[data-calc-formula]'); |
27 | | - var answerDiv = wrapper.querySelector('.calc-answer'); |
28 | | - if (!formulaInput || !answerDiv) { |
29 | | - answerDiv.textContent = "Result: Error (missing formula or answer)"; |
30 | | - return; |
31 | | - } |
32 | | - var formula = formulaInput.value; |
33 | | - Object.keys(vars).forEach(function(name) { |
34 | | - var re = new RegExp('\\b' + name + '\\b', 'g'); |
35 | | - formula = formula.replace(re, vars[name]); |
| 22 | + |
| 23 | + // Evaluate formulas in order, storing results by label |
| 24 | + var formulas = wrapper.querySelectorAll('[data-calc-formula]'); |
| 25 | + formulas.forEach(function(formulaEl) { |
| 26 | + var label = formulaEl.getAttribute('data-calc-label'); |
| 27 | + var formula = formulaEl.getAttribute('data-calc-formula'); |
| 28 | + // Replace all variable names in the formula with their values |
| 29 | + Object.keys(vars).forEach(function(name) { |
| 30 | + var re = new RegExp('\\b' + name + '\\b', 'g'); |
| 31 | + formula = formula.replace(re, vars[name]); |
| 32 | + }); |
| 33 | + // Replace previous formula results by label |
| 34 | + Object.keys(vars).forEach(function(name) { |
| 35 | + var re = new RegExp('\\b' + name + '\\b', 'g'); |
| 36 | + formula = formula.replace(re, vars[name]); |
| 37 | + }); |
| 38 | + try { |
| 39 | + var result = eval(formula); |
| 40 | + vars[label] = result; |
| 41 | + // Show result in the formula label if a result span exists |
| 42 | + var resultSpan = formulaEl.parentElement.querySelector('.calc-formula-result'); |
| 43 | + if(resultSpan) resultSpan.textContent = " = " + result; |
| 44 | + } catch (e) { |
| 45 | + if(resultSpan) resultSpan.textContent = " = Error"; |
| 46 | + } |
36 | 47 | }); |
37 | | - try { |
38 | | - var result = eval(formula); |
39 | | - answerDiv.textContent = "Result: " + result; |
40 | | - } catch (e) { |
41 | | - answerDiv.textContent = "Result: Error"; |
| 48 | + |
| 49 | + // Show the last formula's result in the answer box |
| 50 | + var lastLabel = formulas.length ? formulas[formulas.length-1].getAttribute('data-calc-label') : null; |
| 51 | + var answerDiv = wrapper.querySelector('.calc-answer'); |
| 52 | + if (answerDiv && lastLabel && vars[lastLabel] !== undefined) { |
| 53 | + answerDiv.textContent = "Result: " + vars[lastLabel]; |
42 | 54 | } |
43 | 55 | } |
44 | 56 | </script> |
0 commit comments