Skip to content

Commit 1256ea8

Browse files
committed
feat(hierarchical-menu): Add CSS classes dependent on the depth
Hierarchical lists will have classes like `ais-hierarchical-menu--list__lvl1`. Updated docs and test
1 parent c8d1a5f commit 1256ea8

File tree

5 files changed

+87
-4
lines changed

5 files changed

+87
-4
lines changed

README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,7 @@ search.addWidget(
10311031
<div class="ais-hierarchical-menu">
10321032
<div class="ais-hierarchical-menu--header ais-header">[custom header template]</div>
10331033
<div class="ais-hierarchical-menu--body">
1034-
<div class="ais-hierarchical-menu--list">
1034+
<div class="ais-hierarchical-menu--list ais-hierarchical-menu--list__lvl0">
10351035
<div class="ais-hierarchical-menu--item">
10361036
<a class="ais-hierarchical-menu--link" href="/url">
10371037
Your value
@@ -1043,7 +1043,7 @@ search.addWidget(
10431043
Your active value
10441044
<span class="ais-hierarchical-menu--count">42</span>
10451045
</a>
1046-
<div class="ais-hierarchical-menu--list">
1046+
<div class="ais-hierarchical-menu--list ais-hierarchical-menu--list__lvl1">
10471047
<div class="ais-hierarchical-menu--item">
10481048
<a class="ais-hierarchical-menu--link" href="/url">
10491049
Your subvalue 1
@@ -1073,6 +1073,10 @@ search.addWidget(
10731073
}
10741074
.ais-hierarchical-menu--list {
10751075
}
1076+
.ais-hierarchical-menu--list__lvl0 {
1077+
}
1078+
.ais-hierarchical-menu--list__lvl1 {
1079+
}
10761080
.ais-hierarchical-menu--item {
10771081
}
10781082
.ais-hierarchical-menu--item__active {

components/RefinementList/RefinementList.js

+16-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,15 @@ class RefinementList extends React.Component {
1313
}
1414

1515
_generateFacetItem(facetValue) {
16+
var subList;
1617
var hasChildren = facetValue.data && facetValue.data.length > 0;
17-
var subList = hasChildren && <RefinementList {...this.props} facetValues={facetValue.data} />;
18+
if (hasChildren) {
19+
subList = <RefinementList
20+
{...this.props}
21+
depth={this.props.depth + 1}
22+
facetValues={facetValue.data}
23+
/>;
24+
}
1825
var data = facetValue;
1926

2027
if (this.props.createURL) {
@@ -87,8 +94,14 @@ class RefinementList extends React.Component {
8794
}
8895

8996
render() {
97+
// Adding `-lvl0` classes
98+
var cssClassList = [this.props.cssClasses.list];
99+
if (this.props.cssClasses.depth) {
100+
cssClassList.push(`${this.props.cssClasses.depth}${this.props.depth}`);
101+
}
102+
90103
return (
91-
<div className={cx(this.props.cssClasses.list)}>
104+
<div className={cx(cssClassList)}>
92105
{this.props.facetValues.map(this._generateFacetItem, this)}
93106
</div>
94107
);
@@ -116,6 +129,7 @@ RefinementList.propTypes = {
116129

117130
RefinementList.defaultProps = {
118131
cssClasses: {},
132+
depth: 0,
119133
facetNameKey: 'name'
120134
};
121135

components/RefinementList/__tests__/RefinementList-test.js

+60
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,66 @@ describe('RefinementList', () => {
5454
);
5555
});
5656

57+
context('sublist', () => {
58+
it('uses autoHide() and headerFooter()', () => {
59+
var customProps = {
60+
cssClasses: {
61+
depth: 'depth',
62+
item: 'item',
63+
list: 'list'
64+
},
65+
facetValues: [
66+
{
67+
name: 'facet1',
68+
data: [
69+
{name: 'subfacet1'},
70+
{name: 'subfacet2'}
71+
]
72+
}
73+
]
74+
};
75+
parentListProps = {
76+
className: 'list depth0'
77+
};
78+
itemProps = {
79+
className: 'item',
80+
onClick: () => {}
81+
};
82+
templateProps = {
83+
templateKey: 'item',
84+
data: {
85+
cssClasses: {
86+
depth: 'depth',
87+
list: 'list',
88+
item: 'item'
89+
}
90+
}
91+
};
92+
var out = render(customProps);
93+
expect(out).toEqualJSX(
94+
<div {...parentListProps}>
95+
<div {...itemProps}>
96+
<Template
97+
{...templateProps}
98+
data={{
99+
...templateProps.data,
100+
name: 'facet1',
101+
data: customProps.facetValues[0].data
102+
}}
103+
/>
104+
<RefinementList
105+
{...templateProps.data}
106+
depth={1}
107+
facetNameKey="name"
108+
facetValues={customProps.facetValues[0].data}
109+
templateProps={{}}
110+
/>
111+
</div>
112+
</div>
113+
);
114+
});
115+
});
116+
57117
function render(extraProps = {}) {
58118
var props = getProps(extraProps);
59119
renderer.render(<RefinementList {...props} templateProps={{}} />);

themes/default.css

+4
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@
144144
}
145145
.ais-hierarchical-menu--list {
146146
}
147+
.ais-hierarchical-menu--list__lvl0 {
148+
}
149+
.ais-hierarchical-menu--list__lvl1 {
150+
}
147151
.ais-hierarchical-menu--item {
148152
}
149153
.ais-hierarchical-menu--item__active {

widgets/hierarchical-menu/hierarchical-menu.js

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ function hierarchicalMenu({
8282
body: cx(bem('body'), cssClasses.body),
8383
footer: cx(bem('footer'), cssClasses.footer),
8484
list: cx(bem('list'), cssClasses.list),
85+
depth: bem('list', 'lvl'),
8586
item: cx(bem('item'), cssClasses.item),
8687
active: cx(bem('item', 'active'), cssClasses.active),
8788
link: cx(bem('link'), cssClasses.link),

0 commit comments

Comments
 (0)