├── 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 | | Angka Pertama |
45 | Operator |
46 | Angka Kedua |
47 | Hasil |
48 |
49 |
50 |
51 |
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 | }
--------------------------------------------------------------------------------