Skip to content

Commit 90742ad

Browse files
feat: TT-208 connect switch btn with ngrx flux
1 parent 17d5acd commit 90742ad

File tree

9 files changed

+174
-25
lines changed

9 files changed

+174
-25
lines changed

src/app/modules/activities-management/components/activity-list/activity-list.component.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import { ActivityState } from './../../store/activity-management.reducers';
66
import { DeleteActivity, SetActivityToEdit } from './../../store/activity-management.actions';
77
import { ActivityListComponent } from './activity-list.component';
88

9-
describe('ActivityListComponent', () => {
9+
fdescribe('ActivityListComponent', () => {
1010
let component: ActivityListComponent;
1111
let fixture: ComponentFixture<ActivityListComponent>;
1212
let store: MockStore<ActivityState>;
1313
let mockActivitiesSelector;
1414

1515
const state = {
16-
data: [{ id: 'id', name: 'name', description: 'description' }],
16+
data: [{ id: 'id', name: 'name', description: 'description', status: 'inactive' }],
1717
isLoading: false,
1818
message: '',
1919
activityIdToEdit: '',

src/app/modules/activities-management/components/activity-list/activity-list.component.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { delay } from 'rxjs/operators';
55
import { getIsLoading } from 'src/app/modules/activities-management/store/activity-management.selectors';
66
import { Activity } from '../../../shared/models';
77
import { allActivities } from '../../store';
8-
import { DeleteActivity, LoadActivities, SetActivityToEdit } from './../../store/activity-management.actions';
8+
import { DeleteActivity, LoadActivities, SetActivityToEdit, UnarchiveActivity } from './../../store/activity-management.actions';
99
import { ActivityState } from './../../store/activity-management.reducers';
1010

1111
@Component({
@@ -34,8 +34,7 @@ export class ActivityListComponent implements OnInit {
3434
}
3535

3636
deleteActivity() {
37-
// this.store.dispatch(new DeleteActivity(this.idToDelete));
38-
console.log('despachado el evento');
37+
this.store.dispatch(new DeleteActivity(this.idToDelete));
3938
this.showModal = false;
4039
}
4140

@@ -47,7 +46,6 @@ export class ActivityListComponent implements OnInit {
4746
this.idToDelete = item.id;
4847
this.message = `Are you sure you want to archive activity ${item.name}?`;
4948
this.showModal = true;
50-
console.log(`Despliegue del modal para id: ${item.id}`);
5149
}
5250

5351
switchStatus(evt: boolean, item: Activity): void {
@@ -57,8 +55,7 @@ export class ActivityListComponent implements OnInit {
5755
this.openModal(item);
5856
} else {
5957
this.showModal = false;
60-
// TODO: dispatch para actualizar la operacion
61-
// this.store.dispatch(new SetToTrueActivity());
58+
this.store.dispatch(new UnarchiveActivity(item.id));
6259
}
6360
}
6461

src/app/modules/activities-management/store/activity-management.actions.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@ describe('LoadActivitiesSuccess', () => {
3939
expect(updateActivityFail.type).toEqual(actions.ActivityManagementActionTypes.UPDATE_ACTIVITY_FAIL);
4040
});
4141

42+
fit('UnarchiveActivity type is ActivityManagementActionTypes.UNARCHIVE_ACTIVITY', () => {
43+
const unarchiveActivity = new actions.UnarchiveActivity('id_test');
44+
expect(unarchiveActivity.type).toEqual(actions.ActivityManagementActionTypes.UNARCHIVE_ACTIVITY);
45+
});
46+
47+
fit('UnarchiveActivitySuccess type is ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_SUCCESS', () => {
48+
const unarchiveActivitySuccess = new actions.UnarchiveActivitySuccess({
49+
id: 'id_test',
50+
status: 'active'
51+
});
52+
expect(unarchiveActivitySuccess.type).toEqual(actions.ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_SUCCESS);
53+
});
54+
55+
fit('UnarchiveActivityFail type is ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_FAIL', () => {
56+
const unarchiveActivityFail = new actions.UnarchiveActivityFail('error');
57+
expect(unarchiveActivityFail.type).toEqual(actions.ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_FAIL);
58+
});
59+
4260
it('SetActivityToEdit type is ActivityManagementActionTypes.SET_ACTIVITY_ID_TO_EDIT', () => {
4361
const setActivityToEdit = new actions.SetActivityToEdit('123');
4462
expect(setActivityToEdit.type).toEqual(actions.ActivityManagementActionTypes.SET_ACTIVITY_ID_TO_EDIT);

src/app/modules/activities-management/store/activity-management.actions.ts

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Action } from '@ngrx/store';
22

3-
import { Activity } from './../../shared/models/activity.model';
3+
import { Activity, Status } from './../../shared/models/activity.model';
44

55
export enum ActivityManagementActionTypes {
66
LOAD_ACTIVITIES = '[ActivityManagement] LOAD_ACTIVITIES',
@@ -15,6 +15,9 @@ export enum ActivityManagementActionTypes {
1515
UPDATE_ACTIVITY = '[ActivityManagement] UPDATE_ACTIVITY',
1616
UPDATE_ACTIVITY_SUCCESS = '[ActivityManagement] UPDATE_ACTIVITY_SUCCESS',
1717
UPDATE_ACTIVITY_FAIL = '[ActivityManagement] UPDATE_ACTIVITY_FAIL',
18+
UNARCHIVE_ACTIVITY = '[ActivityManagement] UNARCHIVE_ACTIVITY',
19+
UNARCHIVE_ACTIVITY_SUCCESS = '[ActivityManagement] UNARCHIVE_ACTIVITY_SUCCESS',
20+
UNARCHIVE_ACTIVITY_FAIL = '[ActivityManagement] UNARCHIVE_ACTIVITY_FAIL',
1821
SET_ACTIVITY_ID_TO_EDIT = '[ActivityManagement] SET_ACTIVITY_ID_TO_EDIT',
1922
RESET_ACTIVITY_ID_TO_EDIT = '[ActivityManagement] RESET_ACTIVITY_ID_TO_EDIT',
2023
}
@@ -26,72 +29,88 @@ export class LoadActivities implements Action {
2629
export class LoadActivitiesSuccess implements Action {
2730
public readonly type = ActivityManagementActionTypes.LOAD_ACTIVITIES_SUCCESS;
2831

29-
constructor(public payload: Activity[]) {}
32+
constructor(public payload: Activity[]) { }
3033
}
3134

3235
export class LoadActivitiesFail implements Action {
3336
public readonly type = ActivityManagementActionTypes.LOAD_ACTIVITIES_FAIL;
3437

35-
constructor(public error: string) {}
38+
constructor(public error: string) { }
3639
}
3740

3841
export class CreateActivity implements Action {
3942
public readonly type = ActivityManagementActionTypes.CREATE_ACTIVITY;
4043

41-
constructor(public payload: Activity) {}
44+
constructor(public payload: Activity) { }
4245
}
4346

4447
export class CreateActivitySuccess implements Action {
4548
public readonly type = ActivityManagementActionTypes.CREATE_ACTIVITY_SUCCESS;
4649

47-
constructor(public payload: Activity) {}
50+
constructor(public payload: Activity) { }
4851
}
4952

5053
export class CreateActivityFail implements Action {
5154
public readonly type = ActivityManagementActionTypes.CREATE_ACTIVITY_FAIL;
5255

53-
constructor(public error: string) {}
56+
constructor(public error: string) { }
5457
}
5558

5659
export class DeleteActivity implements Action {
5760
public readonly type = ActivityManagementActionTypes.DELETE_ACTIVITY;
5861

59-
constructor(public activityId: string) {}
62+
constructor(public activityId: string) { }
6063
}
6164

6265
export class DeleteActivitySuccess implements Action {
6366
public readonly type = ActivityManagementActionTypes.DELETE_ACTIVITY_SUCCESS;
6467

65-
constructor(public activityId: string) {}
68+
constructor(public activityId: string) { }
6669
}
6770

6871
export class DeleteActivityFail implements Action {
6972
public readonly type = ActivityManagementActionTypes.DELETE_ACTIVITY_FAIL;
7073

71-
constructor(public error: string) {}
74+
constructor(public error: string) { }
7275
}
7376
export class UpdateActivity implements Action {
7477
public readonly type = ActivityManagementActionTypes.UPDATE_ACTIVITY;
7578

76-
constructor(public payload: Activity) {}
79+
constructor(public payload: Activity) { }
7780
}
7881

7982
export class UpdateActivitySuccess implements Action {
8083
public readonly type = ActivityManagementActionTypes.UPDATE_ACTIVITY_SUCCESS;
8184

82-
constructor(public payload: Activity) {}
85+
constructor(public payload: Activity) { }
8386
}
8487

8588
export class UpdateActivityFail implements Action {
8689
public readonly type = ActivityManagementActionTypes.UPDATE_ACTIVITY_FAIL;
8790

88-
constructor(public error: string) {}
91+
constructor(public error: string) { }
92+
}
93+
94+
export class UnarchiveActivity implements Action {
95+
public readonly type = ActivityManagementActionTypes.UNARCHIVE_ACTIVITY;
96+
97+
constructor(public payload: string) { }
98+
}
99+
export class UnarchiveActivitySuccess implements Action {
100+
public readonly type = ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_SUCCESS;
101+
102+
constructor(public payload: Status) { }
103+
}
104+
export class UnarchiveActivityFail implements Action {
105+
public readonly type = ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_FAIL;
106+
107+
constructor(public error: string) { }
89108
}
90109

91110
export class SetActivityToEdit implements Action {
92111
public readonly type = ActivityManagementActionTypes.SET_ACTIVITY_ID_TO_EDIT;
93112

94-
constructor(public payload: string) {}
113+
constructor(public payload: string) { }
95114
}
96115

97116
export class ResetActivityToEdit implements Action {
@@ -111,5 +130,8 @@ export type ActivityManagementActions =
111130
| UpdateActivity
112131
| UpdateActivitySuccess
113132
| UpdateActivityFail
133+
| UnarchiveActivity
134+
| UnarchiveActivitySuccess
135+
| UnarchiveActivityFail
114136
| SetActivityToEdit
115137
| ResetActivityToEdit;

src/app/modules/activities-management/store/activity-management.effects.spec.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('ActivityEffects', () => {
1515
let effects: ActivityEffects;
1616
let service: ActivityService;
1717
let toastrService;
18-
const activity: Activity = { id: 'id', name: 'name', description: 'description', tenant_id: 'tenantId' };
18+
const activity: Activity = { id: 'id', name: 'name', description: 'description', tenant_id: 'tenantId', status: 'inactive' };
1919
const activityList: Activity[] = [];
2020

2121
beforeEach(() => {
@@ -77,6 +77,28 @@ describe('ActivityEffects', () => {
7777
});
7878
});
7979

80+
fit('action type is UNARCHIVE_ACTIVITY_SUCCESS when service is executed sucessfully', async () => {
81+
actions$ = of({ type: ActivityManagementActionTypes.UNARCHIVE_ACTIVITY, activity });
82+
spyOn(service, 'updateActivity').and.returnValue(of(activity));
83+
spyOn(toastrService, 'success');
84+
85+
effects.unarchiveActivity$.subscribe((action) => {
86+
expect(toastrService.success).toHaveBeenCalledWith(INFO_SAVED_SUCCESSFULLY);
87+
expect(action.type).toEqual(ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_SUCCESS);
88+
});
89+
});
90+
91+
fit('action type is UNARCHIVE_ACTIVITY_FAIL when service fail in execution', async () => {
92+
actions$ = of({ type: ActivityManagementActionTypes.UNARCHIVE_ACTIVITY, activity });
93+
spyOn(service, 'updateActivity').and.returnValue(throwError({ error: { message: 'fail!' } }));
94+
spyOn(toastrService, 'error');
95+
96+
effects.updateActivity$.subscribe((action) => {
97+
expect(toastrService.error).toHaveBeenCalled();
98+
expect(action.type).toEqual(ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_FAIL);
99+
});
100+
});
101+
80102
it('action type is CREATE_ACTIVITY_SUCCESS when service is executed sucessfully', async () => {
81103
actions$ = of({ type: ActivityManagementActionTypes.CREATE_ACTIVITY, activity });
82104
spyOn(service, 'createActivity').and.returnValue(of(activity));

src/app/modules/activities-management/store/activity-management.effects.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { catchError, map, mergeMap } from 'rxjs/operators';
77
import { ToastrService } from 'ngx-toastr';
88

99
import * as actions from './activity-management.actions';
10-
import { Activity } from './../../shared/models/activity.model';
10+
import { Activity, Status } from './../../shared/models/activity.model';
1111
import { ActivityService } from './../services/activity.service';
1212

1313
@Injectable()
@@ -87,4 +87,26 @@ export class ActivityEffects {
8787
)
8888
)
8989
);
90+
91+
@Effect()
92+
unarchiveActivity$: Observable<Action> = this.actions$.pipe(
93+
ofType(actions.ActivityManagementActionTypes.UNARCHIVE_ACTIVITY),
94+
map((action: actions.UnarchiveActivity) => ({
95+
id: action.payload,
96+
status: 'active'
97+
})
98+
),
99+
mergeMap((activity: Status) =>
100+
this.activityService.updateActivity(activity).pipe(
101+
map((activityData) => {
102+
this.toastrService.success(INFO_SAVED_SUCCESSFULLY);
103+
return new actions.UnarchiveActivitySuccess(activityData);
104+
}),
105+
catchError((error) => {
106+
this.toastrService.error(error.error.message);
107+
return of(new actions.UnarchiveActivityFail(error));
108+
})
109+
)
110+
)
111+
);
90112
}

src/app/modules/activities-management/store/activity-management.reducers.spec.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { Activity } from './../../shared/models/activity.model';
1+
import { Activity, Status } from './../../shared/models/activity.model';
22
import * as actions from './activity-management.actions';
33
import { activityManagementReducer, ActivityState } from './activity-management.reducers';
44

55
describe('activityManagementReducer', () => {
66
const initialState: ActivityState = { data: [], isLoading: false, message: '', activityIdToEdit: '' };
7-
const activity: Activity = { id: '1', name: 'Training', description: 'It is good for learning' };
7+
const activity: Activity = { id: '1', name: 'Training', description: 'It is good for learning', status: 'inactive' };
88

99
it('on LoadActivities, isLoading is true', () => {
1010
const action = new actions.LoadActivities();
@@ -112,6 +112,38 @@ describe('activityManagementReducer', () => {
112112
expect(state.isLoading).toEqual(false);
113113
});
114114

115+
116+
fit('on UnarchiveActivity, isLoading is true', () => {
117+
const action = new actions.UnarchiveActivity('id_test');
118+
119+
const state = activityManagementReducer(initialState, action);
120+
121+
expect(state.isLoading).toBeTrue();
122+
});
123+
124+
fit('on UnarchiveActivitySuccess, status activity is change to \"active\" in the store', () => {
125+
const currentState: ActivityState = { data: [activity], isLoading: false, message: '', activityIdToEdit: '1' };
126+
const activityEdited: Status = { id: '1', status: 'active' };
127+
const expectedActivity: Activity = { id: '1', name: 'Training', description: 'It is good for learning', status: 'active' };
128+
129+
const action = new actions.UnarchiveActivitySuccess(activityEdited);
130+
131+
const state = activityManagementReducer(currentState, action);
132+
console.log(state.data);
133+
134+
expect(state.data).toEqual([expectedActivity]);
135+
expect(state.isLoading).toBeFalse();
136+
});
137+
138+
fit('on UnarchiveActivityFail, message equal to \"Something went wrong unarchiving activities!\"', () => {
139+
const action = new actions.UnarchiveActivityFail('error');
140+
141+
const state = activityManagementReducer(initialState, action);
142+
143+
expect(state.message).toEqual('Something went wrong unarchiving activities!');
144+
expect(state.isLoading).toBeFalse();
145+
});
146+
115147
it('on SetActivityToEdit, should save the activityId to edit', () => {
116148
const action = new actions.SetActivityToEdit(activity.id);
117149

src/app/modules/activities-management/store/activity-management.reducers.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,37 @@ export function activityManagementReducer(state: ActivityState = initialState, a
118118
};
119119
}
120120

121+
case ActivityManagementActionTypes.UNARCHIVE_ACTIVITY: {
122+
return {
123+
...state,
124+
isLoading: true,
125+
message: 'Set activityIdToUnarchive property',
126+
activityIdToEdit: action.payload,
127+
};
128+
}
129+
130+
case ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_SUCCESS: {
131+
const index = activityList.findIndex((activity) => activity.id === action.payload.id);
132+
activityList[index] = { ...activityList[index], ...action.payload };
133+
134+
return {
135+
...state,
136+
data: activityList,
137+
isLoading: false,
138+
message: 'Unarchive activity successfully!',
139+
activityIdToEdit: '',
140+
};
141+
}
142+
143+
case ActivityManagementActionTypes.UNARCHIVE_ACTIVITY_FAIL: {
144+
return {
145+
...state,
146+
isLoading: false,
147+
message: 'Something went wrong unarchiving activities!',
148+
activityIdToEdit: '',
149+
};
150+
}
151+
121152
case ActivityManagementActionTypes.SET_ACTIVITY_ID_TO_EDIT: {
122153
return {
123154
...state,

src/app/modules/shared/models/activity.model.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@ export interface Activity {
55
tenant_id?: string;
66
status?: string;
77
}
8+
9+
export interface Status {
10+
id: string;
11+
status: string;
12+
}

0 commit comments

Comments
 (0)