From 1bcf02858012b00e4dede975c9c8ba6321cb0c06 Mon Sep 17 00:00:00 2001 From: Matus Kasak Date: Tue, 26 Nov 2024 12:44:38 +0100 Subject: [PATCH 01/13] Modified matomo tracking in footer component --- src/app/footer/footer.component.html | 45 +++++++++++++++------------- src/app/footer/footer.component.ts | 38 ++++++++++++++++++++++- 2 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html index 40e44a83e3b..17b8ad14da9 100644 --- a/src/app/footer/footer.component.html +++ b/src/app/footer/footer.component.html @@ -88,27 +88,30 @@

Services

ga('create', 'UA-27008245-2', 'cuni.cz'); ga('send', 'pageview'); //]]> - - - - + // + // + // + + diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index e6884d7330e..c2f8d7e7174 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -2,13 +2,16 @@ import { Component, OnInit, Optional } from '@angular/core'; import { hasValue } from '../shared/empty.util'; import { KlaroService } from '../shared/cookies/klaro.service'; import { environment } from '../../environments/environment'; -import { Observable } from 'rxjs'; +import { filter, Observable } from 'rxjs'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { RemoteData } from '../core/data/remote-data'; import { ConfigurationProperty } from '../core/shared/configuration-property.model'; import { ConfigurationDataService } from '../core/data/configuration-data.service'; +import { Angulartics2Matomo } from 'angulartics2'; +import { NavigationEnd } from '@angular/router'; + @Component({ selector: 'ds-footer', styleUrls: ['footer.component.scss'], @@ -34,6 +37,7 @@ export class FooterComponent implements OnInit { * The company name which customized this DSpace with redirection to the DSpace section */ themedByCompanyName$: Observable>; + router: any; constructor( @Optional() private cookies: KlaroService, @@ -45,6 +49,11 @@ export class FooterComponent implements OnInit { ngOnInit(): void { this.loadThemedByProps(); + this.initializeMatomoTracker(); + + this.router.events.subscribe(() => { + this.initializeMatomoTracker(); + }); } showCookieSettings() { if (hasValue(this.cookies)) { @@ -57,4 +66,31 @@ export class FooterComponent implements OnInit { this.themedByUrl$ = this.configurationDataService.findByPropertyName('themed.by.url'); this.themedByCompanyName$ = this.configurationDataService.findByPropertyName('themed.by.company.name'); } + + private initializeMatomoTracker() { + const _paq = (window as any)._paq || []; + _paq.push(["setDocumentTitle", location.hostname + "/" + document.title]); + _paq.push(["setCookieDomain", "*.mff.cuni.cz"]); + _paq.push(["setDomains", ["*.mff.cuni.cz"]]); + _paq.push(['setUserId', this.getUserId()]); + _paq.push(['setCustomVariable', 1, 'lang', 'en', 'visit']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + const u = '//dev-5.pc:8135/'; + _paq.push(['setTrackerUrl', u + 'matomo.php']); + _paq.push(['setSiteId', 1]); + + const d = document; + const g = d.createElement('script'); + const s = d.getElementsByTagName('script')[0]; + g.type = 'text/javascript'; + g.async = true; + g.defer = true; + g.src = u + 'piwik.js'; + s.parentNode?.insertBefore(g, s); + } + + private getUserId() { + return 'user123'; // change later as well as other above + } } From 28a022273938a2a0c9287b1484e5c92dc4c5f4d4 Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 12:02:47 +0100 Subject: [PATCH 02/13] tmp commit --- src/app/app.component.ts | 4 +++ src/app/app.module.ts | 2 ++ src/app/footer/footer.component.ts | 58 +++++++++++++++--------------- src/main.browser.ts | 23 ++++++++++++ 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index ba7b7382278..aff4425dce7 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -31,6 +31,7 @@ import { models } from './core/core.module'; import { ThemeService } from './shared/theme-support/theme.service'; import { IdleModalComponent } from './shared/idle-modal/idle-modal.component'; import { distinctNext } from './core/shared/distinct-next'; +import {Angulartics2Matomo} from 'angulartics2'; @Component({ selector: 'ds-app', @@ -74,6 +75,7 @@ export class AppComponent implements OnInit, AfterViewInit { private cssService: CSSVariableService, private modalService: NgbModal, private modalConfig: NgbModalConfig, + private angulartics2Matomo: Angulartics2Matomo ) { this.notificationOptions = environment.notifications; @@ -87,6 +89,8 @@ export class AppComponent implements OnInit, AfterViewInit { this.isThemeLoading$ = this.themeService.isThemeLoading$; this.storeCSSVariables(); + + angulartics2Matomo.startTracking(); } ngOnInit() { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9c88a883289..4f39e4c049a 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -31,6 +31,7 @@ import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { StoreDevModules } from '../config/store/devtools'; import { RootModule } from './root.module'; import { ScriptLoaderService } from './clarin-navbar-top/script-loader-service'; +import {Angulartics2Module} from 'angulartics2'; export function getConfig() { return environment; @@ -62,6 +63,7 @@ const IMPORTS = [ StoreDevModules, EagerThemesModule, RootModule, + Angulartics2Module.forRoot() ]; const PROVIDERS = [ diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index c2f8d7e7174..839eeb82301 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -2,15 +2,13 @@ import { Component, OnInit, Optional } from '@angular/core'; import { hasValue } from '../shared/empty.util'; import { KlaroService } from '../shared/cookies/klaro.service'; import { environment } from '../../environments/environment'; -import { filter, Observable } from 'rxjs'; +import { Observable } from 'rxjs'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { RemoteData } from '../core/data/remote-data'; import { ConfigurationProperty } from '../core/shared/configuration-property.model'; import { ConfigurationDataService } from '../core/data/configuration-data.service'; -import { Angulartics2Matomo } from 'angulartics2'; -import { NavigationEnd } from '@angular/router'; @Component({ selector: 'ds-footer', @@ -49,11 +47,11 @@ export class FooterComponent implements OnInit { ngOnInit(): void { this.loadThemedByProps(); - this.initializeMatomoTracker(); - - this.router.events.subscribe(() => { - this.initializeMatomoTracker(); - }); + // this.initializeMatomoTracker(); + // + // this.router.events.subscribe(() => { + // this.initializeMatomoTracker(); + // }); } showCookieSettings() { if (hasValue(this.cookies)) { @@ -67,28 +65,28 @@ export class FooterComponent implements OnInit { this.themedByCompanyName$ = this.configurationDataService.findByPropertyName('themed.by.company.name'); } - private initializeMatomoTracker() { - const _paq = (window as any)._paq || []; - _paq.push(["setDocumentTitle", location.hostname + "/" + document.title]); - _paq.push(["setCookieDomain", "*.mff.cuni.cz"]); - _paq.push(["setDomains", ["*.mff.cuni.cz"]]); - _paq.push(['setUserId', this.getUserId()]); - _paq.push(['setCustomVariable', 1, 'lang', 'en', 'visit']); - _paq.push(['trackPageView']); - _paq.push(['enableLinkTracking']); - const u = '//dev-5.pc:8135/'; - _paq.push(['setTrackerUrl', u + 'matomo.php']); - _paq.push(['setSiteId', 1]); - - const d = document; - const g = d.createElement('script'); - const s = d.getElementsByTagName('script')[0]; - g.type = 'text/javascript'; - g.async = true; - g.defer = true; - g.src = u + 'piwik.js'; - s.parentNode?.insertBefore(g, s); - } + // private initializeMatomoTracker() { + // const _paq = (window as any)._paq || []; + // _paq.push(["setDocumentTitle", location.hostname + "/" + document.title]); + // _paq.push(["setCookieDomain", "*.mff.cuni.cz"]); + // _paq.push(["setDomains", ["*.mff.cuni.cz"]]); + // _paq.push(['setUserId', this.getUserId()]); + // _paq.push(['setCustomVariable', 1, 'lang', 'en', 'visit']); + // _paq.push(['trackPageView']); + // _paq.push(['enableLinkTracking']); + // const u = '//dev-5.pc:8135/'; + // _paq.push(['setTrackerUrl', u + 'matomo.php']); + // _paq.push(['setSiteId', 1]); + // + // const d = document; + // const g = d.createElement('script'); + // const s = d.getElementsByTagName('script')[0]; + // g.type = 'text/javascript'; + // g.async = true; + // g.defer = true; + // g.src = u + 'piwik.js'; + // s.parentNode?.insertBefore(g, s); + // } private getUserId() { return 'user123'; // change later as well as other above diff --git a/src/main.browser.ts b/src/main.browser.ts index 43b2ffbaf40..0dc4865cff8 100644 --- a/src/main.browser.ts +++ b/src/main.browser.ts @@ -42,6 +42,29 @@ const main = () => { } }; +function addMatomoStatistics() { + // @ts-ignore + let _paq = _paq || []; + /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ + // _paq.push(['trackPageView']); // DELETE THIS LINE + _paq.push(['enableLinkTracking']); + (function() { + let u = 'http://localhost:8135/'; + _paq.push(['setDocumentTitle', location.hostname + '/' + document.title]); + _paq.push(['setCookieDomain', '*dev-5.pc*']); + _paq.push(['setDomains', ['*dev-5.pc*']]); + _paq.push(['setUserId', this.getUserId()]); + // _paq.push(['setCustomVariable', 1, 'lang', 'en', 'visit']); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + _paq.push(['setTrackerUrl', u + 'matomo.php']); + _paq.push(['setSiteId', 1]); + + let d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; + g.type = 'text/javascript'; g.async = true; g.defer = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g,s); + })(); +} + // support async tag or hmr if (document.readyState === 'complete' && !hasTransferState) { main(); From 2d2c74e9cc5ea004bf050c8c17c9cb73e0ee0942 Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 14:38:57 +0100 Subject: [PATCH 03/13] Do not use routerless Matomo because we want to track view on every page redirect --- src/modules/app/browser-app.module.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index d6295cf791d..340cde975af 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -15,7 +15,11 @@ import { AppModule } from '../../app/app.module'; import { ClientCookieService } from '../../app/core/services/client-cookie.service'; import { CookieService } from '../../app/core/services/cookie.service'; import { AuthService } from '../../app/core/auth/auth.service'; -import { Angulartics2GoogleTagManager, Angulartics2RouterlessModule } from 'angulartics2'; +import { + Angulartics2GoogleTagManager, + Angulartics2Matomo, + Angulartics2Module, +} from 'angulartics2'; import { SubmissionService } from '../../app/submission/submission.service'; import { StatisticsModule } from '../../app/statistics/statistics.module'; import { BrowserKlaroService } from '../../app/shared/cookies/browser-klaro.service'; @@ -54,7 +58,7 @@ export function getRequest(transferState: TransferState): any { // forRoot ensures the providers are only created once IdlePreloadModule.forRoot(), StatisticsModule.forRoot(), - Angulartics2RouterlessModule.forRoot(), + Angulartics2Module.forRoot(), BrowserAnimationsModule, BrowserTransferStateModule, TranslateModule.forRoot({ From 71e8ca4a69b0aef296d57a27f637568dfe6c8b1f Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 16:46:18 +0100 Subject: [PATCH 04/13] The Matomo statistics are tracked properly. --- src/app/app.component.ts | 2 +- src/app/footer/footer.component.html | 27 +---------------------- src/app/footer/footer.component.ts | 32 --------------------------- src/main.browser.ts | 33 ++++++++++++---------------- src/matomo-settings.ts | 7 ++++++ 5 files changed, 23 insertions(+), 78 deletions(-) create mode 100644 src/matomo-settings.ts diff --git a/src/app/app.component.ts b/src/app/app.component.ts index aff4425dce7..51f82794a9e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -90,7 +90,7 @@ export class AppComponent implements OnInit, AfterViewInit { this.storeCSSVariables(); - angulartics2Matomo.startTracking(); + this.angulartics2Matomo.startTracking(); } ngOnInit() { diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html index 17b8ad14da9..b5ba6d5af1e 100644 --- a/src/app/footer/footer.component.html +++ b/src/app/footer/footer.component.html @@ -88,32 +88,7 @@

Services

ga('create', 'UA-27008245-2', 'cuni.cz'); ga('send', 'pageview'); //]]> - // - // - // - - - - + diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index 839eeb82301..67ba02fbe87 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -47,11 +47,6 @@ export class FooterComponent implements OnInit { ngOnInit(): void { this.loadThemedByProps(); - // this.initializeMatomoTracker(); - // - // this.router.events.subscribe(() => { - // this.initializeMatomoTracker(); - // }); } showCookieSettings() { if (hasValue(this.cookies)) { @@ -64,31 +59,4 @@ export class FooterComponent implements OnInit { this.themedByUrl$ = this.configurationDataService.findByPropertyName('themed.by.url'); this.themedByCompanyName$ = this.configurationDataService.findByPropertyName('themed.by.company.name'); } - - // private initializeMatomoTracker() { - // const _paq = (window as any)._paq || []; - // _paq.push(["setDocumentTitle", location.hostname + "/" + document.title]); - // _paq.push(["setCookieDomain", "*.mff.cuni.cz"]); - // _paq.push(["setDomains", ["*.mff.cuni.cz"]]); - // _paq.push(['setUserId', this.getUserId()]); - // _paq.push(['setCustomVariable', 1, 'lang', 'en', 'visit']); - // _paq.push(['trackPageView']); - // _paq.push(['enableLinkTracking']); - // const u = '//dev-5.pc:8135/'; - // _paq.push(['setTrackerUrl', u + 'matomo.php']); - // _paq.push(['setSiteId', 1]); - // - // const d = document; - // const g = d.createElement('script'); - // const s = d.getElementsByTagName('script')[0]; - // g.type = 'text/javascript'; - // g.async = true; - // g.defer = true; - // g.src = u + 'piwik.js'; - // s.parentNode?.insertBefore(g, s); - // } - - private getUserId() { - return 'user123'; // change later as well as other above - } } diff --git a/src/main.browser.ts b/src/main.browser.ts index 0dc4865cff8..848e2bb0f1b 100644 --- a/src/main.browser.ts +++ b/src/main.browser.ts @@ -10,6 +10,7 @@ import { environment } from './environments/environment'; import { AppConfig } from './config/app-config.interface'; import { extendEnvironmentWithAppConfig } from './config/config.util'; import { enableProdMode } from '@angular/core'; +import { matomoSettings } from './matomo-settings'; const bootstrap = () => platformBrowserDynamic() .bootstrapModule(BrowserAppModule, {}); @@ -26,6 +27,7 @@ const main = () => { if (environment.production) { enableProdMode(); } + addMatomoStatistics(); if (hasTransferState) { // Configuration will be taken from transfer state during initialization @@ -43,26 +45,19 @@ const main = () => { }; function addMatomoStatistics() { - // @ts-ignore - let _paq = _paq || []; - /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ - // _paq.push(['trackPageView']); // DELETE THIS LINE - _paq.push(['enableLinkTracking']); - (function() { - let u = 'http://localhost:8135/'; - _paq.push(['setDocumentTitle', location.hostname + '/' + document.title]); - _paq.push(['setCookieDomain', '*dev-5.pc*']); - _paq.push(['setDomains', ['*dev-5.pc*']]); - _paq.push(['setUserId', this.getUserId()]); - // _paq.push(['setCustomVariable', 1, 'lang', 'en', 'visit']); - _paq.push(['trackPageView']); - _paq.push(['enableLinkTracking']); - _paq.push(['setTrackerUrl', u + 'matomo.php']); - _paq.push(['setSiteId', 1]); + (window as any)._paq = (window as any)._paq || []; - let d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; - g.type = 'text/javascript'; g.async = true; g.defer = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g,s); - })(); + // Push all configuration commands first + (window as any)._paq.push(['setTrackerUrl', matomoSettings.hostUrl + 'matomo.php']); + (window as any)._paq.push(['setSiteId', matomoSettings.siteId]); + (window as any)._paq.push(['enableLinkTracking']); + + const g = document.createElement('script'); + g.type = 'text/javascript'; + g.async = true; + g.defer = true; + g.src = matomoSettings.hostUrl + 'matomo.js'; + document.getElementsByTagName('head')[0].appendChild(g); } // support async tag or hmr diff --git a/src/matomo-settings.ts b/src/matomo-settings.ts new file mode 100644 index 00000000000..e0217cfb66b --- /dev/null +++ b/src/matomo-settings.ts @@ -0,0 +1,7 @@ +/** + * Matomo settings for tracking statistics. This file could be mounted in the docker container. + */ +export const matomoSettings = { + hostUrl: 'http://localhost:8135/', + siteId: '1' +}; From d91fda80d1fd7ddf7adb9524a5cad950a01ece0f Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 16:50:11 +0100 Subject: [PATCH 05/13] Prettyfied the code --- src/app/app.component.ts | 2 +- src/app/app.module.ts | 2 +- src/app/footer/footer.component.ts | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 51f82794a9e..39a16f315d4 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -31,7 +31,7 @@ import { models } from './core/core.module'; import { ThemeService } from './shared/theme-support/theme.service'; import { IdleModalComponent } from './shared/idle-modal/idle-modal.component'; import { distinctNext } from './core/shared/distinct-next'; -import {Angulartics2Matomo} from 'angulartics2'; +import { Angulartics2Matomo } from 'angulartics2'; @Component({ selector: 'ds-app', diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 4f39e4c049a..18b3b016b35 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -31,7 +31,7 @@ import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { StoreDevModules } from '../config/store/devtools'; import { RootModule } from './root.module'; import { ScriptLoaderService } from './clarin-navbar-top/script-loader-service'; -import {Angulartics2Module} from 'angulartics2'; +import { Angulartics2Module } from 'angulartics2'; export function getConfig() { return environment; diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index 67ba02fbe87..e6884d7330e 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -9,7 +9,6 @@ import { RemoteData } from '../core/data/remote-data'; import { ConfigurationProperty } from '../core/shared/configuration-property.model'; import { ConfigurationDataService } from '../core/data/configuration-data.service'; - @Component({ selector: 'ds-footer', styleUrls: ['footer.component.scss'], @@ -35,7 +34,6 @@ export class FooterComponent implements OnInit { * The company name which customized this DSpace with redirection to the DSpace section */ themedByCompanyName$: Observable>; - router: any; constructor( @Optional() private cookies: KlaroService, From ce1a07343bb86edec13ae0773cdb1955d338ecd4 Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 17:04:13 +0100 Subject: [PATCH 06/13] Fix linting error --- src/modules/app/browser-app.module.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index 340cde975af..a66f9c3a1ba 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -17,7 +17,6 @@ import { CookieService } from '../../app/core/services/cookie.service'; import { AuthService } from '../../app/core/auth/auth.service'; import { Angulartics2GoogleTagManager, - Angulartics2Matomo, Angulartics2Module, } from 'angulartics2'; import { SubmissionService } from '../../app/submission/submission.service'; From 64a939c805e2e7a72c2477b759ecaf011c122192 Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 17:45:49 +0100 Subject: [PATCH 07/13] Fixed unit tests following the matomo statistics update --- src/app/app.component.spec.ts | 2 ++ src/app/footer/footer.component.spec.ts | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index e921c67acea..459463cdac7 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -36,6 +36,7 @@ import { getMockThemeService } from './shared/mocks/theme-service.mock'; import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; import { APP_CONFIG } from '../config/app-config.interface'; import { environment } from '../environments/environment'; +import { Angulartics2Matomo } from 'angulartics2'; let comp: AppComponent; let fixture: ComponentFixture; @@ -73,6 +74,7 @@ describe('App component', () => { { provide: NativeWindowService, useValue: new NativeWindowRef() }, { provide: MetadataService, useValue: new MetadataServiceMock() }, { provide: Angulartics2DSpace, useValue: new AngularticsProviderMock() }, + { provide: Angulartics2Matomo, useValue: new AngularticsProviderMock() }, { provide: AuthService, useValue: new AuthServiceMock() }, { provide: Router, useValue: new RouterMock() }, { provide: ActivatedRoute, useValue: new MockActivatedRoute() }, diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts index 593a9f9e51d..17fc236733a 100644 --- a/src/app/footer/footer.component.spec.ts +++ b/src/app/footer/footer.component.spec.ts @@ -62,10 +62,6 @@ describe('Footer component', () => { fixture = TestBed.createComponent(FooterComponent); comp = fixture.componentInstance; // component test instance - - // query for the title

by CSS element selector - de = fixture.debugElement.query(By.css('p')); - el = de.nativeElement; }); it('should create footer', inject([FooterComponent], (app: FooterComponent) => { From a860e0ac5ee60066699c748dd68aae1a833a575e Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 18:02:28 +0100 Subject: [PATCH 08/13] Fixed linting error --- src/app/footer/footer.component.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts index 17fc236733a..e193db48612 100644 --- a/src/app/footer/footer.component.spec.ts +++ b/src/app/footer/footer.component.spec.ts @@ -5,8 +5,6 @@ import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { By } from '@angular/platform-browser'; - import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { StoreModule } from '@ngrx/store'; From d4d5f66b0df790b291ed5c290ed7785d6da37aea Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Thu, 28 Nov 2024 18:48:59 +0100 Subject: [PATCH 09/13] Added a document title in the footer --- src/app/footer/footer.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html index b5ba6d5af1e..6adc41c5d67 100644 --- a/src/app/footer/footer.component.html +++ b/src/app/footer/footer.component.html @@ -78,6 +78,8 @@

Services

Icons © Smashicons and Freepik from flaticon.com licensed by CC 3.0 BY
website © 2022 by ÚFAL