mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-17 15:03:07 +00:00
129694: PoC #4099 solution with resolvers
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
*ngVar="(collectionRD$ | async) as collectionRD">
|
||||
<div *ngIf="collectionRD?.hasSucceeded" @fadeInOut>
|
||||
<div *ngIf="collectionRD?.payload as collection">
|
||||
<ds-view-tracker [object]="collection"></ds-view-tracker>
|
||||
<div class="d-flex flex-row border-bottom mb-4 pb-4">
|
||||
<header class="comcol-header mr-auto">
|
||||
<!-- Collection Name -->
|
||||
|
@@ -1,7 +1,6 @@
|
||||
<div class="container" *ngVar="(communityRD$ | async) as communityRD">
|
||||
<div class="community-page" *ngIf="communityRD?.hasSucceeded" @fadeInOut>
|
||||
<div *ngIf="communityRD?.payload; let communityPayload">
|
||||
<ds-view-tracker [object]="communityPayload"></ds-view-tracker>
|
||||
<div class="d-flex flex-row border-bottom mb-4 pb-4">
|
||||
<header class="comcol-header mr-auto">
|
||||
<!-- Community name -->
|
||||
|
@@ -1,8 +1,5 @@
|
||||
<ds-themed-home-news></ds-themed-home-news>
|
||||
<div class="container">
|
||||
<ng-container *ngIf="(site$ | async) as site">
|
||||
<ds-view-tracker [object]="site"></ds-view-tracker>
|
||||
</ng-container>
|
||||
<ds-themed-search-form [inPlaceSearch]="false" [searchPlaceholder]="'home.search-form.placeholder' | translate"></ds-themed-search-form>
|
||||
<ds-themed-top-level-community-list></ds-themed-top-level-community-list>
|
||||
<ds-recent-item-list *ngIf="recentSubmissionspageSize>0"></ds-recent-item-list>
|
||||
|
@@ -3,7 +3,6 @@
|
||||
<div *ngIf="itemRD?.payload as item">
|
||||
<ds-themed-item-alerts [item]="item"></ds-themed-item-alerts>
|
||||
<ds-item-versions-notice [item]="item"></ds-item-versions-notice>
|
||||
<ds-view-tracker [object]="item"></ds-view-tracker>
|
||||
<div *ngIf="!item.isWithdrawn || (isAdmin$|async)" class="full-item-info">
|
||||
<div class="d-flex flex-row">
|
||||
<ds-themed-item-page-title-field class="mr-auto" [item]="item"></ds-themed-item-page-title-field>
|
||||
|
@@ -3,7 +3,6 @@
|
||||
<div *ngIf="itemRD?.payload as item">
|
||||
<ds-themed-item-alerts [item]="item"></ds-themed-item-alerts>
|
||||
<ds-item-versions-notice [item]="item"></ds-item-versions-notice>
|
||||
<ds-view-tracker [object]="item"></ds-view-tracker>
|
||||
<ds-listable-object-component-loader *ngIf="!item.isWithdrawn || (isAdmin$|async)" [object]="item" [viewMode]="viewMode"></ds-listable-object-component-loader>
|
||||
<ds-item-versions class="mt-2" [item]="item" [displayActions]="false"></ds-item-versions>
|
||||
</div>
|
||||
|
@@ -0,0 +1,66 @@
|
||||
import {
|
||||
AfterViewChecked, AfterViewInit,
|
||||
Component, Injectable,
|
||||
Input,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
} from '@angular/core';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
import { Observable, Subscription, switchMap } from 'rxjs';
|
||||
import { filter, take } from 'rxjs/operators';
|
||||
|
||||
import { ReferrerService } from '../../../core/services/referrer.service';
|
||||
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
|
||||
import { hasValue } from '../../../shared/empty.util';
|
||||
import { ActivatedRoute, ActivatedRouteSnapshot, Resolve, ResolveEnd, Router, RouterStateSnapshot } from '@angular/router';
|
||||
import { BreadcrumbConfig } from '../../../breadcrumbs/breadcrumb/breadcrumb-config.model';
|
||||
import { SubmissionObject } from '../../../core/submission/models/submission-object.model';
|
||||
|
||||
/**
|
||||
* This component triggers a page view statistic
|
||||
*/
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class ViewTrackerResolverService {
|
||||
|
||||
constructor(
|
||||
public angulartics2: Angulartics2,
|
||||
public referrerService: ReferrerService,
|
||||
public router: Router,
|
||||
) {
|
||||
}
|
||||
|
||||
resolve(routeSnapshot: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
|
||||
const dsoPath = routeSnapshot.data['dsoPath'] || 'dso.payload'; // Fetch the resolvers passed via the route data
|
||||
this.router.events.pipe(
|
||||
filter(event => event instanceof ResolveEnd),
|
||||
take(1),
|
||||
switchMap(() =>
|
||||
this.referrerService.getReferrer().pipe(take(1))))
|
||||
.subscribe((referrer: string) => {
|
||||
this.angulartics2.eventTrack.next({
|
||||
action: 'page_view',
|
||||
properties: {
|
||||
object: this.getNestedProperty(routeSnapshot.data, dsoPath),
|
||||
referrer,
|
||||
},
|
||||
});
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
private getNestedProperty(obj: any, path: string) {
|
||||
const keys = path.split('.');
|
||||
let result = obj;
|
||||
|
||||
for (const key of keys) {
|
||||
if (result && result.hasOwnProperty(key)) {
|
||||
result = result[key];
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
@@ -1 +0,0 @@
|
||||
|
@@ -1,3 +0,0 @@
|
||||
:host {
|
||||
display: none
|
||||
}
|
@@ -1,56 +0,0 @@
|
||||
import { Component, Input, OnInit, OnDestroy } from '@angular/core';
|
||||
import { Angulartics2 } from 'angulartics2';
|
||||
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
|
||||
import { Subscription } from 'rxjs/internal/Subscription';
|
||||
import { take } from 'rxjs/operators';
|
||||
import { hasValue } from '../../../shared/empty.util';
|
||||
import { ReferrerService } from '../../../core/services/referrer.service';
|
||||
|
||||
/**
|
||||
* This component triggers a page view statistic
|
||||
*/
|
||||
@Component({
|
||||
selector: 'ds-view-tracker',
|
||||
styleUrls: ['./view-tracker.component.scss'],
|
||||
templateUrl: './view-tracker.component.html',
|
||||
})
|
||||
export class ViewTrackerComponent implements OnInit, OnDestroy {
|
||||
/**
|
||||
* The DSpaceObject to track a view event about
|
||||
*/
|
||||
@Input() object: DSpaceObject;
|
||||
|
||||
/**
|
||||
* The subscription on this.referrerService.getReferrer()
|
||||
* @protected
|
||||
*/
|
||||
protected sub: Subscription;
|
||||
|
||||
constructor(
|
||||
public angulartics2: Angulartics2,
|
||||
public referrerService: ReferrerService
|
||||
) {
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.sub = this.referrerService.getReferrer()
|
||||
.pipe(take(1))
|
||||
.subscribe((referrer: string) => {
|
||||
this.angulartics2.eventTrack.next({
|
||||
action: 'page_view',
|
||||
properties: {
|
||||
object: this.object,
|
||||
referrer
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
// unsubscribe in the case that this component is destroyed before
|
||||
// this.referrerService.getReferrer() has emitted
|
||||
if (hasValue(this.sub)) {
|
||||
this.sub.unsubscribe();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
import { inject } from '@angular/core';
|
||||
import { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot, } from '@angular/router';
|
||||
import { ViewTrackerResolverService } from './view-tracker-resolver.service';
|
||||
|
||||
export const viewTrackerResolver: ResolveFn<boolean> = (
|
||||
route: ActivatedRouteSnapshot,
|
||||
state: RouterStateSnapshot,
|
||||
viewTrackerResolverService: ViewTrackerResolverService = inject(ViewTrackerResolverService),
|
||||
): boolean => {
|
||||
return viewTrackerResolverService.resolve(route, state);
|
||||
};
|
Reference in New Issue
Block a user