$(document).ready(() => { if (!window.canManage) { Utils.showToast("У вас недостаточно прав", "error"); setTimeout(() => (window.location.href = "/"), 1500); return; } const pathParts = window.location.pathname.split("/"); const genreId = parseInt(pathParts[pathParts.length - 2]); if (!genreId || isNaN(genreId)) { Utils.showToast("Некорректный ID жанра", "error"); setTimeout(() => (window.location.href = "/"), 1500); return; } let originalGenre = null; let genreBooks = []; const $form = $("#edit-genre-form"); const $loader = $("#loader"); const $dangerZone = $("#danger-zone"); const $nameInput = $("#genre-name"); const $submitBtn = $("#submit-btn"); const $submitText = $("#submit-text"); const $loadingSpinner = $("#loading-spinner"); const $deleteModal = $("#delete-modal"); const $successModal = $("#success-modal"); Promise.all([ Api.get(`/api/genres/${genreId}`), Api.get(`/api/genres/${genreId}/books`), ]) .then(([genre, booksData]) => { originalGenre = genre; genreBooks = booksData.books || booksData || []; document.title = `Редактирование: ${genre.name} | LiB`; populateForm(genre); renderGenreBooks(genreBooks); $loader.addClass("hidden"); $form.removeClass("hidden"); $dangerZone.removeClass("hidden"); }) .catch((error) => { console.error(error); Utils.showToast("Жанр не найден", "error"); setTimeout(() => (window.location.href = "/"), 1500); }); function populateForm(genre) { $nameInput.val(genre.name); updateCounter(); } function updateCounter() { $("#name-counter").text(`${$nameInput.val().length}/100`); } $nameInput.on("input", updateCounter); function renderGenreBooks(books) { const $container = $("#genre-books-container"); $container.empty(); $("#books-count").text(books.length > 0 ? `(${books.length})` : ""); if (books.length === 0) { $container.html(`
В этом жанре пока нет книг
`); return; } books.forEach((book) => { $container.append(`
${Utils.escapeHtml(book.title)} ${book.authors && book.authors.length > 0 ? `${Utils.escapeHtml(book.authors.map((a) => a.name).join(", "))}` : ""}
`); }); } $form.on("submit", async function (e) { e.preventDefault(); const name = $nameInput.val().trim(); if (!name) { Utils.showToast("Введите название жанра", "error"); return; } if (name === originalGenre.name) { Utils.showToast("Нет изменений для сохранения", "info"); return; } setLoading(true); try { const updatedGenre = await Api.put(`/api/genres/${genreId}`, { name }); originalGenre = updatedGenre; showSuccessModal(updatedGenre); } catch (error) { console.error("Ошибка обновления:", error); let errorMsg = "Произошла ошибка при обновлении жанра"; if (error.responseJSON && error.responseJSON.detail) { errorMsg = error.responseJSON.detail; } else if (error.status === 401) { errorMsg = "Вы не авторизованы"; } else if (error.status === 403) { errorMsg = "У вас недостаточно прав"; } else if (error.status === 404) { errorMsg = "Жанр не найден"; } else if (error.status === 409) { errorMsg = "Жанр с таким названием уже существует"; } Utils.showToast(errorMsg, "error"); } finally { setLoading(false); } }); function setLoading(isLoading) { $submitBtn.prop("disabled", isLoading); if (isLoading) { $submitText.text("Сохранение..."); $loadingSpinner.removeClass("hidden"); } else { $submitText.text("Сохранить изменения"); $loadingSpinner.addClass("hidden"); } } function showSuccessModal(genre) { $("#success-genre-name").text(genre.name); $successModal.removeClass("hidden"); } $("#success-close-btn").on("click", function () { $successModal.addClass("hidden"); }); $successModal.on("click", function (e) { if (e.target === this) { $successModal.addClass("hidden"); } }); $("#delete-btn").on("click", function () { $("#modal-genre-name").text(originalGenre.name); if (genreBooks.length > 0) { $("#modal-books-warning").removeClass("hidden"); } else { $("#modal-books-warning").addClass("hidden"); } $deleteModal.removeClass("hidden"); }); $("#cancel-delete-btn").on("click", function () { $deleteModal.addClass("hidden"); }); $deleteModal.on("click", function (e) { if (e.target === this) { $deleteModal.addClass("hidden"); } }); $("#confirm-delete-btn").on("click", async function () { const $btn = $(this); const $spinner = $("#delete-spinner"); $btn.prop("disabled", true); $spinner.removeClass("hidden"); try { await Api.delete(`/api/genres/${genreId}`); Utils.showToast("Жанр успешно удалён", "success"); setTimeout(() => (window.location.href = "/"), 1000); } catch (error) { console.error("Ошибка удаления:", error); let errorMsg = "Произошла ошибка при удалении жанра"; if (error.responseJSON && error.responseJSON.detail) { errorMsg = error.responseJSON.detail; } else if (error.status === 401) { errorMsg = "Вы не авторизованы"; } else if (error.status === 403) { errorMsg = "У вас недостаточно прав"; } Utils.showToast(errorMsg, "error"); $btn.prop("disabled", false); $spinner.addClass("hidden"); $deleteModal.addClass("hidden"); } }); $(document).on("keydown", function (e) { if (e.key === "Escape") { if (!$deleteModal.hasClass("hidden")) { $deleteModal.addClass("hidden"); } else if (!$successModal.hasClass("hidden")) { $successModal.addClass("hidden"); } } }); });