Skip to content

Commit d604e4c

Browse files
Feature/dashboard new events (#293)
* Dashboard new events * Fix some translations * Added nwe tests & events & fixes * Fix tests * Add sum function * small fix Co-authored-by: Sandor Ban <[email protected]>
1 parent 02a7384 commit d604e4c

18 files changed

+412
-36
lines changed

src/app/_constants/api.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ export const API_ROUTE_DASHBOARD_NEW_CASES = {
131131
GET_ALL: 'dashboard/newCases/indexList',
132132
};
133133

134+
export const API_ROUTE_DASHBOARD_NEW_EVENTS = {
135+
ENDPOINT: 'dashboard/newEvents',
136+
GET_ALL: 'dashboard/newEvents',
137+
};
138+
139+
export const API_ROUTE_DASHBOARD_TEST_RESULTS = {
140+
ENDPOINT: 'dashboard/testResults',
141+
GET_ALL: 'dashboard/testResults',
142+
};
143+
134144
export const API_ROUTE_REGIONS = {
135145
ENDPOINT: 'regions',
136146
GET_ALL: 'regions/indexList',
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/* eslint-disable no-param-reassign */
2+
import { Serializer } from './base.serializer';
3+
import { deserializeDates, serializeDates } from './date-parse';
4+
5+
export class DashboardNewEventsSerializer implements Serializer {
6+
fromJson(json: any): any {
7+
json.id = json.id ?? json.uuid;
8+
deserializeDates(json);
9+
return json;
10+
}
11+
12+
toJson(item: any): any {
13+
serializeDates(item);
14+
return item;
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/* eslint-disable no-param-reassign */
2+
import { Serializer } from './base.serializer';
3+
import { deserializeDates, serializeDates } from './date-parse';
4+
5+
export class DashboardTestResultsSerializer implements Serializer {
6+
fromJson(json: any): any {
7+
json.id = json.id ?? json.uuid;
8+
deserializeDates(json);
9+
return json;
10+
}
11+
12+
toJson(item: any): any {
13+
serializeDates(item);
14+
return item;
15+
}
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Injectable } from '@angular/core';
2+
import { HttpClient } from '@angular/common/http';
3+
import * as constants from '../../app.constants';
4+
import { HelperService } from '../helper.service';
5+
import { DashboardService } from './dashboard.service';
6+
import { DashboardNewEventsSerializer } from '../../_serializers/dashboard-new-events.serializer';
7+
8+
@Injectable({
9+
providedIn: 'root',
10+
})
11+
export class DashboardNewEventsService extends DashboardService {
12+
constructor(protected httpClient: HttpClient, protected helperService: HelperService) {
13+
super(
14+
httpClient,
15+
helperService,
16+
'',
17+
constants.API_ROUTE_DASHBOARD_NEW_EVENTS,
18+
new DashboardNewEventsSerializer()
19+
);
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Injectable } from '@angular/core';
2+
import { HttpClient } from '@angular/common/http';
3+
import * as constants from '../../app.constants';
4+
import { HelperService } from '../helper.service';
5+
import { DashboardService } from './dashboard.service';
6+
import { DashboardTestResultsSerializer } from '../../_serializers/dashboard-test-results.serializer';
7+
8+
@Injectable({
9+
providedIn: 'root',
10+
})
11+
export class DashboardTestResultsService extends DashboardService {
12+
constructor(protected httpClient: HttpClient, protected helperService: HelperService) {
13+
super(
14+
httpClient,
15+
helperService,
16+
'',
17+
constants.API_ROUTE_DASHBOARD_TEST_RESULTS,
18+
new DashboardTestResultsSerializer()
19+
);
20+
}
21+
}

src/app/_services/api/dashboard.service.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,12 @@ export class DashboardService {
2828
endpoint = this.endpoint.GET_ALL;
2929
}
3030

31-
const requestPayload: any = { criteria: {} };
32-
33-
// filters
34-
if (typeof filters !== 'undefined' && filters !== null) {
35-
requestPayload.criteria = {};
36-
if (!filters.length) {
37-
requestPayload.criteria = {};
38-
}
31+
const requestPayload: any = {};
32+
33+
if (filters.length) {
34+
requestPayload.disease = 'CORONAVIRUS'; // TODO: DELETE THIS WHEN DISEASE SELECTION IS IMPLEMENTED
3935
filters.forEach((filter: any) => {
40-
requestPayload.criteria[filter.field] = filter.value;
36+
requestPayload[filter.field] = filter.value;
4137
});
4238
}
4339

src/app/dashboard/components/dashboard-new-cases/dashboard-new-cases.component.html

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,83 @@
11
<div class="dashboard-new-cases" *ngIf="newCases">
22
<h1>
3-
<span class="nr-of-cases">{{ newCases.caseCount }}</span> New Cases
3+
<span class="nr-of-cases">{{ newCases.newCases || 0 }}</span>
4+
{{ 'captions.dashboardNewCases' | translate }}
45
</h1>
56
<div class="cases-container">
67
<div class="case-types">
78
<div class="row not-classified">
8-
<div class="number">{{ newCases.caseNotClassifiedCount }}</div>
9+
<div class="number">{{ newCases.caseClassificationCount?.NOT_CLASSIFIED || 0 }}</div>
910
<div class="icon"><mat-icon class="material-icons-round">cached</mat-icon></div>
1011
<div class="text">{{ 'captions.dashboardNotYetClassified' | translate }}</div>
1112
</div>
1213
<div class="row suspect">
13-
<div class="number">{{ newCases.caseSuspectCount }}</div>
14+
<div class="number">{{ newCases.caseClassificationCount?.SUSPECT || 0 }}</div>
1415
<div class="icon"><mat-icon class="material-icons-round">person_search</mat-icon></div>
1516
<div class="text">{{ 'captions.dashboardSuspect' | translate }}</div>
1617
</div>
1718
<div class="row probable">
18-
<div class="number">{{ newCases.caseProbableCount }}</div>
19+
<div class="number">{{ newCases.caseClassificationCount?.PROBABLE || 0 }}</div>
1920
<div class="icon"><mat-icon class="material-icons-round">queue</mat-icon></div>
2021
<div class="text">{{ 'captions.dashboardProbable' | translate }}</div>
2122
</div>
2223
<div class="row confirmed">
23-
<div class="number">{{ newCases.caseConfirmedCount }}</div>
24+
<div class="number">{{ newCases.caseClassificationCount?.CONFIRMED || 0 }}</div>
2425
<div class="icon"><mat-icon class="material-icons-round">new_releases</mat-icon></div>
2526
<div class="text">{{ 'captions.dashboardConfirmed' | translate }}</div>
2627
</div>
2728
<div class="row confirmed-asymptomatic">
28-
<div class="number">{{ newCases.caseConfirmedAsymptomaticCount }}</div>
29+
<div class="number">{{ newCases.caseClassificationCount?.CONFIRMED_NO_SYMPTOMS || 0 }}</div>
2930
<div class="icon">
3031
<mat-icon class="material-icons-round">sentiment_satisfied_alt</mat-icon>
3132
</div>
3233
<div class="text">{{ 'captions.dashboardConfirmedNoSymptoms' | translate }}</div>
3334
</div>
3435
<div class="row confirmed-unknown">
35-
<div class="number">{{ newCases.caseConfirmedUnkownSymptomsCount }}</div>
36+
<div class="number">
37+
{{ newCases.caseClassificationCount?.CONFIRMED_UNKNOWN_SYMPTOMS || 0 }}
38+
</div>
3639
<div class="icon"><mat-icon class="material-icons-round">sick</mat-icon></div>
3740
<div class="text">{{ 'captions.dashboardConfirmedUnknownSymptoms' | translate }}</div>
3841
</div>
3942
<div class="row not-case">
40-
<div class="number">{{ newCases.notCaseCount }}</div>
43+
<div class="number">{{ newCases.caseClassificationCount?.NO_CASE || 0 }}</div>
4144
<div class="icon"><mat-icon class="material-icons-round">how_to_reg</mat-icon></div>
4245
<div class="text">{{ 'captions.dashboardNotACase' | translate }}</div>
4346
</div>
4447
</div>
4548
<div class="case-data">
46-
<div [ngClass]="['fatalities', newCases.fatalities === 0 ? 'no-fatalities' : '']">
49+
<div [ngClass]="['fatalities', newCases.fatalityCount === 0 ? 'no-fatalities' : '']">
4750
{{ 'strings.headingFatalities' | translate }}
4851
<span class="value">
4952
<mat-icon class="material-icons-round">keyboard_arrow_up</mat-icon
50-
>{{ newCases.fatalities }}</span
53+
>{{ newCases.fatalityCount || 0 }}</span
5154
>
5255
<br />{{ 'dashboard.newCase.rate' | translate }}
53-
<span class="value">{{ newCases.fatalitiesPercent }}</span>
56+
<span class="value">{{ newCases.fatalityRate || 0 }}</span>
5457
</div>
5558
<div class="districts">
5659
{{ 'strings.headingOutbreakDistricts' | translate }}
57-
<span class="value">{{ newCases.outbreakDistictCount }}</span>
60+
<span class="value">{{ newCases.outbreakDistrictCount || 0 }}</span>
5861
</div>
5962
<div class="row">
6063
{{ 'strings.headingCasesInQuarantine' | translate }}
61-
<span class="value">{{ newCases.casesInQuarantineCount }}</span>
64+
<span class="value">{{ newCases.quarantineCaseCount || 0 }}</span>
6265
</div>
6366
<div class="row">
6467
{{ 'strings.headingCasesPlacedInQuarantine' | translate }}
65-
<span class="value">{{ newCases.casesPlacedInQuarantineCount }}</span>
68+
<span class="value">{{ newCases.quarantinePlacedCaseCount || 0 }}</span>
6669
</div>
6770
<div class="row">
6871
{{ 'dashboard.newCase.casesWithDefinition' | translate }}
69-
<span class="value">{{ newCases.casesWithReferenceFulfilledCount }}</span>
72+
<span class="value">{{ newCases.referenceDefinitionFulfilledCaseCount || 0 }}</span>
7073
</div>
7174
<div class="row cases-resulting">
7275
{{ 'strings.headingCasesResultingFromContacts' | translate }}
73-
<span class="value">{{ newCases.casesResultFromContactsCount }}</span>
76+
<span class="value">{{ newCases.contactResultingCaseCount || 0 }}</span>
7477
</div>
7578
<div class="last-reported-district">
7679
<span class="hint">{{ 'strings.headingLastReportedDistrict' | translate }}</span>
77-
{{ newCases.lastReportedDistrictName }}
80+
{{ newCases.lastReportedDistrict || '' }}
7881
</div>
7982
</div>
8083
</div>

src/app/dashboard/components/dashboard-new-cases/dashboard-new-cases.component.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
.number {
4343
flex: 15%;
4444
text-align: right;
45+
font-weight: 500;
4546
}
4647
.icon {
4748
flex: 8%;
Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,37 @@
1-
<p>dashboard-new-events works!</p>
1+
<div class="dashboard-new-events" *ngIf="newEvents">
2+
<h1>
3+
<span class="nr-of-events">{{ sumEvents }}</span>
4+
{{ 'captions.dashboardNewEvents' | translate }}
5+
</h1>
6+
<div class="events-container">
7+
<div class="event-types">
8+
<div class="row cluster">
9+
<div class="number">{{ newEvents.CLUSTER || 0 }}</div>
10+
<div class="icon"><mat-icon class="material-icons-round">grain</mat-icon></div>
11+
<div class="text">{{ 'enum.EventStatus.CLUSTER' | translate }}</div>
12+
</div>
13+
<div class="row event">
14+
<div class="number">{{ newEvents.EVENT || 0 }}</div>
15+
<div class="icon"><mat-icon class="material-icons-round">warning</mat-icon></div>
16+
<div class="text">{{ 'enum.EventStatus.EVENT' | translate }}</div>
17+
</div>
18+
<div class="row signal">
19+
<div class="number">{{ newEvents.SIGNAL || 0 }}</div>
20+
<div class="icon"><mat-icon class="material-icons-round">wifi_tethering</mat-icon></div>
21+
<div class="text">{{ 'enum.EventStatus.SIGNAL' | translate }}</div>
22+
</div>
23+
<div class="row screening">
24+
<div class="number">{{ newEvents.SCREENING || 0 }}</div>
25+
<div class="icon"><mat-icon class="material-icons-round">travel_explore</mat-icon></div>
26+
<div class="text">{{ 'enum.EventStatus.SCREENING' | translate }}</div>
27+
</div>
28+
<div class="row dropped">
29+
<div class="number">{{ newEvents.DROPPED || 0 }}</div>
30+
<div class="icon">
31+
<mat-icon class="material-icons-round">disabled_by_default</mat-icon>
32+
</div>
33+
<div class="text">{{ 'enum.EventStatus.DROPPED' | translate }}</div>
34+
</div>
35+
</div>
36+
</div>
37+
</div>
Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,62 @@
1-
/* stylelint-disable */
1+
@use '../../../../variables.scss' as *;
2+
3+
.dashboard-new-events {
4+
margin: 8px;
5+
h1 {
6+
color: map-get($sormas-accent, 500);
7+
font-weight: 500;
8+
.nr-of-events {
9+
color: map-get($sormas-accent, 800);
10+
}
11+
}
12+
.events-container {
13+
.event-types {
14+
.row {
15+
display: block;
16+
text-align: center;
17+
border-bottom: solid 1px map-get($sormas-accent, 200);
18+
margin-top: 10px;
19+
&.cluster {
20+
color: map-get($sormas-alert, 700);
21+
}
22+
&.event {
23+
color: map-get($sormas-warning, 700);
24+
}
25+
&.signal {
26+
color: map-get($sormas-alert, 300);
27+
}
28+
&.screening {
29+
color: map-get($sormas-primary, 500);
30+
}
31+
&.dropped {
32+
color: map-get($sormas-accent, 500);
33+
}
34+
.number {
35+
display: inline-block;
36+
text-align: right;
37+
font-weight: 500;
38+
min-width: 30px;
39+
}
40+
.icon {
41+
display: inline-block;
42+
padding-left: 5px;
43+
text-align: center;
44+
min-width: 30px;
45+
.mat-icon {
46+
height: 16px;
47+
font-size: 16px;
48+
position: relative;
49+
top: 2px;
50+
}
51+
}
52+
.text {
53+
display: inline-block;
54+
color: map-get($sormas-accent, 600) !important;
55+
font-weight: 500;
56+
min-width: 80px;
57+
text-align: left;
58+
}
59+
}
60+
}
61+
}
62+
}

src/app/dashboard/components/dashboard-new-events/dashboard-new-events.component.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import { HttpClientTestingModule } from '@angular/common/http/testing';
12
import { ComponentFixture, TestBed } from '@angular/core/testing';
3+
import { MatDialogModule } from '@angular/material/dialog';
4+
import { TranslateModule } from '@ngx-translate/core';
25

36
import { DashboardNewEventsComponent } from './dashboard-new-events.component';
47

@@ -9,6 +12,7 @@ describe('DashboardNewEventsComponent', () => {
912
beforeEach(async () => {
1013
await TestBed.configureTestingModule({
1114
declarations: [DashboardNewEventsComponent],
15+
imports: [HttpClientTestingModule, TranslateModule.forRoot(), MatDialogModule],
1216
}).compileComponents();
1317
});
1418

0 commit comments

Comments
 (0)