Skip to content

Commit 7905ec6

Browse files
authored
Merge pull request #11 from Despair322/module12-task1
2 parents fc7de91 + 4939b8b commit 7905ec6

4 files changed

Lines changed: 73 additions & 5 deletions

File tree

js/filters.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { renderPictures } from './pictures-renderer.js';
2+
import { debounce } from './util.js';
3+
4+
const RANDOM_COUNT = 10;
5+
const RERENDER_DELAY = 500;
6+
const BUTTON_ACTIVE_CLASS = 'img-filters__button--active';
7+
const Filters = {
8+
'filter-default': null,
9+
'filter-random': (elements) => elements.toSorted(() => Math.random() - 0.5).slice(0, RANDOM_COUNT),
10+
'filter-discussed': (elements) => elements.toSorted((a, b) => b.comments - a.comments),
11+
};
12+
const debouncedRenderPictures = debounce(renderPictures, RERENDER_DELAY);
13+
14+
const filters = document.querySelector('.img-filters');
15+
const filtersForm = filters.querySelector('.img-filters__form');
16+
const buttons = filtersForm.querySelectorAll('.img-filters__button');
17+
18+
const buttonClickHandler = (evt, gallery) => {
19+
evt.preventDefault();
20+
const targetButton = evt.target;
21+
const activeButton = filtersForm.querySelector(`.${BUTTON_ACTIVE_CLASS}`);
22+
if(targetButton === activeButton) {
23+
return;
24+
}
25+
activeButton.classList.remove(BUTTON_ACTIVE_CLASS);
26+
targetButton.classList.add(BUTTON_ACTIVE_CLASS);
27+
const filter = Filters[targetButton.id];
28+
debouncedRenderPictures(gallery, filter);
29+
};
30+
31+
const buttonsAttachHandlers = (gallery) => {
32+
buttons.forEach((button) => {
33+
button.addEventListener('click', (evt) => {
34+
buttonClickHandler(evt, gallery);
35+
});
36+
});
37+
};
38+
const showFilters = (gallery) => {
39+
filters.classList.remove('img-filters--inactive');
40+
buttonsAttachHandlers(gallery);
41+
};
42+
43+
export { showFilters, buttonsAttachHandlers };

js/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import { Popup } from './popup.js';
44
import { Gallery } from './gallery.js';
55
import { getData } from './api.js';
66
import { showErrorMessage } from './util.js';
7+
import { showFilters } from './filters.js';
78
import './form.js';
89

910
try {
1011
const data = await getData();
1112
const gallery = new Gallery(data);
13+
showFilters(gallery);
1214
renderPictures(gallery);
1315
new Popup(gallery);
1416
} catch (error) {

js/pictures-renderer.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
const pictureTemplate = document.querySelector('#picture').content.querySelector('.picture');
33
const pictureContainer = document.querySelector('.pictures');
4-
4+
let picturesFragment;
55
const createPictureElement = (photo) => {
66
const pictureElement = pictureTemplate.cloneNode(true);
77
const img = pictureElement.querySelector('.picture__img');
@@ -22,9 +22,20 @@ const createPictures = (photos) => {
2222
return fragment;
2323
};
2424

25-
const renderPictures = (gallery) => {
26-
const fragment = createPictures(gallery.getPictures());
27-
pictureContainer.appendChild(fragment);
25+
const clearPictures = () => {
26+
pictureContainer.querySelectorAll('.picture').forEach((picture) => {
27+
picture.remove();
28+
});
29+
};
30+
31+
const renderPictures = (gallery, filter = null) => {
32+
clearPictures();
33+
let pictures = gallery.getPictures();
34+
if (filter) {
35+
pictures = filter(pictures);
36+
}
37+
picturesFragment = createPictures(pictures);
38+
pictureContainer.appendChild(picturesFragment);
2839
};
2940

3041
export { renderPictures };

js/util.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,16 @@ const showErrorMessage = () => {
99
setTimeout(() => errorElement.remove(), REMOVE_MESSAGE_TIMEOUT);
1010
};
1111

12-
export { isEscapeKey, showErrorMessage };
12+
function debounce (callback, timeoutDelay = 500) {
13+
let timeoutId;
14+
15+
return (...rest) => {
16+
console.log(timeoutId);
17+
clearTimeout(timeoutId);
18+
timeoutId = setTimeout(() => callback.apply(this, rest), timeoutDelay);
19+
console.log(timeoutId);
20+
21+
};
22+
}
23+
24+
export { isEscapeKey, showErrorMessage, debounce };

0 commit comments

Comments
 (0)