diff --git a/packages/venia-concept/src/RootComponents/Category/__tests__/__snapshots__/categoryContent.spec.js.snap b/packages/venia-concept/src/RootComponents/Category/__tests__/__snapshots__/categoryContent.spec.js.snap
index f751c3e0dc..c70e39170a 100644
--- a/packages/venia-concept/src/RootComponents/Category/__tests__/__snapshots__/categoryContent.spec.js.snap
+++ b/packages/venia-concept/src/RootComponents/Category/__tests__/__snapshots__/categoryContent.spec.js.snap
@@ -7,13 +7,6 @@ exports[`renders the correct tree 1`] = `
{
- const { id, pageSize } = props;
+ const { filterClear, id, openDrawer, pageSize } = props;
const [paginationValues, paginationApi] = usePagination();
const { currentPage, totalPages } = paginationValues;
@@ -27,14 +32,23 @@ const Category = props => {
const { runQuery, setLoading } = queryApi;
const classes = mergeClasses(defaultClasses, props.classes);
+ // clear any stale filters
+ useEffect(() => {
+ if (isObjectEmpty(getFilterParams())) {
+ filterClear();
+ }
+ }, []);
+
+ // run the category query
useEffect(() => {
setLoading(true);
runQuery({
variables: {
+ currentPage: Number(currentPage),
id: Number(id),
+ idString: String(id),
onServer: false,
- pageSize: Number(pageSize),
- currentPage: Number(currentPage)
+ pageSize: Number(pageSize)
}
});
@@ -43,36 +57,40 @@ const Category = props => {
top: 0,
behavior: 'smooth'
});
- }, [id, pageSize, currentPage]);
+ }, [currentPage, id, pageSize]);
const totalPagesFromData = data
- ? data.category.products.page_info.total_pages
+ ? data.products.page_info.total_pages
: null;
+
useEffect(() => {
setTotalPages(totalPagesFromData);
}, [totalPagesFromData]);
if (error) return
Data Fetch Error
;
- // show loading indicator until our data has been fetched and pagination state has been updated
+
+ // show loading indicator until data has been fetched
+ // and pagination state has been updated
if (!totalPages) return loadingIndicator;
- // if our data is still loading, we want to reset our data state to null
return (
);
};
Category.propTypes = {
- id: number,
classes: shape({
gallery: string,
root: string,
title: string
}),
+ id: number,
pageSize: number
};
@@ -81,4 +99,12 @@ Category.defaultProps = {
pageSize: 6
};
-export default Category;
+const mapDispatchToProps = dispatch => ({
+ filterClear: () => dispatch(catalogActions.filterOption.clear()),
+ openDrawer: () => dispatch(toggleDrawer('filter'))
+});
+
+export default connect(
+ null,
+ mapDispatchToProps
+)(Category);
diff --git a/packages/venia-concept/src/RootComponents/Category/categoryContent.js b/packages/venia-concept/src/RootComponents/Category/categoryContent.js
index 148d2544a0..3b14b7e92a 100644
--- a/packages/venia-concept/src/RootComponents/Category/categoryContent.js
+++ b/packages/venia-concept/src/RootComponents/Category/categoryContent.js
@@ -1,35 +1,59 @@
import React from 'react';
+import { shape, string } from 'prop-types';
+
import { mergeClasses } from 'src/classify';
+import FilterModal from 'src/components/FilterModal';
import Gallery from 'src/components/Gallery';
import Pagination from 'src/components/Pagination';
import defaultClasses from './category.css';
const CategoryContent = props => {
- const { pageControl, data, pageSize } = props;
+ const { data, openDrawer, pageControl, pageSize } = props;
const classes = mergeClasses(defaultClasses, props.classes);
- const items = data ? data.category.products.items : null;
- const title = data ? data.category.description : null;
- const categoryTitle = data ? data.category.name : null;
+ const filters = data ? data.products.filters : null;
+ const items = data ? data.products.items : null;
+ const title = data ? data.category.name : null;
+
+ const header = filters ? (
+
+
+
+ ) : null;
+
+ const modal = filters ?
: null;
return (
- {/* TODO: Switch to RichContent component from Peregrine when merged */}
-
- {categoryTitle}
+ {title}
+ {header}
+ {modal}
);
};
export default CategoryContent;
+
+CategoryContent.propTypes = {
+ classes: shape({
+ filterContainer: string,
+ gallery: string,
+ headerButtons: string,
+ pagination: string,
+ root: string,
+ title: string
+ })
+};
diff --git a/packages/venia-concept/src/RootComponents/Category/categoryContentContainer.js b/packages/venia-concept/src/RootComponents/Category/categoryContentContainer.js
new file mode 100644
index 0000000000..4f47790988
--- /dev/null
+++ b/packages/venia-concept/src/RootComponents/Category/categoryContentContainer.js
@@ -0,0 +1,12 @@
+import { connect } from 'src/drivers';
+import { toggleDrawer } from 'src/actions/app';
+import CategoryContent from './categoryContent';
+
+const mapDispatchToProps = dispatch => ({
+ openDrawer: () => dispatch(toggleDrawer('filter'))
+});
+
+export default connect(
+ null,
+ mapDispatchToProps
+)(CategoryContent);
diff --git a/packages/venia-concept/src/RootComponents/Search/container.js b/packages/venia-concept/src/RootComponents/Search/container.js
index 15f3545d95..312863239c 100644
--- a/packages/venia-concept/src/RootComponents/Search/container.js
+++ b/packages/venia-concept/src/RootComponents/Search/container.js
@@ -1,6 +1,7 @@
import { connect } from 'src/drivers';
-
+import { toggleDrawer } from 'src/actions/app';
import Search from './search';
+import catalogActions from 'src/actions/catalog';
import { executeSearch, toggleSearch } from 'src/actions/app';
const mapStateToProps = ({ app }) => {
@@ -9,7 +10,13 @@ const mapStateToProps = ({ app }) => {
return { searchOpen };
};
-const mapDispatchToProps = { executeSearch, toggleSearch };
+const mapDispatchToProps = dispatch => ({
+ openDrawer: () => dispatch(toggleDrawer('filter')),
+ filterClear: () => dispatch(catalogActions.filterOption.clear()),
+ executeSearch: (query, history, categoryId) =>
+ dispatch(executeSearch(query, history, categoryId)),
+ toggleSearch: () => dispatch(toggleSearch())
+});
export default connect(
mapStateToProps,
diff --git a/packages/venia-concept/src/RootComponents/Search/search.css b/packages/venia-concept/src/RootComponents/Search/search.css
index 86e0643f53..18544b281d 100644
--- a/packages/venia-concept/src/RootComponents/Search/search.css
+++ b/packages/venia-concept/src/RootComponents/Search/search.css
@@ -4,6 +4,7 @@
.categoryTop {
display: flex;
+ flex-wrap: wrap;
padding: 0 0 1rem 0;
color: rgb(var(--venia-text-alt));
justify-content: center;
@@ -30,3 +31,21 @@
.noResult {
display: flex;
}
+
+.headerButtons {
+ display: flex;
+ justify-content: center;
+ flex-basis: 100%;
+ padding-top: 0.5rem;
+}
+
+.filterButton {
+ padding: 0.5rem;
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+ width: 9rem;
+ border: 1px solid black;
+ border-radius: 100px;
+ color: black;
+ outline: none;
+}
diff --git a/packages/venia-concept/src/RootComponents/Search/search.js b/packages/venia-concept/src/RootComponents/Search/search.js
index c0b42e5305..76f1c032d6 100644
--- a/packages/venia-concept/src/RootComponents/Search/search.js
+++ b/packages/venia-concept/src/RootComponents/Search/search.js
@@ -6,8 +6,11 @@ import gql from 'graphql-tag';
import Gallery from 'src/components/Gallery';
import classify from 'src/classify';
import Icon from 'src/components/Icon';
+import { getFilterParams } from 'src/util/getFilterParamsFromUrl';
import getQueryParameterValue from 'src/util/getQueryParameterValue';
+import isObjectEmpty from 'src/util/isObjectEmpty';
import CloseIcon from 'react-feather/dist/icons/x';
+import FilterModal from 'src/components/FilterModal';
import { loadingIndicator } from 'src/components/LoadingIndicator';
import defaultClasses from './search.css';
import PRODUCT_SEARCH from '../../queries/productSearch.graphql';
@@ -27,6 +30,7 @@ export class Search extends Component {
root: string,
totalPages: string
}),
+ openDrawer: func.isRequired,
executeSearch: func.isRequired,
history: object,
location: object.isRequired,
@@ -37,18 +41,35 @@ export class Search extends Component {
componentDidMount() {
// Ensure that search is open when the user lands on the search page.
- const { location, searchOpen, toggleSearch } = this.props;
+ const { location, searchOpen, toggleSearch, filterClear } = this.props;
const inputText = getQueryParameterValue({
location,
queryParameter: 'query'
});
+ isObjectEmpty(getFilterParams()) && filterClear();
+
if (toggleSearch && !searchOpen && inputText) {
toggleSearch();
}
}
+ componentDidUpdate(prevProps) {
+ const queryPrev = getQueryParameterValue({
+ location: prevProps.location,
+ queryParameter: 'query'
+ });
+
+ const queryCurrent = getQueryParameterValue({
+ location: this.props.location,
+ queryParameter: 'query'
+ });
+ if (queryPrev !== queryCurrent) {
+ this.props.filterClear();
+ }
+ }
+
getCategoryName = (categoryId, classes) => (