Skip to content

Commit 81a853c

Browse files
authored
Merge pull request #81 from ioet/67-deletee-activities
closes #67
2 parents f933cea + e330c6c commit 81a853c

File tree

8 files changed

+94
-3
lines changed

8 files changed

+94
-3
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ <h2 class="mb-0">
1010
</a>
1111
<div class="btn-group float-right" role="group">
1212
<i class="far fa-edit btn btn-link text-white"></i>
13-
<i class="far fa-trash-alt btn btn-link text-white"></i>
13+
<i (click)="deleteActivity(activity.id)" class="far fa-trash-alt btn btn-link text-white"></i>
1414
</div>
1515
</h2>
1616
</div>

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Input, OnInit } from '@angular/core';
22
import { Component } from '@angular/core';
33
import { Store, select } from '@ngrx/store';
44

5-
import { LoadActivities } from './../../store/activity-management.actions';
5+
import { LoadActivities, DeleteActivity } from './../../store/activity-management.actions';
66
import { ActivityState } from './../../store/activity-management.reducers';
77
import { allActivities } from '../../store';
88
import { Activity } from '../../../shared/models';
@@ -27,4 +27,8 @@ export class ActivityListComponent implements OnInit {
2727
this.activities = response.data;
2828
});
2929
}
30+
31+
deleteActivity(activityId: string) {
32+
this.store.dispatch(new DeleteActivity(activityId));
33+
}
3034
}

src/app/modules/activities-management/services/activity.service.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,14 @@ describe('Activity Service', () => {
5454
expect(createActivitiesRequest.request.method).toBe('POST');
5555
createActivitiesRequest.flush(activity);
5656
});
57+
58+
it('activities are delete using DELETE from baseUrl', () => {
59+
const url = `${service.baseUrl}/1`;
60+
service.deleteActivity(activities[0].id).subscribe((activitiesInResponse) => {
61+
expect(activitiesInResponse.filter((activity) => activity.id !== activities[0].id)).toEqual([activities[1]]);
62+
});
63+
const getActivitiesRequest = httpMock.expectOne(url);
64+
expect(getActivitiesRequest.request.method).toBe('DELETE');
65+
getActivitiesRequest.flush(activities);
66+
});
5767
});

src/app/modules/activities-management/services/activity.service.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,9 @@ export class ActivityService {
2525

2626
return this.http.post(this.baseUrl, body);
2727
}
28+
29+
deleteActivity(acitivityId: string): Observable<any> {
30+
const url = `${this.baseUrl}/${acitivityId}`;
31+
return this.http.delete(url);
32+
}
2833
}

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ export enum ActivityManagementActionTypes {
99
CREATE_ACTIVITY = '[ActivityManagement] CREATE_ACTIVITY',
1010
CREATE_ACTIVITY_SUCCESS = '[ActivityManagement] CREATE_ACTIVITY_SUCCESS',
1111
CREATE_ACTIVITY_FAIL = '[ActivityManagement] CREATE_ACTIVITY_FAIL',
12+
DELETE_ACTIVITY = '[ActivityManagement] DELETE_ACTIVITY',
13+
DELETE_ACTIVITY_SUCCESS = '[ActivityManagement] DELETE_ACTIVITY_SUCESS',
14+
DELETE_ACTIVITY_FAIL = '[ActivityManagement] DELETE_ACTIVITY_FAIL',
1215
}
1316

1417
export class LoadActivities implements Action {
@@ -45,10 +48,31 @@ export class CreateActivityFail implements Action {
4548
constructor(public error: string) {}
4649
}
4750

51+
export class DeleteActivity implements Action {
52+
public readonly type = ActivityManagementActionTypes.DELETE_ACTIVITY;
53+
54+
constructor(public activityId: string) {}
55+
}
56+
57+
export class DeleteActivitySuccess implements Action {
58+
public readonly type = ActivityManagementActionTypes.DELETE_ACTIVITY_SUCCESS;
59+
60+
constructor(public activityId: string) {}
61+
}
62+
63+
export class DeleteActivityFail implements Action {
64+
public readonly type = ActivityManagementActionTypes.DELETE_ACTIVITY_FAIL;
65+
66+
constructor(public error: string) {}
67+
}
68+
4869
export type ActivityManagementActions =
4970
| LoadActivities
5071
| LoadActivitiesSuccess
5172
| LoadActivitiesFail
5273
| CreateActivity
5374
| CreateActivitySuccess
54-
| CreateActivityFail;
75+
| CreateActivityFail
76+
| DeleteActivity
77+
| DeleteActivitySuccess
78+
| DeleteActivityFail;

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,18 @@ export class ActivityEffects {
3838
)
3939
)
4040
);
41+
42+
@Effect()
43+
deleteActivity$: Observable<Action> = this.actions$.pipe(
44+
ofType(actions.ActivityManagementActionTypes.DELETE_ACTIVITY),
45+
map((action: actions.DeleteActivity) => action.activityId),
46+
mergeMap((activityId) =>
47+
this.activityService.deleteActivity(activityId).pipe(
48+
map(() => {
49+
return new actions.DeleteActivitySuccess(activityId);
50+
}),
51+
catchError((error) => of(new actions.DeleteActivityFail(error)))
52+
)
53+
)
54+
);
4155
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
CreateActivitySuccess,
66
CreateActivityFail,
77
CreateActivity,
8+
DeleteActivity,
9+
DeleteActivitySuccess,
810
} from './activity-management.actions';
911
import { LoadActivitiesSuccess } from './activity-management.actions';
1012
import { activityManagementReducer, ActivityState } from './activity-management.reducers';
@@ -63,4 +65,13 @@ describe('activityManagementReducer', () => {
6365
expect(state.message).toEqual('Something went wrong creating activities!');
6466
expect(state.isLoading).toEqual(false);
6567
});
68+
69+
it('on DeleteActivity, message equal to Activity removed successfully!', () => {
70+
const activityToDeleteId = '1';
71+
const action = new DeleteActivitySuccess(activityToDeleteId);
72+
73+
const state = activityManagementReducer(initialState, action);
74+
75+
expect(state.message).toEqual('Activity removed successfully!');
76+
});
6677
});

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,29 @@ export function activityManagementReducer(state: ActivityState = initialState, a
5656
message: 'Something went wrong creating activities!',
5757
};
5858
}
59+
case ActivityManagementActionTypes.DELETE_ACTIVITY: {
60+
return {
61+
...state,
62+
isLoading: true,
63+
};
64+
}
65+
66+
case ActivityManagementActionTypes.DELETE_ACTIVITY_SUCCESS: {
67+
const activites = state.data.filter((activity) => activity.id !== action.activityId);
68+
return {
69+
data: activites,
70+
isLoading: false,
71+
message: 'Activity removed successfully!',
72+
};
73+
}
74+
75+
case ActivityManagementActionTypes.DELETE_ACTIVITY_FAIL: {
76+
return {
77+
data: [],
78+
isLoading: false,
79+
message: 'Something went wrong deleting activity!',
80+
};
81+
}
5982
default:
6083
return state;
6184
}

0 commit comments

Comments
 (0)