function attachEvents() {
fetchAllBooks();
let loadBtn = document.getElementById("loadBooks")
loadBtn.addEventListener("click", fetchAllBooks);
let tbody = document.querySelector("tbody");
let createForm = document.getElementsByTagName("form")[0];
let authorInput = document.getElementById("author");
let titleInput = document.getElementById("title");
let hForm = createForm.querySelector("h3");
//create invisible save button for the updates
let saveButton = document.createElement("button");
saveButton.textContent = "Save";
saveButton.style.display = "none";
createForm.appendChild(saveButton)
let createButton = createForm.querySelector("button");
createButton.addEventListener("click", function (event) {
event.preventDefault();
let author = authorInput.value;
let title = titleInput.value;
createNewBook(author, title);
});
function fetchAllBooks() {
let requestOptions = {
method: 'GET',
redirect: 'follow'
};
fetch("http://localhost:3030/jsonstore/collections/books", requestOptions)
.then(response => response.json())
.then(result => populateTable(result))
.catch(error => alert("No books available"));
}
function populateTable(data) {
tbody.innerHTML = "";
let dataAr = Object.entries(data);
dataAr.forEach(book => {
let bookObj = {
_id: book[0],
title: book[1].title,
author: book[1].author
}
createTableRow(bookObj)
});
titleInput.value = "";
authorInput.value = "";
}
function createTableRow(book) {
console.log(book)
let bookTr = document.createElement("tr");
bookTr.id = book._id;
let authorTd = document.createElement("td");
authorTd.textContent = book.author;
let titleTd = document.createElement("td");
titleTd.textContent = book.title;
let buttonsTd = document.createElement("td");
let editBtn = document.createElement("button");
editBtn.textContent = "Edit";
editBtn.addEventListener("click", (() => editBook(bookTr)));
let deleteBtn = document.createElement("button");
deleteBtn.textContent = "delete";
deleteBtn.addEventListener("click", (() => deleteBook(bookTr)));
buttonsTd.appendChild(editBtn);
buttonsTd.appendChild(deleteBtn);
bookTr.appendChild(titleTd);
bookTr.appendChild(authorTd);
bookTr.appendChild(buttonsTd);
tbody.appendChild(bookTr);
}
function createNewBook(author, title) {
authorInput.value = "";
titleInput.value = "";
console.log("create a book!")
console.log(author, title)
let newBook = {
"author": author,
"title": title
}
//post book
let myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
let requestOptions = {
method: 'POST',
headers: myHeaders,
body: JSON.stringify(newBook),
redirect: 'follow'
};
fetch("http://localhost:3030/jsonstore/collections/books", requestOptions)
.then(response => response.json())
.then(result => createTableRow(result))
.catch(error => console.log('error', error));
}
function deleteBook(bookTr) {
console.log(bookTr)
let myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'DELETE',
headers: myHeaders,
redirect: 'follow'
};
fetch(`http://localhost:3030/jsonstore/collections/books/${bookTr.id}`, requestOptions)
.then(response => response.json())
.then(result => fetchAllBooks())
.catch(error => console.log('error', error));
}
function editBook(bookTr) {
console.log(bookTr)
hForm.textContent = "Edit FORM";
authorInput.value = bookTr.childNodes[1].textContent;
title.value = bookTr.childNodes[0].textContent;
saveButton.style.display = "block";
createButton.style.display = "none";
saveButton.addEventListener("click", function (e) {
e.preventDefault();
console.log("save pressed")
let myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
author: authorInput.value,
title: titleInput.value,
_id: bookTr.id
});
var requestOptions = {
method: 'PUT',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch(`http://localhost:3030/jsonstore/collections/books/${bookTr.id}`, requestOptions)
.then(response => response.json())
.then(result => fetchAllBooks())
.catch(error => console.log('error', error));
hForm.textContent = "FORM";
saveButton.style.display = "none";
createButton.style.display = "block";
})
}
}
attachEvents();