Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Обновление века (часть 1) #7

Merged
merged 10 commits into from
Oct 18, 2024
2 changes: 1 addition & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ <h2 class="visually-hidden">Filter events</h2>
</div>
</div>

<button class="trip-main__event-add-btn btn btn--big btn--yellow" type="button">New event</button>
<!-- Кнопка -->
</div>
</div>
</header>
Expand Down
16 changes: 15 additions & 1 deletion src/const.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,24 @@ const SortType = {
TIME: 'time',
};

const UserAction = {
UPDATE_EVENT: 'UPDATE_EVENT',
ADD_EVENT: 'ADD_EVENT',
DELETE_EVENT: 'DELETE_EVENT',
};

const UpdateType = {
PATCH: 'PATCH',
MINOR: 'MINOR',
MAJOR: 'MAJOR',
};

export {
EVENTS_TYPES,
CITIES,
SENTENCES,
FilterType,
SortType
SortType,
UserAction,
UpdateType
};
31 changes: 26 additions & 5 deletions src/main.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,47 @@
import { render } from './framework/render.js';
import EventsModel from './model/events-model.js';
import FilterModel from './model/filter-model.js';
import NewTripInfoView from './view/new-trip-info-view.js';
import NewTripFiltersView from './view/new-filters-view.js';
import BoardPresenter from './presenter/board-presenter.js';
import { generateFilter } from './mock/filter.js';
import FilterPresenter from './presenter/filter-presenter.js';
import NewAddEventButtonView from './view/new-add-event-button-view.js';


const tripMainContainer = document.querySelector('.trip-main');
const tripFiltersContainer = tripMainContainer.querySelector('.trip-controls__filters');
const tripEventsContainer = document.querySelector('.trip-events');

const eventsModel = new EventsModel();
const filterModel = new FilterModel();
const boardPresenter = new BoardPresenter({
container: tripEventsContainer,
eventsModel,
filterModel,
onNewEventDestroy: handleNewEventFormClose,
});
const filterPresenter = new FilterPresenter({
filterContainer: tripFiltersContainer,
filterModel,
eventsModel
});

const filters = generateFilter(eventsModel.userEvents);
const newEventButtonComponent = new NewAddEventButtonView({
onClick: handleNewEventButtonClick
});

render (new NewTripInfoView(), tripMainContainer, 'AFTERBEGIN');
render (new NewTripFiltersView({filters}), tripFiltersContainer);
function handleNewEventFormClose() {
newEventButtonComponent.element.disabled = false;
}

function handleNewEventButtonClick() {
boardPresenter.createEvent();
newEventButtonComponent.element.disabled = true;
}


render (new NewTripInfoView(), tripMainContainer, 'AFTERBEGIN');
render(newEventButtonComponent, tripMainContainer);

filterPresenter.init();
boardPresenter.init();

12 changes: 0 additions & 12 deletions src/mock/filter.js

This file was deleted.

64 changes: 62 additions & 2 deletions src/model/events-model.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import EventsConnector from './events-connector';
import Observable from '../framework/observable.js';

export default class EventsModel {
export default class EventsModel extends Observable {
#EventsConnector = new EventsConnector;
#eventsList = this.#EventsConnector.userEvents;
#destinationsData = this.#EventsConnector.destinationsData;
Expand All @@ -10,12 +11,71 @@ export default class EventsModel {
return this.#eventsList;
}

get destinationsData() {
get destinationsData () {
return this.#destinationsData;
}

#generateDefaultEvent = () => {
const defaultType = 'flight';
const defaultOffers = this.getOffersMapByType(defaultType);
return {
id: '',
basePrice: 0,
dateFrom: '',
dateTo: '',
destination: {},
isFavorite: false,
offers: defaultOffers,
type: defaultType,
};
};

get defaultEvent () {
return this.#generateDefaultEvent();
}

findDestinationData = (destinationId) => this.#destinationsData.find((destination) => destination.id === destinationId);

getOffersMapByType = (type) => this.#offersMap.get(type) || null;

updateEvent(updateType, update) {
const index = this.#eventsList.findIndex((event) => event.id === update.id);

if (index === -1) {
throw new Error('Can\'t update unexisting event');
}

this.#eventsList = [
...this.#eventsList.slice(0, index),
update,
...this.#eventsList.slice(index + 1),
];

this._notify(updateType, update);
}

addEvent(updateType, update) {
this.#eventsList = [
update,
...this.#eventsList,
];

this._notify(updateType, update);
}

deleteEvent(updateType, update) {
const index = this.#eventsList.findIndex((event) => event.id === update.id);

if (index === -1) {
throw new Error('Can\'t delete unexisting event');
}

this.#eventsList = [
...this.#eventsList.slice(0, index),
...this.#eventsList.slice(index + 1),
];

this._notify(updateType);
}

}
15 changes: 15 additions & 0 deletions src/model/filter-model.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Observable from '../framework/observable.js';
import { FilterType } from '../const.js';

export default class FilterModel extends Observable {
#filter = FilterType.EVERYTHING;

get filter() {
return this.#filter;
}

setFilter(updateType, filter) {
this.#filter = filter;
this._notify(updateType, filter);
}
}
Loading
Loading