Skip to content

Commit add9f4e

Browse files
committed
Add user data and display it with items and widgets on home page
1 parent 720f01d commit add9f4e

File tree

17 files changed

+273
-15
lines changed

17 files changed

+273
-15
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.row {
2+
flex-basis: 100%;
3+
display: flex;
4+
flex-wrap: wrap;
5+
}
6+
7+
h1 {
8+
flex-basis: 100%;
9+
padding: 10px;
10+
}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<div class="container">
2-
<div class="col-50">
3-
<app-items-total [items]="items$ | async"></app-items-total>
4-
<app-items-list [items]="items$ | async" [readonly]="true"></app-items-list>
5-
</div>
6-
7-
<div class="col-50">
8-
<app-widgets-total [widgets]="widgets$ | async"></app-widgets-total>
9-
<app-widgets-list [widgets]="widgets$ | async" [readonly]="true"></app-widgets-list>
2+
<div class="row" *ngFor="let user of users$ | async">
3+
<h1>{{user.name}}</h1>
4+
<div class="col">
5+
<app-items-total [items]="user.items"></app-items-total>
6+
<app-widgets-total [widgets]="user.widgets"></app-widgets-total>
7+
</div>
8+
<app-items-list class="col" [items]="user.items" [readonly]="true"></app-items-list>
9+
<app-widgets-list class="col" [widgets]="user.widgets" [readonly]="true"></app-widgets-list>
1010
</div>
1111
</div>
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component, OnInit } from '@angular/core';
2-
import { Item, ItemsFacade, Widget, WidgetsFacade } from '@workspace/common-data';
2+
import { Item, ItemsFacade, User, UsersFacade, Widget, WidgetsFacade } from '@workspace/common-data';
33
import { Observable } from 'rxjs';
44

55
@Component({
@@ -9,16 +9,17 @@ import { Observable } from 'rxjs';
99

1010
})
1111
export class HomeComponent implements OnInit {
12-
items$: Observable<Item[]> = this.itemsFacade.allItems$;
13-
widgets$: Observable<Widget[]> = this.widgetsFacade.allWidgets$;
12+
users$: Observable<User[]> = this.usersFacade.allUsers$;
1413

1514
constructor(
15+
private usersFacade: UsersFacade,
1616
private itemsFacade: ItemsFacade,
1717
private widgetsFacade: WidgetsFacade
1818
) {}
1919

2020
ngOnInit() {
2121
this.itemsFacade.loadAll();
2222
this.widgetsFacade.loadAll();
23+
this.usersFacade.loadUsers();
2324
}
2425
}

libs/common-data/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@ export { ItemsService } from './lib/core/items/items.service';
66
export { Widget } from './lib/core/widgets/widget.model';
77
export { WidgetsService } from './lib/core/widgets/widgets.service';
88

9+
export { User } from './lib/core/users/users.model';
10+
911
export { ItemsFacade } from './lib/state/items/items.facade';
1012
export { WidgetsFacade } from './lib/state/widgets/widgets.facade';
13+
export { UsersFacade } from './lib/state/users/users.facade';
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export interface User {
2+
id: string;
3+
name: string;
4+
items: any[];
5+
widgets: any[];
6+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { TestBed, inject } from '@angular/core/testing';
2+
3+
import { UsersService } from './users.service';
4+
5+
describe('UsersService', () => {
6+
beforeEach(() => {
7+
TestBed.configureTestingModule({
8+
providers: [UsersService]
9+
});
10+
});
11+
12+
it(
13+
'should be created',
14+
inject([UsersService], (service: UsersService) => {
15+
expect(service).toBeTruthy();
16+
})
17+
);
18+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Injectable } from '@angular/core';
2+
import { HttpClient, HttpHeaders } from '@angular/common/http';
3+
4+
const BASE_URL = 'http://localhost:3000/users/';
5+
6+
@Injectable({
7+
providedIn: 'root'
8+
})
9+
export class UsersService {
10+
constructor(private http: HttpClient) {}
11+
12+
all() {
13+
return this.http.get(BASE_URL);
14+
}
15+
}

libs/common-data/src/lib/state/index.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@ import {
55
} from '@ngrx/store';
66
import * as fromItems from './items/items.reducer';
77
import * as fromWidgets from './widgets/widgets.reducer';
8+
import * as fromUsers from './users/users.reducer';
89

910
export interface AppState {
1011
items: fromItems.ItemsState;
11-
widgets: fromWidgets.WidgetsState
12+
widgets: fromWidgets.WidgetsState,
13+
users: fromUsers.UsersState
1214
}
1315

1416
export const reducers: ActionReducerMap<AppState> = {
1517
items: fromItems.itemsReducer,
16-
widgets: fromWidgets.widgetsReducer
18+
widgets: fromWidgets.widgetsReducer,
19+
users: fromUsers.usersReducer
1720
};
1821

1922
// -------------------------------------------------------------------
@@ -85,3 +88,26 @@ export const selectCurrentWidget = createSelector(
8588
return widgetId ? widgetEntities[widgetId] : emptyWidget;
8689
}
8790
);
91+
92+
// -------------------------------------------------------------------
93+
// USERS SELECTORS
94+
// -------------------------------------------------------------------
95+
export const selectUserUsersState = createFeatureSelector<fromUsers.UsersState>('users');
96+
97+
export const selectAllUsers = createSelector(
98+
selectUserUsersState,
99+
fromUsers.selectAllUsers
100+
);
101+
102+
export const selectUsersDetails = createSelector(
103+
selectAllUsers,
104+
selectItemEntities,
105+
selectWidgetEntities,
106+
(users, itemEntities, widgetEntities) => {
107+
return users.map(u => ({
108+
...u,
109+
items: u.items.map(itemId => itemEntities[itemId]),
110+
widgets: u.widgets.map(widgetId => widgetEntities[widgetId])
111+
}));
112+
}
113+
);

libs/common-data/src/lib/state/items/items.facade.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface TestSchema {
1616
'items' : ItemsState
1717
}
1818

19-
fdescribe('ItemsFacade', () => {
19+
fdescribe('UsersFacade', () => {
2020
let facade: ItemsFacade;
2121
let store: Store<TestSchema>;
2222
let createItem;

libs/common-data/src/lib/state/state.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import { NxModule } from '@nrwl/nx';
88
import { reducers } from './index';
99
import { ItemsEffects } from './items/items.effects';
1010
import { WidgetsEffects } from './widgets/widgets.effects';
11+
import { UsersEffects } from './users/users.effects';
1112

1213
@NgModule({
1314
imports: [
1415
CommonModule,
1516
NxModule.forRoot(),
1617
StoreModule.forRoot(reducers),
1718
StoreDevtoolsModule.instrument({ maxAge: 5 }),
18-
EffectsModule.forRoot([ItemsEffects, WidgetsEffects]),
19+
EffectsModule.forRoot([ItemsEffects, WidgetsEffects, UsersEffects]),
1920
],
2021
declarations: []
2122
})

0 commit comments

Comments
 (0)