-
-
Notifications
You must be signed in to change notification settings - Fork 232
London | 26-ITP-Jan | Asha Ahmed | Sprint 2 | Book Library #421
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
base: main
Are you sure you want to change the base?
Changes from all commits
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,45 +1,64 @@ | ||
| let myLibrary = []; | ||
|
|
||
| window.addEventListener("load", function (e) { | ||
| const titleInputEl = document.getElementById("title"); | ||
| const authorInputEl = document.getElementById("author"); | ||
| const pagesInputEl = document.getElementById("pages"); | ||
| const isReadInputEl = document.getElementById("check"); | ||
| const submitBookBtnEl = document.getElementById("submit-book-btn"); | ||
| const displayTableEl = document.getElementById("display"); | ||
|
|
||
| window.addEventListener("load", function () { | ||
| populateStorage(); | ||
| render(); | ||
| }); | ||
|
|
||
| submitBookBtnEl.addEventListener("click", submit); | ||
|
|
||
| function populateStorage() { | ||
| if (myLibrary.length == 0) { | ||
| let book1 = new Book("Robison Crusoe", "Daniel Defoe", "252", true); | ||
| 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", | ||
| 127, | ||
| true | ||
| ); | ||
| myLibrary.push(book1); | ||
| myLibrary.push(book2); | ||
| render(); | ||
| } | ||
| } | ||
|
|
||
| const title = document.getElementById("title"); | ||
| const author = document.getElementById("author"); | ||
| const pages = document.getElementById("pages"); | ||
| const check = document.getElementById("check"); | ||
|
|
||
| //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() { | ||
| const normalizedTitle = titleInputEl.value.trim(); | ||
| const normalizedAuthor = authorInputEl.value.trim(); | ||
| const pagesCount = Number(pagesInputEl.value); | ||
|
|
||
| if ( | ||
| title.value == null || | ||
| title.value == "" || | ||
| pages.value == null || | ||
| pages.value == "" | ||
| normalizedTitle === "" || | ||
| normalizedAuthor === "" || | ||
| !Number.isInteger(pagesCount) || | ||
| pagesCount <= 0 | ||
| ) { | ||
| alert("Please fill all fields!"); | ||
| alert( | ||
|
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. NIce error handling |
||
| "Please fill all fields correctly. Title and author are required, and page count must be a positive whole number." | ||
| ); | ||
| return false; | ||
| } else { | ||
| let book = new Book(title.value, title.value, pages.value, check.checked); | ||
| library.push(book); | ||
| let book = new Book( | ||
| normalizedTitle, | ||
| normalizedAuthor, | ||
| pagesCount, | ||
| isReadInputEl.checked | ||
| ); | ||
| myLibrary.push(book); | ||
| render(); | ||
|
|
||
| titleInputEl.value = ""; | ||
| authorInputEl.value = ""; | ||
| pagesInputEl.value = ""; | ||
| isReadInputEl.checked = false; | ||
| } | ||
| } | ||
|
|
||
|
|
@@ -51,53 +70,43 @@ function Book(title, author, pages, check) { | |
| } | ||
|
|
||
| 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); | ||
| } | ||
| const tableBodyEl = displayTableEl.tBodies[0]; | ||
| tableBodyEl.replaceChildren(); | ||
|
|
||
| //insert updated row and cells | ||
| let length = myLibrary.length; | ||
| for (let i = 0; i < length; i++) { | ||
| let row = table.insertRow(1); | ||
| let row = tableBodyEl.insertRow(); | ||
| 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; | ||
| titleCell.textContent = myLibrary[i].title; | ||
| authorCell.textContent = myLibrary[i].author; | ||
| pagesCell.textContent = String(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; | ||
| let toggleReadButton = document.createElement("button"); | ||
| toggleReadButton.className = "btn btn-success"; | ||
| wasReadCell.appendChild(toggleReadButton); | ||
| toggleReadButton.textContent = myLibrary[i].check === false ? "No" : "Yes"; | ||
|
|
||
| changeBut.addEventListener("click", function () { | ||
| toggleReadButton.addEventListener("click", function () { | ||
| myLibrary[i].check = !myLibrary[i].check; | ||
| render(); | ||
| }); | ||
|
|
||
| //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}`); | ||
| let deleteButton = document.createElement("button"); | ||
| deleteCell.appendChild(deleteButton); | ||
| deleteButton.className = "btn btn-warning"; | ||
| deleteButton.textContent = "Delete"; | ||
| deleteButton.addEventListener("click", function () { | ||
| const deletedTitle = myLibrary[i].title; | ||
| myLibrary.splice(i, 1); | ||
| render(); | ||
| alert(`You've deleted title: ${deletedTitle}`); | ||
| }); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,7 @@ | ||
| .form-group { | ||
| width: 400px; | ||
| height: 300px; | ||
| align-self: left; | ||
|
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 did you change this? THe commit messages "Refactor input validation and improve book submission logic in script.js" does not make this clear to me
Author
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. It looked a bit off to me to I decided to change it. I will be more careful when I commit a file and make sure it doesn't get conflicted with my commit message in the near future, sorry for the confusion. 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. I see. It's good practice to split up commits into logical parts and not add all changes in one commit: A commit should describe what changed in the code. It's also good practice to split commits into logical blocks (for example for each task or each review comment). This makes it easier to understand and additionally the commits could also be undone more easily if needed. |
||
| align-self: flex-start; | ||
| padding-left: 20px; | ||
| } | ||
|
|
||
|
|
||
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.
Why did you change this to module? (It is the reason why the app only works in the live server and not if you just open the html file in the browser directly)