From b005f3056462d081f2eacd032b1d8dcd32e32487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Thu, 19 Feb 2026 15:44:19 +0100 Subject: [PATCH 01/11] Created extended-file-section component. --- .../extended-file-section.component.html | 53 ++++++++++ .../extended-file-section.component.scss | 27 +++++ .../extended-file-section.component.ts | 98 +++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html create mode 100644 src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss create mode 100644 src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html new file mode 100644 index 00000000000..6b432a90f92 --- /dev/null +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html @@ -0,0 +1,53 @@ + +
+
+

+
+
+
+
+

+
+
+

+
+
+

+
+
+
+
+
+ @if (bitstreamsRD?.payload?.totalElements > 0) { + +
+ @for (file of bitstreamsRD?.payload?.page; track file) { +
+
+ +
+
+ {{ (bitstreamFormatDataService.findByBitstream(file) | async).payload?.shortDescription }} +
+
+ {{ (file?.sizeBytes) | dsFileSize }} +
+
+ + + +
+
+ } +
+
+ } +
+
+
+
diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss new file mode 100644 index 00000000000..d75f9fb1af8 --- /dev/null +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss @@ -0,0 +1,27 @@ +.file-section { + padding: 1rem; + background-color: var(--bs-gray-200); + + .file-section-header { + border-bottom: 4px solid var(--bs-primary); + } + + .file-section-table { + .row { + padding: 0.4em 0.75em; + } + .entries { + .file-section-entry { + background-color: var(--bs-300); + &:nth-child(2n + 1) { + background-color: var(--bs-gray-100); + } + } + } + .heading { + border-bottom: 1px solid var(--bs-gray-900); + background-color: var(--bs-gray-400); + font-size: 1.25em; + } + } +} diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts new file mode 100644 index 00000000000..6ba77092ac7 --- /dev/null +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts @@ -0,0 +1,98 @@ +import { AsyncPipe } from '@angular/common'; +import { + Component, + Inject, + Input, + OnInit, +} from '@angular/core'; +import { + APP_CONFIG, + AppConfig, +} from '@dspace/config/app-config.interface'; +import { DSONameService } from '@dspace/core/breadcrumbs/dso-name.service'; +import { BitstreamDataService } from '@dspace/core/data/bitstream-data.service'; +import { BitstreamFormatDataService } from '@dspace/core/data/bitstream-format-data.service'; +import { PaginatedList } from '@dspace/core/data/paginated-list.model'; +import { RemoteData } from '@dspace/core/data/remote-data'; +import { PaginationService } from '@dspace/core/pagination/pagination.service'; +import { PaginationComponentOptions } from '@dspace/core/pagination/pagination-component-options.model'; +import { Bitstream } from '@dspace/core/shared/bitstream.model'; +import { followLink } from '@dspace/core/shared/follow-link-config.model'; +import { Item } from '@dspace/core/shared/item.model'; +import { TranslatePipe } from '@ngx-translate/core'; +import { + from, + Observable, +} from 'rxjs'; +import { switchMap } from 'rxjs/operators'; + +import { ThemedFileDownloadLinkComponent } from '../../../../shared/file-download-link/themed-file-download-link.component'; +import { PaginationComponent } from '../../../../shared/pagination/pagination.component'; +import { FileSizePipe } from '../../../../shared/utils/file-size-pipe'; +import { VarDirective } from '../../../../shared/utils/var.directive'; + +@Component({ + selector: 'ds-extended-file-section', + imports: [ + AsyncPipe, + FileSizePipe, + PaginationComponent, + ThemedFileDownloadLinkComponent, + TranslatePipe, + VarDirective, + ], + templateUrl: './extended-file-section.component.html', + styleUrl: './extended-file-section.component.scss', +}) +export class ExtendedFileSectionComponent implements OnInit { + + @Input() item: Item; + + @Input() bundleName = 'ORIGINAL'; + + @Input() label = 'item.page.extended-file-section'; + + pageSize = 10; + + bitstreamsRD$: Observable>>; + + + /** + * The current pagination configuration for the page + */ + pageConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'afs', + pageSize: this.pageSize, + pageSizeOptions: [10, 20, 40, 60, 80, 100], + }); + + + constructor( + protected bitstreamDataService: BitstreamDataService, + protected bitstreamFormatDataService: BitstreamFormatDataService, + public dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig, + private paginationService: PaginationService, + ) { + this.pageSize = appConfig.item.bitstream.pageSize; + this.bitstreamsRD$ = from([]); + } + + ngOnInit(): void { + this.bitstreamsRD$ = this.paginationService.getCurrentPagination(this.pageConfig.id, this.pageConfig).pipe( + switchMap((options: PaginationComponentOptions) => { + return this.bitstreamDataService.findAllByItemAndBundleName( + this.item, + this.bundleName, + { elementsPerPage: options.pageSize, currentPage: options.currentPage }, + true, + true, + followLink('format'), + followLink('accessStatus'), + ); + }), + ); + } + + +} From 54472931b50643a2d65c809913227c078fde0ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Thu, 19 Feb 2026 15:44:48 +0100 Subject: [PATCH 02/11] Created dataset component. --- .../item-types/dataset/dataset.component.html | 107 ++++++++++++++++++ .../item-types/dataset/dataset.component.scss | 0 .../item-types/dataset/dataset.component.ts | 59 ++++++++++ src/app/shared/listable.module.ts | 2 + 4 files changed, 168 insertions(+) create mode 100644 src/app/item-page/simple/item-types/dataset/dataset.component.html create mode 100644 src/app/item-page/simple/item-types/dataset/dataset.component.scss create mode 100644 src/app/item-page/simple/item-types/dataset/dataset.component.ts diff --git a/src/app/item-page/simple/item-types/dataset/dataset.component.html b/src/app/item-page/simple/item-types/dataset/dataset.component.html new file mode 100644 index 00000000000..756420f7f89 --- /dev/null +++ b/src/app/item-page/simple/item-types/dataset/dataset.component.html @@ -0,0 +1,107 @@ +@if (showBackButton$ | async) { + +} +@if (iiifEnabled) { +
+
+ + +
+
+} +
+ + + +
+
+
+ @if (!(mediaViewer.image || mediaViewer.video)) { + + + + } + @if (mediaViewer.image || mediaViewer.video) { +
+ +
+ } + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + @if (geospatialItemPageFieldsEnabled) { + + + } + +
+
+ + +
+
diff --git a/src/app/item-page/simple/item-types/dataset/dataset.component.scss b/src/app/item-page/simple/item-types/dataset/dataset.component.scss new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/app/item-page/simple/item-types/dataset/dataset.component.ts b/src/app/item-page/simple/item-types/dataset/dataset.component.ts new file mode 100644 index 00000000000..ed156a22549 --- /dev/null +++ b/src/app/item-page/simple/item-types/dataset/dataset.component.ts @@ -0,0 +1,59 @@ +import { AsyncPipe } from '@angular/common'; +import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { ViewMode } from '@dspace/core/shared/view-mode.model'; +import { TranslatePipe } from '@ngx-translate/core'; + +import { DsoEditMenuComponent } from '../../../../shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { MetadataFieldWrapperComponent } from '../../../../shared/metadata-field-wrapper/metadata-field-wrapper.component'; +import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { ThemedResultsBackButtonComponent } from '../../../../shared/results-back-button/themed-results-back-button.component'; +import { ThemedThumbnailComponent } from '../../../../thumbnail/themed-thumbnail.component'; +import { CollectionsComponent } from '../../../field-components/collections/collections.component'; +import { ThemedMediaViewerComponent } from '../../../media-viewer/themed-media-viewer.component'; +import { MiradorViewerComponent } from '../../../mirador-viewer/mirador-viewer.component'; +import { ExtendedFileSectionComponent } from '../../field-components/extended-file-section/extended-file-section.component'; +import { ItemPageAbstractFieldComponent } from '../../field-components/specific-field/abstract/item-page-abstract-field.component'; +import { ItemPageDateFieldComponent } from '../../field-components/specific-field/date/item-page-date-field.component'; +import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; +import { GeospatialItemPageFieldComponent } from '../../field-components/specific-field/geospatial/geospatial-item-page-field.component'; +import { ThemedItemPageTitleFieldComponent } from '../../field-components/specific-field/title/themed-item-page-field.component'; +import { ItemPageUriFieldComponent } from '../../field-components/specific-field/uri/item-page-uri-field.component'; +import { ThemedMetadataRepresentationListComponent } from '../../metadata-representation-list/themed-metadata-representation-list.component'; +import { RelatedItemsComponent } from '../../related-items/related-items-component'; +import { ItemComponent } from '../shared/item.component'; + +/** + * Component that represents a Dataset Item page + */ + +@listableObjectComponent('Dataset', ViewMode.StandalonePage) +@Component({ + selector: 'ds-dataset', + imports: [ + AsyncPipe, + CollectionsComponent, + DsoEditMenuComponent, + ExtendedFileSectionComponent, + GenericItemPageFieldComponent, + GeospatialItemPageFieldComponent, + ItemPageAbstractFieldComponent, + ItemPageDateFieldComponent, + ItemPageUriFieldComponent, + MetadataFieldWrapperComponent, + MiradorViewerComponent, + RelatedItemsComponent, + RouterLink, + ThemedItemPageTitleFieldComponent, + ThemedMediaViewerComponent, + ThemedMetadataRepresentationListComponent, + ThemedResultsBackButtonComponent, + ThemedThumbnailComponent, + TranslatePipe, + ], + templateUrl: './dataset.component.html', + styleUrl: './dataset.component.scss', +}) +export class DatasetComponent extends ItemComponent { + +} diff --git a/src/app/shared/listable.module.ts b/src/app/shared/listable.module.ts index cf417129e6b..4376842fab5 100644 --- a/src/app/shared/listable.module.ts +++ b/src/app/shared/listable.module.ts @@ -123,6 +123,7 @@ import { PublicationSidebarSearchListElementComponent } from './object-list/side import { ThemedResultsBackButtonComponent } from './results-back-button/themed-results-back-button.component'; import { TruncatableComponent } from './truncatable/truncatable.component'; import { TruncatablePartComponent } from './truncatable/truncatable-part/truncatable-part.component'; +import {DatasetComponent} from "../item-page/simple/item-types/dataset/dataset.component"; const ENTRY_COMPONENTS = [ ...THEME_LISTABLE_COMPONENTS, @@ -208,6 +209,7 @@ const ENTRY_COMPONENTS = [ PoolSearchResultDetailElementComponent, ItemSearchResultListElementSubmissionComponent, PublicationComponent, + DatasetComponent, UntypedItemComponent, ]; From 3ed97061de1028c647ac104536609875133c712c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Thu, 19 Feb 2026 15:45:01 +0100 Subject: [PATCH 03/11] Added en i18n labels. --- src/assets/i18n/en.json5 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 34140592c90..7f270aa688d 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -7363,4 +7363,16 @@ "metadata-link-view.popover.label.other.dc.description.abstract": "Description", "metadata-link-view.popover.label.more-info": "More info", + + "item.page.extended-file-section": "Bitstreams", + + "file.section.name": "Document", + + "file.section.type": "Type", + + "file.section.size": "Size", + + "dataset.page.titleprefix": "Dataset", + + "dataset.listelement.badge": "Dataset" } From 076bcac740327cca00a6522aa7f88a264e78351a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Thu, 19 Feb 2026 15:45:24 +0100 Subject: [PATCH 04/11] Added blanko spec.ts files. --- .../extended-file-section.component.spec.ts | 23 ++ .../dataset/dataset.component.spec.ts | 273 ++++++++++++++++++ 2 files changed, 296 insertions(+) create mode 100644 src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts create mode 100644 src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts new file mode 100644 index 00000000000..fa51c0c14f2 --- /dev/null +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExtendedFileSectionComponent } from './extended-file-section.component'; + +describe('ExtendedFileSectionComponent', () => { + let component: ExtendedFileSectionComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ExtendedFileSectionComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ExtendedFileSectionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts b/src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts new file mode 100644 index 00000000000..b630f97b5a1 --- /dev/null +++ b/src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts @@ -0,0 +1,273 @@ +import { HttpClient } from '@angular/common/http'; +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, + waitForAsync, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { RouterTestingModule } from '@angular/router/testing'; +import { APP_CONFIG } from '@dspace/config/app-config.interface'; +import { BrowseDefinitionDataService } from '@dspace/core/browse/browse-definition-data.service'; +import { RemoteDataBuildService } from '@dspace/core/cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '@dspace/core/cache/object-cache.service'; +import { BitstreamDataService } from '@dspace/core/data/bitstream-data.service'; +import { CommunityDataService } from '@dspace/core/data/community-data.service'; +import { DefaultChangeAnalyzer } from '@dspace/core/data/default-change-analyzer.service'; +import { DSOChangeAnalyzer } from '@dspace/core/data/dso-change-analyzer.service'; +import { ItemDataService } from '@dspace/core/data/item-data.service'; +import { RelationshipDataService } from '@dspace/core/data/relationship-data.service'; +import { RemoteData } from '@dspace/core/data/remote-data'; +import { VersionDataService } from '@dspace/core/data/version-data.service'; +import { VersionHistoryDataService } from '@dspace/core/data/version-history-data.service'; +import { APP_DATA_SERVICES_MAP } from '@dspace/core/data-services-map-type'; +import { NotificationsService } from '@dspace/core/notification-system/notifications.service'; +import { RouteService } from '@dspace/core/services/route.service'; +import { Bitstream } from '@dspace/core/shared/bitstream.model'; +import { HALEndpointService } from '@dspace/core/shared/hal-endpoint.service'; +import { Item } from '@dspace/core/shared/item.model'; +import { MetadataMap } from '@dspace/core/shared/metadata.models'; +import { UUIDService } from '@dspace/core/shared/uuid.service'; +import { WorkspaceitemDataService } from '@dspace/core/submission/workspaceitem-data.service'; +import { BrowseDefinitionDataServiceStub } from '@dspace/core/testing/browse-definition-data-service.stub'; +import { mockTruncatableService } from '@dspace/core/testing/mock-trucatable.service'; +import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock'; +import { createPaginatedList } from '@dspace/core/testing/utils.test'; +import { createSuccessfulRemoteDataObject$ } from '@dspace/core/utilities/remote-data.utils'; +import { Store } from '@ngrx/store'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; +import { + Observable, + of, +} from 'rxjs'; + +import { environment } from '../../../../../environments/environment.test'; +import { DsoEditMenuComponent } from '../../../../shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { MetadataFieldWrapperComponent } from '../../../../shared/metadata-field-wrapper/metadata-field-wrapper.component'; +import { ThemedResultsBackButtonComponent } from '../../../../shared/results-back-button/themed-results-back-button.component'; +import { SearchService } from '../../../../shared/search/search.service'; +import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { ThemedThumbnailComponent } from '../../../../thumbnail/themed-thumbnail.component'; +import { CollectionsComponent } from '../../../field-components/collections/collections.component'; +import { ThemedMediaViewerComponent } from '../../../media-viewer/themed-media-viewer.component'; +import { MiradorViewerComponent } from '../../../mirador-viewer/mirador-viewer.component'; +import { ThemedFileSectionComponent } from '../../field-components/file-section/themed-file-section.component'; +import { ItemPageAbstractFieldComponent } from '../../field-components/specific-field/abstract/item-page-abstract-field.component'; +import { ItemPageDateFieldComponent } from '../../field-components/specific-field/date/item-page-date-field.component'; +import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; +import { ThemedItemPageTitleFieldComponent } from '../../field-components/specific-field/title/themed-item-page-field.component'; +import { ItemPageUriFieldComponent } from '../../field-components/specific-field/uri/item-page-uri-field.component'; +import { ThemedMetadataRepresentationListComponent } from '../../metadata-representation-list/themed-metadata-representation-list.component'; +import { RelatedItemsComponent } from '../../related-items/related-items-component'; +import { + createRelationshipsObservable, + getIIIFEnabled, + getIIIFSearchEnabled, + mockRouteService, +} from '../shared/item.component.spec'; +import { DatasetComponent } from './dataset.component'; + +const noMetadata = new MetadataMap(); + +function getItem(metadata: MetadataMap) { + return Object.assign(new Item(), { + bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), + metadata: metadata, + relationships: createRelationshipsObservable(), + }); +} + +describe('DatasetComponent', () => { + let comp: DatasetComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + const mockBitstreamDataService = { + getThumbnailFor(item: Item): Observable> { + return createSuccessfulRemoteDataObject$(new Bitstream()); + }, + }; + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock, + }, + }), + RouterTestingModule, + GenericItemPageFieldComponent, TruncatePipe, + DatasetComponent, + ], + providers: [ + { provide: ItemDataService, useValue: {} }, + { provide: TruncatableService, useValue: mockTruncatableService }, + { provide: RelationshipDataService, useValue: {} }, + { provide: ObjectCacheService, useValue: {} }, + { provide: UUIDService, useValue: {} }, + { provide: Store, useValue: {} }, + { provide: RemoteDataBuildService, useValue: {} }, + { provide: CommunityDataService, useValue: {} }, + { provide: HALEndpointService, useValue: {} }, + { provide: NotificationsService, useValue: {} }, + { provide: HttpClient, useValue: {} }, + { provide: DSOChangeAnalyzer, useValue: {} }, + { provide: DefaultChangeAnalyzer, useValue: {} }, + { provide: VersionHistoryDataService, useValue: {} }, + { provide: VersionDataService, useValue: {} }, + { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: WorkspaceitemDataService, useValue: {} }, + { provide: SearchService, useValue: {} }, + { provide: RouteService, useValue: mockRouteService }, + { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }, + { provide: APP_CONFIG, useValue: environment }, + { provide: APP_DATA_SERVICES_MAP, useValue: {} }, + ], + schemas: [NO_ERRORS_SCHEMA], + }).overrideComponent(DatasetComponent, { + add: { changeDetection: ChangeDetectionStrategy.Default }, + remove: { + imports: [ThemedResultsBackButtonComponent, MiradorViewerComponent, ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, MetadataFieldWrapperComponent, ThemedThumbnailComponent, ThemedMediaViewerComponent, ThemedFileSectionComponent, ItemPageDateFieldComponent, ThemedMetadataRepresentationListComponent, GenericItemPageFieldComponent, RelatedItemsComponent, ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, CollectionsComponent, + ], + }, + }); + })); + + describe('default view', () => { + beforeEach(waitForAsync(() => { + TestBed.compileComponents(); + fixture = TestBed.createComponent(DatasetComponent); + comp = fixture.componentInstance; + comp.object = getItem(noMetadata); + fixture.detectChanges(); + })); + + it('should contain a component to display the date', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-item-page-date-field')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + + it('should not contain a metadata only author field', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-item-page-author-field')); + expect(fields.length).toBe(0); + }); + + it('should contain a mixed metadata and relationship field for authors', () => { + const fields = fixture.debugElement.queryAll(By.css('.ds-item-page-mixed-author-field')); + expect(fields.length).toBe(1); + }); + + it('should contain a component to display the abstract', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-item-page-abstract-field')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + + it('should contain a component to display the uri', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-item-page-uri-field')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + + it('should contain a component to display the collections', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-item-page-collections')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + }); + + describe('with IIIF viewer', () => { + + beforeEach(waitForAsync(() => { + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(false)], + }; + TestBed.compileComponents(); + fixture = TestBed.createComponent(DatasetComponent); + comp = fixture.componentInstance; + comp.object = getItem(iiifEnabledMap); + fixture.detectChanges(); + })); + + it('should contain an iiif viewer component', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-mirador-viewer')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + it('should not retrieve the query term for previous route', fakeAsync((): void => { + //tick(10) + expect(comp.iiifQuery$).toBeFalsy(); + })); + + }); + + describe('with IIIF viewer and search', () => { + + const localMockRouteService = { + getPreviousUrl(): Observable { + return of('/search?query=test%20query&fakeParam=true'); + }, + }; + beforeEach(waitForAsync(() => { + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(true)], + }; + TestBed.overrideProvider(RouteService, { useValue: localMockRouteService }); + TestBed.compileComponents(); + fixture = TestBed.createComponent(DatasetComponent); + comp = fixture.componentInstance; + comp.object = getItem(iiifEnabledMap); + fixture.detectChanges(); + })); + + it('should contain an iiif viewer component', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-mirador-viewer')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + + it('should retrieve the query term for previous route', fakeAsync((): void => { + expect(comp.iiifQuery$.subscribe(result => expect(result).toEqual('test query'))); + })); + + }); + + describe('with IIIF viewer and search but no previous search query', () => { + const localMockRouteService = { + getPreviousUrl(): Observable { + return of('/item'); + }, + }; + beforeEach(waitForAsync(() => { + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(true)], + }; + TestBed.overrideProvider(RouteService, { useValue: localMockRouteService }); + TestBed.compileComponents(); + fixture = TestBed.createComponent(DatasetComponent); + comp = fixture.componentInstance; + comp.object = getItem(iiifEnabledMap); + fixture.detectChanges(); + })); + + it('should contain an iiif viewer component', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-mirador-viewer')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + + it('should not retrieve the query term for previous route', fakeAsync( () => { + let emitted; + comp.iiifQuery$.subscribe(result => emitted = result); + tick(10); + expect(emitted).toBeUndefined(); + })); + + }); +}); From 42b0efbf4c6fff6e5e79c260c632d64465b81605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Fri, 20 Feb 2026 11:08:21 +0100 Subject: [PATCH 05/11] Updated spec tests. --- .../extended-file-section.component.scss | 2 + .../extended-file-section.component.spec.ts | 145 +++++++++++++++++- .../extended-file-section.component.ts | 15 +- .../dataset/dataset.component.spec.ts | 6 +- 4 files changed, 150 insertions(+), 18 deletions(-) diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss index d75f9fb1af8..0e9396c0881 100644 --- a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.scss @@ -1,3 +1,5 @@ +@import '../../../../../styles/variables.scss'; + .file-section { padding: 1rem; background-color: var(--bs-gray-200); diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts index fa51c0c14f2..f809f3713a0 100644 --- a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.spec.ts @@ -1,23 +1,154 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { ActivatedRoute } from '@angular/router'; +import { APP_CONFIG } from '@dspace/config/app-config.interface'; +import { BitstreamDataService } from '@dspace/core/data/bitstream-data.service'; +import { BitstreamFormatDataService } from '@dspace/core/data/bitstream-format-data.service'; +import { LocaleService } from '@dspace/core/locale/locale.service'; +import { NotificationsService } from '@dspace/core/notification-system/notifications.service'; +import { PaginationService } from '@dspace/core/pagination/pagination.service'; +import { Bitstream } from '@dspace/core/shared/bitstream.model'; +import { BitstreamFormat } from '@dspace/core/shared/bitstream-format.model'; +import { Item } from '@dspace/core/shared/item.model'; +import { ActivatedRouteStub } from '@dspace/core/testing/active-router.stub'; +import { NotificationsServiceStub } from '@dspace/core/testing/notifications-service.stub'; +import { PaginationServiceStub } from '@dspace/core/testing/pagination-service.stub'; +import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock'; +import { createPaginatedList } from '@dspace/core/testing/utils.test'; +import { createSuccessfulRemoteDataObject$ } from '@dspace/core/utilities/remote-data.utils'; +import { XSRFService } from '@dspace/core/xsrf/xsrf.service'; +import { provideMockStore } from '@ngrx/store/testing'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; +import { of } from 'rxjs'; +import { environment } from '../../../../../environments/environment'; +import { ThemedFileDownloadLinkComponent } from '../../../../shared/file-download-link/themed-file-download-link.component'; +import { PaginationComponent } from '../../../../shared/pagination/pagination.component'; +import { SearchConfigurationService } from '../../../../shared/search/search-configuration.service'; +import { getMockThemeService } from '../../../../shared/theme-support/test/theme-service.mock'; +import { ThemeService } from '../../../../shared/theme-support/theme.service'; +import { FileSizePipe } from '../../../../shared/utils/file-size-pipe'; +import { VarDirective } from '../../../../shared/utils/var.directive'; import { ExtendedFileSectionComponent } from './extended-file-section.component'; describe('ExtendedFileSectionComponent', () => { let component: ExtendedFileSectionComponent; let fixture: ComponentFixture; + let localeService: any; + const languageList = ['en;q=1', 'de;q=0.8']; + const mockLocaleService = jasmine.createSpyObj('LocaleService', { + getCurrentLanguageCode: jasmine.createSpy('getCurrentLanguageCode'), + getLanguageCodeList: of(languageList), + }); + + const paginationServiceStub = new PaginationServiceStub(); + + const mockItem = Object.assign(new Item(), { + id: 'test-item-id', + uuid: 'test-item-id', + _links: { + self: { href: 'test-item-selflink' }, + }, + }); + + const mockBitstream = Object.assign(new Bitstream(), { + id: 'test-bitstream-id', + uuid: 'test-bitstream-id', + name: 'test-bitstream.pdf', + sizeBytes: 1024, + _links: { + self: { href: 'test-bitstream-selflink' }, + }, + }); + + const mockBitstreamFormat = Object.assign(new BitstreamFormat(), { + resourceType: 'testResourceType', + shortDescription: 'testShortDescription', + description: 'testDescription', + mimetype: 'test/mimeType', + }); + + const paginatedList = createPaginatedList([mockBitstream]); + + paginatedList.pageInfo.elementsPerPage = environment.item.bitstream.pageSize; - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ExtendedFileSectionComponent] - }) - .compileComponents(); + const bitstreamDataService = jasmine.createSpyObj('bitstreamDataService', { + findAllByItemAndBundleName: createSuccessfulRemoteDataObject$(paginatedList), + }); + + const bitstreamFormatDataService = jasmine.createSpyObj('bitstreamFormatDataService', { + findByBitstream: createSuccessfulRemoteDataObject$(mockBitstreamFormat), + }); + + beforeEach(waitForAsync(() => { + + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock, + }, + }), + BrowserAnimationsModule, + ExtendedFileSectionComponent, + VarDirective, + FileSizePipe, + ], + providers: [ + provideMockStore(), + { provide: XSRFService, useValue: {} }, + { provide: BitstreamDataService, useValue: bitstreamDataService }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + { provide: BitstreamFormatDataService, useValue: bitstreamFormatDataService }, + { provide: ThemeService, useValue: getMockThemeService() }, + { provide: SearchConfigurationService, useValue: jasmine.createSpyObj(['getCurrentConfiguration']) }, + { provide: PaginationService, useValue: paginationServiceStub }, + { provide: ActivatedRoute, useValue: new ActivatedRouteStub() }, + { provide: LocaleService, useValue: mockLocaleService }, + { provide: APP_CONFIG, useValue: environment }, + ], + schemas: [NO_ERRORS_SCHEMA], + }).overrideComponent(ExtendedFileSectionComponent, { + remove: { + imports: [ + PaginationComponent, + ThemedFileDownloadLinkComponent, + ], + }, + }).compileComponents(); + })); + beforeEach(waitForAsync(() => { + localeService = TestBed.inject(LocaleService); + localeService.getCurrentLanguageCode.and.returnValue(of('en')); fixture = TestBed.createComponent(ExtendedFileSectionComponent); component = fixture.componentInstance; + component.item = mockItem; fixture.detectChanges(); - }); + })); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should set pageSize from appConfig', () => { + expect(component.pageSize).toEqual(environment.item.bitstream.pageSize); + }); + + describe('when the extended file section gets loaded with bitstreams available', () => { + it('should contain a list with bitstream', () => { + const fileSection = fixture.debugElement.queryAll(By.css('.file-section-entry')); + expect(fileSection.length).toEqual(1); + }); + }); }); diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts index 6ba77092ac7..174f2ee1cf7 100644 --- a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.ts @@ -19,7 +19,7 @@ import { PaginationComponentOptions } from '@dspace/core/pagination/pagination-c import { Bitstream } from '@dspace/core/shared/bitstream.model'; import { followLink } from '@dspace/core/shared/follow-link-config.model'; import { Item } from '@dspace/core/shared/item.model'; -import { TranslatePipe } from '@ngx-translate/core'; +import { TranslateModule } from '@ngx-translate/core'; import { from, Observable, @@ -38,7 +38,7 @@ import { VarDirective } from '../../../../shared/utils/var.directive'; FileSizePipe, PaginationComponent, ThemedFileDownloadLinkComponent, - TranslatePipe, + TranslateModule, VarDirective, ], templateUrl: './extended-file-section.component.html', @@ -52,18 +52,18 @@ export class ExtendedFileSectionComponent implements OnInit { @Input() label = 'item.page.extended-file-section'; - pageSize = 10; - bitstreamsRD$: Observable>>; + pageSize = this.appConfig.item.bitstream.pageSize; + /** * The current pagination configuration for the page */ pageConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { - id: 'afs', - pageSize: this.pageSize, - pageSizeOptions: [10, 20, 40, 60, 80, 100], + id: 'efs', + currentPage: 1, + pageSize: this.appConfig.item.bitstream.pageSize, }); @@ -74,7 +74,6 @@ export class ExtendedFileSectionComponent implements OnInit { @Inject(APP_CONFIG) protected appConfig: AppConfig, private paginationService: PaginationService, ) { - this.pageSize = appConfig.item.bitstream.pageSize; this.bitstreamsRD$ = from([]); } diff --git a/src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts b/src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts index b630f97b5a1..0b335118b9d 100644 --- a/src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts +++ b/src/app/item-page/simple/item-types/dataset/dataset.component.spec.ts @@ -60,10 +60,11 @@ import { ThemedThumbnailComponent } from '../../../../thumbnail/themed-thumbnail import { CollectionsComponent } from '../../../field-components/collections/collections.component'; import { ThemedMediaViewerComponent } from '../../../media-viewer/themed-media-viewer.component'; import { MiradorViewerComponent } from '../../../mirador-viewer/mirador-viewer.component'; -import { ThemedFileSectionComponent } from '../../field-components/file-section/themed-file-section.component'; +import { ExtendedFileSectionComponent } from '../../field-components/extended-file-section/extended-file-section.component'; import { ItemPageAbstractFieldComponent } from '../../field-components/specific-field/abstract/item-page-abstract-field.component'; import { ItemPageDateFieldComponent } from '../../field-components/specific-field/date/item-page-date-field.component'; import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; +import { GeospatialItemPageFieldComponent } from '../../field-components/specific-field/geospatial/geospatial-item-page-field.component'; import { ThemedItemPageTitleFieldComponent } from '../../field-components/specific-field/title/themed-item-page-field.component'; import { ItemPageUriFieldComponent } from '../../field-components/specific-field/uri/item-page-uri-field.component'; import { ThemedMetadataRepresentationListComponent } from '../../metadata-representation-list/themed-metadata-representation-list.component'; @@ -136,8 +137,7 @@ describe('DatasetComponent', () => { }).overrideComponent(DatasetComponent, { add: { changeDetection: ChangeDetectionStrategy.Default }, remove: { - imports: [ThemedResultsBackButtonComponent, MiradorViewerComponent, ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, MetadataFieldWrapperComponent, ThemedThumbnailComponent, ThemedMediaViewerComponent, ThemedFileSectionComponent, ItemPageDateFieldComponent, ThemedMetadataRepresentationListComponent, GenericItemPageFieldComponent, RelatedItemsComponent, ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, CollectionsComponent, - ], + imports: [ThemedResultsBackButtonComponent, MiradorViewerComponent, ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, MetadataFieldWrapperComponent, ThemedThumbnailComponent, ThemedMediaViewerComponent, ExtendedFileSectionComponent, ItemPageDateFieldComponent, ThemedMetadataRepresentationListComponent, GenericItemPageFieldComponent, RelatedItemsComponent, ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, CollectionsComponent, GeospatialItemPageFieldComponent], }, }); })); From 053d1d44b6767bbd83df3a7595488c8d66854ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Fri, 20 Feb 2026 13:24:31 +0100 Subject: [PATCH 06/11] Set correct col-size for type col header. --- .../extended-file-section/extended-file-section.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html index 6b432a90f92..9f35d4886ce 100644 --- a/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html +++ b/src/app/item-page/simple/field-components/extended-file-section/extended-file-section.component.html @@ -8,7 +8,7 @@

-
+

From 3980950b1985728fb7a9f7068dff3ca51fca2939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Fri, 20 Feb 2026 14:56:32 +0100 Subject: [PATCH 07/11] Added missing i18n labels. --- src/assets/i18n/en.json5 | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 7f270aa688d..f05cefbc113 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -7374,5 +7374,29 @@ "dataset.page.titleprefix": "Dataset", - "dataset.listelement.badge": "Dataset" + "dataset.listelement.badge": "Dataset", + + "dataset.page.options": "Options", + + "dataset.page.edit": "Edit this Dataset", + + "relationships.Dataset.isAuthorOfDataset.Person": "Authors (Persons)", + + "relationships.Dataset.isProjectOfDataset.Project": "Research Projects", + + "relationships.Dataset.isAuthorOfDataset.OrgUnit": "Organizational Units", + + "relationships.Dataset.isOrgUnitOfDataset.OrgUnit": "Authors (Organizational Units)", + + "relationships.Dataset.isPublicationOfDataset.Publication": "Publications", + + "relationships.Publication.isDatasetOfPublication.Dataset": "Datasets", + + "relationships.Person.isDatasetOfAuthor.Dataset": "Datasets", + + "relationships.Project.isDatasetOfProject.Dataset": "Datasets", + + "relationships.OrgUnit.isDatasetOfAuthor.Dataset": "Authored Datasets", + + "relationships.OrgUnit.isDatasetOfOrgUnit.Dataset": "Organisation Datasets", } From 2be22016ec63aa66b94ca46e69fd51d035f15cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Fri, 20 Feb 2026 18:17:12 +0100 Subject: [PATCH 08/11] Applied eslint suggestions. --- src/app/shared/listable.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/listable.module.ts b/src/app/shared/listable.module.ts index 4376842fab5..f98996006db 100644 --- a/src/app/shared/listable.module.ts +++ b/src/app/shared/listable.module.ts @@ -68,6 +68,7 @@ import { ItemPageDateFieldComponent } from '../item-page/simple/field-components import { GenericItemPageFieldComponent } from '../item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; import { ThemedItemPageTitleFieldComponent } from '../item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; import { ItemPageUriFieldComponent } from '../item-page/simple/field-components/specific-field/uri/item-page-uri-field.component'; +import { DatasetComponent } from '../item-page/simple/item-types/dataset/dataset.component'; import { PublicationComponent } from '../item-page/simple/item-types/publication/publication.component'; import { UntypedItemComponent } from '../item-page/simple/item-types/untyped-item/untyped-item.component'; import { ThemedMetadataRepresentationListComponent } from '../item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; @@ -123,7 +124,6 @@ import { PublicationSidebarSearchListElementComponent } from './object-list/side import { ThemedResultsBackButtonComponent } from './results-back-button/themed-results-back-button.component'; import { TruncatableComponent } from './truncatable/truncatable.component'; import { TruncatablePartComponent } from './truncatable/truncatable-part/truncatable-part.component'; -import {DatasetComponent} from "../item-page/simple/item-types/dataset/dataset.component"; const ENTRY_COMPONENTS = [ ...THEME_LISTABLE_COMPONENTS, From f570021c7f13af9caa6b990bcf34dfedffac983d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Wed, 11 Mar 2026 12:28:34 +0100 Subject: [PATCH 09/11] Added missing i18n tags. --- src/assets/i18n/en.json5 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f05cefbc113..775b0d87be7 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -7399,4 +7399,10 @@ "relationships.OrgUnit.isDatasetOfAuthor.Dataset": "Authored Datasets", "relationships.OrgUnit.isDatasetOfOrgUnit.Dataset": "Organisation Datasets", + + "submission.sections.describe.relationship-lookup.title.Dataset": "Datasets", + + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Dataset": "Local Datasets", + + "dataset.search.results.head": "Dataset Search Results" } From 38250d8ef531831391f8a9bb96c7e3404472eef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Wed, 11 Mar 2026 15:24:48 +0100 Subject: [PATCH 10/11] Added i18n tags for submission modals and external imports. --- src/assets/i18n/en.json5 | 52 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 775b0d87be7..f079a6fbfba 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -7404,5 +7404,55 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.Dataset": "Local Datasets", - "dataset.search.results.head": "Dataset Search Results" + "dataset.search.results.head": "Dataset Search Results", + + "submission.sections.describe.relationship-lookup.title.isAuthorOfDataset": "Authors", + + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfDataset": "Local Authors ({{ count }})", + + "submission.sections.describe.relationship-lookup.title.isPublicationOfDataset": "Publications", + + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isPublicationOfDataset": "Local Publications ({{ count }})", + + "submission.sections.describe.relationship-lookup.search-tab.tab-title.cinii": "CiNii ({{ count }})", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.cinii": "Importing from CiNii", + + "submission.sections.describe.relationship-lookup.selection-tab.title.cinii": "Search Results", + + "submission.sections.describe.relationship-lookup.search-tab.tab-title.datacite": "DataCite ({{ count }})", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.datacite": "Importing from DataCite", + + "submission.sections.describe.relationship-lookup.selection-tab.title.datacite": "Search Results", + + "submission.sections.describe.relationship-lookup.search-tab.tab-title.doi": "DOI ({{ count }})", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.doi": "Importing from DOI", + + "submission.sections.describe.relationship-lookup.selection-tab.title.doi": "Search Results", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isPublicationOfDataset.title": "Import Remote Publication", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isPublicationOfDataset.added.local-entity": "Successfully added local publication to the selection", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isPublicationOfDataset.added.new-entity": "Successfully imported and added external publication to the selection", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfDataset.title": "Import Remote Author", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfDataset.added.local-entity": "Successfully added local author to the selection", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfDataset.added.new-entity": "Successfully imported and added external author to the selection", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfDataset.title": "Import Remote Project", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfDataset.added.local-entity": "Successfully added local project to the selection", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfDataset.added.new-entity": "Successfully imported and added external project to the selection", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isOrgUnitOfDataset.title": "Import Remote Organization", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isOrgUnitOfDataset.added.local-entity": "Successfully added local organization to the selection", + + "submission.sections.describe.relationship-lookup.external-source.import-modal.isOrgUnitOfDataset.added.new-entity": "Successfully imported and added external organization to the selection", } From cc4bf7505a36290265c4435ce0c91b57d59a4a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eike=20Martin=20L=C3=B6hden?= Date: Wed, 11 Mar 2026 15:27:11 +0100 Subject: [PATCH 11/11] Corrected wrong related-publications field label. --- .../item-page/simple/item-types/dataset/dataset.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/simple/item-types/dataset/dataset.component.html b/src/app/item-page/simple/item-types/dataset/dataset.component.html index 756420f7f89..a02b74d209d 100644 --- a/src/app/item-page/simple/item-types/dataset/dataset.component.html +++ b/src/app/item-page/simple/item-types/dataset/dataset.component.html @@ -51,7 +51,7 @@ + [label]="'item.page.publications' | translate">