Skip to content

Commit 9e9d438

Browse files
committed
feat(headerFooter): Add BEM classes to header and footer
All headers and footers will now receive a `ais-header` and `ais-footer` class. Additional classes can also be added through `cssClasses.{root,header,body,footer}`. It means that it is no longer necessary to pass a full HTML div in the `templates.header`. One can simply pass the header text content and pass a `cssClasses.header` custom class. So far only the `refinementList` widgets correctly add the `ais-widgetname-header`/`ais-widgetname-footer` classes. I'll update the other widgets once this gets merged. Fixes #259 Relies on #264 being merged first
1 parent 85b573d commit 9e9d438

File tree

4 files changed

+59
-30
lines changed

4 files changed

+59
-30
lines changed

README.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -593,19 +593,25 @@ search.addWidget(
593593
#### Styling
594594

595595
```html
596-
<div class="ais-refinement-list--list">
597-
<div class="ais-refinement-list--item">
598-
<label class="ais-refinement-list--label">
599-
<input type="checkbox" class="ais-refinement-list--checkbox" value="your_value"> Your value
600-
<span class="ais-refinement-list--count">42</span>
601-
</label>
602-
</div>
603-
<div class="ais-refinement-list--item ais-refinement-list--item__active">
604-
<label class="ais-refinement-list--label">
605-
<input type="checkbox" class="ais-refinement-list--checkbox" value="your_selected_value" checked="checked"> Your selected value
606-
<span class="ais-refinement-list--count">42</span>
607-
</label>
596+
<div class="ais-refinement-list">
597+
<div class="ais-refinement-list--header ais-header">[custom header template]</div>
598+
<div class="ais-refinement-list--body">
599+
<div class="ais-refinement-list--list">
600+
<div class="ais-refinement-list--item">
601+
<label class="ais-refinement-list--label">
602+
<input type="checkbox" class="ais-refinement-list--checkbox" value="your_value"> Your value
603+
<span class="ais-refinement-list--count">42</span>
604+
</label>
605+
</div>
606+
<div class="ais-refinement-list--item ais-refinement-list--item__active">
607+
<label class="ais-refinement-list--label">
608+
<input type="checkbox" class="ais-refinement-list--checkbox" value="your_selected_value" checked="checked"> Your selected value
609+
<span class="ais-refinement-list--count">42</span>
610+
</label>
611+
</div>
612+
</div>
608613
</div>
614+
<div class="ais-refinement-list--footer ais-footer">[custom footer template]</div>
609615
</div>
610616
```
611617

decorators/headerFooter.js

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var React = require('react');
22

3-
var cx = require('classnames');
3+
var cx = require('classnames/dedupe');
44

55
var Template = require('../components/Template');
66

@@ -10,30 +10,41 @@ function headerFooter(ComposedComponent) {
1010
// override potential widget's defined transformData,
1111
// header and footer currently do not have it
1212
var transformData = null;
13+
var templateProps = this.props.templateProps;
14+
var classNames = {
15+
root: this.props.cssClasses.root,
16+
header: cx(this.props.cssClasses.header, 'ais-header'),
17+
body: this.props.cssClasses.body,
18+
footer: cx(this.props.cssClasses.footer, 'ais-footer')
19+
};
1320

1421
return (
15-
<div className={cx(this.props.cssClasses.root)}>
16-
<Template templateKey="header" {...this.props.templateProps} transformData={transformData} />
17-
<ComposedComponent {...this.props} />
18-
<Template templateKey="footer" {...this.props.templateProps} transformData={transformData} />
22+
<div className={classNames.root}>
23+
<div className={classNames.header}>
24+
<Template templateKey="header" {...templateProps} transformData={transformData} />
25+
</div>
26+
<div className={classNames.body}>
27+
<ComposedComponent {...this.props} />
28+
</div>
29+
<div className={classNames.footer}>
30+
<Template templateKey="footer" {...templateProps} transformData={transformData} />
31+
</div>
1932
</div>
2033
);
2134
}
2235
}
2336

2437
HeaderFooter.propTypes = {
2538
cssClasses: React.PropTypes.shape({
26-
root: React.PropTypes.oneOfType([
27-
React.PropTypes.string,
28-
React.PropTypes.arrayOf(React.PropTypes.string)
29-
])
39+
root: React.PropTypes.string,
40+
header: React.PropTypes.string,
41+
body: React.PropTypes.string,
42+
footer: React.PropTypes.string
3043
})
3144
};
3245

3346
HeaderFooter.defaultProps = {
34-
cssClasses: {
35-
root: null
36-
}
47+
cssClasses: {}
3748
};
3849

3950
// precise displayName for ease of debugging (react dev tool, react warnings)

example/app.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,13 @@ search.addWidget(
7070
operator: 'or',
7171
limit: 10,
7272
cssClasses: {
73+
header: 'panel-heading',
7374
list: 'nav nav-stacked panel-body',
7475
item: 'checkbox',
7576
count: 'badge pull-right'
7677
},
7778
templates: {
78-
header: '<div class="panel-heading">Brands</div>'
79+
header: 'Brands'
7980
}
8081
})
8182
);
@@ -87,10 +88,11 @@ search.addWidget(
8788
operator: 'and',
8889
limit: 10,
8990
cssClasses: {
91+
header: 'panel-heading',
9092
root: 'list-group'
9193
},
9294
templates: {
93-
header: '<div class="panel-heading">Price ranges</div>',
95+
header: 'Price ranges',
9496
item: require('./templates/and.html')
9597
},
9698
transformData: function(data) {
@@ -105,8 +107,11 @@ search.addWidget(
105107
container: '#free-shipping',
106108
facetName: 'free_shipping',
107109
label: 'Free Shipping',
110+
cssClasses: {
111+
header: 'panel-heading'
112+
},
108113
templates: {
109-
header: '<div class="panel-heading">Shipping</div>',
114+
header: 'Shipping',
110115
body: require('./templates/free-shipping.html')
111116
}
112117
})
@@ -118,10 +123,11 @@ search.addWidget(
118123
facetName: 'categories',
119124
limit: 10,
120125
cssClasses: {
126+
header: 'panel-heading',
121127
root: 'list-group'
122128
},
123129
templates: {
124-
header: '<div class="panel-heading">Categories</div>',
130+
header: 'Categories',
125131
item: require('./templates/category.html')
126132
}
127133
})
@@ -132,10 +138,11 @@ search.addWidget(
132138
container: '#price',
133139
facetName: 'price',
134140
cssClasses: {
141+
header: 'panel-heading',
135142
body: 'panel-body'
136143
},
137144
templates: {
138-
header: '<div class="panel-heading">Price</div>'
145+
header: 'Price'
139146
},
140147
tooltips: {
141148
format: function(formattedValue) {
@@ -151,10 +158,11 @@ search.addWidget(
151158
attributes: ['hierarchicalCategories.lvl0', 'hierarchicalCategories.lvl1', 'hierarchicalCategories.lvl2'],
152159
cssClasses: {
153160
root: 'list-group',
161+
header: 'panel-heading',
154162
list: 'hierarchical-categories-list'
155163
},
156164
templates: {
157-
header: '<div class="panel-heading">Hierarchical categories</div>',
165+
header: 'Hierarchical categories',
158166
item: require('./templates/category.html')
159167
}
160168
})

widgets/refinement-list/refinement-list.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ function refinementList({
8787
var facetValues = results.getFacetValues(facetName, {sortBy: sortBy}).slice(0, limit);
8888

8989
cssClasses = {
90+
root: cx(bem(null), cssClasses.root),
91+
header: cx(bem('header'), cssClasses.header),
92+
body: cx(bem('body'), cssClasses.body),
93+
footer: cx(bem('footer'), cssClasses.footer),
9094
list: cx(bem('list'), cssClasses.list),
9195
item: cx(bem('item'), cssClasses.item),
9296
active: cx(bem('item', 'active'), cssClasses.active),

0 commit comments

Comments
 (0)