From 24b8f825270499905670466bcaf09a0d9545b7b0 Mon Sep 17 00:00:00 2001 From: Max <133934232+Kleostro@users.noreply.github.com> Date: Tue, 14 May 2024 19:07:33 +0300 Subject: [PATCH] feat: implement meta filters --- .../ProductCard/view/ProductCardView.ts | 8 +- .../model/ProductFiltersModel.ts | 73 +++--- .../ProductFilters/view/ProductFiltersView.ts | 227 +++++++++++++----- .../view/productFiltersView.module.scss | 78 +++++- src/shared/Input/model/InputModel.ts | 5 + src/shared/Store/observer.ts | 8 + src/shared/constants/buttons.ts | 3 + src/shared/constants/filters.ts | 28 ++- src/shared/constants/initialState.ts | 1 + src/shared/constants/product.ts | 9 + src/shared/img/png/notFound.png | Bin 0 -> 108475 bytes src/shared/types/productFilters.ts | 3 +- src/widgets/Catalog/model/CatalogModel.ts | 69 +++--- src/widgets/Catalog/view/CatalogView.ts | 51 +++- .../Catalog/view/catalogView.module.scss | 28 ++- 15 files changed, 438 insertions(+), 153 deletions(-) create mode 100644 src/shared/img/png/notFound.png diff --git a/src/entities/ProductCard/view/ProductCardView.ts b/src/entities/ProductCard/view/ProductCardView.ts index 8e850c0c..274b0111 100644 --- a/src/entities/ProductCard/view/ProductCardView.ts +++ b/src/entities/ProductCard/view/ProductCardView.ts @@ -62,9 +62,7 @@ class ProductCardView { } private createBasicPrice(): HTMLSpanElement { - const { discount, price } = this.size - ? this.params.variant.find(({ size }) => size === this.size) ?? {} - : this.params.variant[0]; + const { discount, price } = this.params.variant.find(({ size }) => size === this.size) ?? this.params.variant[0]; const innerContent = discount ? `$${discount.toFixed(2)}` : `$${price?.toFixed(2)}`; this.basicPrice = createBaseElement({ cssClasses: [styles.basicPrice], @@ -117,9 +115,7 @@ class ProductCardView { } private createOldPrice(): HTMLSpanElement { - const { discount, price } = this.size - ? this.params.variant.find(({ size }) => size === this.size) ?? {} - : this.params.variant[0]; + const { discount, price } = this.params.variant.find(({ size }) => size === this.size) ?? this.params.variant[0]; const innerContent = discount ? `$${price?.toFixed(2)}` : ''; this.oldPrice = createBaseElement({ cssClasses: [styles.oldPrice], diff --git a/src/features/ProductFilters/model/ProductFiltersModel.ts b/src/features/ProductFilters/model/ProductFiltersModel.ts index 0d322835..ee7d0b10 100644 --- a/src/features/ProductFilters/model/ProductFiltersModel.ts +++ b/src/features/ProductFilters/model/ProductFiltersModel.ts @@ -5,15 +5,16 @@ import type { SelectedFilters } from '@/shared/types/productFilters.ts'; import getStore from '@/shared/Store/Store.ts'; import { setSelectedFilters } from '@/shared/Store/actions.ts'; import observeStore, { selectCurrentLanguage } from '@/shared/Store/observer.ts'; -import { FILTER_INPUT_RANGE_LABEL } from '@/shared/constants/filters.ts'; +import { META_FILTERS } from '@/shared/constants/filters.ts'; import ProductFiltersView from '../view/ProductFiltersView.ts'; class ProductFiltersModel { - private params: ProductFiltersParams; + private params: ProductFiltersParams | null; private selectedFilters: SelectedFilters = { category: new Set(), + metaFilter: META_FILTERS.en.ALL_PRODUCTS, price: { max: 0, min: 0, @@ -23,17 +24,17 @@ class ProductFiltersModel { private view: ProductFiltersView; - constructor(params: ProductFiltersParams) { + constructor(params: ProductFiltersParams | null) { this.params = params; this.view = new ProductFiltersView(params); this.init(); } private init(): void { - this.selectedFilters = getStore().getState().selectedFilters ?? this.selectedFilters; this.initCategoryFilters(); this.initPriceFilters(); this.initSizeFilters(); + this.setMetaLinksHandlers(); this.setResetFiltersButtonHandler(); observeStore(selectCurrentLanguage, () => { @@ -55,21 +56,7 @@ class ProductFiltersModel { } private initPriceFilters(): void { - const fromInput = this.view - .getPriceInputs() - .get(FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].FROM); - const toInput = this.view.getPriceInputs().get(FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].TO); - const priceSlider = this.view.getPriceSlider(); - if (!fromInput || !toInput) { - return; - } - priceSlider.on('update', (values) => { - const [min, max] = values; - fromInput.getHTML().value = min.toString(); - toInput.getHTML().value = max.toString(); - }); - - priceSlider.on('set', (values) => { + this.view.getPriceSlider().on('set', (values) => { const [min, max] = values; this.selectedFilters.price = { max: +max, @@ -78,13 +65,6 @@ class ProductFiltersModel { getStore().dispatch(setSelectedFilters(this.selectedFilters)); }); - - fromInput - .getHTML() - .addEventListener('change', () => priceSlider.set([fromInput.getHTML().value, toInput.getHTML().value])); - toInput - .getHTML() - .addEventListener('change', () => priceSlider.set([fromInput.getHTML().value, toInput.getHTML().value])); } private initSizeFilters(): void { @@ -112,6 +92,16 @@ class ProductFiltersModel { }); } + private setMetaLinksHandlers(): void { + this.view.getMetaLinks().forEach((metaLink) => { + metaLink.getHTML().addEventListener('click', () => { + this.switchLinkState(metaLink); + this.selectedFilters.metaFilter = metaLink.getHTML().id; + getStore().dispatch(setSelectedFilters(this.selectedFilters)); + }); + }); + } + private setResetFiltersButtonHandler(): void { const filtersResetButton = this.view.getFiltersResetButton(); filtersResetButton.getHTML().addEventListener('click', () => { @@ -119,14 +109,22 @@ class ProductFiltersModel { this.view.getSizeLinks().forEach((link) => this.view.switchSelectedFilter(link, false)); this.selectedFilters = { category: new Set(), + metaFilter: META_FILTERS.en.ALL_PRODUCTS, price: { - max: this.params.priceRange?.max ?? 0, - min: this.params.priceRange?.min ?? 0, + max: this.params?.priceRange?.max ?? 0, + min: this.params?.priceRange?.min ?? 0, }, size: null, }; + this.setMetaLinksHandlers(); + this.view.getMetaLinks().forEach((link) => { + this.view.switchSelectedFilter(link, false); + if (link.getHTML().id === this.selectedFilters.metaFilter) { + this.view.switchSelectedFilter(link, true); + } + }); - this.view.getPriceSlider().set([this.params.priceRange?.min ?? 0, this.params.priceRange?.max ?? 0]); + this.view.getPriceSlider().set([this.params?.priceRange?.min ?? 0, this.params?.priceRange?.max ?? 0]); getStore().dispatch(setSelectedFilters(this.selectedFilters)); }); @@ -145,15 +143,22 @@ class ProductFiltersModel { }); } - public getCategoryLinks(): LinkModel[] { - return this.view.getCategoryLinks(); + private switchLinkState(metaLink: LinkModel): void { + this.view.getMetaLinks().forEach((link) => { + this.view.switchSelectedFilter(link, false); + }); + this.view.switchSelectedFilter(metaLink, true); + } + + public getDefaultFilters(): HTMLDivElement { + return this.view.getDefaultFilters(); } - public getHTML(): HTMLDivElement { - return this.view.getHTML(); + public getMetaFilters(): HTMLDivElement { + return this.view.getMetaFilters(); } - public updateParams(params: ProductFiltersParams): void { + public updateParams(params: ProductFiltersParams | null): void { this.view.updateParams(params); } } diff --git a/src/features/ProductFilters/view/ProductFiltersView.ts b/src/features/ProductFilters/view/ProductFiltersView.ts index 4dc0a306..c57fa855 100644 --- a/src/features/ProductFilters/view/ProductFiltersView.ts +++ b/src/features/ProductFilters/view/ProductFiltersView.ts @@ -7,16 +7,20 @@ import InputModel from '@/shared/Input/model/InputModel.ts'; import LinkModel from '@/shared/Link/model/LinkModel.ts'; import getStore from '@/shared/Store/Store.ts'; import observeStore, { selectCurrentLanguage } from '@/shared/Store/observer.ts'; -import { LANGUAGE_CHOICE } from '@/shared/constants/buttons.ts'; +import { BUTTON_TEXT, LANGUAGE_CHOICE } from '@/shared/constants/buttons.ts'; import { AUTOCOMPLETE_OPTION } from '@/shared/constants/common.ts'; -import { FILTER_INPUT_RANGE_LABEL, FILTER_RESET_BUTTON, FILTER_TITLE } from '@/shared/constants/filters.ts'; +import { META_FILTERS, META_FILTERS_ID, PRICE_RANGE_LABEL, TITLE } from '@/shared/constants/filters.ts'; import { INPUT_TYPE } from '@/shared/constants/forms.ts'; +import { PAGE_ID } from '@/shared/constants/pages.ts'; import createBaseElement from '@/shared/utils/createBaseElement.ts'; import * as noUiSlider from 'nouislider'; import styles from './productFiltersView.module.scss'; -const BASE_FILTER_LINK_COUNT = '(0)'; +const SEGMENTS_TO_KEEP = import.meta.env.VITE_APP_PATH_SEGMENTS_TO_KEEP; +const DEFAULT_SEGMENT = import.meta.env.VITE_APP_DEFAULT_SEGMENT; + +const BASE_PRODUCT_COUNT = '(0)'; const SLIDER_PRICE_OFFSET = 10; const INPUT_PRICE_STEP = 5; @@ -27,9 +31,13 @@ class ProductFiltersView { private categoryList: HTMLUListElement; - private filters: HTMLDivElement; + private defaultFilters: HTMLDivElement; + + private metaFilters: HTMLDivElement; - private params: ProductFiltersParams; + private metaLinks: LinkModel[] = []; + + private params: ProductFiltersParams | null; private priceInputs: Map = new Map(); @@ -43,21 +51,23 @@ class ProductFiltersView { private sizesList: HTMLUListElement; - constructor(params: ProductFiltersParams) { + constructor(params: ProductFiltersParams | null) { this.params = params; this.categoryList = this.createCategoryList(); this.priceSlider = this.createPriceSlider(); this.sizesList = this.createSizesList(); this.resetFiltersButton = this.createResetFiltersButton(); - this.filters = this.createHTML(); + this.defaultFilters = this.createDefaultFilters(); + this.metaFilters = this.createMetaFilters(); + this.setPriceSliderHandlers(); } - private createCategoryLink(category: Category): LinkModel { - const text = category.name[getStore().getState().currentLanguage === LANGUAGE_CHOICE.EN ? 0 : 1].value; + private createCategoryLink(category: { category: Category; count: number }): LinkModel { + const text = category.category.name[getStore().getState().currentLanguage === LANGUAGE_CHOICE.EN ? 0 : 1].value; const categoryLink = new LinkModel({ attrs: { - href: category.key, - id: category.id, + href: category.category.key, + id: category.category.id, }, classes: [styles.categoryLink], text, @@ -69,20 +79,16 @@ class ProductFiltersView { const span = createBaseElement({ attributes: { - id: category.id, + id: category.category.id, }, cssClasses: [styles.categoryLinkCount], - innerContent: BASE_FILTER_LINK_COUNT, + innerContent: `(${category.count})`, tag: 'span', }); this.categoryCountSpan.push(span); categoryLink.getHTML().append(span); - const productsCount = - this.params.categoriesProductCount?.find((item) => item.category.key === category.key)?.count ?? 0; - span.textContent = `(${productsCount})`; - this.categoryLinks.push(categoryLink); return categoryLink; } @@ -93,12 +99,12 @@ class ProductFiltersView { list: [styles.categoryList], title: [styles.categoryTitle], }, - FILTER_TITLE[getStore().getState().currentLanguage].CATEGORY, + TITLE[getStore().getState().currentLanguage].CATEGORY, ); this.categoryList = filtersList; - this.params.categories?.forEach((category) => { + this.params?.categoriesProductCount?.forEach((category) => { const li = createBaseElement({ cssClasses: [styles.categoryItem], tag: 'li', @@ -113,8 +119,8 @@ class ProductFiltersView { this.categoryLinks.length = 0; this.categoryList.innerHTML = ''; this.categoryList.append(filtersListTitle); - filtersListTitle.textContent = FILTER_TITLE[getStore().getState().currentLanguage].CATEGORY; - this.params.categories?.forEach((category) => { + filtersListTitle.textContent = TITLE[getStore().getState().currentLanguage].CATEGORY; + this.params?.categoriesProductCount?.forEach((category) => { this.categoryList.append(this.createCategoryLink(category).getHTML()); }); }); @@ -122,6 +128,23 @@ class ProductFiltersView { return this.categoryList; } + private createDefaultFilters(): HTMLDivElement { + this.defaultFilters = createBaseElement({ + cssClasses: [styles.defaultFilters], + tag: 'div', + }); + + this.defaultFilters.append( + this.categoryList, + this.createPriceWrapper(), + this.priceSlider.target, + this.sizesList, + this.resetFiltersButton.getHTML(), + ); + + return this.defaultFilters; + } + private createFiltersList( classes: Record, title: string, @@ -143,21 +166,53 @@ class ProductFiltersView { return { filtersList, filtersListTitle }; } - private createHTML(): HTMLDivElement { - this.filters = createBaseElement({ - cssClasses: [styles.filters], + private createMetaFilters(): HTMLDivElement { + this.metaFilters = createBaseElement({ + cssClasses: [styles.metaFilters], tag: 'div', }); - this.filters.append( - this.categoryList, - this.createPriceWrapper(), - this.priceSlider.target, - this.sizesList, - this.resetFiltersButton.getHTML(), + const allProductsLink = this.createMetaLink( + META_FILTERS[getStore().getState().currentLanguage].ALL_PRODUCTS, + META_FILTERS_ID.ALL_PRODUCTS, + META_FILTERS.en.ALL_PRODUCTS, + ); + const newArrivalsLink = this.createMetaLink( + META_FILTERS[getStore().getState().currentLanguage].NEW_ARRIVALS, + META_FILTERS_ID.NEW_ARRIVALS, + META_FILTERS.en.NEW_ARRIVALS, ); + const saleLink = this.createMetaLink( + META_FILTERS[getStore().getState().currentLanguage].SALE, + META_FILTERS_ID.SALE, + META_FILTERS.en.SALE, + ); + allProductsLink.getHTML().classList.add(styles.activeLink); + this.metaFilters.append(allProductsLink.getHTML(), newArrivalsLink.getHTML(), saleLink.getHTML()); - return this.filters; + return this.metaFilters; + } + + private createMetaLink(text: string, href: string, id: string): LinkModel { + const link = new LinkModel({ + attrs: { + href, + id, + }, + classes: [styles.metaLink], + text, + }); + + link.getHTML().addEventListener('click', (event) => { + event.preventDefault(); + const path = PAGE_ID.CATALOG_PAGE; + const url = `${window.location.pathname.split(DEFAULT_SEGMENT)[SEGMENTS_TO_KEEP]}/${path}/${href}`; + history.pushState({ path }, '', url); + }); + + this.metaLinks.push(link); + + return link; } private createPriceLabel(direction: string): { @@ -178,22 +233,20 @@ class ProductFiltersView { tag: 'span', }); - const minPrice = this.params.priceRange?.min.toFixed(2) ?? ''; - const maxPrice = this.params.priceRange?.max.toFixed(2) ?? ''; + const minPrice = this.params?.priceRange?.min.toFixed(2) ?? ''; + const maxPrice = this.params?.priceRange?.max.toFixed(2) ?? ''; + const from = PRICE_RANGE_LABEL[getStore().getState().currentLanguage].FROM; + const to = PRICE_RANGE_LABEL[getStore().getState().currentLanguage].TO; const priceInput = new InputModel({ autocomplete: AUTOCOMPLETE_OPTION.OFF, - id: - direction === FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].FROM - ? FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].FROM - : FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].TO, - max: this.params.priceRange?.max, - min: this.params.priceRange?.min, - placeholder: - direction === FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].FROM ? minPrice : maxPrice, + id: direction === from ? from : to, + max: this.params?.priceRange?.max, + min: this.params?.priceRange?.min, + placeholder: direction === from ? minPrice : maxPrice, step: INPUT_PRICE_STEP, type: INPUT_TYPE.NUMBER, - value: direction === FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].FROM ? minPrice : maxPrice, + value: direction === from ? minPrice : maxPrice, }); priceInput.getHTML().classList.add(styles.priceInput, styles[direction]); this.priceInputs.set(direction, priceInput); @@ -202,13 +255,10 @@ class ProductFiltersView { } private createPriceSlider(): noUiSlider.API { - const { max, min } = this.params.priceRange ?? { max: 0, min: 0 }; + const { max, min } = this.params?.priceRange ?? { max: 0, min: 0 }; const SLIDER_START_MIN = min + max / SLIDER_PRICE_OFFSET; const SLIDER_START_MAX = max - max / SLIDER_PRICE_OFFSET; const slider = createBaseElement({ - attributes: { - id: 'slider', - }, cssClasses: [styles.slider], tag: 'div', }); @@ -217,7 +267,7 @@ class ProductFiltersView { behaviour: 'tap', connect: true, keyboardSupport: true, - range: this.params.priceRange ?? { max: 0, min: 0 }, + range: this.params?.priceRange ?? { max: 0, min: 0 }, start: [SLIDER_START_MIN, SLIDER_START_MAX], }); @@ -232,21 +282,21 @@ class ProductFiltersView { const title = createBaseElement({ cssClasses: [styles.priceTitle], - innerContent: FILTER_TITLE[getStore().getState().currentLanguage].PRICE, + innerContent: TITLE[getStore().getState().currentLanguage].PRICE, tag: 'h3', }); observeStore(selectCurrentLanguage, () => { - title.textContent = FILTER_TITLE[getStore().getState().currentLanguage].PRICE; + title.textContent = TITLE[getStore().getState().currentLanguage].PRICE; }); - const from = this.createPriceLabel(FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].FROM); - const to = this.createPriceLabel(FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].TO); + const from = this.createPriceLabel(PRICE_RANGE_LABEL[getStore().getState().currentLanguage].FROM); + const to = this.createPriceLabel(PRICE_RANGE_LABEL[getStore().getState().currentLanguage].TO); priceWrapper.append(title, from.priceLabel, this.priceSlider.target, to.priceLabel); observeStore(selectCurrentLanguage, () => { - from.priceSpan.textContent = FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].FROM; - to.priceSpan.textContent = FILTER_INPUT_RANGE_LABEL[getStore().getState().currentLanguage].TO; + from.priceSpan.textContent = PRICE_RANGE_LABEL[getStore().getState().currentLanguage].FROM; + to.priceSpan.textContent = PRICE_RANGE_LABEL[getStore().getState().currentLanguage].TO; }); return priceWrapper; } @@ -254,7 +304,7 @@ class ProductFiltersView { private createResetFiltersButton(): ButtonModel { this.resetFiltersButton = new ButtonModel({ classes: [styles.resetFiltersButton], - text: FILTER_RESET_BUTTON[getStore().getState().currentLanguage].RESET, + text: BUTTON_TEXT[getStore().getState().currentLanguage].RESET, }); return this.resetFiltersButton; @@ -296,12 +346,12 @@ class ProductFiltersView { list: [styles.sizesList], title: [styles.sizesTitle], }, - FILTER_TITLE[getStore().getState().currentLanguage].SIZE, + TITLE[getStore().getState().currentLanguage].SIZE, ); this.sizesList = filtersList; - this.params.sizes?.forEach((size) => { + this.params?.sizes?.forEach((size) => { const li = createBaseElement({ cssClasses: [styles.sizeItem], tag: 'li', @@ -316,23 +366,65 @@ class ProductFiltersView { this.sizeLinks.length = 0; this.sizesList.innerHTML = ''; this.sizesList.append(filtersListTitle); - filtersListTitle.textContent = FILTER_TITLE[getStore().getState().currentLanguage].SIZE; - this.params.sizes?.forEach((size) => this.sizesList.append(this.createSizeLink(size).getHTML())); + filtersListTitle.textContent = TITLE[getStore().getState().currentLanguage].SIZE; + this.params?.sizes?.forEach((size) => this.sizesList.append(this.createSizeLink(size).getHTML())); }); return this.sizesList; } + private redrawProductsCount(): void { + this.params?.categoriesProductCount?.forEach((categoryCount) => { + const currentSpan = this.categoryCountSpan.find((span) => span.id === categoryCount.category.id) ?? null; + if (currentSpan) { + currentSpan.innerText = `(${categoryCount.count})`; + } + }); + + this.params?.sizes?.forEach((size) => { + const currentSpan = this.sizeCountSpan.find((span) => span.id === size.size) ?? null; + if (currentSpan) { + currentSpan.innerText = `(${size.count})`; + } + }); + } + + private setPriceSliderHandlers(): void { + const fromInput = this.priceInputs.get(PRICE_RANGE_LABEL[getStore().getState().currentLanguage].FROM); + const toInput = this.priceInputs.get(PRICE_RANGE_LABEL[getStore().getState().currentLanguage].TO); + + this.priceSlider.on('update', (values) => { + const [min, max] = values; + fromInput?.setValue(String(min)); + toInput?.setValue(String(max)); + }); + + fromInput + ?.getHTML() + .addEventListener('change', () => this.priceSlider.set([fromInput.getValue(), toInput?.getValue() ?? 0])); + toInput + ?.getHTML() + .addEventListener('change', () => this.priceSlider.set([fromInput?.getValue() ?? 0, toInput.getValue()])); + } + public getCategoryLinks(): LinkModel[] { return this.categoryLinks; } + public getDefaultFilters(): HTMLDivElement { + return this.defaultFilters; + } + public getFiltersResetButton(): ButtonModel { return this.resetFiltersButton; } - public getHTML(): HTMLDivElement { - return this.filters; + public getMetaFilters(): HTMLDivElement { + return this.metaFilters; + } + + public getMetaLinks(): LinkModel[] { + return this.metaLinks; } public getPriceInputs(): Map { @@ -351,14 +443,17 @@ class ProductFiltersView { filterLink.getHTML().classList.toggle(styles.activeLink, toggle); } - public updateParams(params: ProductFiltersParams): void { + public updateParams(params: ProductFiltersParams | null): void { this.params = params; - this.params.categoriesProductCount?.forEach((categoryCount) => { - const currentSpan = this.categoryCountSpan.find((span) => span.id === categoryCount.category.id) ?? null; - if (currentSpan) { - currentSpan.innerText = `(${categoryCount.count})`; - } + this.categoryCountSpan.forEach((span) => { + const currentSpan = span; + currentSpan.innerText = BASE_PRODUCT_COUNT; + }); + this.sizeCountSpan.forEach((span) => { + const currentSpan = span; + currentSpan.innerText = BASE_PRODUCT_COUNT; }); + this.redrawProductsCount(); } } diff --git a/src/features/ProductFilters/view/productFiltersView.module.scss b/src/features/ProductFilters/view/productFiltersView.module.scss index 9f730df1..a1fd1d64 100644 --- a/src/features/ProductFilters/view/productFiltersView.module.scss +++ b/src/features/ProductFilters/view/productFiltersView.module.scss @@ -1,12 +1,79 @@ -.filters { - order: 1; +.defaultFilters { outline: 2px solid var(--noble-white-200); border-radius: var(--medium-br); - width: 20%; + padding-bottom: var(--extra-small-offset); height: max-content; background-color: var(--noble-white-200); } +.metaFilters { + display: flex; + align-items: center; + margin-bottom: var(--extra-small-offset); + outline: 2px solid var(--noble-white-200); + border-radius: var(--medium-br); + background-color: var(--noble-white-200); +} + +.metaLink { + position: relative; + display: flex; + align-items: center; + padding: var(--extra-small-offset) calc(var(--extra-small-offset) / 2); + height: 100%; + font: var(--regular-font); + letter-spacing: 1px; + text-transform: uppercase; + color: var(--noble-gray-800); + transition: + color 0.2s, + background-color 0.2s; + + &::after { + content: ''; + position: absolute; + left: 0; + bottom: -1px; + width: 100%; + height: 2px; + background-color: currentcolor; + opacity: 0; + transform: scaleX(0); + transform-origin: center; + transition: + transform 0.2s, + opacity 0.2s, + background-color 0.2s; + } + + @media (hover: hover) { + &:hover { + color: var(--steam-green-400); + background-color: var(--noble-white-100); + + &::after { + opacity: 1; + transform: scaleX(1); + } + } + } + + &:nth-child(1) { + border-radius: var(--medium-br) 0 0 0; + } + + &.activeLink { + color: var(--steam-green-400); + background-color: var(--noble-white-100); + opacity: 1; + + &::after { + opacity: 1; + transform: scaleX(1); + } + } +} + .categoryList, .sizesList { display: flex; @@ -61,7 +128,8 @@ } } -.sizeLink { +.sizeLink, +.metaLink { &.activeLink { cursor: default; } @@ -120,7 +188,7 @@ padding: calc(var(--small-offset) / 3) var(--small-offset); font: var(--regular-font); letter-spacing: 1px; - color: var(--noble-gray-200); + color: var(--white); background-color: var(--steam-green-800); transition: color 0.2s, diff --git a/src/shared/Input/model/InputModel.ts b/src/shared/Input/model/InputModel.ts index 56cb7984..8f51d555 100644 --- a/src/shared/Input/model/InputModel.ts +++ b/src/shared/Input/model/InputModel.ts @@ -32,6 +32,11 @@ class InputModel { this.view.getHTML().disabled = IS_DISABLED.ENABLED; return this.view.getHTML().disabled; } + + public setValue(value: string): string { + this.view.getHTML().value = value; + return this.view.getHTML().value; + } } export default InputModel; diff --git a/src/shared/Store/observer.ts b/src/shared/Store/observer.ts index 15533c95..ba51d909 100644 --- a/src/shared/Store/observer.ts +++ b/src/shared/Store/observer.ts @@ -1,3 +1,4 @@ +import type { MetaFiltersType } from '../constants/filters.ts'; import type { User } from '../types/user.ts'; import type { State } from './reducer.ts'; @@ -80,4 +81,11 @@ export const selectSelectedFiltersSize = (state: State): null | string => { return null; }; +export const selectSelectedFiltersMetaFilter = (state: State): MetaFiltersType | null => { + if (state.selectedFilters) { + return state.selectedFilters.metaFilter; + } + return null; +}; + export default observeStore; diff --git a/src/shared/constants/buttons.ts b/src/shared/constants/buttons.ts index 367a6870..df51cd02 100644 --- a/src/shared/constants/buttons.ts +++ b/src/shared/constants/buttons.ts @@ -10,12 +10,14 @@ export const BUTTON_TEXT = { LOG_OUT: 'Log out', LOGIN: 'Login', REGISTRATION: 'Register', + RESET: 'Reset', }, ru: { BACK_TO_MAIN: 'Вернуться на главную', LOG_OUT: 'Выйти', LOGIN: 'Войти', REGISTRATION: 'Регистрация', + RESET: 'Сбросить', }, } as const; @@ -24,6 +26,7 @@ export const BUTTON_TEXT_KEYS = { LOG_OUT: 'LOG_OUT', LOGIN: 'LOGIN', REGISTRATION: 'REGISTRATION', + RESET: 'RESET', } as const; export type ButtonTextKeysType = (typeof BUTTON_TEXT_KEYS)[keyof typeof BUTTON_TEXT_KEYS]; diff --git a/src/shared/constants/filters.ts b/src/shared/constants/filters.ts index 80807786..87f300c7 100644 --- a/src/shared/constants/filters.ts +++ b/src/shared/constants/filters.ts @@ -1,4 +1,4 @@ -export const FILTER_TITLE = { +export const TITLE = { en: { CATEGORY: 'Category', PRICE: 'Price', @@ -11,7 +11,7 @@ export const FILTER_TITLE = { }, } as const; -export const FILTER_INPUT_RANGE_LABEL = { +export const PRICE_RANGE_LABEL = { en: { FROM: 'From', TO: 'To', @@ -22,11 +22,29 @@ export const FILTER_INPUT_RANGE_LABEL = { }, } as const; -export const FILTER_RESET_BUTTON = { +export const META_FILTERS = { en: { - RESET: 'Reset', + ALL_PRODUCTS: 'All products', + NEW_ARRIVALS: 'New Arrivals', + SALE: 'Sale', }, ru: { - RESET: 'Сбросить', + ALL_PRODUCTS: 'Все продукты', + NEW_ARRIVALS: 'Новые поступления', + SALE: 'Скидки', }, } as const; + +export const META_FILTERS_KEY = { + ALL_PRODUCTS: 'ALL_PRODUCTS', + NEW_ARRIVALS: 'NEW_ARRIVALS', + SALE: 'SALE', +}; + +export type MetaFiltersType = (typeof META_FILTERS_KEY)[keyof typeof META_FILTERS_KEY]; + +export const META_FILTERS_ID = { + ALL_PRODUCTS: 'all-products', + NEW_ARRIVALS: 'new-arrivals', + SALE: 'sale', +} as const; diff --git a/src/shared/constants/initialState.ts b/src/shared/constants/initialState.ts index 6385433c..b0bf9950 100644 --- a/src/shared/constants/initialState.ts +++ b/src/shared/constants/initialState.ts @@ -13,6 +13,7 @@ const initialState: State = { products: [], selectedFilters: { category: new Set(), + metaFilter: 'All products', price: null, size: null, }, diff --git a/src/shared/constants/product.ts b/src/shared/constants/product.ts index 2ca7b8fb..ebbf1df8 100644 --- a/src/shared/constants/product.ts +++ b/src/shared/constants/product.ts @@ -3,3 +3,12 @@ export const PRODUCT_LIMIT = 9; export const DEFAULT_PAGE = 1; export const MIN_PRICE = 0; export const MAX_PRICE = 1000000; + +export const EMPTY_PRODUCT = { + en: { + EMPTY: 'No products found', + }, + ru: { + EMPTY: 'Ничего не найдено', + }, +} as const; diff --git a/src/shared/img/png/notFound.png b/src/shared/img/png/notFound.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1a07bfdd327b02de03391665ee33bb30826844 GIT binary patch literal 108475 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�Nri${M52JolE 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 + metaFilter: MetaFiltersType; price: { max: number; min: number; diff --git a/src/widgets/Catalog/model/CatalogModel.ts b/src/widgets/Catalog/model/CatalogModel.ts index 2d94e11d..adbd19bd 100644 --- a/src/widgets/Catalog/model/CatalogModel.ts +++ b/src/widgets/Catalog/model/CatalogModel.ts @@ -10,9 +10,11 @@ import getStore from '@/shared/Store/Store.ts'; import observeStore, { observeSetInStore, selectSelectedFiltersCategory, + selectSelectedFiltersMetaFilter, selectSelectedFiltersPrice, selectSelectedFiltersSize, } from '@/shared/Store/observer.ts'; +import { META_FILTERS } from '@/shared/constants/filters.ts'; import { LOADER_SIZE } from '@/shared/constants/sizes.ts'; import showBadRequestMessage from '@/shared/utils/showBadRequestMessage.ts'; @@ -27,6 +29,21 @@ class CatalogModel { this.init(); } + private addCurrentMetaFilter(filter: FilterProduct, metaFilter: string): FilterProduct { + switch (metaFilter) { + case META_FILTERS.ru.ALL_PRODUCTS: + return filter; + case META_FILTERS.en.NEW_ARRIVALS: + filter.addFilter(FilterFields.NEW_ARRIVAL); + return filter; + case META_FILTERS.en.SALE: + filter.addFilter(FilterFields.SALE); + return filter; + default: + return filter; + } + } + private async getProductItems(options: OptionsRequest): Promise { const productList = this.view.getItemsList(); const loader = new LoaderModel(LOADER_SIZE.EXTRA_LARGE); @@ -34,25 +51,19 @@ class CatalogModel { productList.append(loader.getHTML()); try { - const categories = await getProductModel().getCategories(); - try { - const { categoryCount, products, sizeCount } = await getProductModel().getProducts(options); - const priceRange = await getProductModel().getPriceRange(); - return { categories, categoriesProductCount: categoryCount, priceRange, products, sizes: sizeCount }; - } catch { - showBadRequestMessage(); - } + const { categoryCount, products, sizeCount } = await getProductModel().getProducts(options); + const priceRange = await getProductModel().getPriceRange(); + return { categoriesProductCount: categoryCount, priceRange, products, sizes: sizeCount }; } catch { showBadRequestMessage(); } finally { loader.getHTML().remove(); } - return null; } private getSelectedFilters(): OptionsRequest { - const { category, price, size } = getStore().getState().selectedFilters || {}; + const { category, metaFilter, price, size } = getStore().getState().selectedFilters || {}; const filter = new FilterProduct(); category?.forEach((categoryID) => filter.addFilter(FilterFields.CATEGORY, categoryID)); if (price?.max || price?.min) { @@ -62,51 +73,45 @@ class CatalogModel { filter.addFilter(FilterFields.SIZE, size); } - return { filter: filter.getFilter(), limit: 100, sort: { direction: 'desc', field: 'name', locale: 'en' } }; + this.addCurrentMetaFilter(filter, metaFilter ?? META_FILTERS.en.ALL_PRODUCTS); + + return { filter: filter.getFilter(), sort: { direction: 'asc', field: 'name', locale: 'en' } }; } private init(): void { const productList = this.view.getItemsList(); - const { selectedFilters } = getStore().getState(); - this.getProductItems(this.getSelectedFilters()) + // TBD: create method to collect filters from the url + this.getProductItems({}) .then((data) => { - if (!data?.products?.length) { - productList.textContent = 'Ничего не найдено'; - } else { - data.products.forEach((productData) => - productList.append( - new ProductCardModel(productData, selectedFilters ? selectedFilters.size : null).getHTML(), - ), - ); + if (data?.products?.length) { + data.products.forEach((productData) => productList.append(new ProductCardModel(productData, null).getHTML())); } - this.productFilters = new ProductFiltersModel( - data ?? { categories: null, categoriesProductCount: null, priceRange: null, products: null, sizes: null }, - ); - this.getHTML().append(this.productFilters.getHTML()); + this.view.switchEmptyList(!data?.products?.length); + this.productFilters = new ProductFiltersModel(data); + this.view.getLeftWrapper().append(this.productFilters.getDefaultFilters()); + this.view.getRightWrapper().append(this.productFilters.getMetaFilters()); }) .catch(() => showBadRequestMessage()); observeSetInStore(selectSelectedFiltersCategory, () => this.redrawProductList(this.getSelectedFilters())); observeStore(selectSelectedFiltersPrice, () => this.redrawProductList(this.getSelectedFilters())); observeStore(selectSelectedFiltersSize, () => this.redrawProductList(this.getSelectedFilters())); + observeStore(selectSelectedFiltersMetaFilter, () => this.redrawProductList(this.getSelectedFilters())); } private redrawProductList(options?: OptionsRequest): void { + const currentSize = getStore().getState().selectedFilters?.size ?? null; const productList = this.view.getItemsList(); - const { selectedFilters } = getStore().getState(); productList.innerHTML = ''; this.getProductItems(options ?? {}) .then((data) => { if (data?.products?.length) { data?.products?.forEach((productData) => - productList.append( - new ProductCardModel(productData, selectedFilters ? selectedFilters.size : null).getHTML(), - ), + productList.append(new ProductCardModel(productData, currentSize).getHTML()), ); - this.productFilters?.updateParams(data); - } else { - productList.textContent = 'Ничего не найдено'; } + this.view.switchEmptyList(!data?.products?.length); + this.productFilters?.updateParams(data); }) .catch(() => showBadRequestMessage()); } diff --git a/src/widgets/Catalog/view/CatalogView.ts b/src/widgets/Catalog/view/CatalogView.ts index 86397c82..fc9a375e 100644 --- a/src/widgets/Catalog/view/CatalogView.ts +++ b/src/widgets/Catalog/view/CatalogView.ts @@ -1,3 +1,6 @@ +import getStore from '@/shared/Store/Store.ts'; +import observeStore, { selectCurrentLanguage } from '@/shared/Store/observer.ts'; +import { EMPTY_PRODUCT } from '@/shared/constants/product.ts'; import createBaseElement from '@/shared/utils/createBaseElement.ts'; import styles from './catalogView.module.scss'; @@ -7,8 +10,14 @@ class CatalogView { private itemsList: HTMLUListElement; + private leftWrapper: HTMLDivElement; + + private rightWrapper: HTMLDivElement; + constructor() { this.itemsList = this.createItemsList(); + this.leftWrapper = this.createLeftWrapper(); + this.rightWrapper = this.createRightWrapper(); this.catalog = this.createHTML(); } @@ -17,7 +26,7 @@ class CatalogView { cssClasses: [styles.catalog], tag: 'div', }); - this.catalog.append(this.itemsList); + this.catalog.append(this.leftWrapper, this.rightWrapper); return this.catalog; } @@ -26,9 +35,34 @@ class CatalogView { cssClasses: [styles.itemsList], tag: 'ul', }); + observeStore(selectCurrentLanguage, () => { + if (this.itemsList.classList.contains(styles.emptyList)) { + this.itemsList.textContent = EMPTY_PRODUCT[getStore().getState().currentLanguage].EMPTY; + } + }); return this.itemsList; } + private createLeftWrapper(): HTMLDivElement { + this.leftWrapper = createBaseElement({ + cssClasses: [styles.leftWrapper], + tag: 'div', + }); + + return this.leftWrapper; + } + + private createRightWrapper(): HTMLDivElement { + this.rightWrapper = createBaseElement({ + cssClasses: [styles.rightWrapper], + tag: 'div', + }); + + this.rightWrapper.append(this.itemsList); + + return this.rightWrapper; + } + public getHTML(): HTMLDivElement { return this.catalog; } @@ -36,6 +70,21 @@ class CatalogView { public getItemsList(): HTMLUListElement { return this.itemsList; } + + public getLeftWrapper(): HTMLDivElement { + return this.leftWrapper; + } + + public getRightWrapper(): HTMLDivElement { + return this.rightWrapper; + } + + public switchEmptyList(isEmpty: boolean): void { + this.itemsList.classList.toggle(styles.emptyList, isEmpty); + if (isEmpty) { + this.itemsList.textContent = EMPTY_PRODUCT[getStore().getState().currentLanguage].EMPTY; + } + } } export default CatalogView; diff --git a/src/widgets/Catalog/view/catalogView.module.scss b/src/widgets/Catalog/view/catalogView.module.scss index 9bfd5837..ba0032c4 100644 --- a/src/widgets/Catalog/view/catalogView.module.scss +++ b/src/widgets/Catalog/view/catalogView.module.scss @@ -1,11 +1,19 @@ .catalog { position: relative; display: flex; - justify-content: space-between; - min-height: max-content; gap: var(--small-offset); } +.leftWrapper { + width: 30%; +} + +.rightWrapper { + display: flex; + flex-direction: column; + width: 70%; +} + .itemsList { position: relative; display: grid; @@ -13,9 +21,12 @@ justify-content: center; order: 2; grid-template-columns: repeat(3, auto); - width: 80%; height: max-content; min-height: 500px; + font-size: var(--regular-font); + letter-spacing: 1px; + text-align: center; + color: var(--steam-green-500); gap: var(--small-offset); @media (max-width: 768px) { @@ -25,4 +36,15 @@ @media (max-width: 500px) { grid-template-columns: repeat(1, 1fr); } + + &.emptyList { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + background: url('../../../shared/img/png/notFound.png'); + background-position: center 100px; + background-size: 400px; + background-repeat: no-repeat; + } }