From a0441fff4b8fc8d95353a4922e78a2826f68cdc0 Mon Sep 17 00:00:00 2001 From: Cristina Guncay Date: Mon, 6 Apr 2020 10:49:49 -0500 Subject: [PATCH] #44 save activities using API --- .../activity-list.component.scss | 5 ++ .../activity-list/activity-list.component.ts | 16 +++-- .../create-activity.component.spec.ts | 47 ++++++++++--- .../create-activity.component.ts | 15 ++-- .../activities-management.component.html | 6 +- .../activities-management.component.spec.ts | 11 +-- .../pages/activities-management.component.ts | 11 +-- .../services/activity.service.spec.ts | 37 ++++++---- .../services/activity.service.ts | 14 +++- .../store/activity-management.actions.spec.ts | 24 +++++-- .../store/activity-management.actions.ts | 46 +++++++++--- .../store/activity-management.effects.ts | 41 +++++++---- .../activity-management.reducers.spec.ts | 38 +++++++++- .../store/activity-management.reducers.ts | 70 +++++++++++++------ .../store/activity-management.selectors.ts | 2 +- .../modules/shared/models/activity.model.ts | 7 +- 16 files changed, 271 insertions(+), 119 deletions(-) diff --git a/src/app/modules/activities-management/components/activity-list/activity-list.component.scss b/src/app/modules/activities-management/components/activity-list/activity-list.component.scss index 0c625698f..9611f365e 100644 --- a/src/app/modules/activities-management/components/activity-list/activity-list.component.scss +++ b/src/app/modules/activities-management/components/activity-list/activity-list.component.scss @@ -4,3 +4,8 @@ background-image: $background-gradient-items; color: white; } + +.scroll { + max-height: 400px; + overflow-y: auto; +} diff --git a/src/app/modules/activities-management/components/activity-list/activity-list.component.ts b/src/app/modules/activities-management/components/activity-list/activity-list.component.ts index e26ba949d..ff0f3e7de 100644 --- a/src/app/modules/activities-management/components/activity-list/activity-list.component.ts +++ b/src/app/modules/activities-management/components/activity-list/activity-list.component.ts @@ -2,27 +2,29 @@ import { Input, OnInit } from '@angular/core'; import { Component } from '@angular/core'; import { Store, select } from '@ngrx/store'; -import { allActivities } from '../../store'; import { LoadActivities } from './../../store/activity-management.actions'; import { ActivityState } from './../../store/activity-management.reducers'; +import { allActivities } from '../../store'; import { Activity } from '../../../shared/models'; -@Component({selector: 'app-activity-list', templateUrl: './activity-list.component.html', styleUrls: ['./activity-list.component.scss']}) +@Component({ + selector: 'app-activity-list', + templateUrl: './activity-list.component.html', + styleUrls: ['./activity-list.component.scss'], +}) export class ActivityListComponent implements OnInit { - - @Input()activities: Activity[] = []; + activities: Activity[] = []; public isLoading: boolean; - constructor(private store: Store) { } + constructor(private store: Store) {} ngOnInit() { this.store.dispatch(new LoadActivities()); const activities$ = this.store.pipe(select(allActivities)); - activities$.subscribe(response => { + activities$.subscribe((response) => { this.isLoading = response.isLoading; this.activities = response.data; }); } - } diff --git a/src/app/modules/activities-management/components/create-activity/create-activity.component.spec.ts b/src/app/modules/activities-management/components/create-activity/create-activity.component.spec.ts index 16fd83160..f384855df 100644 --- a/src/app/modules/activities-management/components/create-activity/create-activity.component.spec.ts +++ b/src/app/modules/activities-management/components/create-activity/create-activity.component.spec.ts @@ -1,25 +1,48 @@ import { FormBuilder } from '@angular/forms'; -import { async, TestBed } from '@angular/core/testing'; +import { async, TestBed, ComponentFixture } from '@angular/core/testing'; +import { provideMockStore, MockStore } from '@ngrx/store/testing'; import { CreateActivityComponent } from './create-activity.component'; +import { ActivityState, CreateActivity } from '../../store'; +import { Activity } from 'src/app/modules/shared/models'; describe('CreateActivityComponent', () => { - let component: CreateActivityComponent; + let fixture: ComponentFixture; + let store: MockStore; + + const state = { data: [{ id: 'id', name: 'name', description: 'description' }], isLoading: false, message: '' }; - const data = { - name: '', - description: '' + const data: Activity[] = [ + { + id: '1', + name: 'Training', + description: 'It is good for learning', + }, + ]; + + const activity: Activity = { + id: '1', + name: 'Training', + description: 'It is good for learning', }; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ CreateActivityComponent], - providers: [ FormBuilder ] - }); - component = TestBed.createComponent(CreateActivityComponent).componentInstance; + declarations: [CreateActivityComponent], + providers: [FormBuilder, provideMockStore({ initialState: state })], + }).compileComponents(); })); + beforeEach(() => { + fixture = TestBed.createComponent(CreateActivityComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + + store = TestBed.inject(MockStore); + store.setState(state); + }); + it('should create the component', () => { expect(component).toBeTruthy(); }); @@ -48,4 +71,10 @@ describe('CreateActivityComponent', () => { expect(component.activityForm.get).toHaveBeenCalledWith('description'); }); + it('should dispatch createActivity action #onSubmit', () => { + spyOn(store, 'dispatch'); + component.onSubmit(activity); + expect(store.dispatch).toHaveBeenCalledTimes(1); + expect(store.dispatch).toHaveBeenCalledWith(new CreateActivity(activity)); + }); }); diff --git a/src/app/modules/activities-management/components/create-activity/create-activity.component.ts b/src/app/modules/activities-management/components/create-activity/create-activity.component.ts index a010a0722..e9d7ad847 100644 --- a/src/app/modules/activities-management/components/create-activity/create-activity.component.ts +++ b/src/app/modules/activities-management/components/create-activity/create-activity.component.ts @@ -1,6 +1,9 @@ import { FormBuilder, Validators, FormGroup } from '@angular/forms'; -import { Component, Input } from '@angular/core'; +import { Component, Input, EventEmitter, Output } from '@angular/core'; +import { Store, select } from '@ngrx/store'; import { Activity } from '../../../shared/models'; +import { ActivityState } from './../../store/activity-management.reducers'; +import { CreateActivity, allActivities } from '../../store'; @Component({ selector: 'app-create-activity', @@ -9,11 +12,9 @@ import { Activity } from '../../../shared/models'; }) export class CreateActivityComponent { activityForm: FormGroup; + isLoading: boolean; - @Input() - activityToEdit: Activity; - - constructor(private formBuilder: FormBuilder) { + constructor(private formBuilder: FormBuilder, private store: Store) { this.activityForm = this.formBuilder.group({ name: ['', Validators.required], description: [''], @@ -21,10 +22,8 @@ export class CreateActivityComponent { } onSubmit(activityData) { - // TODO: add proper interaction with API to save this info - // see https://github.com/ioet/time-tracker-ui/issues/44 - console.log(activityData); this.activityForm.reset(); + this.store.dispatch(new CreateActivity(activityData)); } get name() { diff --git a/src/app/modules/activities-management/pages/activities-management.component.html b/src/app/modules/activities-management/pages/activities-management.component.html index aeaeb67d3..ff5498dbe 100644 --- a/src/app/modules/activities-management/pages/activities-management.component.html +++ b/src/app/modules/activities-management/pages/activities-management.component.html @@ -1,7 +1,5 @@
- - + - - +
diff --git a/src/app/modules/activities-management/pages/activities-management.component.spec.ts b/src/app/modules/activities-management/pages/activities-management.component.spec.ts index 0f278d790..e90769281 100644 --- a/src/app/modules/activities-management/pages/activities-management.component.spec.ts +++ b/src/app/modules/activities-management/pages/activities-management.component.spec.ts @@ -8,12 +8,12 @@ import { ActivitiesManagementComponent } from './activities-management.component describe('ActivitiesManagementComponent', () => { let component: ActivitiesManagementComponent; let activityService: ActivityService; - const activitiesFromApi: Activity[] = [{id: '123', name: 'aaa', description: 'xxx'}]; + const activitiesFromApi: Activity[] = [{ id: '123', name: 'aaa', description: 'xxx' }]; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ActivitiesManagementComponent], - providers: [ ActivityService, HttpClient, HttpHandler ] + declarations: [ActivitiesManagementComponent], + providers: [ActivityService, HttpClient, HttpHandler], }); component = TestBed.createComponent(ActivitiesManagementComponent).componentInstance; activityService = TestBed.inject(ActivityService); @@ -23,9 +23,4 @@ describe('ActivitiesManagementComponent', () => { it('should create the component', () => { expect(component).toBeTruthy(); }); - - it('should load activities', () => { - component.ngOnInit(); - expect(component.activities).toBe(activitiesFromApi); - }); }); diff --git a/src/app/modules/activities-management/pages/activities-management.component.ts b/src/app/modules/activities-management/pages/activities-management.component.ts index 276284a95..2eaa4b34e 100644 --- a/src/app/modules/activities-management/pages/activities-management.component.ts +++ b/src/app/modules/activities-management/pages/activities-management.component.ts @@ -5,15 +5,10 @@ import { Activity } from '../../shared/models'; @Component({ selector: 'app-activities-management', templateUrl: './activities-management.component.html', - styleUrls: ['./activities-management.component.scss'] + styleUrls: ['./activities-management.component.scss'], }) export class ActivitiesManagementComponent implements OnInit { + constructor(private activityService: ActivityService) {} - constructor(private activityService: ActivityService) { } - - activities: Activity[]; - - ngOnInit(): void { - this.activityService.getActivities().subscribe( data => this.activities = data ); - } + ngOnInit(): void {} } diff --git a/src/app/modules/activities-management/services/activity.service.spec.ts b/src/app/modules/activities-management/services/activity.service.spec.ts index a7b42ac73..63898c3df 100644 --- a/src/app/modules/activities-management/services/activity.service.spec.ts +++ b/src/app/modules/activities-management/services/activity.service.spec.ts @@ -9,12 +9,12 @@ describe('Activity Service', () => { let httpMock: HttpTestingController; const activities: Activity[] = [ - { id: '1', name: 'aaa', description: 'xxx' }, - { id: '2', name: 'bbb', description: 'yyy' } + { id: '1', name: 'aaa', description: 'xxx' }, + { id: '2', name: 'bbb', description: 'yyy' }, ]; beforeEach(() => { - TestBed.configureTestingModule({imports: [HttpClientTestingModule]}); + TestBed.configureTestingModule({ imports: [HttpClientTestingModule] }); service = TestBed.inject(ActivityService); httpMock = TestBed.inject(HttpTestingController); }); @@ -23,22 +23,35 @@ describe('Activity Service', () => { httpMock.verify(); }); - it('services are ready to be used', inject([ HttpClientTestingModule, ActivityService ], + it('services are ready to be used', inject( + [HttpClientTestingModule, ActivityService], (httpClient: HttpClientTestingModule, activityService: ActivityService) => { - expect(activityService).toBeTruthy(); - expect(httpClient).toBeTruthy(); - })); + expect(activityService).toBeTruthy(); + expect(httpClient).toBeTruthy(); + } + )); it('activities are read using GET from baseUrl', () => { const activitiesFoundSize = activities.length; service.baseUrl = 'foo'; - service - .getActivities() - .subscribe(activitiesInResponse => { - expect(activitiesInResponse.length).toBe(activitiesFoundSize); - }); + service.getActivities().subscribe((activitiesInResponse) => { + expect(activitiesInResponse.length).toBe(activitiesFoundSize); + }); const getActivitiesRequest = httpMock.expectOne(service.baseUrl); expect(getActivitiesRequest.request.method).toBe('GET'); getActivitiesRequest.flush(activities); }); + + it('create activity using POST from baseUrl', () => { + const activity: Activity[] = [{ id: '1', name: 'ccc', description: 'xxx' }]; + + service.baseUrl = 'activities'; + + service.createActivity(activity).subscribe((response) => { + expect(response.length).toBe(1); + }); + const createActivitiesRequest = httpMock.expectOne(service.baseUrl); + expect(createActivitiesRequest.request.method).toBe('POST'); + createActivitiesRequest.flush(activity); + }); }); diff --git a/src/app/modules/activities-management/services/activity.service.ts b/src/app/modules/activities-management/services/activity.service.ts index a0e24397c..651fcff60 100644 --- a/src/app/modules/activities-management/services/activity.service.ts +++ b/src/app/modules/activities-management/services/activity.service.ts @@ -1,15 +1,14 @@ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; import { environment } from './../../../../environments/environment'; import { Activity } from '../../shared/models'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class ActivityService { - baseUrl = `${environment.timeTrackerApiUrl}/activities`; constructor(private http: HttpClient) {} @@ -17,4 +16,13 @@ export class ActivityService { getActivities(): Observable { return this.http.get(this.baseUrl); } + + createActivity(activityData): Observable { + const body = { + ...activityData, + tenant_id: '4225ab1e-1033-4a5f-8650-0dd4950f38c8', + }; + + return this.http.post(this.baseUrl, body); + } } diff --git a/src/app/modules/activities-management/store/activity-management.actions.spec.ts b/src/app/modules/activities-management/store/activity-management.actions.spec.ts index c776309e2..32941c188 100644 --- a/src/app/modules/activities-management/store/activity-management.actions.spec.ts +++ b/src/app/modules/activities-management/store/activity-management.actions.spec.ts @@ -1,16 +1,28 @@ -import { LoadActivitiesFail } from './activity-management.actions'; +import { LoadActivitiesFail, CreateActivitySuccess, CreateActivityFail } from './activity-management.actions'; import { LoadActivitiesSuccess, ActivityManagementActionTypes } from './activity-management.actions'; describe('LoadActivitiesSuccess', () => { - - it('LoadActivitiesSuccess type is ActivityManagementActionTypes.LoadActivitiesSuccess', () => { + it('LoadActivitiesSuccess type is ActivityManagementActionTypes.LOAD_ACTIVITIES_SUCCESS', () => { const loadActivitiesSuccess = new LoadActivitiesSuccess([]); - expect(loadActivitiesSuccess.type).toEqual(ActivityManagementActionTypes.LoadActivitiesSuccess); + expect(loadActivitiesSuccess.type).toEqual(ActivityManagementActionTypes.LOAD_ACTIVITIES_SUCCESS); }); - it('LoadActivitiesFail type is ActivityManagementActionTypes.LoadActivitiesFail', () => { + it('LoadActivitiesFail type is ActivityManagementActionTypes.LOAD_ACTIVITIES_FAIL', () => { const loadActivitiesFail = new LoadActivitiesFail('error'); - expect(loadActivitiesFail.type).toEqual(ActivityManagementActionTypes.LoadActivitiesFail); + expect(loadActivitiesFail.type).toEqual(ActivityManagementActionTypes.LOAD_ACTIVITIES_FAIL); + }); + + it('CreateActivitySuccess type is ActivityManagementActionTypes.CREATE_ACTIVITY_SUCCESS', () => { + const createActivitySuccess = new CreateActivitySuccess({ + id: '1', + name: 'Training', + description: 'It is goof for learning', + }); + expect(createActivitySuccess.type).toEqual(ActivityManagementActionTypes.CREATE_ACTIVITY_SUCCESS); }); + it('CreateActivityFail type is ActivityManagementActionTypes.CREATE_ACTIVITY_FAIL', () => { + const createActivityFail = new CreateActivityFail('error'); + expect(createActivityFail.type).toEqual(ActivityManagementActionTypes.CREATE_ACTIVITY_FAIL); + }); }); diff --git a/src/app/modules/activities-management/store/activity-management.actions.ts b/src/app/modules/activities-management/store/activity-management.actions.ts index b1b500830..370787d83 100644 --- a/src/app/modules/activities-management/store/activity-management.actions.ts +++ b/src/app/modules/activities-management/store/activity-management.actions.ts @@ -3,26 +3,52 @@ import { Action } from '@ngrx/store'; import { Activity } from './../../shared/models/activity.model'; export enum ActivityManagementActionTypes { - LoadActivities = '[ActivityManagement] Load Activities', - LoadActivitiesSuccess = '[ActivityManagement] Load Activities Successs', - LoadActivitiesFail = '[ActivityManagement] Load Activities Fail', + LOAD_ACTIVITIES = '[ActivityManagement] LOAD_ACTIVITIES', + LOAD_ACTIVITIES_SUCCESS = '[ActivityManagement] LOAD_ACTIVITIES_SUCCESS', + LOAD_ACTIVITIES_FAIL = '[ActivityManagement] LOAD_ACTIVITIES_FAIL', + CREATE_ACTIVITY = '[ActivityManagement] CREATE_ACTIVITY', + CREATE_ACTIVITY_SUCCESS = '[ActivityManagement] CREATE_ACTIVITY_SUCCESS', + CREATE_ACTIVITY_FAIL = '[ActivityManagement] CREATE_ACTIVITY_FAIL', } - export class LoadActivities implements Action { - public readonly type = ActivityManagementActionTypes.LoadActivities; + public readonly type = ActivityManagementActionTypes.LOAD_ACTIVITIES; } export class LoadActivitiesSuccess implements Action { - public readonly type = ActivityManagementActionTypes.LoadActivitiesSuccess; + public readonly type = ActivityManagementActionTypes.LOAD_ACTIVITIES_SUCCESS; - constructor(public payload: Activity[]) { } + constructor(public payload: Activity[]) {} } export class LoadActivitiesFail implements Action { - public readonly type = ActivityManagementActionTypes.LoadActivitiesFail; + public readonly type = ActivityManagementActionTypes.LOAD_ACTIVITIES_FAIL; + + constructor(public error: string) {} +} + +export class CreateActivity implements Action { + public readonly type = ActivityManagementActionTypes.CREATE_ACTIVITY; + + constructor(public payload: Activity) {} +} + +export class CreateActivitySuccess implements Action { + public readonly type = ActivityManagementActionTypes.CREATE_ACTIVITY_SUCCESS; + + constructor(public payload: Activity) {} +} + +export class CreateActivityFail implements Action { + public readonly type = ActivityManagementActionTypes.CREATE_ACTIVITY_FAIL; - constructor(public error) { } + constructor(public error: string) {} } -export type ActivityManagementActions = LoadActivities | LoadActivitiesSuccess | LoadActivitiesFail; +export type ActivityManagementActions = + | LoadActivities + | LoadActivitiesSuccess + | LoadActivitiesFail + | CreateActivity + | CreateActivitySuccess + | CreateActivityFail; diff --git a/src/app/modules/activities-management/store/activity-management.effects.ts b/src/app/modules/activities-management/store/activity-management.effects.ts index c6f42e9d9..ba1ba54aa 100644 --- a/src/app/modules/activities-management/store/activity-management.effects.ts +++ b/src/app/modules/activities-management/store/activity-management.effects.ts @@ -4,25 +4,38 @@ import { Action } from '@ngrx/store'; import { Observable, of } from 'rxjs'; import { catchError, map, mergeMap } from 'rxjs/operators'; -import { ActivityManagementActionTypes, LoadActivitiesSuccess, LoadActivitiesFail } from './activity-management.actions'; +import * as actions from './activity-management.actions'; import { Activity } from './../../shared/models/activity.model'; import { ActivityService } from './../services/activity.service'; @Injectable() export class ActivityEffects { + constructor(private actions$: Actions, private activityService: ActivityService) {} - constructor(private actions$: Actions, private activityService: ActivityService) { } + @Effect() + getActivities$: Observable = this.actions$.pipe( + ofType(actions.ActivityManagementActionTypes.LOAD_ACTIVITIES), + mergeMap(() => + this.activityService.getActivities().pipe( + map((activities: Activity[]) => { + return new actions.LoadActivitiesSuccess(activities); + }), + catchError((error) => of(new actions.LoadActivitiesFail(error))) + ) + ) + ); - @Effect() - getActivities$: Observable = this.actions$.pipe( - ofType(ActivityManagementActionTypes.LoadActivities), - mergeMap(() => - this.activityService.getActivities().pipe( - map((activities: Activity[]) => { - return new LoadActivitiesSuccess(activities); - }), - catchError((error) => - of(new LoadActivitiesFail(error))) - ) - )); + @Effect() + createActivity$: Observable = this.actions$.pipe( + ofType(actions.ActivityManagementActionTypes.CREATE_ACTIVITY), + map((action: actions.CreateActivity) => action.payload), + mergeMap((activity) => + this.activityService.createActivity(activity).pipe( + map((activityData) => { + return new actions.CreateActivitySuccess(activityData); + }), + catchError((error) => of(new actions.CreateActivityFail(error))) + ) + ) + ); } diff --git a/src/app/modules/activities-management/store/activity-management.reducers.spec.ts b/src/app/modules/activities-management/store/activity-management.reducers.spec.ts index 8f6294111..ada9b0867 100644 --- a/src/app/modules/activities-management/store/activity-management.reducers.spec.ts +++ b/src/app/modules/activities-management/store/activity-management.reducers.spec.ts @@ -1,8 +1,13 @@ import { Activity } from './../../shared/models/activity.model'; -import { LoadActivitiesFail, LoadActivities } from './activity-management.actions'; +import { + LoadActivitiesFail, + LoadActivities, + CreateActivitySuccess, + CreateActivityFail, + CreateActivity, +} from './activity-management.actions'; import { LoadActivitiesSuccess } from './activity-management.actions'; import { activityManagementReducer, ActivityState } from './activity-management.reducers'; - describe('activityManagementReducer', () => { const initialState: ActivityState = { data: [], isLoading: false, message: '' }; @@ -15,7 +20,7 @@ describe('activityManagementReducer', () => { }); it('on LoadActivitiesSuccess, activitiesFound are saved in the store', () => { - const activitiesFound: Activity[] = [{id: '', name: '', description: ''}]; + const activitiesFound: Activity[] = [{ id: '', name: '', description: '' }]; const action = new LoadActivitiesSuccess(activitiesFound); const state = activityManagementReducer(initialState, action); @@ -31,4 +36,31 @@ describe('activityManagementReducer', () => { expect(state.message).toEqual('Something went wrong fetching activities!'); }); + it('on CreateActivity, isLoading is true', () => { + const activity: Activity = { id: '1', name: 'Training', description: 'It is good for learning' }; + const action = new CreateActivity(activity); + + const state = activityManagementReducer(initialState, action); + + expect(state.isLoading).toEqual(true); + }); + + it('on CreateActivitySuccess, activitiesFound are saved in the store', () => { + const activity: Activity = { id: '1', name: 'Training', description: 'It is good for learning' }; + const action = new CreateActivitySuccess(activity); + + const state = activityManagementReducer(initialState, action); + + expect(state.data).toEqual([activity]); + expect(state.isLoading).toEqual(false); + }); + + it('on CreateActivityFail, message equal to Something went wrong creating activities!', () => { + const action = new CreateActivityFail('error'); + + const state = activityManagementReducer(initialState, action); + + expect(state.message).toEqual('Something went wrong creating activities!'); + expect(state.isLoading).toEqual(false); + }); }); diff --git a/src/app/modules/activities-management/store/activity-management.reducers.ts b/src/app/modules/activities-management/store/activity-management.reducers.ts index 060a4978c..4be6a8b1c 100644 --- a/src/app/modules/activities-management/store/activity-management.reducers.ts +++ b/src/app/modules/activities-management/store/activity-management.reducers.ts @@ -1,5 +1,5 @@ -import {ActivityManagementActions, ActivityManagementActionTypes} from './activity-management.actions'; -import {Activity} from './../../shared/models/activity.model'; +import { ActivityManagementActions, ActivityManagementActionTypes } from './activity-management.actions'; +import { Activity } from './../../shared/models/activity.model'; export interface ActivityState { data: Activity[]; @@ -7,32 +7,56 @@ export interface ActivityState { message: string; } -const initialState: ActivityState = { +export const initialState: ActivityState = { data: [], isLoading: false, - message: '' + message: '', }; -export function activityManagementReducer(state = initialState, action: ActivityManagementActions): ActivityState { - +export function activityManagementReducer(state: ActivityState = initialState, action: ActivityManagementActions) { switch (action.type) { - case(ActivityManagementActionTypes.LoadActivities): { - return { - ...state, - isLoading: true - }; - } + case ActivityManagementActionTypes.LOAD_ACTIVITIES: { + return { + ...state, + isLoading: true, + }; + } + + case ActivityManagementActionTypes.LOAD_ACTIVITIES_SUCCESS: { + return { + ...state, + data: action.payload, + isLoading: false, + message: 'Data fetch successfully!', + }; + } + case ActivityManagementActionTypes.LOAD_ACTIVITIES_FAIL: { + return { data: [], isLoading: false, message: 'Something went wrong fetching activities!' }; + } + + case ActivityManagementActionTypes.CREATE_ACTIVITY: { + return { + ...state, + isLoading: true, + }; + } - case ActivityManagementActionTypes.LoadActivitiesSuccess: { - return { - ...state, - data: action.payload, - isLoading: false, - message: 'Data fetch successfully!' - }; - } - case ActivityManagementActionTypes.LoadActivitiesFail: { - return { data: [], isLoading: false, message: 'Something went wrong fetching activities!' }; - } + case ActivityManagementActionTypes.CREATE_ACTIVITY_SUCCESS: { + return { + ...state, + data: [...state.data, action.payload], + isLoading: false, + message: 'Data created successfully!', + }; + } + case ActivityManagementActionTypes.CREATE_ACTIVITY_FAIL: { + return { + data: [], + isLoading: false, + message: 'Something went wrong creating activities!', + }; + } + default: + return state; } } diff --git a/src/app/modules/activities-management/store/activity-management.selectors.ts b/src/app/modules/activities-management/store/activity-management.selectors.ts index a016d3267..bcac26195 100644 --- a/src/app/modules/activities-management/store/activity-management.selectors.ts +++ b/src/app/modules/activities-management/store/activity-management.selectors.ts @@ -5,5 +5,5 @@ import { ActivityState } from './activity-management.reducers'; const getActivityState = createFeatureSelector('activities'); export const allActivities = createSelector(getActivityState, (state: ActivityState) => { - return state; + return state; }); diff --git a/src/app/modules/shared/models/activity.model.ts b/src/app/modules/shared/models/activity.model.ts index e1fd90ceb..9a1ba0381 100644 --- a/src/app/modules/shared/models/activity.model.ts +++ b/src/app/modules/shared/models/activity.model.ts @@ -1,5 +1,6 @@ export interface Activity { - id: string; - name: string; - description: string; + id: string; + name: string; + description: string; + tenant_id?: string; }