Skip to content

Commit 36df54a

Browse files
LiverpoolOwenMarkPieszak
authored andcommitted
Improved user UI for rest demo (TrilonIO#199)
1 parent 1ded40a commit 36df54a

File tree

6 files changed

+127
-49
lines changed

6 files changed

+127
-49
lines changed

Client/app/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { AppComponent } from './app.component';
1414
import { NavMenuComponent } from './components/navmenu/navmenu.component';
1515
import { HomeComponent } from './containers/home/home.component';
1616
import { UsersComponent } from './containers/users/users.component';
17+
import { UserDetailComponent } from './components/user-detail/user-detail.component';
1718
import { CounterComponent } from './containers/counter/counter.component';
1819
import { ChatComponent } from './containers/chat/chat.component';
1920
import { NgxBootstrapComponent } from './containers/ngx-bootstrap-demo/ngx-bootstrap.component';
@@ -39,6 +40,7 @@ export function createTranslateLoader(http: Http, baseHref) {
3940
NavMenuComponent,
4041
CounterComponent,
4142
UsersComponent,
43+
UserDetailComponent,
4244
HomeComponent,
4345
ChatComponent,
4446
NgxBootstrapComponent
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<div *ngIf="user">
2+
<h2>{{user.name}} details:</h2>
3+
<div><label>id: </label>{{user.id}}</div>
4+
<div>
5+
<label>name: </label>
6+
<input [(ngModel)]="user.name" placeholder="name" #details="ngModel" />
7+
</div>
8+
<button [class.disabled]="details.pristine" class="btn btn-success" (click)="updateUser(user)">Save</button>
9+
</div>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Component, Input } from '@angular/core';
2+
import { IUser } from '../../models/User';
3+
import { UserService } from '../../shared/user.service';
4+
5+
@Component({
6+
selector: 'user-detail',
7+
templateUrl: './user-detail.component.html'
8+
})
9+
export class UserDetailComponent {
10+
@Input() user: IUser;
11+
12+
constructor(private userService: UserService) { }
13+
14+
15+
updateUser(user) {
16+
this.userService.updateUser(user).subscribe(result => {
17+
console.log('Put user result: ', result);
18+
if (!result.ok) {
19+
alert('There was an issue, Could not edit user');
20+
}
21+
});
22+
}
23+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
.selected {
2+
background-color: #CFD8DC !important;
3+
color: white;
4+
}
5+
6+
.users {
7+
margin: 0 0 2em 0;
8+
list-style-type: none;
9+
padding: 0;
10+
width: 15em;
11+
}
12+
13+
.users li {
14+
cursor: pointer;
15+
position: relative;
16+
left: 0;
17+
background-color: #EEE;
18+
margin: .5em;
19+
padding: .3em 0;
20+
height: 2.4em;
21+
border-radius: 4px;
22+
}
23+
24+
.users li:hover {
25+
color: #607D8B;
26+
background-color: #DDD;
27+
left: .1em;
28+
}
29+
30+
.users li.selected:hover {
31+
background-color: #BBD8DC !important;
32+
color: white;
33+
}
34+
35+
.users .text {
36+
position: relative;
37+
top: -3px;
38+
}
39+
40+
.users .badge {
41+
display: inline-block;
42+
font-size: small;
43+
color: white;
44+
padding: 0.8em 0.7em 0 0.7em;
45+
background-color: #607D8B;
46+
line-height: 1em;
47+
position: relative;
48+
left: -1px;
49+
top: -4px;
50+
height: 2.5em;
51+
margin-right: .8em;
52+
border-radius: 4px 0 0 4px;
53+
}
54+
button.delete {
55+
background-color: #eee;
56+
border: none;
57+
padding: 5px 10px;
58+
border-radius: 4px;
59+
float: right;
60+
margin-top: 2px;
61+
margin-right: .8em;
62+
background-color: gray !important;
63+
color: white;
64+
}

Client/app/containers/users/users.component.html

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,25 @@
55
You can find the Web API Routes in <code>{{ "/Server/RestAPI/ ... "}}</code>
66
</blockquote>
77

8-
<p *ngIf="!users"><em>Loading...</em></p>
8+
<div>
9+
<label>User name:</label> <input #userName />
10+
<button class="btn btn-default" (click)="addUser(userName.value); userName.value=''">
11+
Add
12+
</button>
13+
</div>
914

10-
<table class="table" *ngIf="users">
11-
<thead>
12-
<tr>
13-
<th>User ID</th>
14-
<th>Name</th>
15-
<th></th>
16-
<th></th>
17-
</tr>
18-
</thead>
19-
<tbody>
20-
<tr *ngFor="let user of users" [@flyInOut]>
21-
<td>{{ user.id }}</td>
22-
<td>
23-
<input class="form-control" [(ngModel)]="user.name" #name="ngModel" />
24-
</td>
25-
<td>
26-
<button *ngIf="name.dirty" class="btn btn-success" (click)="updateUser(user)">Save</button>
27-
</td>
28-
<td>
29-
<button class="btn btn-danger" (click)="deleteUser(user)">Delete</button>
30-
</td>
31-
</tr>
32-
<tr>
33-
<td><b>Add new user</b></td>
34-
<td>
35-
<input class="form-control" [(ngModel)]="newUserName" #newUser="ngModel" />
36-
</td>
37-
<td></td>
38-
<td>
39-
<button *ngIf="newUser.dirty" class="btn glyphicon-plus" (click)="addUser(newUserName)">+ Add New User</button>
40-
</td>
41-
</tr>
42-
</tbody>
43-
</table>
15+
<p *ngIf="!users"><em>Loading...</em></p>
16+
<h2>Users</h2>
17+
<ul class="users">
18+
<li *ngFor="let user of users"
19+
[class.selected]="user === selectedUser"
20+
(click)="onSelect(user)"
21+
[@flyInOut]>
22+
<span class="badge">{{user.id}}</span> {{user.name}}
23+
<button class="delete"
24+
(click)="deleteUser(user); $event.stopPropagation()">
25+
x
26+
</button>
27+
</li>
28+
</ul>
29+
<user-detail [user]="selectedUser"></user-detail>

Client/app/containers/users/users.component.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import { IUser } from '../../models/User';
77
import { UserService } from '../../shared/user.service';
88

99
@Component({
10-
selector: 'fetchdata',
10+
selector: 'users',
1111
templateUrl: './users.component.html',
12+
styleUrls: ['./users.component.css'],
1213
animations: [
1314
// Animation example
1415
// Triggered in the ngFor with [@flyInOut]
@@ -26,23 +27,26 @@ import { UserService } from '../../shared/user.service';
2627
})
2728
export class UsersComponent implements OnInit {
2829

29-
public newUserName: string;
30-
public users: IUser[];
30+
private users: IUser[];
31+
private selectedUser: IUser;
3132

3233
// Use "constructor"s only for dependency injection
3334
constructor(private userService: UserService) { }
3435

3536
// Here you want to handle anything with @Input()'s @Output()'s
3637
// Data retrieval / etc - this is when the Component is "ready" and wired up
3738
ngOnInit() {
38-
this.newUserName = '';
3939
this.userService.getUsers().subscribe(result => {
4040
console.log('Get user result: ', result);
4141
console.log('TransferHttp [GET] /api/users/allresult', result);
4242
this.users = result as IUser[];
4343
});
4444
}
4545

46+
onSelect(user: IUser): void {
47+
this.selectedUser = user;
48+
}
49+
4650
deleteUser(user) {
4751
this.userService.deleteUser(user).subscribe(result => {
4852
console.log('Delete user result: ', result);
@@ -55,21 +59,11 @@ export class UsersComponent implements OnInit {
5559
});
5660
}
5761

58-
updateUser(user) {
59-
this.userService.updateUser(user).subscribe(result => {
60-
console.log('Put user result: ', result);
61-
if (!result.ok) {
62-
alert('There was an issue, Could not edit user');
63-
}
64-
});
65-
}
66-
6762
addUser(newUserName) {
6863
this.userService.addUser(newUserName).subscribe(result => {
6964
console.log('Post user result: ', result);
7065
if (result.ok) {
7166
this.users.push(result.json());
72-
this.newUserName = '';
7367
} else {
7468
alert('There was an issue, Could not edit user');
7569
}

0 commit comments

Comments
 (0)