CCCPaste

03.Book Library

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