From a8a29fd53eac15847f9900049753aa8f0f2f60dd Mon Sep 17 00:00:00 2001 From: wout Date: Mon, 5 Jan 2026 13:09:46 +0100 Subject: [PATCH 1/5] 137369: hide user-menu subscribe button if feature is disabled --- .../auth-nav-menu/user-menu/user-menu.component.html | 2 +- .../auth-nav-menu/user-menu/user-menu.component.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.html b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.html index 85b9d8aece2..e0f459f8714 100644 --- a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.html +++ b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.html @@ -6,7 +6,7 @@ {{'nav.profile' | translate}} {{'nav.mydspace' | translate}} - {{'nav.subscriptions' | translate}} + {{'nav.subscriptions' | translate}} diff --git a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts index dcf12fb47be..ab59cdf6a2e 100644 --- a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts +++ b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts @@ -10,6 +10,10 @@ import { MYDSPACE_ROUTE } from '../../../my-dspace-page/my-dspace-page.component import { AuthService } from '../../../core/auth/auth.service'; import { getProfileModuleRoute, getSubscriptionsModuleRoute } from '../../../app-routing-paths'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; +import { map } from 'rxjs/operators'; +import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; /** * This component represents the user nav menu. @@ -54,10 +58,14 @@ export class UserMenuComponent implements OnInit { */ public subscriptionsRoute = getSubscriptionsModuleRoute(); + subscribeFeature$: Observable; + + constructor( protected store: Store, protected authService: AuthService, public dsoNameService: DSONameService, + protected configService: ConfigurationDataService, ) { } @@ -72,5 +80,9 @@ export class UserMenuComponent implements OnInit { // set user this.user$ = this.authService.getAuthenticatedUserFromStore(); + this.subscribeFeature$ = this.configService.findByPropertyName('can-subscribe-feature.enable').pipe( + getFirstSucceededRemoteDataPayload(), + map((res: ConfigurationProperty) => res?.values[0].toLowerCase() === 'true') + ); } } From 9eb30334645da0ad09fec03886c48f444a081606 Mon Sep 17 00:00:00 2001 From: wout Date: Mon, 5 Jan 2026 13:24:33 +0100 Subject: [PATCH 2/5] 137369: lint-fix --- .../auth-nav-menu/user-menu/user-menu.component.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts index 1569e514206..a041b76a585 100644 --- a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts +++ b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts @@ -23,19 +23,19 @@ import { } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; import { AppState } from '../../../app.reducer'; import { getProfileModuleRoute, getSubscriptionsModuleRoute, } from '../../../app-routing-paths'; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; +import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; import { MYDSPACE_ROUTE } from '../../../my-dspace-page/my-dspace-page.component'; import { ThemedLoadingComponent } from '../../loading/themed-loading.component'; import { LogOutComponent } from '../../log-out/log-out.component'; -import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; -import { map } from 'rxjs/operators'; -import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; -import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; /** * This component represents the user nav menu. @@ -118,7 +118,7 @@ export class UserMenuComponent implements OnInit { this.subscribeFeature$ = this.configService.findByPropertyName('can-subscribe-feature.enable').pipe( getFirstSucceededRemoteDataPayload(), - map((res: ConfigurationProperty) => res?.values[0].toLowerCase() === 'true') + map((res: ConfigurationProperty) => res?.values[0].toLowerCase() === 'true'), ); } From 357931ea95285491550bcfa450ca8c31464a6f1f Mon Sep 17 00:00:00 2001 From: wout Date: Mon, 5 Jan 2026 15:22:19 +0100 Subject: [PATCH 3/5] 137369: Fix specs --- .../user-menu/user-menu.component.spec.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts index 5576b942b30..51ae36a07a8 100644 --- a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts +++ b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts @@ -14,6 +14,9 @@ import { cold } from 'jasmine-marbles'; import { By } from '@angular/platform-browser'; import { AuthService } from '../../../core/auth/auth.service'; import { of } from 'rxjs'; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; +import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; +import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; describe('UserMenuComponent', () => { @@ -23,11 +26,21 @@ describe('UserMenuComponent', () => { let authState: AuthState; let authStateLoading: AuthState; let authService: AuthService; + let configurationDataService: ConfigurationDataService; function serviceInit() { authService = jasmine.createSpyObj('authService', { getAuthenticatedUserFromStore: of(EPersonMock) }); + + configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'can-subscribe-feature.enable', + values: [ + 'can-subscribe-feature.enable = true', + ] + })) + }); } function init() { @@ -69,7 +82,8 @@ describe('UserMenuComponent', () => { }) ], providers: [ - { provide: AuthService, useValue: authService } + { provide: AuthService, useValue: authService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, ], declarations: [ UserMenuComponent From 9cd073958ccc28370bf2f20c5b0e56c2aedca87a Mon Sep 17 00:00:00 2001 From: wout Date: Mon, 5 Jan 2026 15:33:53 +0100 Subject: [PATCH 4/5] 137369: lint-fix --- .../user-menu/user-menu.component.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts index 3e9c28ce953..93e7716047f 100644 --- a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts +++ b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts @@ -32,11 +32,11 @@ import { } from '@ngx-translate/core'; import { cold } from 'jasmine-marbles'; import { of } from 'rxjs'; -import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; -import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; -import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; import { AppState } from '../../../app.reducer'; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; +import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; import { UserMenuComponent } from './user-menu.component'; describe('UserMenuComponent', () => { @@ -59,8 +59,8 @@ describe('UserMenuComponent', () => { name: 'can-subscribe-feature.enable', values: [ 'can-subscribe-feature.enable = true', - ] - })) + ], + })), }); } From 3c0e686034ead84fae8d80206afa009f34aa566b Mon Sep 17 00:00:00 2001 From: wout Date: Mon, 5 Jan 2026 15:53:01 +0100 Subject: [PATCH 5/5] 133535: fix spec import issues --- .../auth-nav-menu/user-menu/user-menu.component.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts index 93e7716047f..bad091f2416 100644 --- a/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts +++ b/src/app/shared/auth-nav-menu/user-menu/user-menu.component.spec.ts @@ -17,10 +17,13 @@ import { } from '@dspace/core/auth/auth.reducer'; import { AuthService } from '@dspace/core/auth/auth.service'; import { AuthTokenInfo } from '@dspace/core/auth/models/auth-token-info.model'; +import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service'; import { APP_DATA_SERVICES_MAP } from '@dspace/core/data-services-map-type'; +import { ConfigurationProperty } from '@dspace/core/shared/configuration-property.model'; import { ActivatedRouteStub } from '@dspace/core/testing/active-router.stub'; import { EPersonMock } from '@dspace/core/testing/eperson.mock'; import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock'; +import { createSuccessfulRemoteDataObject$ } from '@dspace/core/utilities/remote-data.utils'; import { XSRFService } from '@dspace/core/xsrf/xsrf.service'; import { Store, @@ -34,9 +37,6 @@ import { cold } from 'jasmine-marbles'; import { of } from 'rxjs'; import { AppState } from '../../../app.reducer'; -import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; -import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; -import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; import { UserMenuComponent } from './user-menu.component'; describe('UserMenuComponent', () => {