Skip to content

Commit fe8bdbf

Browse files
authored
Merge pull request #30 from 777aoksana/master
2 parents f9a3a2a + 79a2a7c commit fe8bdbf

22 files changed

+354
-318
lines changed

TechnicalSpecification.md

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
Описание функциональности
77

8-
1. Загрузка нового изображения на сайт и заполнение информации о нём
8+
+ 1. Загрузка нового изображения на сайт и заполнение информации о нём
99

1010
+ 1.1. Загрузка нового изображения:
1111
выбор файла с изображением для загрузки;
@@ -27,7 +27,7 @@
2727
Элементу .img-upload__overlay возвращается класс hidden. У элемента body удаляется класс modal-open.
2828

2929

30-
2. Редактирование изображения и ограничения, накладываемые на поля
30+
+ 2. Редактирование изображения и ограничения, накладываемые на поля
3131

3232
+ 2.1. Масштаб:
3333
При нажатии на кнопки .scale__control--smaller и .scale__control--bigger должно изменяться значение поля .scale__control--value;
@@ -94,37 +94,39 @@
9494
поля для ввода хэштегов и комментария очищаются;
9595
поле загрузки фотографии, стилизованное под букву «О» в логотипе, очищается.
9696

97-
3.4. Если отправка данных прошла успешно, показывается соответствующее сообщение. Разметку сообщения, которая находится в блоке #success внутри шаблона template, нужно разместить перед закрывающим тегом </body>. Сообщение должно удаляться со страницы после нажатия на кнопку .success__button, по нажатию на клавишу Esc и по клику на произвольную область экрана за пределами блока с сообщением.
97+
+ 3.4. Если отправка данных прошла успешно, показывается соответствующее сообщение. Разметку сообщения, которая находится в блоке #success внутри шаблона template, нужно разместить перед закрывающим тегом </body>. Сообщение должно удаляться со страницы после нажатия на кнопку .success__button, по нажатию на клавишу Esc и по клику на произвольную область экрана за пределами блока с сообщением.
9898

99-
3.5. Если при отправке данных произошла ошибка запроса, нужно показать соответствующее сообщение. Разметку сообщения, которая находится в блоке #error внутри шаблона template, нужно разместить перед закрывающим тегом </body>. Сообщение должно удаляться со страницы после нажатия на кнопку .error__button, по нажатию на клавишу Esc и по клику на произвольную область экрана за пределами блока с сообщением. В таком случае вся введённая пользователем информация сохраняется, чтобы у него была возможность отправить форму повторно.
99+
+ 3.5. Если при отправке данных произошла ошибка запроса, нужно показать соответствующее сообщение. Разметку сообщения, которая находится в блоке #error внутри шаблона template, нужно разместить перед закрывающим тегом </body>. Сообщение должно удаляться со страницы после нажатия на кнопку .error__button, по нажатию на клавишу Esc и по клику на произвольную область экрана за пределами блока с сообщением. В таком случае вся введённая пользователем информация сохраняется, чтобы у него была возможность отправить форму повторно.
100100

101101
+ 3.6. Нажатие на кнопку .img-upload__cancel приводит к закрытию формы и возвращению всех данных и контрола фильтра к исходному состоянию (описано в пункте 3.3). Поле загрузки фотографии, стилизованное под букву «О» в логотипе, очищается.
102102

103103
4. Просмотр загруженных изображений
104-
4.1. Загрузка изображений от других пользователей производится сразу после открытия страницы с удалённого сервера: https://31.javascript.htmlacademy.pro/kekstagram/data.
104+
+ 4.1. Загрузка изображений от других пользователей производится сразу после открытия страницы с удалённого сервера: https://31.javascript.htmlacademy.pro/kekstagram/data.
105105

106-
4.2. Если при загрузке данных с сервера произошла ошибка запроса, нужно показать соответствующее сообщение. Разметку сообщения, которая находится в блоке #data-error внутри шаблона template, нужно разместить перед закрывающим тегом </body>. Сообщение удаляется со страницы через 5 секунд.
106+
+ 4.2. Если при загрузке данных с сервера произошла ошибка запроса, нужно показать соответствующее сообщение. Разметку сообщения, которая находится в блоке #data-error внутри шаблона template, нужно разместить перед закрывающим тегом </body>. Сообщение удаляется со страницы через 5 секунд.
107107

108-
4.3. Все загруженные изображения показаны на главной странице в виде миниатюр. DOM-элемент миниатюры генерируется на основе шаблонного элемента picture, расположенного в элементе template на странице.
108+
+ 4.3. Все загруженные изображения показаны на главной странице в виде миниатюр. DOM-элемент миниатюры генерируется на основе шаблонного элемента picture, расположенного в элементе template на странице.
109109

110-
4.4. При нажатии на любую из миниатюр, показывается блок .big-picture, содержащий полноэкранное изображение с количеством лайков и комментариев. Элементу body задаётся класс modal-open. Данные, описывающие изображение, должны подставляться в соответствующие элементы в разметке.
110+
+ 4.4. При нажатии на любую из миниатюр, показывается блок .big-picture, содержащий полноэкранное изображение с количеством лайков и комментариев. Элементу body задаётся класс modal-open. Данные, описывающие изображение, должны подставляться в соответствующие элементы в разметке.
111111

112-
4.5. Выход из полноэкранного режима просмотра фотографии осуществляется либо нажатием на иконку крестика .big-picture__cancel в правом верхнем углу блока .big-picture, либо нажатием на клавишу Esc. У элемента body удаляется класс modal-open.
112+
+ 4.5. Выход из полноэкранного режима просмотра фотографии осуществляется либо нажатием на иконку крестика .big-picture__cancel в правом верхнем углу блока .big-picture, либо нажатием на клавишу Esc. У элемента body удаляется класс modal-open.
113113

114-
4.6. Все комментарии к изображению выводятся в блок .social__comments. Сразу после открытия изображения в полноэкранном режиме отображается не более 5 комментариев. Количество показанных комментариев и общее число комментариев отображается в блоке .social__comment-count. Пример разметки списка комментариев приведён в блоке .social__comments. Комментарий оформляется отдельным элементом списка li с классом social__comment. Аватарка автора комментария отображается в блоке .social__picture. Имя автора комментария отображается в атрибуте alt его аватарки. Текст комментария выводится в блоке .social__text.
114+
+ 4.6. Все комментарии к изображению выводятся в блок .social__comments. Сразу после открытия изображения в полноэкранном режиме отображается не более 5 комментариев. Количество показанных комментариев и общее число комментариев отображается в блоке .social__comment-count. Пример разметки списка комментариев приведён в блоке .social__comments. Комментарий оформляется отдельным элементом списка li с классом social__comment. Аватарка автора комментария отображается в блоке .social__picture. Имя автора комментария отображается в атрибуте alt его аватарки. Текст комментария выводится в блоке .social__text.
115115

116-
4.7. Отображение дополнительных комментариев происходит при нажатии на кнопку .comments-loader. При нажатии на кнопку отображается не более 5 новых комментариев. При изменении количества показанных комментариев число показанных комментариев в блоке .social__comment-count также изменяется.
116+
+ 4.7. Отображение дополнительных комментариев происходит при нажатии на кнопку .comments-loader. При нажатии на кнопку отображается не более 5 новых комментариев. При изменении количества показанных комментариев число показанных комментариев в блоке .social__comment-count также изменяется.
117117

118-
4.8. Если все комментарии показаны, кнопку .comments-loader следует скрыть, добавив класс hidden.
118+
+ 4.8. Если все комментарии показаны, кнопку .comments-loader следует скрыть, добавив класс hidden.
119119

120120
5. Фильтрация изображений от других пользователей
121-
5.1. Доступные фильтры:
121+
122+
+ 5.1. Доступные фильтры:
122123
«По умолчанию» — фотографии в изначальном порядке с сервера;
123124
«Случайные» — 10 случайных, не повторяющихся фотографий;
124125
«Обсуждаемые» — фотографии, отсортированные в порядке убывания количества комментариев.
125-
5.2. Блок, с помощью которого производится фильтрация фотографий, скрыт изначально и показывается только после получения от сервера данных об изображениях других пользователей.
126126

127-
5.3. При переключении фильтров, отрисовка изображений, подходящих под новый фильтр, должна производиться не чаще, чем один раз 500 мс (устранение дребезга).
127+
+ 5.2. Блок, с помощью которого производится фильтрация фотографий, скрыт изначально и показывается только после получения от сервера данных об изображениях других пользователей.
128+
129+
+ 5.3. При переключении фильтров, отрисовка изображений, подходящих под новый фильтр, должна производиться не чаще, чем один раз 500 мс (устранение дребезга).
128130

129131

130132
Дополнительные задания:

js/create-photos/comments-photo.js

Lines changed: 0 additions & 15 deletions
This file was deleted.

js/create-photos/create-data.js

Lines changed: 0 additions & 34 deletions
This file was deleted.

js/create-photos/thumbnails.js

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import {
22
openModal
33
} from '../rendering-big-photos/modal-window.js';
4-
import {
5-
pictureTemplate,
6-
picturesContainer
7-
} from '../create-photos/create-data.js';
84

5+
const pictureTemplate = document
6+
.querySelector('#picture')
7+
.content
8+
.querySelector('.picture');
9+
10+
const picturesContainer = document
11+
.querySelector('.pictures');
912

1013
let localPictures;
1114

@@ -15,21 +18,25 @@ const clearPictures = () => {
1518
.forEach((picture) => picture.remove());
1619
};
1720

18-
export const renderPictures = (pictures) => {
21+
const renderPictures = (pictures) => {
1922
localPictures = [...pictures];
2023
clearPictures();
21-
const documentFragment = document.createDocumentFragment();
24+
const documentFragment = document
25+
.createDocumentFragment();
2226

2327
pictures.forEach(({ id, url, description, likes, comments }) => {
24-
const pictureElement = pictureTemplate.cloneNode(true);
28+
const pictureElement = pictureTemplate
29+
.cloneNode(true);
2530

2631
pictureElement.dataset.id = id;
2732

28-
const isImage = pictureElement.querySelector('.picture__img');
33+
const isImage = pictureElement
34+
.querySelector('.picture__img');
2935
isImage.src = url;
3036
isImage.alt = description;
3137

32-
const pictureElementInfo = pictureElement.querySelector('.picture__info');
38+
const pictureElementInfo = pictureElement
39+
.querySelector('.picture__info');
3340

3441
pictureElementInfo
3542
.querySelector('.picture__likes')
@@ -48,13 +55,19 @@ export const renderPictures = (pictures) => {
4855
};
4956

5057
const onPictureClick = (evt) => {
51-
const card = evt.target.closest('.picture');
58+
const card = evt.target
59+
.closest('.picture');
5260
if (card) {
5361
const id = Number(card.dataset.id);
54-
const photo = localPictures.find((item) => item.id === id);
62+
const photo = localPictures
63+
.find((item) => item.id === id);
5564
openModal(photo);
5665
}
5766
};
5867

5968
picturesContainer
6069
.addEventListener('click', onPictureClick);
70+
71+
export {
72+
renderPictures
73+
};

js/fetch/api-data.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
const BASE_URL = 'https://31.javascript.htmlacademy.pro/kekstagram';
2-
31
const Routes = {
42
GET_DATA: '/data',
53
SEND_DATA: '/',
@@ -15,7 +13,12 @@ const ErrorTexts = {
1513
POST: 'Ошибка отправки данных. Попробуйте ещё раз',
1614
};
1715

18-
const pageBody = document.querySelector('body');
16+
const BASE_URL = 'https://31.javascript.htmlacademy.pro/kekstagram';
17+
18+
const ALERT_SHOW_TIME = 5000;
19+
20+
const pageBody = document
21+
.querySelector('body');
1922

2023
const alertTemplate = document
2124
.querySelector('#data-error')
@@ -38,16 +41,14 @@ const templateError = document
3841
const errorElement = templateError
3942
.querySelector('.error');
4043

41-
const ALERT_SHOW_TIME = 5000;
42-
4344
export {
44-
BASE_URL,
4545
Routes,
4646
Methods,
4747
ErrorTexts,
48+
BASE_URL,
49+
ALERT_SHOW_TIME,
4850
pageBody,
4951
alertTemplate,
5052
successElement,
51-
errorElement,
52-
ALERT_SHOW_TIME
53+
errorElement
5354
};

js/fetch/api-message.js

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
import {
2-
isEscapeKeydown
3-
} from '../utils.js';
41
import {
52
ALERT_SHOW_TIME,
63
pageBody,
74
alertTemplate,
85
successElement,
96
errorElement
107
} from '../fetch/api-data.js';
8+
import {
9+
registerWindow,
10+
removeRegistrationWindow } from '../keydown-controller.js';
1111

12-
13-
export const MESSAGE_TYPES = {
12+
const MESSAGE_TYPES = {
1413
SUCCESS: 'success',
1514
ERROR: 'error'
1615
};
@@ -34,23 +33,20 @@ const showMessage = (type) => {
3433

3534
const close = () => {
3635
message.remove();
37-
document.removeEventListener('keydown', onEscape);
3836
};
3937

40-
function onEscape(evt) {
41-
if (isEscapeKeydown(evt)) {
42-
close();
43-
}
44-
}
45-
46-
message.addEventListener('click', ({target}) => {
38+
message.addEventListener('click', ({ target }) => {
4739
if (target.classList.contains(type) || target.classList.contains(`${type}__button`)) {
4840
close();
41+
removeRegistrationWindow();
4942
}
5043
});
51-
52-
document.addEventListener('keydown', onEscape);
44+
registerWindow(close);
5345
pageBody.appendChild(message);
5446
};
5547

56-
export { showAlert, showMessage };
48+
export {
49+
MESSAGE_TYPES,
50+
showAlert,
51+
showMessage
52+
};

js/fetch/server-api.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import {
2-
BASE_URL,
32
Routes,
43
Methods,
5-
ErrorTexts
4+
ErrorTexts,
5+
BASE_URL
66
} from '../fetch/api-data.js';
77

8-
98
const processPromise = (route, method = Methods.GET, errorText = null, body = null) =>
109
fetch(`${BASE_URL}${route}`, { method, body })
1110
.then((response) => {

0 commit comments

Comments
 (0)