├── README.md ├── assets ├── storage.js ├── style.css └── Kalkulator.js └── index.html /README.md: -------------------------------------------------------------------------------- 1 | # Website Kalkulator 2 | -------------------------------------------------------------------------------- /assets/storage.js: -------------------------------------------------------------------------------- 1 | const CACHE_KEY = "calculation_history"; 2 | 3 | function checkForStorage() { 4 | return typeof(Storage) !== "undefined"; 5 | } 6 | 7 | function putHistory(data) { 8 | if (checkForStorage()) { 9 | let historyData = null; 10 | if (localStorage.getItem(CACHE_KEY) === null) { 11 | historyData = []; 12 | } else { 13 | historyData = JSON.parse(localStorage.getItem(CACHE_KEY)); 14 | } 15 | 16 | historyData.unshift(data); 17 | 18 | if (historyData.length > 5) { 19 | historyData.pop(); 20 | } 21 | 22 | localStorage.setItem(CACHE_KEY, JSON.stringify(historyData)); 23 | } 24 | } 25 | 26 | function showHistory() { 27 | if (checkForStorage) { 28 | return JSON.parse(localStorage.getItem(CACHE_KEY)) || []; 29 | } else { 30 | return []; 31 | } 32 | } 33 | 34 | function renderHistory() { 35 | const historyData = showHistory(); 36 | let historyList = document.querySelector("#historyList"); 37 | historyList.innerHTML = ""; 38 | 39 | for (let history of historyData) { 40 | let row = document.createElement('tr'); 41 | row.innerHTML = "" + history.firstNumber + ""; 42 | row.innerHTML += "" + history.operator + ""; 43 | row.innerHTML += "" + history.secondNumber + ""; 44 | row.innerHTML += "" + history.result + ""; 45 | 46 | historyList.appendChild(row); 47 | } 48 | } 49 | 50 | renderHistory(); -------------------------------------------------------------------------------- /assets/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | body { 6 | font-family: sans-serif; 7 | } 8 | 9 | .flex-container-column { 10 | display: flex; 11 | flex-direction: column; 12 | max-width: 800px; 13 | margin: 0 auto; 14 | text-align: right; 15 | } 16 | 17 | .flex-container-row { 18 | display: flex; 19 | } 20 | 21 | .button { 22 | flex-basis: 25%; 23 | font-size: 1.5em; 24 | text-align: center; 25 | padding: 40px; 26 | border: 1px solid black; 27 | background: -webkit-linear-gradient(top, #d2d2d2, #ddd); 28 | cursor: pointer; 29 | } 30 | 31 | .double { 32 | flex-basis: 50%; 33 | } 34 | 35 | .display { 36 | color: white; 37 | width: 100%; 38 | padding: 10px 20px; 39 | background-color: #333333; 40 | border: 1px solid black; 41 | font-size: 2em; 42 | } 43 | 44 | .operator, 45 | .negative, 46 | .equals { 47 | background: orange; 48 | } 49 | 50 | .card { 51 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); 52 | border-radius: 5px; 53 | padding: 30px; 54 | margin-top: 20px; 55 | } 56 | 57 | .button:hover { 58 | font-weight: bold; 59 | } 60 | 61 | .history { 62 | width: 80%; 63 | margin: 30px auto 0 auto; 64 | overflow: scroll; 65 | } 66 | 67 | table { 68 | border-collapse: collapse; 69 | border-spacing: 0; 70 | width: 100%; 71 | border: 1px solid #ddd; 72 | } 73 | 74 | th, 75 | td { 76 | text-align: center; 77 | padding: 16px; 78 | } 79 | 80 | th { 81 | background-color: orange; 82 | color: white; 83 | } 84 | 85 | tr:nth-child(even) { 86 | background-color: #d2d2d2; 87 | } 88 | 89 | @media screen and (max-width: 513px) { 90 | .button { 91 | padding: 10px; 92 | } 93 | .history { 94 | width: 100%; 95 | } 96 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Calculator | Bert 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 |

0

14 |
15 |
16 |
7
17 |
8
18 |
9
19 |
+/-
20 |
21 |
22 |
4
23 |
5
24 |
6
25 |
-
26 |
27 |
28 |
1
29 |
2
30 |
3
31 |
+
32 |
33 |
34 |
CE
35 |
0
36 |
=
37 |
38 |
39 |
40 |

Riwayat Perhitungan

41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
Angka PertamaOperatorAngka KeduaHasil
52 |
53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /assets/Kalkulator.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const calculator = { 4 | displayNumber: '0', 5 | operator: null, 6 | firstNumber: null, 7 | isWaitForSecondNumber: false, 8 | }; 9 | 10 | function updateDisplay() { 11 | document.querySelector('#displayNumber').innerText = calculator.displayNumber; 12 | } 13 | 14 | function clearCalculator() { 15 | calculator.displayNumber = '0'; 16 | calculator.operator = null; 17 | calculator.firstNumber = null; 18 | calculator.isWaitForSecondNumber = false; 19 | } 20 | 21 | function inputDigit(digit) { 22 | if (calculator.displayNumber === '0') { 23 | calculator.displayNumber = digit; 24 | } else { 25 | calculator.displayNumber += digit; 26 | } 27 | } 28 | 29 | function inverseNumber() { 30 | if (calculator.displayNumber === '0') { 31 | return; 32 | } 33 | calculator.displayNumber = calculator.displayNumber * -1; 34 | } 35 | 36 | function handleOperator(operator) { 37 | if (!calculator.isWaitForSecondNumber) { 38 | calculator.operator = operator; 39 | calculator.isWaitForSecondNumber = true; 40 | calculator.firstNumber = calculator.displayNumber; 41 | 42 | // mengatur ulang nilai display number supaya tombol selanjutnya dimulai dari angka pertama lagi 43 | calculator.displayNumber = '0'; 44 | } else { 45 | alert('Operator sudah ditetapkan'); 46 | } 47 | } 48 | 49 | function performCalculation() { 50 | if (calculator.firstNumber == null || calculator.operator == null) { 51 | alert("Anda belum menetapkan operator"); 52 | return; 53 | } 54 | 55 | let result = 0; 56 | if (calculator.operator === "+") { 57 | result = parseInt(calculator.firstNumber) + parseInt(calculator.displayNumber); 58 | } else { 59 | result = parseInt(calculator.firstNumber) - parseInt(calculator.displayNumber) 60 | } 61 | 62 | // objek yang akan dikirimkan sebagai argumen fungsi putHistory() 63 | const history = { 64 | firstNumber: calculator.firstNumber, 65 | secondNumber: calculator.displayNumber, 66 | operator: calculator.operator, 67 | result: result 68 | } 69 | putHistory(history); 70 | calculator.displayNumber = result; 71 | renderHistory(); 72 | } 73 | 74 | const buttons = document.querySelectorAll('.button'); 75 | 76 | for (const button of buttons) { 77 | button.addEventListener('click', function (event) { 78 | // mendapatkan objek elemen yang diklik 79 | const target = event.target; 80 | 81 | if (target.classList.contains('clear')) { 82 | clearCalculator(); 83 | updateDisplay(); 84 | return; 85 | } 86 | 87 | if (target.classList.contains('negative')) { 88 | inverseNumber(); 89 | updateDisplay(); 90 | return; 91 | } 92 | 93 | if (target.classList.contains('equals')) { 94 | performCalculation(); 95 | updateDisplay(); 96 | return; 97 | } 98 | 99 | if (target.classList.contains('operator')) { 100 | handleOperator(target.innerText); 101 | return; 102 | } 103 | 104 | inputDigit(target.innerText); 105 | updateDisplay(); 106 | }); 107 | } 108 | 109 | const history = { 110 | firstNumber: calculator.firstNumber, 111 | secondNumber: calculator.displayNumber, 112 | operator: calculator.operator, 113 | result: result 114 | } --------------------------------------------------------------------------------