diff --git a/debugging/book-library/script.js b/debugging/book-library/script.js index 75ce6c1d..a3bfe3b6 100644 --- a/debugging/book-library/script.js +++ b/debugging/book-library/script.js @@ -1,3 +1,42 @@ +// Book class +class Book { + constructor(title, author, pages, check) { + const validated = constructorValidation(title, author, pages, check); + + this.title = validated.title; + this.author = validated.author; + this.pages = validated.pages; + this.check = validated.check; + } +} + +// Checking if constructor arguments are valid +function constructorValidation(title, author, pages, check) { + if (typeof title !== "string" || title.trim() === "") { + throw new Error("Title must be a non-empty string"); + } + + if (typeof author !== "string" || author.trim() === "") { + throw new Error("Author must be a non-empty string"); + } + + const pagesNum = Number(pages); + if (isNaN(pagesNum) || pagesNum <= 0) { + throw new Error("Pages must be a positive number"); + } + + if (typeof check !== "boolean") { + throw new Error("Check must be a boolean"); + } + + return { + title: title.trim(), + author: author.trim(), + pages: pagesNum, + check, + }; +} + let myLibrary = []; window.addEventListener("load", function (e) { @@ -6,9 +45,9 @@ window.addEventListener("load", function (e) { }); function populateStorage() { - if (myLibrary.length == 0) { - let book1 = new Book("Robison Crusoe", "Daniel Defoe", "252", true); - let book2 = new Book( + if (myLibrary.length === 0) { + const book1 = new Book("Robison Crusoe", "Daniel Defoe", "252", true); + const book2 = new Book( "The Old Man and the Sea", "Ernest Hemingway", "127", @@ -16,7 +55,6 @@ function populateStorage() { ); myLibrary.push(book1); myLibrary.push(book2); - render(); } } @@ -28,33 +66,25 @@ 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() { - if ( - title.value == null || - title.value == "" || - pages.value == null || - pages.value == "" - ) { + if (title.value === "" || author.value === "" || 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); + let book = new Book(title.value, author.value, pages.value, check.checked); + myLibrary.push(book); render(); + title.value = ""; + author.value = ""; + pages.value = ""; + check.checked = false; } } -function Book(title, author, pages, check) { - this.title = title; - this.author = author; - this.pages = pages; - this.check = check; -} - function render() { let table = document.getElementById("display"); let rowsNumber = table.rows.length; //delete old table - for (let n = rowsNumber - 1; n > 0; n-- { + for (let n = rowsNumber - 1; n > 0; n--) { table.deleteRow(n); } //insert updated row and cells @@ -76,11 +106,7 @@ function render() { changeBut.className = "btn btn-success"; wasReadCell.appendChild(changeBut); let readStatus = ""; - if (myLibrary[i].check == false) { - readStatus = "Yes"; - } else { - readStatus = "No"; - } + myLibrary[i].check ? (readStatus = "Yes") : (readStatus = "No"); changeBut.innerText = readStatus; changeBut.addEventListener("click", function () { @@ -90,13 +116,17 @@ function 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}`); - myLibrary.splice(i, 1); + //delButton.id = i + 5; + delButton.id = `delButton_${i}`; + deleteCell.appendChild(delButton); + delButton.className = "btn btn-warning"; + delButton.textContent = "Delete"; + delButton.dataset.index = i; + delButton.addEventListener("click", function (e) { + const index = e.target.dataset.index; + + alert(`You've deleted title: ${myLibrary[index].title}`); + myLibrary.splice(index, 1); render(); }); }