From 99384a70605b2eccaaae249103673c3735da8c85 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Tue, 21 May 2024 12:02:15 +0200 Subject: [PATCH 001/125] 115051: Created ThemedAdminSearchPageComponent --- src/app/admin/admin-routing.module.ts | 4 +-- .../admin-search-page/admin-search.module.ts | 2 ++ .../themed-admin-search-page.component.ts | 26 +++++++++++++++++++ .../admin-search-page.component.html | 0 .../admin-search-page.component.scss | 0 .../admin-search-page.component.ts | 12 +++++++++ src/themes/custom/lazy-theme.module.ts | 4 +-- 7 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 src/app/admin/admin-search-page/themed-admin-search-page.component.ts create mode 100644 src/themes/custom/app/admin/admin-search-page/admin-search-page.component.html create mode 100644 src/themes/custom/app/admin/admin-search-page/admin-search-page.component.scss create mode 100644 src/themes/custom/app/admin/admin-search-page/admin-search-page.component.ts diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index 1ea20bc9a0..3e3a8924ac 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { MetadataImportPageComponent } from './admin-import-metadata-page/metadata-import-page.component'; -import { AdminSearchPageComponent } from './admin-search-page/admin-search-page.component'; +import { ThemedAdminSearchPageComponent } from './admin-search-page/themed-admin-search-page.component'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; @@ -20,7 +20,7 @@ import { BatchImportPageComponent } from './admin-import-batch-page/batch-import { path: 'search', resolve: { breadcrumb: I18nBreadcrumbResolver }, - component: AdminSearchPageComponent, + component: ThemedAdminSearchPageComponent, data: { title: 'admin.search.title', breadcrumbKey: 'admin.search' } }, { diff --git a/src/app/admin/admin-search-page/admin-search.module.ts b/src/app/admin/admin-search-page/admin-search.module.ts index 353d6dd498..b45eca15c4 100644 --- a/src/app/admin/admin-search-page/admin-search.module.ts +++ b/src/app/admin/admin-search-page/admin-search.module.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '../../shared/shared.module'; +import { ThemedAdminSearchPageComponent } from './themed-admin-search-page.component'; import { AdminSearchPageComponent } from './admin-search-page.component'; import { ItemAdminSearchResultListElementComponent } from './admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component'; import { CommunityAdminSearchResultListElementComponent } from './admin-search-results/admin-search-result-list-element/community-search-result/community-admin-search-result-list-element.component'; @@ -31,6 +32,7 @@ const ENTRY_COMPONENTS = [ ResearchEntitiesModule.withEntryComponents() ], declarations: [ + ThemedAdminSearchPageComponent, AdminSearchPageComponent, ...ENTRY_COMPONENTS ] diff --git a/src/app/admin/admin-search-page/themed-admin-search-page.component.ts b/src/app/admin/admin-search-page/themed-admin-search-page.component.ts new file mode 100644 index 0000000000..741a3b04f9 --- /dev/null +++ b/src/app/admin/admin-search-page/themed-admin-search-page.component.ts @@ -0,0 +1,26 @@ +import { Component } from '@angular/core'; +import { ThemedComponent } from '../../shared/theme-support/themed.component'; +import { AdminSearchPageComponent } from './admin-search-page.component'; + +/** + * Themed wrapper for {@link AdminSearchPageComponent} + */ +@Component({ + selector: 'ds-themed-admin-search-page', + templateUrl: '../../shared/theme-support/themed.component.html', +}) +export class ThemedAdminSearchPageComponent extends ThemedComponent { + + protected getComponentName(): string { + return 'AdminSearchPageComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../themes/${themeName}/app/admin/admin-search-page/admin-search-page.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./admin-search-page.component'); + } + +} diff --git a/src/themes/custom/app/admin/admin-search-page/admin-search-page.component.html b/src/themes/custom/app/admin/admin-search-page/admin-search-page.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/admin/admin-search-page/admin-search-page.component.scss b/src/themes/custom/app/admin/admin-search-page/admin-search-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/admin/admin-search-page/admin-search-page.component.ts b/src/themes/custom/app/admin/admin-search-page/admin-search-page.component.ts new file mode 100644 index 0000000000..358f11f0d1 --- /dev/null +++ b/src/themes/custom/app/admin/admin-search-page/admin-search-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { AdminSearchPageComponent as BaseComponent } from '../../../../../app/admin/admin-search-page/admin-search-page.component'; + +@Component({ + selector: 'ds-admin-search-page', + // styleUrls: ['./admin-search-page.component.scss'], + styleUrls: ['../../../../../app/admin/admin-search-page/admin-search-page.component.scss'], + // templateUrl: './admin-search-page.component.html', + templateUrl: '../../../../../app/admin/admin-search-page/admin-search-page.component.html', +}) +export class AdminSearchPageComponent extends BaseComponent { +} diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index d2ac0ae787..4f35854e5e 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -114,6 +114,7 @@ import { ObjectListComponent } from './app/shared/object-list/object-list.compon import { BrowseByMetadataPageComponent } from './app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component'; import { BrowseByDatePageComponent } from './app/browse-by/browse-by-date-page/browse-by-date-page.component'; import { BrowseByTitlePageComponent } from './app/browse-by/browse-by-title-page/browse-by-title-page.component'; +import { AdminSearchPageComponent } from './app/admin/admin-search-page/admin-search-page.component'; const DECLARATIONS = [ FileSectionComponent, @@ -168,8 +169,7 @@ const DECLARATIONS = [ BrowseByMetadataPageComponent, BrowseByDatePageComponent, BrowseByTitlePageComponent, - - + AdminSearchPageComponent, ]; @NgModule({ From 970b19bf0104a9f361717d148bfc66a60e70e239 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Wed, 22 May 2024 14:02:41 +0200 Subject: [PATCH 002/125] 115051: Created ThemedAdminWorkflowPageComponent --- src/app/admin/admin-routing.module.ts | 3 ++- .../admin-workflow.module.ts | 2 ++ .../themed-admin-workflow-page.component.ts | 26 +++++++++++++++++++ .../admin-workflow-page.component.html | 0 .../admin-workflow-page.component.scss | 0 .../admin-workflow-page.component.ts | 12 +++++++++ src/themes/custom/lazy-theme.module.ts | 2 ++ 7 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/app/admin/admin-workflow-page/themed-admin-workflow-page.component.ts create mode 100644 src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.html create mode 100644 src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.scss create mode 100644 src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.ts diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index 3e3a8924ac..58ccd54c76 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -8,6 +8,7 @@ import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.ser import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; import { REGISTRIES_MODULE_PATH } from './admin-routing-paths'; import { BatchImportPageComponent } from './admin-import-batch-page/batch-import-page.component'; +import { ThemedAdminWorkflowPageComponent } from './admin-workflow-page/themed-admin-workflow-page.component'; @NgModule({ imports: [ @@ -26,7 +27,7 @@ import { BatchImportPageComponent } from './admin-import-batch-page/batch-import { path: 'workflow', resolve: { breadcrumb: I18nBreadcrumbResolver }, - component: AdminWorkflowPageComponent, + component: ThemedAdminWorkflowPageComponent, data: { title: 'admin.workflow.title', breadcrumbKey: 'admin.workflow' } }, { diff --git a/src/app/admin/admin-workflow-page/admin-workflow.module.ts b/src/app/admin/admin-workflow-page/admin-workflow.module.ts index 85e8f00a46..1622a3b290 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow.module.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow.module.ts @@ -6,6 +6,7 @@ import { WorkflowItemAdminWorkflowActionsComponent } from './admin-workflow-sear import { WorkflowItemSearchResultAdminWorkflowListElementComponent } from './admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component'; import { AdminWorkflowPageComponent } from './admin-workflow-page.component'; import { SearchModule } from '../../shared/search/search.module'; +import { ThemedAdminWorkflowPageComponent } from './themed-admin-workflow-page.component'; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator @@ -19,6 +20,7 @@ const ENTRY_COMPONENTS = [ SharedModule.withEntryComponents() ], declarations: [ + ThemedAdminWorkflowPageComponent, AdminWorkflowPageComponent, WorkflowItemAdminWorkflowActionsComponent, ...ENTRY_COMPONENTS diff --git a/src/app/admin/admin-workflow-page/themed-admin-workflow-page.component.ts b/src/app/admin/admin-workflow-page/themed-admin-workflow-page.component.ts new file mode 100644 index 0000000000..fe84c44d0e --- /dev/null +++ b/src/app/admin/admin-workflow-page/themed-admin-workflow-page.component.ts @@ -0,0 +1,26 @@ +import { Component } from '@angular/core'; +import { ThemedComponent } from '../../shared/theme-support/themed.component'; +import { AdminWorkflowPageComponent } from './admin-workflow-page.component'; + +/** + * Themed wrapper for {@link AdminWorkflowPageComponent} + */ +@Component({ + selector: 'ds-themed-admin-workflow-page', + templateUrl: '../../shared/theme-support/themed.component.html', +}) +export class ThemedAdminWorkflowPageComponent extends ThemedComponent { + + protected getComponentName(): string { + return 'AdminWorkflowPageComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../themes/${themeName}/app/admin/admin-workflow-page/admin-workflow-page.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./admin-workflow-page.component'); + } + +} diff --git a/src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.html b/src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.scss b/src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.ts b/src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.ts new file mode 100644 index 0000000000..27c7e57fed --- /dev/null +++ b/src/themes/custom/app/admin/admin-workflow-page/admin-workflow-page.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { AdminWorkflowPageComponent as BaseComponent } from '../../../../../app/admin/admin-workflow-page/admin-workflow-page.component'; + +@Component({ + selector: 'ds-admin-workflow-page', + // styleUrls: ['./admin-workflow-page.component.scss'], + styleUrls: ['../../../../../app/admin/admin-workflow-page/admin-workflow-page.component.scss'], + // templateUrl: './admin-workflow-page.component.html', + templateUrl: '../../../../../app/admin/admin-workflow-page/admin-workflow-page.component.html', +}) +export class AdminWorkflowPageComponent extends BaseComponent { +} diff --git a/src/themes/custom/lazy-theme.module.ts b/src/themes/custom/lazy-theme.module.ts index 4f35854e5e..1939483c4f 100644 --- a/src/themes/custom/lazy-theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -115,6 +115,7 @@ import { BrowseByMetadataPageComponent } from './app/browse-by/browse-by-metadat import { BrowseByDatePageComponent } from './app/browse-by/browse-by-date-page/browse-by-date-page.component'; import { BrowseByTitlePageComponent } from './app/browse-by/browse-by-title-page/browse-by-title-page.component'; import { AdminSearchPageComponent } from './app/admin/admin-search-page/admin-search-page.component'; +import { AdminWorkflowPageComponent } from './app/admin/admin-workflow-page/admin-workflow-page.component'; const DECLARATIONS = [ FileSectionComponent, @@ -170,6 +171,7 @@ const DECLARATIONS = [ BrowseByDatePageComponent, BrowseByTitlePageComponent, AdminSearchPageComponent, + AdminWorkflowPageComponent, ]; @NgModule({ From d31e17894ce3f8f6be82f426de879816d76acd97 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 26 Jul 2024 13:57:47 +0200 Subject: [PATCH 003/125] 116728: Removed unnecessary *ngVars from the ThumbnailComponent --- src/app/thumbnail/thumbnail.component.html | 20 ++++++------- src/app/thumbnail/thumbnail.component.spec.ts | 28 +++++++++---------- src/app/thumbnail/thumbnail.component.ts | 14 +++++----- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/app/thumbnail/thumbnail.component.html b/src/app/thumbnail/thumbnail.component.html index 6a0516b0d4..049a47e1b0 100644 --- a/src/app/thumbnail/thumbnail.component.html +++ b/src/app/thumbnail/thumbnail.component.html @@ -1,4 +1,4 @@ -
+
@@ -6,16 +6,14 @@
- - - -
-
-
- {{ placeholder | translate }} -
+ + +
+
+
+ {{ placeholder | translate }}
- +
diff --git a/src/app/thumbnail/thumbnail.component.spec.ts b/src/app/thumbnail/thumbnail.component.spec.ts index ebecb5e075..2a25c9a318 100644 --- a/src/app/thumbnail/thumbnail.component.spec.ts +++ b/src/app/thumbnail/thumbnail.component.spec.ts @@ -67,31 +67,31 @@ describe('ThumbnailComponent', () => { describe('loading', () => { it('should start out with isLoading$ true', () => { - expect(comp.isLoading$.getValue()).toBeTrue(); + expect(comp.isLoading).toBeTrue(); }); it('should set isLoading$ to false once an image is successfully loaded', () => { comp.setSrc('http://bit.stream'); fixture.debugElement.query(By.css('img.thumbnail-content')).triggerEventHandler('load', new Event('load')); - expect(comp.isLoading$.getValue()).toBeFalse(); + expect(comp.isLoading).toBeFalse(); }); it('should set isLoading$ to false once the src is set to null', () => { comp.setSrc(null); - expect(comp.isLoading$.getValue()).toBeFalse(); + expect(comp.isLoading).toBeFalse(); }); it('should show a loading animation while isLoading$ is true', () => { expect(de.query(By.css('ds-themed-loading'))).toBeTruthy(); - comp.isLoading$.next(false); + comp.isLoading = false; fixture.detectChanges(); expect(fixture.debugElement.query(By.css('ds-themed-loading'))).toBeFalsy(); }); describe('with a thumbnail image', () => { beforeEach(() => { - comp.src$.next('https://bit.stream'); + comp.src = 'https://bit.stream'; fixture.detectChanges(); }); @@ -100,7 +100,7 @@ describe('ThumbnailComponent', () => { expect(img).toBeTruthy(); expect(img.classes['d-none']).toBeTrue(); - comp.isLoading$.next(false); + comp.isLoading = false; fixture.detectChanges(); img = fixture.debugElement.query(By.css('img.thumbnail-content')); expect(img).toBeTruthy(); @@ -111,14 +111,14 @@ describe('ThumbnailComponent', () => { describe('without a thumbnail image', () => { beforeEach(() => { - comp.src$.next(null); + comp.src = null; fixture.detectChanges(); }); it('should only show the HTML placeholder once done loading', () => { expect(fixture.debugElement.query(By.css('div.thumbnail-placeholder'))).toBeFalsy(); - comp.isLoading$.next(false); + comp.isLoading = false; fixture.detectChanges(); expect(fixture.debugElement.query(By.css('div.thumbnail-placeholder'))).toBeTruthy(); }); @@ -214,14 +214,14 @@ describe('ThumbnailComponent', () => { describe('fallback', () => { describe('if there is a default image', () => { it('should display the default image', () => { - comp.src$.next('http://bit.stream'); + comp.src = 'http://bit.stream'; comp.defaultImage = 'http://default.img'; comp.errorHandler(); - expect(comp.src$.getValue()).toBe(comp.defaultImage); + expect(comp.src).toBe(comp.defaultImage); }); it('should include the alt text', () => { - comp.src$.next('http://bit.stream'); + comp.src = 'http://bit.stream'; comp.defaultImage = 'http://default.img'; comp.errorHandler(); @@ -233,10 +233,10 @@ describe('ThumbnailComponent', () => { describe('if there is no default image', () => { it('should display the HTML placeholder', () => { - comp.src$.next('http://default.img'); + comp.src = 'http://default.img'; comp.defaultImage = null; comp.errorHandler(); - expect(comp.src$.getValue()).toBe(null); + expect(comp.src).toBe(null); fixture.detectChanges(); const placeholder = fixture.debugElement.query(By.css('div.thumbnail-placeholder')).nativeElement; @@ -328,7 +328,7 @@ describe('ThumbnailComponent', () => { it('should show the default image', () => { comp.defaultImage = 'default/image.jpg'; comp.ngOnChanges({}); - expect(comp.src$.getValue()).toBe('default/image.jpg'); + expect(comp.src).toBe('default/image.jpg'); }); }); }); diff --git a/src/app/thumbnail/thumbnail.component.ts b/src/app/thumbnail/thumbnail.component.ts index 7f6531cc5e..0827a33e77 100644 --- a/src/app/thumbnail/thumbnail.component.ts +++ b/src/app/thumbnail/thumbnail.component.ts @@ -2,7 +2,7 @@ import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; import { Bitstream } from '../core/shared/bitstream.model'; import { hasNoValue, hasValue } from '../shared/empty.util'; import { RemoteData } from '../core/data/remote-data'; -import { BehaviorSubject, of as observableOf } from 'rxjs'; +import { of as observableOf } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; @@ -34,7 +34,7 @@ export class ThumbnailComponent implements OnChanges { /** * The src attribute used in the template to render the image. */ - src$ = new BehaviorSubject(undefined); + src: string = undefined; retriedWithToken = false; @@ -57,7 +57,7 @@ export class ThumbnailComponent implements OnChanges { * Whether the thumbnail is currently loading * Start out as true to avoid flashing the alt text while a thumbnail is being loaded. */ - isLoading$ = new BehaviorSubject(true); + isLoading = true; constructor( protected auth: AuthService, @@ -110,7 +110,7 @@ export class ThumbnailComponent implements OnChanges { * Otherwise, fall back to the default image or a HTML placeholder */ errorHandler() { - const src = this.src$.getValue(); + const src = this.src; const thumbnail = this.bitstream; const thumbnailSrc = thumbnail?._links?.content?.href; @@ -162,9 +162,9 @@ export class ThumbnailComponent implements OnChanges { * @param src */ setSrc(src: string): void { - this.src$.next(src); + this.src = src; if (src === null) { - this.isLoading$.next(false); + this.isLoading = false; } } @@ -172,6 +172,6 @@ export class ThumbnailComponent implements OnChanges { * Stop the loading animation once the thumbnail is successfully loaded */ successHandler() { - this.isLoading$.next(false); + this.isLoading = false; } } From 8b90d999acc4b332ff55f38a0fa5f6e0dde86e4e Mon Sep 17 00:00:00 2001 From: Andreas Awouters Date: Wed, 5 Feb 2025 13:59:19 +0100 Subject: [PATCH 004/125] 125969: Move constructor to server-cookie.service This makes it possible to remove the REQUEST import from cookie.service.ts which solves a typescript issue. --- src/app/core/services/cookie.service.ts | 8 +------- src/app/core/services/server-cookie.service.ts | 7 ++++++- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/app/core/services/cookie.service.ts b/src/app/core/services/cookie.service.ts index 0098e3ace4..939e19f317 100644 --- a/src/app/core/services/cookie.service.ts +++ b/src/app/core/services/cookie.service.ts @@ -1,7 +1,4 @@ -import { Inject, Injectable } from '@angular/core'; - -import { REQUEST } from '@nguniversal/express-engine/tokens'; - +import { Injectable } from '@angular/core'; import { Subject , Observable } from 'rxjs'; import { CookieAttributes } from 'js-cookie'; @@ -22,9 +19,6 @@ export abstract class CookieService implements ICookieService { protected readonly cookieSource = new Subject<{ readonly [key: string]: any }>(); public readonly cookies$ = this.cookieSource.asObservable(); - constructor(@Inject(REQUEST) protected req: any) { - } - public abstract set(name: string, value: any, options?: CookieAttributes): void; public abstract remove(name: string, options?: CookieAttributes): void; diff --git a/src/app/core/services/server-cookie.service.ts b/src/app/core/services/server-cookie.service.ts index 6ae3525c74..1cc7d4414f 100644 --- a/src/app/core/services/server-cookie.service.ts +++ b/src/app/core/services/server-cookie.service.ts @@ -1,10 +1,15 @@ -import { Injectable } from '@angular/core'; +import { Injectable, Inject } from '@angular/core'; import { CookieAttributes } from 'js-cookie'; import { CookieService, ICookieService } from './cookie.service'; +import { REQUEST } from '@nguniversal/express-engine/tokens'; @Injectable() export class ServerCookieService extends CookieService implements ICookieService { + constructor(@Inject(REQUEST) protected req: any) { + super(); + } + public set(name: string, value: any, options?: CookieAttributes): void { return; } From f82426b1dc8853b6a984fba2523474f145ecd3eb Mon Sep 17 00:00:00 2001 From: Andreas Awouters Date: Wed, 5 Feb 2025 16:05:48 +0100 Subject: [PATCH 005/125] 125969: Get rid of REQUEST and RESPONSE imports in AuthService --- src/app/core/auth/auth.service.ts | 30 +++++------- src/app/core/auth/server-auth.service.ts | 60 ++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts index 6604936cde..b2bf590184 100644 --- a/src/app/core/auth/auth.service.ts +++ b/src/app/core/auth/auth.service.ts @@ -1,7 +1,6 @@ -import { Inject, Injectable, Optional } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { HttpHeaders } from '@angular/common/http'; -import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens'; import { Observable, of as observableOf } from 'rxjs'; import { filter, map, startWith, switchMap, take } from 'rxjs/operators'; @@ -79,18 +78,17 @@ export class AuthService { */ private tokenRefreshTimer; - constructor(@Inject(REQUEST) protected req: any, - @Inject(NativeWindowService) protected _window: NativeWindowRef, - @Optional() @Inject(RESPONSE) private response: any, - protected authRequestService: AuthRequestService, - protected epersonService: EPersonDataService, - protected router: Router, - protected routeService: RouteService, - protected storage: CookieService, - protected store: Store, - protected hardRedirectService: HardRedirectService, - private notificationService: NotificationsService, - private translateService: TranslateService + constructor( + @Inject(NativeWindowService) protected _window: NativeWindowRef, + protected authRequestService: AuthRequestService, + protected epersonService: EPersonDataService, + protected router: Router, + protected routeService: RouteService, + protected storage: CookieService, + protected store: Store, + protected hardRedirectService: HardRedirectService, + protected notificationService: NotificationsService, + protected translateService: TranslateService ) { this.store.pipe( // when this service is constructed the store is not fully initialized yet @@ -473,10 +471,6 @@ export class AuthService { if (this._window.nativeWindow.location) { // Hard redirect to login page, so that all state is definitely lost this._window.nativeWindow.location.href = redirectUrl; - } else if (this.response) { - if (!this.response._headerSent) { - this.response.redirect(302, redirectUrl); - } } else { this.router.navigateByUrl(redirectUrl); } diff --git a/src/app/core/auth/server-auth.service.ts b/src/app/core/auth/server-auth.service.ts index fc8ab18bfb..e2d5ec8131 100644 --- a/src/app/core/auth/server-auth.service.ts +++ b/src/app/core/auth/server-auth.service.ts @@ -1,15 +1,25 @@ -import { Injectable } from '@angular/core'; +import { Injectable, Inject, Optional } from '@angular/core'; import { HttpHeaders } from '@angular/common/http'; - +import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; - import { hasValue, isNotEmpty } from '../../shared/empty.util'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; -import { AuthService } from './auth.service'; +import { AuthService, LOGIN_ROUTE } from './auth.service'; import { AuthStatus } from './models/auth-status.model'; import { AuthTokenInfo } from './models/auth-token-info.model'; import { RemoteData } from '../data/remote-data'; +import { NativeWindowService, NativeWindowRef } from '../services/window.service'; +import { AuthRequestService } from './auth-request.service'; +import { EPersonDataService } from '../eperson/eperson-data.service'; +import { Router } from '@angular/router'; +import { RouteService } from '../services/route.service'; +import { CookieService } from '../services/cookie.service'; +import { Store } from '@ngrx/store'; +import { AppState } from '../../app.reducer'; +import { HardRedirectService } from '../services/hard-redirect.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; /** * The auth service. @@ -17,6 +27,34 @@ import { RemoteData } from '../data/remote-data'; @Injectable() export class ServerAuthService extends AuthService { + constructor( + @Inject(REQUEST) protected req: any, + @Optional() @Inject(RESPONSE) private response: any, + @Inject(NativeWindowService) protected _window: NativeWindowRef, + protected authRequestService: AuthRequestService, + protected epersonService: EPersonDataService, + protected router: Router, + protected routeService: RouteService, + protected storage: CookieService, + protected store: Store, + protected hardRedirectService: HardRedirectService, + protected notificationService: NotificationsService, + protected translateService: TranslateService + ) { + super( + _window, + authRequestService, + epersonService, + router, + routeService, + storage, + store, + hardRedirectService, + notificationService, + translateService + ); + } + /** * Returns the authenticated user * @returns {User} @@ -60,4 +98,18 @@ export class ServerAuthService extends AuthService { map((rd: RemoteData) => Object.assign(new AuthStatus(), rd.payload)) ); } + + override redirectToLoginWhenTokenExpired() { + const redirectUrl = LOGIN_ROUTE + '?expired=true'; + if (this._window.nativeWindow.location) { + // Hard redirect to login page, so that all state is definitely lost + this._window.nativeWindow.location.href = redirectUrl; + } else if (this.response) { + if (!this.response._headerSent) { + this.response.redirect(302, redirectUrl); + } + } else { + this.router.navigateByUrl(redirectUrl); + } + } } From 961bb11b59e44b67e86bd74fe5c114163a7fbd59 Mon Sep 17 00:00:00 2001 From: Andreas Awouters Date: Thu, 6 Feb 2025 11:18:53 +0100 Subject: [PATCH 006/125] 125969: Fix auth service tests --- src/app/core/auth/auth.service.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/core/auth/auth.service.spec.ts b/src/app/core/auth/auth.service.spec.ts index b38d17aecd..32ceee35d6 100644 --- a/src/app/core/auth/auth.service.spec.ts +++ b/src/app/core/auth/auth.service.spec.ts @@ -260,7 +260,7 @@ describe('AuthService test', () => { (state as any).core = Object.create({}); (state as any).core.auth = authenticatedState; }); - authService = new AuthService({}, window, undefined, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); + authService = new AuthService(window, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); })); it('should return true when user is logged in', () => { @@ -345,7 +345,7 @@ describe('AuthService test', () => { (state as any).core = Object.create({}); (state as any).core.auth = authenticatedState; }); - authService = new AuthService({}, window, undefined, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); + authService = new AuthService(window, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); storage = (authService as any).storage; routeServiceMock = TestBed.inject(RouteService); routerStub = TestBed.inject(Router); @@ -565,7 +565,7 @@ describe('AuthService test', () => { (state as any).core = Object.create({}); (state as any).core.auth = unAuthenticatedState; }); - authService = new AuthService({}, window, undefined, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); + authService = new AuthService(window, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); })); it('should return null for the shortlived token', () => { @@ -605,7 +605,7 @@ describe('AuthService test', () => { (state as any).core = Object.create({}); (state as any).core.auth = idleState; }); - authService = new AuthService({}, window, undefined, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); + authService = new AuthService(window, authReqService, mockEpersonDataService, router, routeService, cookieService, store, hardRedirectService, notificationsService, translateService); })); it('isUserIdle should return true when user is not idle', () => { From bb6ddcbeab35f4c29c756807e1e46d9b798cc0f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 02:21:14 +0000 Subject: [PATCH 007/125] Bump compression from 1.7.5 to 1.8.0 Bumps [compression](https://github.com/expressjs/compression) from 1.7.5 to 1.8.0. - [Release notes](https://github.com/expressjs/compression/releases) - [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/compression/compare/1.7.5...1.8.0) --- updated-dependencies: - dependency-name: compression dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 408eb0e134..1354884e6e 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "cerialize": "0.1.18", "cli-progress": "^3.12.0", "colors": "^1.4.0", - "compression": "^1.7.5", + "compression": "^1.8.0", "cookie-parser": "1.4.7", "core-js": "^3.40.0", "date-fns": "^2.29.3", diff --git a/yarn.lock b/yarn.lock index 2975ef6cd9..0d9f04cf50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4289,10 +4289,10 @@ compression-webpack-plugin@^9.2.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -compression@^1.7.4, compression@^1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" - integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== +compression@^1.7.4, compression@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.0.tgz#09420efc96e11a0f44f3a558de59e321364180f7" + integrity sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA== dependencies: bytes "3.1.2" compressible "~2.0.18" From 44f28ecf43cd338f063fab7e76dc9550b8993ddd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 02:21:03 +0000 Subject: [PATCH 008/125] Bump rxjs from 7.8.1 to 7.8.2 Bumps [rxjs](https://github.com/reactivex/rxjs) from 7.8.1 to 7.8.2. - [Release notes](https://github.com/reactivex/rxjs/releases) - [Changelog](https://github.com/ReactiveX/rxjs/blob/7.8.2/CHANGELOG.md) - [Commits](https://github.com/reactivex/rxjs/compare/7.8.1...7.8.2) --- updated-dependencies: - dependency-name: rxjs dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 408eb0e134..8e2dbd7030 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "nouislider": "^15.7.1", "pem": "1.14.8", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.0", + "rxjs": "^7.8.2", "uuid": "^8.3.2", "zone.js": "~0.15.0" }, diff --git a/yarn.lock b/yarn.lock index 2975ef6cd9..7ed2294ddc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9677,13 +9677,20 @@ rxjs@6.6.7, rxjs@~6.6.0: dependencies: tslib "^1.9.0" -rxjs@7.8.1, rxjs@^7.5.1, rxjs@^7.8.0, rxjs@^7.8.1: +rxjs@7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" +rxjs@^7.5.1, rxjs@^7.8.1, rxjs@^7.8.2: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== + dependencies: + tslib "^2.1.0" + safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" From 3364e6e2cb894a4055024b6c4c3a6fdf223efcfc Mon Sep 17 00:00:00 2001 From: Pierre Lasou Date: Fri, 21 Feb 2025 15:43:59 -0500 Subject: [PATCH 009/125] Addtion to the fr.json5 following version 8.1 Adding and changing parameters after upgrading to 8.1. (cherry picked from commit 0437ec4c3f5d13dbe83bbfecfd2482e9be787322) --- src/assets/i18n/fr.json5 | 116 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 4 deletions(-) diff --git a/src/assets/i18n/fr.json5 b/src/assets/i18n/fr.json5 index ea45f5b2fe..b6cd2fc905 100644 --- a/src/assets/i18n/fr.json5 +++ b/src/assets/i18n/fr.json5 @@ -1471,11 +1471,11 @@ // "browse.startsWith.type_text": "Type the first few letters and click on the Browse button", "browse.startsWith.type_text": "Ou saisir les premières lettres puis cliquer sur le bouton « Parcourir »", - // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", - "browse.title": "Parcourir la collection {{ collection }} par {{ field }} {{ value }}", + // "browse.title": "Browsing by {{ field }}{{ startsWith }} {{ value }}", + "browse.title": "Parcourir par {{ field }}{{ startsWith }} {{ value }}", - //"browse.title.page": "Browsing {{ collection }} by {{ field }} {{ value }}", - "browse.title.page": "Parcourir la collection {{ collection }} par {{ field }} {{ value }}", + //"browse.title.page": "Browsing by {{ field }} {{ value }}", + "browse.title.page": "Parcourir par {{ field }} {{ value }}", //"search.browse.item-back": "Back to Results", "search.browse.item-back": "Retour aux résultats", @@ -2682,6 +2682,66 @@ // "grant-request-copy.success": "Successfully granted item request", "grant-request-copy.success": "Demande de copie de document acceptée avec succès", + //"health.breadcrumbs": "Health", + "health.breadcrumbs": "Santé du système", + + // "health-page.heading": "Health", + "health-page.heading": "Santé", + + // "health-page.info-tab": "Info", + "health-page.info-tab": "Info", + + //"health-page.status-tab": "Status", + "health-page.status-tab": "Statut", + + //"health-page.error.msg": "The health check service is temporarily unavailable", + "health-page.error.msg": "Le service de vérification de la santé du système n'est pas disponible", + + //"health-page.property.status": "Status code", + "health-page.property.status": "Code de statut", + + //"health-page.section.db.title": "Database", + "health-page.section.db.title": "Base de données", + + // "health-page.section.geoIp.title": "GeoIp", + "health-page.section.geoIp.title": "GeoIp", + + // "health-page.section.solrAuthorityCore.title": "Solr: authority core", + "health-page.section.solrAuthorityCore.title": "Solr: authority core", + + //"health-page.section.solrOaiCore.title": "Solr: oai core", + "health-page.section.solrOaiCore.title": "Solr: oai core", + + // "health-page.section.solrSearchCore.title": "Solr: search core", + "health-page.section.solrSearchCore.title": "Solr: search core", + + // "health-page.section.solrStatisticsCore.title": "Solr: statistics core", + "health-page.section.solrStatisticsCore.title": "Solr: statistics core", + + //"health-page.section-info.app.title": "Application Backend", + "health-page.section-info.app.title": "Application Backend", + + //"health-page.section-info.java.title": "Java", + "health-page.section-info.java.title": "Java", + + //"health-page.status": "Status", + "health-page.status": "Statut", + + //"health-page.status.ok.info": "Operational", + "health-page.status.ok.info": "Opérationnel", + + //"health-page.status.error.info": "Problems detected", + "health-page.status.error.info": "Problèmes détectés", + + //"health-page.status.warning.info": "Possible issues detected", + "health-page.status.warning.info": "Problèmes éventuels détectés", + + // "health-page.title": "Health", + "health-page.title": "Santé du système", + + // "health-page.section.no-issues": "No issues detected", + "health-page.section.no-issues": "Aucun problème détecté", + // "home.description": "", "home.description": "", @@ -3972,6 +4032,9 @@ // "menu.section.access_control_authorizations": "Authorizations", "menu.section.access_control_authorizations": "Autorisations", + // "menu.section.access_control_bulk": "Bulk Access Management", + "menu.section.access_control_bulk": "Gestion des accès en lot", + // "menu.section.access_control_groups": "Groups", "menu.section.access_control_groups": "Groupes", @@ -4590,9 +4653,39 @@ // "process.overview.table.name": "Name", "process.overview.table.name": "Nom", + //"process.overview.table.running.info": "Start time (UTC)", + "process.overview.table.running.info": "Heure de fin (UTC)", + + // "process.overview.table.running.title": "Running processes", + "process.overview.table.running.title": "Processus en cours", + + //"process.overview.table.scheduled.info": "Creation time (UTC)", + "process.overview.table.scheduled.info": "Heure de création (UTC)", + + // "process.overview.table.scheduled.title": "Scheduled processes", + "process.overview.table.scheduled.title": "Processus planifiés", + // "process.overview.table.start": "Start time (UTC)", "process.overview.table.start": "Heure de début (TUC)", + // "process.overview.table.completed.info": "Finish time (UTC)", + "process.overview.table.completed.info": "Heure de fin (UTC)", + + //"process.overview.table.completed.title": "Succeeded processes", + "process.overview.table.completed.title": "Processus terminés", + + // "process.overview.table.empty": "No matching processes found.", + "process.overview.table.empty": "Aucun processus trouvé.", + + // "process.overview.table.failed.info": "Finish time (UTC)", + "process.overview.table.failed.info": "Heure de fin (UTC)", + + // "process.overview.table.failed.title": "Failed processes", + "process.overview.table.failed.title": "Processus en échec", + + // "process.overview.table.finish": "Finish time (UTC)", + "process.overview.table.finish": "Heure de fin (UTC)", + // "process.overview.table.status": "Status", "process.overview.table.status": "Statut", @@ -5648,6 +5741,9 @@ // "submission.import-external.source.crossref": "Crossref", "submission.import-external.source.crossref": "Crossref (DOI)", + //"submission.import-external.source.doi": "DOI", + "submission.import-external.source.doi": "DOI", + //"submission.import-external.source.datacite": "DataCite", "submission.import-external.source.datacite": "DataCite (DOI)", @@ -6532,6 +6628,9 @@ //"submitter.empty": "N/A", "submitter.empty": "S/O", + //"subscriptions.title": "Subscriptions", + "subscriptions.title": "Abonnements", + //"subscriptions.modal.title": "Subscriptions", "subscriptions.modal.title": "Abonnements", @@ -8440,6 +8539,15 @@ //"search.filters.filter.notifyEndorsement.label": "Search Notify Endorsement", "search.filters.filter.notifyEndorsement.label": "Chercher l'approbation Notify", + // "form.date-picker.placeholder.year": "Year", + "form.date-picker.placeholder.year": "Année", + + // "form.date-picker.placeholder.month": "Month", + "form.date-picker.placeholder.month": "Mois", + + // "form.date-picker.placeholder.day": "Day", + "form.date-picker.placeholder.day": "Jour", + //"item.page.cc.license.title": "Creative Commons license", "item.page.cc.license.title": "Licence Creative Commons", From a1037d8b0e55fd8687be8b447075f055c1ffc74c Mon Sep 17 00:00:00 2001 From: Agustina Martinez Date: Tue, 25 Feb 2025 12:20:54 +0000 Subject: [PATCH 010/125] Port #10053: Notify PCI endorsement support (DSpace 8.x) --- src/app/core/data/signposting-links.model.ts | 3 ++- src/app/item-page/simple/item-page.component.ts | 8 +++++++- .../simple/notify-requests-status/notify-status.enum.ts | 1 + .../request-status-alert-box.component.ts | 7 +++++++ src/assets/i18n/en.json5 | 2 ++ 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/app/core/data/signposting-links.model.ts b/src/app/core/data/signposting-links.model.ts index 11d2cafe00..dcc35e91e8 100644 --- a/src/app/core/data/signposting-links.model.ts +++ b/src/app/core/data/signposting-links.model.ts @@ -4,5 +4,6 @@ export interface SignpostingLink { href?: string, rel?: string, - type?: string + type?: string, + profile?: string } diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index fb2db4ad05..edce420af5 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -168,7 +168,8 @@ export class ItemPageComponent implements OnInit, OnDestroy { this.signpostingLinks = signpostingLinks; signpostingLinks.forEach((link: SignpostingLink) => { - links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}"` + (isNotEmpty(link.type) ? ` ; type="${link.type}" ` : ' '); + links = links + (isNotEmpty(links) ? ', ' : '') + `<${link.href}> ; rel="${link.rel}"` + (isNotEmpty(link.type) ? ` ; type="${link.type}" ` : ' ') + + (isNotEmpty(link.profile) ? ` ; profile="${link.profile}" ` : ''); let tag: LinkDefinition = { href: link.href, rel: link.rel, @@ -178,6 +179,11 @@ export class ItemPageComponent implements OnInit, OnDestroy { type: link.type, }); } + if (isNotEmpty(link.profile)) { + tag = Object.assign(tag, { + profile: link.profile, + }); + } this.linkHeadService.addTag(tag); }); diff --git a/src/app/item-page/simple/notify-requests-status/notify-status.enum.ts b/src/app/item-page/simple/notify-requests-status/notify-status.enum.ts index e44c614130..19ba320d49 100644 --- a/src/app/item-page/simple/notify-requests-status/notify-status.enum.ts +++ b/src/app/item-page/simple/notify-requests-status/notify-status.enum.ts @@ -2,4 +2,5 @@ export enum RequestStatusEnum { ACCEPTED = 'ACCEPTED', REJECTED = 'REJECTED', REQUESTED = 'REQUESTED', + TENTATIVE_REJECT = 'TENTATIVE_REJECT', } diff --git a/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts b/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts index e6059688fb..9ab8f90c18 100644 --- a/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts +++ b/src/app/item-page/simple/notify-requests-status/request-status-alert-box/request-status-alert-box.component.ts @@ -74,6 +74,13 @@ export class RequestStatusAlertBoxComponent implements OnInit { }; break; + case RequestStatusEnum.TENTATIVE_REJECT: + this.displayOptions = { + alertType: 'alert-warning', + text: 'request-status-alert-box.tentative_rejected', + }; + break; + case RequestStatusEnum.REQUESTED: this.displayOptions = { alertType: 'alert-warning', diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 368791a35f..6cd142b529 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -6382,6 +6382,8 @@ "request-status-alert-box.rejected": "The requested {{ offerType }} for {{ serviceName }} has been rejected.", + "request-status-alert-box.tentative_rejected": "The requested {{ offerType }} for {{ serviceName }} has been tentatively rejected. Revisions are required.", + "request-status-alert-box.requested": "The requested {{ offerType }} for {{ serviceName }} is pending.", "ldn-service-button-mark-inbound-deletion": "Mark supported pattern for deletion", From 1b0e9927a86af09205dfdd622a9b20bb5d623aa7 Mon Sep 17 00:00:00 2001 From: Agustina Martinez Date: Thu, 27 Feb 2025 13:36:16 +0000 Subject: [PATCH 011/125] Change label quality-assurance.event.table.event.message.serviceUrl to generic "Actor" --- src/assets/i18n/en.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 6cd142b529..aa470301f2 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -6318,7 +6318,7 @@ "quality-assurance.events.description-with-topic-and-target": "Below the list of all the suggestions for the selected topic {{topic}}, related to {{source}} and ", - "quality-assurance.event.table.event.message.serviceUrl": "Service URL:", + "quality-assurance.event.table.event.message.serviceUrl": "Actor:", "quality-assurance.event.table.event.message.link": "Link:", From a5357c7083dc5fa3d1539bf165a09127742aee1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 02:34:46 +0000 Subject: [PATCH 012/125] Bump core-js from 3.40.0 to 3.41.0 Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.40.0 to 3.41.0. - [Release notes](https://github.com/zloirock/core-js/releases) - [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md) - [Commits](https://github.com/zloirock/core-js/commits/v3.41.0/packages/core-js) --- updated-dependencies: - dependency-name: core-js dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 408eb0e134..463626562a 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "colors": "^1.4.0", "compression": "^1.7.5", "cookie-parser": "1.4.7", - "core-js": "^3.40.0", + "core-js": "^3.41.0", "date-fns": "^2.29.3", "date-fns-tz": "^1.3.7", "deepmerge": "^4.3.1", diff --git a/yarn.lock b/yarn.lock index 2975ef6cd9..d1e527915c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4417,10 +4417,10 @@ core-js-compat@^3.31.0, core-js-compat@^3.34.0: dependencies: browserslist "^4.23.3" -core-js@^3.40.0: - version "3.40.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.40.0.tgz#2773f6b06877d8eda102fc42f828176437062476" - integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ== +core-js@^3.41.0: + version "3.41.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.41.0.tgz#57714dafb8c751a6095d028a7428f1fb5834a776" + integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA== core-util-is@1.0.2: version "1.0.2" From c0402bd54059b5e2cc07318671d5d28332fe9099 Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Wed, 26 Feb 2025 08:47:35 +0300 Subject: [PATCH 013/125] src/app/core: add citation_doi tag to head meta This is used by harvesters like Altmetric and was present in DSpace version 6 and previous. --- src/app/core/metadata/head-tag.service.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/app/core/metadata/head-tag.service.ts b/src/app/core/metadata/head-tag.service.ts index 8041bb3a4a..6c8d9fd432 100644 --- a/src/app/core/metadata/head-tag.service.ts +++ b/src/app/core/metadata/head-tag.service.ts @@ -186,6 +186,7 @@ export class HeadTagService { this.setCitationKeywordsTag(); this.setCitationAbstractUrlTag(); + this.setCitationDoiTag(); this.setCitationPdfUrlTag(); this.setCitationPublisherTag(); @@ -319,6 +320,18 @@ export class HeadTagService { } } + /** + * Add to the + */ + protected setCitationDoiTag(): void { + if (this.currentObject.value instanceof Item) { + const doi = this.getMetaTagValue('dc.identifier.doi'); + if (hasValue(doi)) { + this.addMetaTag('citation_doi', doi); + } + } + } + /** * Add to the */ From be3e6ef7bd12a09f741a06c6a26fa4b12711307e Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Wed, 26 Feb 2025 08:47:48 +0300 Subject: [PATCH 014/125] src/app/core: remove unnecessary comment Remove commented out this.setCitationDOITag() since it is not used and we use camel case with this.setCitationDoiTag() now anyway. --- src/app/core/metadata/head-tag.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/core/metadata/head-tag.service.ts b/src/app/core/metadata/head-tag.service.ts index 6c8d9fd432..d52efb8fa1 100644 --- a/src/app/core/metadata/head-tag.service.ts +++ b/src/app/core/metadata/head-tag.service.ts @@ -199,7 +199,6 @@ export class HeadTagService { // this.setCitationIssueTag(); // this.setCitationFirstPageTag(); // this.setCitationLastPageTag(); - // this.setCitationDOITag(); // this.setCitationPMIDTag(); // this.setCitationFullTextTag(); From 08ec6e000eccd65343f06058b46c2538abec46cf Mon Sep 17 00:00:00 2001 From: Sascha Szott Date: Wed, 5 Feb 2025 17:38:57 +0100 Subject: [PATCH 015/125] fixed deprecated import of TransferState (cherry picked from commit 4d85639f31f5e94288f9021465d3d9f023346b27) --- src/ngx-translate-loaders/translate-server.loader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ngx-translate-loaders/translate-server.loader.ts b/src/ngx-translate-loaders/translate-server.loader.ts index d86251e008..8950b91a6b 100644 --- a/src/ngx-translate-loaders/translate-server.loader.ts +++ b/src/ngx-translate-loaders/translate-server.loader.ts @@ -1,4 +1,4 @@ -import { TransferState } from '@angular/platform-browser'; +import { TransferState } from '@angular/core'; import { TranslateLoader } from '@ngx-translate/core'; import { readFileSync } from 'fs'; import { From 682fd99ebb4bf60ff288f38f0f4a64b380fa07e7 Mon Sep 17 00:00:00 2001 From: DSpace Bot <68393067+dspace-bot@users.noreply.github.com> Date: Thu, 6 Mar 2025 11:21:39 -0600 Subject: [PATCH 016/125] [Port dspace-8_x] remove custom theme dependency in base component SuggestionListElementComponent (#4059) * remove custom theme dependency (cherry picked from commit 0c63c1720ed2cb6a5517f38387abe5bf141352e2) * remove custom theme component (cherry picked from commit 469164f00b5b7d71d8143a0dadc3042b7901042f) * remove obsolete constructor (cherry picked from commit b54638c863e9a33d98309a26cdbb83fe67e0cd68) * fix lint error (cherry picked from commit b0407fecc01374714312d72ebe40a8fcce3dde0f) * fix lint error (cherry picked from commit c6d83ec600c213f6a09ad1aaba49806548488bf9) --------- Co-authored-by: Sascha Szott --- .../suggestion-list-element.component.spec.ts | 2 +- .../suggestion-list-element.component.ts | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts index 3f803c468d..2933933ba3 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts +++ b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts @@ -9,9 +9,9 @@ import { TranslateModule } from '@ngx-translate/core'; import { getTestScheduler } from 'jasmine-marbles'; import { TestScheduler } from 'rxjs/testing'; -import { ItemSearchResultListElementComponent } from '../../../themes/custom/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; import { Item } from '../../core/shared/item.model'; import { mockSuggestionPublicationOne } from '../../shared/mocks/publication-claim.mock'; +import { ItemSearchResultListElementComponent } from '../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; import { SuggestionActionsComponent } from '../suggestion-actions/suggestion-actions.component'; import { SuggestionEvidencesComponent } from './suggestion-evidences/suggestion-evidences.component'; import { SuggestionListElementComponent } from './suggestion-list-element.component'; diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts index 11bc64935b..99a22f89ea 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts +++ b/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts @@ -6,14 +6,13 @@ import { OnInit, Output, } from '@angular/core'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; import { Suggestion } from 'src/app/core/notifications/suggestions/models/suggestion.model'; -import { ItemSearchResultListElementComponent } from '../../../themes/custom/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; import { Item } from '../../core/shared/item.model'; import { fadeIn } from '../../shared/animations/fade'; import { isNotEmpty } from '../../shared/empty.util'; +import { ItemSearchResultListElementComponent } from '../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; import { SuggestionActionsComponent } from '../suggestion-actions/suggestion-actions.component'; import { SuggestionApproveAndImport } from './suggestion-approve-and-import'; import { SuggestionEvidencesComponent } from './suggestion-evidences/suggestion-evidences.component'; @@ -62,13 +61,6 @@ export class SuggestionListElementComponent implements OnInit { */ @Output() selected = new EventEmitter(); - /** - * Initialize instance variables - * - * @param {NgbModal} modalService - */ - constructor(private modalService: NgbModal) { } - ngOnInit() { this.listableObject = { indexableObject: Object.assign(new Item(), { id: this.object.id, metadata: this.object.metadata }), From edac96a0642ef8e5619349b2b56607b12bc647bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 03:02:29 +0000 Subject: [PATCH 017/125] Bump axios from 1.7.9 to 1.8.4 Bumps [axios](https://github.com/axios/axios) from 1.7.9 to 1.8.4. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.7.9...v1.8.4) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 408eb0e134..6409d638d2 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "@ngx-translate/core": "^14.0.0", "@nicky-lenaers/ngx-scroll-to": "^14.0.0", "angulartics2": "^12.2.0", - "axios": "^1.7.9", + "axios": "^1.8.4", "bootstrap": "^4.6.1", "cerialize": "0.1.18", "cli-progress": "^3.12.0", diff --git a/yarn.lock b/yarn.lock index 2975ef6cd9..b0c2946ed3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3709,10 +3709,10 @@ axe-core@^4.10.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df" integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== -axios@^1.7.9: - version "1.7.9" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" - integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== +axios@^1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447" + integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" From e5f41d9a313d692e588b496305373ab58d82e29c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 03:02:53 +0000 Subject: [PATCH 018/125] Bump isbot from 5.1.22 to 5.1.25 Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.22 to 5.1.25. - [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md) - [Commits](https://github.com/omrilotan/isbot/compare/v5.1.22...v5.1.25) --- updated-dependencies: - dependency-name: isbot dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 408eb0e134..d3b6f1da30 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "filesize": "^6.1.0", "http-proxy-middleware": "^2.0.7", "http-terminator": "^3.2.0", - "isbot": "^5.1.22", + "isbot": "^5.1.25", "js-cookie": "2.2.1", "js-yaml": "^4.1.0", "json5": "^2.2.3", diff --git a/yarn.lock b/yarn.lock index 2975ef6cd9..b1d7335881 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6830,10 +6830,10 @@ isbinaryfile@^4.0.8: resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== -isbot@^5.1.22: - version "5.1.22" - resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.22.tgz#18a4a58bbfff6974ff7868dafea59907deb7b68d" - integrity sha512-RqCFY3cJy3c2y1I+rMn81cfzAR4XJwfPBC+M8kffUjbPzxApzyyv7Tbm1C/gXXq2dSCuD238pKFEWlQMTWsTFw== +isbot@^5.1.25: + version "5.1.25" + resolved "https://registry.yarnpkg.com/isbot/-/isbot-5.1.25.tgz#3f08f13a773a9cd86f7e498094f36974de0c151d" + integrity sha512-mqU76fmT7cpGG0JX1EzhCZIC+xovpH6TD2SAK18alonk0RG/RgChpGduJTYzRaq9a0COoFA99M9JVtEUOcScIw== isexe@^2.0.0: version "2.0.0" From f3065bcbfcb75d4bb28941f9129a69ec1ae3e0fc Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 26 Mar 2025 17:59:31 +0100 Subject: [PATCH 019/125] 129694: PoC #4099 solution with resolvers --- src/app/app-routes.ts | 11 +++- .../collection-page/collection-page-routes.ts | 4 ++ .../collection-page.component.html | 1 - .../collection-page.component.ts | 3 +- .../community-page/community-page-routes.ts | 4 ++ .../community-page.component.html | 1 - .../community-page.component.ts | 3 +- src/app/home-page/home-page-routes.ts | 6 +- src/app/home-page/home-page.component.html | 3 - src/app/home-page/home-page.component.ts | 4 +- .../full/full-item-page.component.html | 1 - .../full/full-item-page.component.spec.ts | 4 +- .../full/full-item-page.component.ts | 3 +- src/app/item-page/item-page-routes.ts | 8 +++ .../item-page/simple/item-page.component.html | 1 - .../simple/item-page.component.spec.ts | 4 +- .../item-page/simple/item-page.component.ts | 3 +- src/app/shared/theme-support/theme.service.ts | 2 +- .../dspace/view-tracker-resolver.service.ts | 66 +++++++++++++++++++ .../dspace/view-tracker.component.html | 1 - .../dspace/view-tracker.component.scss | 3 - .../dspace/view-tracker.component.ts | 63 ------------------ .../dspace/view-tracker.resolver.ts | 11 ++++ .../collection-page.component.ts | 3 +- .../community-page.component.ts | 3 +- .../app/home-page/home-page.component.ts | 4 +- .../full/full-item-page.component.ts | 3 +- .../item-page/simple/item-page.component.ts | 3 +- 28 files changed, 122 insertions(+), 104 deletions(-) create mode 100644 src/app/statistics/angulartics/dspace/view-tracker-resolver.service.ts delete mode 100644 src/app/statistics/angulartics/dspace/view-tracker.component.html delete mode 100644 src/app/statistics/angulartics/dspace/view-tracker.component.scss delete mode 100644 src/app/statistics/angulartics/dspace/view-tracker.component.ts create mode 100644 src/app/statistics/angulartics/dspace/view-tracker.resolver.ts diff --git a/src/app/app-routes.ts b/src/app/app-routes.ts index 29a78364b5..ad320671f6 100644 --- a/src/app/app-routes.ts +++ b/src/app/app-routes.ts @@ -42,6 +42,8 @@ import { ThemedPageNotFoundComponent } from './pagenotfound/themed-pagenotfound. import { PROCESS_MODULE_PATH } from './process-page/process-page-routing.paths'; import { provideSubmissionState } from './submission/provide-submission-state'; import { SUGGESTION_MODULE_PATH } from './suggestions-page/suggestions-page-routing-paths'; +import { homePageResolver } from './home-page/home-page.resolver'; +import { viewTrackerResolver } from './statistics/angulartics/dspace/view-tracker.resolver'; export const APP_ROUTES: Route[] = [ { path: INTERNAL_SERVER_ERROR, component: ThemedPageInternalServerErrorComponent }, @@ -63,9 +65,16 @@ export const APP_ROUTES: Route[] = [ path: 'home', loadChildren: () => import('./home-page/home-page-routes') .then((m) => m.ROUTES), - data: { showBreadcrumbs: false }, + data: { + showBreadcrumbs: false, + dsoPath: 'site' + }, providers: [provideSuggestionNotificationsState()], canActivate: [endUserAgreementCurrentUserGuard], + resolve: { + site: homePageResolver, + tracking: viewTrackerResolver, + }, }, { path: 'community-list', diff --git a/src/app/collection-page/collection-page-routes.ts b/src/app/collection-page/collection-page-routes.ts index f2dadc3fbe..480ce4b2b9 100644 --- a/src/app/collection-page/collection-page-routes.ts +++ b/src/app/collection-page/collection-page-routes.ts @@ -24,6 +24,7 @@ import { DeleteCollectionPageComponent } from './delete-collection-page/delete-c import { itemTemplatePageResolver } from './edit-item-template-page/item-template-page.resolver'; import { ThemedEditItemTemplatePageComponent } from './edit-item-template-page/themed-edit-item-template-page.component'; import { ThemedCollectionPageComponent } from './themed-collection-page.component'; +import { viewTrackerResolver } from '../statistics/angulartics/dspace/view-tracker.resolver'; export const ROUTES: Route[] = [ { @@ -100,6 +101,9 @@ export const ROUTES: Route[] = [ data: { breadcrumbKey: 'browse.metadata' }, }, ], + resolve: { + tracking: viewTrackerResolver, + }, }, ], data: { diff --git a/src/app/collection-page/collection-page.component.html b/src/app/collection-page/collection-page.component.html index 4a3e28c6aa..08f338b2d8 100644 --- a/src/app/collection-page/collection-page.component.html +++ b/src/app/collection-page/collection-page.component.html @@ -3,7 +3,6 @@ *ngVar="(collectionRD$ | async) as collectionRD">
-
diff --git a/src/app/collection-page/collection-page.component.ts b/src/app/collection-page/collection-page.component.ts index 0d240f5328..3f5deaaa31 100644 --- a/src/app/collection-page/collection-page.component.ts +++ b/src/app/collection-page/collection-page.component.ts @@ -50,7 +50,7 @@ import { ThemedLoadingComponent } from '../shared/loading/themed-loading.compone import { ObjectCollectionComponent } from '../shared/object-collection/object-collection.component'; import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model'; import { VarDirective } from '../shared/utils/var.directive'; -import { ViewTrackerComponent } from '../statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../statistics/angulartics/dspace/view-tracker-resolver.service'; import { getCollectionPageRoute } from './collection-page-routing-paths'; @Component({ @@ -68,7 +68,6 @@ import { getCollectionPageRoute } from './collection-page-routing-paths'; NgIf, ThemedLoadingComponent, TranslateModule, - ViewTrackerComponent, VarDirective, AsyncPipe, ComcolPageHeaderComponent, diff --git a/src/app/community-page/community-page-routes.ts b/src/app/community-page/community-page-routes.ts index d9505c53b1..8d67b98dba 100644 --- a/src/app/community-page/community-page-routes.ts +++ b/src/app/community-page/community-page-routes.ts @@ -21,6 +21,7 @@ import { createCommunityPageGuard } from './create-community-page/create-communi import { DeleteCommunityPageComponent } from './delete-community-page/delete-community-page.component'; import { SubComColSectionComponent } from './sections/sub-com-col-section/sub-com-col-section.component'; import { ThemedCommunityPageComponent } from './themed-community-page.component'; +import { viewTrackerResolver } from '../statistics/angulartics/dspace/view-tracker.resolver'; export const ROUTES: Route[] = [ { @@ -70,6 +71,9 @@ export const ROUTES: Route[] = [ { path: '', component: ThemedCommunityPageComponent, + resolve: { + tracking: viewTrackerResolver, + }, children: [ { path: '', diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html index a695e2019a..740a7c8a72 100644 --- a/src/app/community-page/community-page.component.html +++ b/src/app/community-page/community-page.component.html @@ -1,7 +1,6 @@
-
diff --git a/src/app/community-page/community-page.component.ts b/src/app/community-page/community-page.component.ts index d04ecbee19..74ccc533b6 100644 --- a/src/app/community-page/community-page.component.ts +++ b/src/app/community-page/community-page.component.ts @@ -41,7 +41,7 @@ import { hasValue } from '../shared/empty.util'; import { ErrorComponent } from '../shared/error/error.component'; import { ThemedLoadingComponent } from '../shared/loading/themed-loading.component'; import { VarDirective } from '../shared/utils/var.directive'; -import { ViewTrackerComponent } from '../statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../statistics/angulartics/dspace/view-tracker-resolver.service'; import { getCommunityPageRoute } from './community-page-routing-paths'; import { ThemedCollectionPageSubCollectionListComponent } from './sections/sub-com-col-section/sub-collection-list/themed-community-page-sub-collection-list.component'; import { ThemedCommunityPageSubCommunityListComponent } from './sections/sub-com-col-section/sub-community-list/themed-community-page-sub-community-list.component'; @@ -66,7 +66,6 @@ import { ThemedCommunityPageSubCommunityListComponent } from './sections/sub-com ComcolPageLogoComponent, ComcolPageHeaderComponent, AsyncPipe, - ViewTrackerComponent, VarDirective, RouterOutlet, RouterModule, diff --git a/src/app/home-page/home-page-routes.ts b/src/app/home-page/home-page-routes.ts index 6e4a8f353f..f44daab3fe 100644 --- a/src/app/home-page/home-page-routes.ts +++ b/src/app/home-page/home-page-routes.ts @@ -4,6 +4,7 @@ import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { MenuItemType } from '../shared/menu/menu-item-type.model'; import { homePageResolver } from './home-page.resolver'; import { ThemedHomePageComponent } from './themed-home-page.component'; +import { viewTrackerResolver } from '../statistics/angulartics/dspace/view-tracker.resolver'; export const ROUTES: Route[] = [ { @@ -24,10 +25,7 @@ export const ROUTES: Route[] = [ link: 'statistics', } as LinkMenuItemModel, }], - }, - }, - resolve: { - site: homePageResolver, + } }, }, ]; diff --git a/src/app/home-page/home-page.component.html b/src/app/home-page/home-page.component.html index ad48fb328c..9a1b23d9c6 100644 --- a/src/app/home-page/home-page.component.html +++ b/src/app/home-page/home-page.component.html @@ -14,9 +14,6 @@ - - - diff --git a/src/app/home-page/home-page.component.ts b/src/app/home-page/home-page.component.ts index c954e90402..de4977323b 100644 --- a/src/app/home-page/home-page.component.ts +++ b/src/app/home-page/home-page.component.ts @@ -23,7 +23,7 @@ import { SuggestionsPopupComponent } from '../notifications/suggestions-popup/su import { ThemedConfigurationSearchPageComponent } from '../search-page/themed-configuration-search-page.component'; import { ThemedSearchFormComponent } from '../shared/search-form/themed-search-form.component'; import { PageWithSidebarComponent } from '../shared/sidebar/page-with-sidebar.component'; -import { ViewTrackerComponent } from '../statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../statistics/angulartics/dspace/view-tracker-resolver.service'; import { HomeCoarComponent } from './home-coar/home-coar.component'; import { ThemedHomeNewsComponent } from './home-news/themed-home-news.component'; import { RecentItemListComponent } from './recent-item-list/recent-item-list.component'; @@ -34,7 +34,7 @@ import { ThemedTopLevelCommunityListComponent } from './top-level-community-list styleUrls: ['./home-page.component.scss'], templateUrl: './home-page.component.html', standalone: true, - imports: [ThemedHomeNewsComponent, NgTemplateOutlet, NgIf, ViewTrackerComponent, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, SuggestionsPopupComponent, ThemedConfigurationSearchPageComponent, PageWithSidebarComponent, HomeCoarComponent], + imports: [ThemedHomeNewsComponent, NgTemplateOutlet, NgIf, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, SuggestionsPopupComponent, ThemedConfigurationSearchPageComponent, PageWithSidebarComponent, HomeCoarComponent], }) export class HomePageComponent implements OnInit { diff --git a/src/app/item-page/full/full-item-page.component.html b/src/app/item-page/full/full-item-page.component.html index b6e1d1e6ed..b6110c86a7 100644 --- a/src/app/item-page/full/full-item-page.component.html +++ b/src/app/item-page/full/full-item-page.component.html @@ -3,7 +3,6 @@
-
diff --git a/src/app/item-page/full/full-item-page.component.spec.ts b/src/app/item-page/full/full-item-page.component.spec.ts index 0d05510fbf..f2bf0af421 100644 --- a/src/app/item-page/full/full-item-page.component.spec.ts +++ b/src/app/item-page/full/full-item-page.component.spec.ts @@ -45,7 +45,7 @@ import { createPaginatedList } from '../../shared/testing/utils.test'; import { ThemeService } from '../../shared/theme-support/theme.service'; import { TruncatePipe } from '../../shared/utils/truncate.pipe'; import { VarDirective } from '../../shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../statistics/angulartics/dspace/view-tracker-resolver.service'; import { ThemedItemAlertsComponent } from '../alerts/themed-item-alerts.component'; import { CollectionsComponent } from '../field-components/collections/collections.component'; import { ThemedItemPageTitleFieldComponent } from '../simple/field-components/specific-field/title/themed-item-page-field.component'; @@ -162,7 +162,7 @@ describe('FullItemPageComponent', () => { ThemedLoadingComponent, ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, - ViewTrackerComponent, + ViewTrackerResolverService, ThemedItemAlertsComponent, CollectionsComponent, ThemedFullFileSectionComponent, diff --git a/src/app/item-page/full/full-item-page.component.ts b/src/app/item-page/full/full-item-page.component.ts index 88a1254feb..a780f895e4 100644 --- a/src/app/item-page/full/full-item-page.component.ts +++ b/src/app/item-page/full/full-item-page.component.ts @@ -44,7 +44,7 @@ import { hasValue } from '../../shared/empty.util'; import { ErrorComponent } from '../../shared/error/error.component'; import { ThemedLoadingComponent } from '../../shared/loading/themed-loading.component'; import { VarDirective } from '../../shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../statistics/angulartics/dspace/view-tracker-resolver.service'; import { ThemedItemAlertsComponent } from '../alerts/themed-item-alerts.component'; import { CollectionsComponent } from '../field-components/collections/collections.component'; import { ThemedItemPageTitleFieldComponent } from '../simple/field-components/specific-field/title/themed-item-page-field.component'; @@ -79,7 +79,6 @@ import { ThemedFullFileSectionComponent } from './field-components/file-section/ ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, ItemVersionsNoticeComponent, - ViewTrackerComponent, ThemedItemAlertsComponent, VarDirective, ], diff --git a/src/app/item-page/item-page-routes.ts b/src/app/item-page/item-page-routes.ts index 684ea56459..8f75474097 100644 --- a/src/app/item-page/item-page-routes.ts +++ b/src/app/item-page/item-page-routes.ts @@ -20,6 +20,8 @@ import { orcidPageGuard } from './orcid-page/orcid-page.guard'; import { ThemedItemPageComponent } from './simple/themed-item-page.component'; import { versionResolver } from './version-page/version.resolver'; import { VersionPageComponent } from './version-page/version-page/version-page.component'; +import { ViewTrackerResolverService } from '../statistics/angulartics/dspace/view-tracker-resolver.service'; +import { viewTrackerResolver } from '../statistics/angulartics/dspace/view-tracker.resolver'; export const ROUTES: Route[] = [ { @@ -35,10 +37,16 @@ export const ROUTES: Route[] = [ path: '', component: ThemedItemPageComponent, pathMatch: 'full', + resolve: { + tracking: viewTrackerResolver, + } }, { path: 'full', component: ThemedFullItemPageComponent, + resolve: { + tracking: viewTrackerResolver, + } }, { path: ITEM_EDIT_PATH, diff --git a/src/app/item-page/simple/item-page.component.html b/src/app/item-page/simple/item-page.component.html index 912115c961..b9b6fbf30e 100644 --- a/src/app/item-page/simple/item-page.component.html +++ b/src/app/item-page/simple/item-page.component.html @@ -5,7 +5,6 @@ -
diff --git a/src/app/item-page/simple/item-page.component.spec.ts b/src/app/item-page/simple/item-page.component.spec.ts index 7b29711206..80686a682d 100644 --- a/src/app/item-page/simple/item-page.component.spec.ts +++ b/src/app/item-page/simple/item-page.component.spec.ts @@ -44,7 +44,7 @@ import { import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { createPaginatedList } from '../../shared/testing/utils.test'; import { VarDirective } from '../../shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../statistics/angulartics/dspace/view-tracker-resolver.service'; import { ThemedItemAlertsComponent } from '../alerts/themed-item-alerts.component'; import { ItemVersionsComponent } from '../versions/item-versions.component'; import { ItemVersionsNoticeComponent } from '../versions/notice/item-versions-notice.component'; @@ -142,7 +142,7 @@ describe('ItemPageComponent', () => { remove: { imports: [ ThemedItemAlertsComponent, ItemVersionsNoticeComponent, - ViewTrackerComponent, + ViewTrackerResolverService, ListableObjectComponentLoaderComponent, ItemVersionsComponent, ErrorComponent, diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index fb2db4ad05..1247bd0d7e 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -48,7 +48,7 @@ import { ErrorComponent } from '../../shared/error/error.component'; import { ThemedLoadingComponent } from '../../shared/loading/themed-loading.component'; import { ListableObjectComponentLoaderComponent } from '../../shared/object-collection/shared/listable-object/listable-object-component-loader.component'; import { VarDirective } from '../../shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../statistics/angulartics/dspace/view-tracker-resolver.service'; import { ThemedItemAlertsComponent } from '../alerts/themed-item-alerts.component'; import { getItemPageRoute } from '../item-page-routing-paths'; import { ItemVersionsComponent } from '../versions/item-versions.component'; @@ -72,7 +72,6 @@ import { QaEventNotificationComponent } from './qa-event-notification/qa-event-n VarDirective, ThemedItemAlertsComponent, ItemVersionsNoticeComponent, - ViewTrackerComponent, ListableObjectComponentLoaderComponent, ItemVersionsComponent, ErrorComponent, diff --git a/src/app/shared/theme-support/theme.service.ts b/src/app/shared/theme-support/theme.service.ts index 6d0ba38b5b..d82bd2b836 100644 --- a/src/app/shared/theme-support/theme.service.ts +++ b/src/app/shared/theme-support/theme.service.ts @@ -5,7 +5,7 @@ import { Injector, } from '@angular/core'; import { - ActivatedRouteSnapshot, + ActivatedRouteSnapshot, NavigationStart, ResolveEnd, Router, } from '@angular/router'; diff --git a/src/app/statistics/angulartics/dspace/view-tracker-resolver.service.ts b/src/app/statistics/angulartics/dspace/view-tracker-resolver.service.ts new file mode 100644 index 0000000000..f9a24e091a --- /dev/null +++ b/src/app/statistics/angulartics/dspace/view-tracker-resolver.service.ts @@ -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; + } +} diff --git a/src/app/statistics/angulartics/dspace/view-tracker.component.html b/src/app/statistics/angulartics/dspace/view-tracker.component.html deleted file mode 100644 index c0c0ffe181..0000000000 --- a/src/app/statistics/angulartics/dspace/view-tracker.component.html +++ /dev/null @@ -1 +0,0 @@ -  diff --git a/src/app/statistics/angulartics/dspace/view-tracker.component.scss b/src/app/statistics/angulartics/dspace/view-tracker.component.scss deleted file mode 100644 index c76cafbe44..0000000000 --- a/src/app/statistics/angulartics/dspace/view-tracker.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -:host { - display: none -} diff --git a/src/app/statistics/angulartics/dspace/view-tracker.component.ts b/src/app/statistics/angulartics/dspace/view-tracker.component.ts deleted file mode 100644 index 801f4fd2cb..0000000000 --- a/src/app/statistics/angulartics/dspace/view-tracker.component.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - Component, - Input, - OnDestroy, - OnInit, -} from '@angular/core'; -import { Angulartics2 } from 'angulartics2'; -import { Subscription } from 'rxjs'; -import { 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'; - -/** - * This component triggers a page view statistic - */ -@Component({ - selector: 'ds-view-tracker', - styleUrls: ['./view-tracker.component.scss'], - templateUrl: './view-tracker.component.html', - standalone: true, -}) -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(); - } - } -} diff --git a/src/app/statistics/angulartics/dspace/view-tracker.resolver.ts b/src/app/statistics/angulartics/dspace/view-tracker.resolver.ts new file mode 100644 index 0000000000..9b98185d61 --- /dev/null +++ b/src/app/statistics/angulartics/dspace/view-tracker.resolver.ts @@ -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 = ( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + viewTrackerResolverService: ViewTrackerResolverService = inject(ViewTrackerResolverService), +): boolean => { + return viewTrackerResolverService.resolve(route, state); +}; diff --git a/src/themes/custom/app/collection-page/collection-page.component.ts b/src/themes/custom/app/collection-page/collection-page.component.ts index 4b2f9e3245..f2dbe2619c 100644 --- a/src/themes/custom/app/collection-page/collection-page.component.ts +++ b/src/themes/custom/app/collection-page/collection-page.component.ts @@ -24,7 +24,7 @@ import { ErrorComponent } from '../../../../app/shared/error/error.component'; import { ThemedLoadingComponent } from '../../../../app/shared/loading/themed-loading.component'; import { ObjectCollectionComponent } from '../../../../app/shared/object-collection/object-collection.component'; import { VarDirective } from '../../../../app/shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../../../app/statistics/angulartics/dspace/view-tracker-resolver.service'; @Component({ selector: 'ds-themed-collection-page', @@ -44,7 +44,6 @@ import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dsp NgIf, ThemedLoadingComponent, TranslateModule, - ViewTrackerComponent, VarDirective, AsyncPipe, ComcolPageHeaderComponent, diff --git a/src/themes/custom/app/community-page/community-page.component.ts b/src/themes/custom/app/community-page/community-page.component.ts index 5aa7e85527..f86d787ebf 100644 --- a/src/themes/custom/app/community-page/community-page.component.ts +++ b/src/themes/custom/app/community-page/community-page.component.ts @@ -25,7 +25,7 @@ import { DsoEditMenuComponent } from '../../../../app/shared/dso-page/dso-edit-m import { ErrorComponent } from '../../../../app/shared/error/error.component'; import { ThemedLoadingComponent } from '../../../../app/shared/loading/themed-loading.component'; import { VarDirective } from '../../../../app/shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../../../app/statistics/angulartics/dspace/view-tracker-resolver.service'; @Component({ selector: 'ds-themed-community-page', @@ -50,7 +50,6 @@ import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dsp ComcolPageLogoComponent, ComcolPageHeaderComponent, AsyncPipe, - ViewTrackerComponent, VarDirective, RouterOutlet, RouterModule, diff --git a/src/themes/custom/app/home-page/home-page.component.ts b/src/themes/custom/app/home-page/home-page.component.ts index 2b45f69754..838311f323 100644 --- a/src/themes/custom/app/home-page/home-page.component.ts +++ b/src/themes/custom/app/home-page/home-page.component.ts @@ -16,7 +16,7 @@ import { SuggestionsPopupComponent } from '../../../../app/notifications/suggest import { ThemedConfigurationSearchPageComponent } from '../../../../app/search-page/themed-configuration-search-page.component'; import { ThemedSearchFormComponent } from '../../../../app/shared/search-form/themed-search-form.component'; import { PageWithSidebarComponent } from '../../../../app/shared/sidebar/page-with-sidebar.component'; -import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../../../app/statistics/angulartics/dspace/view-tracker-resolver.service'; @Component({ selector: 'ds-themed-home-page', @@ -25,7 +25,7 @@ import { ViewTrackerComponent } from '../../../../app/statistics/angulartics/dsp // templateUrl: './home-page.component.html' templateUrl: '../../../../app/home-page/home-page.component.html', standalone: true, - imports: [ThemedHomeNewsComponent, NgTemplateOutlet, NgIf, ViewTrackerComponent, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, SuggestionsPopupComponent, ThemedConfigurationSearchPageComponent, PageWithSidebarComponent, HomeCoarComponent], + imports: [ThemedHomeNewsComponent, NgTemplateOutlet, NgIf, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, SuggestionsPopupComponent, ThemedConfigurationSearchPageComponent, PageWithSidebarComponent, HomeCoarComponent], }) export class HomePageComponent extends BaseComponent { diff --git a/src/themes/custom/app/item-page/full/full-item-page.component.ts b/src/themes/custom/app/item-page/full/full-item-page.component.ts index c1bad7ba89..a0fda3fc10 100644 --- a/src/themes/custom/app/item-page/full/full-item-page.component.ts +++ b/src/themes/custom/app/item-page/full/full-item-page.component.ts @@ -23,7 +23,7 @@ import { DsoEditMenuComponent } from '../../../../../app/shared/dso-page/dso-edi import { ErrorComponent } from '../../../../../app/shared/error/error.component'; import { ThemedLoadingComponent } from '../../../../../app/shared/loading/themed-loading.component'; import { VarDirective } from '../../../../../app/shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../../../../app/statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../../../../app/statistics/angulartics/dspace/view-tracker-resolver.service'; /** * This component renders a full item page. @@ -54,7 +54,6 @@ import { ViewTrackerComponent } from '../../../../../app/statistics/angulartics/ ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, ItemVersionsNoticeComponent, - ViewTrackerComponent, ThemedItemAlertsComponent, VarDirective, ], diff --git a/src/themes/custom/app/item-page/simple/item-page.component.ts b/src/themes/custom/app/item-page/simple/item-page.component.ts index 7daa65287a..ae86537d1f 100644 --- a/src/themes/custom/app/item-page/simple/item-page.component.ts +++ b/src/themes/custom/app/item-page/simple/item-page.component.ts @@ -19,7 +19,7 @@ import { ErrorComponent } from '../../../../../app/shared/error/error.component' import { ThemedLoadingComponent } from '../../../../../app/shared/loading/themed-loading.component'; import { ListableObjectComponentLoaderComponent } from '../../../../../app/shared/object-collection/shared/listable-object/listable-object-component-loader.component'; import { VarDirective } from '../../../../../app/shared/utils/var.directive'; -import { ViewTrackerComponent } from '../../../../../app/statistics/angulartics/dspace/view-tracker.component'; +import { ViewTrackerResolverService } from '../../../../../app/statistics/angulartics/dspace/view-tracker-resolver.service'; /** * This component renders a simple item page. @@ -39,7 +39,6 @@ import { ViewTrackerComponent } from '../../../../../app/statistics/angulartics/ VarDirective, ThemedItemAlertsComponent, ItemVersionsNoticeComponent, - ViewTrackerComponent, ListableObjectComponentLoaderComponent, ItemVersionsComponent, ErrorComponent, From 0b28789e4fc638bf8adc26cd0b251ad151913cc2 Mon Sep 17 00:00:00 2001 From: abhinav Date: Thu, 20 Mar 2025 11:27:50 +0100 Subject: [PATCH 020/125] 129621: Add a not empty check This check is present in the other event handlers above so adding it here as well. --- .../submission/sections/form/section-form-operations.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/submission/sections/form/section-form-operations.service.ts b/src/app/submission/sections/form/section-form-operations.service.ts index 25c2ae303d..6ef2fc51b8 100644 --- a/src/app/submission/sections/form/section-form-operations.service.ts +++ b/src/app/submission/sections/form/section-form-operations.service.ts @@ -412,7 +412,7 @@ export class SectionFormOperationsService { ); } } - } else if (!value.hasValue()) { + } else if (isNotEmpty(value) && !value.hasValue()) { // New value is empty, so dispatch a remove operation if (this.getArrayIndexFromEvent(event) === 0) { this.operationsBuilder.remove(pathCombiner.getPath(segmentedPath)); From 1ea30ecb0aef1e17288bc26f6cfeb8f173c9aba0 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 4 Apr 2025 11:01:01 -0500 Subject: [PATCH 021/125] Add note with link to Release Notes on homepage --- .../dspace/app/home-page/home-news/home-news.component.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/themes/dspace/app/home-page/home-news/home-news.component.html b/src/themes/dspace/app/home-page/home-news/home-news.component.html index ca686a9933..0f2e579077 100644 --- a/src/themes/dspace/app/home-page/home-news/home-news.component.html +++ b/src/themes/dspace/app/home-page/home-news/home-news.component.html @@ -4,6 +4,7 @@

DSpace 8

+

This site is running DSpace 8. For more information, see the DSpace 8 Release Notes.

DSpace is the world leading open source repository platform that enables organisations to:

From 8b82bb5a7ae276982e60fd2515e2f68bef1992ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 02:50:22 +0000 Subject: [PATCH 022/125] Bump webpack from 5.97.1 to 5.98.0 in the webpack group Bumps the webpack group with 1 update: [webpack](https://github.com/webpack/webpack). Updates `webpack` from 5.97.1 to 5.98.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.97.1...v5.98.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor dependency-group: webpack ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 50 +++++++++++++++++++++++++------------------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 408eb0e134..aa638447cf 100644 --- a/package.json +++ b/package.json @@ -200,7 +200,7 @@ "sass-resources-loader": "^2.2.5", "ts-node": "^8.10.2", "typescript": "~5.4.5", - "webpack": "5.97.1", + "webpack": "5.98.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" } diff --git a/yarn.lock b/yarn.lock index 2975ef6cd9..28d279dfab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1943,7 +1943,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -9781,7 +9781,7 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.0.0, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -9790,10 +9790,10 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== +schema-utils@^4.0.0, schema-utils@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -9871,7 +9871,7 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: +serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== @@ -10414,16 +10414,16 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.2.1: mkdirp "^1.0.3" yallist "^4.0.0" -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== +terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: - "@jridgewell/trace-mapping" "^0.3.20" + "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" terser@5.29.1: version "5.29.1" @@ -10435,10 +10435,10 @@ terser@5.29.1: commander "^2.20.0" source-map-support "~0.5.20" -terser@^5.26.0: - version "5.31.6" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" - integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== +terser@^5.31.1: + version "5.39.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -11174,10 +11174,10 @@ webpack@5.94.0: watchpack "^2.4.1" webpack-sources "^3.2.3" -webpack@5.97.1: - version "5.97.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58" - integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== +webpack@5.98.0: + version "5.98.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.98.0.tgz#44ae19a8f2ba97537978246072fb89d10d1fbd17" + integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.6" @@ -11197,9 +11197,9 @@ webpack@5.97.1: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.2.0" + schema-utils "^4.3.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" + terser-webpack-plugin "^5.3.11" watchpack "^2.4.1" webpack-sources "^3.2.3" From 1b2a0e19ada3a5a8ccc514335d16220ca5b7d6fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 02:50:27 +0000 Subject: [PATCH 023/125] Bump sass from 1.84.0 to 1.85.1 in the sass group across 1 directory Bumps the sass group with 1 update in the / directory: [sass](https://github.com/sass/dart-sass). Updates `sass` from 1.84.0 to 1.85.1 - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.84.0...1.85.1) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor dependency-group: sass ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 408eb0e134..603bddeb28 100644 --- a/package.json +++ b/package.json @@ -195,7 +195,7 @@ "react-copy-to-clipboard": "^5.1.0", "react-dom": "^16.14.0", "rimraf": "^3.0.2", - "sass": "~1.84.0", + "sass": "~1.86.3", "sass-loader": "^12.6.0", "sass-resources-loader": "^2.2.5", "ts-node": "^8.10.2", diff --git a/yarn.lock b/yarn.lock index 2975ef6cd9..9db2aa240d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9757,10 +9757,10 @@ sass@1.71.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@^1.25.0, sass@~1.84.0: - version "1.84.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.84.0.tgz#da9154cbccb2d2eac7a9486091b6d9ba93ef5bad" - integrity sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg== +sass@^1.25.0, sass@~1.86.3: + version "1.86.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.86.3.tgz#0a0d9ea97cb6665e73f409639f8533ce057464c9" + integrity sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw== dependencies: chokidar "^4.0.0" immutable "^5.0.2" From c03bbb01a2d4ebdedacff3b046a7ce0522bf971f Mon Sep 17 00:00:00 2001 From: Nona Luypaert Date: Wed, 9 Apr 2025 12:03:11 +0200 Subject: [PATCH 024/125] 130081: Fix pagination on 'Select bistreams' modal on 'Access Control' tab --- ...rol-select-bitstreams-modal.component.html | 13 +++-- ...ntrol-select-bitstreams-modal.component.ts | 47 +++++++++---------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html index 8cf0ecea38..88706e2df3 100644 --- a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html +++ b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html @@ -8,20 +8,19 @@