Skip to content

Commit 4643622

Browse files
committed
First pass at sort
1 parent 18efcf8 commit 4643622

File tree

7 files changed

+388
-414
lines changed

7 files changed

+388
-414
lines changed

src/app-search/AppSearchDriver.js

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default class AppSearchDriver {
1111
results: [],
1212
size: 0,
1313
searchTerm: "",
14+
sort: {},
1415
totalResults: 0
1516
};
1617

@@ -42,28 +43,39 @@ export default class AppSearchDriver {
4243
}
4344

4445
addFilter = (name, value) => {
45-
const { filters, searchTerm } = this.state;
46-
this.updateSearchResults(searchTerm, 1, [...filters, { [name]: value }]);
46+
const { filters, searchTerm, sort } = this.state;
47+
this.updateSearchResults(
48+
searchTerm,
49+
1,
50+
[...filters, { [name]: value }],
51+
sort
52+
);
4753
};
4854

4955
removeFilter = (name, value) => {
50-
const { filters, searchTerm } = this.state;
56+
const { filters, searchTerm, sort } = this.state;
5157
const updatedFilters = filters.filter(filter => !(filter[name] === value));
52-
this.updateSearchResults(searchTerm, 1, updatedFilters);
58+
this.updateSearchResults(searchTerm, 1, updatedFilters, sort);
5359
};
5460

5561
setSearchTerm = searchTerm => {
56-
this.updateSearchResults(searchTerm, 1, []);
62+
const { sort } = this.state;
63+
this.updateSearchResults(searchTerm, 1, [], sort);
5764
};
5865

59-
updatePage = current => {
66+
setSort = sort => {
6067
const { filters, searchTerm } = this.state;
68+
this.updateSearchResults(searchTerm, 1, filters, sort);
69+
};
6170

62-
this.updateSearchResults(searchTerm, current, filters);
71+
updatePage = current => {
72+
const { filters, searchTerm, sort } = this.state;
73+
74+
this.updateSearchResults(searchTerm, current, filters, sort);
6375
};
6476

65-
updateSearchResults = (searchTerm, current, filters) => {
66-
let searchOptions = {
77+
updateSearchResults = (searchTerm, current, filters, sort) => {
78+
const searchOptions = {
6779
...this.searchOptions,
6880
page: {
6981
size: 10,
@@ -74,6 +86,10 @@ export default class AppSearchDriver {
7486
}
7587
};
7688

89+
if (Object.keys(sort).length > 0) {
90+
searchOptions.sort = sort;
91+
}
92+
7793
return this.client.search(searchTerm, searchOptions).then(resultList => {
7894
this.setState({
7995
current: resultList.info.meta.page.current,
@@ -82,6 +98,7 @@ export default class AppSearchDriver {
8298
results: resultList.results,
8399
size: resultList.info.meta.page.size,
84100
searchTerm: searchTerm,
101+
sort: sort,
85102
totalResults: resultList.info.meta.page.total_results
86103
});
87104
});

src/app-search/AppSearchProvider.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class AppSearchProvider extends Component {
2424
results,
2525
size,
2626
searchTerm,
27+
sort,
2728
totalResults
2829
} = this.state;
2930

@@ -34,10 +35,12 @@ class AppSearchProvider extends Component {
3435
results: results,
3536
size: size,
3637
searchTerm: searchTerm,
38+
sort: sort,
3739
totalResults: totalResults,
3840
addFilter: driver.addFilter,
3941
removeFilter: driver.removeFilter,
4042
setSearchTerm: driver.setSearchTerm,
43+
setSort: driver.setSort,
4144
updatePage: driver.updatePage
4245
};
4346

src/components/Body.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Facets from "../containers/Facets";
44
import Meta from "../containers/Meta";
55
import Paging from "../containers/Paging";
66
import Results from "../containers/Results";
7+
import Sort from "../containers/Sort";
78

89
export default function Body() {
910
return (
@@ -13,6 +14,7 @@ export default function Body() {
1314
<div className="results">
1415
<div className="results__header">
1516
<Meta />
17+
<Sort />
1618
</div>
1719
<div className="results__body">
1820
<Results />

src/components/Meta.js

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,12 @@ import React from "react";
33

44
function Meta({ end, searchTerm, start, totalResults }) {
55
return (
6-
<div className="results__header">
7-
<div className="results__result-count">
8-
Showing{" "}
9-
<strong>
10-
{start} - {end}
11-
</strong>{" "}
12-
of <strong>{totalResults}</strong>
13-
</div>
14-
<div className="results__powered-by powered-by">
15-
<span>Results for: </span>
16-
<span>{searchTerm}</span>
17-
</div>
6+
<div className="results__result-count">
7+
Showing{" "}
8+
<strong>
9+
{start} - {end}
10+
</strong>{" "}
11+
of <strong>{totalResults}</strong> for <strong>{searchTerm}</strong>
1812
</div>
1913
);
2014
}

src/components/Sort.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import PropTypes from "prop-types";
2+
import React from "react";
3+
4+
function Sort({ onChange, options, value }) {
5+
return (
6+
<div className="sort">
7+
<select name="sort" value={value} onChange={onChange}>
8+
<option value="">None</option>
9+
{options.map(option => (
10+
<option value={option.value}>{option.name}</option>
11+
))}
12+
</select>
13+
</div>
14+
);
15+
}
16+
17+
Sort.propTypes = {
18+
onChange: PropTypes.func.isRequired,
19+
options: PropTypes.arrayOf(
20+
PropTypes.shape({ name: PropTypes.string, value: PropTypes.string })
21+
).isRequired,
22+
value: PropTypes.string
23+
};
24+
25+
export default Sort;

src/containers/Sort.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import PropTypes from "prop-types";
2+
import React, { Component } from "react";
3+
4+
import withAppSearch from "../app-search/withAppSearch";
5+
import Sort from "../components/Sort";
6+
7+
function serialize(sortObject) {
8+
const keys = Object.keys(sortObject);
9+
if (keys.length === 0) return "";
10+
return `${[keys[0]]}|||${sortObject[[keys[0]]]}`;
11+
}
12+
13+
function deSerialize(sortString) {
14+
if (!sortString) return {};
15+
const [sortBy, sortDirection] = sortString.split("|||");
16+
return {
17+
[sortBy]: sortDirection
18+
};
19+
}
20+
21+
class SortContainer extends Component {
22+
static propTypes = {
23+
setSort: PropTypes.func.isRequired
24+
};
25+
26+
render() {
27+
const { setSort, sort } = this.props;
28+
29+
return (
30+
<Sort
31+
onChange={e => {
32+
setSort(deSerialize(e.currentTarget.value));
33+
}}
34+
options={[
35+
{ name: "Name ASC", value: "name|||asc" },
36+
{ name: "Name DESC", value: "name|||desc" },
37+
{ name: "License ASC", value: "license|||asc" },
38+
{ name: "License DESC", value: "license|||desc" }
39+
]}
40+
value={serialize(sort)}
41+
/>
42+
);
43+
}
44+
}
45+
46+
export default withAppSearch(SortContainer);

0 commit comments

Comments
 (0)