From caa5b1e29ab15fe30c1715c85f18e9cb2e3cea26 Mon Sep 17 00:00:00 2001 From: Adamo Date: Thu, 20 Feb 2025 16:50:47 +0100 Subject: [PATCH 01/12] [CST-18016] Fix import suggestion --- ...d-create-item-parent-selector.component.ts | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts index f6cd552629..feac138c49 100644 --- a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts @@ -1,10 +1,15 @@ import { + ChangeDetectorRef, Component, + EventEmitter, Input, + Output, } from '@angular/core'; import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; import { CreateItemParentSelectorComponent } from './create-item-parent-selector.component'; +import { ThemeService } from '../../../theme-support/theme.service'; +import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; /** * Themed wrapper for CreateItemParentSelectorComponent @@ -18,20 +23,29 @@ import { CreateItemParentSelectorComponent } from './create-item-parent-selector }) export class ThemedCreateItemParentSelectorComponent extends ThemedComponent { - @Input() entityType: string; + @Input() entityType: string; + @Output() select: EventEmitter = new EventEmitter(); + @Input() emitOnly = true; - protected inAndOutputNames: (keyof CreateItemParentSelectorComponent & keyof this)[] = ['entityType']; + protected inAndOutputNames: (keyof CreateItemParentSelectorComponent & keyof this)[] = ['entityType', 'select', 'emitOnly']; - protected getComponentName(): string { - return 'CreateItemParentSelectorComponent'; - } + constructor( + protected cdr: ChangeDetectorRef, + protected themeService: ThemeService, + ) { + super(cdr, themeService); + } - protected importThemedComponent(themeName: string): Promise { - return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component`); - } + protected getComponentName(): string { + return 'CreateItemParentSelectorComponent'; + } - protected importUnthemedComponent(): Promise { - return import('./create-item-parent-selector.component'); - } + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./create-item-parent-selector.component'); + } } From b58dd32bff14ee047cce6097abe68f3447b6c2c2 Mon Sep 17 00:00:00 2001 From: Adamo Date: Fri, 21 Feb 2025 10:16:17 +0100 Subject: [PATCH 02/12] [CST-18016] Added label for live import --- 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 7da72f0fb3..f61491bc35 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4840,6 +4840,12 @@ "submission.import-external.source.ror": "Research Organization Registry (ROR)", + "submission.import-external.source.openalexPublication": "OpenAlex Search by Title", + + "submission.import-external.source.openalexPublicationByAuthorId": "OpenAlex Search by Author ID", + + "submission.import-external.source.openalexPerson": "OpenAlex Search by name", + "submission.import-external.preview.title": "Item Preview", "submission.import-external.preview.title.Publication": "Publication Preview", From eeec2b536d5e6b727204bdb2972c907b3c9d89c5 Mon Sep 17 00:00:00 2001 From: Adamo Date: Fri, 21 Feb 2025 10:27:09 +0100 Subject: [PATCH 03/12] [CST-18016] Lint fix --- .../themed-create-item-parent-selector.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts index feac138c49..03e68f370d 100644 --- a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts @@ -7,9 +7,9 @@ import { } from '@angular/core'; import { ThemedComponent } from 'src/app/shared/theme-support/themed.component'; -import { CreateItemParentSelectorComponent } from './create-item-parent-selector.component'; -import { ThemeService } from '../../../theme-support/theme.service'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; +import { ThemeService } from '../../../theme-support/theme.service'; +import { CreateItemParentSelectorComponent } from './create-item-parent-selector.component'; /** * Themed wrapper for CreateItemParentSelectorComponent From 4235351d746bd91d901777f0f4ffef7578c04fae Mon Sep 17 00:00:00 2001 From: Adamo Date: Fri, 21 Feb 2025 12:50:18 +0100 Subject: [PATCH 04/12] [CST-18016] Fix on themed-create-item-parent-selector.component.ts --- .../themed-create-item-parent-selector.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts index 03e68f370d..bfeeb7df0a 100644 --- a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts @@ -25,7 +25,7 @@ export class ThemedCreateItemParentSelectorComponent extends ThemedComponent { @Input() entityType: string; @Output() select: EventEmitter = new EventEmitter(); - @Input() emitOnly = true; + @Input() emitOnly = false; protected inAndOutputNames: (keyof CreateItemParentSelectorComponent & keyof this)[] = ['entityType', 'select', 'emitOnly']; From 66d9c7079b9477392f34be62e2a7433d06588f75 Mon Sep 17 00:00:00 2001 From: Adamo Date: Wed, 26 Feb 2025 11:51:41 +0100 Subject: [PATCH 05/12] [CST-18016] Updated labels. --- src/assets/i18n/en.json5 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f61491bc35..ca8ecde642 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2852,6 +2852,8 @@ "item.preview.person.identifier.orcid": "ORCID:", + "item.preview.person.affiliation.name": "Affiliations:", + "item.preview.project.funder.name": "Funder:", "item.preview.project.funder.identifier": "Funder Identifier:", @@ -2880,6 +2882,14 @@ "item.preview.dspace.entity.type": "Entity Type:", + "item.preview.creativework.publisher": "Publisher", + + "item.preview.creativeworkseries.issn": "ISSN", + + "item.preview.dc.identifier.openalex": "OpenAlex Identifier", + + "item.preview.dc.description": "Description", + "item.select.confirm": "Confirm selected", "item.select.empty": "No items to show", @@ -4846,6 +4856,14 @@ "submission.import-external.source.openalexPerson": "OpenAlex Search by name", + "submission.import-external.source.openalexJournal": "OpenAlex Journals", + + "submission.import-external.source.openalexInstitution": "OpenAlex Institutions", + + "submission.import-external.source.openalexPublisher": "OpenAlex Publishers", + + "submission.import-external.source.openalexFunder": "OpenAlex Funders", + "submission.import-external.preview.title": "Item Preview", "submission.import-external.preview.title.Publication": "Publication Preview", From 16eda4f1865267597ce512402fe8218e5f139a82 Mon Sep 17 00:00:00 2001 From: Adamo Date: Thu, 6 Mar 2025 23:52:23 +0100 Subject: [PATCH 06/12] [CST-18016] Updated labels. --- src/assets/i18n/en.json5 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index ca8ecde642..d2a480a9dd 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2830,10 +2830,18 @@ "item.preview.dc.type": "Type:", + "item.preview.oaire.version": "Version", + "item.preview.oaire.citation.issue": "Issue", "item.preview.oaire.citation.volume": "Volume", + "item.preview.oaire.citation.title": "Citation container", + + "item.preview.oaire.citation.startPage": "Citation start page", + + "item.preview.oaire.citation.endPage": "Citation end page", + "item.preview.dc.relation.issn": "ISSN", "item.preview.dc.identifier.isbn": "ISBN", @@ -2886,6 +2894,8 @@ "item.preview.creativeworkseries.issn": "ISSN", + "item.preview.dc.identifier.issn": "ISSN", + "item.preview.dc.identifier.openalex": "OpenAlex Identifier", "item.preview.dc.description": "Description", From 117514bace1db6b0bf845a0b44649cab3129c5d4 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 22 Jan 2021 10:25:06 +0100 Subject: [PATCH 07/12] [CST-18016] Create a new component to list the qa sources --- .../quality-assurance-source.component.html | 67 ++-------- ...quality-assurance-source.component.spec.ts | 24 ++-- .../quality-assurance-source.component.ts | 37 +++++- .../shared/source-list.component.html | 59 +++++++++ .../shared/source-list.component.scss | 0 .../shared/source-list.component.spec.ts | 114 ++++++++++++++++++ .../shared/source-list.component.ts | 75 ++++++++++++ .../quality-assurance-source-data.resolver.ts | 2 +- 8 files changed, 305 insertions(+), 73 deletions(-) create mode 100644 src/app/notifications/shared/source-list.component.html create mode 100644 src/app/notifications/shared/source-list.component.scss create mode 100644 src/app/notifications/shared/source-list.component.spec.ts create mode 100644 src/app/notifications/shared/source-list.component.ts diff --git a/src/app/notifications/qa/source/quality-assurance-source.component.html b/src/app/notifications/qa/source/quality-assurance-source.component.html index 6155b7901f..54906a0adb 100644 --- a/src/app/notifications/qa/source/quality-assurance-source.component.html +++ b/src/app/notifications/qa/source/quality-assurance-source.component.html @@ -5,65 +5,12 @@ -
-
-

{{'quality-assurance.source'| translate}}

- - @if ((isSourceLoading() | async)) { - - } - @if ((isSourceLoading() | async) !== true) { - - @if ((isSourceProcessing() | async)) { - - } - @if ((isSourceProcessing() | async) !== true) { - @if ((sources$ | async)?.length === 0) { - - } - @if ((sources$ | async)?.length !== 0) { -
- - - - - - - - - - @for (sourceElement of (sources$ | async); track sourceElement; let i = $index) { - - - - - - } - -
{{'quality-assurance.table.source' | translate}}{{'quality-assurance.table.last-event' | translate}}{{'quality-assurance.table.actions' | translate}}
{{sourceElement.id}}{{sourceElement.lastEvent | date: 'dd/MM/yyyy hh:mm' }} -
- -
-
-
- } - } -
- } -
-
+ diff --git a/src/app/notifications/qa/source/quality-assurance-source.component.spec.ts b/src/app/notifications/qa/source/quality-assurance-source.component.spec.ts index e9c0133725..226630c0f1 100644 --- a/src/app/notifications/qa/source/quality-assurance-source.component.spec.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.component.spec.ts @@ -16,16 +16,18 @@ import { of as observableOf } from 'rxjs'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { AlertComponent } from '../../../shared/alert/alert.component'; -import { ThemedLoadingComponent } from '../../../shared/loading/themed-loading.component'; import { getMockNotificationsStateService, qualityAssuranceSourceObjectMoreAbstract, qualityAssuranceSourceObjectMorePid, } from '../../../shared/mocks/notifications.mock'; -import { PaginationComponent } from '../../../shared/pagination/pagination.component'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { NotificationsStateService } from '../../notifications-state.service'; +import { + SourceListComponent, + SourceObject, +} from '../../shared/source-list.component'; import { QualityAssuranceSourceComponent } from './quality-assurance-source.component'; describe('QualityAssuranceSourceComponent test suite', () => { @@ -61,8 +63,7 @@ describe('QualityAssuranceSourceComponent test suite', () => { remove: { imports: [ AlertComponent, - ThemedLoadingComponent, - PaginationComponent, + SourceListComponent, ], }, }) @@ -119,12 +120,19 @@ describe('QualityAssuranceSourceComponent test suite', () => { it(('Should init component properly'), () => { comp.ngOnInit(); fixture.detectChanges(); + const expected: SourceObject[] = [ + { id: qualityAssuranceSourceObjectMorePid.id, + lastEvent: qualityAssuranceSourceObjectMorePid.lastEvent, + total: qualityAssuranceSourceObjectMorePid.totalEvents, + }, + { id: qualityAssuranceSourceObjectMoreAbstract.id, + lastEvent: qualityAssuranceSourceObjectMoreAbstract.lastEvent, + total: qualityAssuranceSourceObjectMoreAbstract.totalEvents, + }, + ]; expect(comp.sources$).toBeObservable(cold('(a|)', { - a: [ - qualityAssuranceSourceObjectMorePid, - qualityAssuranceSourceObjectMoreAbstract, - ], + a: expected, })); expect(comp.totalElements$).toBeObservable(cold('(a|)', { a: 2, diff --git a/src/app/notifications/qa/source/quality-assurance-source.component.ts b/src/app/notifications/qa/source/quality-assurance-source.component.ts index 575394fd2f..0a5cf37c8d 100644 --- a/src/app/notifications/qa/source/quality-assurance-source.component.ts +++ b/src/app/notifications/qa/source/quality-assurance-source.component.ts @@ -8,7 +8,11 @@ import { OnDestroy, OnInit, } from '@angular/core'; -import { RouterLink } from '@angular/router'; +import { + ActivatedRoute, + Router, + RouterLink, +} from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { Observable, @@ -16,6 +20,7 @@ import { } from 'rxjs'; import { distinctUntilChanged, + map, take, } from 'rxjs/operators'; @@ -29,6 +34,10 @@ import { ThemedLoadingComponent } from '../../../shared/loading/themed-loading.c import { PaginationComponent } from '../../../shared/pagination/pagination.component'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { NotificationsStateService } from '../../notifications-state.service'; +import { + SourceListComponent, + SourceObject, +} from '../../shared/source-list.component'; /** * Component to display the Quality Assurance source list. @@ -38,7 +47,7 @@ import { NotificationsStateService } from '../../notifications-state.service'; templateUrl: './quality-assurance-source.component.html', styleUrls: ['./quality-assurance-source.component.scss'], standalone: true, - imports: [AlertComponent, ThemedLoadingComponent, PaginationComponent, RouterLink, AsyncPipe, TranslateModule, DatePipe], + imports: [AlertComponent, ThemedLoadingComponent, PaginationComponent, RouterLink, AsyncPipe, TranslateModule, DatePipe, SourceListComponent], }) export class QualityAssuranceSourceComponent implements OnDestroy, OnInit, AfterViewInit { @@ -59,7 +68,7 @@ export class QualityAssuranceSourceComponent implements OnDestroy, OnInit, After /** * The Quality Assurance source list. */ - public sources$: Observable; + public sources$: Observable; /** * The total number of Quality Assurance sources. */ @@ -74,10 +83,14 @@ export class QualityAssuranceSourceComponent implements OnDestroy, OnInit, After * Initialize the component variables. * @param {PaginationService} paginationService * @param {NotificationsStateService} notificationsStateService + * @param {Router} router + * @param {ActivatedRoute} route */ constructor( private paginationService: PaginationService, private notificationsStateService: NotificationsStateService, + private router: Router, + private route: ActivatedRoute, ) { } @@ -85,7 +98,15 @@ export class QualityAssuranceSourceComponent implements OnDestroy, OnInit, After * Component initialization. */ ngOnInit(): void { - this.sources$ = this.notificationsStateService.getQualityAssuranceSource(); + this.sources$ = this.notificationsStateService.getQualityAssuranceSource().pipe( + map((sources: QualityAssuranceSourceObject[])=> { + return sources.map((source: QualityAssuranceSourceObject) => ({ + id: source.id, + lastEvent: source.lastEvent, + total: source.totalEvents, + })); + }), + ); this.totalElements$ = this.notificationsStateService.getQualityAssuranceSourceTotals(); } @@ -102,6 +123,14 @@ export class QualityAssuranceSourceComponent implements OnDestroy, OnInit, After ); } + /** + * Navigate to the specified source + * @param sourceId + */ + onSelect(sourceId: string) { + this.router.navigate([sourceId], { relativeTo: this.route }); + } + /** * Returns the information about the loading status of the Quality Assurance source (if it's running or not). * diff --git a/src/app/notifications/shared/source-list.component.html b/src/app/notifications/shared/source-list.component.html new file mode 100644 index 0000000000..5759ec5f1e --- /dev/null +++ b/src/app/notifications/shared/source-list.component.html @@ -0,0 +1,59 @@ +
+

{{'quality-assurance.source'| translate}}

+ + @if (loading()) { + + } @else { + + @if (sources()?.length === 0) { + + } + @if (sources()?.length !== 0) { +
+ + + + + @if (showLastEvent()) { + + } + + + + + @for (sourceElement of sources(); track sourceElement; let i = $index) { + + + @if (showLastEvent()) { + + } + + + } + +
{{'quality-assurance.table.source' | translate}}{{'quality-assurance.table.last-event' | translate}}{{'quality-assurance.table.actions' | translate}}
{{sourceElement.id}}{{sourceElement.lastEvent | date: 'dd/MM/yyyy hh:mm' }} +
+ +
+
+
+ } + +
+ } + +
+ diff --git a/src/app/notifications/shared/source-list.component.scss b/src/app/notifications/shared/source-list.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/notifications/shared/source-list.component.spec.ts b/src/app/notifications/shared/source-list.component.spec.ts new file mode 100644 index 0000000000..f3a8f68c09 --- /dev/null +++ b/src/app/notifications/shared/source-list.component.spec.ts @@ -0,0 +1,114 @@ +import { + AsyncPipe, + DatePipe, +} from '@angular/common'; +import { + ComponentFixture, + TestBed, +} from '@angular/core/testing'; +import { provideRouter } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { MockComponent } from 'ng-mocks'; + +import { AlertComponent } from '../../shared/alert/alert.component'; +import { ThemedLoadingComponent } from '../../shared/loading/themed-loading.component'; +import { PaginationComponent } from '../../shared/pagination/pagination.component'; +import { + SourceListComponent, + SourceObject, +} from './source-list.component'; + +describe('SourceListComponent', () => { + let component: SourceListComponent; + let fixture: ComponentFixture; + const paginationConfig = { + currentPage: 1, + pageSize: 10, + }; + const sources: SourceObject[] = [ + { id: 'source1', lastEvent: '2025-03-12T12:00:00', total: 5 }, + { id: 'source1', lastEvent: '2025-03-13T12:00:00', total: 10 }, + ]; + + const sourcesWithoutEvent: SourceObject[] = [ + { id: 'source1', total: 5 }, + { id: 'source1', total: 10 }, + ]; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [SourceListComponent], + imports: [ + TranslateModule.forRoot(), + AlertComponent, + AsyncPipe, + DatePipe, + MockComponent(PaginationComponent), + MockComponent(ThemedLoadingComponent), + ], + providers: [ + provideRouter([]), + ], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(SourceListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should display loading message when loading is true', () => { + fixture.componentRef.setInput('loading', true); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('ds-loading')).toBeTruthy(); + }); + + it('should display sources when loading is false and sources are available', () => { + fixture.componentRef.setInput('loading', false); + fixture.componentRef.setInput('showLastEvent', true); + fixture.componentRef.setInput('sources', sources); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('table')).toBeTruthy(); + expect(fixture.nativeElement.querySelector('thead tr').children.length).toBe(3); + expect(fixture.nativeElement.querySelector('tbody').children.length).toBe(2); + expect(fixture.nativeElement.querySelector('tbody tr td').textContent).toContain('source1'); + }); + + it('should not display last event column', () => { + fixture.componentRef.setInput('loading', false); + fixture.componentRef.setInput('showLastEvent', false); + fixture.componentRef.setInput('sources', sourcesWithoutEvent); + fixture.detectChanges(); + expect(fixture.nativeElement.querySelector('table')).toBeTruthy(); + expect(fixture.nativeElement.querySelector('thead tr').children.length).toBe(2); + expect(fixture.nativeElement.querySelector('tbody').children.length).toBe(2); + expect(fixture.nativeElement.querySelector('table tbody tr td').textContent).toContain('source1'); + }); + + it('should emit sourceSelected event when a source is clicked', () => { + spyOn(component.sourceSelected, 'emit'); + fixture.componentRef.setInput('loading', false); + fixture.componentRef.setInput('paginationConfig', paginationConfig); + fixture.componentRef.setInput('sources', sources); + fixture.detectChanges(); + const button = fixture.nativeElement.querySelector('.btn-outline-primary'); + button.click(); + expect(component.sourceSelected.emit).toHaveBeenCalledWith('source1'); + }); + + it('should emit paginationChange event when pagination changes', () => { + spyOn(component.paginationChange, 'emit'); + fixture.componentRef.setInput('loading', false); + fixture.componentRef.setInput('paginationConfig', paginationConfig); + + fixture.detectChanges(); + const paginationComponent = fixture.nativeElement.querySelector('ds-pagination'); + paginationComponent.dispatchEvent(new Event('paginationChange')); + expect(component.paginationChange.emit).toHaveBeenCalled(); + }); +}); diff --git a/src/app/notifications/shared/source-list.component.ts b/src/app/notifications/shared/source-list.component.ts new file mode 100644 index 0000000000..d49d7977fe --- /dev/null +++ b/src/app/notifications/shared/source-list.component.ts @@ -0,0 +1,75 @@ +import { + AsyncPipe, + DatePipe, +} from '@angular/common'; +import { + Component, + input, + InputSignal, + output, +} from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +import { AlertComponent } from '../../shared/alert/alert.component'; +import { ThemedLoadingComponent } from '../../shared/loading/themed-loading.component'; +import { PaginationComponent } from '../../shared/pagination/pagination.component'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; + +export interface SourceObject { + id: string; + lastEvent?: string; + total: number; +} + +/** + * Component to display the Quality Assurance source list. + */ +@Component({ + selector: 'ds-source-list', + templateUrl: './source-list.component.html', + styleUrls: ['./source-list.component.scss'], + standalone: true, + imports: [AlertComponent, ThemedLoadingComponent, PaginationComponent, RouterLink, AsyncPipe, TranslateModule, DatePipe], +}) +export class SourceListComponent { + + /** + * A boolean indicating whether the sources are in a loading state. + */ + loading: InputSignal = input(false); + + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + paginationConfig: InputSignal = input(); + + /** + * A boolean indicating whether to show the last event column. + */ + showLastEvent: InputSignal = input(); + + /** + * The source list. + */ + sources: InputSignal = input(); + + /** + * The total number of Quality Assurance sources. + */ + totalElements: InputSignal = input(); + + /** + * Event emitter for when a source is selected. + * Emits the ID of the selected source. + */ + sourceSelected = output(); + + /** + * Event emitter for when the pagination changes. + * Emits a string representation of the pagination change. + */ + paginationChange = output(); + +} diff --git a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts index 42ff19299e..dd9ae36476 100644 --- a/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts +++ b/src/app/quality-assurance-notifications-pages/quality-assurance-source-page-component/quality-assurance-source-data.resolver.ts @@ -34,7 +34,7 @@ export const qualityAssuranceSourceDataResolver: ResolveFn => { const pageSize = appConfig.qualityAssuranceConfig.pageSize; - return qualityAssuranceSourceService.getSources(pageSize, 0).pipe( + return qualityAssuranceSourceService.getSources(pageSize, 1).pipe( map((sources: PaginatedList) => { if (sources.page.length === 1) { router.navigate([getResolvedUrl(route) + '/' + sources.page[0].id]); From 2df409ca63da18ae3fb27d773217ae2c6924bb05 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 13 Mar 2025 13:41:53 +0100 Subject: [PATCH 08/12] [CST-18016] Create suggestions folder to better organize the code relative to notifications functionalities --- src/app/home-page/home-page.component.ts | 2 +- .../my-dspace-page.component.spec.ts | 2 +- .../my-dspace-page.component.ts | 2 +- .../notifications/notifications-effects.ts | 2 +- .../notifications/notifications.reducer.ts | 2 +- .../suggestion-actions.component.html | 0 .../suggestion-actions.component.scss | 0 .../actions}/suggestion-actions.component.ts | 14 +++---- .../suggestion-approve-and-import.ts | 2 +- .../suggestion-evidences.component.html | 0 .../suggestion-evidences.component.scss | 0 .../suggestion-evidences.component.ts | 6 +-- .../suggestion-list-element.component.html | 0 .../suggestion-list-element.component.scss | 0 .../suggestion-list-element.component.spec.ts | 8 ++-- .../suggestion-list-element.component.ts | 10 ++--- .../suggestions-notification.component.html | 0 .../suggestions-notification.component.scss | 0 .../suggestions-notification.component.ts | 4 +- .../popup}/suggestions-popup.component.html | 0 .../popup}/suggestions-popup.component.scss | 0 .../suggestions-popup.component.spec.ts | 6 +-- .../popup}/suggestions-popup.component.ts | 8 ++-- .../suggestions.service.spec.ts | 24 ++++++------ .../{ => suggestions}/suggestions.service.ts | 38 +++++++++---------- .../publication-claim.component.html | 0 .../publication-claim.component.scss | 0 .../publication-claim.component.ts | 14 +++---- .../targets}/selectors.ts | 6 +-- .../targets}/suggestion-targets.actions.ts | 4 +- .../targets}/suggestion-targets.effects.ts | 8 ++-- .../targets}/suggestion-targets.reducer.ts | 2 +- .../suggestion-targets.state.service.ts | 4 +- .../profile-page.component.spec.ts | 2 +- .../profile-page/profile-page.component.ts | 2 +- ...-suggestion-targets-page.component.spec.ts | 2 +- ...tions-suggestion-targets-page.component.ts | 2 +- .../suggestions-page.component.spec.ts | 10 ++--- .../suggestions-page.component.ts | 10 ++--- .../app/home-page/home-page.component.ts | 2 +- .../my-dspace-page.component.ts | 2 +- .../profile-page/profile-page.component.ts | 2 +- 42 files changed, 101 insertions(+), 101 deletions(-) rename src/app/notifications/{suggestion-actions => suggestions/actions}/suggestion-actions.component.html (100%) rename src/app/notifications/{suggestion-actions => suggestions/actions}/suggestion-actions.component.scss (100%) rename src/app/notifications/{suggestion-actions => suggestions/actions}/suggestion-actions.component.ts (79%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-approve-and-import.ts (67%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-evidences/suggestion-evidences.component.html (100%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-evidences/suggestion-evidences.component.scss (100%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-evidences/suggestion-evidences.component.ts (69%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-list-element.component.html (100%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-list-element.component.scss (100%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-list-element.component.spec.ts (87%) rename src/app/notifications/{suggestion-list-element => suggestions/list-element}/suggestion-list-element.component.ts (83%) rename src/app/notifications/{suggestions-notification => suggestions/notification}/suggestions-notification.component.html (100%) rename src/app/notifications/{suggestions-notification => suggestions/notification}/suggestions-notification.component.scss (100%) rename src/app/notifications/{suggestions-notification => suggestions/notification}/suggestions-notification.component.ts (87%) rename src/app/notifications/{suggestions-popup => suggestions/popup}/suggestions-popup.component.html (100%) rename src/app/notifications/{suggestions-popup => suggestions/popup}/suggestions-popup.component.scss (100%) rename src/app/notifications/{suggestions-popup => suggestions/popup}/suggestions-popup.component.spec.ts (92%) rename src/app/notifications/{suggestions-popup => suggestions/popup}/suggestions-popup.component.ts (88%) rename src/app/notifications/{ => suggestions}/suggestions.service.spec.ts (85%) rename src/app/notifications/{ => suggestions}/suggestions.service.ts (86%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/publication-claim/publication-claim.component.html (100%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/publication-claim/publication-claim.component.scss (100%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/publication-claim/publication-claim.component.ts (87%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/selectors.ts (95%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/suggestion-targets.actions.ts (97%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/suggestion-targets.effects.ts (94%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/suggestion-targets.reducer.ts (97%) rename src/app/notifications/{suggestion-targets => suggestions/targets}/suggestion-targets.state.service.ts (96%) diff --git a/src/app/home-page/home-page.component.ts b/src/app/home-page/home-page.component.ts index 33a8216a8a..4f05abc96c 100644 --- a/src/app/home-page/home-page.component.ts +++ b/src/app/home-page/home-page.component.ts @@ -18,7 +18,7 @@ import { } from 'src/config/app-config.interface'; import { Site } from '../core/shared/site.model'; -import { SuggestionsPopupComponent } from '../notifications/suggestions-popup/suggestions-popup.component'; +import { SuggestionsPopupComponent } from '../notifications/suggestions/popup/suggestions-popup.component'; import { ThemedConfigurationSearchPageComponent } from '../search-page/themed-configuration-search-page.component'; import { ThemedSearchFormComponent } from '../shared/search-form/themed-search-form.component'; import { PageWithSidebarComponent } from '../shared/sidebar/page-with-sidebar.component'; diff --git a/src/app/my-dspace-page/my-dspace-page.component.spec.ts b/src/app/my-dspace-page/my-dspace-page.component.spec.ts index 58f95e74c3..77636089a6 100644 --- a/src/app/my-dspace-page/my-dspace-page.component.spec.ts +++ b/src/app/my-dspace-page/my-dspace-page.component.spec.ts @@ -28,7 +28,7 @@ import { MyDSpaceConfigurationValueType } from './my-dspace-configuration-value- import { MyDSpaceNewSubmissionComponent } from './my-dspace-new-submission/my-dspace-new-submission.component'; import { MyDSpacePageComponent } from './my-dspace-page.component'; import SpyObj = jasmine.SpyObj; -import { SuggestionsNotificationComponent } from '../notifications/suggestions-notification/suggestions-notification.component'; +import { SuggestionsNotificationComponent } from '../notifications/suggestions/notification/suggestions-notification.component'; import { MyDspaceQaEventsNotificationsComponent } from './my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component'; describe('MyDSpacePageComponent', () => { diff --git a/src/app/my-dspace-page/my-dspace-page.component.ts b/src/app/my-dspace-page/my-dspace-page.component.ts index 7acb900739..315b5562d2 100644 --- a/src/app/my-dspace-page/my-dspace-page.component.ts +++ b/src/app/my-dspace-page/my-dspace-page.component.ts @@ -14,7 +14,7 @@ import { RoleType } from '../core/roles/role-types'; import { Context } from '../core/shared/context.model'; import { SearchService } from '../core/shared/search/search.service'; import { ViewMode } from '../core/shared/view-mode.model'; -import { SuggestionsNotificationComponent } from '../notifications/suggestions-notification/suggestions-notification.component'; +import { SuggestionsNotificationComponent } from '../notifications/suggestions/notification/suggestions-notification.component'; import { RoleDirective } from '../shared/roles/role.directive'; import { SearchConfigurationOption } from '../shared/search/search-switch-configuration/search-configuration-option.model'; import { ThemedSearchComponent } from '../shared/search/themed-search.component'; diff --git a/src/app/notifications/notifications-effects.ts b/src/app/notifications/notifications-effects.ts index d06c9dae53..9bed1b4be3 100644 --- a/src/app/notifications/notifications-effects.ts +++ b/src/app/notifications/notifications-effects.ts @@ -1,6 +1,6 @@ import { QualityAssuranceSourceEffects } from './qa/source/quality-assurance-source.effects'; import { QualityAssuranceTopicsEffects } from './qa/topics/quality-assurance-topics.effects'; -import { SuggestionTargetsEffects } from './suggestion-targets/suggestion-targets.effects'; +import { SuggestionTargetsEffects } from './suggestions/targets/suggestion-targets.effects'; export const notificationsEffects = [ QualityAssuranceTopicsEffects, diff --git a/src/app/notifications/notifications.reducer.ts b/src/app/notifications/notifications.reducer.ts index 14ca6c0347..76c74f3f66 100644 --- a/src/app/notifications/notifications.reducer.ts +++ b/src/app/notifications/notifications.reducer.ts @@ -14,7 +14,7 @@ import { import { SuggestionTargetsReducer, SuggestionTargetState, -} from './suggestion-targets/suggestion-targets.reducer'; +} from './suggestions/targets/suggestion-targets.reducer'; /** * The OpenAIRE State diff --git a/src/app/notifications/suggestion-actions/suggestion-actions.component.html b/src/app/notifications/suggestions/actions/suggestion-actions.component.html similarity index 100% rename from src/app/notifications/suggestion-actions/suggestion-actions.component.html rename to src/app/notifications/suggestions/actions/suggestion-actions.component.html diff --git a/src/app/notifications/suggestion-actions/suggestion-actions.component.scss b/src/app/notifications/suggestions/actions/suggestion-actions.component.scss similarity index 100% rename from src/app/notifications/suggestion-actions/suggestion-actions.component.scss rename to src/app/notifications/suggestions/actions/suggestion-actions.component.scss diff --git a/src/app/notifications/suggestion-actions/suggestion-actions.component.ts b/src/app/notifications/suggestions/actions/suggestion-actions.component.ts similarity index 79% rename from src/app/notifications/suggestion-actions/suggestion-actions.component.ts rename to src/app/notifications/suggestions/actions/suggestion-actions.component.ts index dc0e075667..f3b0e5387f 100644 --- a/src/app/notifications/suggestion-actions/suggestion-actions.component.ts +++ b/src/app/notifications/suggestions/actions/suggestion-actions.component.ts @@ -12,13 +12,13 @@ import { import { TranslateModule } from '@ngx-translate/core'; import { take } from 'rxjs/operators'; -import { Suggestion } from '../../core/notifications/suggestions/models/suggestion.model'; -import { Collection } from '../../core/shared/collection.model'; -import { ItemType } from '../../core/shared/item-relationships/item-type.model'; -import { BtnDisabledDirective } from '../../shared/btn-disabled.directive'; -import { ThemedCreateItemParentSelectorComponent } from '../../shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component'; -import { EntityDropdownComponent } from '../../shared/entity-dropdown/entity-dropdown.component'; -import { SuggestionApproveAndImport } from '../suggestion-list-element/suggestion-approve-and-import'; +import { Suggestion } from '../../../core/notifications/suggestions/models/suggestion.model'; +import { Collection } from '../../../core/shared/collection.model'; +import { ItemType } from '../../../core/shared/item-relationships/item-type.model'; +import { BtnDisabledDirective } from '../../../shared/btn-disabled.directive'; +import { ThemedCreateItemParentSelectorComponent } from '../../../shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component'; +import { EntityDropdownComponent } from '../../../shared/entity-dropdown/entity-dropdown.component'; +import { SuggestionApproveAndImport } from '../list-element/suggestion-approve-and-import'; /** * Show and trigger the actions to submit for a suggestion diff --git a/src/app/notifications/suggestion-list-element/suggestion-approve-and-import.ts b/src/app/notifications/suggestions/list-element/suggestion-approve-and-import.ts similarity index 67% rename from src/app/notifications/suggestion-list-element/suggestion-approve-and-import.ts rename to src/app/notifications/suggestions/list-element/suggestion-approve-and-import.ts index bda9532393..d0d20d6d80 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-approve-and-import.ts +++ b/src/app/notifications/suggestions/list-element/suggestion-approve-and-import.ts @@ -1,4 +1,4 @@ -import { Suggestion } from '../../core/notifications/suggestions/models/suggestion.model'; +import { Suggestion } from '../../../core/notifications/suggestions/models/suggestion.model'; /** * A simple interface to unite a specific suggestion and the id of the chosen collection diff --git a/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.html b/src/app/notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component.html similarity index 100% rename from src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.html rename to src/app/notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component.html diff --git a/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.scss b/src/app/notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component.scss similarity index 100% rename from src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.scss rename to src/app/notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component.scss diff --git a/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts b/src/app/notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component.ts similarity index 69% rename from src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts rename to src/app/notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component.ts index d968826b70..8214a794c5 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component.ts +++ b/src/app/notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component.ts @@ -5,9 +5,9 @@ import { } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; -import { SuggestionEvidences } from '../../../core/notifications/suggestions/models/suggestion.model'; -import { fadeIn } from '../../../shared/animations/fade'; -import { ObjectKeysPipe } from '../../../shared/utils/object-keys-pipe'; +import { SuggestionEvidences } from '../../../../core/notifications/suggestions/models/suggestion.model'; +import { fadeIn } from '../../../../shared/animations/fade'; +import { ObjectKeysPipe } from '../../../../shared/utils/object-keys-pipe'; /** * Show suggestion evidences such as score (authorScore, dateScore) diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.html b/src/app/notifications/suggestions/list-element/suggestion-list-element.component.html similarity index 100% rename from src/app/notifications/suggestion-list-element/suggestion-list-element.component.html rename to src/app/notifications/suggestions/list-element/suggestion-list-element.component.html diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.scss b/src/app/notifications/suggestions/list-element/suggestion-list-element.component.scss similarity index 100% rename from src/app/notifications/suggestion-list-element/suggestion-list-element.component.scss rename to src/app/notifications/suggestions/list-element/suggestion-list-element.component.scss diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts b/src/app/notifications/suggestions/list-element/suggestion-list-element.component.spec.ts similarity index 87% rename from src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts rename to src/app/notifications/suggestions/list-element/suggestion-list-element.component.spec.ts index ceb33f8fac..c51ec3b37d 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.spec.ts +++ b/src/app/notifications/suggestions/list-element/suggestion-list-element.component.spec.ts @@ -9,10 +9,10 @@ import { TranslateModule } from '@ngx-translate/core'; import { getTestScheduler } from 'jasmine-marbles'; import { TestScheduler } from 'rxjs/testing'; -import { Item } from '../../core/shared/item.model'; -import { mockSuggestionPublicationOne } from '../../shared/mocks/publication-claim.mock'; -import { ItemSearchResultListElementComponent } from '../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; -import { SuggestionActionsComponent } from '../suggestion-actions/suggestion-actions.component'; +import { Item } from '../../../core/shared/item.model'; +import { mockSuggestionPublicationOne } from '../../../shared/mocks/publication-claim.mock'; +import { ItemSearchResultListElementComponent } from '../../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; +import { SuggestionActionsComponent } from '../actions/suggestion-actions.component'; import { SuggestionEvidencesComponent } from './suggestion-evidences/suggestion-evidences.component'; import { SuggestionListElementComponent } from './suggestion-list-element.component'; diff --git a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts b/src/app/notifications/suggestions/list-element/suggestion-list-element.component.ts similarity index 83% rename from src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts rename to src/app/notifications/suggestions/list-element/suggestion-list-element.component.ts index 9e55ba0825..07d68f4367 100644 --- a/src/app/notifications/suggestion-list-element/suggestion-list-element.component.ts +++ b/src/app/notifications/suggestions/list-element/suggestion-list-element.component.ts @@ -9,11 +9,11 @@ import { import { TranslateModule } from '@ngx-translate/core'; import { Suggestion } from 'src/app/core/notifications/suggestions/models/suggestion.model'; -import { Item } from '../../core/shared/item.model'; -import { fadeIn } from '../../shared/animations/fade'; -import { isNotEmpty } from '../../shared/empty.util'; -import { ItemSearchResultListElementComponent } from '../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; -import { SuggestionActionsComponent } from '../suggestion-actions/suggestion-actions.component'; +import { Item } from '../../../core/shared/item.model'; +import { fadeIn } from '../../../shared/animations/fade'; +import { isNotEmpty } from '../../../shared/empty.util'; +import { ItemSearchResultListElementComponent } from '../../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; +import { SuggestionActionsComponent } from '../actions/suggestion-actions.component'; import { SuggestionApproveAndImport } from './suggestion-approve-and-import'; import { SuggestionEvidencesComponent } from './suggestion-evidences/suggestion-evidences.component'; diff --git a/src/app/notifications/suggestions-notification/suggestions-notification.component.html b/src/app/notifications/suggestions/notification/suggestions-notification.component.html similarity index 100% rename from src/app/notifications/suggestions-notification/suggestions-notification.component.html rename to src/app/notifications/suggestions/notification/suggestions-notification.component.html diff --git a/src/app/notifications/suggestions-notification/suggestions-notification.component.scss b/src/app/notifications/suggestions/notification/suggestions-notification.component.scss similarity index 100% rename from src/app/notifications/suggestions-notification/suggestions-notification.component.scss rename to src/app/notifications/suggestions/notification/suggestions-notification.component.scss diff --git a/src/app/notifications/suggestions-notification/suggestions-notification.component.ts b/src/app/notifications/suggestions/notification/suggestions-notification.component.ts similarity index 87% rename from src/app/notifications/suggestions-notification/suggestions-notification.component.ts rename to src/app/notifications/suggestions/notification/suggestions-notification.component.ts index 208c1bfcbd..ca81d5d419 100644 --- a/src/app/notifications/suggestions-notification/suggestions-notification.component.ts +++ b/src/app/notifications/suggestions/notification/suggestions-notification.component.ts @@ -7,9 +7,9 @@ import { RouterLink } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { Observable } from 'rxjs'; -import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; -import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; +import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; import { SuggestionsService } from '../suggestions.service'; +import { SuggestionTargetsStateService } from '../targets/suggestion-targets.state.service'; /** * Show suggestions notification, used on myDSpace and Profile pages diff --git a/src/app/notifications/suggestions-popup/suggestions-popup.component.html b/src/app/notifications/suggestions/popup/suggestions-popup.component.html similarity index 100% rename from src/app/notifications/suggestions-popup/suggestions-popup.component.html rename to src/app/notifications/suggestions/popup/suggestions-popup.component.html diff --git a/src/app/notifications/suggestions-popup/suggestions-popup.component.scss b/src/app/notifications/suggestions/popup/suggestions-popup.component.scss similarity index 100% rename from src/app/notifications/suggestions-popup/suggestions-popup.component.scss rename to src/app/notifications/suggestions/popup/suggestions-popup.component.scss diff --git a/src/app/notifications/suggestions-popup/suggestions-popup.component.spec.ts b/src/app/notifications/suggestions/popup/suggestions-popup.component.spec.ts similarity index 92% rename from src/app/notifications/suggestions-popup/suggestions-popup.component.spec.ts rename to src/app/notifications/suggestions/popup/suggestions-popup.component.spec.ts index 4ef3aa00a6..3710500552 100644 --- a/src/app/notifications/suggestions-popup/suggestions-popup.component.spec.ts +++ b/src/app/notifications/suggestions/popup/suggestions-popup.component.spec.ts @@ -8,10 +8,10 @@ import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; -import { mockSuggestionTargetsObjectOne } from '../../shared/mocks/publication-claim-targets.mock'; -import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; -import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; +import { mockSuggestionTargetsObjectOne } from '../../../shared/mocks/publication-claim-targets.mock'; +import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; import { SuggestionsService } from '../suggestions.service'; +import { SuggestionTargetsStateService } from '../targets/suggestion-targets.state.service'; import { SuggestionsPopupComponent } from './suggestions-popup.component'; describe('SuggestionsPopupComponent', () => { diff --git a/src/app/notifications/suggestions-popup/suggestions-popup.component.ts b/src/app/notifications/suggestions/popup/suggestions-popup.component.ts similarity index 88% rename from src/app/notifications/suggestions-popup/suggestions-popup.component.ts rename to src/app/notifications/suggestions/popup/suggestions-popup.component.ts index ab5a9bbab0..eeef8b4dde 100644 --- a/src/app/notifications/suggestions-popup/suggestions-popup.component.ts +++ b/src/app/notifications/suggestions/popup/suggestions-popup.component.ts @@ -19,11 +19,11 @@ import { takeUntil, } from 'rxjs/operators'; -import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; -import { fromTopEnter } from '../../shared/animations/fromTop'; -import { isNotEmpty } from '../../shared/empty.util'; -import { SuggestionTargetsStateService } from '../suggestion-targets/suggestion-targets.state.service'; +import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; +import { fromTopEnter } from '../../../shared/animations/fromTop'; +import { isNotEmpty } from '../../../shared/empty.util'; import { SuggestionsService } from '../suggestions.service'; +import { SuggestionTargetsStateService } from '../targets/suggestion-targets.state.service'; /** * Show suggestions on a popover window, used on the homepage diff --git a/src/app/notifications/suggestions.service.spec.ts b/src/app/notifications/suggestions/suggestions.service.spec.ts similarity index 85% rename from src/app/notifications/suggestions.service.spec.ts rename to src/app/notifications/suggestions/suggestions.service.spec.ts index 7a552d3ce4..6e6ede9e05 100644 --- a/src/app/notifications/suggestions.service.spec.ts +++ b/src/app/notifications/suggestions/suggestions.service.spec.ts @@ -5,18 +5,18 @@ import { TestScheduler } from 'rxjs/testing'; import { SortDirection, SortOptions, -} from '../core/cache/models/sort-options.model'; -import { FindListOptions } from '../core/data/find-list-options.model'; -import { SuggestionTarget } from '../core/notifications/suggestions/models/suggestion-target.model'; -import { SuggestionDataService } from '../core/notifications/suggestions/suggestion-data.service'; -import { SuggestionTargetDataService } from '../core/notifications/suggestions/target/suggestion-target-data.service'; -import { ResearcherProfile } from '../core/profile/model/researcher-profile.model'; -import { ResearcherProfileDataService } from '../core/profile/researcher-profile-data.service'; -import { ResourceType } from '../core/shared/resource-type'; -import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; -import { mockSuggestionPublicationOne } from '../shared/mocks/publication-claim.mock'; -import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; -import { followLink } from '../shared/utils/follow-link-config.model'; +} from '../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../core/data/find-list-options.model'; +import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; +import { SuggestionDataService } from '../../core/notifications/suggestions/suggestion-data.service'; +import { SuggestionTargetDataService } from '../../core/notifications/suggestions/target/suggestion-target-data.service'; +import { ResearcherProfile } from '../../core/profile/model/researcher-profile.model'; +import { ResearcherProfileDataService } from '../../core/profile/researcher-profile-data.service'; +import { ResourceType } from '../../core/shared/resource-type'; +import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; +import { mockSuggestionPublicationOne } from '../../shared/mocks/publication-claim.mock'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { followLink } from '../../shared/utils/follow-link-config.model'; import { SuggestionsService } from './suggestions.service'; describe('SuggestionsService test', () => { diff --git a/src/app/notifications/suggestions.service.ts b/src/app/notifications/suggestions/suggestions.service.ts similarity index 86% rename from src/app/notifications/suggestions.service.ts rename to src/app/notifications/suggestions/suggestions.service.ts index f1790f830f..b27789b67a 100644 --- a/src/app/notifications/suggestions.service.ts +++ b/src/app/notifications/suggestions/suggestions.service.ts @@ -12,37 +12,37 @@ import { take, } from 'rxjs/operators'; -import { SuggestionConfig } from '../../config/suggestion-config.interfaces'; -import { environment } from '../../environments/environment'; +import { SuggestionConfig } from '../../../config/suggestion-config.interfaces'; +import { environment } from '../../../environments/environment'; import { SortDirection, SortOptions, -} from '../core/cache/models/sort-options.model'; -import { FindListOptions } from '../core/data/find-list-options.model'; -import { PaginatedList } from '../core/data/paginated-list.model'; -import { RemoteData } from '../core/data/remote-data'; -import { Suggestion } from '../core/notifications/suggestions/models/suggestion.model'; -import { SuggestionTarget } from '../core/notifications/suggestions/models/suggestion-target.model'; -import { SuggestionDataService } from '../core/notifications/suggestions/suggestion-data.service'; -import { SuggestionTargetDataService } from '../core/notifications/suggestions/target/suggestion-target-data.service'; -import { ResearcherProfile } from '../core/profile/model/researcher-profile.model'; -import { ResearcherProfileDataService } from '../core/profile/researcher-profile-data.service'; -import { NoContent } from '../core/shared/NoContent.model'; +} from '../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../core/data/find-list-options.model'; +import { PaginatedList } from '../../core/data/paginated-list.model'; +import { RemoteData } from '../../core/data/remote-data'; +import { Suggestion } from '../../core/notifications/suggestions/models/suggestion.model'; +import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; +import { SuggestionDataService } from '../../core/notifications/suggestions/suggestion-data.service'; +import { SuggestionTargetDataService } from '../../core/notifications/suggestions/target/suggestion-target-data.service'; +import { ResearcherProfile } from '../../core/profile/model/researcher-profile.model'; +import { ResearcherProfileDataService } from '../../core/profile/researcher-profile-data.service'; +import { NoContent } from '../../core/shared/NoContent.model'; import { getFinishedRemoteData, getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload, getFirstSucceededRemoteListPayload, -} from '../core/shared/operators'; -import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; -import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +} from '../../core/shared/operators'; +import { WorkspaceItem } from '../../core/submission/models/workspaceitem.model'; +import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; import { hasNoValue, hasValue, isNotEmpty, -} from '../shared/empty.util'; -import { followLink } from '../shared/utils/follow-link-config.model'; -import { getSuggestionPageRoute } from '../suggestions-page/suggestions-page-routing-paths'; +} from '../../shared/empty.util'; +import { followLink } from '../../shared/utils/follow-link-config.model'; +import { getSuggestionPageRoute } from '../../suggestions-page/suggestions-page-routing-paths'; /** * useful for multiple approvals and ignores operation diff --git a/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.html b/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.html similarity index 100% rename from src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.html rename to src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.html diff --git a/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.scss b/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.scss similarity index 100% rename from src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.scss rename to src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.scss diff --git a/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.ts b/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.ts similarity index 87% rename from src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.ts rename to src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.ts index ccb56629c6..eea76b2a4d 100644 --- a/src/app/notifications/suggestion-targets/publication-claim/publication-claim.component.ts +++ b/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.ts @@ -20,13 +20,13 @@ import { take, } from 'rxjs/operators'; -import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; -import { PaginationService } from '../../../core/pagination/pagination.service'; -import { hasValue } from '../../../shared/empty.util'; -import { ThemedLoadingComponent } from '../../../shared/loading/themed-loading.component'; -import { PaginationComponent } from '../../../shared/pagination/pagination.component'; -import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { getSuggestionPageRoute } from '../../../suggestions-page/suggestions-page-routing-paths'; +import { SuggestionTarget } from '../../../../core/notifications/suggestions/models/suggestion-target.model'; +import { PaginationService } from '../../../../core/pagination/pagination.service'; +import { hasValue } from '../../../../shared/empty.util'; +import { ThemedLoadingComponent } from '../../../../shared/loading/themed-loading.component'; +import { PaginationComponent } from '../../../../shared/pagination/pagination.component'; +import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; +import { getSuggestionPageRoute } from '../../../../suggestions-page/suggestions-page-routing-paths'; import { SuggestionsService } from '../../suggestions.service'; import { SuggestionTargetsStateService } from '../suggestion-targets.state.service'; diff --git a/src/app/notifications/suggestion-targets/selectors.ts b/src/app/notifications/suggestions/targets/selectors.ts similarity index 95% rename from src/app/notifications/suggestion-targets/selectors.ts rename to src/app/notifications/suggestions/targets/selectors.ts index f80e36788b..67f1bed035 100644 --- a/src/app/notifications/suggestion-targets/selectors.ts +++ b/src/app/notifications/suggestions/targets/selectors.ts @@ -4,12 +4,12 @@ import { MemoizedSelector, } from '@ngrx/store'; -import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; -import { subStateSelector } from '../../submission/selectors'; +import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; +import { subStateSelector } from '../../../submission/selectors'; import { suggestionNotificationsSelector, SuggestionNotificationsState, -} from '../notifications.reducer'; +} from '../../notifications.reducer'; import { SuggestionTargetEntry, SuggestionTargetState, diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.actions.ts b/src/app/notifications/suggestions/targets/suggestion-targets.actions.ts similarity index 97% rename from src/app/notifications/suggestion-targets/suggestion-targets.actions.ts rename to src/app/notifications/suggestions/targets/suggestion-targets.actions.ts index ee2009e144..8992944273 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.actions.ts +++ b/src/app/notifications/suggestions/targets/suggestion-targets.actions.ts @@ -1,8 +1,8 @@ /* eslint-disable max-classes-per-file */ import { Action } from '@ngrx/store'; -import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; -import { type } from '../../shared/ngrx/type'; +import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; +import { type } from '../../../shared/ngrx/type'; /** * For each action type in an action group, make a simple diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.effects.ts b/src/app/notifications/suggestions/targets/suggestion-targets.effects.ts similarity index 94% rename from src/app/notifications/suggestion-targets/suggestion-targets.effects.ts rename to src/app/notifications/suggestions/targets/suggestion-targets.effects.ts index 4a1b413872..d53dab1e51 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.effects.ts +++ b/src/app/notifications/suggestions/targets/suggestion-targets.effects.ts @@ -21,10 +21,10 @@ import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators'; import { AuthActionTypes, RetrieveAuthenticatedEpersonSuccessAction, -} from '../../core/auth/auth.actions'; -import { PaginatedList } from '../../core/data/paginated-list.model'; -import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; +} from '../../../core/auth/auth.actions'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { SuggestionsService } from '../suggestions.service'; import { AddTargetAction, diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.reducer.ts b/src/app/notifications/suggestions/targets/suggestion-targets.reducer.ts similarity index 97% rename from src/app/notifications/suggestion-targets/suggestion-targets.reducer.ts rename to src/app/notifications/suggestions/targets/suggestion-targets.reducer.ts index 74f8ec2f5c..c71f149675 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.reducer.ts +++ b/src/app/notifications/suggestions/targets/suggestion-targets.reducer.ts @@ -1,4 +1,4 @@ -import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; +import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; import { SuggestionTargetActionTypes, SuggestionTargetsActions, diff --git a/src/app/notifications/suggestion-targets/suggestion-targets.state.service.ts b/src/app/notifications/suggestions/targets/suggestion-targets.state.service.ts similarity index 96% rename from src/app/notifications/suggestion-targets/suggestion-targets.state.service.ts rename to src/app/notifications/suggestions/targets/suggestion-targets.state.service.ts index 413a3b82ea..c70929078f 100644 --- a/src/app/notifications/suggestion-targets/suggestion-targets.state.service.ts +++ b/src/app/notifications/suggestions/targets/suggestion-targets.state.service.ts @@ -6,8 +6,8 @@ import { import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { SuggestionTarget } from '../../core/notifications/suggestions/models/suggestion-target.model'; -import { SuggestionNotificationsState } from '../notifications.reducer'; +import { SuggestionTarget } from '../../../core/notifications/suggestions/models/suggestion-target.model'; +import { SuggestionNotificationsState } from '../../notifications.reducer'; import { getCurrentUserSuggestionTargetsSelector, getCurrentUserSuggestionTargetsVisitedSelector, diff --git a/src/app/profile-page/profile-page.component.spec.ts b/src/app/profile-page/profile-page.component.spec.ts index ebd3939432..ee2cec645d 100644 --- a/src/app/profile-page/profile-page.component.spec.ts +++ b/src/app/profile-page/profile-page.component.spec.ts @@ -29,7 +29,7 @@ import { AuthorizationDataService } from '../core/data/feature-authorization/aut import { EPersonDataService } from '../core/eperson/eperson-data.service'; import { EPerson } from '../core/eperson/models/eperson.model'; import { ConfigurationProperty } from '../core/shared/configuration-property.model'; -import { SuggestionsNotificationComponent } from '../notifications/suggestions-notification/suggestions-notification.component'; +import { SuggestionsNotificationComponent } from '../notifications/suggestions/notification/suggestions-notification.component'; import { ErrorComponent } from '../shared/error/error.component'; import { ThemedLoadingComponent } from '../shared/loading/themed-loading.component'; import { NotificationsService } from '../shared/notifications/notifications.service'; diff --git a/src/app/profile-page/profile-page.component.ts b/src/app/profile-page/profile-page.component.ts index 7799615bc6..7a198e34fa 100644 --- a/src/app/profile-page/profile-page.component.ts +++ b/src/app/profile-page/profile-page.component.ts @@ -40,7 +40,7 @@ import { getFirstCompletedRemoteData, getRemoteDataPayload, } from '../core/shared/operators'; -import { SuggestionsNotificationComponent } from '../notifications/suggestions-notification/suggestions-notification.component'; +import { SuggestionsNotificationComponent } from '../notifications/suggestions/notification/suggestions-notification.component'; import { hasValue, isNotEmpty, diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts index 4fa9ad9917..1f2763ba2c 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts @@ -9,7 +9,7 @@ import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { AdminNotificationsPublicationClaimPageComponent } from '../../admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component'; -import { PublicationClaimComponent } from '../../notifications/suggestion-targets/publication-claim/publication-claim.component'; +import { PublicationClaimComponent } from '../../notifications/suggestions/targets/publication-claim/publication-claim.component'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { NotificationsSuggestionTargetsPageComponent } from './notifications-suggestion-targets-page.component'; diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts index d545eb4e94..8af3c36cfd 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; -import { PublicationClaimComponent } from '../../notifications/suggestion-targets/publication-claim/publication-claim.component'; +import { PublicationClaimComponent } from '../../notifications/suggestions/targets/publication-claim/publication-claim.component'; @Component({ selector: 'ds-notifications-reciter-page', diff --git a/src/app/suggestions-page/suggestions-page.component.spec.ts b/src/app/suggestions-page/suggestions-page.component.spec.ts index 6c19405e94..a8c725f416 100644 --- a/src/app/suggestions-page/suggestions-page.component.spec.ts +++ b/src/app/suggestions-page/suggestions-page.component.spec.ts @@ -22,11 +22,11 @@ import { TestScheduler } from 'rxjs/testing'; import { AuthService } from '../core/auth/auth.service'; import { PaginationService } from '../core/pagination/pagination.service'; import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; -import { SuggestionApproveAndImport } from '../notifications/suggestion-list-element/suggestion-approve-and-import'; -import { SuggestionEvidencesComponent } from '../notifications/suggestion-list-element/suggestion-evidences/suggestion-evidences.component'; -import { SuggestionListElementComponent } from '../notifications/suggestion-list-element/suggestion-list-element.component'; -import { SuggestionTargetsStateService } from '../notifications/suggestion-targets/suggestion-targets.state.service'; -import { SuggestionsService } from '../notifications/suggestions.service'; +import { SuggestionApproveAndImport } from '../notifications/suggestions/list-element/suggestion-approve-and-import'; +import { SuggestionEvidencesComponent } from '../notifications/suggestions/list-element/suggestion-evidences/suggestion-evidences.component'; +import { SuggestionListElementComponent } from '../notifications/suggestions/list-element/suggestion-list-element.component'; +import { SuggestionsService } from '../notifications/suggestions/suggestions.service'; +import { SuggestionTargetsStateService } from '../notifications/suggestions/targets/suggestion-targets.state.service'; import { mockSuggestionPublicationOne, mockSuggestionPublicationTwo, diff --git a/src/app/suggestions-page/suggestions-page.component.ts b/src/app/suggestions-page/suggestions-page.component.ts index dfddc164c2..32b1212b0c 100644 --- a/src/app/suggestions-page/suggestions-page.component.ts +++ b/src/app/suggestions-page/suggestions-page.component.ts @@ -43,14 +43,14 @@ import { } from '../core/shared/operators'; import { WorkspaceItem } from '../core/submission/models/workspaceitem.model'; import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; -import { SuggestionActionsComponent } from '../notifications/suggestion-actions/suggestion-actions.component'; -import { SuggestionApproveAndImport } from '../notifications/suggestion-list-element/suggestion-approve-and-import'; -import { SuggestionListElementComponent } from '../notifications/suggestion-list-element/suggestion-list-element.component'; -import { SuggestionTargetsStateService } from '../notifications/suggestion-targets/suggestion-targets.state.service'; +import { SuggestionActionsComponent } from '../notifications/suggestions/actions/suggestion-actions.component'; +import { SuggestionApproveAndImport } from '../notifications/suggestions/list-element/suggestion-approve-and-import'; +import { SuggestionListElementComponent } from '../notifications/suggestions/list-element/suggestion-list-element.component'; import { SuggestionBulkResult, SuggestionsService, -} from '../notifications/suggestions.service'; +} from '../notifications/suggestions/suggestions.service'; +import { SuggestionTargetsStateService } from '../notifications/suggestions/targets/suggestion-targets.state.service'; import { AlertComponent } from '../shared/alert/alert.component'; import { ThemedLoadingComponent } from '../shared/loading/themed-loading.component'; import { NotificationsService } from '../shared/notifications/notifications.service'; diff --git a/src/themes/custom/app/home-page/home-page.component.ts b/src/themes/custom/app/home-page/home-page.component.ts index 0be74993f0..72fe1deeec 100644 --- a/src/themes/custom/app/home-page/home-page.component.ts +++ b/src/themes/custom/app/home-page/home-page.component.ts @@ -11,7 +11,7 @@ import { ThemedHomeNewsComponent } from '../../../../app/home-page/home-news/the import { HomePageComponent as BaseComponent } from '../../../../app/home-page/home-page.component'; import { RecentItemListComponent } from '../../../../app/home-page/recent-item-list/recent-item-list.component'; import { ThemedTopLevelCommunityListComponent } from '../../../../app/home-page/top-level-community-list/themed-top-level-community-list.component'; -import { SuggestionsPopupComponent } from '../../../../app/notifications/suggestions-popup/suggestions-popup.component'; +import { SuggestionsPopupComponent } from '../../../../app/notifications/suggestions/popup/suggestions-popup.component'; import { ThemedConfigurationSearchPageComponent } from '../../../../app/search-page/themed-configuration-search-page.component'; import { ThemedSearchFormComponent } from '../../../../app/shared/search-form/themed-search-form.component'; import { PageWithSidebarComponent } from '../../../../app/shared/sidebar/page-with-sidebar.component'; diff --git a/src/themes/custom/app/my-dspace-page/my-dspace-page.component.ts b/src/themes/custom/app/my-dspace-page/my-dspace-page.component.ts index 64d93c41b4..8e177886b5 100644 --- a/src/themes/custom/app/my-dspace-page/my-dspace-page.component.ts +++ b/src/themes/custom/app/my-dspace-page/my-dspace-page.component.ts @@ -11,7 +11,7 @@ import { import { MyDSpaceNewSubmissionComponent } from '../../../../app/my-dspace-page/my-dspace-new-submission/my-dspace-new-submission.component'; import { MyDSpacePageComponent as BaseComponent } from '../../../../app/my-dspace-page/my-dspace-page.component'; import { MyDspaceQaEventsNotificationsComponent } from '../../../../app/my-dspace-page/my-dspace-qa-events-notifications/my-dspace-qa-events-notifications.component'; -import { SuggestionsNotificationComponent } from '../../../../app/notifications/suggestions-notification/suggestions-notification.component'; +import { SuggestionsNotificationComponent } from '../../../../app/notifications/suggestions/notification/suggestions-notification.component'; import { pushInOut } from '../../../../app/shared/animations/push'; import { RoleDirective } from '../../../../app/shared/roles/role.directive'; import { ThemedSearchComponent } from '../../../../app/shared/search/themed-search.component'; diff --git a/src/themes/custom/app/profile-page/profile-page.component.ts b/src/themes/custom/app/profile-page/profile-page.component.ts index e5953f5ff2..9e3f5d3040 100644 --- a/src/themes/custom/app/profile-page/profile-page.component.ts +++ b/src/themes/custom/app/profile-page/profile-page.component.ts @@ -5,7 +5,7 @@ import { import { Component } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; -import { SuggestionsNotificationComponent } from '../../../../app/notifications/suggestions-notification/suggestions-notification.component'; +import { SuggestionsNotificationComponent } from '../../../../app/notifications/suggestions/notification/suggestions-notification.component'; import { ProfilePageComponent as BaseComponent } from '../../../../app/profile-page/profile-page.component'; import { ThemedProfilePageMetadataFormComponent } from '../../../../app/profile-page/profile-page-metadata-form/themed-profile-page-metadata-form.component'; import { ProfilePageResearcherFormComponent } from '../../../../app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component'; From 79c5d5a5605502cda831f909bd121ddd7d852dd2 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 13 Mar 2025 20:47:47 +0100 Subject: [PATCH 09/12] [CST-18016] Create a new page to list the suggestion sources --- ...ions-publication-claim-page.component.html | 2 +- ...s-publication-claim-page.component.spec.ts | 14 +- ...ations-publication-claim-page.component.ts | 6 +- .../admin-notifications-routes.ts | 22 +++- src/app/app.config.ts | 2 + ...ality-assurance-breadcrumb.service.spec.ts | 43 ------- ...ts => sources-breadcrumb.resolver.spec.ts} | 18 +-- ...lver.ts => sources-breadcrumb.resolver.ts} | 9 +- .../sources-breadcrumb.service.spec.ts | 60 +++++++++ ...rvice.ts => sources-breadcrumb.service.ts} | 13 +- .../sources/suggestion-sources.component.html | 14 ++ .../sources/suggestion-sources.component.scss | 0 .../suggestion-sources.component.spec.ts | 121 ++++++++++++++++++ .../sources/suggestion-sources.component.ts | 114 +++++++++++++++++ .../publication-claim.component.ts | 20 +-- .../notifications-pages-routes.ts | 6 +- ...ons-suggestion-targets-page.component.html | 2 +- ...-suggestion-targets-page.component.spec.ts | 12 +- ...tions-suggestion-targets-page.component.ts | 4 +- 19 files changed, 379 insertions(+), 103 deletions(-) delete mode 100644 src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts rename src/app/core/breadcrumbs/{quality-assurance-breadcrumb.resolver.spec.ts => sources-breadcrumb.resolver.spec.ts} (50%) rename src/app/core/breadcrumbs/{quality-assurance-breadcrumb.resolver.ts => sources-breadcrumb.resolver.ts} (65%) create mode 100644 src/app/core/breadcrumbs/sources-breadcrumb.service.spec.ts rename src/app/core/breadcrumbs/{quality-assurance-breadcrumb.service.ts => sources-breadcrumb.service.ts} (73%) create mode 100644 src/app/notifications/suggestions/sources/suggestion-sources.component.html create mode 100644 src/app/notifications/suggestions/sources/suggestion-sources.component.scss create mode 100644 src/app/notifications/suggestions/sources/suggestion-sources.component.spec.ts create mode 100644 src/app/notifications/suggestions/sources/suggestion-sources.component.ts diff --git a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.html b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.html index b04e7132f1..b1d88de988 100644 --- a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.html +++ b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.html @@ -1 +1 @@ - + diff --git a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts index ce8e846900..847910f447 100644 --- a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts +++ b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts @@ -6,8 +6,9 @@ import { waitForAsync, } from '@angular/core/testing'; import { TranslateModule } from '@ngx-translate/core'; +import { MockComponent } from 'ng-mocks'; -import { PublicationClaimComponent } from '../../../notifications/suggestion-targets/publication-claim/publication-claim.component'; +import { SuggestionSourcesComponent } from '../../../notifications/suggestions/sources/suggestion-sources.component'; import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page.component'; describe('AdminNotificationsPublicationClaimPageComponent', () => { @@ -20,17 +21,10 @@ describe('AdminNotificationsPublicationClaimPageComponent', () => { CommonModule, TranslateModule.forRoot(), AdminNotificationsPublicationClaimPageComponent, - ], - providers: [ - AdminNotificationsPublicationClaimPageComponent, + MockComponent(SuggestionSourcesComponent), ], schemas: [NO_ERRORS_SCHEMA], - }).overrideComponent(AdminNotificationsPublicationClaimPageComponent, { - remove: { - imports: [PublicationClaimComponent], - }, - }) - .compileComponents(); + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts index 24af9350ee..2e92125a56 100644 --- a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts +++ b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.ts @@ -1,14 +1,12 @@ import { Component } from '@angular/core'; -import { PublicationClaimComponent } from '../../../notifications/suggestion-targets/publication-claim/publication-claim.component'; +import { SuggestionSourcesComponent } from '../../../notifications/suggestions/sources/suggestion-sources.component'; @Component({ selector: 'ds-admin-notifications-publication-claim-page', templateUrl: './admin-notifications-publication-claim-page.component.html', styleUrls: ['./admin-notifications-publication-claim-page.component.scss'], - imports: [ - PublicationClaimComponent, - ], + imports: [ SuggestionSourcesComponent ], standalone: true, }) export class AdminNotificationsPublicationClaimPageComponent { diff --git a/src/app/admin/admin-notifications/admin-notifications-routes.ts b/src/app/admin/admin-notifications/admin-notifications-routes.ts index 43cfc2945a..309910d6bb 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routes.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routes.ts @@ -2,7 +2,8 @@ import { Route } from '@angular/router'; import { authenticatedGuard } from '../../core/auth/authenticated.guard'; import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; -import { qualityAssuranceBreadcrumbResolver } from '../../core/breadcrumbs/quality-assurance-breadcrumb.resolver'; +import { sourcesBreadcrumbResolver } from '../../core/breadcrumbs/sources-breadcrumb.resolver'; +import { PublicationClaimComponent } from '../../notifications/suggestions/targets/publication-claim/publication-claim.component'; import { AdminNotificationsPublicationClaimPageResolver } from '../../quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service'; import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component'; import { qualityAssuranceEventsPageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver'; @@ -33,13 +34,28 @@ export const ROUTES: Route[] = [ showBreadcrumbsFluid: false, }, }, + { + canActivate: [ authenticatedGuard ], + path: `${PUBLICATION_CLAIMS_PATH}/:sourceId`, + pathMatch: 'full', + component: PublicationClaimComponent, + resolve: { + breadcrumb: sourcesBreadcrumbResolver, + openaireQualityAssuranceEventsParams: AdminNotificationsPublicationClaimPageResolver, + }, + data: { + title: 'admin.notifications.publicationclaim.page.title', + breadcrumbKey: 'admin.notifications.publicationclaim', + showBreadcrumbsFluid: false, + }, + }, { canActivate: [authenticatedGuard], path: `${QUALITY_ASSURANCE_EDIT_PATH}/:sourceId`, component: QualityAssuranceTopicsPageComponent, pathMatch: 'full', resolve: { - breadcrumb: qualityAssuranceBreadcrumbResolver, + breadcrumb: sourcesBreadcrumbResolver, openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver, }, data: { @@ -85,7 +101,7 @@ export const ROUTES: Route[] = [ component: QualityAssuranceEventsPageComponent, pathMatch: 'full', resolve: { - breadcrumb: qualityAssuranceBreadcrumbResolver, + breadcrumb: sourcesBreadcrumbResolver, openaireQualityAssuranceEventsParams: qualityAssuranceEventsPageResolver, }, data: { diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 77b29206cb..a212c320f1 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -10,6 +10,7 @@ import { import { NoPreloading, provideRouter, + withComponentInputBinding, withEnabledBlockingInitialNavigation, withInMemoryScrolling, withPreloading, @@ -109,6 +110,7 @@ export const commonAppConfig: ApplicationConfig = { withInMemoryScrolling(APP_ROUTING_SCROLL_CONF), withEnabledBlockingInitialNavigation(), withPreloading(NoPreloading), + withComponentInputBinding(), ), { provide: APP_BASE_HREF, diff --git a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts b/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts deleted file mode 100644 index f8d30754ca..0000000000 --- a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - TestBed, - waitForAsync, -} from '@angular/core/testing'; -import { getTestScheduler } from 'jasmine-marbles'; - -import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; -import { QualityAssuranceBreadcrumbService } from './quality-assurance-breadcrumb.service'; - -describe('QualityAssuranceBreadcrumbService', () => { - let service: QualityAssuranceBreadcrumbService; - let translateService: any = { - instant: (str) => str, - }; - - let exampleString; - let exampleURL; - let exampleQaKey; - - function init() { - exampleString = 'sourceId'; - exampleURL = '/test/quality-assurance/'; - exampleQaKey = 'admin.quality-assurance.breadcrumbs'; - } - - beforeEach(waitForAsync(() => { - init(); - TestBed.configureTestingModule({}).compileComponents(); - })); - - beforeEach(() => { - service = new QualityAssuranceBreadcrumbService(translateService); - }); - - describe('getBreadcrumbs', () => { - it('should return a breadcrumb based on a string', () => { - const breadcrumbs = service.getBreadcrumbs(exampleString, exampleURL); - getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(exampleQaKey, exampleURL), - new Breadcrumb(exampleString, exampleURL + exampleString)], - }); - }); - }); -}); diff --git a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.spec.ts b/src/app/core/breadcrumbs/sources-breadcrumb.resolver.spec.ts similarity index 50% rename from src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.spec.ts rename to src/app/core/breadcrumbs/sources-breadcrumb.resolver.spec.ts index fe2fe77e7f..e0dde82def 100644 --- a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.spec.ts +++ b/src/app/core/breadcrumbs/sources-breadcrumb.resolver.spec.ts @@ -1,15 +1,17 @@ -import { qualityAssuranceBreadcrumbResolver } from './quality-assurance-breadcrumb.resolver'; +import { sourcesBreadcrumbResolver } from './sources-breadcrumb.resolver'; -describe('qualityAssuranceBreadcrumbResolver', () => { +describe('sourcesBreadcrumbResolver', () => { describe('resolve', () => { let resolver: any; - let qualityAssuranceBreadcrumbService: any; + let sourcesBreadcrumbService: any; let route: any; + const i18nKey = 'breadcrumbKey'; const fullPath = '/test/quality-assurance/'; - const expectedKey = 'testSourceId:testTopicId'; + const expectedKey = 'breadcrumbKey:testSourceId:testTopicId'; beforeEach(() => { route = { + data: { breadcrumbKey: i18nKey }, paramMap: { get: function (param) { return this[param]; @@ -18,13 +20,13 @@ describe('qualityAssuranceBreadcrumbResolver', () => { topicId: 'testTopicId', }, }; - qualityAssuranceBreadcrumbService = {}; - resolver = qualityAssuranceBreadcrumbResolver; + sourcesBreadcrumbService = {}; + resolver = sourcesBreadcrumbResolver; }); it('should resolve the breadcrumb config', () => { - const resolvedConfig = resolver(route as any, { url: fullPath + 'testSourceId' } as any, qualityAssuranceBreadcrumbService); - const expectedConfig = { provider: qualityAssuranceBreadcrumbService, key: expectedKey, url: fullPath }; + const resolvedConfig = resolver(route as any, { url: fullPath + 'testSourceId' } as any, sourcesBreadcrumbService); + const expectedConfig = { provider: sourcesBreadcrumbService, key: expectedKey, url: fullPath }; expect(resolvedConfig).toEqual(expectedConfig); }); }); diff --git a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/sources-breadcrumb.resolver.ts similarity index 65% rename from src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.ts rename to src/app/core/breadcrumbs/sources-breadcrumb.resolver.ts index 6507a75de6..253bed174c 100644 --- a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/sources-breadcrumb.resolver.ts @@ -6,16 +6,17 @@ import { } from '@angular/router'; import { BreadcrumbConfig } from '../../breadcrumbs/breadcrumb/breadcrumb-config.model'; -import { QualityAssuranceBreadcrumbService } from './quality-assurance-breadcrumb.service'; +import { SourcesBreadcrumbService } from './sources-breadcrumb.service'; -export const qualityAssuranceBreadcrumbResolver: ResolveFn> = ( +export const sourcesBreadcrumbResolver: ResolveFn> = ( route: ActivatedRouteSnapshot, state: RouterStateSnapshot, - breadcrumbService: QualityAssuranceBreadcrumbService = inject(QualityAssuranceBreadcrumbService), + breadcrumbService: SourcesBreadcrumbService = inject(SourcesBreadcrumbService), ): BreadcrumbConfig => { + const breadcrumbKey = route.data.breadcrumbKey; const sourceId = route.paramMap.get('sourceId'); const topicId = route.paramMap.get('topicId'); - let key = sourceId; + let key = `${breadcrumbKey}:${sourceId}`; if (topicId) { key += `:${topicId}`; diff --git a/src/app/core/breadcrumbs/sources-breadcrumb.service.spec.ts b/src/app/core/breadcrumbs/sources-breadcrumb.service.spec.ts new file mode 100644 index 0000000000..e4cdf523ce --- /dev/null +++ b/src/app/core/breadcrumbs/sources-breadcrumb.service.spec.ts @@ -0,0 +1,60 @@ +import { + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { getTestScheduler } from 'jasmine-marbles'; + +import { Breadcrumb } from '../../breadcrumbs/breadcrumb/breadcrumb.model'; +import { SourcesBreadcrumbService } from './sources-breadcrumb.service'; + +describe('SourcesBreadcrumbService', () => { + let service: SourcesBreadcrumbService; + let translateService: any = { + instant: (str) => str, + }; + + let exampleString; + let exampleSource; + let exampleTopic; + let exampleArg; + let exampleArgTopic; + let exampleURL; + let exampleQaKey; + + function init() { + exampleString = 'admin.quality-assurance'; + exampleSource = 'sourceId'; + exampleTopic = 'topic'; + exampleArg = `${exampleString}:${exampleSource}`; + exampleArgTopic = `${exampleString}:${exampleSource}:${exampleTopic}`; + exampleURL = '/test/quality-assurance/'; + exampleQaKey = 'admin.quality-assurance.breadcrumbs'; + } + + beforeEach(waitForAsync(() => { + init(); + TestBed.configureTestingModule({}).compileComponents(); + })); + + beforeEach(() => { + service = new SourcesBreadcrumbService(translateService); + }); + + describe('getBreadcrumbs', () => { + + it('should return a breadcrumb based on source only', () => { + const breadcrumbs = service.getBreadcrumbs(exampleArg, exampleURL); + getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(exampleQaKey, exampleURL), + new Breadcrumb(exampleSource, exampleURL + exampleSource)], + }); + }); + + it('should return a breadcrumb based also on topic', () => { + const breadcrumbs = service.getBreadcrumbs(exampleArgTopic, exampleURL); + getTestScheduler().expectObservable(breadcrumbs).toBe('(a|)', { a: [new Breadcrumb(exampleQaKey, exampleURL), + new Breadcrumb(exampleSource, exampleURL + exampleSource), + new Breadcrumb(exampleTopic, undefined)], + }); + }); + }); +}); diff --git a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts b/src/app/core/breadcrumbs/sources-breadcrumb.service.ts similarity index 73% rename from src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts rename to src/app/core/breadcrumbs/sources-breadcrumb.service.ts index 580a5e5f8e..71a9ae2a7d 100644 --- a/src/app/core/breadcrumbs/quality-assurance-breadcrumb.service.ts +++ b/src/app/core/breadcrumbs/sources-breadcrumb.service.ts @@ -14,9 +14,9 @@ import { BreadcrumbsProviderService } from './breadcrumbsProviderService'; @Injectable({ providedIn: 'root', }) -export class QualityAssuranceBreadcrumbService implements BreadcrumbsProviderService { +export class SourcesBreadcrumbService implements BreadcrumbsProviderService { - private QUALITY_ASSURANCE_BREADCRUMB_KEY = 'admin.quality-assurance.breadcrumbs'; + private BREADCRUMB_SUFFIX = '.breadcrumbs'; constructor( private translationService: TranslateService, ) { @@ -31,15 +31,16 @@ export class QualityAssuranceBreadcrumbService implements BreadcrumbsProviderSer */ getBreadcrumbs(key: string, url: string): Observable { const args = key.split(':'); - const sourceId = args[0]; - const topicId = args.length > 2 ? args[args.length - 1] : args[1]; + const breadcrumbKey = args[0] + this.BREADCRUMB_SUFFIX; + const sourceId = args[1]; + const topicId = args.length > 3 ? args[args.length - 1] : args[2]; if (topicId) { - return observableOf( [new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url), + return observableOf( [new Breadcrumb(this.translationService.instant(breadcrumbKey), url), new Breadcrumb(sourceId, `${url}${sourceId}`), new Breadcrumb(topicId, undefined)]); } else { - return observableOf([new Breadcrumb(this.translationService.instant(this.QUALITY_ASSURANCE_BREADCRUMB_KEY), url), + return observableOf([new Breadcrumb(this.translationService.instant(breadcrumbKey), url), new Breadcrumb(sourceId, `${url}${sourceId}`)]); } diff --git a/src/app/notifications/suggestions/sources/suggestion-sources.component.html b/src/app/notifications/suggestions/sources/suggestion-sources.component.html new file mode 100644 index 0000000000..cd5c25e4f0 --- /dev/null +++ b/src/app/notifications/suggestions/sources/suggestion-sources.component.html @@ -0,0 +1,14 @@ +
+
+
+

{{'quality-assurance.title'| translate}}

+ +
+
+ +
diff --git a/src/app/notifications/suggestions/sources/suggestion-sources.component.scss b/src/app/notifications/suggestions/sources/suggestion-sources.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/notifications/suggestions/sources/suggestion-sources.component.spec.ts b/src/app/notifications/suggestions/sources/suggestion-sources.component.spec.ts new file mode 100644 index 0000000000..4b33a904e8 --- /dev/null +++ b/src/app/notifications/suggestions/sources/suggestion-sources.component.spec.ts @@ -0,0 +1,121 @@ +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { + ActivatedRoute, + provideRouter, + Router, +} from '@angular/router'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; +import { Observable } from 'rxjs'; + +import { + buildPaginatedList, + PaginatedList, +} from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { SuggestionSource } from '../../../core/notifications/suggestions/models/suggestion-source.model'; +import { SuggestionSourceDataService } from '../../../core/notifications/suggestions/source/suggestion-source-data.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { AlertComponent } from '../../../shared/alert/alert.component'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import { TranslateLoaderMock } from '../../../shared/testing/translate-loader.mock'; +import { SourceListComponent } from '../../shared/source-list.component'; +import { SuggestionSourcesComponent } from './suggestion-sources.component'; + +describe('SuggestionSourcesComponent', () => { + let component: SuggestionSourcesComponent; + let fixture: ComponentFixture; + let mockPaginationService: PaginationServiceStub; + + const mockSources: any[] = [ + { id: 'source1', total: 5 }, + { id: 'source2', total: 10 }, + ]; + const pageInfo = new PageInfo({ + elementsPerPage: 5, + totalElements: 2, + totalPages: 1, + currentPage: 1, + }); + const mockPaginatedList: PaginatedList = buildPaginatedList(pageInfo, mockSources) ; + const mockPaginatedListRD: Observable>> = createSuccessfulRemoteDataObject$(mockPaginatedList) ; + const mockSuggestionSourceDataService: jasmine.SpyObj = jasmine.createSpyObj('SuggestionSourceDataService', { + 'getSources': jasmine.createSpy('getSources'), + }); + + beforeEach(waitForAsync(() => { + + mockPaginationService = new PaginationServiceStub(); + + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock, + }, + }), + SuggestionSourcesComponent, + ], + providers: [ + provideRouter([]), + { provide: SuggestionSourceDataService, useValue: mockSuggestionSourceDataService }, + { provide: PaginationService, useValue: mockPaginationService }, + ], + }).overrideComponent(SuggestionSourcesComponent, { + remove: { + imports: [ + AlertComponent, + SourceListComponent, + ], + }, + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + // Mock the suggestion source data service to return an empty list + mockSuggestionSourceDataService.getSources.and.returnValue(mockPaginatedListRD); + console.log(mockSuggestionSourceDataService); + fixture = TestBed.createComponent(SuggestionSourcesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + })); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should initialize with default pagination config', () => { + expect(component.paginationConfig.pageSize).toBe(10); + expect(component.paginationConfig.pageSizeOptions).toEqual([5, 10, 20, 40, 60]); + }); + + it('should load suggestion sources on init', () => { + expect(mockSuggestionSourceDataService.getSources).toHaveBeenCalled(); + expect(component.sources$.value).toEqual(mockSources); + expect(component.totalElements$.value).toBe(2); + }); + + it('should update loading status', () => { + expect(component.loading$.value).toEqual(false); + }); + + it('should navigate to the specified source on select', () => { + const router = TestBed.inject(Router); + const route = TestBed.inject(ActivatedRoute); + spyOn(router, 'navigate'); + + const sourceId = 'test-source-id'; + component.onSelect(sourceId); + + expect(router.navigate).toHaveBeenCalledWith([sourceId], { relativeTo: route }); + }); +}); diff --git a/src/app/notifications/suggestions/sources/suggestion-sources.component.ts b/src/app/notifications/suggestions/sources/suggestion-sources.component.ts new file mode 100644 index 0000000000..b6da20683a --- /dev/null +++ b/src/app/notifications/suggestions/sources/suggestion-sources.component.ts @@ -0,0 +1,114 @@ +import { AsyncPipe } from '@angular/common'; +import { Component } from '@angular/core'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { + ActivatedRoute, + Router, +} from '@angular/router'; +import { TranslatePipe } from '@ngx-translate/core'; +import { + BehaviorSubject, + Observable, +} from 'rxjs'; +import { + distinctUntilChanged, + map, + switchMap, + tap, +} from 'rxjs/operators'; + +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { SuggestionSource } from '../../../core/notifications/suggestions/models/suggestion-source.model'; +import { SuggestionSourceDataService } from '../../../core/notifications/suggestions/source/suggestion-source-data.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { AlertComponent } from '../../../shared/alert/alert.component'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { + SourceListComponent, + SourceObject, +} from '../../shared/source-list.component'; + +@Component({ + selector: 'ds-suggestion-sources', + standalone: true, + imports: [ + SourceListComponent, + AsyncPipe, + AlertComponent, + TranslatePipe, + ], + templateUrl: './suggestion-sources.component.html', + styleUrl: './suggestion-sources.component.scss', +}) +export class SuggestionSourcesComponent { + + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'sl', + pageSize: 10, + pageSizeOptions: [5, 10, 20, 40, 60], + }); + + /** + * Returns the information about the loading status of the suggestion sources. + */ + public loading$: BehaviorSubject = new BehaviorSubject(true); + + /** + * The suggestion source list. + */ + public sources$: BehaviorSubject = new BehaviorSubject([]); + + /** + * The total number of Quality Assurance sources. + */ + public totalElements$: BehaviorSubject = new BehaviorSubject(0); + + constructor( + protected paginationService: PaginationService, + protected router: Router, + protected route: ActivatedRoute, + protected suggestionSourceDataService: SuggestionSourceDataService) { + this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( + distinctUntilChanged(), + switchMap((options: PaginationComponentOptions) => { + return this.retrieveSuggestionsSources(options.currentPage, options.pageSize); + }), + takeUntilDestroyed(), + ).subscribe((results: Partial>) => { + console.log(results); + this.sources$.next(results.page); + this.totalElements$.next(results.pageInfo?.totalElements ?? 0); + this.loading$.next(false); + }); + } + + /** + * Navigate to the specified source + * @param sourceId + */ + onSelect(sourceId: string) { + this.router.navigate([sourceId], { relativeTo: this.route }); + } + + private retrieveSuggestionsSources(page: number, pageSize: number): Observable>> { + this.loading$.next(true); + const options = { + elementsPerPage: pageSize, + currentPage: page, + }; + + return this.suggestionSourceDataService.getSources(options).pipe( + getFirstCompletedRemoteData(), + tap(console.log), + map((result: RemoteData>) => { + return result.hasSucceeded ? result.payload : { page: [], pageInfo: null }; + }), + ); + } +} diff --git a/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.ts b/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.ts index eea76b2a4d..f3bebecc56 100644 --- a/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.ts +++ b/src/app/notifications/suggestions/targets/publication-claim/publication-claim.component.ts @@ -2,7 +2,7 @@ import { AsyncPipe } from '@angular/common'; import { AfterViewInit, Component, - Input, + input, OnDestroy, OnInit, } from '@angular/core'; @@ -51,14 +51,14 @@ export class PublicationClaimComponent implements AfterViewInit, OnDestroy, OnIn /** * The source for which to list targets */ - @Input() source = ''; + sourceId = input(); /** * The pagination system configuration for HTML listing. * @type {PaginationComponentOptions} */ public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { - id: 'stp_' + this.source, + id: 'stp_' + this.sourceId, pageSizeOptions: [5, 10, 20, 40, 60], }); @@ -95,8 +95,8 @@ export class PublicationClaimComponent implements AfterViewInit, OnDestroy, OnIn * Component initialization. */ ngOnInit(): void { - this.targets$ = this.suggestionTargetsStateService.getSuggestionTargets(this.source); - this.totalElements$ = this.suggestionTargetsStateService.getSuggestionTargetsTotals(this.source); + this.targets$ = this.suggestionTargetsStateService.getSuggestionTargets(this.sourceId()); + this.totalElements$ = this.suggestionTargetsStateService.getSuggestionTargetsTotals(this.sourceId()); } /** @@ -104,7 +104,7 @@ export class PublicationClaimComponent implements AfterViewInit, OnDestroy, OnIn */ ngAfterViewInit(): void { this.subs.push( - this.suggestionTargetsStateService.isSuggestionTargetsLoaded(this.source).pipe( + this.suggestionTargetsStateService.isSuggestionTargetsLoaded(this.sourceId()).pipe( take(1), ).subscribe(() => { this.getSuggestionTargets(); @@ -119,7 +119,7 @@ export class PublicationClaimComponent implements AfterViewInit, OnDestroy, OnIn * 'true' if the targets are loading, 'false' otherwise. */ public isTargetsLoading(): Observable { - return this.suggestionTargetsStateService.isSuggestionTargetsLoading(this.source); + return this.suggestionTargetsStateService.isSuggestionTargetsLoading(this.sourceId()); } /** @@ -129,7 +129,7 @@ export class PublicationClaimComponent implements AfterViewInit, OnDestroy, OnIn * 'true' if there are operations running on the targets (ex.: a REST call), 'false' otherwise. */ public isTargetsProcessing(): Observable { - return this.suggestionTargetsStateService.isSuggestionTargetsProcessing(this.source); + return this.suggestionTargetsStateService.isSuggestionTargetsProcessing(this.sourceId()); } /** @@ -146,7 +146,7 @@ export class PublicationClaimComponent implements AfterViewInit, OnDestroy, OnIn * Unsubscribe from all subscriptions. */ ngOnDestroy(): void { - this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction(this.source); + this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction(this.sourceId()); this.subs .filter((sub) => hasValue(sub)) .forEach((sub) => sub.unsubscribe()); @@ -161,7 +161,7 @@ export class PublicationClaimComponent implements AfterViewInit, OnDestroy, OnIn take(1), ).subscribe((options: PaginationComponentOptions) => { this.suggestionTargetsStateService.dispatchRetrieveSuggestionTargets( - this.source, + this.sourceId(), options.pageSize, options.currentPage, ); diff --git a/src/app/quality-assurance-notifications-pages/notifications-pages-routes.ts b/src/app/quality-assurance-notifications-pages/notifications-pages-routes.ts index 98f94692f9..c9cbb5ab0d 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-pages-routes.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-pages-routes.ts @@ -2,7 +2,7 @@ import { Route } from '@angular/router'; import { authenticatedGuard } from '../core/auth/authenticated.guard'; import { i18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; -import { qualityAssuranceBreadcrumbResolver } from '../core/breadcrumbs/quality-assurance-breadcrumb.resolver'; +import { sourcesBreadcrumbResolver } from '../core/breadcrumbs/sources-breadcrumb.resolver'; import { NOTIFICATIONS_RECITER_SUGGESTION_PATH, QUALITY_ASSURANCE_EDIT_PATH, @@ -39,7 +39,7 @@ export const ROUTES: Route[] = [ component: QualityAssuranceTopicsPageComponent, pathMatch: 'full', resolve: { - breadcrumb: qualityAssuranceBreadcrumbResolver, + breadcrumb: sourcesBreadcrumbResolver, openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver, }, data: { @@ -85,7 +85,7 @@ export const ROUTES: Route[] = [ component: QualityAssuranceEventsPageComponent, pathMatch: 'full', resolve: { - breadcrumb: qualityAssuranceBreadcrumbResolver, + breadcrumb: sourcesBreadcrumbResolver, openaireQualityAssuranceEventsParams: qualityAssuranceEventsPageResolver, }, data: { diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.html b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.html index b04e7132f1..b1d88de988 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.html +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.html @@ -1 +1 @@ - + diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts index 1f2763ba2c..38d2b1bffe 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts @@ -7,9 +7,10 @@ import { } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; +import { MockComponent } from 'ng-mocks'; import { AdminNotificationsPublicationClaimPageComponent } from '../../admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component'; -import { PublicationClaimComponent } from '../../notifications/suggestions/targets/publication-claim/publication-claim.component'; +import { SuggestionSourcesComponent } from '../../notifications/suggestions/sources/suggestion-sources.component'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { NotificationsSuggestionTargetsPageComponent } from './notifications-suggestion-targets-page.component'; @@ -23,19 +24,14 @@ describe('NotificationsSuggestionTargetsPageComponent', () => { CommonModule, TranslateModule.forRoot(), NotificationsSuggestionTargetsPageComponent, + MockComponent(SuggestionSourcesComponent), ], providers: [ AdminNotificationsPublicationClaimPageComponent, { provide: ActivatedRoute, useValue: new ActivatedRouteStub() }, ], schemas: [NO_ERRORS_SCHEMA], - }) - .overrideComponent(NotificationsSuggestionTargetsPageComponent, { - remove: { - imports: [PublicationClaimComponent], - }, - }) - .compileComponents(); + }).compileComponents(); })); beforeEach(() => { diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts index 8af3c36cfd..ae2496d00b 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.ts @@ -1,13 +1,13 @@ import { Component } from '@angular/core'; -import { PublicationClaimComponent } from '../../notifications/suggestions/targets/publication-claim/publication-claim.component'; +import { SuggestionSourcesComponent } from '../../notifications/suggestions/sources/suggestion-sources.component'; @Component({ selector: 'ds-notifications-reciter-page', templateUrl: './notifications-suggestion-targets-page.component.html', styleUrls: ['./notifications-suggestion-targets-page.component.scss'], imports: [ - PublicationClaimComponent, + SuggestionSourcesComponent, ], standalone: true, }) From cfe16892abd06d3f5cfe61f847c10c8d2f76a2da Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 14 Mar 2025 09:25:23 +0100 Subject: [PATCH 10/12] [CST-18016] Add i18n labels --- .../suggestions/sources/suggestion-sources.component.html | 4 ++-- src/assets/i18n/en.json5 | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/notifications/suggestions/sources/suggestion-sources.component.html b/src/app/notifications/suggestions/sources/suggestion-sources.component.html index cd5c25e4f0..6d4c1d7b33 100644 --- a/src/app/notifications/suggestions/sources/suggestion-sources.component.html +++ b/src/app/notifications/suggestions/sources/suggestion-sources.component.html @@ -1,8 +1,8 @@
-

{{'quality-assurance.title'| translate}}

- +

{{'publication-claim.title'| translate}}

+
Date: Fri, 14 Mar 2025 10:27:00 +0100 Subject: [PATCH 11/12] [CST-18016] Added missin label. --- src/assets/i18n/en.json5 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f86b62ea96..f35af691cd 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4088,6 +4088,8 @@ "suggestion.source.openaire": "OpenAIRE Graph", + "suggestion.source.openalex": "OpenAlex", + "suggestion.from.source": "from the ", "suggestion.count.missing": "You have no publication claims left", From 02516f22516ec208a4b2edf171b1405695eabc84 Mon Sep 17 00:00:00 2001 From: Adamo Date: Wed, 19 Mar 2025 01:23:19 +0100 Subject: [PATCH 12/12] [CST-18016] Added OpenAlex Search by DOI label --- src/assets/i18n/en.json5 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f35af691cd..2d7dfb2d33 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4878,6 +4878,8 @@ "submission.import-external.source.openalexPublicationByAuthorId": "OpenAlex Search by Author ID", + "submission.import-external.source.openalexPublicationByDOI": "OpenAlex Search by DOI", + "submission.import-external.source.openalexPerson": "OpenAlex Search by name", "submission.import-external.source.openalexJournal": "OpenAlex Journals",