Skip to content

Commit 7a2d22d

Browse files
committed
feat(headerFooter): Only add markup if a template is defined
Fixes #370 BREAKING CHANGE: The `<div class="ais-header">` and `<div class="ais-footer">` markup is only added when a `templates.{header,footer}` is passed.
1 parent ec13c68 commit 7a2d22d

File tree

2 files changed

+88
-27
lines changed

2 files changed

+88
-27
lines changed

Diff for: decorators/__tests__/headerFooter-test.js

+68-13
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,88 @@ import TestComponent from './TestComponent';
77
import headerFooter from '../headerFooter';
88
import Template from '../../components/Template';
99

10-
var bemHeader = require('../../lib/utils').bemHelper('ais-header');
11-
var bemFooter = require('../../lib/utils').bemHelper('ais-footer');
12-
var cx = require('classnames');
13-
1410
import expectJSX from 'expect-jsx';
1511
expect.extend(expectJSX);
1612

1713
describe('headerFooter', () => {
1814
var renderer;
15+
var defaultProps;
1916

2017
beforeEach(() => {
2118
let {createRenderer} = TestUtils;
19+
defaultProps = {
20+
cssClasses: {
21+
root: 'root',
22+
body: 'body'
23+
},
24+
templateProps: {
25+
}
26+
};
2227
renderer = createRenderer();
2328
});
2429

25-
it('should render headerFooter(<div />)', () => {
26-
var out = render({cssClasses: {root: 'wrapper'}});
30+
it('should render the component in a root and body', () => {
31+
var out = render(defaultProps);
32+
expect(out).toEqualJSX(
33+
<div className="root">
34+
<div className="body">
35+
<TestComponent {...defaultProps} />
36+
</div>
37+
</div>
38+
);
39+
});
40+
41+
it('should add a header if such a template is passed', () => {
42+
// Given
43+
defaultProps.templateProps.templates = {
44+
header: 'HEADER'
45+
};
46+
// When
47+
var out = render(defaultProps);
48+
// Then
49+
var templateProps = {
50+
data: {},
51+
templateKey: 'header',
52+
transformData: null,
53+
templates: {
54+
header: 'HEADER'
55+
}
56+
};
2757
expect(out).toEqualJSX(
28-
<div className="wrapper">
29-
<div className={cx(bemHeader(null))}>
30-
<Template data={{}} templateKey="header" transformData={null} />
58+
<div className="root">
59+
<div className="ais-header">
60+
<Template {...templateProps} />
3161
</div>
32-
<div className={undefined}>
33-
<TestComponent cssClasses={{root: 'wrapper'}} />
62+
<div className="body">
63+
<TestComponent {...defaultProps} />
64+
</div>
65+
</div>
66+
);
67+
});
68+
69+
it('should add a footer if such a template is passed', () => {
70+
// Given
71+
defaultProps.templateProps.templates = {
72+
footer: 'FOOTER'
73+
};
74+
// When
75+
var out = render(defaultProps);
76+
// Then
77+
var templateProps = {
78+
data: {},
79+
templateKey: 'footer',
80+
transformData: null,
81+
templates: {
82+
footer: 'FOOTER'
83+
}
84+
};
85+
expect(out).toEqualJSX(
86+
<div className="root">
87+
<div className="body">
88+
<TestComponent {...defaultProps} />
3489
</div>
35-
<div className={cx(bemFooter(null))}>
36-
<Template data={{}} templateKey="footer" transformData={null} />
90+
<div className="ais-footer">
91+
<Template {...templateProps} />
3792
</div>
3893
</div>
3994
);

Diff for: decorators/headerFooter.js

+20-14
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,35 @@ var Template = require('../components/Template');
99

1010
function headerFooter(ComposedComponent) {
1111
class HeaderFooter extends React.Component {
12+
getTemplate(type) {
13+
let templates = this.props.templateProps.templates;
14+
if (!templates || !templates[type]) {
15+
return null;
16+
}
17+
let className = cx(this.props.cssClasses[type], `ais-${type}`);
18+
return (
19+
<div className={className}>
20+
<Template templateKey={type} {...this.props.templateProps} transformData={null} />
21+
</div>
22+
);
23+
}
1224
render() {
13-
// override potential widget's defined transformData,
14-
// header and footer currently do not have it
15-
var transformData = null;
16-
var templateProps = this.props.templateProps;
1725
var classNames = {
18-
root: this.props.cssClasses.root,
19-
header: cx(this.props.cssClasses.header, 'ais-header'),
20-
body: this.props.cssClasses.body,
21-
footer: cx(this.props.cssClasses.footer, 'ais-footer')
26+
root: cx(this.props.cssClasses.root),
27+
body: cx(this.props.cssClasses.body)
2228
};
2329

30+
// Only add header/footer if a template is defined
31+
var header = this.getTemplate('header');
32+
var footer = this.getTemplate('footer');
33+
2434
return (
2535
<div className={classNames.root}>
26-
<div className={classNames.header}>
27-
<Template templateKey="header" {...templateProps} transformData={transformData} />
28-
</div>
36+
{header}
2937
<div className={classNames.body}>
3038
<ComposedComponent {...this.props} />
3139
</div>
32-
<div className={classNames.footer}>
33-
<Template templateKey="footer" {...templateProps} transformData={transformData} />
34-
</div>
40+
{footer}
3541
</div>
3642
);
3743
}

0 commit comments

Comments
 (0)