Hide filter on selected list of collections
Components
- components/Facet/view.tsx
- components/search/DesktopFacets/view.tsx
- layouts/Search/view.tsx
- components/search/MobileFacets/Titles.tsx
- components/search/MobileFacets/view.tsx
To get the current collection handle use this lines of code - const enhancer = withProps(() => ({ collectionHandle: document.URL.split("collections/") }));
To create list of collections, where you want to hide some filter's use this lines of code const CollectionArray = ['baseball','gloves'];
- this code create a list of collections, where you want to hide some filter's
Add to components/Facet/view display-if={ !(isCollection && CollectionArray.find(i => collectionHandle[1].indexOf(i) > -1) && title === 'Color') }
/**
* @module components/Facet
*/
import React from 'react';
import Button from 'components/Button';
import Text from 'components/Text';
import Icon from 'components/Icon';
import Component from 'components/Facet/Component';
import { ThemedSFCProps, IFacet, MJSConfiguration } from 'types';
import { List, Map } from 'immutable';
/** Props that Facet view accepts */
export interface IFacetProps extends ThemedSFCProps {
/** Facet component to render */
FacetComponent: React.Component<any>;
/** Flag to show open / closed state of facet */
isOpen?: boolean;
/** Flag to show if facet is opened on mobile */
isMobile?: boolean;
/** Title of facet */
title: string;
/** Facet object */
item: IFacet;
/** MJS Configuration */
config: MJSConfiguration;
/** Filters selected in facet */
filtersSelected: number;
isCollection: boolean;
meta: Map<string, MJSValue>;
/** Function to toggle open / closed state of facet */
toggleFacet: () => any
}
const enhancer = withProps(() => ({
collectionHandle: document.URL.split("collections/")
})); /** get collection name */
const CollectionArray = ['baseball','gloves']; /** List of collections */
const FacetView = ({
FacetComponent,
isOpen,
theme,
title,
item,
config,
filtersSelected,
isCollection,
toggleFacet,
meta
}: IFacetProps) => (
<div display-if={ !(isCollection && CollectionArray.find(i => collectionHandle[1].indexOf(i) > -1) && title === 'Color') } className={theme.root}> /** Paste here display-if to hide filter from collection */
<Button className={theme.title} onClick={toggleFacet}>
<Text primary uppercase className={theme.text}>{ title } {filtersSelected > 0 ? `(${filtersSelected})` : ''}</Text>
<Icon name={isOpen ? 'Minus' : 'Plus'} className={theme.icon} />
</Button>
<Component
display-if={isOpen}
facet={item}
config={config}
theme={{ root: theme.body }}
isMobile={true} />
</div>
)
export default FacetView;
Then you should push forward isCollection
in DesktopFacets/view.tsx and Search/view.tsx
/**
* @module components/search/DesktopFacets
*/
import React from 'react';
import Branch from 'components/common/Branch';
import MapArray from 'components/common/MapArray';
import Facet from 'components/Facet';
import Sticky from 'components/common/Sticky';
import Text from 'components/Text';
import Button from 'components/Button';
import Icon from 'components/Icon';
import { classNames } from 'classnames';
import * as titles from 'components/search/DesktopFacets/Title';
import { MJSConfiguration, ThemedSFCProps, IFacet, MJSValue } from 'types';
import { List, Map } from 'immutable';
const DefaultContent = ({ theme, children, config }) =>
<div className={theme.root}>{children}</div>
/** Props that DesktopFacets view accepts */
export interface IDesktopFacetsProps extends ThemedSFCProps {
/** MJS Configuration */
config: MJSConfiguration;
/** Facets list */
facets: List<IFacet>;
/** Method called to reset facets */
onReset: () => any;
/** MJS API Response Metadata */
meta: Map<string, MJSValue>;
/** Method to hide facets */
hideFacets: () => any;
/** Shows visibility status of facets */
visible: boolean;
}
const DesktopFacetsView: React.SFC<IDesktopFacetsProps> = ({
config,
facets, theme, onReset, meta, hideFacets, visible, isCollection }: IDesktopFacetsProps) =>
<Branch
display-if={!config.get('hidableFacets') || visible}
theme={theme}
condition={config.getIn(['view', 'stickyFilters'])}
left={Sticky}
right={DefaultContent}>
<Branch
display-if={!config.get('showFacetsTitle')}
meta={meta}
config={config}
theme={theme}
onReset={onReset}
onHide={hideFacets}
condition={config.get('hidableFacets')}
left={titles.hidable}
right={titles.default}
/>
<MapArray
theme={{ root: theme.facet }}
array={facets}
factory={Facet}
config={config}
isCollection={isCollection}/** Paste here isCollection props */
meta={meta}
keyAccessor={i => i.get('name')} />
</Branch>
export default DesktopFacetsView;
/**
* @module layouts/Search
*/
import cx from 'classnames'
import React from 'react';
import Grid from 'components/common/Grid';
import StaticResults from 'components/search/StaticResults';
import LazyResults from 'components/search/LazyResults';
import DesktopFacets from 'components/search/DesktopFacets';
import MobileActions from 'components/search/MobileActions';
import DesktopActions from 'components/search/DesktopActions';
import Branch from 'components/common/Branch';
import Banner from 'components/Banner';
import { List } from 'immutable'
import { MJSConfiguration, ThemedSFCProps, IProduct } from 'types';
/** Props that search layout accepts */
export interface ISearchProps extends ThemedSFCProps {
/** MJS Configuration */
config: MJSConfiguration;
/** Flag that switches Search to mobile layout */
isMobile?: boolean;
/** Flag to turn on Smart Collection display mode */
isCollection?: boolean;
/** Flag to render mobile facets */
mobileFacetsOpened?: boolean;
/** Flag to show filters on the right side of desktop search */
filtersOnRight?: boolean;
/** Items list */
items: List<IProduct>;
}
const SearchLayout = ({ config, meta, isMobile, isCollection, mobileFacetsOpened, filtersOnRight, theme, items }) =>
<div className={theme.root}>
<DesktopFacets isCollection={isCollection} display-if={!isMobile && !filtersOnRight} />
<div className={theme.content}>
<Branch
isCollection={isCollection}
condition={isMobile}
left={MobileActions}
right={DesktopActions} />
<Banner />
<Branch left={LazyResults} right={StaticResults} condition={config.getIn(['view', 'infinite'])} />
</div>
<DesktopFacets isCollection={isCollection} meta={meta} display-if={!isMobile && filtersOnRight} />
</div>
export default SearchLayout;
For mobile version you should add this code display-if={ !(isCollection && CollectionArray.find(i => collectionHandle[1].indexOf(i) > -1) && config.getIn(['facets', 'labels', item.get('name')], item.get('name')) === 'Color') }
to components/search/MobileFacets/Titles.tsx to Button
To get the current collection handle use this lines of code - const enhancer = withProps(() => ({ collectionHandle: document.URL.split("collections/") }));
To create list of collections, where you want to hide some filter's use this lines of code const CollectionArray = ['baseball','gloves'];
- this code create a list of collections, where you want to hide some filter's
/**
* @module components/search/MobileFacets
*/
import React from 'react';
import { withHandlers, withPropsOnChange, compose, withProps } from 'recompose';
import MapArray from 'components/common/MapArray';
import Button from 'components/Button';
import Text from 'components/Text';
import { ThemedSFCProps, IFacet, MJSConfiguration } from 'types';
import { List } from 'immutable';
const withClickHandler = withHandlers({
onClick: ({ selectFacet, item }) => () => selectFacet(item.get('name'))
});
/** Props that MobileFacets FacetLabel accepts */
export interface IMobileFacetsLabelProps extends ThemedSFCProps {
/** Facet */
item: IFacet;
/** Count of filters enabled */
filterCount?: number;
/** MJS Configuration */
config: MJSConfiguration;
/** Click handler to open facet customization menu */
onClick: (evt?: React.MouseEvent<any>) => any
}
/** TODO: Not sure this is really needed, but find a way to show selected filters count,
* when filters are overflowing, which is not hacky
*/
const enhancer = withProps(() => ({
collectionHandle: document.URL.split("collections/")
})); /** get collection name */
const CollectionArray = ['baseball','gloves']; /** List of collections */
const FacetLabel = compose(
withClickHandler,
enhancer,
withPropsOnChange(['item'], ({ item }) => ({
isTextFacet: item && ['category', 'text'].includes(item.get('type')),
selectedValues: item && item.get('values').filter(item => item.get('selected')) || List(),
}))
)(({ item, isTextFacet, isCollection, meta, theme, onClick, selectedValues, config, collectionHandle }: any) =>
<Button
display-if={ !(isCollection && CollectionArray.find(i => collectionHandle[1].indexOf(i) > -1) && config.getIn(['facets', 'labels', item.get('name')], item.get('name')) === 'Color') }
raw className={theme.facetTitle} onClick={onClick}>
<div className={theme.flexFix}>
<Text primary uppercase inlineBlock>
{ config.getIn(['facets', 'labels', item.get('name')], item.get('name')) }
</Text>
<Text
display-if={isTextFacet}
secondary
inlineBlock
className={theme.selectedValues}>
{selectedValues.map(item => item.get('value')).join(', ')}
</Text>
<Text
display-if={selectedValues.size > 0 && !isTextFacet}
className={theme.filterCount}
secondary
uppercase
inlineBlock>
({ selectedValues.size })
</Text>
</div>
</Button>
)
/** Props that MobileFacets TitlesView accepts */
export interface IMobileFacetsTitlesProps extends ThemedSFCProps {
/** immutable.List of facets */
facets: List<IFacet>;
/** Method to select facet by its name */
selectFacet: (name: string) => any;
/** MJS Configuration */
config: MJSConfiguration;
}
const MobileFacetsTitlesView = ({ theme, facets, selectFacet, config, meta, isCollection }: IMobileFacetsTitlesProps) =>
<MapArray
config={config}
theme={theme}
selectFacet={selectFacet}
factory={FacetLabel}
isCollection={isCollection}
meta={meta}
array={facets} />
export default enhancer(MobileFacetsTitlesView);
And push forward isCollection
to components/search/MobileFacets/view.tsx
/**
* @module components/search/MobileFacets
*/
import React from 'react';
import { withHandlers, withPropsOnChange, compose } from 'recompose';
import Branch from 'components/common/Branch';
import MapArray from 'components/common/MapArray';
import FacetTitles from 'components/search/MobileFacets/Titles';
import Component from 'components/Facet/Component';
import Button from 'components/Button';
import Facet from 'components/Facet';
import cx from 'classnames';
import Icon from 'components/Icon';
import Text from 'components/Text';
import { ThemedSFCProps, IFacet, MJSConfiguration, MJSValue } from 'types';
import { List } from 'immutable';
/** Props that FacetContent accepts */
export interface IFacetContentProps extends ThemedSFCProps {
/** Currently active facet */
active: IFacet;
/** MJS Configuration */
config: MJSConfiguration;
}
const FacetContent = ({ active, config, theme,isCollection, meta }: IFacetContentProps) => (
<div className={cx(theme.container, theme[active.get('type') as string])}>
<Component
isExpanded
type={active.get('type')}
facet={active}
config={config}
meta={meta}/** Paste here meta props */
isCollection={isCollection}/** Paste here isCollection props */
theme={{
range: theme.range,
expand: theme.expand,
expandedList: theme.expandedList,
}}
isMobile={true}
/>
</div>
);
/** Props that MobileFacets view accepts */
export interface IMobileFacetsProps extends ThemedSFCProps {
/** immutable.List() of Facets */
facets: List<IFacet>;
/** Currently active facet */
activeFacet?: IFacet;
/** Method used to select a facet */
selectFacet: (name?: string) => any
/** Method used to reset facet */
onReset: () => any
/** MJS Configuration */
config: MJSConfiguration;
/** MJS API Request Metadata */
meta: Map<string, MJSValue>;
/** Method used for hiding modal / drawer */
hideModal: (name: string) => any
/** Total filters selected */
total: number;
/** Filters selected for active facet */
filtersSelected: number;
}
export default ({
theme,
facets,
activeFacet,
selectFacet,
onReset,
config,
meta,
hideModal,
total,
filtersSelected,
isCollection,
title,
}: IMobileFacetsProps) =>
<div className={cx(theme.modal, 'mobile')}>
<div className={theme.header}>
<div className={theme.title}>
<Text primary uppercase display-if={!activeFacet}>
{ config.getIn(['facets', 'i18n', 'filters'], 'Filters') }
</Text>
<Text secondary uppercase display-if={!activeFacet && total} className={theme.filterCount}>
({ total })
</Text>
<Text primary uppercase display-if={!!activeFacet}>
{ config.getIn(['facets', 'labels', activeFacet!.get('name')]) }
</Text>
<Text secondary uppercase display-if={!!activeFacet && filtersSelected} className={theme.filterCount}>
({ filtersSelected })
</Text>
</div>
<Button onClick={activeFacet ? selectFacet : hideModal} className={theme.backButton} >
<Icon name='ArrowBack' />
</Button>
<Button
display-if={meta.get('filters') && meta!.get('filters')!.size}
onClick={onReset}>
<Text secondary uppercase>
{ config.getIn(['facets', 'i18n', 'clearAll'], 'Clear All')}
</Text>
</Button>
</div>
<div className={theme.body}>
<Branch
config={config}
theme={theme}
meta={meta}
selectFacet={selectFacet}
isCollection={isCollection}/** Paste here isCollection props */
active={activeFacet}
facets={facets}
condition={!!activeFacet}
right={FacetTitles}
left={FacetContent} />
</div>
<Button className={theme.footer} onClick={activeFacet ? selectFacet : hideModal}>
{ config.getIn(['facets', 'i18n', activeFacet ? 'done' : 'showResults'], 'See results')}
</Button>
</div>
Updated almost 6 years ago