Files
InternetProg_MorozovDV_PIbd-22/html/mvc/controller.js

129 lines
5.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import model from "./model";
import view from "./view";
const controller = {
// Инициализация главной страницы (index.html)
async initIndexPage() {
await this.loadAuthorsAndStatuses();
await this.loadAndRenderBooks();
// Делегирование событий на контейнер с книгами
const booksContainer = document.getElementById("booksContainer");
if (booksContainer) {
booksContainer.addEventListener("click", async (e) => {
const { id } = e.target.dataset;
if (e.target.classList.contains("delete-btn")) {
if (confirm("Удалить книгу?")) {
try {
await model.deleteBook(id);
view.showAlert("Книга удалена");
await this.loadAndRenderBooks();
} catch (error) {
console.error(error);
view.showAlert("Ошибка при удалении книги", true);
}
}
} else if (e.target.classList.contains("edit-btn")) {
// При редактировании перенаправляем на add_book.html?id=...
window.location.href = `add_book.html?id=${id}`;
}
});
}
},
// Инициализация страницы добавления/редактирования (add_book.html)
async initAddBookPage() {
await this.loadAuthorsAndStatuses();
view.bindCoverInput();
// Если есть id в URL — значит редактирование
const params = new URLSearchParams(window.location.search);
const editingId = params.get("id");
if (editingId) {
try {
const book = await model.getBook(editingId);
view.fillBookForm(book);
document.getElementById("bookId").value = editingId;
} catch (error) {
console.error(error);
view.showAlert("Ошибка при загрузке книги", true);
}
}
// Сохранение формы
const bookForm = document.getElementById("bookForm");
if (bookForm) {
bookForm.addEventListener("submit", async (e) => {
e.preventDefault();
try {
const bookData = await view.getBookFormData();
const id = document.getElementById("bookId").value;
if (id) {
await model.updateBook(id, bookData);
view.showAlert("Книга обновлена");
} else {
await model.addBook(bookData);
view.showAlert("Книга добавлена");
}
view.resetBookForm();
document.getElementById("bookId").value = "";
window.location.href = "index.html";
} catch (error) {
console.error(error);
view.showAlert("Ошибка при сохранении книги", true);
}
});
}
// Кнопка "Отмена"
const cancelBtn = document.getElementById("cancelBtn");
if (cancelBtn) {
cancelBtn.addEventListener("click", () => {
window.location.href = "index.html";
});
}
},
// Загрузка авторов и статусов для селектов
async loadAuthorsAndStatuses() {
try {
const authors = await model.getAuthors();
const statuses = await model.getStatuses();
const authorSelect = document.getElementById("authorId");
const statusSelect = document.getElementById("statusId");
if (authorSelect) view.renderAuthorOptions(authors, authorSelect);
if (statusSelect) view.renderStatusOptions(statuses, statusSelect);
} catch (error) {
console.error(error);
view.showAlert("Ошибка при загрузке авторов или статусов", true);
}
},
// Загрузка и рендер книг на главной
async loadAndRenderBooks() {
try {
const books = await model.getBooks();
const authors = await model.getAuthors();
const statuses = await model.getStatuses();
const booksWithDetails = books.map((book) => {
const author = authors.find((a) => String(a.id) === String(book.authorId));
const status = statuses.find((s) => String(s.id) === String(book.statusId));
return {
...book,
authorName: author ? author.name : "Неизвестен",
statusName: status ? status.name : "Неизвестен",
};
});
const booksContainer = document.getElementById("booksContainer");
if (booksContainer) view.renderBooks(booksWithDetails, booksContainer);
} catch (error) {
console.error(error);
view.showAlert("Ошибка при загрузке книг", true);
}
},
};
export default controller;