Skip to content

Commit ae9d0c7

Browse files
authored
Fix/analytics (#487)
* fix(analytics): fixed analytics * fix(preprint): added link to provider name and image * fix(files): fixed download folder
1 parent 236b00e commit ae9d0c7

File tree

18 files changed

+173
-136
lines changed

18 files changed

+173
-136
lines changed

src/app/features/analytics/analytics.component.html

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -42,45 +42,49 @@
4242
</div>
4343
}
4444

45-
<div class="flex flex-column flex-wrap gap-4 xl:flex-row" [class]="{ disabled: isMetricsError() }">
46-
<osf-line-chart
47-
class="chart"
48-
[class.xl-half-width]="IS_X_LARGE()"
49-
[isLoading]="isMetricsLoading()"
50-
[title]="'project.analytics.charts.uniqueVisits'"
51-
[labels]="visitsLabels"
52-
[datasets]="visitsDataset"
53-
></osf-line-chart>
45+
@if (!isMetricsLoading() && !isRelatedCountsLoading()) {
46+
<div class="flex flex-column flex-wrap gap-4 xl:flex-row" [class]="{ disabled: isMetricsError() }">
47+
<osf-line-chart
48+
class="chart"
49+
[class.xl-half-width]="IS_X_LARGE()"
50+
[isLoading]="isMetricsLoading()"
51+
[title]="'project.analytics.charts.uniqueVisits'"
52+
[labels]="visitsLabels"
53+
[datasets]="visitsDataset"
54+
></osf-line-chart>
5455

55-
<osf-bar-chart
56-
class="chart"
57-
[class.xl-half-width]="IS_X_LARGE()"
58-
[isLoading]="isMetricsLoading()"
59-
[title]="'project.analytics.charts.timeOfDayOfVisits'"
60-
[labels]="totalVisitsLabels"
61-
[datasets]="totalVisitsDataset"
62-
[orientation]="'vertical'"
63-
></osf-bar-chart>
56+
<osf-bar-chart
57+
class="chart"
58+
[class.xl-half-width]="IS_X_LARGE()"
59+
[isLoading]="isMetricsLoading()"
60+
[title]="'project.analytics.charts.timeOfDayOfVisits'"
61+
[labels]="totalVisitsLabels"
62+
[datasets]="totalVisitsDataset"
63+
[orientation]="'vertical'"
64+
></osf-bar-chart>
6465

65-
<osf-pie-chart
66-
class="chart"
67-
[class.xl-half-width]="IS_X_LARGE()"
68-
[isLoading]="isMetricsLoading()"
69-
[title]="'project.analytics.charts.topReferrers'"
70-
[labels]="topReferrersLabels"
71-
[datasets]="topReferrersDataset"
72-
[showLegend]="true"
73-
></osf-pie-chart>
66+
<osf-pie-chart
67+
class="chart"
68+
[class.xl-half-width]="IS_X_LARGE()"
69+
[isLoading]="isMetricsLoading()"
70+
[title]="'project.analytics.charts.topReferrers'"
71+
[labels]="topReferrersLabels"
72+
[datasets]="topReferrersDataset"
73+
[showLegend]="true"
74+
></osf-pie-chart>
7475

75-
<osf-bar-chart
76-
class="chart"
77-
[class.xl-half-width]="IS_X_LARGE()"
78-
[isLoading]="isMetricsLoading()"
79-
[title]="'project.analytics.charts.popularPages'"
80-
[labels]="popularPagesLabels"
81-
[datasets]="popularPagesDataset"
82-
></osf-bar-chart>
83-
</div>
76+
<osf-bar-chart
77+
class="chart"
78+
[class.xl-half-width]="IS_X_LARGE()"
79+
[isLoading]="isMetricsLoading()"
80+
[title]="'project.analytics.charts.popularPages'"
81+
[labels]="popularPagesLabels"
82+
[datasets]="popularPagesDataset"
83+
></osf-bar-chart>
84+
</div>
85+
} @else {
86+
<osf-loading-spinner></osf-loading-spinner>
87+
}
8488

8589
<div class="flex flex-column gap-3 mt-6 sm:flex-row sm:justify-content-between sm:gap-4">
8690
<osf-analytics-kpi

src/app/features/analytics/analytics.component.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { ActivatedRoute, Router } from '@angular/router';
2222
import {
2323
BarChartComponent,
2424
LineChartComponent,
25+
LoadingSpinnerComponent,
2526
PieChartComponent,
2627
SelectComponent,
2728
SubHeaderComponent,
@@ -47,6 +48,7 @@ import { AnalyticsSelectors, ClearAnalytics, GetMetrics, GetRelatedCounts } from
4748
BarChartComponent,
4849
ViewOnlyLinkMessageComponent,
4950
SelectComponent,
51+
LoadingSpinnerComponent,
5052
],
5153
templateUrl: './analytics.component.html',
5254
styleUrl: './analytics.component.scss',
@@ -123,11 +125,7 @@ export class AnalyticsComponent implements OnInit {
123125
});
124126

125127
effect(() => {
126-
const analytics = this.analytics();
127-
128-
if (analytics) {
129-
this.setData();
130-
}
128+
this.setData();
131129
});
132130
}
133131

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1-
import { AnalyticsMetricsGetResponse, AnalyticsMetricsModel } from '../models';
1+
import { NodeAnalyticsDataJsonApi, NodeAnalyticsModel, RefererDomainJsonApi, RefererDomainModel } from '../models';
22

33
export class AnalyticsMetricsMapper {
4-
static fromResponse(response: AnalyticsMetricsGetResponse): AnalyticsMetricsModel {
4+
static fromResponse(response: NodeAnalyticsDataJsonApi): NodeAnalyticsModel {
55
return {
66
id: response.id,
77
type: response.type,
88
popularPages: response.attributes.popular_pages,
99
uniqueVisits: response.attributes.unique_visits,
10-
refererDomain: response.attributes.referer_domain,
10+
refererDomain: response.attributes.referer_domain.map((item) => this.getReferDomain(item)),
1111
timeOfDay: response.attributes.time_of_day,
1212
};
1313
}
14+
15+
static getReferDomain(data: RefererDomainJsonApi): RefererDomainModel {
16+
return {
17+
refererDomain: data.referer_domain,
18+
count: data.count,
19+
};
20+
}
1421
}

src/app/features/analytics/models/analytics-metrics.model.ts

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
export * from './analytics-metrics.model';
21
export * from './date-range-option.model';
2+
export * from './node-analytics.model';
3+
export * from './node-analytics-json-api.model';
34
export * from './related-counts.model';
45
export * from './related-counts-json-api.model';
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { ResponseDataJsonApi } from '@osf/shared/models';
2+
3+
export type NodeAnalyticsResponseJsonApi = ResponseDataJsonApi<NodeAnalyticsDataJsonApi>;
4+
5+
export interface NodeAnalyticsDataJsonApi {
6+
id: string;
7+
type: 'node-analytics';
8+
attributes: NodeAnalyticsAttributesJsonApi;
9+
}
10+
11+
export interface NodeAnalyticsAttributesJsonApi {
12+
popular_pages: PopularPageJsonApi[];
13+
unique_visits: UniqueVisitJsonApi[];
14+
time_of_day: TimeOfDayJsonApi[];
15+
referer_domain: RefererDomainJsonApi[];
16+
}
17+
18+
export interface PopularPageJsonApi {
19+
path: string;
20+
route: string;
21+
title: string;
22+
count: number;
23+
}
24+
25+
export interface UniqueVisitJsonApi {
26+
date: string;
27+
count: number;
28+
}
29+
30+
export interface TimeOfDayJsonApi {
31+
hour: number;
32+
count: number;
33+
}
34+
35+
export interface RefererDomainJsonApi {
36+
referer_domain: string;
37+
count: number;
38+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export interface NodeAnalyticsModel {
2+
id: string;
3+
type: string;
4+
popularPages: PopularPageModel[];
5+
uniqueVisits: UniqueVisitModel[];
6+
timeOfDay: TimeOfDayModel[];
7+
refererDomain: RefererDomainModel[];
8+
lastFetched?: number;
9+
}
10+
11+
export interface PopularPageModel {
12+
path: string;
13+
route: string;
14+
title: string;
15+
count: number;
16+
}
17+
18+
export interface UniqueVisitModel {
19+
date: string;
20+
count: number;
21+
}
22+
23+
export interface TimeOfDayModel {
24+
hour: number;
25+
count: number;
26+
}
27+
28+
export interface RefererDomainModel {
29+
refererDomain: string;
30+
count: number;
31+
}

src/app/features/analytics/services/analytics.service.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import { inject, Injectable } from '@angular/core';
44

55
import { ENVIRONMENT } from '@core/provider/environment.provider';
66
import { ResourceType } from '@osf/shared/enums';
7-
import { JsonApiResponse } from '@osf/shared/models';
87
import { JsonApiService } from '@osf/shared/services';
98

109
import { AnalyticsMetricsMapper, RelatedCountsMapper } from '../mappers';
11-
import { AnalyticsMetricsGetResponse, AnalyticsMetricsModel, RelatedCountsGetResponse } from '../models';
10+
import { NodeAnalyticsModel, NodeAnalyticsResponseJsonApi, RelatedCountsGetResponse } from '../models';
1211

1312
@Injectable({
1413
providedIn: 'root',
@@ -26,11 +25,11 @@ export class AnalyticsService {
2625
[ResourceType.Registration, 'registrations'],
2726
]);
2827

29-
getMetrics(resourceId: string, dateRange: string): Observable<AnalyticsMetricsModel> {
28+
getMetrics(resourceId: string, dateRange: string): Observable<NodeAnalyticsModel> {
3029
const baseUrl = `${this.apiDomainUrl}/_/metrics/query/node_analytics`;
3130

3231
return this.jsonApiService
33-
.get<JsonApiResponse<AnalyticsMetricsGetResponse, null>>(`${baseUrl}/${resourceId}/${dateRange}/`)
32+
.get<NodeAnalyticsResponseJsonApi>(`${baseUrl}/${resourceId}/${dateRange}/`)
3433
.pipe(map((response) => AnalyticsMetricsMapper.fromResponse(response.data)));
3534
}
3635

src/app/features/analytics/store/analytics.model.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { AsyncStateModel } from '@osf/shared/models/store';
22

3-
import { AnalyticsMetricsModel, RelatedCountsModel } from '../models';
3+
import { NodeAnalyticsModel, RelatedCountsModel } from '../models';
44

55
export interface AnalyticsStateModel {
6-
metrics: AsyncStateModel<AnalyticsMetricsModel[]>;
6+
metrics: AsyncStateModel<NodeAnalyticsModel[]>;
77
relatedCounts: AsyncStateModel<RelatedCountsModel[]>;
88
}
99

src/app/features/analytics/store/analytics.state.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { inject, Injectable } from '@angular/core';
77

88
import { handleSectionError } from '@osf/shared/helpers';
99

10-
import { AnalyticsMetricsModel, RelatedCountsModel } from '../models';
10+
import { NodeAnalyticsModel, RelatedCountsModel } from '../models';
1111
import { AnalyticsService } from '../services';
1212

1313
import { ClearAnalytics, GetMetrics, GetRelatedCounts } from './analytics.actions';
@@ -52,8 +52,8 @@ export class AnalyticsState {
5252
ctx.patchState({
5353
metrics: {
5454
data: exists
55-
? updateItem<AnalyticsMetricsModel>((m) => m.id === metrics.id, metrics)(state.metrics.data)
56-
: insertItem<AnalyticsMetricsModel>(metrics)(state.metrics.data),
55+
? updateItem<NodeAnalyticsModel>((m) => m.id === metrics.id, metrics)(state.metrics.data)
56+
: insertItem<NodeAnalyticsModel>(metrics)(state.metrics.data),
5757
isLoading: false,
5858
error: null,
5959
},

0 commit comments

Comments
 (0)