From 0a319b2231600568ed542023ccb3021e2aeff21f Mon Sep 17 00:00:00 2001 From: msutya Date: Wed, 22 Jan 2025 17:53:39 +0100 Subject: [PATCH 1/8] QREPO-235 create item-page-doi components, add untyped-item components to szerep theme --- .../metadata-doi-values.component.html | 8 + .../metadata-doi-values.component.ts | 53 ++++ .../doi/item-page-doi-field.component.html | 7 + .../doi/item-page-doi-field.component.ts | 46 +++ src/assets/i18n/en.json5 | 2 + src/assets/i18n/hu.json5 | 3 + .../untyped-item/untyped-item.component.html | 99 ++++++ .../untyped-item/untyped-item.component.scss | 1 + .../untyped-item.component.spec.ts | 296 ++++++++++++++++++ .../untyped-item/untyped-item.component.ts | 67 ++++ src/themes/szerep/eager-theme.module.ts | 4 +- 11 files changed, 585 insertions(+), 1 deletion(-) create mode 100644 src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html create mode 100644 src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts create mode 100644 src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html create mode 100644 src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts create mode 100644 src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.html create mode 100644 src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss create mode 100644 src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts create mode 100644 src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts diff --git a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html new file mode 100644 index 00000000000..e9b9bf90cdc --- /dev/null +++ b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html @@ -0,0 +1,8 @@ + + + + {{ linkText || mdValue.value }} + + + + \ No newline at end of file diff --git a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts new file mode 100644 index 00000000000..8a118e36a3c --- /dev/null +++ b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts @@ -0,0 +1,53 @@ +import { Component, Input } from '@angular/core'; +import { NgForOf, NgIf } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; +import { MetadataValue } from '../../../core/shared/metadata.models'; +import { MetadataFieldWrapperComponent } from '../../../shared/metadata-field-wrapper/metadata-field-wrapper.component'; +import { MetadataValuesComponent } from '../metadata-values/metadata-values.component'; + +/** + * This component renders DOIs into the `ds-metadata-field-wrapper` component as clickable links. + * Each DOI is transformed into a valid URL (e.g., `https://doi.org/...`) and displayed with custom text if provided. + */ +@Component({ + selector: 'ds-metadata-doi-values', + templateUrl: './metadata-doi-values.component.html', + imports: [ + MetadataFieldWrapperComponent, + TranslateModule, + NgForOf, + NgIf, + ], + standalone: true, +}) +export class MetadataDoiValuesComponent extends MetadataValuesComponent { + /** + * The metadata values (DOIs) to display + */ + @Input() mdValues: MetadataValue[]; + + /** + * The separator used between multiple DOIs + */ + @Input() separator: string; + + /** + * The label for this field + */ + @Input() label: string; + + /** + * Optional custom text for the DOI links + * If undefined, the raw DOI value is displayed + */ + @Input() linkText: string; + + /** + * Converts a raw DOI value into a full URL + * @param doi Raw DOI string (e.g., `10.1234/example.doi`) + * @returns Full URL for the DOI (e.g., `https://doi.org/10.1234/example.doi`) + */ + formatDoiUrl(doi: string): string { + return `https://doi.org/${doi}`; + } +} diff --git a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html new file mode 100644 index 00000000000..e9c1339e574 --- /dev/null +++ b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html @@ -0,0 +1,7 @@ +
+ + +
\ No newline at end of file diff --git a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts new file mode 100644 index 00000000000..2b176e9a69c --- /dev/null +++ b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts @@ -0,0 +1,46 @@ +import { Component, Input } from '@angular/core'; +import { Item } from '../../../../../core/shared/item.model'; +import { ItemPageFieldComponent } from '../item-page-field.component'; +import { MetadataDoiValuesComponent } from 'src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component'; + +/** + * This component displays DOIs on a simple item page using the MetadataDoiValuesComponent. + * It converts DOIs into clickable links, separators, and labels. + */ +@Component({ + selector: 'ds-item-page-doi-field', + templateUrl: './item-page-doi-field.component.html', + standalone: true, + imports: [ + MetadataDoiValuesComponent, + ], +}) +export class ItemPageDoiFieldComponent extends ItemPageFieldComponent { + /** + * The item to display metadata for + */ + @Input() item: Item; + + /** + * Separator string between multiple DOIs + * @type {string} + */ + @Input() separator: string = ', '; + + /** + * Metadata fields containing DOIs + */ + @Input() fields: string[] = ['dc.identifier.doi']; + + /** + * Label for the DOI field + */ + @Input() label: string = 'item.page.doi'; + + /** + * Get metadata values for the provided fields + */ + get doiValues() { + return this.item?.allMetadata(this.fields) || []; + } +} diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index a82ba9a4716..fb80400e96e 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2762,6 +2762,8 @@ "item.page.uri": "URI", + "item.page.doi": "DOI", + "item.page.bitstreams.view-more": "Show more", "item.page.bitstreams.collapse": "Collapse", diff --git a/src/assets/i18n/hu.json5 b/src/assets/i18n/hu.json5 index ff79f985d0e..3316678d25e 100644 --- a/src/assets/i18n/hu.json5 +++ b/src/assets/i18n/hu.json5 @@ -4193,6 +4193,9 @@ // "item.page.uri": "URI", "item.page.uri": "URI", + //"item.page.doi": "DOI", + "item.page.doi": "DOI", + // "item.page.bitstreams.view-more": "Show more", "item.page.bitstreams.view-more": "Tovább", diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.html b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.html new file mode 100644 index 00000000000..c22b7e6a1e2 --- /dev/null +++ b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.html @@ -0,0 +1,99 @@ + +
+
+ + +
+
+ +
+ + + +
+
+
+ + + + + +
+ +
+ + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + {{"item.page.link.full" | translate}} + +
+
+
diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss new file mode 100644 index 00000000000..0f55f4a9aee --- /dev/null +++ b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss @@ -0,0 +1 @@ +@import '../../../../../../../../src/styles/_variables.scss'; \ No newline at end of file diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts new file mode 100644 index 00000000000..1c9842d94f4 --- /dev/null +++ b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts @@ -0,0 +1,296 @@ +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 { Store } from '@ngrx/store'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; +import { + Observable, + of, +} from 'rxjs'; + +import { APP_CONFIG } from '../../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../../environments/environment.test'; +import { BrowseDefinitionDataService } from '../../../../../../../app/core/browse/browse-definition-data.service'; +import { RemoteDataBuildService } from '../../../../../../../app/core/cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../../../../../app/core/cache/object-cache.service'; +import { BitstreamDataService } from '../../../../../../../app/core/data/bitstream-data.service'; +import { CommunityDataService } from '../../../../../../../app/core/data/community-data.service'; +import { DefaultChangeAnalyzer } from '../../../../../../../app/core/data/default-change-analyzer.service'; +import { DSOChangeAnalyzer } from '../../../../../../../app/core/data/dso-change-analyzer.service'; +import { ItemDataService } from '../../../../../../../app/core/data/item-data.service'; +import { RelationshipDataService } from '../../../../../../../app/core/data/relationship-data.service'; +import { RemoteData } from '../../../../../../../app/core/data/remote-data'; +import { VersionDataService } from '../../../../../../../app/core/data/version-data.service'; +import { VersionHistoryDataService } from '../../../../../../../app/core/data/version-history-data.service'; +import { RouteService } from '../../../../../../../app/core/services/route.service'; +import { Bitstream } from '../../../../../../../app/core/shared/bitstream.model'; +import { HALEndpointService } from '../../../../../../../app/core/shared/hal-endpoint.service'; +import { Item } from '../../../../../../../app/core/shared/item.model'; +import { MetadataMap } from '../../../../../../../app/core/shared/metadata.models'; +import { SearchService } from '../../../../../../../app/core/shared/search/search.service'; +import { UUIDService } from '../../../../../../../app/core/shared/uuid.service'; +import { WorkspaceitemDataService } from '../../../../../../../app/core/submission/workspaceitem-data.service'; +import { DsoEditMenuComponent } from '../../../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { MetadataFieldWrapperComponent } from '../../../../../../../app/shared/metadata-field-wrapper/metadata-field-wrapper.component'; +import { mockTruncatableService } from '../../../../../../../app/shared/mocks/mock-trucatable.service'; +import { TranslateLoaderMock } from '../../../../../../../app/shared/mocks/translate-loader.mock'; +import { NotificationsService } from '../../../../../../../app/shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject$ } from '../../../../../../../app/shared/remote-data.utils'; +import { ThemedResultsBackButtonComponent } from '../../../../../../../app/shared/results-back-button/themed-results-back-button.component'; +import { BrowseDefinitionDataServiceStub } from '../../../../../../../app/shared/testing/browse-definition-data-service.stub'; +import { createPaginatedList } from '../../../../../../../app/shared/testing/utils.test'; +import { TruncatableService } from '../../../../../../../app/shared/truncatable/truncatable.service'; +import { TruncatePipe } from '../../../../../../../app/shared/utils/truncate.pipe'; +import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/themed-thumbnail.component'; +import { CollectionsComponent } from '../../../../../../../app/item-page/field-components/collections/collections.component'; +import { ThemedMediaViewerComponent } from '../../../../../../../app/item-page/media-viewer/themed-media-viewer.component'; +import { MiradorViewerComponent } from '../../../../../../../app/item-page/mirador-viewer/mirador-viewer.component'; +import { ItemVersionsSharedService } from '../../../../../../../app/item-page/versions/item-versions-shared.service'; +import { ThemedFileSectionComponent } from '../../../../../../../app/item-page/simple/field-components/file-section/themed-file-section.component'; +import { ItemPageAbstractFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component'; +import { ItemPageDateFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/date/item-page-date-field.component'; +import { GenericItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; +import { ThemedItemPageTitleFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; +import { ItemPageUriFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component'; +import { ThemedMetadataRepresentationListComponent } from '../../../../../../../app/item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; +import { + createRelationshipsObservable, + getIIIFEnabled, + getIIIFSearchEnabled, + mockRouteService, +} from '../../../../../../../app/item-page/simple/item-types/shared/item.component.spec'; +import { UntypedItemComponent } from '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component'; +import { ItemPageDoiFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component'; + +const noMetadata = new MetadataMap(); + +function getItem(metadata: MetadataMap) { + return Object.assign(new Item(), { + bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), + metadata: metadata, + relationships: createRelationshipsObservable(), + }); +} + +describe('UntypedItemComponent', () => { + let comp: UntypedItemComponent; + 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, + UntypedItemComponent, + ], + 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: ItemDataService, useValue: {} }, + { provide: ItemVersionsSharedService, useValue: {} }, + { provide: RouteService, useValue: mockRouteService }, + { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }, + { provide: APP_CONFIG, useValue: environment }, + ], + schemas: [NO_ERRORS_SCHEMA], + }).overrideComponent(UntypedItemComponent, { + add: { changeDetection: ChangeDetectionStrategy.Default }, + remove: { + imports: [ + ThemedResultsBackButtonComponent, + MiradorViewerComponent, + ThemedItemPageTitleFieldComponent, + DsoEditMenuComponent, + MetadataFieldWrapperComponent, + ThemedThumbnailComponent, + ThemedMediaViewerComponent, + ThemedFileSectionComponent, + ItemPageDateFieldComponent, + ThemedMetadataRepresentationListComponent, + GenericItemPageFieldComponent, + ItemPageAbstractFieldComponent, + ItemPageUriFieldComponent, + CollectionsComponent, + ItemPageDoiFieldComponent + ], + }, + }); + })); + + describe('default view', () => { + beforeEach(waitForAsync(() => { + TestBed.compileComponents(); + fixture = TestBed.createComponent(UntypedItemComponent); + 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); + }); + + it('should not contain an iiif viewer component', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-mirador-viewer')); + expect(fields.length).toBe(0); + }); + }); + + + describe('with IIIF viewer', () => { + + beforeEach(waitForAsync(() => { + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(false)], + }; + TestBed.compileComponents(); + fixture = TestBed.createComponent(UntypedItemComponent); + 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', (): void => { + 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(UntypedItemComponent); + spyOn(localMockRouteService, 'getPreviousUrl').and.callThrough(); + 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', (): 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(UntypedItemComponent); + + 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(); + })); + + }); + +}); diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts new file mode 100644 index 00000000000..47b2d3f5692 --- /dev/null +++ b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts @@ -0,0 +1,67 @@ +import { + AsyncPipe, + NgIf, +} from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, +} from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { Item } from '../../../../../../../app/core/shared/item.model'; +import { ViewMode } from '../../../../../../../app/core/shared/view-mode.model'; +import { DsoEditMenuComponent } from '../../../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { MetadataFieldWrapperComponent } from '../../../../../../../app/shared/metadata-field-wrapper/metadata-field-wrapper.component'; +import { listableObjectComponent } from '../../../../../../../app/shared/object-collection/shared/listable-object/listable-object.decorator'; +import { ThemedResultsBackButtonComponent } from '../../../../../../../app/shared/results-back-button/themed-results-back-button.component'; +import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/themed-thumbnail.component'; +import { CollectionsComponent } from '../../../../../../../app/item-page/field-components/collections/collections.component'; +import { ThemedMediaViewerComponent } from '../../../../../../../app/item-page/media-viewer/themed-media-viewer.component'; +import { MiradorViewerComponent } from '../../../../../../../app/item-page/mirador-viewer/mirador-viewer.component'; +import { ThemedFileSectionComponent } from '../../../../../../../app/item-page/simple/field-components/file-section/themed-file-section.component'; +import { ItemPageAbstractFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component'; +import { ItemPageCcLicenseFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/cc-license/item-page-cc-license-field.component'; +import { ItemPageDateFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/date/item-page-date-field.component'; +import { GenericItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; +import { ThemedItemPageTitleFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; +import { ItemPageUriFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component'; +import { ThemedMetadataRepresentationListComponent } from '../../../../../../../app/item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; +import { ItemComponent } from '../../../../../../../app/item-page/simple/item-types/shared/item.component'; +import { ItemPageDoiFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component'; + +/** + * Component that represents a publication Item page + */ + +@listableObjectComponent(Item, ViewMode.StandalonePage) +@Component({ + selector: 'ds-untyped-item', + styleUrls: ['./untyped-item.component.scss'], + templateUrl: './untyped-item.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + NgIf, + ThemedResultsBackButtonComponent, + MiradorViewerComponent, + ThemedItemPageTitleFieldComponent, + DsoEditMenuComponent, + MetadataFieldWrapperComponent, + ThemedThumbnailComponent, + ThemedMediaViewerComponent, + ThemedFileSectionComponent, + ItemPageDateFieldComponent, + ThemedMetadataRepresentationListComponent, + GenericItemPageFieldComponent, + ItemPageAbstractFieldComponent, + ItemPageUriFieldComponent, + CollectionsComponent, + RouterLink, + AsyncPipe, + TranslateModule, + ItemPageCcLicenseFieldComponent, + ItemPageDoiFieldComponent + ], +}) +export class UntypedItemComponent extends ItemComponent {} diff --git a/src/themes/szerep/eager-theme.module.ts b/src/themes/szerep/eager-theme.module.ts index 8bbb469ad2e..1bfdc42d52b 100644 --- a/src/themes/szerep/eager-theme.module.ts +++ b/src/themes/szerep/eager-theme.module.ts @@ -10,6 +10,7 @@ import { NavbarComponent } from './app/navbar/navbar.component'; import { CommunityListElementComponent } from './app/shared/object-list/community-list-element/community-list-element.component'; import { LangSwitchComponent } from './app/shared/lang-switch/lang-switch.component'; import { ItemSearchResultListElementComponent } from './app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; +import { UntypedItemComponent } from './app/item-page/simple/item-types/untyped-item/untyped-item.component'; /** * Add components that use a custom decorator to ENTRY_COMPONENTS as well as DECLARATIONS. @@ -27,7 +28,8 @@ const DECLARATIONS = [ HeaderNavbarWrapperComponent, NavbarComponent, FooterComponent, - LangSwitchComponent + LangSwitchComponent, + UntypedItemComponent ]; @NgModule({ From 52f584ad297f7b492f44a942d3ef88c410f1c716 Mon Sep 17 00:00:00 2001 From: msutya Date: Thu, 23 Jan 2025 10:56:48 +0100 Subject: [PATCH 2/8] QREPO-235 delete unnecessary spec.ts, add Context to untyped-item component --- .../untyped-item.component.spec.ts | 296 ------------------ .../untyped-item/untyped-item.component.ts | 7 +- 2 files changed, 4 insertions(+), 299 deletions(-) delete mode 100644 src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts deleted file mode 100644 index 1c9842d94f4..00000000000 --- a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts +++ /dev/null @@ -1,296 +0,0 @@ -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 { Store } from '@ngrx/store'; -import { - TranslateLoader, - TranslateModule, -} from '@ngx-translate/core'; -import { - Observable, - of, -} from 'rxjs'; - -import { APP_CONFIG } from '../../../../../../../config/app-config.interface'; -import { environment } from '../../../../../../../environments/environment.test'; -import { BrowseDefinitionDataService } from '../../../../../../../app/core/browse/browse-definition-data.service'; -import { RemoteDataBuildService } from '../../../../../../../app/core/cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../../../../../../../app/core/cache/object-cache.service'; -import { BitstreamDataService } from '../../../../../../../app/core/data/bitstream-data.service'; -import { CommunityDataService } from '../../../../../../../app/core/data/community-data.service'; -import { DefaultChangeAnalyzer } from '../../../../../../../app/core/data/default-change-analyzer.service'; -import { DSOChangeAnalyzer } from '../../../../../../../app/core/data/dso-change-analyzer.service'; -import { ItemDataService } from '../../../../../../../app/core/data/item-data.service'; -import { RelationshipDataService } from '../../../../../../../app/core/data/relationship-data.service'; -import { RemoteData } from '../../../../../../../app/core/data/remote-data'; -import { VersionDataService } from '../../../../../../../app/core/data/version-data.service'; -import { VersionHistoryDataService } from '../../../../../../../app/core/data/version-history-data.service'; -import { RouteService } from '../../../../../../../app/core/services/route.service'; -import { Bitstream } from '../../../../../../../app/core/shared/bitstream.model'; -import { HALEndpointService } from '../../../../../../../app/core/shared/hal-endpoint.service'; -import { Item } from '../../../../../../../app/core/shared/item.model'; -import { MetadataMap } from '../../../../../../../app/core/shared/metadata.models'; -import { SearchService } from '../../../../../../../app/core/shared/search/search.service'; -import { UUIDService } from '../../../../../../../app/core/shared/uuid.service'; -import { WorkspaceitemDataService } from '../../../../../../../app/core/submission/workspaceitem-data.service'; -import { DsoEditMenuComponent } from '../../../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; -import { MetadataFieldWrapperComponent } from '../../../../../../../app/shared/metadata-field-wrapper/metadata-field-wrapper.component'; -import { mockTruncatableService } from '../../../../../../../app/shared/mocks/mock-trucatable.service'; -import { TranslateLoaderMock } from '../../../../../../../app/shared/mocks/translate-loader.mock'; -import { NotificationsService } from '../../../../../../../app/shared/notifications/notifications.service'; -import { createSuccessfulRemoteDataObject$ } from '../../../../../../../app/shared/remote-data.utils'; -import { ThemedResultsBackButtonComponent } from '../../../../../../../app/shared/results-back-button/themed-results-back-button.component'; -import { BrowseDefinitionDataServiceStub } from '../../../../../../../app/shared/testing/browse-definition-data-service.stub'; -import { createPaginatedList } from '../../../../../../../app/shared/testing/utils.test'; -import { TruncatableService } from '../../../../../../../app/shared/truncatable/truncatable.service'; -import { TruncatePipe } from '../../../../../../../app/shared/utils/truncate.pipe'; -import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/themed-thumbnail.component'; -import { CollectionsComponent } from '../../../../../../../app/item-page/field-components/collections/collections.component'; -import { ThemedMediaViewerComponent } from '../../../../../../../app/item-page/media-viewer/themed-media-viewer.component'; -import { MiradorViewerComponent } from '../../../../../../../app/item-page/mirador-viewer/mirador-viewer.component'; -import { ItemVersionsSharedService } from '../../../../../../../app/item-page/versions/item-versions-shared.service'; -import { ThemedFileSectionComponent } from '../../../../../../../app/item-page/simple/field-components/file-section/themed-file-section.component'; -import { ItemPageAbstractFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component'; -import { ItemPageDateFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/date/item-page-date-field.component'; -import { GenericItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; -import { ThemedItemPageTitleFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; -import { ItemPageUriFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component'; -import { ThemedMetadataRepresentationListComponent } from '../../../../../../../app/item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; -import { - createRelationshipsObservable, - getIIIFEnabled, - getIIIFSearchEnabled, - mockRouteService, -} from '../../../../../../../app/item-page/simple/item-types/shared/item.component.spec'; -import { UntypedItemComponent } from '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component'; -import { ItemPageDoiFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component'; - -const noMetadata = new MetadataMap(); - -function getItem(metadata: MetadataMap) { - return Object.assign(new Item(), { - bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), - metadata: metadata, - relationships: createRelationshipsObservable(), - }); -} - -describe('UntypedItemComponent', () => { - let comp: UntypedItemComponent; - 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, - UntypedItemComponent, - ], - 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: ItemDataService, useValue: {} }, - { provide: ItemVersionsSharedService, useValue: {} }, - { provide: RouteService, useValue: mockRouteService }, - { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }, - { provide: APP_CONFIG, useValue: environment }, - ], - schemas: [NO_ERRORS_SCHEMA], - }).overrideComponent(UntypedItemComponent, { - add: { changeDetection: ChangeDetectionStrategy.Default }, - remove: { - imports: [ - ThemedResultsBackButtonComponent, - MiradorViewerComponent, - ThemedItemPageTitleFieldComponent, - DsoEditMenuComponent, - MetadataFieldWrapperComponent, - ThemedThumbnailComponent, - ThemedMediaViewerComponent, - ThemedFileSectionComponent, - ItemPageDateFieldComponent, - ThemedMetadataRepresentationListComponent, - GenericItemPageFieldComponent, - ItemPageAbstractFieldComponent, - ItemPageUriFieldComponent, - CollectionsComponent, - ItemPageDoiFieldComponent - ], - }, - }); - })); - - describe('default view', () => { - beforeEach(waitForAsync(() => { - TestBed.compileComponents(); - fixture = TestBed.createComponent(UntypedItemComponent); - 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); - }); - - it('should not contain an iiif viewer component', () => { - const fields = fixture.debugElement.queryAll(By.css('ds-mirador-viewer')); - expect(fields.length).toBe(0); - }); - }); - - - describe('with IIIF viewer', () => { - - beforeEach(waitForAsync(() => { - const iiifEnabledMap: MetadataMap = { - 'dspace.iiif.enabled': [getIIIFEnabled(true)], - 'iiif.search.enabled': [getIIIFSearchEnabled(false)], - }; - TestBed.compileComponents(); - fixture = TestBed.createComponent(UntypedItemComponent); - 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', (): void => { - 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(UntypedItemComponent); - spyOn(localMockRouteService, 'getPreviousUrl').and.callThrough(); - 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', (): 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(UntypedItemComponent); - - 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(); - })); - - }); - -}); diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts index 47b2d3f5692..db9909aa276 100644 --- a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts +++ b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts @@ -27,14 +27,15 @@ import { GenericItemPageFieldComponent } from '../../../../../../../app/item-pag import { ThemedItemPageTitleFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; import { ItemPageUriFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component'; import { ThemedMetadataRepresentationListComponent } from '../../../../../../../app/item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; -import { ItemComponent } from '../../../../../../../app/item-page/simple/item-types/shared/item.component'; import { ItemPageDoiFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component'; +import { UntypedItemComponent as BaseComponent } from 'src/app/item-page/simple/item-types/untyped-item/untyped-item.component'; +import { Context } from 'src/app/core/shared/context.model'; /** * Component that represents a publication Item page */ -@listableObjectComponent(Item, ViewMode.StandalonePage) +@listableObjectComponent(Item, ViewMode.StandalonePage, Context.Any, 'szerep') @Component({ selector: 'ds-untyped-item', styleUrls: ['./untyped-item.component.scss'], @@ -64,4 +65,4 @@ import { ItemPageDoiFieldComponent } from '../../../../../../../app/item-page/si ItemPageDoiFieldComponent ], }) -export class UntypedItemComponent extends ItemComponent {} +export class UntypedItemComponent extends BaseComponent {} From aab9ff350d558090e95c234695eb9ebf0c6be5e1 Mon Sep 17 00:00:00 2001 From: msutya Date: Thu, 23 Jan 2025 11:10:54 +0100 Subject: [PATCH 3/8] QREPO-235 refactor imports --- .../metadata-doi-values/metadata-doi-values.component.ts | 5 ++++- .../specific-field/doi/item-page-doi-field.component.ts | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts index 8a118e36a3c..5475f869df7 100644 --- a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts +++ b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts @@ -1,5 +1,8 @@ import { Component, Input } from '@angular/core'; -import { NgForOf, NgIf } from '@angular/common'; +import { + NgForOf, + NgIf +} from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { MetadataValue } from '../../../core/shared/metadata.models'; import { MetadataFieldWrapperComponent } from '../../../shared/metadata-field-wrapper/metadata-field-wrapper.component'; diff --git a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts index 2b176e9a69c..96616a2e291 100644 --- a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts @@ -1,4 +1,7 @@ -import { Component, Input } from '@angular/core'; +import { + Component, + Input +} from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; import { ItemPageFieldComponent } from '../item-page-field.component'; import { MetadataDoiValuesComponent } from 'src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component'; From c299e7243ca580a843fd3f10b66f3cdbdd1dec54 Mon Sep 17 00:00:00 2001 From: msutya Date: Thu, 23 Jan 2025 11:20:43 +0100 Subject: [PATCH 4/8] QREPO-235 refactor imports --- .../metadata-doi-values.component.ts | 11 +++++++---- .../doi/item-page-doi-field.component.ts | 6 +++--- .../untyped-item/untyped-item.component.scss | 1 - 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts index 5475f869df7..78a0e7cfbe7 100644 --- a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts +++ b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts @@ -1,7 +1,10 @@ -import { Component, Input } from '@angular/core'; -import { - NgForOf, - NgIf +import { + Component, + Input +} from '@angular/core'; +import { + NgForOf, + NgIf } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { MetadataValue } from '../../../core/shared/metadata.models'; diff --git a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts index 96616a2e291..8bf876e5930 100644 --- a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts @@ -1,6 +1,6 @@ -import { - Component, - Input +import { + Component, + Input } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; import { ItemPageFieldComponent } from '../item-page-field.component'; diff --git a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss index b810d2ddd4f..3575cae797d 100644 --- a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss +++ b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss @@ -1,2 +1 @@ @import '../../../../../styles/variables.scss'; - From 71b0c9de10c4bc855e72b380dff0b5f3176bc5c7 Mon Sep 17 00:00:00 2001 From: msutya Date: Thu, 23 Jan 2025 11:59:29 +0100 Subject: [PATCH 5/8] QREPO-235 add trailing commas, remove unnecessary string type annotations --- .../metadata-doi-values/metadata-doi-values.component.ts | 4 ++-- .../specific-field/doi/item-page-doi-field.component.ts | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts index 78a0e7cfbe7..f3af4c2e4b5 100644 --- a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts +++ b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts @@ -1,10 +1,10 @@ import { Component, - Input + Input, } from '@angular/core'; import { NgForOf, - NgIf + NgIf, } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { MetadataValue } from '../../../core/shared/metadata.models'; diff --git a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts index 8bf876e5930..e0a8fc1e961 100644 --- a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts @@ -1,6 +1,6 @@ import { Component, - Input + Input, } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; import { ItemPageFieldComponent } from '../item-page-field.component'; @@ -26,9 +26,8 @@ export class ItemPageDoiFieldComponent extends ItemPageFieldComponent { /** * Separator string between multiple DOIs - * @type {string} */ - @Input() separator: string = ', '; + @Input() separator = ', '; /** * Metadata fields containing DOIs @@ -38,7 +37,7 @@ export class ItemPageDoiFieldComponent extends ItemPageFieldComponent { /** * Label for the DOI field */ - @Input() label: string = 'item.page.doi'; + @Input() label = 'item.page.doi'; /** * Get metadata values for the provided fields From 18e908227b8a931685825ac71674aff487718ba7 Mon Sep 17 00:00:00 2001 From: msutya Date: Thu, 23 Jan 2025 12:06:51 +0100 Subject: [PATCH 6/8] QREPO-235 add trailing commas, remove unnecessary string type annotations --- .../metadata-doi-values/metadata-doi-values.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html index e9b9bf90cdc..bdef2c58c3a 100644 --- a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html +++ b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.html @@ -5,4 +5,4 @@ - \ No newline at end of file + From abffd658366cd9feec89539130afc9dbca2d4652 Mon Sep 17 00:00:00 2001 From: msutya Date: Thu, 23 Jan 2025 12:10:26 +0100 Subject: [PATCH 7/8] QREPO-235 add empty lines at the end on item-page-doi-field.component.html and untyped-item.component.scss --- .../specific-field/doi/item-page-doi-field.component.html | 2 +- .../simple/item-types/untyped-item/untyped-item.component.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html index e9c1339e574..2de3ac9a9b6 100644 --- a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html +++ b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.html @@ -4,4 +4,4 @@ [separator]="separator" [label]="label"> - \ No newline at end of file + diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss index 0f55f4a9aee..902a64c4345 100644 --- a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss +++ b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss @@ -1 +1 @@ -@import '../../../../../../../../src/styles/_variables.scss'; \ No newline at end of file +@import '../../../../../../../../src/styles/_variables.scss'; From 1e6205010784e18c24652346812d35df45fb17df Mon Sep 17 00:00:00 2001 From: msutya Date: Thu, 23 Jan 2025 13:20:30 +0100 Subject: [PATCH 8/8] QREPO-235 run autofix --- .../metadata-doi-values.component.ts | 9 +++++---- .../doi/item-page-doi-field.component.ts | 3 ++- src/assets/i18n/en.json5 | 2 +- .../untyped-item/untyped-item.component.ts | 18 +++++++++--------- src/themes/szerep/assets/i18n/en.json5 | 2 +- src/themes/szerep/assets/i18n/hu.json5 | 2 +- src/themes/szerep/eager-theme.module.ts | 8 ++++---- src/themes/szerep/lazy-theme.module.ts | 8 ++++---- 8 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts index f3af4c2e4b5..bb2b001c24e 100644 --- a/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts +++ b/src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component.ts @@ -1,12 +1,13 @@ -import { - Component, - Input, -} from '@angular/core'; import { NgForOf, NgIf, } from '@angular/common'; +import { + Component, + Input, +} from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; + import { MetadataValue } from '../../../core/shared/metadata.models'; import { MetadataFieldWrapperComponent } from '../../../shared/metadata-field-wrapper/metadata-field-wrapper.component'; import { MetadataValuesComponent } from '../metadata-values/metadata-values.component'; diff --git a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts index e0a8fc1e961..e88571ec719 100644 --- a/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component.ts @@ -2,9 +2,10 @@ import { Component, Input, } from '@angular/core'; +import { MetadataDoiValuesComponent } from 'src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component'; + import { Item } from '../../../../../core/shared/item.model'; import { ItemPageFieldComponent } from '../item-page-field.component'; -import { MetadataDoiValuesComponent } from 'src/app/item-page/field-components/metadata-doi-values/metadata-doi-values.component'; /** * This component displays DOIs on a simple item page using the MetadataDoiValuesComponent. diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index fb80400e96e..6a7a13b3e57 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -5586,7 +5586,7 @@ "thumbnail.person.placeholder": "No Profile Picture Available", - title: "DSpace", + "title": "DSpace", "vocabulary-treeview.header": "Hierarchical tree view", diff --git a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts index db9909aa276..8de5d723e35 100644 --- a/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts +++ b/src/themes/szerep/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts @@ -8,14 +8,11 @@ import { } from '@angular/core'; import { RouterLink } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; +import { Context } from 'src/app/core/shared/context.model'; +import { UntypedItemComponent as BaseComponent } from 'src/app/item-page/simple/item-types/untyped-item/untyped-item.component'; import { Item } from '../../../../../../../app/core/shared/item.model'; import { ViewMode } from '../../../../../../../app/core/shared/view-mode.model'; -import { DsoEditMenuComponent } from '../../../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; -import { MetadataFieldWrapperComponent } from '../../../../../../../app/shared/metadata-field-wrapper/metadata-field-wrapper.component'; -import { listableObjectComponent } from '../../../../../../../app/shared/object-collection/shared/listable-object/listable-object.decorator'; -import { ThemedResultsBackButtonComponent } from '../../../../../../../app/shared/results-back-button/themed-results-back-button.component'; -import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/themed-thumbnail.component'; import { CollectionsComponent } from '../../../../../../../app/item-page/field-components/collections/collections.component'; import { ThemedMediaViewerComponent } from '../../../../../../../app/item-page/media-viewer/themed-media-viewer.component'; import { MiradorViewerComponent } from '../../../../../../../app/item-page/mirador-viewer/mirador-viewer.component'; @@ -23,13 +20,16 @@ import { ThemedFileSectionComponent } from '../../../../../../../app/item-page/s import { ItemPageAbstractFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component'; import { ItemPageCcLicenseFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/cc-license/item-page-cc-license-field.component'; import { ItemPageDateFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/date/item-page-date-field.component'; +import { ItemPageDoiFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component'; import { GenericItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; import { ThemedItemPageTitleFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; import { ItemPageUriFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component'; import { ThemedMetadataRepresentationListComponent } from '../../../../../../../app/item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; -import { ItemPageDoiFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/doi/item-page-doi-field.component'; -import { UntypedItemComponent as BaseComponent } from 'src/app/item-page/simple/item-types/untyped-item/untyped-item.component'; -import { Context } from 'src/app/core/shared/context.model'; +import { DsoEditMenuComponent } from '../../../../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { MetadataFieldWrapperComponent } from '../../../../../../../app/shared/metadata-field-wrapper/metadata-field-wrapper.component'; +import { listableObjectComponent } from '../../../../../../../app/shared/object-collection/shared/listable-object/listable-object.decorator'; +import { ThemedResultsBackButtonComponent } from '../../../../../../../app/shared/results-back-button/themed-results-back-button.component'; +import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/themed-thumbnail.component'; /** * Component that represents a publication Item page @@ -62,7 +62,7 @@ import { Context } from 'src/app/core/shared/context.model'; AsyncPipe, TranslateModule, ItemPageCcLicenseFieldComponent, - ItemPageDoiFieldComponent + ItemPageDoiFieldComponent, ], }) export class UntypedItemComponent extends BaseComponent {} diff --git a/src/themes/szerep/assets/i18n/en.json5 b/src/themes/szerep/assets/i18n/en.json5 index 4c8bdefcbdf..331e6a288c6 100644 --- a/src/themes/szerep/assets/i18n/en.json5 +++ b/src/themes/szerep/assets/i18n/en.json5 @@ -5,7 +5,7 @@ "home.top-level-communities.head": "Communities in SZERep", - "browse.search-form.placeholder": "Enter the first few characters", + "browse.search-form.placeholder": "Enter the first few characters", "qulto.home.welcome.title": "Welcome to the SZERep - Széchenyi István University Repository page!", diff --git a/src/themes/szerep/assets/i18n/hu.json5 b/src/themes/szerep/assets/i18n/hu.json5 index 31c501b80a7..d59dc8ddfd9 100644 --- a/src/themes/szerep/assets/i18n/hu.json5 +++ b/src/themes/szerep/assets/i18n/hu.json5 @@ -11,7 +11,7 @@ "item.truncatable-part.show-less": "Kevesebb", - "vocabulary-treeview.load-more": "Továbbiak", + "vocabulary-treeview.load-more": "Továbbiak", "qulto.home.welcome.title": "Köszöntjük a SZERep - Széchenyi István Egyetem Repozitórium oldalán!", diff --git a/src/themes/szerep/eager-theme.module.ts b/src/themes/szerep/eager-theme.module.ts index 1bfdc42d52b..02638b7348b 100644 --- a/src/themes/szerep/eager-theme.module.ts +++ b/src/themes/szerep/eager-theme.module.ts @@ -6,11 +6,11 @@ import { FooterComponent } from './app/footer/footer.component'; import { HeaderComponent } from './app/header/header.component'; import { HeaderNavbarWrapperComponent } from './app/header-nav-wrapper/header-navbar-wrapper.component'; import { HomeNewsComponent } from './app/home-page/home-news/home-news.component'; +import { UntypedItemComponent } from './app/item-page/simple/item-types/untyped-item/untyped-item.component'; import { NavbarComponent } from './app/navbar/navbar.component'; -import { CommunityListElementComponent } from './app/shared/object-list/community-list-element/community-list-element.component'; import { LangSwitchComponent } from './app/shared/lang-switch/lang-switch.component'; +import { CommunityListElementComponent } from './app/shared/object-list/community-list-element/community-list-element.component'; import { ItemSearchResultListElementComponent } from './app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; -import { UntypedItemComponent } from './app/item-page/simple/item-types/untyped-item/untyped-item.component'; /** * Add components that use a custom decorator to ENTRY_COMPONENTS as well as DECLARATIONS. @@ -18,7 +18,7 @@ import { UntypedItemComponent } from './app/item-page/simple/item-types/untyped- */ const ENTRY_COMPONENTS = [ CommunityListElementComponent, - ItemSearchResultListElementComponent + ItemSearchResultListElementComponent, ]; const DECLARATIONS = [ @@ -29,7 +29,7 @@ const DECLARATIONS = [ NavbarComponent, FooterComponent, LangSwitchComponent, - UntypedItemComponent + UntypedItemComponent, ]; @NgModule({ diff --git a/src/themes/szerep/lazy-theme.module.ts b/src/themes/szerep/lazy-theme.module.ts index 5df50404153..5493ac4ae41 100644 --- a/src/themes/szerep/lazy-theme.module.ts +++ b/src/themes/szerep/lazy-theme.module.ts @@ -14,12 +14,12 @@ import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to'; import { RootModule } from '../../app/root.module'; import { AdminSidebarComponent } from './app/admin/admin-sidebar/admin-sidebar.component'; import { HomePageComponent } from './app/home-page/home-page.component'; -import { LoginPageComponent } from './app/login-page/login-page.component'; -import { ObjectListComponent } from './app/shared/object-list/object-list.component'; -import { AuthNavMenuComponent } from './app/shared/auth-nav-menu/auth-nav-menu.component'; import { FullItemPageComponent } from './app/item-page/full/full-item-page.component'; +import { LoginPageComponent } from './app/login-page/login-page.component'; import { RegisterEmailFormComponent } from './app/register-email-form/register-email-form.component'; +import { AuthNavMenuComponent } from './app/shared/auth-nav-menu/auth-nav-menu.component'; import { AccessStatusBadgeComponent } from './app/shared/object-collection/shared/badges/access-status-badge/access-status-badge.component'; +import { ObjectListComponent } from './app/shared/object-list/object-list.component'; const DECLARATIONS = [ HomePageComponent, @@ -29,7 +29,7 @@ const DECLARATIONS = [ AuthNavMenuComponent, FullItemPageComponent, RegisterEmailFormComponent, - AccessStatusBadgeComponent + AccessStatusBadgeComponent, ]; @NgModule({