// модуль с логикой import { hideUpdateModal, showUpdateModal } from "./lines-modal"; import { createLine, deleteLine, getAllItemTypes, getAllColorTypes, getAllOptionTypes, getAllLines, updateLine, } from "./lines-rest-api"; import { cntrls, createItemsOption, createTableRow, imagePlaceholder, } from "./lines-ui"; async function drawItemsSelect() { // вызов метода REST API для получения списка типов товаров const data = await getAllItemTypes(); // очистка содержимого select // удаляется все, что находится между тегами // но не атрибуты cntrls.itemsType.innerHTML = ""; // пустое значение cntrls.itemsType.appendChild(createItemsOption("Выберите значение", "", true)); // цикл по результату ответа от сервера // используется лямбда-выражение // (item) => {} аналогично function(item) {} data.forEach((item) => { cntrls.itemsType.appendChild(createItemsOption(item.name, item.id)); }); } async function drawColorsSelect() { // вызов метода REST API для получения списка типов товаров const data = await getAllColorTypes(); // очистка содержимого select // удаляется все, что находится между тегами // но не атрибуты cntrls.colorsType.innerHTML = ""; // пустое значение cntrls.colorsType.appendChild(createItemsOption("Выберите значение", "", true)); // цикл по результату ответа от сервера // используется лямбда-выражение // (item) => {} аналогично function(item) {} data.forEach((item) => { cntrls.colorsType.appendChild(createItemsOption(item.name, item.id)); }); } // async function drawOptionsSelect() { // вызов метода REST API для получения списка типов товаров const data = await getAllOptionTypes(); // очистка содержимого select // удаляется все, что находится между тегами // но не атрибуты cntrls.option.innerHTML = ""; // пустое значение cntrls.option.appendChild(createItemsOption("Выберите значение", "", true)); // цикл по результату ответа от сервера // используется лямбда-выражение // (item) => {} аналогично function(item) {} // data.forEach((item) => { // cntrls.option.appendChild(createItemsOption(item.name, 1)); // }); const array1 = data[0].name.split(" "); const array2 = data[1].name.split(" "); const array3 = data[2].name.split(" "); const array4 = data[3].name.split(" "); cntrls.itemsType.addEventListener('change', function() { const selectedValue = this.value; // Получаем выбранное значение cntrls.option.innerHTML = ""; cntrls.option.appendChild(createItemsOption("Выберите значение", "", true)); // if (selectedValue == 1) { // array1.forEach((item) => { // cntrls.option.appendChild(createItemsOption(item, 1)); // }); // } if (selectedValue == 1) { for (let i = 0; i < array1.length; i++) { cntrls.option.appendChild(createItemsOption(array1[i], i+1)); } } if (selectedValue == 2) { for (let i = 0; i < array2.length; i++) { cntrls.option.appendChild(createItemsOption(array2[i], i+1)); } } if (selectedValue == 3) { for (let i = 0; i < array3.length; i++) { cntrls.option.appendChild(createItemsOption(array3[i], i+1)); } } if (selectedValue == 4) { for (let i = 0; i < array4.length; i++) { cntrls.option.appendChild(createItemsOption(array4[i], i+1)); } } // const selectElement = document.querySelector('option[value="3"]'); // console.log(selectElement.innerHTML) }); } async function drawLinesTable() { console.info("Try to load data"); if (!cntrls.table) { return; } // вызов метода REST API для получения всех записей const data = await getAllLines(); // очистка содержимого table // удаляется все, что находится между тегами
// но не атрибуты cntrls.table.innerHTML = ""; // цикл по результату ответа от сервера // используется лямбда-выражение // (item, index) => {} аналогично function(item, index) {} data.forEach((item, index) => { cntrls.table.appendChild( createTableRow( item, index, // функции передаются в качестве параметра // это очень удобно, так как аргументы функций доступны только // в данном месте кода и не передаются в сервисные модули () => showUpdateModal(item), () => removeLine(item.id), ), ); }); } async function addLine(item, option, product, color, price, image) { console.info("Try to add item"); // вызов метода REST API для добавления записи const data = await createLine(item, option, product, color, price, image); console.info("Added"); console.info(data); // загрузка и заполнение table drawLinesTable(); } async function editLine(id, item, option, product, color, price, image) { console.info("Try to update item"); // вызов метода REST API для обновления записи const data = await updateLine(id, item, option, product, color, price, image); console.info("Updated"); console.info(data); // загрузка и заполнение table drawLinesTable(); } async function removeLine(id) { if (!confirm("Do you really want to remove this item?")) { console.info("Canceled"); return; } console.info("Try to remove item"); // вызов метода REST API для удаления записи const data = await deleteLine(id); console.info(data); // загрузка и заполнение table drawLinesTable(); } // функция для получения содержимого файла в виде base64 строки // https://ru.wikipedia.org/wiki/Base64 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"); // загрузка и заполнение select со списком товаров drawItemsSelect() drawColorsSelect() drawOptionsSelect() // загрузка и заполнение table drawLinesTable() // Вызов функции обновления превью изображения при возникновении // события oncahnge в тэге input с id image cntrls.image.addEventListener("change", () => updateImagePreview()); // обработчик события нажатия на кнопку для показа модального окна cntrls.button.addEventListener("click", () => showUpdateModal(null)); // обработчик события отправки формы // возникает при нажатии на кнопку (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); } // получение id строки для редактирования // это значение содержится в скрытом input const currentId = cntrls.lineId.value; // если значение id не задано, // то необходимо выполнить добавление записи // иначе обновление записи const selectedValue = parseInt(cntrls.option.value); const data3 = await getAllOptionTypes(); const idInt = parseInt(cntrls.itemsType.value)-1 const array12 = data3[idInt].name.split(" "); const index = array12[selectedValue-1] console.log(index) if (!currentId) { await addLine( cntrls.itemsType.value, index, cntrls.product.value, cntrls.colorsType.value, cntrls.price.value, imageBase64, ); } else { await editLine( currentId, cntrls.itemsType.value, index, cntrls.product.value, cntrls.colorsType.value, cntrls.price.value, imageBase64, ); } // после выполнения добавления/обновления модальное окно скрывается hideUpdateModal(); }); }