Revision 52006
Added by Myrto Koukouli almost 6 years ago
modules/uoa-repository-dashboard-gui/trunk/app/pages/metrics/metrics.module.ts | ||
---|---|---|
11 | 11 |
import { MetricsShowComponent } from './metrics-show.component'; |
12 | 12 |
import { TabsModule } from 'ngx-bootstrap'; |
13 | 13 |
import {MetricsUsagestatsComponent} from "./metrics-usagestats.component"; |
14 |
import { MetricsUsagestatsReportResultsComponent } from './metrics-usagestats-report-results.component'; |
|
14 | 15 |
|
15 | 16 |
@NgModule ({ |
16 | 17 |
imports: [ |
... | ... | |
24 | 25 |
MetricsEnableComponent, |
25 | 26 |
MetricsInstructionsComponent, |
26 | 27 |
MetricsShowComponent, |
27 |
MetricsUsagestatsComponent |
|
28 |
MetricsUsagestatsComponent, |
|
29 |
MetricsUsagestatsReportResultsComponent |
|
28 | 30 |
] |
29 | 31 |
}) |
30 | 32 |
|
modules/uoa-repository-dashboard-gui/trunk/app/pages/metrics/metrics.routing.ts | ||
---|---|---|
9 | 9 |
import { AuthGuardService } from '../../services/auth-guard.service'; |
10 | 10 |
import { MetricsShowComponent } from './metrics-show.component'; |
11 | 11 |
import {MetricsUsagestatsComponent} from "./metrics-usagestats.component"; |
12 |
import { MetricsUsagestatsReportResultsComponent } from './metrics-usagestats-report-results.component'; |
|
12 | 13 |
|
13 | 14 |
const metricsRoutes: Routes = [ |
14 | 15 |
{ |
... | ... | |
30 | 31 |
{ |
31 | 32 |
path: 'usagestats/:id', |
32 | 33 |
component: MetricsUsagestatsComponent |
34 |
}, |
|
35 |
{ |
|
36 |
path: 'usagestats-report-results', |
|
37 |
component: MetricsUsagestatsReportResultsComponent |
|
33 | 38 |
} |
34 | 39 |
]; |
35 | 40 |
|
modules/uoa-repository-dashboard-gui/trunk/app/pages/metrics/metrics-usagestats-report-results.component.html | ||
---|---|---|
1 |
<div class="uk-section-default uk-section uk-section-small uk-padding-remove-bottom" style="min-height: 325px"> |
|
2 |
|
|
3 |
<!-- MARGIN-TOP --> |
|
4 |
<div class="uk-sticky-placeholder" style="height: 84px; margin: 0px;" aria-hidden="true"></div> |
|
5 |
<div class="uk-container"> |
|
6 |
|
|
7 |
<div class="uk-grid-margin uk-grid uk-grid-stack" uk-grid=""> |
|
8 |
<div class="uk-width-1-1@m uk-first-column"> |
|
9 |
|
|
10 |
<h1 class="uk-h2">Get usage statistics report</h1> |
|
11 |
|
|
12 |
<!-- TOP HELP CONTENT --> |
|
13 |
<help-content #topHelperContent [position]="'top'" |
|
14 |
[ngClass]="topHelperContent.isPresent()?'uk-margin-medium-top uk-margin-medium-bottom':'clear-style'"> |
|
15 |
</help-content> |
|
16 |
|
|
17 |
<div class="uk-container uk-margin-medium-top uk-margin-medium-bottom"> |
|
18 |
<div class="uk-grid"> |
|
19 |
|
|
20 |
<!-- LEFT HELP CONTENT --> |
|
21 |
<aside-help-content #leftHelperContent [position]="'left'" |
|
22 |
[ngClass]="leftHelperContent.isPresent()?'tm-sidebar uk-width-1-4@m uk-first-column':'clear-style'"> |
|
23 |
</aside-help-content> |
|
24 |
|
|
25 |
<!-- MIDDLE --> |
|
26 |
<div class=" uk-width-expand@m" style="min-height:500px;"> |
|
27 |
|
|
28 |
<div *ngIf="errorMessage" class="uk-alert uk-alert-warning">{{errorMessage}}</div> |
|
29 |
<div *ngIf="repoResponse" class="uk-margin-top"> |
|
30 |
<h3>Report Results</h3> |
|
31 |
</div> |
|
32 |
|
|
33 |
</div> |
|
34 |
|
|
35 |
<!-- RIGHT HELP CONTENT --> |
|
36 |
<aside-help-content #rightHelperContent [position]="'right'" |
|
37 |
[ngClass]="rightHelperContent.isPresent()?'tm-sidebar uk-width-1-4@m uk-first-column':'clear-style'"> |
|
38 |
</aside-help-content> |
|
39 |
|
|
40 |
</div> |
|
41 |
</div> |
|
42 |
|
|
43 |
|
|
44 |
<!-- BOTTOM HELP CONTENT --> |
|
45 |
<help-content #bottomHelperContent [position]="'bottom'" |
|
46 |
[ngClass]="bottomHelperContent.isPresent()?'uk-margin-medium-top uk-margin-medium-bottom':'clear-style'"> |
|
47 |
</help-content> |
|
48 |
|
|
49 |
|
|
50 |
</div> |
|
51 |
</div> |
|
52 |
</div> |
|
53 |
</div> |
|
54 |
|
modules/uoa-repository-dashboard-gui/trunk/app/pages/metrics/metrics-usagestats-report-results.component.ts | ||
---|---|---|
1 |
import { Component, OnInit } from '@angular/core'; |
|
2 |
import { ActivatedRoute } from '@angular/router'; |
|
3 |
import { Http, RequestOptions, Headers } from '@angular/http'; |
|
4 |
import { AuthenticationService } from '../../services/authentication.service'; |
|
5 |
import { UsagestatsService } from '../../services/usagestats.service'; |
|
6 |
import { ReportResponse } from '../../domain/usageStatsClasses'; |
|
7 |
|
|
8 |
@Component({ |
|
9 |
selector: 'metrics-usagestats-report-results', |
|
10 |
templateUrl: 'metrics-usagestats-report-results.component' |
|
11 |
}) |
|
12 |
export class MetricsUsagestatsReportResultsComponent implements OnInit { |
|
13 |
|
|
14 |
errorMessage: string; |
|
15 |
repoResponse: ReportResponse; |
|
16 |
|
|
17 |
constructor(private route: ActivatedRoute, |
|
18 |
private authService: AuthenticationService, |
|
19 |
private usageService: UsagestatsService) {} |
|
20 |
|
|
21 |
ngOnInit() { |
|
22 |
this.getReportResponse(); |
|
23 |
} |
|
24 |
|
|
25 |
getReportResponse() { |
|
26 |
let headers = new Headers({ 'Content-Type': 'application/json' }); |
|
27 |
let httpOptions = new RequestOptions({ headers: headers }); |
|
28 |
let params = new URLSearchParams(); |
|
29 |
|
|
30 |
this.route.queryParams.subscribe( qparams => { |
|
31 |
if (qparams['pretty']) { |
|
32 |
params.append('Pretty', 'Pretty'); |
|
33 |
} |
|
34 |
params.append('Report', qparams['report']); |
|
35 |
params.append('Release', '4'); |
|
36 |
params.append('RequestorID', this.authService.getUserEmail()); |
|
37 |
params.append('BeginDate', qparams['beginDate']); |
|
38 |
params.append('EndDate', qparams['endDate']); |
|
39 |
params.append('RepositoryIdentifier', qparams['repoId']); |
|
40 |
params.append('ItemIdentifier', qparams['itemIdentifier']); |
|
41 |
params.append('Granularity', qparams['granularity']); |
|
42 |
}); |
|
43 |
|
|
44 |
this.usageService.getReportResponse(params).subscribe( |
|
45 |
responseWrapper => { |
|
46 |
this.repoResponse = responseWrapper.ReportResponse |
|
47 |
}, |
|
48 |
error => { |
|
49 |
this.errorMessage = 'Failed to load the report results!'; |
|
50 |
} |
|
51 |
); |
|
52 |
|
|
53 |
} |
|
54 |
} |
modules/uoa-repository-dashboard-gui/trunk/app/pages/metrics/metrics-show.component.html | ||
---|---|---|
7 | 7 |
<div class="uk-grid-margin uk-grid uk-grid-stack" uk-grid=""> |
8 | 8 |
<div class="uk-width-1-1@m uk-first-column"> |
9 | 9 |
|
10 |
<h1 class="uk-h2">Metrics</h1>
|
|
10 |
<h1 class="uk-h2">{{ piwik ? piwik.repositoryName : 'Metrics'}}</h1>
|
|
11 | 11 |
|
12 | 12 |
<!-- TOP HELP CONTENT --> |
13 | 13 |
<help-content #topHelperContent [position]="'top'" |
modules/uoa-repository-dashboard-gui/trunk/app/pages/metrics/metrics-usagestats.component.ts | ||
---|---|---|
16 | 16 |
|
17 | 17 |
repo: Repository; |
18 | 18 |
repoId: string; |
19 |
shownRepoId: string; |
|
20 |
shownOpenaireId: string; |
|
19 | 21 |
issnToShow: string = ''; |
20 | 22 |
chosen_report: string; |
21 | 23 |
disable_report_choice: boolean; |
... | ... | |
31 | 33 |
constructor(private repoService: RepositoryService, private route: ActivatedRoute, private router: Router, private authService: AuthenticationService) {} |
32 | 34 |
|
33 | 35 |
ngOnInit() { |
34 |
this.repoId = this.route.snapshot.paramMap.get('id');
|
|
36 |
this.getRepoId();
|
|
35 | 37 |
this.getUserEmail(); |
36 | 38 |
this.getRepo(); |
37 | 39 |
} |
38 | 40 |
|
41 |
getRepoId() { |
|
42 |
this.repoId = this.route.snapshot.paramMap.get('id'); |
|
43 |
this.shownRepoId = this.convertToDisplayedFormat(this.repoId); |
|
44 |
console.log(`shownRepoId is ${this.repoId}`); |
|
45 |
} |
|
46 |
|
|
47 |
convertToDisplayedFormat(input: string) { |
|
48 |
const tempArray = this.repoId.split('____::'); |
|
49 |
return tempArray[0] + ':' + tempArray[1]; |
|
50 |
} |
|
51 |
|
|
39 | 52 |
onChooseReport(event: any) { |
40 | 53 |
this.chosen_report = event.target.value; |
41 | 54 |
console.log('chosen report is', this.chosen_report); |
... | ... | |
54 | 67 |
this.errorMessage = 'The repository could not be retrieved'; |
55 | 68 |
}, |
56 | 69 |
() => { |
70 |
this.shownOpenaireId = this.convertToDisplayedFormat(this.repo.piwikInfo.openaireId); |
|
57 | 71 |
if (this.repo.issn){ |
58 | 72 |
this.issnToShow = this.repo.issn.slice(0, 4)+ '-' + this.repo.issn.toString().slice(4); |
59 | 73 |
} |
... | ... | |
86 | 100 |
} |
87 | 101 |
|
88 | 102 |
goToReport() { |
89 |
let params = new URLSearchParams(); |
|
90 |
|
|
103 |
/* let params = new URLSearchParams(); |
|
91 | 104 |
if (this.pretty) { |
92 | 105 |
params.append('Pretty', 'Pretty'); |
93 | 106 |
} |
... | ... | |
96 | 109 |
params.append('RequestorID', this.userEmail); |
97 | 110 |
params.append('BeginDate', this.beginDate); |
98 | 111 |
params.append('EndDate', this.endDate); |
99 |
params.append('RepositoryIdentifier', this.repoId);
|
|
112 |
params.append('RepositoryIdentifier', this.shownRepoId);
|
|
100 | 113 |
params.append('ItemIdentifier', this.itemIdentifier); |
101 | 114 |
params.append('Granularity', this.granularity); |
102 | 115 |
let url = `http://beta.services.openaire.eu/usagestats/sushilite/GetReport/?${params}`; |
103 |
window.open(url,"_blank"); |
|
116 |
window.open(url,"_blank");*/ |
|
117 |
|
|
118 |
this.router.navigate(['usagestats-report-results'], { |
|
119 |
queryParams: { |
|
120 |
report: this.chosen_report, |
|
121 |
beginDate: this.beginDate, |
|
122 |
endDate: this.endDate, |
|
123 |
repoId: this.shownRepoId, |
|
124 |
itemIdentifier: this.itemIdentifier, |
|
125 |
granularity: this.granularity, |
|
126 |
pretty: this.pretty |
|
127 |
} |
|
128 |
}) |
|
104 | 129 |
} |
105 | 130 |
|
106 | 131 |
} |
modules/uoa-repository-dashboard-gui/trunk/app/pages/compatibility/compatibility-validation-history.component.html | ||
---|---|---|
93 | 93 |
</a> |
94 | 94 |
</li> |
95 | 95 |
</ul> |
96 |
<div class="resultsPageLabel">page {{ currentPage+1 }} of {{ totalPages }}</div>
|
|
96 |
<div class="resultsPageLabel">page {{ (totalPages > 0) ? currentPage+1 : 0 }} of {{ totalPages }}</div>
|
|
97 | 97 |
</div> |
98 | 98 |
<div> |
99 | 99 |
<div> |
... | ... | |
177 | 177 |
</a> |
178 | 178 |
</li> |
179 | 179 |
</ul> |
180 |
<div class="resultsPageLabel">page {{ currentPage+1 }} of {{ totalPages }}</div>
|
|
180 |
<div class="resultsPageLabel">page {{ (totalPages > 0) ? currentPage+1 : 0 }} of {{ totalPages }}</div>
|
|
181 | 181 |
</div> |
182 | 182 |
</div> |
183 | 183 |
<div class="row"></div> |
modules/uoa-repository-dashboard-gui/trunk/app/pages/content/content-events-of-repo-eventslist.component.html | ||
---|---|---|
65 | 65 |
<!--<div class="resultsPageLabel">page {{ eventsPage.currPage+1 }} of {{ eventsPage.totalPages }}</div>--> |
66 | 66 |
|
67 | 67 |
<!-- DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE --> |
68 |
<div class="resultsPageLabel">page {{ currentPage+1 }} of {{ eventsPage.totalPages }}</div>
|
|
68 |
<div class="resultsPageLabel">page {{ (eventsPage.totalPages > 0) ? currentPage+1 : 0 }} of {{ eventsPage.totalPages }}</div>
|
|
69 | 69 |
|
70 | 70 |
</div> |
71 | 71 |
<div *ngFor="let event of eventsPage.values" class="events-list"> |
... | ... | |
235 | 235 |
<!--<div class="resultsPageLabel">page {{ eventsPage.currPage+1 }} of {{ eventsPage.totalPages }}</div>--> |
236 | 236 |
|
237 | 237 |
<!-- DELETE WHEN ADVANCED SHOW EVENTS IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE --> |
238 |
<div class="resultsPageLabel">page {{ currentPage+1 }} of {{ eventsPage.totalPages }}</div>
|
|
238 |
<div class="resultsPageLabel">page {{ (eventsPage.totalPages > 0) ? currentPage+1 : 0 }} of {{ eventsPage.totalPages }}</div>
|
|
239 | 239 |
|
240 | 240 |
</div> |
241 | 241 |
</div> |
modules/uoa-repository-dashboard-gui/trunk/app/pages/content/content-notifications-of-subscription.component.html | ||
---|---|---|
60 | 60 |
<!--<div class="resultsPageLabel">page {{ eventsPage.currPage+1 }} of {{ eventsPage.totalPages }}</div>--> |
61 | 61 |
|
62 | 62 |
<!-- DELETE WHEN getNotificationsBySubscriptionId IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE --> |
63 |
<div class="resultsPageLabel">page {{ currentPage+1 }} of {{ eventsPage.totalPages }}</div>
|
|
63 |
<div class="resultsPageLabel">page {{ (eventsPage.totalPages > 0) ? currentPage+1 : 0 }} of {{ eventsPage.totalPages }}</div>
|
|
64 | 64 |
|
65 | 65 |
</div> |
66 | 66 |
<div *ngFor="let event of eventsPage.values" class="events-list"> |
... | ... | |
230 | 230 |
<!--<div class="resultsPageLabel">page {{ eventsPage.currPage+1 }} of {{ eventsPage.totalPages }}</div>--> |
231 | 231 |
|
232 | 232 |
<!-- DELETE WHEN getNotificationsBySubscriptionId IS FIXED AND SENDS CORRECT VALUE FOR CURRENT PAGE --> |
233 |
<div class="resultsPageLabel">page {{ currentPage+1 }} of {{ eventsPage.totalPages }}</div>
|
|
233 |
<div class="resultsPageLabel">page {{ (eventsPage.totalPages > 0) ? currentPage+1 : 0 }} of {{ eventsPage.totalPages }}</div>
|
|
234 | 234 |
|
235 | 235 |
</div> |
236 | 236 |
</div> |
modules/uoa-repository-dashboard-gui/trunk/app/services/usagestats.service.ts | ||
---|---|---|
1 |
/* |
|
2 |
* Created by myrto on 05/11/2018 |
|
3 |
*/ |
|
4 |
|
|
5 |
|
|
6 |
import { Injectable } from '@angular/core'; |
|
7 |
import { Observable } from 'rxjs/Observable'; |
|
8 |
import 'rxjs/add/operator/map'; |
|
9 |
import { Http, Headers, RequestOptions, Response } from '@angular/http'; |
|
10 |
import { ReportResponseWrapper } from '../domain/usageStatsClasses'; |
|
11 |
|
|
12 |
|
|
13 |
const headers = new Headers({ 'Content-Type': 'application/json' }); |
|
14 |
const httpOptions = new RequestOptions({ headers: headers }); |
|
15 |
|
|
16 |
@Injectable () |
|
17 |
export class UsagestatsService { |
|
18 |
/*private apiUrl = `${apiUrl}/piwik/`;*/ |
|
19 |
private apiUrl = process.env.API_ENDPOINT + '/piwik/'; |
|
20 |
|
|
21 |
constructor(private http: Http) { } |
|
22 |
|
|
23 |
|
|
24 |
getReportResponse(params: URLSearchParams): Observable<ReportResponseWrapper> { |
|
25 |
let url = `http://beta.services.openaire.eu/usagestats/sushilite/GetReport/?${params}`; |
|
26 |
console.log(`knocking on: ${url}`); |
|
27 |
httpOptions.withCredentials = true; |
|
28 |
return this.http.get(url, httpOptions) |
|
29 |
.map(res => <ReportResponseWrapper>res.json()) |
|
30 |
.catch(this.handleError); |
|
31 |
} |
|
32 |
|
|
33 |
private handleError(error: Response | any) { |
|
34 |
// In a real world app, we might use a remote logging infrastructure |
|
35 |
// We'd also dig deeper into the error to get a better message |
|
36 |
let errMsg = ""; |
|
37 |
console.log('E R R O R !!!'); |
|
38 |
console.log(error); |
|
39 |
if (error instanceof Response) { |
|
40 |
const body = error.text() || ''; |
|
41 |
//const err = body.error || JSON.stringify(body); |
|
42 |
errMsg = `${error.status} - ${error.statusText || ''} ${body}`; |
|
43 |
} else { |
|
44 |
errMsg = (error.message) ? error.message : |
|
45 |
error.status ? `${error.status} - ${error.statusText}` : 'Server error'; |
|
46 |
console.error(errMsg); // log to console instead |
|
47 |
} |
|
48 |
return Observable.throw(errMsg); |
|
49 |
} |
|
50 |
|
|
51 |
|
|
52 |
} |
modules/uoa-repository-dashboard-gui/trunk/app/domain/tempAPI.ts | ||
---|---|---|
1 | 1 |
/* export const apiUrl = 'http://195.134.66.230:8380/uoa-repository-manager-service'; */ |
2 | 2 |
/* export const apiUrl = 'http://194.177.192.121:8380/uoa-repository-manager-service';*/ |
3 |
export const apiUrl = 'http://194.177.192.121:8380/repomanager-service-dev'; |
|
3 |
/*export const apiUrl = 'http://194.177.192.121:8380/repomanager-service-dev';*/ |
|
4 |
export const apiUrl = 'http://aleka.athenarc.gr:8380/repomanager-service-dev'; |
|
4 | 5 |
/*export const apiUrl = 'http://195.134.66.230:8380/repomanager-service-dev';*/ |
5 |
export const loginUrl = 'http://194.177.192.121:8380/repomanager-service-dev/openid_connect_login'; |
|
6 |
/*export const loginUrl = 'http://194.177.192.121:8380/repomanager-service-dev/openid_connect_login';*/ |
|
7 |
export const loginUrl = 'http://aleka.athenarc.gr:8380/repomanager-service-dev/openid_connect_login'; |
|
6 | 8 |
/*export const loginUrl = 'http://195.134.66.230:8380/repomanager-service-dev/openid_connect_login';*/ |
7 | 9 |
|
8 | 10 |
export const helpServiceUrl = 'http://194.177.192.121:5555'; |
modules/uoa-repository-dashboard-gui/trunk/app/domain/usageStatsClasses.ts | ||
---|---|---|
1 |
// Generated using typescript-generator version 1.29.366 on 2018-05-11 15:13:15. |
|
2 |
|
|
3 |
export class Contact { |
|
4 |
"E-mail": string; |
|
5 |
Contact: string; |
|
6 |
} |
|
7 |
|
|
8 |
export class Customer { |
|
9 |
ID: string; |
|
10 |
ReportItems: ReportItem[]; |
|
11 |
} |
|
12 |
|
|
13 |
export class Filter { |
|
14 |
Name: string; |
|
15 |
Value: string; |
|
16 |
} |
|
17 |
|
|
18 |
export class Filters { |
|
19 |
UsageDateRange: UsageDateRange; |
|
20 |
Filter: Filter[]; |
|
21 |
ReportAttribute: Filter[]; |
|
22 |
} |
|
23 |
|
|
24 |
export class Instance { |
|
25 |
MetricType: string; |
|
26 |
Count: string; |
|
27 |
} |
|
28 |
|
|
29 |
export class ItemIdentifier { |
|
30 |
Type: string; |
|
31 |
Value: string; |
|
32 |
} |
|
33 |
|
|
34 |
export class ItemPerformance { |
|
35 |
Period: Period; |
|
36 |
Category: string; |
|
37 |
Instance: Instance[]; |
|
38 |
} |
|
39 |
|
|
40 |
export class Period { |
|
41 |
Begin: string; |
|
42 |
End: string; |
|
43 |
} |
|
44 |
|
|
45 |
export class Report { |
|
46 |
"@Created": string; |
|
47 |
"@Version": string; |
|
48 |
"@Name": string; |
|
49 |
Vendor: Vendor; |
|
50 |
Customer: Customer; |
|
51 |
} |
|
52 |
|
|
53 |
export class ReportDefinition { |
|
54 |
"@Name": string; |
|
55 |
"@Release": string; |
|
56 |
Filters: Filters; |
|
57 |
} |
|
58 |
|
|
59 |
export class ReportException { |
|
60 |
"@Created": string; |
|
61 |
Number: string; |
|
62 |
Severity: string; |
|
63 |
Message: string; |
|
64 |
Data: string; |
|
65 |
} |
|
66 |
|
|
67 |
export class ReportItem { |
|
68 |
ItemIdentifier: ItemIdentifier[]; |
|
69 |
ItemPublisher: string; |
|
70 |
ItemPlatform: string; |
|
71 |
ItemDataType: string; |
|
72 |
ItemName: string; |
|
73 |
ItemPerformance: ItemPerformance[]; |
|
74 |
} |
|
75 |
|
|
76 |
export class ReportResponse { |
|
77 |
"@Created": string; |
|
78 |
Exception: ReportException[]; |
|
79 |
Requestor: Requestor; |
|
80 |
ReportDefinition: ReportDefinition; |
|
81 |
Report: ReportWrapper; |
|
82 |
} |
|
83 |
|
|
84 |
export class ReportResponseWrapper { |
|
85 |
ReportResponse: ReportResponse; |
|
86 |
} |
|
87 |
|
|
88 |
export class ReportWrapper { |
|
89 |
Report: Report; |
|
90 |
} |
|
91 |
|
|
92 |
export class Requestor { |
|
93 |
ID: string; |
|
94 |
} |
|
95 |
|
|
96 |
export class UsageDateRange { |
|
97 |
Begin: string; |
|
98 |
End: string; |
|
99 |
} |
|
100 |
|
|
101 |
export class BaseRepository { |
|
102 |
} |
|
103 |
|
|
104 |
export class UsageReport extends BaseRepository { |
|
105 |
} |
|
106 |
|
|
107 |
export class Vendor { |
|
108 |
Contact: Contact; |
|
109 |
Name: string; |
|
110 |
} |
modules/uoa-repository-dashboard-gui/trunk/app/app.module.ts | ||
---|---|---|
26 | 26 |
import { MonitorService } from './services/monitor.service'; |
27 | 27 |
import {LandingComponent} from "./pages/landing/landing.component"; |
28 | 28 |
import {DashboardComponent} from "./pages/dashboard/dashboard.component"; |
29 |
import { UsagestatsService } from './services/usagestats.service'; |
|
29 | 30 |
|
30 | 31 |
|
31 | 32 |
@NgModule({ |
... | ... | |
59 | 60 |
PiwikService, |
60 | 61 |
RepositoryService, |
61 | 62 |
ValidatorService, |
63 |
UsagestatsService, |
|
62 | 64 |
AuthGuardService, |
63 | 65 |
AuthenticationService |
64 | 66 |
], |
Also available in: Unified diff
create usageStats-report-results page