129 lines
5.4 KiB
JavaScript
129 lines
5.4 KiB
JavaScript
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;
|