Skip to content

Commit 8a8478b

Browse files
Micheleboychukvins01-4science
authored andcommitted
Merged in task/dspace-cris-2024_02_x/DSC-2768-matomo (pull request DSpace#4286)
DSC-2768: Porting of the Matomo Approved-by: Vincenzo Mecca
2 parents e329304 + 5ca96ce commit 8a8478b

File tree

33 files changed

+583
-13
lines changed

33 files changed

+583
-13
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145
"ng2-google-charts": "^7.0.0",
146146
"ng2-nouislider": "^2.0.0",
147147
"ngx-infinite-scroll": "^17.0.0",
148+
"ngx-matomo-client": "^6.4.1",
148149
"ngx-pagination": "6.0.3",
149150
"ngx-skeleton-loader": "^9.0.0",
150151
"nouislider": "^15.8.1",

src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { CommonModule } from '@angular/common';
1+
import {
2+
CommonModule,
3+
Location,
4+
} from '@angular/common';
25
import { PLATFORM_ID } from '@angular/core';
36
import {
47
ComponentFixture,
@@ -13,6 +16,7 @@ import { TranslateModule } from '@ngx-translate/core';
1316
import { of as observableOf } from 'rxjs';
1417

1518
import { AuthService } from '../../core/auth/auth.service';
19+
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
1620
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
1721
import { SignpostingDataService } from '../../core/data/signposting-data.service';
1822
import { HardRedirectService } from '../../core/services/hard-redirect.service';
@@ -24,6 +28,7 @@ import {
2428
import { Bitstream } from '../../core/shared/bitstream.model';
2529
import { FileService } from '../../core/shared/file.service';
2630
import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils';
31+
import { MatomoService } from '../../statistics/matomo.service';
2732
import { BitstreamDownloadPageComponent } from './bitstream-download-page.component';
2833

2934
describe('BitstreamDownloadPageComponent', () => {
@@ -36,10 +41,13 @@ describe('BitstreamDownloadPageComponent', () => {
3641
let hardRedirectService: HardRedirectService;
3742
let activatedRoute;
3843
let router;
44+
let location: Location;
45+
let dsoNameService: DSONameService;
3946

4047
let bitstream: Bitstream;
4148
let serverResponseService: jasmine.SpyObj<ServerResponseService>;
4249
let signpostingDataService: jasmine.SpyObj<SignpostingDataService>;
50+
let matomoService: jasmine.SpyObj<MatomoService>;
4351

4452
const mocklink = {
4553
href: 'http://test.org',
@@ -57,6 +65,7 @@ describe('BitstreamDownloadPageComponent', () => {
5765
authService = jasmine.createSpyObj('authService', {
5866
isAuthenticated: observableOf(true),
5967
setRedirectUrl: {},
68+
getShortlivedToken: observableOf('token'),
6069
});
6170
authorizationService = jasmine.createSpyObj('authorizationSerivice', {
6271
isAuthorized: observableOf(true),
@@ -66,9 +75,18 @@ describe('BitstreamDownloadPageComponent', () => {
6675
retrieveFileDownloadLink: observableOf('content-url-with-headers'),
6776
});
6877

69-
hardRedirectService = jasmine.createSpyObj('fileService', {
78+
hardRedirectService = jasmine.createSpyObj('hardRedirectService', {
7079
redirect: {},
7180
});
81+
82+
location = jasmine.createSpyObj('location', {
83+
back: {},
84+
});
85+
86+
dsoNameService = jasmine.createSpyObj('dsoNameService', {
87+
getName: 'Test Bitstream',
88+
});
89+
7290
bitstream = Object.assign(new Bitstream(), {
7391
uuid: 'bitstreamUuid',
7492
_links: {
@@ -97,6 +115,8 @@ describe('BitstreamDownloadPageComponent', () => {
97115
signpostingDataService = jasmine.createSpyObj('SignpostingDataService', {
98116
getLinks: observableOf([mocklink, mocklink2]),
99117
});
118+
matomoService = jasmine.createSpyObj('MatomoService', ['appendVisitorId']);
119+
matomoService.appendVisitorId.and.callFake((link) => observableOf(link));
100120
}
101121

102122
function initTestbed() {
@@ -112,7 +132,10 @@ describe('BitstreamDownloadPageComponent', () => {
112132
{ provide: HardRedirectService, useValue: hardRedirectService },
113133
{ provide: ServerResponseService, useValue: serverResponseService },
114134
{ provide: SignpostingDataService, useValue: signpostingDataService },
135+
{ provide: MatomoService, useValue: matomoService },
115136
{ provide: PLATFORM_ID, useValue: 'server' },
137+
{ provide: Location, useValue: location },
138+
{ provide: DSONameService, useValue: dsoNameService },
116139
],
117140
})
118141
.compileComponents();

src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { Bitstream } from '../../core/shared/bitstream.model';
3737
import { FileService } from '../../core/shared/file.service';
3838
import { getRemoteDataPayload } from '../../core/shared/operators';
3939
import { isNotEmpty } from '../../shared/empty.util';
40+
import { MatomoService } from '../../statistics/matomo.service';
4041

4142
@Component({
4243
selector: 'ds-bitstream-download-page',
@@ -71,6 +72,7 @@ export class BitstreamDownloadPageComponent implements OnInit {
7172
public dsoNameService: DSONameService,
7273
private signpostingDataService: SignpostingDataService,
7374
private responseService: ServerResponseService,
75+
private matomoService: MatomoService,
7476
@Inject(PLATFORM_ID) protected platformId: string,
7577
) {
7678
this.initPageLinks();

src/app/core/shared/search/search.service.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ export class SearchService implements OnDestroy {
444444
const appliedFilter = appliedFilters[i];
445445
filters.push(appliedFilter);
446446
}
447-
this.angulartics2.eventTrack.next({
447+
const searchTrackObject = {
448448
action: 'search',
449449
properties: {
450450
searchOptions: config,
@@ -461,7 +461,9 @@ export class SearchService implements OnDestroy {
461461
filters: filters,
462462
clickedObject,
463463
},
464-
});
464+
};
465+
466+
this.angulartics2.eventTrack.next(searchTrackObject);
465467
}
466468

467469
/**

src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import { AuthService } from '../../../../core/auth/auth.service';
1717
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
1818
import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service';
1919
import { Item } from '../../../../core/shared/item.model';
20+
import { KlaroService } from '../../../../shared/cookies/klaro.service';
21+
import { KlaroServiceStub } from '../../../../shared/cookies/klaro.service.stub';
2022
import { AuthServiceMock } from '../../../../shared/mocks/auth.service.mock';
2123
import { DSONameServiceMock } from '../../../../shared/mocks/dso-name.service.mock';
2224
import { mockTruncatableService } from '../../../../shared/mocks/mock-trucatable.service';
@@ -66,6 +68,7 @@ describe('JournalIssueListElementComponent', () => {
6668
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
6769
{ provide: AuthService, useValue: new AuthServiceMock() },
6870
{ provide: AuthorizationDataService, useValue: {} },
71+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
6972
],
7073
schemas: [NO_ERRORS_SCHEMA],
7174
}).overrideComponent(JournalIssueListElementComponent, {

src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { of as observableOf } from 'rxjs';
1515
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1616
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
1717
import { Item } from '../../../../../core/shared/item.model';
18+
import { KlaroService } from '../../../../../shared/cookies/klaro.service';
19+
import { KlaroServiceStub } from '../../../../../shared/cookies/klaro.service.stub';
1820
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
1921
import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service';
2022
import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock';
@@ -103,6 +105,7 @@ describe('JournalIssueSearchResultListElementComponent', () => {
103105
{ provide: ThemeService, useValue: getMockThemeService() },
104106
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
105107
{ provide: APP_CONFIG, useValue: environmentUseThumbs },
108+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
106109
],
107110
schemas: [NO_ERRORS_SCHEMA],
108111
}).overrideComponent(JournalIssueSearchResultListElementComponent, {
@@ -195,6 +198,7 @@ describe('JournalIssueSearchResultListElementComponent', () => {
195198
{ provide: APP_CONFIG, useValue: enviromentNoThumbs },
196199
{ provide: ThemeService, useValue: getMockThemeService() },
197200
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
201+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
198202
],
199203
schemas: [NO_ERRORS_SCHEMA],
200204
}).overrideComponent(JournalIssueSearchResultListElementComponent, {

src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import { ThemeService } from 'src/app/shared/theme-support/theme.service';
1818
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1919
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
2020
import { Item } from '../../../../../core/shared/item.model';
21+
import { KlaroService } from '../../../../../shared/cookies/klaro.service';
22+
import { KlaroServiceStub } from '../../../../../shared/cookies/klaro.service.stub';
2123
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
2224
import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service';
2325
import { ThemedBadgesComponent } from '../../../../../shared/object-collection/shared/badges/themed-badges.component';
@@ -97,6 +99,7 @@ describe('JournalVolumeSearchResultListElementComponent', () => {
9799
{ provide: APP_CONFIG, useValue: environmentUseThumbs },
98100
{ provide: ThemeService, useValue: getMockThemeService() },
99101
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
102+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
100103
],
101104
schemas: [NO_ERRORS_SCHEMA],
102105
}).overrideComponent(JournalVolumeSearchResultListElementComponent, {
@@ -190,6 +193,7 @@ describe('JournalVolumeSearchResultListElementComponent', () => {
190193
{ provide: APP_CONFIG, useValue: enviromentNoThumbs },
191194
{ provide: ThemeService, useValue: getMockThemeService() },
192195
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
196+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
193197
],
194198
schemas: [NO_ERRORS_SCHEMA],
195199
}).overrideComponent(JournalVolumeSearchResultListElementComponent, {

src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import {
2020
} from '../../../../../../config/app-config.interface';
2121
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
2222
import { Item } from '../../../../../core/shared/item.model';
23+
import { KlaroService } from '../../../../../shared/cookies/klaro.service';
24+
import { KlaroServiceStub } from '../../../../../shared/cookies/klaro.service.stub';
2325
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
2426
import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service';
2527
import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock';
@@ -99,6 +101,7 @@ describe('JournalSearchResultListElementComponent', () => {
99101
{ provide: ThemeService, useValue: getMockThemeService() },
100102
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
101103
{ provide: APP_DATA_SERVICES_MAP, useValue: {} },
104+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
102105
],
103106
schemas: [NO_ERRORS_SCHEMA],
104107
}).overrideComponent(JournalSearchResultListElementComponent, {
@@ -173,6 +176,7 @@ describe('JournalSearchResultListElementComponent', () => {
173176
{ provide: ThemeService, useValue: getMockThemeService() },
174177
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
175178
{ provide: APP_DATA_SERVICES_MAP, useValue: {} },
179+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
176180
],
177181
schemas: [NO_ERRORS_SCHEMA],
178182
}).overrideComponent(JournalSearchResultListElementComponent, {

src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import { AuthService } from '../../../../../core/auth/auth.service';
2020
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
2121
import { AuthorizationDataService } from '../../../../../core/data/feature-authorization/authorization-data.service';
2222
import { Item } from '../../../../../core/shared/item.model';
23+
import { KlaroService } from '../../../../../shared/cookies/klaro.service';
24+
import { KlaroServiceStub } from '../../../../../shared/cookies/klaro.service.stub';
2325
import { AuthServiceMock } from '../../../../../shared/mocks/auth.service.mock';
2426
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
2527
import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service';
@@ -108,6 +110,7 @@ describe('OrgUnitSearchResultListElementComponent', () => {
108110
{ provide: DSONameService, useClass: DSONameServiceMock },
109111
{ provide: APP_CONFIG, useValue: environmentUseThumbs },
110112
{ provide: ThemeService, useValue: getMockThemeService() },
113+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
111114
],
112115
schemas: [NO_ERRORS_SCHEMA],
113116
}).overrideComponent(OrgUnitSearchResultListElementComponent, {
@@ -189,6 +192,7 @@ describe('OrgUnitSearchResultListElementComponent', () => {
189192
{ provide: APP_CONFIG, useValue: enviromentNoThumbs },
190193
{ provide: ThemeService, useValue: getMockThemeService() },
191194
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
195+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
192196
],
193197
schemas: [NO_ERRORS_SCHEMA],
194198
}).overrideComponent(OrgUnitSearchResultListElementComponent, {

src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { of as observableOf } from 'rxjs';
1414
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1515
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
1616
import { Item } from '../../../../../core/shared/item.model';
17+
import { KlaroService } from '../../../../../shared/cookies/klaro.service';
18+
import { KlaroServiceStub } from '../../../../../shared/cookies/klaro.service.stub';
1719
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
1820
import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service';
1921
import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock';
@@ -93,6 +95,7 @@ describe('ProjectSearchResultListElementComponent', () => {
9395
{ provide: DSONameService, useClass: DSONameServiceMock },
9496
{ provide: APP_CONFIG, useValue: environmentUseThumbs },
9597
{ provide: ThemeService, useValue: getMockThemeService() },
98+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
9699
],
97100
schemas: [NO_ERRORS_SCHEMA],
98101
}).overrideComponent(ProjectSearchResultListElementComponent, {
@@ -165,6 +168,7 @@ describe('ProjectSearchResultListElementComponent', () => {
165168
{ provide: APP_CONFIG, useValue: enviromentNoThumbs },
166169
{ provide: ThemeService, useValue: getMockThemeService() },
167170
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
171+
{ provide: KlaroService, useValue: new KlaroServiceStub() },
168172
],
169173
schemas: [NO_ERRORS_SCHEMA],
170174
}).overrideComponent(ProjectSearchResultListElementComponent, {

0 commit comments

Comments
 (0)