Skip to content

Commit af621ad

Browse files
authored
Merge pull request #12 from Vitali3207/module12-task1
2 parents e1c74ea + ea726ad commit af621ad

10 files changed

Lines changed: 134 additions & 167 deletions

File tree

index.html

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
<main>
1616

1717
<!-- Фильтрация изображений от других пользователей -->
18-
<section class="img-filters img-filters--inactive container">
19-
<h2 class="img-filters__title visually-hidden">Фильтр фотографий</h2>
18+
<section class="img-filters img-filters--inactive container">
19+
<h2 class="img-filters__title visually-hidden">Фильтр фотографий</h2>
2020
<form class="img-filters__form" action="index.html" method="get" autocomplete="off">
2121
<button type=button class="img-filters__button img-filters__button--active" id="filter-default">По умолчанию</button>
2222
<button type=button class="img-filters__button" id="filter-random">Случайные</button>
@@ -36,7 +36,7 @@ <h2 class="img-upload__title visually-hidden">Загрузка фотограф
3636

3737
<!-- Изначальное состояние поля для загрузки изображения -->
3838
<fieldset class="img-upload__start">
39-
<input type="file" id="upload-file" class="img-upload__input visually-hidden" name="filename" required>
39+
<input type="file" id="upload-file" class="img-upload__input visually-hidden" name="filename" accept="image/jpg, image/jpeg, image/png" required>
4040
<label for="upload-file" class="img-upload__label img-upload__control">Загрузить</label>
4141
</fieldset>
4242

@@ -235,7 +235,6 @@ <h2 class="success__title">Изображение успешно загруже
235235
<h2 class="data-error__title">Не удалось загрузить данные</h2>
236236
</section>
237237
</template>
238-
<script src="js/functions.js"></script>
239238
<script src="vendor/nouislider/nouislider.js"></script>
240239
<script src="vendor/pristine/pristine.min.js"></script>
241240
<script src="js/main.js" type="module"></script>

js/big-picture.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const buttonLoader = document.querySelector('.comments-loader');
1313
const buttonClose = document.querySelector('.big-picture__cancel');
1414
socialComments.innerHTML = '';
1515

16-
const COMMENTS__STEP = 5;
16+
const COMMENTS_STEP = 5;
1717
let commentCount = 0;
1818
let currentComments = [];
1919

@@ -29,7 +29,7 @@ const onPictureCancelClick = () => {
2929
};
3030

3131
const onShowMoreButtonClick = () => {
32-
const renderingNewComments = currentComments.slice(commentCount, commentCount + COMMENTS__STEP);
32+
const renderingNewComments = currentComments.slice(commentCount, commentCount + COMMENTS_STEP);
3333
const newCommentsLength = renderingNewComments.length += commentCount;
3434
const fragment = document.createDocumentFragment();
3535

@@ -50,7 +50,7 @@ const onShowMoreButtonClick = () => {
5050
if (newCommentsLength >= currentComments.length) {
5151
buttonLoader.classList.add('hidden');
5252
}
53-
commentCount += COMMENTS__STEP;
53+
commentCount += COMMENTS_STEP;
5454
};
5555

5656
const renderComments = (currentPhotoComments) => {
@@ -111,5 +111,5 @@ const setPicturesListener = (photos) => {
111111
usersPhotoList.addEventListener('click', (evt) => onPictureContainerClick(evt, photos));
112112
};
113113

114-
export { setPicturesListener, onEscKeyDown };
114+
export { setPicturesListener, onEscKeyDown, renderBigPicture };
115115

js/filter.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { renderThumbnails } from './render-thumbnails';
2+
import { debounce } from './util';
3+
4+
const filterContainer = document.querySelector('.img-filters');
5+
const filterDefault = 'filter-default';
6+
const filterRandom = 'filter-random';
7+
const filterDiscussed = 'filter-discussed';
8+
9+
const debounceRenderPicture = debounce(renderThumbnails, 500);
10+
let currentFilter = filterDefault;
11+
let pictures = [];
12+
13+
const generateFilter = () => {
14+
let picturesFilter = [];
15+
16+
if (currentFilter === filterDefault) {
17+
picturesFilter = pictures;
18+
} else if (currentFilter === filterRandom) {
19+
picturesFilter = pictures.toSorted(() => Math.random() - 0.5).slice(0, 10);
20+
} else if (currentFilter === filterDiscussed) {
21+
picturesFilter = pictures.toSorted((a, b) => b.comments.length - a.comments.length);
22+
}
23+
debounceRenderPicture(picturesFilter);
24+
};
25+
26+
function onFilterClick (evt) {
27+
const activButton = document.querySelector('.img-filters__button--active');
28+
const targetButton = evt.target;
29+
30+
if (!targetButton.matches('button') || activButton === targetButton) {
31+
return;
32+
}
33+
34+
activButton.classList.remove('img-filters__button--active');
35+
targetButton.classList.add('img-filters__button--active');
36+
currentFilter = targetButton.id;
37+
38+
generateFilter();
39+
}
40+
41+
const initFilter = (picturesData) => {
42+
filterContainer.classList.remove('img-filters--inactive');
43+
filterContainer.addEventListener('click', onFilterClick);
44+
pictures = picturesData;
45+
};
46+
47+
export { initFilter };
48+
49+

js/form/image-form.js

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@ import { initScale, resetScale } from './image-scale';
33
import { initValidation, validateForm } from './validation';
44
import { initEffect, resetEffect } from './slider-effect';
55
import { sendData } from '../load-data';
6-
import { showSuccessMessage, showErrorMessage, errorMessageContainer } from '../messages';
6+
import { generateErrorMessage, showSuccessMessage, showErrorMessage, hasErrorMessage } from '../messages';
7+
8+
const FILE_TYPES = ['.jpg', '.jpeg', '.png', '.gif'];
79

810
const uploadForm = document.querySelector('.img-upload__form');
9-
const uploadInput = uploadForm.querySelector('.img-upload__input');
1011
const formOverlay = uploadForm.querySelector('.img-upload__overlay');
1112
const buttonCloseUpload = uploadForm.querySelector('.img-upload__cancel');
1213
const hashtagsInput = uploadForm.querySelector('.text__hashtags');
1314
const descriptionInput = uploadForm.querySelector('.text__description');
14-
15+
const fileChooser = document.querySelector('.img-upload__wrapper input[type=file]');
16+
const preview = document.querySelector('.img-upload__preview img');
17+
const uploadFormEffects = uploadForm.querySelectorAll('.effects__preview');
1518

1619
const onEscKeyDown = (evt) => {
17-
if (isEscapeKey(evt) && (document.activeElement !== hashtagsInput || document.activeElement !== descriptionInput) && !errorMessageContainer) {
20+
if (isEscapeKey(evt) && (document.activeElement !== hashtagsInput || document.activeElement !== descriptionInput) && !hasErrorMessage) {
1821
closeUploadModal();
1922
}
2023
};
@@ -32,6 +35,8 @@ function closeUploadModal () {
3235
resetEffect();
3336
resetScale();
3437
uploadForm.reset();
38+
fileChooser.reset();
39+
// При повторной попытке отправить неверный формата файла ошибка не появляется. Подскажи как реализовать.
3540
}
3641

3742
const openUploadModal = () => {
@@ -45,12 +50,33 @@ const openUploadModal = () => {
4550
initValidation();
4651
};
4752

48-
const sendFormData = async (formElement) => {
53+
function onFileChooserChange () {
54+
const file = fileChooser.files[0];
55+
const fileName = file.name.toLowerCase();
56+
57+
const matches = FILE_TYPES.some((item) => fileName.endsWith(item));
58+
59+
if (matches) {
60+
preview.src = URL.createObjectURL(file);
61+
uploadFormEffects.forEach((item) => {
62+
item.style.backgroundImage = `url(${URL.createObjectURL(file)})`;
63+
});
64+
}else {
65+
generateErrorMessage();
66+
return;
67+
}
68+
69+
openUploadModal();
70+
}
71+
72+
const onFormSubmit = async (evt) => {
73+
evt.preventDefault();
74+
4975
const isValid = validateForm();
5076

5177
if (isValid) {
5278
try {
53-
await sendData(new FormData(formElement));
79+
await sendData(new FormData(evt.target));
5480
closeUploadModal();
5581
showSuccessMessage();
5682
} catch (error) {
@@ -59,17 +85,9 @@ const sendFormData = async (formElement) => {
5985
}
6086
};
6187

62-
const onFormSubmit = (evt) => {
63-
evt.preventDefault();
64-
sendFormData(evt.target);
65-
};
66-
6788
const initUploadModal = () => {
6889
uploadForm.addEventListener('submit', onFormSubmit);
69-
70-
uploadInput.addEventListener('change', () => {
71-
openUploadModal();
72-
});
90+
fileChooser.addEventListener('change', onFileChooserChange);
7391
};
7492

7593
export { initUploadModal };

js/functions.js

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

js/generator.js

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

js/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import { generateErrorMessage } from './messages.js';
33
import { renderThumbnails } from './render-thumbnails';
44
import { setPicturesListener } from './big-picture';
55
import { initUploadModal } from './form/image-form';
6+
import { initFilter } from './filter.js';
67

78
const bootstrap = async () => {
89
try {
910
const photos = await getData();
1011
renderThumbnails(photos);
1112
setPicturesListener(photos);
13+
initFilter(photos);
1214
initUploadModal();
1315
}catch(error) {
1416
generateErrorMessage();

0 commit comments

Comments
 (0)