168 lines
6.2 KiB
JavaScript
168 lines
6.2 KiB
JavaScript
|
// модуль для работы с элементами управления
|
|||
|
|
|||
|
// объект для удобного получения элементов
|
|||
|
// при обращении к атрибуту объекта вызывается
|
|||
|
// нужная функция для поиска элемента
|
|||
|
export const cntrls = {
|
|||
|
table: document.querySelector("#items-table tbody"),
|
|||
|
form: document.getElementById("items-form"),
|
|||
|
lineId: document.getElementById("items-line-id"),
|
|||
|
title: document.getElementById("item-title"),
|
|||
|
author: document.getElementById("item-author"),
|
|||
|
price: document.getElementById("item-price"),
|
|||
|
count: document.getElementById("item-count"),
|
|||
|
descrition: document.getElementById("item-descrition"),
|
|||
|
annotation: document.getElementById("item-annotation"),
|
|||
|
itemId: document.getElementById("item-id"),
|
|||
|
publisher: document.getElementById("item-publisher"),
|
|||
|
series: document.getElementById("item-series"),
|
|||
|
publicationYear: document.getElementById("item-publication-year"),
|
|||
|
pagesNum: document.getElementById("item-pages-num"),
|
|||
|
size: document.getElementById("item-size"),
|
|||
|
coverType: document.getElementById("item-cover-type"),
|
|||
|
circulation: document.getElementById("item-circulation"),
|
|||
|
weight: document.getElementById("item-weight"),
|
|||
|
сategoriesType: document.getElementById("item-category"),
|
|||
|
image: document.getElementById("image"),
|
|||
|
imagePreview: document.getElementById("image-preview"),
|
|||
|
catalogBooks: document.getElementById("book-container"),
|
|||
|
};
|
|||
|
|
|||
|
// Дефолтное превью
|
|||
|
export const imagePlaceholder = "https://placehold.co/400x600/#DCDCDC/black";
|
|||
|
|
|||
|
// функция создает тег option для select
|
|||
|
// <option value="" selected>name</option>
|
|||
|
export function createCategoriesOption(name, value = "", isSelected = false) {
|
|||
|
const option = document.createElement("option");
|
|||
|
option.value = value || "";
|
|||
|
option.selected = isSelected;
|
|||
|
option.text = name;
|
|||
|
return option;
|
|||
|
}
|
|||
|
|
|||
|
// функция создает ссылку (a) для таблицы
|
|||
|
// при нажатии вызывается callback
|
|||
|
// ссылка "оборачивается" тегом td
|
|||
|
function createTableAnchor(button, callback) {
|
|||
|
const a = document.createElement("a");
|
|||
|
a.href = "#";
|
|||
|
a.appendChild(button);
|
|||
|
a.onclick = (event) => {
|
|||
|
// чтобы в URL не добавлялась решетка
|
|||
|
event.preventDefault();
|
|||
|
event.stopPropagation();
|
|||
|
callback();
|
|||
|
};
|
|||
|
|
|||
|
const td = document.createElement("td");
|
|||
|
td.appendChild(a);
|
|||
|
return td;
|
|||
|
}
|
|||
|
|
|||
|
function createCatalogAnchor(image, callback) {
|
|||
|
const a = document.createElement("a");
|
|||
|
a.href = "#";
|
|||
|
a.appendChild(image);
|
|||
|
a.onclick = (event) => {
|
|||
|
event.preventDefault();
|
|||
|
event.stopPropagation();
|
|||
|
callback();
|
|||
|
};
|
|||
|
|
|||
|
return a;
|
|||
|
}
|
|||
|
|
|||
|
// функция создает колонку таблицы с текстом value
|
|||
|
// <td>value</td>
|
|||
|
function createTableColumn(value) {
|
|||
|
const td = document.createElement("td");
|
|||
|
td.textContent = value;
|
|||
|
return td;
|
|||
|
}
|
|||
|
|
|||
|
// функция создает строку таблицы
|
|||
|
export function createTableRow(item, 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.appendChild(rowNumber);
|
|||
|
row.appendChild(createTableColumn(item.title));
|
|||
|
row.appendChild(createTableColumn(item.author));
|
|||
|
row.appendChild(createTableColumn(parseFloat(item.price).toFixed(2)));
|
|||
|
row.appendChild(createTableColumn(item.count));
|
|||
|
row.appendChild(createTableColumn(parseFloat(item.sum).toFixed(2)));
|
|||
|
row.appendChild(createTableColumn(item.categories.name));
|
|||
|
// редактировать на странице add-item
|
|||
|
const btnEdit = document.createElement('button');
|
|||
|
btnEdit.className = 'btn btn-primary w-100';
|
|||
|
btnEdit.textContent = 'Редактировать';
|
|||
|
row.appendChild(createTableAnchor(btnEdit, editPageCallback));
|
|||
|
// удаление
|
|||
|
const btnDelete = document.createElement('button');
|
|||
|
btnDelete.className = 'btn btn-primary w-100';
|
|||
|
btnDelete.textContent = 'Удалить';
|
|||
|
row.appendChild(createTableAnchor(btnDelete, deleteCallback));
|
|||
|
return row;
|
|||
|
}
|
|||
|
|
|||
|
export function createCatalogItem(item, callback) {
|
|||
|
const col = document.createElement("div");
|
|||
|
col.className = 'col-sm-6 col-md-4 col-lg-3 mt-4';
|
|||
|
|
|||
|
const block = document.createElement("div");
|
|||
|
block.className = 'block d-flex flex-column h-100';
|
|||
|
|
|||
|
const imgDiv = document.createElement("div");
|
|||
|
imgDiv.className = 'd-flex justify-content-center mb-4';
|
|||
|
|
|||
|
const img = document.createElement("img");
|
|||
|
img.src = item.image;
|
|||
|
img.className = 'catalog-book-cover';
|
|||
|
img.alt = 'book-cover-catalog-1';
|
|||
|
img.width = '155';
|
|||
|
img.height = '245';
|
|||
|
imgDiv.appendChild(createCatalogAnchor(img, callback));
|
|||
|
|
|||
|
const bookDescription = document.createElement("div");
|
|||
|
bookDescription.className = 'catalog-book-description d-flex flex-column align-items-start';
|
|||
|
|
|||
|
const price = document.createElement("p");
|
|||
|
price.className = 'catalog-price mb-3';
|
|||
|
const priceValue = parseInt(item.price, 10);
|
|||
|
price.textContent = `${priceValue} ₽`;
|
|||
|
const title = document.createElement("p");
|
|||
|
title.className = 'catalog-book-title mb-3';
|
|||
|
title.textContent = item.title;
|
|||
|
const author = document.createElement("p");
|
|||
|
author.className = 'catalog-author mb-3';
|
|||
|
author.textContent = item.author;
|
|||
|
|
|||
|
bookDescription.appendChild(price);
|
|||
|
bookDescription.appendChild(title);
|
|||
|
bookDescription.appendChild(author);
|
|||
|
|
|||
|
const flexDiv = document.createElement("div");
|
|||
|
flexDiv.className = 'flex-grow-1';
|
|||
|
|
|||
|
const btnDiv = document.createElement("div");
|
|||
|
btnDiv.className = 'catalog-btn-checkout-div d-flex justify-content-start';
|
|||
|
|
|||
|
const btn = document.createElement("btn");
|
|||
|
btn.className = 'catalog-bth-checkout btn rounded-5 px-3';
|
|||
|
btn.textContent = 'В корзину';
|
|||
|
btnDiv.appendChild(btn);
|
|||
|
|
|||
|
block.appendChild(imgDiv);
|
|||
|
block.appendChild(bookDescription);
|
|||
|
block.appendChild(flexDiv);
|
|||
|
block.appendChild(btnDiv);
|
|||
|
|
|||
|
col.appendChild(block);
|
|||
|
return col;
|
|||
|
}
|