mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-09 02:54:13 +00:00
76634: Implement GoogleAnalyticsService
This commit is contained in:
@@ -33,6 +33,7 @@ import { models } from './core/core.module';
|
|||||||
import { LocaleService } from './core/locale/locale.service';
|
import { LocaleService } from './core/locale/locale.service';
|
||||||
import { hasValue } from './shared/empty.util';
|
import { hasValue } from './shared/empty.util';
|
||||||
import { KlaroService } from './shared/cookies/klaro.service';
|
import { KlaroService } from './shared/cookies/klaro.service';
|
||||||
|
import {GoogleAnalyticsService} from './statistics/google-analytics.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-app',
|
selector: 'ds-app',
|
||||||
@@ -70,7 +71,8 @@ export class AppComponent implements OnInit, AfterViewInit {
|
|||||||
private menuService: MenuService,
|
private menuService: MenuService,
|
||||||
private windowService: HostWindowService,
|
private windowService: HostWindowService,
|
||||||
private localeService: LocaleService,
|
private localeService: LocaleService,
|
||||||
@Optional() private cookiesService: KlaroService
|
@Optional() private cookiesService: KlaroService,
|
||||||
|
@Optional() private googleAnalyticsService: GoogleAnalyticsService,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
/* Use models object so all decorators are actually called */
|
/* Use models object so all decorators are actually called */
|
||||||
@@ -84,7 +86,10 @@ export class AppComponent implements OnInit, AfterViewInit {
|
|||||||
// set the current language code
|
// set the current language code
|
||||||
this.localeService.setCurrentLanguageCode();
|
this.localeService.setCurrentLanguageCode();
|
||||||
|
|
||||||
angulartics2GoogleAnalytics.startTracking();
|
// analytics
|
||||||
|
if (hasValue(googleAnalyticsService)) {
|
||||||
|
googleAnalyticsService.addTrackingIdToPage();
|
||||||
|
}
|
||||||
angulartics2DSpace.startTracking();
|
angulartics2DSpace.startTracking();
|
||||||
|
|
||||||
metadata.listenForRouteChange();
|
metadata.listenForRouteChange();
|
||||||
|
16
src/app/statistics/google-analytics.service.spec.ts
Normal file
16
src/app/statistics/google-analytics.service.spec.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { GoogleAnalyticsService } from './google-analytics.service';
|
||||||
|
|
||||||
|
describe('GoogleAnalyticsService', () => {
|
||||||
|
let service: GoogleAnalyticsService;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({});
|
||||||
|
service = TestBed.inject(GoogleAnalyticsService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
expect(service).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
40
src/app/statistics/google-analytics.service.ts
Normal file
40
src/app/statistics/google-analytics.service.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import {Angulartics2GoogleAnalytics} from 'angulartics2/ga';
|
||||||
|
import {ConfigurationDataService} from '../core/data/configuration-data.service';
|
||||||
|
import {getFirstCompletedRemoteData} from '../core/shared/operators';
|
||||||
|
import {isEmpty, isNotEmpty} from '../shared/empty.util';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class GoogleAnalyticsService {
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private angulartics: Angulartics2GoogleAnalytics,
|
||||||
|
private configService: ConfigurationDataService,
|
||||||
|
) { }
|
||||||
|
|
||||||
|
addTrackingIdToPage() {
|
||||||
|
this.configService.findByPropertyName('google.analytics.key').pipe(
|
||||||
|
getFirstCompletedRemoteData(),
|
||||||
|
).subscribe((remoteData) => {
|
||||||
|
// make sure we got a success response from the backend
|
||||||
|
if (!remoteData.hasSucceeded) { return; }
|
||||||
|
|
||||||
|
const trackingId = remoteData.payload.values[0];
|
||||||
|
|
||||||
|
// make sure we received a tracking id
|
||||||
|
if (isEmpty(trackingId)) { return; }
|
||||||
|
|
||||||
|
// add trackingId snippet to page
|
||||||
|
const keyScript = document.createElement('script');
|
||||||
|
keyScript.innerHTML = `(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||||
|
'ga('create', '${trackingId}', 'auto');`;
|
||||||
|
document.body.appendChild(keyScript);
|
||||||
|
|
||||||
|
// start tracking
|
||||||
|
this.angulartics.startTracking();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -23,7 +23,6 @@ export interface GlobalConfig extends Config {
|
|||||||
notifications: INotificationBoardOptions;
|
notifications: INotificationBoardOptions;
|
||||||
submission: SubmissionConfig;
|
submission: SubmissionConfig;
|
||||||
universal: UniversalConfig;
|
universal: UniversalConfig;
|
||||||
gaTrackingId: string;
|
|
||||||
logDirectory: string;
|
logDirectory: string;
|
||||||
debug: boolean;
|
debug: boolean;
|
||||||
defaultLanguage: string;
|
defaultLanguage: string;
|
||||||
|
@@ -132,8 +132,6 @@ export const environment: GlobalConfig = {
|
|||||||
async: true,
|
async: true,
|
||||||
time: false
|
time: false
|
||||||
},
|
},
|
||||||
// Google Analytics tracking id
|
|
||||||
gaTrackingId: '',
|
|
||||||
// Log directory
|
// Log directory
|
||||||
logDirectory: '.',
|
logDirectory: '.',
|
||||||
// NOTE: will log all redux actions and transfers in console
|
// NOTE: will log all redux actions and transfers in console
|
||||||
|
@@ -110,8 +110,6 @@ export const environment: Partial<GlobalConfig> = {
|
|||||||
async: true,
|
async: true,
|
||||||
time: false
|
time: false
|
||||||
},
|
},
|
||||||
// Google Analytics tracking id
|
|
||||||
gaTrackingId: '',
|
|
||||||
// Log directory
|
// Log directory
|
||||||
logDirectory: '.',
|
logDirectory: '.',
|
||||||
// NOTE: will log all redux actions and transfers in console
|
// NOTE: will log all redux actions and transfers in console
|
||||||
|
@@ -25,25 +25,9 @@ export function main() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
addGoogleAnalytics();
|
|
||||||
|
|
||||||
return platformBrowserDynamic().bootstrapModule(BrowserAppModule, {preserveWhitespaces:true});
|
return platformBrowserDynamic().bootstrapModule(BrowserAppModule, {preserveWhitespaces:true});
|
||||||
}
|
}
|
||||||
|
|
||||||
function addGoogleAnalytics() {
|
|
||||||
// Add google analytics if key is present in config
|
|
||||||
const trackingId = environment.gaTrackingId;
|
|
||||||
if (isNotEmpty(trackingId)) {
|
|
||||||
const keyScript = document.createElement('script');
|
|
||||||
keyScript.innerHTML = `(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
|
||||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');`
|
|
||||||
+ 'ga(\'create\', \'' + environment.gaTrackingId + '\', \'auto\');';
|
|
||||||
document.body.appendChild(keyScript);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// support async tag or hmr
|
// support async tag or hmr
|
||||||
if (hasValue(environment.universal) && environment.universal.preboot === false) {
|
if (hasValue(environment.universal) && environment.universal.preboot === false) {
|
||||||
bootloader(main);
|
bootloader(main);
|
||||||
|
@@ -30,6 +30,7 @@ import {
|
|||||||
LocationToken
|
LocationToken
|
||||||
} from '../../app/core/services/browser-hard-redirect.service';
|
} from '../../app/core/services/browser-hard-redirect.service';
|
||||||
import { LocaleService } from '../../app/core/locale/locale.service';
|
import { LocaleService } from '../../app/core/locale/locale.service';
|
||||||
|
import {GoogleAnalyticsService} from '../../app/statistics/google-analytics.service';
|
||||||
|
|
||||||
export const REQ_KEY = makeStateKey<string>('req');
|
export const REQ_KEY = makeStateKey<string>('req');
|
||||||
|
|
||||||
@@ -99,6 +100,10 @@ export function getRequest(transferState: TransferState): any {
|
|||||||
provide: HardRedirectService,
|
provide: HardRedirectService,
|
||||||
useClass: BrowserHardRedirectService,
|
useClass: BrowserHardRedirectService,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
provide: GoogleAnalyticsService,
|
||||||
|
useClass: GoogleAnalyticsService,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
provide: LocationToken,
|
provide: LocationToken,
|
||||||
useFactory: locationProvider,
|
useFactory: locationProvider,
|
||||||
|
Reference in New Issue
Block a user