Skip to content

Commit f8eabf9

Browse files
committed
docs(cookbook) - using angular 2 with electron
cc text update dev
1 parent 34b687d commit f8eabf9

22 files changed

+994
-0
lines changed
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
/// <reference path='../_protractor/e2e.d.ts' />
2+
'use strict';
3+
describe('TOH Http Chapter', function () {
4+
5+
beforeEach(function () {
6+
browser.get('');
7+
});
8+
9+
function getPageStruct() {
10+
let hrefEles = element.all(by.css('my-app a'));
11+
12+
return {
13+
hrefs: hrefEles,
14+
myDashboardHref: hrefEles.get(0),
15+
myDashboardParent: element(by.css('my-app my-dashboard')),
16+
topHeroes: element.all(by.css('my-app my-dashboard .module.hero')),
17+
18+
myHeroesHref: hrefEles.get(1),
19+
myHeroesParent: element(by.css('my-app my-heroes')),
20+
allHeroes: element.all(by.css('my-app my-heroes li .hero-element')),
21+
22+
firstDeleteButton: element.all(by.buttonText('Delete')).get(0),
23+
24+
addButton: element.all(by.buttonText('Add New Hero')).get(0),
25+
26+
heroDetail: element(by.css('my-app my-hero-detail'))
27+
};
28+
}
29+
30+
it('should be able to add a hero from the "Heroes" view', function(){
31+
let page = getPageStruct();
32+
let heroCount: webdriver.promise.Promise<number>;
33+
34+
page.myHeroesHref.click().then(function() {
35+
browser.waitForAngular();
36+
heroCount = page.allHeroes.count();
37+
expect(heroCount).toBe(10, 'should show 10');
38+
}).then(function() {
39+
return page.addButton.click();
40+
}).then(function(){
41+
return save(page, '', 'The New Hero');
42+
}).then(function(){
43+
browser.waitForAngular();
44+
45+
heroCount = page.allHeroes.count();
46+
expect(heroCount).toBe(11, 'should show 11');
47+
48+
let newHero = element(by.xpath('//span[@class="hero-element" and contains(text(),"The New Hero")]'));
49+
expect(newHero).toBeDefined();
50+
});
51+
});
52+
53+
it('should be able to delete hero from "Heroes" view', function(){
54+
let page = getPageStruct();
55+
let heroCount: webdriver.promise.Promise<number>;
56+
57+
page.myHeroesHref.click().then(function() {
58+
browser.waitForAngular();
59+
heroCount = page.allHeroes.count();
60+
expect(heroCount).toBe(10, 'should show 10');
61+
}).then(function() {
62+
return page.firstDeleteButton.click();
63+
}).then(function(){
64+
browser.waitForAngular();
65+
heroCount = page.allHeroes.count();
66+
expect(heroCount).toBe(9, 'should show 9');
67+
});
68+
});
69+
70+
it('should be able to save details from "Dashboard" view', function () {
71+
let page = getPageStruct();
72+
expect(page.myDashboardParent.isPresent()).toBe(true, 'dashboard element should be available');
73+
let heroEle = page.topHeroes.get(2);
74+
let heroDescrEle = heroEle.element(by.css('h4'));
75+
let heroDescr: string;
76+
77+
return heroDescrEle.getText().then(function(text) {
78+
heroDescr = text;
79+
return heroEle.click();
80+
}).then(function() {
81+
return save(page, heroDescr, '-foo');
82+
})
83+
.then(function(){
84+
return page.myDashboardHref.click();
85+
})
86+
.then(function() {
87+
expect(page.myDashboardParent.isPresent()).toBe(true, 'dashboard element should be back');
88+
expect(heroDescrEle.getText()).toEqual(heroDescr + '-foo');
89+
});
90+
});
91+
92+
it('should be able to save details from "Heroes" view', function () {
93+
let page = getPageStruct();
94+
95+
let viewDetailsButtonEle = page.myHeroesParent.element(by.cssContainingText('button', 'View Details'));
96+
let heroEle: protractor.ElementFinder, heroDescr: string;
97+
98+
page.myHeroesHref.click().then(function() {
99+
expect(page.myDashboardParent.isPresent()).toBe(false, 'dashboard element should NOT be present');
100+
expect(page.myHeroesParent.isPresent()).toBe(true, 'myHeroes element should be present');
101+
expect(viewDetailsButtonEle.isPresent()).toBe(false, 'viewDetails button should not yet be present');
102+
heroEle = page.allHeroes.get(0);
103+
return heroEle.getText();
104+
}).then(function(text) {
105+
// remove leading 'id' from the element
106+
heroDescr = text.substr(text.indexOf(' ') + 1);
107+
return heroEle.click();
108+
}).then(function() {
109+
expect(viewDetailsButtonEle.isDisplayed()).toBe(true, 'viewDetails button should now be visible');
110+
return viewDetailsButtonEle.click();
111+
}).then(function() {
112+
return save(page, heroDescr, '-bar');
113+
})
114+
.then(function(){
115+
return page.myHeroesHref.click();
116+
})
117+
.then(function() {
118+
expect(heroEle.getText()).toContain(heroDescr + '-bar');
119+
});
120+
});
121+
122+
function save(page: any, origValue: string, textToAdd: string) {
123+
let inputEle = page.heroDetail.element(by.css('input'));
124+
expect(inputEle.isDisplayed()).toBe(true, 'should be able to see the input box');
125+
let saveButtonEle = page.heroDetail.element(by.buttonText('Save'));
126+
let backButtonEle = page.heroDetail.element(by.buttonText('Back'));
127+
expect(backButtonEle.isDisplayed()).toBe(true, 'should be able to see the back button');
128+
let detailTextEle = page.heroDetail.element(by.css('div h2'));
129+
expect(detailTextEle.getText()).toContain(origValue);
130+
return sendKeys(inputEle, textToAdd).then(function () {
131+
expect(detailTextEle.getText()).toContain(origValue + textToAdd);
132+
return saveButtonEle.click();
133+
});
134+
}
135+
136+
it('should be able to see the start screen', function () {
137+
let page = getPageStruct();
138+
expect(page.hrefs.count()).toEqual(2, 'should be two dashboard choices');
139+
expect(page.myDashboardHref.getText()).toEqual('Dashboard');
140+
expect(page.myHeroesHref.getText()).toEqual('Heroes');
141+
});
142+
143+
it('should be able to see dashboard choices', function () {
144+
let page = getPageStruct();
145+
expect(page.topHeroes.count()).toBe(4, 'should be 4 dashboard hero choices');
146+
});
147+
148+
it('should be able to toggle the views', function () {
149+
let page = getPageStruct();
150+
151+
expect(page.myDashboardParent.element(by.css('h3')).getText()).toEqual('Top Heroes');
152+
page.myHeroesHref.click().then(function() {
153+
expect(page.myDashboardParent.isPresent()).toBe(false, 'should no longer see dashboard element');
154+
expect(page.allHeroes.count()).toBeGreaterThan(4, 'should be more than 4 heroes shown');
155+
return page.myDashboardHref.click();
156+
}).then(function() {
157+
expect(page.myDashboardParent.isPresent()).toBe(true, 'should once again see the dashboard element');
158+
});
159+
160+
});
161+
162+
it('should be able to edit details from "Dashboard" view', function () {
163+
let page = getPageStruct();
164+
expect(page.myDashboardParent.isPresent()).toBe(true, 'dashboard element should be available');
165+
let heroEle = page.topHeroes.get(3);
166+
let heroDescrEle = heroEle.element(by.css('h4'));
167+
let heroDescr: string;
168+
return heroDescrEle.getText().then(function(text) {
169+
heroDescr = text;
170+
return heroEle.click();
171+
}).then(function() {
172+
return editDetails(page, heroDescr, '-foo');
173+
}).then(function() {
174+
expect(page.myDashboardParent.isPresent()).toBe(true, 'dashboard element should be back');
175+
expect(heroDescrEle.getText()).toEqual(heroDescr + '-foo');
176+
});
177+
});
178+
179+
it('should be able to edit details from "Heroes" view', function () {
180+
let page = getPageStruct();
181+
expect(page.myDashboardParent.isPresent()).toBe(true, 'dashboard element should be present');
182+
let viewDetailsButtonEle = page.myHeroesParent.element(by.cssContainingText('button', 'View Details'));
183+
let heroEle: protractor.ElementFinder, heroDescr: string;
184+
page.myHeroesHref.click().then(function() {
185+
expect(page.myDashboardParent.isPresent()).toBe(false, 'dashboard element should NOT be present');
186+
expect(page.myHeroesParent.isPresent()).toBe(true, 'myHeroes element should be present');
187+
expect(viewDetailsButtonEle.isPresent()).toBe(false, 'viewDetails button should not yet be present');
188+
heroEle = page.allHeroes.get(2);
189+
return heroEle.getText();
190+
}).then(function(text) {
191+
// remove leading 'id' from the element
192+
heroDescr = text.substr(text.indexOf(' ') + 1);
193+
return heroEle.click();
194+
}).then(function() {
195+
expect(viewDetailsButtonEle.isDisplayed()).toBe(true, 'viewDetails button should now be visible');
196+
return viewDetailsButtonEle.click();
197+
}).then(function() {
198+
return editDetails(page, heroDescr, '-bar');
199+
}).then(function() {
200+
expect(page.myHeroesParent.isPresent()).toBe(true, 'myHeroes element should be back');
201+
expect(heroEle.getText()).toContain(heroDescr + '-bar');
202+
expect(viewDetailsButtonEle.isPresent()).toBe(false, 'viewDetails button should again NOT be present');
203+
});
204+
});
205+
206+
function editDetails(page: any, origValue: string, textToAdd: string) {
207+
expect(page.myDashboardParent.isPresent()).toBe(false, 'dashboard element should NOT be present');
208+
expect(page.myHeroesParent.isPresent()).toBe(false, 'myHeroes element should NOT be present');
209+
expect(page.heroDetail.isDisplayed()).toBe(true, 'should be able to see hero-details');
210+
let inputEle = page.heroDetail.element(by.css('input'));
211+
expect(inputEle.isDisplayed()).toBe(true, 'should be able to see the input box');
212+
let buttons = page.heroDetail.all(by.css('button'));
213+
let backButtonEle = buttons.get(0);
214+
let saveButtonEle = buttons.get(1);
215+
expect(backButtonEle.isDisplayed()).toBe(true, 'should be able to see the back button');
216+
expect(saveButtonEle.isDisplayed()).toBe(true, 'should be able to see the save button');
217+
let detailTextEle = page.heroDetail.element(by.css('div h2'));
218+
expect(detailTextEle.getText()).toContain(origValue);
219+
return sendKeys(inputEle, textToAdd).then(function () {
220+
expect(detailTextEle.getText()).toContain(origValue + textToAdd);
221+
return saveButtonEle.click();
222+
});
223+
}
224+
225+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
**/*.js
2+
3+
!index.js
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/* #docplaster */
2+
/* #docregion css */
3+
h1 {
4+
font-size: 1.2em;
5+
color: #999;
6+
margin-bottom: 0;
7+
}
8+
h2 {
9+
font-size: 2em;
10+
margin-top: 0;
11+
padding-top: 0;
12+
}
13+
nav a {
14+
padding: 5px 10px;
15+
text-decoration: none;
16+
margin-top: 10px;
17+
display: inline-block;
18+
background-color: #eee;
19+
border-radius: 4px;
20+
}
21+
nav a:visited, a:link {
22+
color: #607D8B;
23+
}
24+
nav a:hover {
25+
color: #039be5;
26+
background-color: #CFD8DC;
27+
}
28+
nav a.router-link-active {
29+
color: #039be5;
30+
}
31+
/* #enddocregion css */
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// #docplaster
2+
// #docregion
3+
import { Component } from '@angular/core';
4+
import { RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router-deprecated';
5+
6+
import { DashboardComponent } from './dashboard.component';
7+
import { HeroesComponent } from './heroes.component';
8+
import { HeroDetailComponent } from './hero-detail.component';
9+
import { HeroService } from './hero.service';
10+
11+
@Component({
12+
selector: 'my-app',
13+
14+
template: `
15+
<h1>{{title}}</h1>
16+
<nav>
17+
<a [routerLink]="['Dashboard']">Dashboard</a>
18+
<a [routerLink]="['Heroes']">Heroes</a>
19+
</nav>
20+
<router-outlet></router-outlet>
21+
`,
22+
styleUrls: ['app/app.component.css'],
23+
directives: [ROUTER_DIRECTIVES],
24+
providers: [
25+
ROUTER_PROVIDERS,
26+
HeroService,
27+
]
28+
})
29+
@RouteConfig([
30+
{ path: '/dashboard', name: 'Dashboard', component: DashboardComponent, useAsDefault: true },
31+
{ path: '/detail/:id', name: 'HeroDetail', component: HeroDetailComponent },
32+
{ path: '/heroes', name: 'Heroes', component: HeroesComponent }
33+
])
34+
export class AppComponent {
35+
title = 'Tour of Heroes';
36+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/* #docplaster */
2+
/* #docregion */
3+
[class*='col-'] {
4+
float: left;
5+
}
6+
*, *:after, *:before {
7+
-webkit-box-sizing: border-box;
8+
-moz-box-sizing: border-box;
9+
box-sizing: border-box;
10+
}
11+
h3 {
12+
text-align: center; margin-bottom: 0;
13+
}
14+
[class*='col-'] {
15+
padding-right: 20px;
16+
padding-bottom: 20px;
17+
}
18+
[class*='col-']:last-of-type {
19+
padding-right: 0;
20+
}
21+
.grid {
22+
margin: 0;
23+
}
24+
.col-1-4 {
25+
width: 25%;
26+
}
27+
.module {
28+
padding: 20px;
29+
text-align: center;
30+
color: #eee;
31+
max-height: 120px;
32+
min-width: 120px;
33+
background-color: #607D8B;
34+
border-radius: 2px;
35+
}
36+
h4 {
37+
position: relative;
38+
}
39+
.module:hover {
40+
background-color: #EEE;
41+
cursor: pointer;
42+
color: #607d8b;
43+
}
44+
.grid-pad {
45+
padding: 10px 0;
46+
}
47+
.grid-pad > [class*='col-']:last-of-type {
48+
padding-right: 20px;
49+
}
50+
@media (max-width: 600px) {
51+
.module {
52+
font-size: 10px;
53+
max-height: 75px; }
54+
}
55+
@media (max-width: 1024px) {
56+
.grid {
57+
margin: 0;
58+
}
59+
.module {
60+
min-width: 60px;
61+
}
62+
}
63+
/* #enddocregion */
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!-- #docregion -->
2+
<h3>Top Heroes</h3>
3+
<div class="grid grid-pad">
4+
<!-- #docregion click -->
5+
<div *ngFor="let hero of heroes" (click)="gotoDetail(hero)" class="col-1-4">
6+
<!-- #enddocregion click -->
7+
<div class="module hero">
8+
<h4>{{hero.name}}</h4>
9+
</div>
10+
</div>
11+
</div>

0 commit comments

Comments
 (0)