From ada7d99c431045c833d2c267afc82dbeacff7cf5 Mon Sep 17 00:00:00 2001 From: Zakharov_Rostislav Date: Sat, 2 Dec 2023 17:50:30 +0400 Subject: [PATCH] Maybe it works --- Library/admin-page.html | 1 - Library/data.json | 20 ++--- Library/js/lines-rest-api.js | 40 ++++----- Library/js/lines-ui.js | 17 ++-- Library/js/lines.js | 155 +++++------------------------------ 5 files changed, 55 insertions(+), 178 deletions(-) diff --git a/Library/admin-page.html b/Library/admin-page.html index 2872d05..effac67 100644 --- a/Library/admin-page.html +++ b/Library/admin-page.html @@ -67,7 +67,6 @@ import validation from "./js/validation"; import { linesPageForm } from "./js/lines"; document.addEventListener('DOMContentLoaded', () => { - validation(); linesPageForm(); }); diff --git a/Library/data.json b/Library/data.json index 1718777..c14c204 100644 --- a/Library/data.json +++ b/Library/data.json @@ -1,5 +1,5 @@ { - "items": [ + "categories": [ { "id": 1, "name": "Ода" @@ -13,35 +13,35 @@ "name": "Лирическое стихотворение" } ], - "lines": [ + "books": [ { - "itemsId": "3", + "categoriesId": "3", + "authorsId": "1", "name": "Зимний вечер", - "authorId": "1", "year": "1830", "image": "", "id": 2 }, { - "itemsId": "1", + "categoriesId": "1", + "authorsId": "2", "name": "Властителям и судиям", - "authorId": "2", "year": "1780", "image": "", "id": 3 }, { - "itemsId": "1", + "categoriesId": "1", + "authorsId": "3", "name": "Exegi monumentum", - "authorId": "3", "year": "23 до н. э.", "image": "", "id": 4 }, { - "itemsId": "2", + "categoriesId": "2", + "authorsId": "4", "name": "К бедному поэту", - "authorId": "4", "year": "1796", "image": "", "id": 5 diff --git a/Library/js/lines-rest-api.js b/Library/js/lines-rest-api.js index d733f4a..60d0e64 100644 --- a/Library/js/lines-rest-api.js +++ b/Library/js/lines-rest-api.js @@ -3,19 +3,8 @@ // адрес сервера const serverUrl = "http://localhost:8081"; -// функция возвращает объект нужной структуры для отправки на сервер -function createLineObject(item, name, authorId, year, image) { - return { - itemsId: item, - name, - authorId, - year, - image, - }; -} - -// обращение к серверу для получения всех типов товара (get) -export async function getAllAuthorsTypes() { +// обращение к серверу для получения всех типов авторов (get) +export async function getAllAuthors() { const response = await fetch(`${serverUrl}/authors`); if (!response.ok) { throw response.statusText; @@ -23,9 +12,9 @@ export async function getAllAuthorsTypes() { return response.json(); } -// обращение к серверу для получения всех типов товара (get) -export async function getAllItemTypes() { - const response = await fetch(`${serverUrl}/items`); +// обращение к серверу для получения всех категорий книг (get) +export async function getAllCategories() { + const response = await fetch(`${serverUrl}/categories`); if (!response.ok) { throw response.statusText; } @@ -33,8 +22,8 @@ export async function getAllItemTypes() { } // обращение к серверу для получения всех записей (get) -export async function getAllLines() { - const response = await fetch(`${serverUrl}/lines?_expand=items`); +export async function getAllBooks() { + const response = await fetch(`${serverUrl}/books?_expand=categories&_expand=authors`); if (!response.ok) { throw response.statusText; } @@ -43,8 +32,8 @@ export async function getAllLines() { // обращение к серверу для получения записи по первичному ключу (id) (get) // id передается в качестве части пути URL get-запроса -export async function getLine(id) { - const response = await fetch(`${serverUrl}/lines/${id}?_expand=items`); +export async function getBook(id) { + const response = await fetch(`${serverUrl}/books/${id}?_expand=categories&_expand=authors`); if (!response.ok) { throw response.statusText; } @@ -107,3 +96,14 @@ export async function deleteLine(id) { } return response.json(); } + +// функция возвращает объект нужной структуры для отправки на сервер +function createLineObject(item, name, authorId, year, image) { + return { + itemsId: item, + name, + authorId, + year, + image, + }; +} diff --git a/Library/js/lines-ui.js b/Library/js/lines-ui.js index 6436fc4..c9f7060 100644 --- a/Library/js/lines-ui.js +++ b/Library/js/lines-ui.js @@ -72,23 +72,18 @@ function createTableColumn(value) { // // // -export function createTableRow(item, author, index, editPageCallback, deleteCallback) { +export function createTableRow(book, index, editPageCallback, deleteCallback) { const rowNumber = document.createElement("th"); rowNumber.scope = "row"; rowNumber.textContent = index + 1; - const row = document.createElement("tr"); - row.id = `line-${item.id}`; - + row.id = `line-${book.id}`; row.appendChild(rowNumber); - row.appendChild(createTableColumn(item.items.name)); - row.appendChild(createTableColumn(item.name)); - // row.appendChild(createTableColumn(item.authors.name)); - row.appendChild(createTableColumn("item.authors.name")); - row.appendChild(createTableColumn(item.year)); - // редактировать на странице page-edit + row.appendChild(createTableColumn(book.categories.name)); + row.appendChild(createTableColumn(book.name)); + row.appendChild(createTableColumn(book.authors.name)); + row.appendChild(createTableColumn(book.year)); row.appendChild(createTableAnchor("fa-pen-to-square", editPageCallback)); - // удаление row.appendChild(createTableAnchor("fa-trash", deleteCallback)); return row; } diff --git a/Library/js/lines.js b/Library/js/lines.js index bf4a90f..2f574a9 100644 --- a/Library/js/lines.js +++ b/Library/js/lines.js @@ -1,28 +1,21 @@ +/* eslint-disable import/prefer-default-export */ // модуль с логикой import { - createLine, deleteLine, getAllItemTypes, getAllAuthorsTypes, getAllLines, getLine, updateLine, + createLine, deleteLine, getAllCategories, getAllAuthors, getAllBooks, getBook, updateLine, } from "./lines-rest-api"; import { cntrls, createItemsOption, createTableRow, imagePlaceholder, } from "./lines-ui"; -async function drawItemsSelect() { - // вызов метода REST API для получения списка типов товаров - const data = await getAllItemTypes(); - // вызов метода REST API для получения списка авторов - const authors = await getAllAuthorsTypes(); - // очистка содержимого select - // удаляется все, что находится между тегами - // но не атрибуты +// функция для заполнения списков авторов и категорий книг +async function drawLists() { + const data = await getAllCategories(); + const authors = await getAllAuthors(); cntrls.itemsType.innerHTML = ""; cntrls.authorType.innerHTML = ""; - // пустое значение cntrls.itemsType.appendChild(createItemsOption("Выберите значение", "", true)); cntrls.authorType.appendChild(createItemsOption("Выберите значение", "", true)); - // цикл по результату ответа от сервера - // используется лямбда-выражение - // (item) => {} аналогично function(item) {} data.forEach((item) => { cntrls.itemsType.appendChild(createItemsOption(item.name, item.id)); }); @@ -31,31 +24,21 @@ async function drawItemsSelect() { }); } -async function drawLinesTable() { +// функция отрисовки таблицы +async function drawTable() { console.info("Try to load data"); if (!cntrls.table) { return; } - // вызов метода REST API для получения всех записей - const data = await getAllLines(); - // очистка содержимого table - // удаляется все, что находится между тегами
- // но не атрибуты + const data = await getAllBooks(); cntrls.table.innerHTML = ""; - // цикл по результату ответа от сервера - // используется лямбда-выражение - // (item, index) => {} аналогично function(item, index) {} - data.forEach((item, author, index) => { + data.forEach((book, index) => { cntrls.table.appendChild( createTableRow( - item, - author, + book, index, - // функции передаются в качестве параметра - // это очень удобно, так как аргументы функций доступны только - // в данном месте кода и не передаются в сервисные модули - () => location.assign(`page-edit.html?id=${item.id}`), - () => removeLine(item.id), + () => location.assign(`page-edit.html?id=${book.id}`), + () => removeLine(book.id), ), ); }); @@ -68,7 +51,7 @@ async function addLine(item, name, authorId, year, image) { console.info("Added"); console.info(data); // загрузка и заполнение table - drawLinesTable(); + drawTable(); } async function editLine(id, item, name, authorId, year, image) { @@ -78,7 +61,7 @@ async function editLine(id, item, name, authorId, year, image) { console.info("Updated"); console.info(data); // загрузка и заполнение table - drawLinesTable(); + drawTable(); } async function removeLine(id) { @@ -91,7 +74,7 @@ async function removeLine(id) { const data = await deleteLine(id); console.info(data); // загрузка и заполнение table - drawLinesTable(); + drawTable(); } // функция для получения содержимого файла в виде base64 строки @@ -142,9 +125,9 @@ export async function linesPageForm() { console.info("linesPageForm"); // загрузка и заполнение select со списком товаров - drawItemsSelect(); + drawLists(); // загрузка и заполнение table - drawLinesTable(); + drawTable(); // func1 = (id) => {} аналогично function func1(id) {} const goBack = () => location.assign("./admin-page.html"); @@ -164,107 +147,7 @@ export async function linesPageForm() { if (currentId) { try { // вызов метода REST API для получения записи по первичному ключу(id) - const line = await getLine(currentId); - // заполнение формы для редактирования - cntrls.itemsType.value = line.itemsId; - cntrls.name.value = line.name; - cntrls.authorType.value = line.authorId; - cntrls.year.value = line.year; - // заполнение превью - // Если пользователь выбрал изображение, то оно загружается - // в тэг image с id image - preview - // иначе устанавливается заглушка, адрес которой указан в imagePlaceholder - cntrls.imagePreview.src = line.image ? line.image : imagePlaceholder; - } catch { - // в случае ошибки происходит возврат к admin-page - goBack(); - } - } - - // обработчик события отправки формы - // возникает при нажатии на кнопку (button) с типом submit - // кнопка должна находится внутри тега form - cntrls.form.addEventListener("submit", async (event) => { - console.info("Form onSubmit"); - // отключение стандартного поведения формы при отправке - // при отправке страница обновляется и JS перестает работать - event.preventDefault(); - event.stopPropagation(); - // если форма не прошла валидацию, то ничего делать не нужно - if (!cntrls.form.checkValidity()) { - return; - } - - let imageBase64 = ""; - // Получение выбранного пользователем изображения в виде base64 строки - // Если пользователь ничего не выбрал, то не нужно сохранять в БД - // дефолтное изображение - 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.name.value, - cntrls.authorType.value, - cntrls.year.value, - imageBase64, - ); - } else { - await editLine( - currentId, - cntrls.itemsType.value, - cntrls.name.value, - cntrls.authorType.value, - cntrls.year.value, - imageBase64, - ); - } - // возврат к странице admin-page - goBack(); - }); -} - -export async function linesUserForm() { - console.info("linesPageForm"); - - // загрузка и заполнение select со списком товаров - drawItemsSelect(); - // загрузка и заполнение table - drawLinesTable(); - - // func1 = (id) => {} аналогично function func1(id) {} - const goBack = () => location.assign("./admin-page.html"); - - // Вызов функции обновления превью изображения при возникновении - // события onchange в тэге input с id image - cntrls.image.addEventListener("change", () => updateImagePreview()); - - // получение параметров GET-запроса из URL - // параметры перечислены после символа ? (?id=1&color=black&...) - const urlParams = new URLSearchParams(location.search); - - // получение значения конкретного параметра (id) - // указан только при редактировании - const currentId = urlParams.get("id"); - // если id задан - if (currentId) { - try { - // вызов метода REST API для получения записи по первичному ключу(id) - const line = await getLine(currentId); + const line = await getBook(currentId); // заполнение формы для редактирования cntrls.itemsType.value = line.itemsId; cntrls.name.value = line.name;