-
-
Notifications
You must be signed in to change notification settings - Fork 125
Sheffield | May-2025 | Waleed-Yahay Salih-Taha | Sprint 2 | Book Library #286
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
c830178
c3b7f29
e99d6aa
ff68704
3869805
300dc39
6b2c9a9
c21b787
5fd2034
808cd28
6473c1f
60240cb
196a070
2e0943e
555c393
410104f
b77a783
f032d63
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,103 +1,103 @@ | ||
let myLibrary = []; | ||
|
||
window.addEventListener("load", function (e) { | ||
window.onload = function () { | ||
// Cache DOM elements with clear suffixes | ||
const titleInputEl = document.getElementById("title"); | ||
const authorInputEl = document.getElementById("author"); | ||
const pagesInputEl = document.getElementById("pages"); | ||
const readCheckEl = document.getElementById("check"); | ||
const submitBtnEl = document.getElementById("submitBtn"); | ||
const bookFormEl = document.getElementById("bookForm"); | ||
const tbodyEl = document.querySelector("#display tbody"); | ||
|
||
// Initial setup | ||
populateStorage(); | ||
render(); | ||
}); | ||
|
||
function populateStorage() { | ||
if (myLibrary.length == 0) { | ||
let book1 = new Book("Robison Crusoe", "Daniel Defoe", "252", true); | ||
let book2 = new Book( | ||
"The Old Man and the Sea", | ||
"Ernest Hemingway", | ||
"127", | ||
true | ||
); | ||
myLibrary.push(book1); | ||
myLibrary.push(book2); | ||
render(); | ||
// Event listeners | ||
submitBtnEl.addEventListener("click", addBook); | ||
|
||
// --- Functions --- | ||
function populateStorage() { | ||
if (myLibrary.length === 0) { | ||
let book1 = new Book("Robison Crusoe", "Daniel Defoe", "252", true); | ||
let book2 = new Book("The Old Man and the Sea", "Ernest Hemingway", "127", true); | ||
myLibrary.push(book1, book2); | ||
render(); | ||
} | ||
} | ||
} | ||
|
||
const title = document.getElementById("title"); | ||
const author = document.getElementById("author"); | ||
const pages = document.getElementById("pages"); | ||
const check = document.getElementById("check"); | ||
function addBook() { | ||
// Preprocess & validate input | ||
const title = titleInputEl.value.trim(); | ||
const author = authorInputEl.value.trim(); | ||
const pages = pagesInputEl.value.trim(); | ||
const read = readCheckEl.checked; | ||
|
||
//check the right input from forms and if its ok -> add the new book (object in array) | ||
//via Book function and start render function | ||
function submit() { | ||
if ( | ||
title.value == null || | ||
title.value == "" || | ||
pages.value == null || | ||
pages.value == "" | ||
) { | ||
alert("Please fill all fields!"); | ||
return false; | ||
} else { | ||
let book = new Book(title.value, title.value, pages.value, check.checked); | ||
library.push(book); | ||
render(); | ||
} | ||
if (!title || !author || !pages || isNaN(Number(pages)) || Number(pages) <= 0) { | ||
alert("Please fill all fields with valid values (no empty spaces, pages must be a positive number)."); | ||
return; | ||
} | ||
if (!title || title.length < 2) { | ||
alert("Title must be at least 2 characters long."); | ||
return; | ||
} | ||
|
||
function Book(title, author, pages, check) { | ||
this.title = title; | ||
this.author = author; | ||
this.pages = pages; | ||
this.check = check; | ||
if (!author || author.length < 2) { | ||
alert("Author must be at least 2 characters long."); | ||
return; | ||
} | ||
const pageNum = Number(pages); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you place this line of code at the beginning of this function, you could then reference the value of this variable at lines 37. |
||
if (!Number.isInteger(pageNum) || pageNum <= 0 || pageNum > 10000) { | ||
alert("Pages must be a positive whole number (1–10,000)."); | ||
return; | ||
} | ||
|
||
function render() { | ||
let table = document.getElementById("display"); | ||
let rowsNumber = table.rows.length; | ||
//delete old table | ||
for (let n = rowsNumber - 1; n > 0; n-- { | ||
table.deleteRow(n); | ||
// Add book | ||
let book = new Book(title, author, pages, read); | ||
myLibrary.push(book); | ||
render(); | ||
bookFormEl.reset(); | ||
} | ||
Comment on lines
+50
to
60
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why not use the VSCode extension |
||
//insert updated row and cells | ||
let length = myLibrary.length; | ||
for (let i = 0; i < length; i++) { | ||
let row = table.insertRow(1); | ||
let titleCell = row.insertCell(0); | ||
let authorCell = row.insertCell(1); | ||
let pagesCell = row.insertCell(2); | ||
let wasReadCell = row.insertCell(3); | ||
let deleteCell = row.insertCell(4); | ||
titleCell.innerHTML = myLibrary[i].title; | ||
authorCell.innerHTML = myLibrary[i].author; | ||
pagesCell.innerHTML = myLibrary[i].pages; | ||
|
||
//add and wait for action for read/unread button | ||
let changeBut = document.createElement("button"); | ||
changeBut.id = i; | ||
changeBut.className = "btn btn-success"; | ||
wasReadCell.appendChild(changeBut); | ||
let readStatus = ""; | ||
if (myLibrary[i].check == false) { | ||
readStatus = "Yes"; | ||
} else { | ||
readStatus = "No"; | ||
} | ||
changeBut.innerText = readStatus; | ||
function Book(title, author, pages, read) { | ||
this.title = title; | ||
this.author = author; | ||
this.pages = pages; | ||
this.read = read; | ||
} | ||
|
||
changeBut.addEventListener("click", function () { | ||
myLibrary[i].check = !myLibrary[i].check; | ||
render(); | ||
}); | ||
function render() { | ||
tbodyEl.innerHTML = ""; | ||
|
||
//add delete button to every row and render again | ||
let delButton = document.createElement("button"); | ||
delBut.id = i + 5; | ||
deleteCell.appendChild(delBut); | ||
delBut.className = "btn btn-warning"; | ||
delBut.innerHTML = "Delete"; | ||
delBut.addEventListener("clicks", function () { | ||
alert(`You've deleted title: ${myLibrary[i].title}`); | ||
myLibrary.splice(i, 1); | ||
render(); | ||
myLibrary.forEach((book, i) => { | ||
let row = tbodyEl.insertRow(); | ||
|
||
row.insertCell(0).textContent = book.title; | ||
row.insertCell(1).textContent = book.author; | ||
row.insertCell(2).textContent = book.pages; | ||
|
||
// read/unread button | ||
let wasReadCell = row.insertCell(3); | ||
let changeBtnEl = document.createElement("button"); | ||
changeBtnEl.className = "btn btn-success"; | ||
changeBtnEl.textContent = book.read ? "Yes" : "No"; | ||
changeBtnEl.addEventListener("click", () => { | ||
book.read = !book.read; | ||
render(); | ||
}); | ||
wasReadCell.appendChild(changeBtnEl); | ||
|
||
// delete button | ||
let deleteCell = row.insertCell(4); | ||
let delBtnEl = document.createElement("button"); | ||
delBtnEl.className = "delete-btn"; | ||
delBtnEl.textContent = "Delete"; | ||
delBtnEl.addEventListener("click", () => { | ||
myLibrary.splice(i, 1); | ||
render(); | ||
alert(`The book "${book.title}" has been deleted successfully.`); | ||
}); | ||
deleteCell.appendChild(delBtnEl); | ||
}); | ||
} | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These set of code could be made an exception and place outside
window.onload
.Otherwise, the declared variables can only be accessed locally within the callback function.