diff --git a/package-lock.json b/package-lock.json
index 791c662..ee58a7c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1679,6 +1679,30 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "@ngrx/effects": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-13.1.0.tgz",
+ "integrity": "sha512-b0kaC1yly1WawtQils3Bxy2FhE9OwlQD/bptVd3s+bskdZ+iw9VlAMH9Spk2mfX+MyOEOk2FyrWlrOePtkw+7Q==",
+ "requires": {
+ "tslib": "^2.0.0"
+ }
+ },
+ "@ngrx/store": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-13.1.0.tgz",
+ "integrity": "sha512-2Phsd/CC5FcoS2VgC+Fo5VgfAUK3m7bjWTc8d6+h3UcoQpS3xyPnybGYifa/JYN1CFYmqypVDRWSMAgML2NU/A==",
+ "requires": {
+ "tslib": "^2.0.0"
+ }
+ },
+ "@ngrx/store-devtools": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-13.1.0.tgz",
+ "integrity": "sha512-HAF2q1qk7n0Q3rkHncdXIokGXbPFKWwmfhGFS9pnq63FScgPgHjNXSlPmwgycb+LqDvDR4C8f1HSbPhOb6I29w==",
+ "requires": {
+ "tslib": "^2.0.0"
+ }
+ },
"@ngtools/webpack": {
"version": "13.2.6",
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.6.tgz",
diff --git a/package.json b/package.json
index 1f0cc29..e11fa34 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,9 @@
"@angular/platform-browser": "~13.2.0",
"@angular/platform-browser-dynamic": "~13.2.0",
"@angular/router": "~13.2.0",
+ "@ngrx/effects": "^13.1.0",
+ "@ngrx/store": "^13.1.0",
+ "@ngrx/store-devtools": "^13.1.0",
"bootstrap": "^5.1.3",
"concurrently": "^7.0.0",
"font-awesome": "^4.7.0",
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index 0297262..9e3bd1b 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -1,10 +1,13 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
+import { EmployeesComponent } from './components/employees/employees.component';
-const routes: Routes = [];
+const routes: Routes = [{
+ path:"employees", component:EmployeesComponent
+}];
@NgModule({
- imports: [RouterModule.forRoot(routes)],
- exports: [RouterModule]
+ imports: [RouterModule.forRoot(routes)],
+ exports: [RouterModule]
})
export class AppRoutingModule { }
diff --git a/src/app/app.component.html b/src/app/app.component.html
index 9d761c4..7bc7132 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -5,7 +5,7 @@
-
- Link 1
+ Employees
-
Link 2
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 1d76450..bc3c6a5 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,19 +1,30 @@
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
+import { StoreModule } from '@ngrx/store';
+import { EffectsModule } from '@ngrx/effects';
+import { StoreDevtoolsModule } from '@ngrx/store-devtools';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
+import { EmployeesComponent } from './components/employees/employees.component';
+import { NavBarComponent } from './components/employees/nav-bar/nav-bar.component';
+import { employeesReducer } from './ngrx/employees.reducer';
+import { EmployeesEffects } from './ngrx/employees.effects';
@NgModule({
declarations: [
- AppComponent
+ AppComponent,
+ EmployeesComponent,
+ NavBarComponent
],
imports: [
BrowserModule,
AppRoutingModule,
- HttpClientModule
-
+ HttpClientModule,
+ StoreModule.forRoot({catalogState:employeesReducer}),
+ EffectsModule.forRoot([EmployeesEffects]),
+ StoreDevtoolsModule.instrument()
],
providers: [],
bootstrap: [AppComponent]
diff --git a/src/app/components/employees/employees.component.css b/src/app/components/employees/employees.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/components/employees/employees.component.html b/src/app/components/employees/employees.component.html
new file mode 100644
index 0000000..862ddaa
--- /dev/null
+++ b/src/app/components/employees/employees.component.html
@@ -0,0 +1,27 @@
+
+
+
+
+ Initial State
+
+
+ Loading ...
+
+
+ {{state.errorMessage | json}}
+
+
+
+
+ | ID | Nom | Prénom | Role |
+
+
+ | {{employee.id}} |
+ {{employee.nom}} |
+ {{employee.prenom}} |
+ {{employee.role}} |
+
+
+
+
+
diff --git a/src/app/components/employees/employees.component.spec.ts b/src/app/components/employees/employees.component.spec.ts
new file mode 100644
index 0000000..3a2e370
--- /dev/null
+++ b/src/app/components/employees/employees.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EmployeesComponent } from './employees.component';
+
+describe('EmployeesComponent', () => {
+ let component: EmployeesComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ EmployeesComponent ]
+ })
+ .compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(EmployeesComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/components/employees/employees.component.ts b/src/app/components/employees/employees.component.ts
new file mode 100644
index 0000000..e905fcf
--- /dev/null
+++ b/src/app/components/employees/employees.component.ts
@@ -0,0 +1,24 @@
+import { Component, OnInit } from '@angular/core';
+import { Store } from '@ngrx/store';
+import { Observable, of } from 'rxjs';
+import { map } from 'rxjs/operators';
+import { EmployeesState, EmployeesStateEnum } from '../../ngrx/employees.reducer';
+
+@Component({
+ selector: 'app-employees',
+ templateUrl: './employees.component.html',
+ styleUrls: ['./employees.component.css']
+})
+export class EmployeesComponent implements OnInit {
+ employeesState$:Observable|null=null;
+ readonly EmployeesStateEnum=EmployeesStateEnum;
+
+ constructor(private store:Store) { }
+
+ ngOnInit(): void {
+ this.employeesState$=this.store.pipe(
+ map((state) => state.catalogState)
+ );
+ }
+
+}
diff --git a/src/app/components/employees/nav-bar/nav-bar.component.css b/src/app/components/employees/nav-bar/nav-bar.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/components/employees/nav-bar/nav-bar.component.html b/src/app/components/employees/nav-bar/nav-bar.component.html
new file mode 100644
index 0000000..102d2db
--- /dev/null
+++ b/src/app/components/employees/nav-bar/nav-bar.component.html
@@ -0,0 +1,5 @@
+
diff --git a/src/app/components/employees/nav-bar/nav-bar.component.spec.ts b/src/app/components/employees/nav-bar/nav-bar.component.spec.ts
new file mode 100644
index 0000000..94e5b30
--- /dev/null
+++ b/src/app/components/employees/nav-bar/nav-bar.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { NavBarComponent } from './nav-bar.component';
+
+describe('NavBarComponent', () => {
+ let component: NavBarComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ NavBarComponent ]
+ })
+ .compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(NavBarComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/components/employees/nav-bar/nav-bar.component.ts b/src/app/components/employees/nav-bar/nav-bar.component.ts
new file mode 100644
index 0000000..89f7627
--- /dev/null
+++ b/src/app/components/employees/nav-bar/nav-bar.component.ts
@@ -0,0 +1,20 @@
+import { Component, OnInit } from '@angular/core';
+import { Store } from '@ngrx/store';
+import { GetAllEmployeesAction } from '../../../ngrx/employees.actions';
+
+@Component({
+ selector: 'app-nav-bar',
+ templateUrl: './nav-bar.component.html',
+ styleUrls: ['./nav-bar.component.css']
+})
+export class NavBarComponent implements OnInit {
+
+ constructor(private store:Store) { }
+
+ ngOnInit(): void {
+ }
+
+ onGetAllEmployees() {
+ this.store.dispatch(new GetAllEmployeesAction({}))
+ }
+}
diff --git a/src/app/ngrx/employees.actions.ts b/src/app/ngrx/employees.actions.ts
new file mode 100644
index 0000000..5d503f4
--- /dev/null
+++ b/src/app/ngrx/employees.actions.ts
@@ -0,0 +1,31 @@
+import { Action } from '@ngrx/store';
+import { Employee } from '../model/employee.model';
+
+export enum EmployeesActionsTypes {
+ GET_ALL_EMPLOYEES="[Employees] Get All Employees",
+ GET_ALL_EMPLOYEES_SUCCESS="[Employees] Get All Employees Success",
+ GET_ALL_EMPLOYEES_ERROR="[Employees] Get All Employees Error",
+}
+
+export class GetAllEmployeesAction implements Action {
+ type: EmployeesActionsTypes=EmployeesActionsTypes.GET_ALL_EMPLOYEES;
+ constructor(public payload:any) {
+ }
+
+}
+
+export class GetAllEmployeesActionSuccess implements Action {
+ type: EmployeesActionsTypes=EmployeesActionsTypes.GET_ALL_EMPLOYEES_SUCCESS;
+ constructor(public payload:Employee[]) {
+ }
+
+}
+
+export class GetAllEmployeesActionError implements Action {
+ type: EmployeesActionsTypes=EmployeesActionsTypes.GET_ALL_EMPLOYEES_ERROR;
+ constructor(public payload:string) {
+ }
+
+}
+
+export type EmployeesActions=GetAllEmployeesAction | GetAllEmployeesActionSuccess | GetAllEmployeesActionError;
diff --git a/src/app/ngrx/employees.effects.ts b/src/app/ngrx/employees.effects.ts
new file mode 100644
index 0000000..cd85331
--- /dev/null
+++ b/src/app/ngrx/employees.effects.ts
@@ -0,0 +1,26 @@
+import { Injectable } from '@angular/core';
+import { EmployeesService } from '../services/employees.service';
+import { createEffect, Actions, ofType } from '@ngrx/effects';
+import { Observable, of, EMPTY } from 'rxjs';
+import { Action } from '@ngrx/store';
+import { EmployeesActionsTypes } from './employees.actions';
+import { mergeMap, map, catchError } from 'rxjs/operators';
+import { GetAllEmployeesActionSuccess, GetAllEmployeesActionError } from './employees.actions';
+
+@Injectable()
+export class EmployeesEffects {
+ getAllEmployeesEffect$:Observable = createEffect(() => this.actions$.pipe(
+ ofType(EmployeesActionsTypes.GET_ALL_EMPLOYEES),
+ mergeMap((action) => {
+ return this.employeesService.getAllEmployees().pipe(
+ map(employees => new GetAllEmployeesActionSuccess(employees)),
+ catchError((err) => of(new GetAllEmployeesActionError(err.message)))
+ )
+ })
+ ));
+
+ constructor(
+ private employeesService:EmployeesService,
+ private actions$:Actions
+ ) {}
+}
diff --git a/src/app/ngrx/employees.reducer.ts b/src/app/ngrx/employees.reducer.ts
new file mode 100644
index 0000000..fe0983f
--- /dev/null
+++ b/src/app/ngrx/employees.reducer.ts
@@ -0,0 +1,35 @@
+import { Employee } from '../model/employee.model';
+import { EmployeesActions, EmployeesActionsTypes } from './employees.actions';
+import { Action } from '@ngrx/store';
+
+export enum EmployeesStateEnum {
+ LOADING="Loading",
+ LOADED="Loaded",
+ ERROR="Error",
+ INITIAL="Initial"
+}
+
+export interface EmployeesState {
+ employees:Employee[],
+ errorMessage:string,
+ dataState:EmployeesStateEnum
+}
+
+const initState:EmployeesState = {
+ employees:[],
+ errorMessage:"",
+ dataState:EmployeesStateEnum.INITIAL
+}
+
+export function employeesReducer(state:EmployeesState=initState, action:Action):EmployeesState {
+ switch(action.type) {
+ case EmployeesActionsTypes.GET_ALL_EMPLOYEES:
+ return {...state, dataState:EmployeesStateEnum.LOADING};
+ case EmployeesActionsTypes.GET_ALL_EMPLOYEES_SUCCESS:
+ return {...state, dataState:EmployeesStateEnum.LOADED, employees:(action).payload};
+ case EmployeesActionsTypes.GET_ALL_EMPLOYEES_ERROR:
+ return {...state, dataState:EmployeesStateEnum.ERROR, errorMessage:(action).payload};
+ default:
+ return {...state}
+ }
+}
diff --git a/src/app/services/employees.service.ts b/src/app/services/employees.service.ts
index 2fa7d93..ddaac12 100644
--- a/src/app/services/employees.service.ts
+++ b/src/app/services/employees.service.ts
@@ -9,7 +9,7 @@ export class EmployeesService {
constructor(private http:HttpClient) {}
getAllEmployees():Observable {
- let host=environment.host;
+ let host=Math.random()>0.2?environment.host:environment.unreachableHost;
return this.http.get(host+"/employees");
}