Skip to content

Commit 3e7f631

Browse files
authored
Merge pull request #477 from ioet/452-spinner-on-loading-data
feat: closes #452 loading bar when loading data
2 parents e09b3f4 + a2ff91e commit 3e7f631

File tree

40 files changed

+658
-488
lines changed

40 files changed

+658
-488
lines changed

src/app/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import { InputDateComponent } from './modules/shared/components/input-date/input
6767
import { TimeRangeFormComponent } from './modules/reports/components/time-range-form/time-range-form.component';
6868
import { TimeEntriesTableComponent } from './modules/reports/components/time-entries-table/time-entries-table.component';
6969
import { DialogComponent } from './modules/shared/components/dialog/dialog.component';
70+
import { LoadingBarComponent } from './modules/shared/components/loading-bar/loading-bar.component';
7071

7172
const maskConfig: Partial<IConfig> = {
7273
validation: false,
@@ -114,6 +115,7 @@ const maskConfig: Partial<IConfig> = {
114115
TimeRangeFormComponent,
115116
TimeEntriesTableComponent,
116117
DialogComponent,
118+
LoadingBarComponent
117119
],
118120
imports: [
119121
NgxMaskModule.forRoot(maskConfig),

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@
66
<th class="col-3 text-center"></th>
77
</tr>
88
</thead>
9-
<tbody>
9+
<app-loading-bar *ngIf="(isLoading$ | async)"></app-loading-bar>
10+
<tbody *ngIf="(isLoading$ | async) === false">
1011
<tr class="d-flex" *ngFor="let activity of activities">
1112
<td class="col-sm-9">{{ activity.name }}</td>
1213
<td class="col-sm-3 text-center">
13-
<button type="button" class="btn btn-sm btn-primary" (click)="updateActivity(activity.id)">
14+
<button
15+
type="button"
16+
class="btn btn-sm btn-primary"
17+
(click)="updateActivity(activity.id)"
18+
>
1419
<i class="fa fa-pencil fa-xs"></i>
1520
</button>
1621
<button

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { OnInit } from '@angular/core';
2-
import { Component } from '@angular/core';
3-
import { Store, select } from '@ngrx/store';
4-
5-
import { LoadActivities, DeleteActivity, SetActivityToEdit } from './../../store/activity-management.actions';
6-
import { ActivityState } from './../../store/activity-management.reducers';
7-
import { allActivities } from '../../store';
1+
import { Component, OnInit } from '@angular/core';
2+
import { select, Store } from '@ngrx/store';
3+
import { Observable } from 'rxjs';
4+
import { delay } from 'rxjs/operators';
5+
import { getIsLoading } from 'src/app/modules/activities-management/store/activity-management.selectors';
86
import { Activity } from '../../../shared/models';
7+
import { allActivities } from '../../store';
8+
import { DeleteActivity, LoadActivities, SetActivityToEdit } from './../../store/activity-management.actions';
9+
import { ActivityState } from './../../store/activity-management.reducers';
10+
911

1012
@Component({
1113
selector: 'app-activity-list',
@@ -18,7 +20,10 @@ export class ActivityListComponent implements OnInit {
1820
activityToDelete: Activity;
1921
message: string;
2022
idToDelete: string;
21-
constructor(private store: Store<ActivityState>) {}
23+
isLoading$: Observable<boolean>;
24+
constructor(private store: Store<ActivityState>) {
25+
this.isLoading$ = store.pipe(delay(0), select(getIsLoading));
26+
}
2227

2328
ngOnInit() {
2429
this.store.dispatch(new LoadActivities());

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
ActivityState,
88
CreateActivity,
99
UpdateActivity,
10-
activityIdtoEdit,
10+
activityIdToEdit,
1111
allActivities,
1212
ResetActivityToEdit,
1313
} from '../../store';
@@ -74,7 +74,7 @@ describe('CreateActivityComponent', () => {
7474
activityIdToEdit: '1',
7575
};
7676

77-
activityIdtoEditMock = store.overrideSelector(activityIdtoEdit, currentState.activityIdToEdit);
77+
activityIdtoEditMock = store.overrideSelector(activityIdToEdit, currentState.activityIdToEdit);
7878
allActivitiesMock = store.overrideSelector(allActivities, currentState.data);
7979
getActivityByIdMock = store.overrideSelector(allActivitiesMock, activityIdtoEditMock);
8080

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ export function activityManagementReducer(state: ActivityState = initialState, a
7171
}
7272

7373
case ActivityManagementActionTypes.DELETE_ACTIVITY_SUCCESS: {
74-
const activites = state.data.filter((activity) => activity.id !== action.activityId);
74+
const activities = state.data.filter((activity) => activity.id !== action.activityId);
7575
return {
7676
...state,
77-
data: activites,
77+
data: activities,
7878
isLoading: false,
7979
message: 'Activity removed successfully!',
8080
};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ describe('ActivityManagement Selectors', () => {
44

55
it('reads activityIdtoEdit from state', () => {
66
const activityId = 'id';
7-
const activityIdFound = selectors.activityIdtoEdit.projector({ activityIdToEdit: activityId });
7+
const activityIdFound = selectors.activityIdToEdit.projector({ activityIdToEdit: activityId });
88
expect(activityIdFound).toBe(activityId);
99
});
1010

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
import { createFeatureSelector, createSelector } from '@ngrx/store';
2-
32
import { ActivityState } from './activity-management.reducers';
43

54
const getActivityState = createFeatureSelector<ActivityState>('activities');
65

7-
export const allActivities = createSelector(getActivityState, (state: ActivityState) => {
8-
return state.data;
9-
});
6+
export const allActivities = createSelector(getActivityState, (state: ActivityState) => state?.data);
107

11-
export const activityIdtoEdit = createSelector(getActivityState, (state: ActivityState) => {
12-
return state.activityIdToEdit;
13-
});
8+
export const activityIdToEdit = createSelector(getActivityState, (state: ActivityState) => state?.activityIdToEdit);
149

15-
export const getActivityById = createSelector(allActivities, activityIdtoEdit, (activities, activityId) => {
10+
export const getActivityById = createSelector(allActivities, activityIdToEdit, (activities, activityId) => {
1611
if (activities && activityId) {
1712
return activities.find((activity) => {
1813
return activity.id === activityId;
1914
});
2015
}
2116
});
17+
18+
export const getIsLoading = createSelector(getActivityState, (state: ActivityState) => state?.isLoading);

src/app/modules/customer-management/components/customer-info/components/customer-list/customer-list.component.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@
1111
<th class="col-3 text-center">Options</th>
1212
</tr>
1313
</thead>
14-
<tbody>
14+
<app-loading-bar *ngIf="(isLoading$ | async)"></app-loading-bar>
15+
<tbody *ngIf="((isLoading$ | async) === false)">
1516
<tr class="d-flex" *ngFor="let customer of customers">
1617
<td class="col-sm-9">{{ customer.name }}</td>
1718
<td class="col-sm-3 text-center">
18-
<button (click)="editCustomer(customer.id)" type="button" class="btn btn-sm btn-primary">
19+
<button
20+
(click)="editCustomer(customer.id)"
21+
type="button"
22+
class="btn btn-sm btn-primary"
23+
>
1924
<i class="fa fa-pencil fa-xs"></i>
2025
</button>
2126
<button

src/app/modules/customer-management/components/customer-info/components/customer-list/customer-list.component.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import {Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, AfterViewInit} from '@angular/core';
2-
import {ActionsSubject, Store} from '@ngrx/store';
3-
4-
import {Subject, Subscription} from 'rxjs';
1+
import { AfterViewInit, Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
2+
import { ActionsSubject, select, Store } from '@ngrx/store';
3+
import { DataTableDirective } from 'angular-datatables';
4+
import { Observable, Subject, Subscription } from 'rxjs';
5+
import { delay, filter } from 'rxjs/operators';
6+
import { getIsLoading } from 'src/app/modules/customer-management/store/customer-management.selectors';
7+
import { Customer } from './../../../../../shared/models/customer.model';
58
import {
69
CustomerManagementActionTypes,
710
DeleteCustomer,
811
LoadCustomers,
912
SetCustomerToEdit
1013
} from './../../../../store/customer-management.actions';
11-
import {Customer} from './../../../../../shared/models/customer.model';
12-
import {filter} from 'rxjs/operators';
13-
import {DataTableDirective} from 'angular-datatables';
14-
1514
@Component({
1615
selector: 'app-customer-list',
1716
templateUrl: './customer-list.component.html',
@@ -32,8 +31,11 @@ export class CustomerListComponent implements OnInit, OnDestroy, AfterViewInit {
3231
showModal = false;
3332
idToDelete: string;
3433
message: string;
34+
isLoading$: Observable<boolean>;
3535

36-
constructor(private store: Store<Customer>, private actionsSubject$: ActionsSubject) { }
36+
constructor(private store: Store<Customer>, private actionsSubject$: ActionsSubject) {
37+
this.isLoading$ = store.pipe(delay(0), select(getIsLoading));
38+
}
3739

3840
ngOnInit(): void {
3941
this.dtOptions = {
Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
import { createFeatureSelector, createSelector } from '@ngrx/store';
2-
32
import { ProjectState } from './project.reducer';
43

54
const getProjectState = createFeatureSelector<ProjectState>('projects');
65

7-
export const getCustomerProjects = createSelector(getProjectState, (state: ProjectState) => {
8-
return state;
9-
});
6+
export const getCustomerProjects = createSelector(getProjectState, (state: ProjectState) => state);
7+
8+
export const getProjects = createSelector(getProjectState, (state: ProjectState) => state?.projects);
109

11-
export const getProjects = createSelector(getProjectState, (state: ProjectState) => {
12-
return state.projects;
13-
});
10+
export const getProjectToEdit = createSelector(getProjectState, (state: ProjectState) => state?.projectToEdit);
1411

15-
export const getProjectToEdit = createSelector(getProjectState, (state: ProjectState) => {
16-
return state.projectToEdit;
17-
});
12+
export const getIsLoading = createSelector(getProjectState, (state: ProjectState) => state?.isLoading);

0 commit comments

Comments
 (0)