Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
7d232c0
missing for loop brackets on line 57, added
Grajales-K Jan 19, 2025
8836023
changed let for const to create the new button
Grajales-K Jan 19, 2025
6688f1b
bug with declaration of variable fixed with delButton
Grajales-K Jan 19, 2025
d20bada
fixed bug incorrect name event, clicks instead "click"
Grajales-K Jan 19, 2025
86d7c97
fixed boolean comparision to false == "No"
Grajales-K Jan 19, 2025
1fa900d
fix: add raw code
Grajales-K Apr 9, 2026
601d465
fix: correct book title and variable declaration in library management
Grajales-K Apr 9, 2026
3485ff1
fix: add missing newline at end of style.css file
Grajales-K Apr 9, 2026
2fcb6a8
fix: correct for loop syntax and update delete button variable name
Grajales-K Apr 9, 2026
438f376
fix: update title of book library page for clarity
Grajales-K Apr 9, 2026
b290901
fix: correct library variable name and update delete button splice me…
Grajales-K Apr 9, 2026
7694e71
fix: return author value instead title twice
Grajales-K Apr 9, 2026
dd289a1
fix: remove "s" from event listener click
Grajales-K Apr 9, 2026
71e5cc0
fix: correct read status boolean logic in render function
Grajales-K Apr 9, 2026
8ad522c
fix: validate author and pages input in submit function
Grajales-K Apr 9, 2026
592e239
fix: validate pages input in submit function
Grajales-K Apr 9, 2026
e167834
Merge branch 'main' into Book-Library
Grajales-K Apr 10, 2026
dcf690f
fix: meta lang missing.
Grajales-K Apr 10, 2026
872bff6
refactor: change the name var from table to librarybody, removed the …
Grajales-K Apr 10, 2026
6010622
style: update form styles for better responsiveness and layout
Grajales-K Apr 14, 2026
a85ea0c
style: fix form layout and improve input field organization
Grajales-K Apr 14, 2026
6080c0c
style: refine form structure and enhance input field attributes
Grajales-K Apr 14, 2026
6b9270d
style: update button styles and adjust margins for better layout
Grajales-K Apr 14, 2026
2db7dcb
refactor: restructure book submission logic and improve initial libra…
Grajales-K Apr 14, 2026
39a70df
fix: prevent page refresh on book form submission
Grajales-K Apr 14, 2026
1e58499
style: enhance jumbotron and form styles for improved layout and usab…
Grajales-K Apr 14, 2026
f4ad102
style: standardize CSS formatting and enhance button styles for consi…
Grajales-K Apr 14, 2026
5a7f32d
style: restructure HTML layout and enhance form input organization fo…
Grajales-K Apr 14, 2026
5a2831b
style: add new button styles and refine existing CSS for improved lay…
Grajales-K Apr 14, 2026
4d7f4a0
refactor: improve book form processing and enhance library rendering …
Grajales-K Apr 14, 2026
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
135 changes: 60 additions & 75 deletions debugging/book-library/index.html
Original file line number Diff line number Diff line change
@@ -1,96 +1,81 @@
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<title> </title>
<meta
charset="utf-8"
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Book Library</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
/>
<link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" href="style.css" />
</head>

<body>
<div class="jumbotron text-center">
<header role="banner" class="jumbotron text-center">
<h1>Library</h1>
<p>Add books to your virtual library</p>
</div>
</header>

<button data-toggle="collapse" data-target="#demo" class="btn btn-info">
Add new book
</button>
<main>
<button data-toggle="collapse" data-target="#demo" class="btn btn-info btn-add">
Add new book
</button>

<div id="demo" class="collapse">
<div class="form-group">
<label for="title">Title:</label>
<input
type="title"
class="form-control"
id="title"
name="title"
required
/>
<label for="author">Author: </label>
<input
type="author"
class="form-control"
id="author"
name="author"
required
/>
<label for="pages">Pages:</label>
<input
type="number"
class="form-control"
id="pages"
name="pages"
required
/>
<label class="form-check-label">
<form id="demo" class="collapse">
<div class="form-group">
<label for="title">Title:</label>
<input
type="checkbox"
class="form-check-input"
id="check"
value=""
/>Read
</label>
<input
type="submit"
value="Submit"
class="btn btn-primary"
onclick="submit();"
/>
</div>
</div>
type="text"
class="form-control"
id="title"
name="title"
required
/>

<table class="table" id="display">
<thead class="thead-dark">
<tr>
<th>Title</th>
<th>Author</th>
<th>Number of Pages</th>
<th>Read</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<label for="author">Author: </label>
<input
type="text"
class="form-control"
id="author"
name="author"
required
/>

<label for="pages">Pages: </label>
<input
type="number"
class="form-control"
id="pages"
name="pages"
min="1"
required
/>

<input type="checkbox" class="check-box" id="check" />
<label class="check-label" for="check">Read</label>

<button type="submit" class="btn btn-primary">Submit Book</button>
</div>
</form>

<script src="script.js"></script>
<table class="table table-sm table-hover" id="display">
<thead class="thead-dark">
<tr>
<th>Title</th>
<th>Author</th>
<th>No. Pages</th>
<th>Read</th>
<th>Action</th>
</tr>
</thead>
<tbody id="table-body"></tbody>
</table>
</main>
<script src="script.js" type="module"></script>
</body>
</html>
155 changes: 73 additions & 82 deletions debugging/book-library/script.js
Original file line number Diff line number Diff line change
@@ -1,103 +1,94 @@
let myLibrary = [];

window.addEventListener("load", function (e) {
function Book(title, author, pages, check) {
this.title = title;
this.author = author;
this.pages = Number(pages);
this.check = check;
}

const titleInput = document.getElementById("title");
const authorInput = document.getElementById("author");
const pagesInput = document.getElementById("pages");
const checkInput = document.getElementById("check");
const bookForm = document.getElementById("demo");

document.addEventListener("DOMContentLoaded", () => {
populateStorage();
render();

if (bookForm) {
bookForm.addEventListener("submit", function (e) {
e.preventDefault();
processForm();
});
}
});

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
if (myLibrary.length === 0) {

myLibrary.push(new Book("Robinson Crusoe", "Daniel Defoe", 252, true));
myLibrary.push(
new Book("The Old Man and the Sea", "Ernest Hemingway", 127, true)
);
myLibrary.push(book1);
myLibrary.push(book2);
render();
}
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() {
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();
function processForm() {

const titleVal = titleInput.value.trim();
const authorVal = authorInput.value.trim();
const pagesVal = pagesInput.value;

if (!titleVal || !authorVal || pagesVal <= 0) {
alert("Please fill the field with valid info!");
return;
Comment on lines +40 to +46
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: pagesInput.value is a string.

Your code can still work correctly, but best practice is to sanitise/normalise the input to proper data type first before using them.

}
}

function Book(title, author, pages, check) {
this.title = title;
this.author = author;
this.pages = pages;
this.check = check;
const newBook = new Book(titleVal, authorVal, pagesVal, checkInput.checked);
myLibrary.push(newBook);

bookForm.reset();
render();
$("#demo").collapse("hide");
}

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);
}
//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;

changeBut.addEventListener("click", function () {
myLibrary[i].check = !myLibrary[i].check;
const libraryBody = document.getElementById("table-body");
libraryBody.innerHTML = "";

myLibrary.forEach((book, index) => {
const row = libraryBody.insertRow(-1);

row.insertCell(0).textContent = book.title;
row.insertCell(1).textContent = book.author;
row.insertCell(2).textContent = book.pages;

const wasReadCell = row.insertCell(3);
const statusBtn = document.createElement("button");
statusBtn.className = "btn btn-success";
statusBtn.textContent = book.check ? "Yes" : "No";

statusBtn.addEventListener("click", () => {
book.check = !book.check;
render();
});
wasReadCell.appendChild(statusBtn);

//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);

const deleteCell = row.insertCell(4);
const deleteBtn = document.createElement("button");
deleteBtn.className = "btn btn-warning";
deleteBtn.textContent = "Delete";

deleteBtn.addEventListener("click", () => {
const deletedTitle = book.title;
myLibrary.splice(index, 1);
render();

alert(`You've deleted title: ${deletedTitle}`);
});
}
deleteCell.appendChild(deleteBtn);
});
}
Loading
Loading