Skip to content

Commit ed66d09

Browse files
authored
Merge pull request #9 from WhiteShark23/module5-task2
2 parents 82b8e7d + 3a7d1e2 commit ed66d09

File tree

4 files changed

+82
-8
lines changed

4 files changed

+82
-8
lines changed

src/const.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const SortType = {
2+
DEFAULT: 'default',
3+
PRICE: 'price',
4+
TIME: 'time',
5+
};

src/presenter/board-presenter.js

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
import FilterView from '../view/filter-view.js';
1+
import SortView from '../view/sort-view.js';
22
import { render } from '../framework/render.js';
33
import ListEventsView from '../view/list-events.js';
44
import EventPresenter from './event-presenter.js';
55
import { updateItem } from '../utils.js';
6+
import { SortType } from '../const.js';
7+
import { sortByPrice, sortByTime } from '../utils.js';
68

79
import LackDataView from '../view/lack-data-view.js';
810
export default class BoardPresenter {
911
#boardContainer = null;
1012
#pointsModel = null;
1113
#boardPoints = [];
1214
#eventsPresenter = new Map();
15+
#currentEventType = SortType.DEFAULT;
16+
#sourcedBoardEvents = [];
1317

1418
#listEventsComponent = new ListEventsView();
19+
#sortComponent = null;
1520

1621
constructor({boardContainer, pointsModel}) {
1722
this.#boardContainer = boardContainer;
@@ -20,10 +25,43 @@ export default class BoardPresenter {
2025

2126
init() {
2227
this.#boardPoints = [...this.#pointsModel.getPoint()];
28+
this.#sourcedBoardEvents = [...this.#pointsModel.getPoint()];
2329

2430
this.#renderBoard();
2531
}
2632

33+
#handleSortTypeChange = (sortType) => {
34+
if (this.#currentEventType === sortType) {
35+
return;
36+
}
37+
this.#sortEvents(sortType);
38+
this.#clearEventList();
39+
this.#renderItemsEvent();
40+
};
41+
42+
#renderSort() {
43+
this.#sortComponent = new SortView({
44+
onSortTypeChange: this.#handleSortTypeChange
45+
});
46+
47+
render(this.#sortComponent, this.#boardContainer);
48+
}
49+
50+
#sortEvents(sortType) {
51+
switch (sortType) {
52+
case SortType.PRICE:
53+
this.#boardPoints.sort(sortByPrice);
54+
break;
55+
case SortType.TIME:
56+
this.#boardPoints.sort(sortByTime);
57+
break;
58+
default:
59+
this.#boardPoints = [...this.#sourcedBoardEvents];
60+
}
61+
62+
this.#currentEventType = sortType;
63+
}
64+
2765
#renderNoEvent() {
2866
render(new LackDataView(), this.#boardContainer);
2967
}
@@ -50,8 +88,14 @@ export default class BoardPresenter {
5088
}
5189
}
5290

91+
#clearEventList() {
92+
this.#eventsPresenter.forEach((presenter) => presenter.destroy());
93+
this.#eventsPresenter.clear();
94+
}
95+
5396
#handleEventChange = (updatedEvent) => {
5497
this.#boardPoints = updateItem(this.#boardPoints, updatedEvent);
98+
this.#sourcedBoardEvents = updateItem(this.#sourcedBoardEvents, updatedEvent);
5599
this.#eventsPresenter.get(updatedEvent.id).init(this.#pointsModel, updatedEvent);
56100
};
57101

@@ -61,7 +105,7 @@ export default class BoardPresenter {
61105
return;
62106
}
63107

64-
render(new FilterView(), this.#boardContainer);
108+
this.#renderSort();
65109
this.#renderItemsEvent();
66110
}
67111
}

src/utils.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,11 @@ export function getTimePeriod(start, end) {
4646
export function updateItem(items, update) {
4747
return items.map((item) => item.id === update.id ? update : item);
4848
}
49+
50+
export function sortByPrice(eventA, eventB) {
51+
return eventB.basePrice - eventA.basePrice;
52+
}
53+
54+
export function sortByTime(event1, event2) {
55+
return dayjs(event2.dateTo).diff(dayjs(event2.dateFrom)) - dayjs(event1.dateTo).diff(dayjs(event1.dateFrom));
56+
}
Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import AbstractView from '../framework/view/abstract-view.js';
2+
import { SortType } from '../const.js';
23

3-
function createFilterTemplate() {
4+
function createSortTemplate() {
45
return `<form class="trip-events__trip-sort trip-sort" action="#" method="get">
56
<div class="trip-sort__item trip-sort__item--day">
6-
<input id="sort-day" class="trip-sort__input visually-hidden" type="radio" name="trip-sort" value="sort-day" checked>
7+
<input id="sort-day" class="trip-sort__input visually-hidden" type="radio" name="trip-sort" value="sort-day" data-sort-type="${SortType.DEFAULT}" checked>
78
<label class="trip-sort__btn" for="sort-day">Day</label>
89
</div>
910
@@ -13,12 +14,12 @@ function createFilterTemplate() {
1314
</div>
1415
1516
<div class="trip-sort__item trip-sort__item--time">
16-
<input id="sort-time" class="trip-sort__input visually-hidden" type="radio" name="trip-sort" value="sort-time">
17+
<input id="sort-time" class="trip-sort__input visually-hidden" type="radio" name="trip-sort" value="sort-time" data-sort-type="${SortType.TIME}">
1718
<label class="trip-sort__btn" for="sort-time">Time</label>
1819
</div>
1920
2021
<div class="trip-sort__item trip-sort__item--price">
21-
<input id="sort-price" class="trip-sort__input visually-hidden" type="radio" name="trip-sort" value="sort-price">
22+
<input id="sort-price" class="trip-sort__input visually-hidden" type="radio" name="trip-sort" value="sort-price" data-sort-type="${SortType.PRICE}">
2223
<label class="trip-sort__btn" for="sort-price">Price</label>
2324
</div>
2425
@@ -29,8 +30,24 @@ function createFilterTemplate() {
2930
</form>`;
3031
}
3132

32-
export default class FilterView extends AbstractView {
33+
export default class SortView extends AbstractView {
34+
#handleSortTypeChange = null;
35+
36+
constructor({onSortTypeChange}) {
37+
super();
38+
this.#handleSortTypeChange = onSortTypeChange;
39+
40+
this.element.addEventListener('click', this.#sortTypeChangeHandler);
41+
}
42+
3343
get template() {
34-
return createFilterTemplate();
44+
return createSortTemplate();
3545
}
46+
47+
#sortTypeChangeHandler = (evt) => {
48+
if (evt.target.tagName !== 'INPUT') {
49+
return;
50+
}
51+
this.#handleSortTypeChange(evt.target.dataset.sortType);
52+
};
3653
}

0 commit comments

Comments
 (0)