Loading...
zomgpower avatar zomgpower 0 Точки

Относно 04. Book Library от Data and Authentication

Здравейте! Вече втори ден си блъскам главата и явно много съм забил и не мога да си видя грешката. Judge ми изкарва 75/100 и вади ето тази грешка " expected 'undefined' to equal 'Book1' ". Опитах какво ли не, ако някой ми намери грешката ще го черпя 1 бира :)

линк към judge: https://judge.softuni.org/Contests/Compete/Index/3467#3

линк към условието: https://judge.softuni.org/Contests/Compete/DownloadResource/27094

 

Това ми е html структурата: https://pastebin.com/W0GhiwF9
Това ми е js кода: https://pastebin.com/d7S3NfFn

П.С: Ако нещо забравям да кача в поста се извинявай предварително, че бързам да отивам на работа laugh

Тагове:
0
JavaScript Applications
Axiomatik avatar Axiomatik 2422 Точки
Best Answer

Demo code that uses global variable books for easier access to the book collection, hope it helps =>

const state = {};

async function request(url, options) {
    const response = await fetch(url, options);

    if (response.ok === false) {
        const error = await response.json();
        alert(error.message);
        throw new Error(error.message);
    }

    const data = await response.json();
    return data;
}

async function getAllBooks() {
    const books = await request('http://localhost:3030/jsonstore/collections/books');
    state.books = books;
    const bookRows = Object.entries(books).map(createBookRow).join('')
    document.querySelector('tbody').innerHTML = bookRows;

    function createBookRow([id, book]) {
        const result = `
        <tr data-id="${id}">
            <td>${book.title}</td>
            <td>${book.author}</td>
            <td>
                <button class="editBtn">Edit</button>
                <button class="deleteBtn">Delete</button>
            </td>
        </tr>`;

        return result;
    }
}

async function createBook(event) {
    event.preventDefault();
    const formData = new FormData(event.target);
    const book = {
        title: formData.get('title'),
        author: formData.get('author')
    };

    await request('http://localhost:3030/jsonstore/collections/books', {
        method: 'post',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(book)
    });

    event.target.reset();

    getAllBooks();
}

async function updateBook(event) {
    const formData = new FormData(event.target.parentNode);
    const id = formData.get('id');
    const book = {
        title: formData.get('title'),
        author: formData.get('author')
    };

    await request('http://localhost:3030/jsonstore/collections/books/' + id, {
        method: 'put',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(book)
    });

    document.getElementById('createForm').style.display = 'block';
    document.getElementById('editForm').style.display = 'none';
    event.target.parentNode.reset();

    getAllBooks();
}

async function deleteBook(id) {
    await request('http://localhost:3030/jsonstore/collections/books/' + id, {
        method: 'delete',
    });

    getAllBooks();
}

function start() {
    document.getElementById('loadBooks').addEventListener('click', getAllBooks);
    document.getElementById('createForm').addEventListener('submit', createBook);
    document.querySelector('#editForm [value="Save"]').addEventListener('click', updateBook);
    document.querySelector('#editForm [value="Cancel"]').addEventListener('click', (event) => {
        event.target.parentNode.reset();
        document.getElementById('createForm').style.display = 'block';
        document.getElementById('editForm').style.display = 'none';
    });
    document.querySelector('table').addEventListener('click', handleTableClick)

    getAllBooks();
}

function handleTableClick(event) {
    // console.log(event.target);
    if (event.target.className === 'editBtn') {
        // console.log('clicked edit');
        document.getElementById('createForm').style.display = 'none';
        document.getElementById('editForm').style.display = 'block';

        const bookId = event.target.parentNode.parentNode.dataset.id;
        loadBookForEditing(bookId);

    } else if (event.target.className === 'deleteBtn') {
        const bookId = event.target.parentNode.parentNode.dataset.id;
        const confirmDelete = confirm('Are you sure you want to delete given book?');
        if (confirmDelete) {
            deleteBook(bookId);
            getAllBooks();
        }
    }
}

async function loadBookForEditing(bookId) {
    const book = state.books[bookId];
    document.querySelector('#editForm [name="id"]').value = bookId;
    document.querySelector('#editForm [name="title"]').value = book.title;
    document.querySelector('#editForm [name="author"]').value = book.author;
}

start();

 

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.