From 45e8977db7d34d7b0684c16f92e9e917f6ac4579 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Wed, 15 Nov 2023 23:31:54 +0100 Subject: [PATCH 01/11] Fixed pagination issues on item mapper --- .../collection-item-mapper.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.ts b/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.ts index e0e4aaf9302..776b82f9b4c 100644 --- a/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.ts +++ b/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.ts @@ -144,7 +144,9 @@ export class CollectionItemMapperComponent implements OnInit { this.shouldUpdate$.next(false); } return this.itemDataService.findListByHref(collectionRD.payload._links.mappedItems.href, Object.assign(options, { - sort: this.defaultSortOptions + currentPage: options.pagination.currentPage, + elementsPerPage: options.pagination.pageSize, + sort: this.defaultSortOptions, }),!shouldUpdate, false, followLink('owningCollection')).pipe( getAllSucceededRemoteData() ); From 2afa473cfb1b189c18071f6506cb1413bfcd8386 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Tue, 23 Jan 2024 17:19:50 +0100 Subject: [PATCH 02/11] [DURACOM-224] fix infinite scroll --- .../dso-selector/dso-selector/dso-selector.component.html | 4 ++-- .../dso-selector/dso-selector/dso-selector.component.ts | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/shared/dso-selector/dso-selector/dso-selector.component.html b/src/app/shared/dso-selector/dso-selector/dso-selector.component.html index c4f5dbc4cd6..19ce1dea05b 100644 --- a/src/app/shared/dso-selector/dso-selector/dso-selector.component.html +++ b/src/app/shared/dso-selector/dso-selector/dso-selector.component.html @@ -6,12 +6,12 @@ [formControl]="input" ngbAutofocus (keyup.enter)="selectSingleResult()"> -
+
diff --git a/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts b/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts index 503e4c44129..0411f32cd31 100644 --- a/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts +++ b/src/app/shared/dso-selector/dso-selector/dso-selector.component.ts @@ -136,6 +136,11 @@ export class DSOSelectorComponent implements OnInit, OnDestroy { */ public subs: Subscription[] = []; + /** + * Random seed of 4 characters to avoid duplicate ids + */ + randomSeed: string = Math.random().toString(36).substring(2, 6); + constructor( protected searchService: SearchService, protected notifcationsService: NotificationsService, From ab90c7a733e575c9a75407be549d124bff49fd48 Mon Sep 17 00:00:00 2001 From: Jens Vannerum Date: Mon, 19 Feb 2024 13:34:29 +0100 Subject: [PATCH 03/11] 111326: return not found status code on missing identifiers --- .../objectnotfound.component.spec.ts | 16 +++++++++++++++- .../objectnotfound/objectnotfound.component.ts | 4 +++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts b/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts index f0139e92514..b293ead1027 100644 --- a/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts +++ b/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts @@ -6,6 +6,7 @@ import { ObjectNotFoundComponent } from './objectnotfound.component'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { of as observableOf } from 'rxjs'; import { ActivatedRoute } from '@angular/router'; +import { ServerResponseService } from 'src/app/core/services/server-response.service'; describe('ObjectNotFoundComponent', () => { let comp: ObjectNotFoundComponent; @@ -17,6 +18,10 @@ describe('ObjectNotFoundComponent', () => { const activatedRouteStub = Object.assign(new ActivatedRouteStub(), { params: observableOf({id: testUUID, idType: uuidType}) }); + const serverResponseServiceStub = jasmine.createSpyObj('ServerResponseService', { + setNotFound: jasmine.createSpy('setNotFound') + }); + const activatedRouteStubHandle = Object.assign(new ActivatedRouteStub(), { params: observableOf({id: handleId, idType: handlePrefix}) }); @@ -26,6 +31,7 @@ describe('ObjectNotFoundComponent', () => { imports: [ TranslateModule.forRoot() ], providers: [ + {provide: ServerResponseService, useValue: serverResponseServiceStub}, {provide: ActivatedRoute, useValue: activatedRouteStub} ], declarations: [ObjectNotFoundComponent], @@ -48,6 +54,10 @@ describe('ObjectNotFoundComponent', () => { expect(comp.idType).toEqual(uuidType); expect(comp.missingItem).toEqual('uuid: ' + testUUID); }); + + it('should call serverResponseService.setNotFound', () => { + expect(serverResponseServiceStub.setNotFound).toHaveBeenCalled(); + }); }); describe( 'legacy handle request', () => { @@ -56,6 +66,7 @@ describe('ObjectNotFoundComponent', () => { imports: [ TranslateModule.forRoot() ], providers: [ + {provide: ServerResponseService, useValue: serverResponseServiceStub}, {provide: ActivatedRoute, useValue: activatedRouteStubHandle} ], declarations: [ObjectNotFoundComponent], @@ -74,6 +85,9 @@ describe('ObjectNotFoundComponent', () => { expect(comp.idType).toEqual(handlePrefix); expect(comp.missingItem).toEqual('handle: ' + handlePrefix + '/' + handleId); }); - }); + it('should call serverResponseService.setNotFound', () => { + expect(serverResponseServiceStub.setNotFound).toHaveBeenCalled(); + }); + }); }); diff --git a/src/app/lookup-by-id/objectnotfound/objectnotfound.component.ts b/src/app/lookup-by-id/objectnotfound/objectnotfound.component.ts index bbab90f39dd..cad78f8555c 100644 --- a/src/app/lookup-by-id/objectnotfound/objectnotfound.component.ts +++ b/src/app/lookup-by-id/objectnotfound/objectnotfound.component.ts @@ -1,6 +1,7 @@ import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; +import { ServerResponseService } from 'src/app/core/services/server-response.service'; /** * This component representing the `PageNotFound` DSpace page. @@ -25,7 +26,7 @@ export class ObjectNotFoundComponent implements OnInit { * @param {AuthService} authservice * @param {ServerResponseService} responseService */ - constructor(private route: ActivatedRoute) { + constructor(private route: ActivatedRoute, private serverResponseService: ServerResponseService) { route.params.subscribe((params) => { this.idType = params.idType; this.id = params.id; @@ -38,6 +39,7 @@ export class ObjectNotFoundComponent implements OnInit { } else { this.missingItem = 'handle: ' + this.idType + '/' + this.id; } + this.serverResponseService.setNotFound(); } } From f9c8103266f7ca392356be92107d0e9d8bb7f89c Mon Sep 17 00:00:00 2001 From: Jens Vannerum Date: Fri, 8 Mar 2024 17:14:01 +0100 Subject: [PATCH 04/11] 111326: update to new lint standards --- .../objectnotfound/objectnotfound.component.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts b/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts index 540e4c08639..de79d07c0fd 100644 --- a/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts +++ b/src/app/lookup-by-id/objectnotfound/objectnotfound.component.spec.ts @@ -7,10 +7,10 @@ import { import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; +import { ServerResponseService } from 'src/app/core/services/server-response.service'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { ObjectNotFoundComponent } from './objectnotfound.component'; -import { ServerResponseService } from 'src/app/core/services/server-response.service'; describe('ObjectNotFoundComponent', () => { let comp: ObjectNotFoundComponent; @@ -23,7 +23,7 @@ describe('ObjectNotFoundComponent', () => { params: observableOf({ id: testUUID, idType: uuidType }), }); const serverResponseServiceStub = jasmine.createSpyObj('ServerResponseService', { - setNotFound: jasmine.createSpy('setNotFound') + setNotFound: jasmine.createSpy('setNotFound'), }); const activatedRouteStubHandle = Object.assign(new ActivatedRouteStub(), { @@ -35,8 +35,8 @@ describe('ObjectNotFoundComponent', () => { imports: [ TranslateModule.forRoot(), ], providers: [ - { provide: ServerResponseService, useValue: serverResponseServiceStub} , - { provide: ActivatedRoute, useValue: activatedRouteStub } + { provide: ServerResponseService, useValue: serverResponseServiceStub } , + { provide: ActivatedRoute, useValue: activatedRouteStub }, ], declarations: [ObjectNotFoundComponent], schemas: [NO_ERRORS_SCHEMA], @@ -71,7 +71,7 @@ describe('ObjectNotFoundComponent', () => { TranslateModule.forRoot(), ], providers: [ { provide: ServerResponseService, useValue: serverResponseServiceStub }, - { provide: ActivatedRoute, useValue: activatedRouteStubHandle } + { provide: ActivatedRoute, useValue: activatedRouteStubHandle }, ], declarations: [ObjectNotFoundComponent], schemas: [NO_ERRORS_SCHEMA], From 692bb991a051c9491769ba10db1425f1f9573849 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Mon, 18 Mar 2024 18:54:00 +0100 Subject: [PATCH 05/11] 112970: Added missing breadcrumbs to create community/collection pages --- .../collection-page-routing.module.ts | 25 ++++++++++++++++--- .../community-page-routing.module.ts | 22 ++++++++++++++-- .../community-breadcrumb.resolver.ts | 21 ++++++++++++++++ .../dso-breadcrumb.resolver.spec.ts | 5 +++- .../breadcrumbs/dso-breadcrumb.resolver.ts | 16 +++++++++--- src/assets/i18n/en.json5 | 3 +++ 6 files changed, 82 insertions(+), 10 deletions(-) diff --git a/src/app/collection-page/collection-page-routing.module.ts b/src/app/collection-page/collection-page-routing.module.ts index 678c745c010..8db7cf7021a 100644 --- a/src/app/collection-page/collection-page-routing.module.ts +++ b/src/app/collection-page/collection-page-routing.module.ts @@ -21,14 +21,32 @@ import { CollectionPageAdministratorGuard } from './collection-page-administrato import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { ThemedCollectionPageComponent } from './themed-collection-page.component'; import { MenuItemType } from '../shared/menu/menu-item-type.model'; +import { CommunityBreadcrumbResolver } from '../core/breadcrumbs/community-breadcrumb.resolver'; @NgModule({ imports: [ RouterModule.forChild([ { path: COLLECTION_CREATE_PATH, - component: CreateCollectionPageComponent, - canActivate: [AuthenticatedGuard, CreateCollectionPageGuard] + children: [ + { + path: '', + component: CreateCollectionPageComponent, + resolve: { + breadcrumb: I18nBreadcrumbResolver, + }, + data: { + breadcrumbKey: 'collection.create', + }, + }, + ], + canActivate: [AuthenticatedGuard, CreateCollectionPageGuard], + data: { + breadcrumbQueryParam: 'parent', + }, + resolve: { + breadcrumb: CommunityBreadcrumbResolver, + }, }, { path: ':id', @@ -90,7 +108,8 @@ import { MenuItemType } from '../shared/menu/menu-item-type.model'; DSOBreadcrumbsService, LinkService, CreateCollectionPageGuard, - CollectionPageAdministratorGuard + CollectionPageAdministratorGuard, + CommunityBreadcrumbResolver, ] }) export class CollectionPageRoutingModule { diff --git a/src/app/community-page/community-page-routing.module.ts b/src/app/community-page/community-page-routing.module.ts index 25326448a8e..242b85bc015 100644 --- a/src/app/community-page/community-page-routing.module.ts +++ b/src/app/community-page/community-page-routing.module.ts @@ -14,14 +14,32 @@ import { CommunityPageAdministratorGuard } from './community-page-administrator. import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { ThemedCommunityPageComponent } from './themed-community-page.component'; import { MenuItemType } from '../shared/menu/menu-item-type.model'; +import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; @NgModule({ imports: [ RouterModule.forChild([ { path: COMMUNITY_CREATE_PATH, - component: CreateCommunityPageComponent, - canActivate: [AuthenticatedGuard, CreateCommunityPageGuard] + children: [ + { + path: '', + component: CreateCommunityPageComponent, + resolve: { + breadcrumb: I18nBreadcrumbResolver, + }, + data: { + breadcrumbKey: 'community.create', + }, + } + ], + canActivate: [AuthenticatedGuard, CreateCommunityPageGuard], + data: { + breadcrumbQueryParam: 'parent', + }, + resolve: { + breadcrumb: CommunityBreadcrumbResolver, + }, }, { path: ':id', diff --git a/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts index 309927771d5..ea96f6d43a9 100644 --- a/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts @@ -5,6 +5,10 @@ import { CommunityDataService } from '../data/community-data.service'; import { Community } from '../shared/community.model'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { COMMUNITY_PAGE_LINKS_TO_FOLLOW } from '../../community-page/community-page.resolver'; +import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { BreadcrumbConfig } from '../../breadcrumbs/breadcrumb/breadcrumb-config.model'; +import { hasValue } from '../../shared/empty.util'; /** * The class that resolves the BreadcrumbConfig object for a Community @@ -17,6 +21,23 @@ export class CommunityBreadcrumbResolver extends DSOBreadcrumbResolver> { + if (hasValue(route.data.breadcrumbQueryParam) && hasValue(route.queryParams[route.data.breadcrumbQueryParam])) { + return this.resolveById(route.queryParams[route.data.breadcrumbQueryParam]); + } else { + return super.resolve(route, state); + } + } + /** * Method that returns the follow links to already resolve * The self links defined in this list are expected to be requested somewhere in the near future diff --git a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts index e35e26e46f9..d7d63669f1e 100644 --- a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts +++ b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts @@ -18,7 +18,10 @@ describe('DSOBreadcrumbResolver', () => { uuid = '1234-65487-12354-1235'; breadcrumbUrl = '/collections/' + uuid; currentUrl = breadcrumbUrl + '/edit'; - testCollection = Object.assign(new Collection(), { uuid }); + testCollection = Object.assign(new Collection(), { + uuid: uuid, + type: 'collection', + }); dsoBreadcrumbService = {}; collectionService = { findById: (id: string) => createSuccessfulRemoteDataObject$(testCollection) diff --git a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts index 8be4e5e099a..165cfd0382e 100644 --- a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts @@ -10,6 +10,7 @@ import { ChildHALResource } from '../shared/child-hal-resource.model'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { hasValue } from '../../shared/empty.util'; import { IdentifiableDataService } from '../data/base/identifiable-data.service'; +import { getDSORoute } from '../../app-routing-paths'; /** * The class that resolves the BreadcrumbConfig object for a DSpaceObject @@ -31,15 +32,22 @@ export abstract class DSOBreadcrumbResolver> { - const uuid = route.params.id; + return this.resolveById(route.params.id); + } + + /** + * Method for resolving a breadcrumb by id + * + * @param uuid The uuid to resolve + * @returns BreadcrumbConfig object + */ + resolveById(uuid: string): Observable> { return this.dataService.findById(uuid, true, false, ...this.followLinks).pipe( getFirstCompletedRemoteData(), getRemoteDataPayload(), map((object: T) => { if (hasValue(object)) { - const fullPath = state.url; - const url = fullPath.substr(0, fullPath.indexOf(uuid)) + uuid; - return { provider: this.breadcrumbService, key: object, url: url }; + return { provider: this.breadcrumbService, key: object, url: getDSORoute(object) }; } else { return undefined; } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 597f226cc75..7afcf8b27da 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -781,6 +781,7 @@ "chips.remove": "Remove chip", + "collection.create.breadcrumbs": "Create collection", "collection.create.head": "Create a Collection", @@ -1053,6 +1054,8 @@ + "community.create.breadcrumbs": "Create Community", + "community.create.head": "Create a Community", "community.create.notifications.success": "Successfully created the Community", From 60d93e653fac08dbaac87c0a5efa19581d259386 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Thu, 4 Apr 2024 12:04:20 +0200 Subject: [PATCH 06/11] 113938: Added missing comcol structure to workspace/workflow item breadcrumbs --- src/app/core/core.module.ts | 2 + .../resolver/submission-links-to-follow.ts | 14 +++++ .../resolver/submission-object.resolver.ts | 6 +- .../submission-parent-breadcrumb.resolver.ts | 43 ++++++++++++++ .../submission-parent-breadcrumb.service.ts | 59 +++++++++++++++++++ src/app/submission/submission.service.ts | 27 ++++++++- .../item-from-workflow-breadcrumb.resolver.ts | 22 +++++++ .../item-from-workflow.resolver.spec.ts | 2 +- .../item-from-workflow.resolver.ts | 9 ++- .../workflowitems-edit-page-routing.module.ts | 12 +++- ...item-from-workspace-breadcrumb.resolver.ts | 22 +++++++ .../item-from-workspace.resolver.spec.ts | 2 +- .../item-from-workspace.resolver.ts | 15 +++-- ...workspaceitems-edit-page-routing.module.ts | 12 +++- 14 files changed, 222 insertions(+), 25 deletions(-) create mode 100644 src/app/core/submission/resolver/submission-links-to-follow.ts create mode 100644 src/app/core/submission/resolver/submission-parent-breadcrumb.resolver.ts create mode 100644 src/app/core/submission/submission-parent-breadcrumb.service.ts create mode 100644 src/app/workflowitems-edit-page/item-from-workflow-breadcrumb.resolver.ts create mode 100644 src/app/workspaceitems-edit-page/item-from-workspace-breadcrumb.resolver.ts diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 3ba0b39a0e1..2953b1ca3c9 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -180,6 +180,7 @@ import { OrcidHistory } from './orcid/model/orcid-history.model'; import { OrcidAuthService } from './orcid/orcid-auth.service'; import { VocabularyDataService } from './submission/vocabularies/vocabulary.data.service'; import { VocabularyEntryDetailsDataService } from './submission/vocabularies/vocabulary-entry-details.data.service'; +import { SubmissionParentBreadcrumbsService } from './submission/submission-parent-breadcrumb.service'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -250,6 +251,7 @@ const PROVIDERS = [ NotificationsService, WorkspaceitemDataService, WorkflowItemDataService, + SubmissionParentBreadcrumbsService, UploaderService, DSpaceObjectDataService, ConfigurationDataService, diff --git a/src/app/core/submission/resolver/submission-links-to-follow.ts b/src/app/core/submission/resolver/submission-links-to-follow.ts new file mode 100644 index 00000000000..b4aa3586ebe --- /dev/null +++ b/src/app/core/submission/resolver/submission-links-to-follow.ts @@ -0,0 +1,14 @@ +import { followLink, FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { WorkflowItem } from '../models/workflowitem.model'; +import { WorkspaceItem } from '../models/workspaceitem.model'; + +/** + * The self links defined in this list are expected to be requested somewhere in the near future + * Requesting them as embeds will limit the number of requests + * + * Needs to be in a separate file to prevent circular dependencies in webpack. + */ +export const SUBMISSION_LINKS_TO_FOLLOW: FollowLinkConfig[] = [ + followLink('item'), + followLink('collection'), +]; diff --git a/src/app/core/submission/resolver/submission-object.resolver.ts b/src/app/core/submission/resolver/submission-object.resolver.ts index 09561fbafac..b059b69e4d2 100644 --- a/src/app/core/submission/resolver/submission-object.resolver.ts +++ b/src/app/core/submission/resolver/submission-object.resolver.ts @@ -1,12 +1,11 @@ -import { followLink } from '../../../shared/utils/follow-link-config.model'; import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; -import { Store } from '@ngrx/store'; import { switchMap } from 'rxjs/operators'; import { RemoteData } from '../../data/remote-data'; import { getFirstCompletedRemoteData } from '../../shared/operators'; import { IdentifiableDataService } from '../../data/base/identifiable-data.service'; +import { SUBMISSION_LINKS_TO_FOLLOW } from './submission-links-to-follow'; /** * This class represents a resolver that requests a specific item before the route is activated @@ -15,7 +14,6 @@ import { IdentifiableDataService } from '../../data/base/identifiable-data.servi export class SubmissionObjectResolver implements Resolve> { constructor( protected dataService: IdentifiableDataService, - protected store: Store, ) { } @@ -30,7 +28,7 @@ export class SubmissionObjectResolver implements Resolve> { const itemRD$ = this.dataService.findById(route.params.id, true, false, - followLink('item'), + ...SUBMISSION_LINKS_TO_FOLLOW, ).pipe( getFirstCompletedRemoteData(), switchMap((wfiRD: RemoteData) => wfiRD.payload.item as Observable>), diff --git a/src/app/core/submission/resolver/submission-parent-breadcrumb.resolver.ts b/src/app/core/submission/resolver/submission-parent-breadcrumb.resolver.ts new file mode 100644 index 00000000000..554437ed942 --- /dev/null +++ b/src/app/core/submission/resolver/submission-parent-breadcrumb.resolver.ts @@ -0,0 +1,43 @@ +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../../shared/operators'; +import { IdentifiableDataService } from '../../data/base/identifiable-data.service'; +import { BreadcrumbConfig } from '../../../breadcrumbs/breadcrumb/breadcrumb-config.model'; +import { SubmissionParentBreadcrumbsService } from '../submission-parent-breadcrumb.service'; +import { SUBMISSION_LINKS_TO_FOLLOW } from './submission-links-to-follow'; +import { SubmissionObject } from '../models/submission-object.model'; + +/** + * This class represents a resolver that requests a specific item before the route is activated + */ +export abstract class SubmissionParentBreadcrumbResolver implements Resolve> { + + protected constructor( + protected dataService: IdentifiableDataService, + protected breadcrumbService: SubmissionParentBreadcrumbsService, + ) { + } + + /** + * Method for resolving an item based on the parameters in the current route + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns Observable<> Emits the found item based on the parameters in the current route, + * or an error if something went wrong + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { + return this.dataService.findById(route.params.id, + true, + false, + ...SUBMISSION_LINKS_TO_FOLLOW, + ).pipe( + getFirstCompletedRemoteData(), + getRemoteDataPayload(), + map((submissionObject: SubmissionObject) => ({ + provider: this.breadcrumbService, + key: submissionObject, + } as BreadcrumbConfig)), + ); + } +} diff --git a/src/app/core/submission/submission-parent-breadcrumb.service.ts b/src/app/core/submission/submission-parent-breadcrumb.service.ts new file mode 100644 index 00000000000..d7e02e878f4 --- /dev/null +++ b/src/app/core/submission/submission-parent-breadcrumb.service.ts @@ -0,0 +1,59 @@ +import { BreadcrumbsProviderService } from '../breadcrumbs/breadcrumbsProviderService'; +import { Injectable } from '@angular/core'; +import { Observable, switchMap, combineLatest, of as observableOf } from 'rxjs'; +import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; +import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../shared/operators'; +import { Collection } from '../shared/collection.model'; +import { DSONameService } from '../breadcrumbs/dso-name.service'; +import { SubmissionObject } from './models/submission-object.model'; +import { RemoteData } from '../data/remote-data'; +import { DSOBreadcrumbsService } from '../breadcrumbs/dso-breadcrumbs.service'; +import { getDSORoute } from '../../app-routing-paths'; +import { SubmissionService } from '../../submission/submission.service'; +import { CollectionDataService } from '../data/collection-data.service'; +import { hasValue } from '../../shared/empty.util'; + +/** + * Service to calculate the parent {@link DSpaceObject} breadcrumbs for a {@link SubmissionObject} + */ +@Injectable() +export class SubmissionParentBreadcrumbsService implements BreadcrumbsProviderService { + + constructor( + protected dsoNameService: DSONameService, + protected dsoBreadcrumbsService: DSOBreadcrumbsService, + protected submissionService: SubmissionService, + protected collectionService: CollectionDataService, + ) { + } + + /** + * Creates the parent breadcrumb structure for {@link SubmissionObject}s. It also automatically recreates the + * parent breadcrumb structure when you change a {@link SubmissionObject}'s by dispatching a + * {@link ChangeSubmissionCollectionAction}. + * + * @param submissionObject The {@link SubmissionObject} for which the parent breadcrumb structure needs to be created + */ + getBreadcrumbs(submissionObject: SubmissionObject): Observable { + return combineLatest([ + (submissionObject.collection as Observable>).pipe( + getFirstCompletedRemoteData(), + getRemoteDataPayload(), + ), + this.submissionService.getSubmissionCollectionId(submissionObject.id), + ]).pipe( + switchMap(([collection, latestCollectionId]: [Collection, string]) => { + if (hasValue(latestCollectionId)) { + return this.collectionService.findById(latestCollectionId).pipe( + getFirstCompletedRemoteData(), + getRemoteDataPayload(), + ); + } else { + return observableOf(collection); + } + }), + switchMap((collection: Collection) => this.dsoBreadcrumbsService.getBreadcrumbs(collection, getDSORoute(collection))), + ); + } + +} diff --git a/src/app/submission/submission.service.ts b/src/app/submission/submission.service.ts index 9eb8cf110a5..610570e8c0b 100644 --- a/src/app/submission/submission.service.ts +++ b/src/app/submission/submission.service.ts @@ -4,7 +4,7 @@ import { Router } from '@angular/router'; import { Observable, of as observableOf, Subscription, timer as observableTimer } from 'rxjs'; import { catchError, concatMap, distinctUntilChanged, filter, find, map, startWith, take, tap } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; +import { Store, MemoizedSelector, createSelector, select } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; import { submissionSelector, SubmissionState } from './submission.reducers'; @@ -47,6 +47,20 @@ import { SubmissionJsonPatchOperationsService } from '../core/submission/submiss import { SubmissionSectionObject } from './objects/submission-section-object.model'; import { SubmissionError } from './objects/submission-error.model'; +function getSubmissionSelector(submissionId: string): MemoizedSelector { + return createSelector( + submissionSelector, + (state: SubmissionState) => state.objects[submissionId], + ); +} + +function getSubmissionCollectionIdSelector(submissionId: string): MemoizedSelector { + return createSelector( + getSubmissionSelector(submissionId), + (submission: SubmissionObjectEntry) => submission?.collection, + ); +} + /** * A service that provides methods used in submission process. */ @@ -96,10 +110,19 @@ export class SubmissionService { * @param collectionId * The collection id */ - changeSubmissionCollection(submissionId, collectionId) { + changeSubmissionCollection(submissionId: string, collectionId: string): void { this.store.dispatch(new ChangeSubmissionCollectionAction(submissionId, collectionId)); } + /** + * Listen to collection changes for a certain {@link SubmissionObject} + * + * @param submissionId The submission id + */ + getSubmissionCollectionId(submissionId: string): Observable { + return this.store.pipe(select(getSubmissionCollectionIdSelector(submissionId))); + } + /** * Perform a REST call to create a new workspaceitem and return response * diff --git a/src/app/workflowitems-edit-page/item-from-workflow-breadcrumb.resolver.ts b/src/app/workflowitems-edit-page/item-from-workflow-breadcrumb.resolver.ts new file mode 100644 index 00000000000..f4fb5436054 --- /dev/null +++ b/src/app/workflowitems-edit-page/item-from-workflow-breadcrumb.resolver.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; +import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service'; +import { SubmissionParentBreadcrumbResolver } from '../core/submission/resolver/submission-parent-breadcrumb.resolver'; +import { BreadcrumbConfig } from '../breadcrumbs/breadcrumb/breadcrumb-config.model'; +import { SubmissionParentBreadcrumbsService } from '../core/submission/submission-parent-breadcrumb.service'; +import { SubmissionObject } from '../core/submission/models/submission-object.model'; + +/** + * This class represents a resolver that retrieves the breadcrumbs of the workflow item + */ +@Injectable() +export class ItemFromWorkflowBreadcrumbResolver extends SubmissionParentBreadcrumbResolver implements Resolve> { + + constructor( + protected dataService: WorkflowItemDataService, + protected breadcrumbService: SubmissionParentBreadcrumbsService, + ) { + super(dataService, breadcrumbService); + } + +} diff --git a/src/app/workflowitems-edit-page/item-from-workflow.resolver.spec.ts b/src/app/workflowitems-edit-page/item-from-workflow.resolver.spec.ts index 1ef87ad10ff..40cec6a3e54 100644 --- a/src/app/workflowitems-edit-page/item-from-workflow.resolver.spec.ts +++ b/src/app/workflowitems-edit-page/item-from-workflow.resolver.spec.ts @@ -19,7 +19,7 @@ describe('ItemFromWorkflowResolver', () => { wfiService = { findById: (id: string) => createSuccessfulRemoteDataObject$(wfi) } as any; - resolver = new ItemFromWorkflowResolver(wfiService, null); + resolver = new ItemFromWorkflowResolver(wfiService); }); it('should resolve a an item from from the workflow item with the correct id', (done) => { diff --git a/src/app/workflowitems-edit-page/item-from-workflow.resolver.ts b/src/app/workflowitems-edit-page/item-from-workflow.resolver.ts index bacf5156569..8a749b89889 100644 --- a/src/app/workflowitems-edit-page/item-from-workflow.resolver.ts +++ b/src/app/workflowitems-edit-page/item-from-workflow.resolver.ts @@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'; import { Resolve } from '@angular/router'; import { RemoteData } from '../core/data/remote-data'; import { Item } from '../core/shared/item.model'; -import { Store } from '@ngrx/store'; import { WorkflowItemDataService } from '../core/submission/workflowitem-data.service'; import { SubmissionObjectResolver } from '../core/submission/resolver/submission-object.resolver'; @@ -10,12 +9,12 @@ import { SubmissionObjectResolver } from '../core/submission/resolver/submission * This class represents a resolver that requests a specific item before the route is activated */ @Injectable() -export class ItemFromWorkflowResolver extends SubmissionObjectResolver implements Resolve> { +export class ItemFromWorkflowResolver extends SubmissionObjectResolver implements Resolve> { + constructor( - private workflowItemService: WorkflowItemDataService, - protected store: Store + protected dataService: WorkflowItemDataService, ) { - super(workflowItemService, store); + super(dataService); } } diff --git a/src/app/workflowitems-edit-page/workflowitems-edit-page-routing.module.ts b/src/app/workflowitems-edit-page/workflowitems-edit-page-routing.module.ts index 9c24bacb98d..1a0dcf6fe75 100644 --- a/src/app/workflowitems-edit-page/workflowitems-edit-page-routing.module.ts +++ b/src/app/workflowitems-edit-page/workflowitems-edit-page-routing.module.ts @@ -15,13 +15,17 @@ import { ThemedWorkflowItemSendBackComponent } from './workflow-item-send-back/t import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { ItemFromWorkflowResolver } from './item-from-workflow.resolver'; import { ThemedFullItemPageComponent } from '../item-page/full/themed-full-item-page.component'; +import { ItemFromWorkflowBreadcrumbResolver } from './item-from-workflow-breadcrumb.resolver'; @NgModule({ imports: [ RouterModule.forChild([ { path: ':id', - resolve: { wfi: WorkflowItemPageResolver }, + resolve: { + breadcrumb: ItemFromWorkflowBreadcrumbResolver, + wfi: WorkflowItemPageResolver, + }, children: [ { canActivate: [AuthenticatedGuard], @@ -64,7 +68,11 @@ import { ThemedFullItemPageComponent } from '../item-page/full/themed-full-item- }] ) ], - providers: [WorkflowItemPageResolver, ItemFromWorkflowResolver] + providers: [ + ItemFromWorkflowBreadcrumbResolver, + ItemFromWorkflowResolver, + WorkflowItemPageResolver, + ], }) /** * This module defines the default component to load when navigating to the workflowitems edit page path. diff --git a/src/app/workspaceitems-edit-page/item-from-workspace-breadcrumb.resolver.ts b/src/app/workspaceitems-edit-page/item-from-workspace-breadcrumb.resolver.ts new file mode 100644 index 00000000000..2ec872521a9 --- /dev/null +++ b/src/app/workspaceitems-edit-page/item-from-workspace-breadcrumb.resolver.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +import { SubmissionParentBreadcrumbResolver } from '../core/submission/resolver/submission-parent-breadcrumb.resolver'; +import { BreadcrumbConfig } from '../breadcrumbs/breadcrumb/breadcrumb-config.model'; +import { SubmissionParentBreadcrumbsService } from '../core/submission/submission-parent-breadcrumb.service'; +import { SubmissionObject } from '../core/submission/models/submission-object.model'; + +/** + * This class represents a resolver that retrieves the breadcrumbs of the workspace item + */ +@Injectable() +export class ItemFromWorkspaceBreadcrumbResolver extends SubmissionParentBreadcrumbResolver implements Resolve> { + + constructor( + protected dataService: WorkspaceitemDataService, + protected breadcrumbService: SubmissionParentBreadcrumbsService, + ) { + super(dataService, breadcrumbService); + } + +} diff --git a/src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts index c14344d70da..f350be4f66a 100644 --- a/src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts +++ b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts @@ -19,7 +19,7 @@ describe('ItemFromWorkspaceResolver', () => { wfiService = { findById: (id: string) => createSuccessfulRemoteDataObject$(wfi) } as any; - resolver = new ItemFromWorkspaceResolver(wfiService, null); + resolver = new ItemFromWorkspaceResolver(wfiService); }); it('should resolve a an item from from the workflow item with the correct id', (done) => { diff --git a/src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts index 60e1fe6a87a..2c76a426cf6 100644 --- a/src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts +++ b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts @@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'; import { Resolve } from '@angular/router'; import { RemoteData } from '../core/data/remote-data'; import { Item } from '../core/shared/item.model'; -import { Store } from '@ngrx/store'; import { SubmissionObjectResolver } from '../core/submission/resolver/submission-object.resolver'; import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; @@ -10,12 +9,12 @@ import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data. * This class represents a resolver that requests a specific item before the route is activated */ @Injectable() -export class ItemFromWorkspaceResolver extends SubmissionObjectResolver implements Resolve> { - constructor( - private workspaceItemService: WorkspaceitemDataService, - protected store: Store - ) { - super(workspaceItemService, store); - } +export class ItemFromWorkspaceResolver extends SubmissionObjectResolver implements Resolve> { + + constructor( + protected dataService: WorkspaceitemDataService, + ) { + super(dataService); + } } diff --git a/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts index cc76634c036..345c76e2958 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts @@ -7,6 +7,7 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso import { ThemedFullItemPageComponent } from '../item-page/full/themed-full-item-page.component'; import { ItemFromWorkspaceResolver } from './item-from-workspace.resolver'; import { WorkspaceItemPageResolver } from './workspace-item-page.resolver'; +import { ItemFromWorkspaceBreadcrumbResolver } from './item-from-workspace-breadcrumb.resolver'; @NgModule({ imports: [ @@ -14,7 +15,10 @@ import { WorkspaceItemPageResolver } from './workspace-item-page.resolver'; { path: '', redirectTo: '/home', pathMatch: 'full' }, { path: ':id', - resolve: { wsi: WorkspaceItemPageResolver }, + resolve: { + breadcrumb: ItemFromWorkspaceBreadcrumbResolver, + wsi: WorkspaceItemPageResolver, + }, children: [ { canActivate: [AuthenticatedGuard], @@ -39,7 +43,11 @@ import { WorkspaceItemPageResolver } from './workspace-item-page.resolver'; } ]) ], - providers: [WorkspaceItemPageResolver, ItemFromWorkspaceResolver] + providers: [ + ItemFromWorkspaceBreadcrumbResolver, + ItemFromWorkspaceResolver, + WorkspaceItemPageResolver, + ], }) /** * This module defines the default component to load when navigating to the workspaceitems edit page path From 4251630ab86d1430f1cb45116097fa7d30d7d8d2 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Thu, 11 Apr 2024 00:18:04 +0200 Subject: [PATCH 07/11] 112970: Always rerun resolvers on url change for create comcol pages --- src/app/collection-page/collection-page-routing.module.ts | 1 + src/app/community-page/community-page-routing.module.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/app/collection-page/collection-page-routing.module.ts b/src/app/collection-page/collection-page-routing.module.ts index 8db7cf7021a..d342f8dfeb0 100644 --- a/src/app/collection-page/collection-page-routing.module.ts +++ b/src/app/collection-page/collection-page-routing.module.ts @@ -47,6 +47,7 @@ import { CommunityBreadcrumbResolver } from '../core/breadcrumbs/community-bread resolve: { breadcrumb: CommunityBreadcrumbResolver, }, + runGuardsAndResolvers: 'always', }, { path: ':id', diff --git a/src/app/community-page/community-page-routing.module.ts b/src/app/community-page/community-page-routing.module.ts index 242b85bc015..1ab3472d002 100644 --- a/src/app/community-page/community-page-routing.module.ts +++ b/src/app/community-page/community-page-routing.module.ts @@ -40,6 +40,7 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso resolve: { breadcrumb: CommunityBreadcrumbResolver, }, + runGuardsAndResolvers: 'always', }, { path: ':id', From 9bdf265f321066c9816b4c950f1fc7c4da5a63d4 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Tue, 16 Apr 2024 23:37:07 +0200 Subject: [PATCH 08/11] Home page facet refactor fixes --- src/app/home-page/home-page.component.html | 42 ++++++++++----------- src/app/home-page/home-page.component.scss | 7 ++-- src/app/home-page/home-page.component.ts | 9 +---- src/app/shared/search/search.component.html | 1 + 4 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/app/home-page/home-page.component.html b/src/app/home-page/home-page.component.html index f0760f20aa3..2992e4fb044 100644 --- a/src/app/home-page/home-page.component.html +++ b/src/app/home-page/home-page.component.html @@ -1,29 +1,25 @@ -
- -
- - - - - - - - -
-
+ + + +
+
- -
- - -
+ + + + + + + + diff --git a/src/app/home-page/home-page.component.scss b/src/app/home-page/home-page.component.scss index 653de42b44b..5905a5959bb 100644 --- a/src/app/home-page/home-page.component.scss +++ b/src/app/home-page/home-page.component.scss @@ -1,5 +1,6 @@ -:host ::ng-deep { - .container-fluid .container { - padding: 0; +@include media-breakpoint-down(md) { + ds-themed-configuration-search-page + .container { + width: 100%; + max-width: none; } } diff --git a/src/app/home-page/home-page.component.ts b/src/app/home-page/home-page.component.ts index 4fa0e89e8ee..fc927ba07d7 100644 --- a/src/app/home-page/home-page.component.ts +++ b/src/app/home-page/home-page.component.ts @@ -2,6 +2,7 @@ import { AsyncPipe, NgClass, NgIf, + NgTemplateOutlet, } from '@angular/common'; import { Component, @@ -21,10 +22,8 @@ import { Site } from '../core/shared/site.model'; import { SuggestionsPopupComponent } from '../notifications/suggestions-popup/suggestions-popup.component'; import { ConfigurationSearchPageComponent } from '../search-page/configuration-search-page.component'; import { ThemedConfigurationSearchPageComponent } from '../search-page/themed-configuration-search-page.component'; -import { HostWindowService } from '../shared/host-window.service'; import { ThemedSearchFormComponent } from '../shared/search-form/themed-search-form.component'; import { PageWithSidebarComponent } from '../shared/sidebar/page-with-sidebar.component'; -import { SidebarService } from '../shared/sidebar/sidebar.service'; import { ViewTrackerComponent } from '../statistics/angulartics/dspace/view-tracker.component'; import { HomeCoarComponent } from './home-coar/home-coar.component'; import { ThemedHomeNewsComponent } from './home-news/themed-home-news.component'; @@ -36,27 +35,23 @@ import { ThemedTopLevelCommunityListComponent } from './top-level-community-list styleUrls: ['./home-page.component.scss'], templateUrl: './home-page.component.html', standalone: true, - imports: [ThemedHomeNewsComponent, NgIf, ViewTrackerComponent, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, ConfigurationSearchPageComponent, SuggestionsPopupComponent, ThemedConfigurationSearchPageComponent, PageWithSidebarComponent, HomeCoarComponent], + imports: [ThemedHomeNewsComponent, NgTemplateOutlet, NgIf, ViewTrackerComponent, ThemedSearchFormComponent, ThemedTopLevelCommunityListComponent, RecentItemListComponent, AsyncPipe, TranslateModule, NgClass, ConfigurationSearchPageComponent, SuggestionsPopupComponent, ThemedConfigurationSearchPageComponent, PageWithSidebarComponent, HomeCoarComponent], }) export class HomePageComponent implements OnInit { site$: Observable; - isXsOrSm$: Observable; recentSubmissionspageSize: number; showDiscoverFilters: boolean; constructor( @Inject(APP_CONFIG) protected appConfig: AppConfig, protected route: ActivatedRoute, - protected sidebarService: SidebarService, - protected windowService: HostWindowService, ) { this.recentSubmissionspageSize = this.appConfig.homePage.recentSubmissions.pageSize; this.showDiscoverFilters = this.appConfig.homePage.showDiscoverFilters; } ngOnInit(): void { - this.isXsOrSm$ = this.windowService.isXsOrSm(); this.site$ = this.route.data.pipe( map((data) => data.site as Site), ); diff --git a/src/app/shared/search/search.component.html b/src/app/shared/search/search.component.html index a8a4bc1a6ae..2faa7c42af8 100644 --- a/src/app/shared/search/search.component.html +++ b/src/app/shared/search/search.component.html @@ -33,6 +33,7 @@ | translate}}
+ Date: Thu, 18 Apr 2024 19:27:26 +0200 Subject: [PATCH 09/11] 108555: Removed pageInfoState Input since it wasn't used and almost all the components gave the incorrect type of data to it --- .../browse/bulk-access-browse.component.html | 1 - .../epeople-registry.component.html | 1 - .../eperson-form/eperson-form.component.html | 1 - .../members-list/members-list.component.html | 2 - .../subgroups-list.component.html | 2 - .../groups-registry.component.html | 1 - .../bitstream-formats.component.html | 1 - .../metadata-schema.component.html | 1 - ...rag-and-drop-bitstream-list.component.html | 1 - .../edit-relationship-list.component.html | 1 - .../full-file-section.component.html | 2 - .../versions/item-versions.component.html | 1 - .../overview/process-overview.component.html | 1 - .../object-detail.component.html | 1 - .../object-grid/object-grid.component.html | 1 - .../object-list/object-list.component.html | 1 - .../collection-select.component.html | 1 - .../item-select/item-select.component.html | 1 - .../shared/pagination/pagination.component.ts | 45 +++---------------- 19 files changed, 6 insertions(+), 60 deletions(-) diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html index c716aedb8b3..df438781927 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.html @@ -36,7 +36,6 @@ {{labelPrefix + 'search.head' | trans diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html index 228449a8a57..9297edb0167 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html @@ -47,7 +47,6 @@
{{messagePrefix + '.groupsEPersonIsMemberOf' | translate}}
@@ -103,7 +102,6 @@

{{messagePrefix + '.headMembers' | translate}}

diff --git a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html index d009f0283eb..a4b5f4c680f 100644 --- a/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html +++ b/src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html @@ -35,7 +35,6 @@