-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
161 lines (134 loc) · 6.26 KB
/
Copy pathscript.js
File metadata and controls
161 lines (134 loc) · 6.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
window.addEventListener("DOMContentLoaded", () => {
const container = document.querySelector("#container-card"),
partOfURL = new URLSearchParams(window.location.search);
async function getData() {
const response = await fetch(
`https://gorest.co.in/public-api/posts?page=${partOfURL.get("page")}`
),
data = await response.json();
return JSON.parse(JSON.stringify(data));
}
//создание блока карточки для публикации постов
function createElement(header, text, id, partOfURL) {
const mainContainer = document.createElement("div"),
link = document.createElement("a"),
cardContainer = document.createElement("div"),
cardBody = document.createElement("div"),
title = document.createElement("h2"),
textArticle = document.createElement("p");
//добавляем классы для HTML- тэгов из библиотеки Bootstrap
mainContainer.classList.add("col-xl-6", "mb-4");
cardContainer.classList.add("card", "h-100", "text-dark", "shadow");
cardBody.classList.add("card-body");
title.classList.add("card-title");
textArticle.classList.add("card-text", "mt-4");
link.classList.add("text-decoration-none", "text-reset");
/*говорим, что в элементы title и textArticle попадут элементы
(название статьи и сама статья) после перебора массива в функции createApp*/
title.textContent = header;
textArticle.textContent = text;
// публикуем на странице созданные элементы
mainContainer.append(link);
link.append(cardContainer);
cardContainer.append(cardBody);
cardBody.append(title, textArticle);
/* задаем условие для того, чтобы иметь возможность переходить на 2 страницу, связываем ее
с выбранным блогом */
partOfURL.get("page")
? link.setAttribute(
"href",
`./comments.html?id=${id}&page=${partOfURL.get("page")}`
)
: link.setAttribute("href", `./comments.html?id=${id}&page=1`);
return mainContainer;
}
//формируем блок с пагинацией, связываем элементы с текущими страницами
function displayPagintaion(page) {
const list = document.querySelector(".pagination"),
item = document.createElement("li"),
link = document.createElement("a");
link.href = `index.html?page=${page}`;
item.classList.add("page-item");
link.classList.add("page-link");
link.textContent = `${page}`;
list.append(item);
item.append(link);
return list;
}
//формируем блок с кнопками перехода по страницам
function createPaginationBtn(onePage, pages) {
let groupBtn = document.querySelector(".group-button"),
pagLinkPrev = document.createElement("a"),
pagLinkNext = document.createElement("a");
pagLinkPrev.textContent = "Previous page";
pagLinkNext.textContent = "Next page";
const btnStyle = ["btn", "btn-primary", "btn-nav"];
pagLinkPrev.classList.add(...btnStyle, "btn-previous");
pagLinkNext.classList.add(...btnStyle, "btn-next");
groupBtn.append(pagLinkPrev);
groupBtn.append(pagLinkNext);
pagLinkPrev.id = "btn-previous";
pagLinkNext.id = "btn-next";
//объявляем переменные с условием перехода по текущим страницам
const pagePrevNum = onePage - 1 < 1 ? 1 : onePage - 1;
const pageNextNum = onePage + 1 > pages ? pages : onePage + 1;
const btnPageNav = document.querySelectorAll(".btn-nav");
btnPageNav.forEach((event) => {
event.addEventListener("click", (el) => {
if (el.target.classList.contains("btn-next")) {
const linkBtnNext = `?page=${pageNextNum}`;
const btnNextHtml = el.path[0];
btnNextHtml.setAttribute("href", `index.html${linkBtnNext}`);
} else {
const linkBtnPrev = pagePrevNum === 1 ? "" : `?page=${pagePrevNum}`;
const btnPrevHtml = el.path[0];
btnPrevHtml.setAttribute("href", `index.html${linkBtnPrev}`);
}
});
});
//формируем условие - если задать страницу, которой нет на сервере, выпадет ошибка
if (onePage > pages || onePage < 0) {
const title = document.createElement("h2");
title.classList.add("title", "text-danger", "text-center");
title.innerText = "Такой страницы нет!";
container.append(title);
}
return {
groupBtn,
btnPageNav,
};
}
//запускаем приложение
async function createApp() {
//получаем данные с сервера
const dataResponse = await getData();
//спомощью метода форич отрисовываем страницу с блоками информации
dataResponse.data.forEach((e) => {
container.append(createElement(e.title, e.body, e.id, partOfURL));
});
//объявляем переменные с общим количеством страниц, с лимитом вывода информации на страницу
let pages = dataResponse.meta.pagination.pages;
let onePage = dataResponse.meta.pagination.page;
let limit = dataResponse.meta.pagination.limit;
//запускаем цикл, с помощью которого выводим кнопки пагинации на страницу
let c = document.createElement("li")
c.classList.add('d-flex')
c.innerHTML = `
<a href="index.html?page=11" class="page-link">...</a>
<a href="index.html?page=${pages - 2}" class="page-link">${pages - 2}</a>
<a href="index.html?page=${pages - 1}" class="page-link">${pages - 1}</a>
<a href="index.html?page=${pages}" class="page-link">${pages}</a>`;
for (let i = 1; i < pages; i++) {
if (i <= 5) {
displayPagintaion(i);
} else if (i > 6 && i <= 9) {
displayPagintaion(i);
} else if (i == 10) {
let a = displayPagintaion(i);
a.append(c);
}
}
createPaginationBtn(onePage, pages);
}
createApp();
});