favicon YandexMetrika googleAnalytics
parent
225387d5ec
commit
d8ff044f22
|
|
@ -19,6 +19,8 @@
|
||||||
"@angular/router": "^18.0.0",
|
"@angular/router": "^18.0.0",
|
||||||
"@angular/ssr": "^18.0.0",
|
"@angular/ssr": "^18.0.0",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"ng-yandex-metrika": "^17.1.2",
|
||||||
|
"ngx-google-analytics": "^14.0.1",
|
||||||
"rxjs": "~7.8.0",
|
"rxjs": "~7.8.0",
|
||||||
"swiper": "^11.1.3",
|
"swiper": "^11.1.3",
|
||||||
"tslib": "^2.3.0",
|
"tslib": "^2.3.0",
|
||||||
|
|
@ -8854,6 +8856,30 @@
|
||||||
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/ng-yandex-metrika": {
|
||||||
|
"version": "17.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ng-yandex-metrika/-/ng-yandex-metrika-17.1.2.tgz",
|
||||||
|
"integrity": "sha512-2VZCjEpEJvnMqjZfsRRzloaOWEQXqy6npzOBupqcm0o9VFl/SeEa2dmJN6V0HpD7GGdUFl7T9MQguti1rB4N7A==",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.3.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "^17.0.0",
|
||||||
|
"@angular/compiler": "^17.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/ngx-google-analytics": {
|
||||||
|
"version": "14.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ngx-google-analytics/-/ngx-google-analytics-14.0.1.tgz",
|
||||||
|
"integrity": "sha512-PfOtnshSyq15EKevKlFW9IRgH+dTtPG4Q9HJYksuRNYDzjce0eqK3Bf6hz0tAZdyqbzTCyx5g+NgWBfpqQfb2w==",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.4.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": ">=12.0.0",
|
||||||
|
"@angular/core": ">=12.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/nice-napi": {
|
"node_modules/nice-napi": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@
|
||||||
"@angular/router": "^18.0.0",
|
"@angular/router": "^18.0.0",
|
||||||
"@angular/ssr": "^18.0.0",
|
"@angular/ssr": "^18.0.0",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"ng-yandex-metrika": "^17.1.2",
|
||||||
|
"ngx-google-analytics": "^14.0.1",
|
||||||
"rxjs": "~7.8.0",
|
"rxjs": "~7.8.0",
|
||||||
"swiper": "^11.1.3",
|
"swiper": "^11.1.3",
|
||||||
"tslib": "^2.3.0",
|
"tslib": "^2.3.0",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { NavigationEnd, Router } from '@angular/router';
|
||||||
|
import { environment } from '../../environments/environment';
|
||||||
|
|
||||||
|
declare var gtag: Function;
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root',
|
||||||
|
})
|
||||||
|
export class GoogleAnalyticsService {
|
||||||
|
constructor(private router: Router) {}
|
||||||
|
|
||||||
|
public initialize() {
|
||||||
|
this.onRouteChange();
|
||||||
|
|
||||||
|
// dynamically add analytics scripts to document head
|
||||||
|
try {
|
||||||
|
const url = 'https://www.googletagmanager.com/gtag/js?id=';
|
||||||
|
const gTagScript = document.createElement('script');
|
||||||
|
gTagScript.async = true;
|
||||||
|
gTagScript.src = `${url}${environment.googleAnalyticsId}`;
|
||||||
|
document.head.appendChild(gTagScript);
|
||||||
|
|
||||||
|
const dataLayerScript = document.createElement('script');
|
||||||
|
dataLayerScript.innerHTML = `
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
gtag('config', '${environment.googleAnalyticsId}', {'send_page_view': false});`;
|
||||||
|
document.head.appendChild(dataLayerScript);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Error adding Google Analytics', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// track visited routes
|
||||||
|
private onRouteChange() {
|
||||||
|
this.router.events.subscribe((event) => {
|
||||||
|
if (event instanceof NavigationEnd) {
|
||||||
|
gtag('config', environment.googleAnalyticsId, {
|
||||||
|
page_path: event.urlAfterRedirects,
|
||||||
|
});
|
||||||
|
console.log('Sending Google Analytics tracking for: ', event.urlAfterRedirects);
|
||||||
|
console.log('Google Analytics property ID: ', environment.googleAnalyticsId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// use gtag.js to send Google Analytics Events
|
||||||
|
public event(action: string, eventCategory?: string, eventLabel?: string, value?: string) {
|
||||||
|
gtag('event', action, {
|
||||||
|
...(eventCategory && { event_category: eventCategory }),
|
||||||
|
...(eventLabel && { event_label: eventLabel }),
|
||||||
|
...(value && { value: value }),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
import { Component } from '@angular/core';
|
import {Component, OnInit} from '@angular/core';
|
||||||
import { CommonModule, DatePipe, ViewportScroller } from '@angular/common';
|
import { CommonModule, DatePipe, ViewportScroller } from '@angular/common';
|
||||||
import { RouterOutlet, NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';
|
import { RouterOutlet, NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';
|
||||||
import { RequestComponent } from './request/request.component';
|
import { RequestComponent } from './request/request.component';
|
||||||
|
import {GoogleAnalyticsService} from "./_services/googleAnalytics.service";
|
||||||
|
import {environment} from "../environments/environment";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-root',
|
selector: 'app-root',
|
||||||
|
|
@ -10,7 +12,7 @@ import { RequestComponent } from './request/request.component';
|
||||||
templateUrl: './app.component.html',
|
templateUrl: './app.component.html',
|
||||||
styleUrl: './app.component.scss'
|
styleUrl: './app.component.scss'
|
||||||
})
|
})
|
||||||
export class AppComponent {
|
export class AppComponent implements OnInit{
|
||||||
|
|
||||||
title = 'NIR';
|
title = 'NIR';
|
||||||
dateNow?: Date;
|
dateNow?: Date;
|
||||||
|
|
@ -18,11 +20,15 @@ export class AppComponent {
|
||||||
|
|
||||||
ngOnInit(){
|
ngOnInit(){
|
||||||
this.dateNow = new Date;
|
this.dateNow = new Date;
|
||||||
|
if (environment.production) {
|
||||||
|
this.googleAnalyticsService.initialize();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
readonly router: Router,
|
readonly router: Router,
|
||||||
readonly viewportScroller: ViewportScroller,
|
readonly viewportScroller: ViewportScroller,
|
||||||
|
private readonly googleAnalyticsService: GoogleAnalyticsService
|
||||||
) {
|
) {
|
||||||
|
|
||||||
router.events.subscribe((event) => {
|
router.events.subscribe((event) => {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
|
import {ApplicationConfig, importProvidersFrom, provideZoneChangeDetection} from '@angular/core';
|
||||||
import { provideRouter } from '@angular/router';
|
import { provideRouter } from '@angular/router';
|
||||||
import { provideHttpClient, withFetch } from '@angular/common/http';
|
import { provideHttpClient, withFetch } from '@angular/common/http';
|
||||||
import { routes } from './app.routes';
|
import { routes } from './app.routes';
|
||||||
import { provideClientHydration } from '@angular/platform-browser';
|
import { provideClientHydration } from '@angular/platform-browser';
|
||||||
|
import {MetrikaModule} from "ng-yandex-metrika";
|
||||||
|
|
||||||
export const appConfig: ApplicationConfig = {
|
export const appConfig: ApplicationConfig = {
|
||||||
providers: [
|
providers: [
|
||||||
|
|
@ -10,5 +11,10 @@ export const appConfig: ApplicationConfig = {
|
||||||
provideRouter(routes),
|
provideRouter(routes),
|
||||||
provideClientHydration(),
|
provideClientHydration(),
|
||||||
provideHttpClient(withFetch()),
|
provideHttpClient(withFetch()),
|
||||||
|
importProvidersFrom(
|
||||||
|
MetrikaModule.forRoot([
|
||||||
|
{ id: 97262465, webvisor: true, accurateTrackBounce:true, clickmap:true, trackLinks:true, }
|
||||||
|
])
|
||||||
|
)
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { FormsService } from '../_services/forms.service';
|
||||||
import {FormGroup, ReactiveFormsModule, FormBuilder, Validators} from "@angular/forms";
|
import {FormGroup, ReactiveFormsModule, FormBuilder, Validators} from "@angular/forms";
|
||||||
import {ActivatedRoute, Router} from "@angular/router";
|
import {ActivatedRoute, Router} from "@angular/router";
|
||||||
import {NgIf} from "@angular/common";
|
import {NgIf} from "@angular/common";
|
||||||
|
import {Metrika} from "ng-yandex-metrika";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'request',
|
selector: 'request',
|
||||||
|
|
@ -22,7 +23,7 @@ export class RequestComponent implements OnInit {
|
||||||
public utmContent:string;
|
public utmContent:string;
|
||||||
public utmTerm:string;
|
public utmTerm:string;
|
||||||
|
|
||||||
constructor(private formBuilder:FormBuilder, private formsService: FormsService, private router: ActivatedRoute) {
|
constructor(private formBuilder:FormBuilder, private formsService: FormsService, private router: ActivatedRoute, private metrika: Metrika) {
|
||||||
this.router.queryParams.subscribe(params =>{
|
this.router.queryParams.subscribe(params =>{
|
||||||
this.utmSource = params['utm_source'];
|
this.utmSource = params['utm_source'];
|
||||||
this.utmMedium = params['utm_medium'];
|
this.utmMedium = params['utm_medium'];
|
||||||
|
|
@ -55,6 +56,7 @@ export class RequestComponent implements OnInit {
|
||||||
open(){
|
open(){
|
||||||
this.hidden = false;
|
this.hidden = false;
|
||||||
this.success = false;
|
this.success = false;
|
||||||
|
this.metrika.reachGoal('form-open').then();
|
||||||
this.ngOnInit()
|
this.ngOnInit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -68,6 +70,7 @@ export class RequestComponent implements OnInit {
|
||||||
this.feedbackForm.markAllAsTouched();
|
this.feedbackForm.markAllAsTouched();
|
||||||
if (this.feedbackForm.valid)
|
if (this.feedbackForm.valid)
|
||||||
this.formsService.save('model', 'feedback-form-support', null, this.feedbackForm.value).subscribe(res => {
|
this.formsService.save('model', 'feedback-form-support', null, this.feedbackForm.value).subscribe(res => {
|
||||||
|
this.metrika.reachGoal('form-sent').then();
|
||||||
this.success = true;
|
this.success = true;
|
||||||
}, error => {
|
}, error => {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
|
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 149 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 481 B After Width: | Height: | Size: 718 B |
|
|
@ -1,5 +1,4 @@
|
||||||
<svg width="192" height="192" viewBox="0 0 192 192" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg width="192" height="192" viewBox="0 0 192 192" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<rect width="192" height="192" fill="white"/>
|
<rect width="192" height="192" fill="#1D45F0"/>
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M168 120V168H120V156H156V120H168ZM168 72V24H120V36H156V72H168ZM72 36V24H24V72H36V36H72ZM72 156H36V120H24V168H72V156Z" fill="#585858"/>
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M168 108V168H108V144H144V108H168ZM168 84V24H108V48H144V84H168ZM84 48V24H24V84H48V48H84ZM84 144H48V108H24V168H84V144Z" fill="white"/>
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M60 60H84V84H108V60H132V84V108V132H108V108H84V132H60V108V84V60Z" fill="#585858"/>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 468 B After Width: | Height: | Size: 337 B |
|
|
@ -4,4 +4,5 @@ export const environment = {
|
||||||
clientId: 2,
|
clientId: 2,
|
||||||
clientSecret: 'YllFbaRHMP0kCJLb0UdCcOfpTzA23ea3AOdIfRMj',
|
clientSecret: 'YllFbaRHMP0kCJLb0UdCcOfpTzA23ea3AOdIfRMj',
|
||||||
domenUrl: 'http://localhost:4200',
|
domenUrl: 'http://localhost:4200',
|
||||||
|
googleAnalyticsId: 'G-B8183299MH',
|
||||||
};
|
};
|
||||||
|
|
@ -4,4 +4,5 @@ export const environment = {
|
||||||
clientId: 2,
|
clientId: 2,
|
||||||
clientSecret: 'KIWaOS7ML1ZEUmgByFN5Cf9wf0pHFWjYJ5rmOboX',
|
clientSecret: 'KIWaOS7ML1ZEUmgByFN5Cf9wf0pHFWjYJ5rmOboX',
|
||||||
domenUrl: 'https://nirgroup.ru',
|
domenUrl: 'https://nirgroup.ru',
|
||||||
|
googleAnalyticsId: 'G-B8183299MH',
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue