diff --git a/js/banner.js b/js/banner.js deleted file mode 100644 index 7354a24..0000000 --- a/js/banner.js +++ /dev/null @@ -1,46 +0,0 @@ -// модуль для смены изображения в баннере по таймеру - -import "../css/banner.css"; - -// указывается блок, в котором будет баннер -// блок должен содержать изображения -function myBanner(root) { - console.info("Loaded"); - - // получение всех изображений внутри баннера - const banners = document.querySelectorAll(`${root} img`); - - // всем изображениям устанавливается класс banner-hide - // если были другие классы, то они будут удалены - for (let i = 0; i < banners.length; i += 1) { - banners[i].setAttribute("class", "banner-hide"); - } - - let old = banners.length - 1; - let current = 0; - - // функция меняет изображения в цикле - // изображение с классом banner-show будет показано - // изображение с классом banner-hide будет скрыто - // функция запускает таймер, который через 5 секунд - // запускает функцию, снова создается таймер и т. д. - function loop() { - banners[current].setAttribute("class", "banner-show"); - banners[old].setAttribute("class", "banner-hide"); - - console.info("Banner changed"); - - old = current; - current += 1; - - if (current === banners.length) { - current = 0; - } - - setTimeout(loop, 5000); - } - - loop(); -} - -export default myBanner; diff --git a/js/film.js b/js/film.js deleted file mode 100644 index 2e377ce..0000000 --- a/js/film.js +++ /dev/null @@ -1,181 +0,0 @@ -// film.js - -import { getAllLines, getAllItemTypes } from './lines-rest-api.js'; - -async function loadMovies() { - try { - const moviesData = await getAllLines(); - addMovieCards(moviesData); - } catch (error) { - console.error("Error loading movies:", error); - } -} -async function loadMoviesindex() { - try { - const moviesData = await getAllLines(); - addMovieCardsindex(moviesData); - } catch (error) { - console.error("Error loading movies:", error); - } -} -async function loadMoviesBygenre() { - try { - const moviesData = await getAllLines(); - - const itemTypes = await getAllItemTypes(); - - addMoviesByGenre(moviesData, itemTypes); - } catch (error) { - console.error("Error loading movies:", error); - } -} -function addMoviesByGenre(moviesData, itemTypes) { - var containers = document.querySelectorAll(".movie-container"); - - containers.forEach(function (container) { - var genre = container.querySelector("h1").textContent; - - // Находим все фильмы для данного жанра - var genreMovies = moviesData.filter(function (movie) { - var itemType = itemTypes[movie.itemsId-1]; - - if (itemType && itemType.genre === genre) { - return true; - } else { - console.error("Invalid itemTypes for movie:", movie); - console.log("itemType:", itemType); - console.log("genre:", genre); - return false; - } - }); - - genreMovies.forEach(function (movie) { - addMovieCardsByContainer(container, movie); - }); - }); -} - -function addMovieCardsByContainer(container,movie) { - - - if (!container) { - console.error("Movie container not found"); - return; - } - - - var movieCard = document.createElement("div"); - movieCard.className = "movie-card"; - - var image = document.createElement("img"); - // Проверяем, есть ли у фильма изображение, и вставляем соответствующее изображение - image.src = movie.image ? movie.image : "https://via.placeholder.com/300x400"; - image.alt = "Movie Image"; - - var content = document.createElement("div"); - content.className = "movie-card-content"; - - var title = document.createElement("h2"); - title.textContent = movie.name; - - var description = document.createElement("p"); - description.textContent = "Рейтинг: " + movie.rating; - - content.appendChild(title); - content.appendChild(description); - - movieCard.appendChild(image); - movieCard.appendChild(content); - - container.appendChild(movieCard); - -} -function addMovieCards(moviesData) { - var container = document.getElementById("movie-container"); - - if (!container) { - console.error("Movie container not found"); - return; - } - - moviesData.forEach(function (movie) { - var movieCard = document.createElement("div"); - movieCard.className = "movie-card"; - - var image = document.createElement("img"); - // Проверяем, есть ли у фильма изображение, и вставляем соответствующее изображение - image.src = movie.image ? movie.image : "https://via.placeholder.com/300x400"; - image.alt = "Movie Image"; - - var content = document.createElement("div"); - content.className = "movie-card-content"; - - var title = document.createElement("h2"); - title.textContent = movie.name; - - var description = document.createElement("p"); - description.textContent = "Рейтинг: " + movie.rating; - - content.appendChild(title); - content.appendChild(description); - - movieCard.appendChild(image); - movieCard.appendChild(content); - - container.appendChild(movieCard); - }); -} -function addMovieCardsindex(moviesData) { - var containers = document.querySelectorAll(".movie-container"); - - if (!containers || containers.length === 0) { - console.error("Movie containers not found"); - return; - } - - containers.forEach(function (container) { - moviesData.forEach(function (movie) { - var movieCard = document.createElement("div"); - movieCard.className = "movie-card"; - - var image = document.createElement("img"); - // Проверяем, есть ли у фильма изображение, и вставляем соответствующее изображение - image.src = movie.image ? movie.image : "https://via.placeholder.com/300x400"; - image.alt = "Movie Image"; - - var content = document.createElement("div"); - content.className = "movie-card-content"; - - var title = document.createElement("h2"); - title.textContent = movie.name; - - var description = document.createElement("p"); - description.textContent = "Рейтинг: " + movie.rating; - - content.appendChild(title); - content.appendChild(description); - - movieCard.appendChild(image); - movieCard.appendChild(content); - - container.appendChild(movieCard); - }); - }); -} - - -document.addEventListener('DOMContentLoaded', function () { - if (window.location.pathname.includes("page2.html")) { - // Запуск функции для page2.html - loadMovies(); - }else if (window.location.pathname.includes("page5.html")) { - // Запуск функции для page5.html - loadMovies(); - }else if (window.location.pathname.includes("page3.html")) { - // Запуск функции для page3.html - loadMoviesBygenre(); - }else if (window.location.pathname.includes("index.html")) { - // Запуск функции для index.html - loadMoviesindex(); - } -}); diff --git a/js/lines-rest-api.js b/js/lines-rest-api.js deleted file mode 100644 index 2442841..0000000 --- a/js/lines-rest-api.js +++ /dev/null @@ -1,87 +0,0 @@ -const serverUrl = "http://localhost:8081"; - -export function createLineObject(item,name, rating, release_date, director,image) { - return { - itemsId: parseInt(item), - name, - rating, - release_date, - director, - image, - }; -} - -export async function getAllItemTypes() { - const response = await fetch(`${serverUrl}/items`); - if (!response.ok) { - throw response.statusText; - } - return response.json(); -} - -export async function getAllLines() { - const response = await fetch(`${serverUrl}/lines?_expand=items`); - if (!response.ok) { - throw response.statusText; - } - return response.json(); -} - -export async function getLine(id) { - const response = await fetch(`${serverUrl}/lines/${id}?_expand=items`); - if (!response.ok) { - throw response.statusText; - } - return response.json(); -} - -export async function createLine(item,name, rating, release_date, director,image) { - const itemObject = createLineObject(item,name, rating, release_date, director,image); - - const options = { - method: "POST", - body: JSON.stringify(itemObject), - headers: { - "Accept": "application/json", - "Content-Type": "application/json", - }, - }; - - const response = await fetch(`${serverUrl}/lines`, options); - if (!response.ok) { - throw response.statusText; - } - return response.json(); -} - -export async function updateLine(id,item,name, rating, release_date, director,image) { - const itemObject = createLineObject(item,name, rating, release_date, director,image); - - const options = { - method: "PUT", - body: JSON.stringify(itemObject), - headers: { - "Accept": "application/json", - "Content-Type": "application/json", - }, - }; - - const response = await fetch(`${serverUrl}/lines/${id}`, options); - if (!response.ok) { - throw response.statusText; - } - return response.json(); -} - -export async function deleteLine(id) { - const options = { - method: "DELETE", - }; - - const response = await fetch(`${serverUrl}/lines/${id}`, options); - if (!response.ok) { - throw response.statusText; - } - window.location.reload(true); - return response.json(); -} diff --git a/js/lines-ui.js b/js/lines-ui.js deleted file mode 100644 index 583b872..0000000 --- a/js/lines-ui.js +++ /dev/null @@ -1,82 +0,0 @@ -export const cntrls = { - button: document.getElementById("items-add"), - table: document.querySelector("#items-table tbody"), - form: document.getElementById("items-form"), - lineId: document.getElementById("items-line-id"), - filmname: document.getElementById("name"), - itemsType: document.getElementById("item"), - rating: document.getElementById("rating"), - releaseDate: document.getElementById("releaseDate"), - director: document.getElementById("director"), - image: document.getElementById("image"), - imagePreview: document.getElementById("image-preview"), -}; - -export const imagePlaceholder = "https://via.placeholder.com/300x400"; - -export function createItemsOption(name, value = "", isSelected = false) { - const option = document.createElement("option"); - option.value = value || ""; - option.selected = isSelected; - option.text = name; - return option; -} - -function createTableAnchor(icon, callback) { - const i = document.createElement("i"); - i.classList.add("fa-solid", icon); - const a = document.createElement("a"); - a.href = "#"; - a.appendChild(i); - a.onclick = (event) => { - event.preventDefault(); - event.stopPropagation(); - callback(); - }; - const td = document.createElement("td"); - td.appendChild(a); - return td; -} -function createTableColumn(value) { - const td = document.createElement("td"); - td.textContent = value; - return td; -} - -export function createTableRow(line, index, editCallback, deleteCallback, items) { - const rowNumber = document.createElement("th"); - rowNumber.scope = "row"; - rowNumber.textContent = index + 1; - - const row = document.createElement("tr"); - row.id = `line-${line.id}`; - row.appendChild(rowNumber); - - // Добавляем свойства из массива "lines" - row.appendChild(createTableColumn(line.name)); // Название фильма - - // Добавляем жанр на основе "genre_id" из массива "items" - const genreItem = items.find(item => item.id === line.itemsId); - const genre = genreItem ? genreItem.genre : ''; - row.appendChild(createTableColumn(genre)); // Жанр - - - row.appendChild(createTableColumn(line.rating)); // Рейтинг - row.appendChild(createTableColumn(formatDate(line.release_date))); // Дата - row.appendChild(createTableColumn(line.director)); // Режиссер - - // Добавляем ячейки для редактирования и удаления - row.appendChild(createTableAnchor("fa-pencil", editCallback)); - row.appendChild(createTableAnchor("fa-trash", deleteCallback)); - - return row; -} - - - -// Функция для форматирования даты -function formatDate(dateString) { - const options = { year: 'numeric', month: 'long', day: 'numeric' }; - return new Date(dateString).toLocaleDateString(undefined, options); -} - diff --git a/js/lines.js b/js/lines.js deleted file mode 100644 index 0814000..0000000 --- a/js/lines.js +++ /dev/null @@ -1,213 +0,0 @@ -import { - createLine, - deleteLine, - getAllItemTypes, - getAllLines, - getLine, - updateLine, -} from "./lines-rest-api"; -import { - cntrls, - createItemsOption, - createTableRow, - imagePlaceholder, -} from "./lines-ui"; - -async function drawItemsSelect() { - const genres = await getAllItemTypes(); - cntrls.itemsType.innerHTML = ""; - cntrls.itemsType.appendChild(createItemsOption("Выберите значение", "", true)); - genres.forEach((genre) => { - cntrls.itemsType.appendChild(createItemsOption(genre.genre, genre.id)); - }); -} - - -async function drawLinesTable() { - console.info("Try to load data"); - if (!cntrls.table) { - return; - } - const data = await getAllLines(); - const genres = await getAllItemTypes(); - cntrls.table.innerHTML = ""; - data.forEach((item, index) => { - cntrls.table.appendChild( - createTableRow( - item, - index, - () => location.assign(`editpage.html?id=${item.id}`), - () => deleteLine(item.id), - genres - ), - ); - }); -} - -async function addLine(item,name, rating, release_date, director,image) { - console.info("Try to add item"); - const data = await createLine(item,name, rating, release_date, director,image); - console.info("Added"); - console.info(data); - drawLinesTable(); -} - -async function editLine(id,item,name, rating, release_date, director,image) { - console.info("Try to update item"); - const data = await updateLine(id,item,name, rating, release_date, director,image); - console.info("Updated"); - console.info(data); - drawLinesTable(); -} -async function readFile(file) { - const reader = new FileReader(); - - // создание Promise-объекта для использования функции - // с помощью await (асинхронно) без коллбэков (callback) - // https://learn.javascript.ru/promise - return new Promise((resolve, reject) => { - // 2. "Возвращаем" содержимое когда файл прочитан - // через вызов resolve - // Если не использовать Promise, то всю работу по взаимодействию - // с REST API пришлось бы делать в обработчике (callback) функции - // onloadend - reader.onloadend = () => { - const fileContent = reader.result; - // Здесь могла бы быть работа с REST API - // Чтение заканчивает выполняться здесь - resolve(fileContent); - }; - // 3. Возвращаем ошибку - reader.onerror = () => { - // Или здесь в случае ошибки - reject(new Error("oops, something went wrong with the file reader.")); - }; - // Шаг 1. Сначала читаем файл - // Чтение начинает выполняться здесь - reader.readAsDataURL(file); - }); -} - -// функция для обновления блока с превью выбранного изображения -async function updateImagePreview() { - // получение выбранного файла - // возможен выбор нескольких файлов, поэтому необходимо получить только первый - const file = cntrls.image.files[0]; - // чтение содержимого файла в виде base64 строки - const fileContent = await readFile(file); - console.info("base64 ", fileContent); - // обновление атрибута src для тега img с id image-preview - cntrls.imagePreview.src = fileContent; -} - -export function linesForm() { - console.info("linesForm"); - drawItemsSelect(); - drawLinesTable(); - // Вызов функции обновления превью изображения при возникновении - // события oncahnge в тэге input с id image - cntrls.image.addEventListener("change", () => updateImagePreview()); - - cntrls.form.addEventListener("submit", async (event) => { - console.info("Form onSubmit"); - event.preventDefault(); - event.stopPropagation(); - if (!cntrls.form.checkValidity()) { - return; - } - let imageBase64 = ""; - if (cntrls.imagePreview.src !== imagePlaceholder) { - const result = await fetch(cntrls.imagePreview.src); - const blob = await result.blob(); - imageBase64 = await readFile(blob); - } - const currentId = cntrls.lineId.value; - if (!currentId) { - await addLine( - cntrls.itemsType.value, - cntrls.filmname.value, - cntrls.rating.value, - cntrls.releaseDate.value, - cntrls.director.value, - imageBase64, - - ); - } else { - await editLine( - currentId, - cntrls.itemsType.value, - cntrls.title.value, - cntrls.rating.value, - cntrls.releaseDate.value, - cntrls.director.value, - imageBase64, - ); - } - }); -} - - -export async function linesPageForm() { - console.info("linesPageForm"); - drawItemsSelect(); - const goBack = () => location.assign("/admin.html"); - cntrls.image.addEventListener("change", () => updateImagePreview()); - const urlParams = new URLSearchParams(location.search); - const currentId = urlParams.get("id"); - if (currentId) { - try { - const line = await getLine(currentId); - cntrls.itemsType.value = line.itemsId; - cntrls.filmname.value = line.name; - cntrls.rating.value = line.rating; - cntrls.releaseDate.value = line.release_date; - cntrls.director.value = line.director; - cntrls.imagePreview.src = line.image ? line.image : imagePlaceholder; - } catch { - goBack(); - } - } - - cntrls.form.addEventListener("submit", async (event) => { - console.info("Form onSubmit"); - event.preventDefault(); - event.stopPropagation(); - if (!cntrls.form.checkValidity()) { - return; - } - let imageBase64 = ""; - if (cntrls.imagePreview.src !== imagePlaceholder) { - // Загрузка содержимого атрибута src тэга img с id image-preview - // Здесь выполняется HTTP запрос с типом GET - const result = await fetch(cntrls.imagePreview.src); - // Получение из HTTP-ответа бинарного содержимого - const blob = await result.blob(); - // Получение base64 строки для файла - // Здесь выполняется Promise из функции readFile - // Promise позволяет писать линейный код для работы с асинхронными методами - // без использования обработчиков (callback) с помощью await - imageBase64 = await readFile(blob); - } - if (!currentId) { - await addLine( - cntrls.itemsType.value, - cntrls.filmname.value, - cntrls.rating.value, - cntrls.releaseDate.value, - cntrls.director.value, - imageBase64, - ); - } else { - await editLine( - currentId, - cntrls.itemsType.value, - cntrls.filmname.value, - cntrls.rating.value, - cntrls.releaseDate.value, - cntrls.director.value, - imageBase64, - ); - } - goBack(); - }); -} diff --git a/js/script.js b/js/script.js deleted file mode 100644 index 73b95dd..0000000 --- a/js/script.js +++ /dev/null @@ -1,23 +0,0 @@ - -const movieCards = document.querySelectorAll('.movie-card'); - -// Добавляем обработчик события нажатия для каждой карточки фильма -movieCards.forEach(card => { - const link = card.querySelector('.movie-link'); - const kinopoiskId = card.dataset.kinopoiskId; - - card.addEventListener('click', () => { - // Формируем новый URL с использованием ID Кинопоиска - const redirectUrl = `https://kinopoisk-watch-dsze5.ondigitalocean.app/player/?id=${kinopoiskId}`; - - // Перенаправляем пользователя на полученный URL - window.location.href = redirectUrl; - }); -}); -$(document).ready(function () { - var url = window.location.href; - $('.navbar-nav a').filter(function () { - return this.href == url; - }).addClass('active'); -}); - diff --git a/js/validation.js b/js/validation.js deleted file mode 100644 index 7c01f13..0000000 --- a/js/validation.js +++ /dev/null @@ -1,16 +0,0 @@ -function validation() { - const forms = document.querySelectorAll("form.needs-validation"); - - for (let i = 0; i < forms.length; i += 1) { - const form = forms[i]; - form.addEventListener("submit", (event) => { - if (!form.checkValidity()) { - event.preventDefault(); - event.stopPropagation(); - } - form.classList.add("was-validated"); - }); - } -} - -export default validation; \ No newline at end of file diff --git a/src/pages/AdminPage.jsx b/src/pages/AdminPage.jsx index 6d14595..847321f 100644 --- a/src/pages/AdminPage.jsx +++ b/src/pages/AdminPage.jsx @@ -13,15 +13,17 @@ const AdminPage = () => {

Таблица данных

- - - - - - - - - + + + + + + + + + + +
ФильмЖанрРейтингДата производстваРежиссер
ФильмЖанрРейтингДата производстваРежиссер
diff --git a/src/pages/PageEdit.jsx b/src/pages/PageEdit.jsx index efbf1d0..5eec8e5 100644 --- a/src/pages/PageEdit.jsx +++ b/src/pages/PageEdit.jsx @@ -22,28 +22,28 @@ const PageEdit = () => { alt="placeholder" />
- + Жанр - + Название фильма - + Рейтинг - + Дата создания - + Режиссер - + Обложка