Skip to content

Commit 90ea533

Browse files
committed
create and update works
1 parent 682a4d8 commit 90ea533

File tree

4 files changed

+87
-31
lines changed

4 files changed

+87
-31
lines changed

src/pages/home/home.html

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,20 @@
88
</ion-header>
99

1010
<ion-content padding>
11-
<h3>Ionic Menu Starter</h3>
12-
13-
<p>
14-
If you get lost, the <a href="http://ionicframework.com/docs/v2">docs</a> will show you the way.
15-
</p>
16-
17-
<button ion-button secondary menuToggle>Toggle Menu</button>
11+
<ion-grid align="center">
12+
<ion-row>
13+
<ion-col>
14+
<ion-item>
15+
<ion-input type="text" placeholder="Project Name" [(ngModel)]="project.name" #ctrl="ngModel"></ion-input>
16+
</ion-item>
17+
</ion-col>
18+
</ion-row>
19+
<ion-row>
20+
<ion-col>
21+
<button ion-button block type="button" [disabled]="!ctrl.valid" (click)="saveOrUpdateProject()">
22+
{{project ? "Create" : "Update"}}
23+
</button>
24+
</ion-col>
25+
</ion-row>
26+
</ion-grid>
1827
</ion-content>

src/pages/home/home.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,45 @@
11
import { Component } from '@angular/core';
2-
import { NavController } from 'ionic-angular';
2+
import {AlertController, NavController, NavParams} from 'ionic-angular';
3+
import {Project} from "../../model/project";
4+
import {ProjectProvider} from "../../providers/project/project";
5+
import {Validator} from "validator.ts/Validator";
36

47
@Component({
58
selector: 'page-home',
69
templateUrl: 'home.html'
710
})
811
export class HomePage {
12+
project: Project = new Project();
913

10-
constructor(public navCtrl: NavController) {
11-
14+
constructor(public navCtrl: NavController,
15+
public navParams: NavParams,
16+
private projectProvider: ProjectProvider,
17+
private alertController: AlertController) {
18+
this.project = navParams.get('item') ? navParams.get('item') : this.project;
1219
}
1320

21+
saveOrUpdateProject(): void {
22+
let validator = new Validator();
23+
let errors = validator.validate(this.project);
24+
if(errors.length === 0){
25+
this.projectProvider.saveOrUpdate(this.project).subscribe(project => {
26+
this.navCtrl.pop();
27+
}, error => {
28+
let message = this.alertController.create({
29+
title: 'Error',
30+
subTitle: error,
31+
buttons: ['OK']
32+
});
33+
message.present();
34+
});
35+
} else {
36+
let message = this.alertController.create({
37+
title: 'Error',
38+
subTitle: errors.map(error => error.errorMessage).toString(),
39+
buttons: ['OK']
40+
});
41+
message.present();
42+
}
43+
44+
}
1445
}

src/pages/list/list.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component } from '@angular/core';
2-
import { NavController, NavParams } from 'ionic-angular';
2+
import { NavController } from 'ionic-angular';
33
import {HomePage} from "../home/home";
44
import {Project} from "../../model/project";
55
import {ProjectProvider} from "../../providers/project/project";
@@ -9,17 +9,18 @@ import {ProjectProvider} from "../../providers/project/project";
99
templateUrl: 'list.html'
1010
})
1111
export class ListPage {
12-
selectedItem: any;
13-
icons: string[];
1412
items: Array<Project>;
1513

16-
constructor(public navCtrl: NavController, public navParams: NavParams, private projectProvider: ProjectProvider) {
17-
this.projectProvider.list().subscribe(projects => this.items = projects);
14+
constructor(public navCtrl: NavController, private projectProvider: ProjectProvider) {
1815
}
1916

2017
itemTapped(event, item) {
2118
this.navCtrl.push(HomePage, {
2219
item: item
2320
});
2421
}
22+
23+
ionViewWillEnter() {
24+
this.projectProvider.list().subscribe(projects => this.items = projects);
25+
}
2526
}

src/providers/project/project.ts

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,19 @@ export class ProjectProvider {
2727
return Observable.of(JSON.parse(localStorage.getItem(ProjectProvider.PROJECT_KEY)) as Array<Project>);
2828
}
2929

30-
create(name: string): Observable<Project> {
30+
save(name: string): Observable<Project> {
31+
if(!name){
32+
return Observable.throw("name cannot be blank")
33+
}
34+
3135
return this.searchByName(name).flatMap((result: Project) => {
32-
if(result !== null){
36+
if(result){
3337
return Observable.throw(`${name} already exists(case-insensitive)`);
3438
}
3539

3640
return this.list().flatMap((projects: Array<Project>) => {
37-
let id = Math.max(...projects.map(proj => proj.id)) + 1;
41+
projects = projects ? projects : [];
42+
let id = projects.length ? Math.max(...projects.map(proj => proj.id)) + 1 : 1;
3843
let newProject = new Project();
3944
newProject.id = id;
4045
newProject.name = name;
@@ -47,30 +52,40 @@ export class ProjectProvider {
4752
}
4853

4954
update(id: number, name: string): Observable<Project> {
50-
return this.searchById(id).flatMap(proj => {
51-
if(proj !== null){
52-
proj.name = name;
53-
return this.list().flatMap(projects => {
54-
let index = projects.findIndex(p => p.id === id);
55-
projects[index] = proj;
56-
57-
return Observable.of(proj);
58-
55+
return this.searchById(id).flatMap(byId => {
56+
if(byId !== null){
57+
return this.searchByName(name).flatMap(byName =>{
58+
if(!byName) {
59+
return this.list().flatMap(projects => {
60+
byId.name = name;
61+
let index = projects.findIndex(p => p.id === id);
62+
projects[index] = byId;
63+
localStorage.setItem(ProjectProvider.PROJECT_KEY, JSON.stringify(projects));
64+
return Observable.of(byId);
65+
});
66+
} else {
67+
return Observable.throw(`project with name ${name} already exists`);
68+
}
5969
});
6070
}
6171
return Observable.throw(`project with id:${id} does not exists`);
6272
});
6373
}
6474

75+
saveOrUpdate(project: Project): Observable<Project> {
76+
return project.id > 0 ? this.update(project.id, project.name) : this.save(project.name);
77+
}
78+
6579
searchById(id: number): Observable<Project> {
6680
return this.list().flatMap((projects: Array<Project>) =>
67-
Observable.of(projects.length > 0 ? projects.filter(proj => proj.id === id)[0] : null)
81+
Observable.of(projects && projects.length > 0 ? projects.find(proj => proj.id === id) : null)
6882
);
6983
}
7084

7185
searchByName(name: string): Observable<Project> {
72-
return this.list().flatMap((projects: Array<Project>) =>
73-
Observable.of(projects.length > 0 ? projects.filter(proj => proj.name.toLowerCase() === name)[0] : null)
74-
);
86+
return this.list().flatMap((projects: Array<Project>) => {
87+
let project = projects && projects.length > 0 ? projects.find(proj => proj.name.toLowerCase() === name) : null;
88+
return Observable.of(project);
89+
});
7590
}
7691
}

0 commit comments

Comments
 (0)