Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Web Calculator</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@300&family=Merriweather+Sans&family=Roboto+Slab&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/style.css">
</head>

<body>
<div>
<p class="heading">Calculator</p>
</div>
<div class="flex-container-column card">
<div class="display">
<h1 id="displayNumber">
0
</h1>
</div>
<div class="flex-container-row">
<div class="button operator" style="font-family: 'Roboto Slab', serif;">sin^-1</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">cos^-1</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">tan^-1</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">e</div>
</div>
<div class="flex-container-row">
<div class="button operator" style="font-family: 'Roboto Slab', serif;">|x|</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">x^2</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">sqrt</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">/</div>
</div>
<div class="flex-container-row">
<div class="button operator" style="font-family: 'Roboto Slab', serif;">ln</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">log</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">1/x</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">*</div>
</div>
<div class="flex-container-row">
<div class="button operator" style="font-family: 'Roboto Slab', serif;">sin</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">cos</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">tan</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">^</div>
</div>
<div class="flex-container-row">
<div class="button" style="font-family: 'Roboto Slab', serif;">7</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">8</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">9</div>
<div class="button negative" style="font-family: 'Roboto Slab', serif;">+/-</div>
</div>
<div class="flex-container-row">
<div class="button" style="font-family: 'Roboto Slab', serif;">4</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">5</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">6</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">-</div>
</div>
<div class="flex-container-row">
<div class="button" style="font-family: 'Roboto Slab', serif;">1</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">2</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">3</div>
<div class="button operator" style="font-family: 'Roboto Slab', serif;">+</div>
</div>
<div class="flex-container-row">
<div class="button clear" style="font-family: 'Roboto Slab', serif;">AC</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">0</div>
<div class="button" style="font-family: 'Roboto Slab', serif;">.</div>
<div class="button equals" style="font-family: 'Roboto Slab', serif;">=</div>
</div>
</div>

<div class="history card">
<h2>History</h2>
<table>
<thead>
<tr>
<th style="font-family: 'Roboto Slab', serif;">First Num</th>
<th style="font-family: 'Roboto Slab', serif;">Operator</th>
<th style="font-family: 'Roboto Slab', serif;">Second Num</th>
<th style="font-family: 'Roboto Slab', serif;">Result</th>
</tr>
</thead>
<tbody id="historyList"></tbody>
</table>
</div>

<div>
<p class="center" style="margin-top: 50px;">Copyright 2022 Phantom</p>
</div>

<script src="storingData.js"></script>
<script src="script.js"></script>
</body>

</html>
158 changes: 158 additions & 0 deletions script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
const calculator = {
displayNumber: '0',
operator: null,
firstNumber: null,
waitingForSecondNumber: false
};

function updateDisplay() {
document.querySelector("#displayNumber").innerText = calculator.displayNumber;
}

function clearCalculator() {
calculator.displayNumber = '0';
calculator.operator = null;
calculator.firstNumber = null;
calculator.waitingForSecondNumber = false;
}

function inputDigit(digit) {
if (calculator.waitingForSecondNumber && calculator.firstNumber === calculator.displayNumber) {
calculator.displayNumber = digit;
} else {
if (calculator.displayNumber === '0') {
calculator.displayNumber = digit;
} else {
calculator.displayNumber += digit;
}
}
}

function inverseNumber() {
if (calculator.displayNumber === '0') {
return;
}
calculator.displayNumber = calculator.displayNumber * -1;
}

function handleOperator(operator) {
if (!calculator.waitingForSecondNumber) {
calculator.operator = operator;
calculator.waitingForSecondNumber = true;
calculator.firstNumber = calculator.displayNumber;
} else {
alert('Enter 2nd number first')
}
}

function performCalculation() {
if (calculator.firstNumber == null || calculator.operator == null) {
alert("Enter a number first");
return;
}

let result = 0;
if (calculator.operator === "+") {
result = parseFloat(calculator.firstNumber) + parseFloat(calculator.displayNumber);
}
if (calculator.operator === "-") {
result = parseFloat(calculator.firstNumber) - parseFloat(calculator.displayNumber)
}
if (calculator.operator === "*") {
result = parseFloat(calculator.firstNumber) * parseFloat(calculator.displayNumber)
}
if (calculator.operator === "/") {
result = parseFloat(calculator.firstNumber) / parseFloat(calculator.displayNumber)
}
if (calculator.operator === "1/x") {
result = 1/parseFloat(calculator.firstNumber)
}
if (calculator.operator === "sin") {
result = Math.sin(parseFloat(calculator.firstNumber))
}
if (calculator.operator === "cos") {
result = Math.cos(parseFloat(calculator.firstNumber))
}
if (calculator.operator === "tan") {
result = Math.tan(parseFloat(calculator.firstNumber))
}
if (calculator.operator === "log") {
result = Math.log10(parseFloat(calculator.firstNumber))
}
if (calculator.operator === "ln") {
result = Math.log(parseFloat(calculator.firstNumber))
}
if (calculator.operator === "^") {
result = Math.pow(parseFloat(calculator.firstNumber),parseFloat(calculator.displayNumber) )
}
if (calculator.operator === "sqrt") {
result = Math.sqrt(parseFloat(calculator.firstNumber))
}
if (calculator.operator == "x^2") {
result = Math.pow(parseFloat(calculator.firstNumber),2)
}
if (calculator.operator == "|x|") {
result = Math.abs(parseFloat(calculator.firstNumber))
}
if (calculator.operator == "sin^-1") {
result = Math.asin(parseFloat(calculator.firstNumber))
}
if (calculator.operator == "cos^-1") {
result = Math.acos(parseFloat(calculator.firstNumber))
}
if (calculator.operator == "tan^-1") {
result = Math.atan(parseFloat(calculator.firstNumber))
}
if (calculator.operator == "e") {
result = Math.exp(parseFloat(calculator.firstNumber))
}
// if()


// objek yang akan dikirimkan sebagai argumen fungsi putHistory()
const history = {
firstNumber: calculator.firstNumber,
secondNumber: calculator.displayNumber,
operator: calculator.operator,
result: result
}
putHistory(history);
calculator.displayNumber = result;
renderHistory();
}

const buttons = document.querySelectorAll(".button");
for (let button of buttons) {
button.addEventListener('click', function (event) {

// mendapatkan objek elemen yang diklik
const target = event.target;

if (target.classList.contains('clear')) {
clearCalculator();
updateDisplay();
return;
}

if (target.classList.contains('negative')) {
inverseNumber();
updateDisplay();
return;
}

if (target.classList.contains('equals')) {
performCalculation();
updateDisplay();
return;
}

if (target.classList.contains('operator')) {
handleOperator(target.innerText)
updateDisplay();
return;
}

inputDigit(target.innerText);
updateDisplay()
});
}
82 changes: 82 additions & 0 deletions storingData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
const CACHE_KEY = "calculation_history";

function checkForStorage() {
return typeof (Storage) !== "undefined";
}

function putHistory(data) {
if (checkForStorage()) {
let historyData = null;
if (localStorage.getItem(CACHE_KEY) === null) {
historyData = [];
} else {
historyData = JSON.parse(localStorage.getItem(CACHE_KEY));
}

historyData.unshift(data);

if (historyData.length > 5) {
historyData.pop();
}

localStorage.setItem(CACHE_KEY, JSON.stringify(historyData));
}
}

function showHistory() {
if (checkForStorage) {
return JSON.parse(localStorage.getItem(CACHE_KEY)) || [];
} else {
return [];
}
}

function renderHistory() {
const historyData = showHistory();
let historyList = document.querySelector("#historyList");
historyList.innerHTML = "";

for (let history of historyData) {
let row = document.createElement('tr');
row.innerHTML = "<td>" + history.firstNumber + "</td>";
row.innerHTML += "<td>" + history.operator + "</td>";
row.innerHTML += "<td>" + history.secondNumber + "</td>";
row.innerHTML += "<td>" + history.result + "</td>";

historyList.appendChild(row);
}
}

renderHistory();

const history = {
firstNumber: calculator.firstNumber,
secondNumber: calculator.displayNumber,
operator: calculator.operator,
result: result
}

function performCalculation() {
if (calculator.firstNumber == null || calculator.operator == null) {
alert("Anda belum menetapkan operator");
return;
}

let result = 0;
if (calculator.operator === "+") {
result = parseInt(calculator.firstNumber) + parseInt(calculator.displayNumber);
} else {
result = parseInt(calculator.firstNumber) - parseInt(calculator.displayNumber)
}

// objek yang akan dikirimkan sebagai argumen fungsi putHistory()
const history = {
firstNumber: calculator.firstNumber,
secondNumber: calculator.displayNumber,
operator: calculator.operator,
result: result
}
putHistory(history);
calculator.displayNumber = result;
renderHistory();
}
Loading