components refactored

This commit is contained in:
Sergey Yarkov 2019-11-22 22:59:09 +03:00
parent e86ed640f9
commit f63f72659f
8 changed files with 96 additions and 73 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,23 +0,0 @@
import { Component } from "../core/component";
export class CartComponent extends Component {
constructor(id) {
super(id);
}
init() {
const btnOpen = document.querySelector('#cartOpen');
const btnClose = this.$el.querySelector('#cartClose');
btnOpen.addEventListener('click', openHandler.bind(this));
btnClose.addEventListener('click', closeHandler.bind(this));
}
}
function openHandler() {
this.show();
}
function closeHandler() {
this.hide();
}

View File

@ -17,29 +17,26 @@ export class CategoryComponent extends Component {
if (localStorage.getItem('category')) { if (localStorage.getItem('category')) {
localStorage.removeItem('sortByAll', 'true'); // установка значения для компонента Filter localStorage.removeItem('sortByAll', 'true'); // установка значения для компонента Filter
const category = localStorage.getItem('category'), const category = localStorage.getItem('category');
bounded = breadcrumbActiveLink.bind(this); breadcrumbActiveLink.call(this, category); // окрашиваем категорию по нажатию на breadcrumb
showItems.call(this, category); // отображем айтемсы если был нажат breadcrumb
localStorage.removeItem('category'); // очищаем ключ category чтобы данные не показывались всегда
}
}
}
}
document.querySelector('#loader').classList.add('hide'); async function showItems(category) {
bounded(category); // <- ф-я окраски li по нажатию на breadcrumb
// отображем айтемсы если был нажат breadcrumb
(async function(){
const fData = await apiService.getItemsOne(category), const fData = await apiService.getItemsOne(category),
html = renderItemsOne(category, fData); html = renderItemsOne(category, fData);
document.querySelector('#roster').insertAdjacentHTML('afterbegin', html);
}())
// очищаем ключ category чтобы данные не показывались всегда this.items.onHide();
localStorage.removeItem('category'); this.items.insertItems(html);
}
}
}
} }
async function buttonHandler(e) { async function buttonHandler(e) {
e.preventDefault(); e.preventDefault();
if (e.target.dataset.category && e.target.dataset.category != 'all') { if (e.target.dataset.category && e.target.dataset.category != 'all') { // Выполняем логику если нажали на кнопки кроме "Все товары"
localStorage.removeItem('sortByAll'); // установка значения для компонента Filter localStorage.removeItem('sortByAll'); // установка значения для компонента Filter
this.filter.clearChecked(); this.filter.clearChecked();
@ -51,8 +48,8 @@ async function buttonHandler(e) {
html = renderItemsOne(category, fData); html = renderItemsOne(category, fData);
this.items.onHide(); this.items.onHide();
document.querySelector('#roster').insertAdjacentHTML('afterbegin', html); this.items.insertItems(html);
} else if (e.target.dataset.category === 'all') { } else if (e.target.dataset.category === 'all') { // Выполняем логику если нажали на кнопку "Все товары"
localStorage.setItem('sortByAll', 'true'); // установка значения для компонента Filter localStorage.setItem('sortByAll', 'true'); // установка значения для компонента Filter
this.filter.clearChecked(); this.filter.clearChecked();
@ -64,7 +61,7 @@ async function buttonHandler(e) {
html = renderItems(categories, fData); html = renderItems(categories, fData);
this.items.onHide(); this.items.onHide();
document.querySelector('#roster').insertAdjacentHTML('afterbegin', html); this.items.insertItems(html);
} }
} }

View File

@ -30,13 +30,12 @@ async function sortByAllHandler(e) {
const sorting = e.target.id; const sorting = e.target.id;
this.items.onShow(); this.items.onShow();
const fData = await apiService.getItems(sorting), const fData = await apiService.getItems(sorting),
categories = Object.keys(fData), categories = Object.keys(fData),
html = renderItems(categories, fData); html = renderItems(categories, fData);
this.items.onHide(); this.items.onHide();
document.querySelector('#roster').insertAdjacentHTML('afterbegin', html); this.items.insertItems(html);
} }
} }
} }
@ -47,13 +46,12 @@ async function sortByOneHandler(e) {
const sorting = e.target.id; const sorting = e.target.id;
this.items.onShow(); this.items.onShow();
const category = localStorage.getItem('currentCategory'), const category = localStorage.getItem('currentCategory'),
fData = await apiService.getItemsOne(category, sorting), fData = await apiService.getItemsOne(category, sorting),
html = renderItemsOne(category, fData); html = renderItemsOne(category, fData);
this.items.onHide(); this.items.onHide();
document.querySelector('#roster').insertAdjacentHTML('afterbegin', html); this.items.insertItems(html);
} }
} }
} }

View File

@ -6,26 +6,23 @@ export class ItemsComponent extends Component {
constructor(id, {loader}) { constructor(id, {loader}) {
super(id); super(id);
this.loader = loader; this.loader = loader;
this.$el ? this.roster = this.$el.querySelector('#roster') : false;
} }
async init() { async init() {
if (this.$el) { if (this.$el) {
localStorage.setItem('sortByAll', 'true'); // установка значения для компонента Filter localStorage.setItem('sortByAll', 'true'); // установка значения для компонента Filter
if (!localStorage.getItem('category')) { if (!localStorage.getItem('category')) { // Получаем все товары и выводим их если нету ключа category в ls
const roster = this.$el.querySelector('#roster'); // Список с товарами
// Получаем все товары и вывоим их если нету ключа category в ls
const fData = await apiService.getItems(), const fData = await apiService.getItems(),
categories = Object.keys(fData); categories = Object.keys(fData);
if (categories.length) { if (categories.length) {
const html = renderItems(categories, fData); const html = renderItems(categories, fData);
roster.insertAdjacentHTML('afterbegin', html); this.insertItems(html);
} else { } else {
roster.innerHTML = 'Товаров на сайте пока что нету'; this.roster.innerHTML = 'Товаров на сайте пока что нету';
} }
// Убираем крутящийся лоадер
this.loader.hide(); this.loader.hide();
} }
} }
@ -39,4 +36,8 @@ export class ItemsComponent extends Component {
this.$el.querySelector('#roster').innerHTML = ''; this.$el.querySelector('#roster').innerHTML = '';
this.loader.show(); this.loader.show();
} }
insertItems(html) {
this.roster.insertAdjacentHTML('afterbegin', html);
}
} }

31
src/js/core/modal.js Normal file
View File

@ -0,0 +1,31 @@
export class Modal {
constructor(id, open, close) {
this.$el = document.getElementById(id);
this.open = document.getElementById(open);
this.close = document.getElementById(close);
this.init();
}
init() {
this.open.addEventListener('click', openHandler.bind(this));
this.close.addEventListener('click', closeHandler.bind(this));
}
show() {
this.$el.classList.remove('hide');
document.body.style.overflowY = 'hidden';
}
hide() {
this.$el.classList.add('hide');
document.body.style.overflowY = '';
}
}
function openHandler() {
this.show();
}
function closeHandler() {
this.hide();
}

View File

@ -1,17 +1,17 @@
import { HeaderComponent } from "./components/header.component.js"; import { HeaderComponent } from "./components/header.component.js";
import { InformationComponent } from "./components/information.component.js"; import { InformationComponent } from "./components/information.component.js";
import { CartComponent } from "./components/cart.component.js";
import { LoaderComponent } from "./components/loader.component.js"; import { LoaderComponent } from "./components/loader.component.js";
import { ItemsComponent } from "./components/items.component.js"; import { ItemsComponent } from "./components/items.component.js";
import { CategoryComponent } from "./components/category.component.js"; import { CategoryComponent } from "./components/category.component.js";
import { BreadcrumbComponent } from "./components/breadcrumb.component.js"; import { BreadcrumbComponent } from "./components/breadcrumb.component.js";
import { FilterComponent } from "./components/filter.component.js"; import { FilterComponent } from "./components/filter.component.js";
import { CartModal } from "./modals/cart.modal.js";
const header = new HeaderComponent('header'); const header = new HeaderComponent('header');
const loader = new LoaderComponent('loader'); const loader = new LoaderComponent('loader');
const information = new InformationComponent('information'); const information = new InformationComponent('information');
const cart = new CartComponent('cart');
const items = new ItemsComponent('items', {loader}); const items = new ItemsComponent('items', {loader});
const filter = new FilterComponent('filter', {items}); const filter = new FilterComponent('filter', {items});
const category = new CategoryComponent('category', {items}, {filter}); const category = new CategoryComponent('category', {items}, {filter});
const breadcumb = new BreadcrumbComponent('breadcrumb'); const breadcumb = new BreadcrumbComponent('breadcrumb');
const cart = new CartModal('cart', 'cartOpen', 'cartClose');

View File

@ -0,0 +1,7 @@
import { Modal } from "../core/modal";
export class CartModal extends Modal {
constructor(id, open, close) {
super(id, open, close);
}
}