Skip to content

Commit b1fad63

Browse files
authored
Merge pull request #319 from alexeykostevich/refactoring/es-header
Simplify `EsHeaderComponent` implementation.
2 parents 712e42b + 5212d0d commit b1fad63

File tree

4 files changed

+71
-64
lines changed

4 files changed

+71
-64
lines changed

addon/components/es-header.js

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,23 @@
1-
import { set, action } from '@ember/object';
21
import Component from '@glimmer/component';
2+
import { action, set } from '@ember/object';
33

44
import defaultLinks from '../constants/links';
55

6+
const defautHomePage = 'https://www.emberjs.com';
7+
68
export default class EsHeaderComponent extends Component {
79
expanded = false;
810

911
get navHome() {
10-
if (this.args.home) {
11-
return this.args.home;
12-
}
13-
14-
return 'https://www.emberjs.com';
12+
return this.args.home ?? defautHomePage;
1513
}
1614

1715
get navLinks() {
18-
if (this.args.links) {
19-
return this.args.links;
20-
}
21-
22-
return defaultLinks;
16+
return this.args.links ?? defaultLinks;
2317
}
2418

2519
@action
26-
toggleMenu() {
20+
onTogglerClick() {
2721
set(this, 'expanded', !this.expanded);
2822
}
29-
30-
trackExpanded() {
31-
// Ensure menu is marked as expanded if there is enough screen estate
32-
// TODO: Dynamically calculate necessary horizontal space and collapse based on that
33-
if (typeof FastBoot === 'undefined') {
34-
const mq = matchMedia('(min-width: 992px)');
35-
36-
mq.addListener(event => {
37-
if (event.matches) {
38-
set(this, 'expanded', false);
39-
}
40-
});
41-
}
42-
}
4323
}

addon/styles/components/es-header.css

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,6 @@
5959
color: var(--color-white);
6060
}
6161

62-
[aria-expanded="true"] ~ .navbar-list,
63-
[aria-expanded="true"] ~ .navbar-end {
64-
display: block;
65-
}
66-
6762
.navbar-toggler {
6863
display: block;
6964
width: 3rem;
@@ -79,6 +74,11 @@
7974
border-radius: var(--radius-lg);
8075
}
8176

77+
.navbar-expanded .navbar-list,
78+
.navbar-expanded .navbar-end {
79+
display: block;
80+
}
81+
8282
.navbar-list-item {
8383
position: relative;
8484
}
@@ -186,7 +186,8 @@
186186
margin-right: var(--spacing-4);
187187
}
188188

189-
.navbar-list {
189+
.navbar-list,
190+
.navbar-expanded .navbar-list {
190191
display: flex;
191192
margin-top: 0;
192193
}
@@ -232,9 +233,6 @@
232233
z-index: 100;
233234
}
234235

235-
.navbar-dropdown-list-item-link {
236-
}
237-
238236
.navbar-end {
239237
display: block;
240238
align-self: center;

addon/templates/components/es-header.hbs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
<header class="es-header" role="banner" ...attributes>
2-
<nav class="es-navbar">
1+
<header
2+
class="es-header"
3+
role="banner"
4+
...attributes
5+
>
6+
<nav class="es-navbar {{if this.expanded "navbar-expanded"}}">
37
<a class="navbar-brand-wrapper" href={{this.navHome}}>
48
<img
59
class="navbar-brand"
@@ -11,13 +15,12 @@
1115
</a>
1216

1317
<button
18+
class="navbar-toggler"
1419
type="button"
15-
class="navbar-toggler ember-view"
1620
aria-expanded={{if this.expanded "true" "false"}}
17-
{{did-insert this.trackExpanded}}
18-
{{on "click" this.toggleMenu}}
21+
{{on "click" this.onTogglerClick}}
1922
>
20-
Show Site Navigation
23+
{{if this.expanded "Hide" "Show"}} Site Navigation
2124
</button>
2225

2326
<ul class="navbar-list">
Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,69 @@
1-
import { render } from '@ember/test-helpers';
1+
import { click, render } from '@ember/test-helpers';
2+
import { setProperties } from '@ember/object';
23
import { module, test } from 'qunit';
34
import { setupRenderingTest } from 'ember-qunit';
45
import hbs from 'htmlbars-inline-precompile';
56

7+
const customHomeUrl = 'https://github.com/emberjs';
8+
69
module('Integration | Component | es header', function(hooks) {
710
setupRenderingTest(hooks);
811

9-
test('it renders', async function(assert) {
10-
// Set any properties with this.set('myProperty', 'value');
11-
// Handle any actions with this.on('myAction', function(val) { ... });
12+
test('it uses the header HTML element with correct attributes', async function(assert) {
13+
await render(hbs`<EsHeader/>`);
14+
15+
assert.dom('header').exists({ count: 1 });
16+
assert.dom('header').hasClass('es-header');
17+
assert.dom('header').hasAttribute('role', 'banner');
18+
});
19+
20+
test('it renders the logo', async function(assert) {
21+
await render(hbs`<EsHeader/>`);
1222

13-
await render(hbs`{{es-header}}`);
23+
assert.dom('.navbar-brand').hasAttribute('src', '/images/ember-logo.svg');
24+
});
25+
26+
test('it renders the link to the Ember homepage by default', async function(assert) {
27+
await render(hbs`<EsHeader/>`);
28+
29+
assert.dom('.navbar-brand-wrapper').hasAttribute('href', 'https://www.emberjs.com');
30+
});
1431

15-
assert.dom(this.element).containsText('Show Site Navigation');
32+
test('it renders a link to a custom homepage', async function(assert) {
33+
setProperties(this, { customHomeUrl });
34+
await render(hbs`<EsHeader @home={{customHomeUrl}} />`);
1635

17-
// Template block usage:
36+
assert.dom('.navbar-brand-wrapper').hasAttribute('href', customHomeUrl);
37+
});
38+
39+
test('it renders custom content at the end', async function(assert) {
1840
await render(hbs`
19-
{{#es-header}}
20-
template block text
21-
{{/es-header}}
41+
<EsHeader>
42+
Custom content
43+
</EsHeader>
2244
`);
2345

24-
assert.dom(this.element).containsText('template block text');
46+
assert.dom('.navbar-end').containsText('Custom content');
2547
});
2648

27-
test('it uses the header html element', async function(assert) {
28-
await render(hbs`{{es-header}}`);
29-
assert.dom('header').exists({ count: 1 }, 'the header uses the header html element!');
30-
});
49+
test('it renders the navbar collapsed by default', async function(assert) {
50+
await render(hbs`<EsHeader/>`);
3151

32-
test('it has the role of banner', async function(assert) {
33-
await render(hbs`{{es-header}}`);
34-
assert.dom('header').hasAttribute('role', 'banner', 'header has the role of banner');
52+
assert.dom('.es-navbar').doesNotHaveClass('navbar-expanded');
53+
assert.dom('.navbar-toggler').containsText('Show Site Navigation');
3554
});
3655

37-
//the class matches the component name
38-
//but how do I make it so it just checks for the one of them?
39-
test('it has the className es-header', async function(assert) {
40-
await render(hbs`{{es-header}}`);
41-
assert.dom('header').hasClass('es-header');
56+
test('it toggles the navbar when click the toggler', async function(assert) {
57+
await render(hbs`<EsHeader/>`);
58+
59+
await click('.navbar-toggler');
60+
61+
assert.dom('.es-navbar').hasClass('navbar-expanded');
62+
assert.dom('.navbar-toggler').containsText('Hide Site Navigation');
63+
64+
await click('.navbar-toggler');
65+
66+
assert.dom('.es-navbar').doesNotHaveClass('navbar-expanded');
67+
assert.dom('.navbar-toggler').containsText('Show Site Navigation');
4268
});
4369
});

0 commit comments

Comments
 (0)