diff --git a/src/themes/image-gallery/app/collection-page/collection-page.component.html b/src/themes/image-gallery/app/collection-page/collection-page.component.html index 9e74912aa24..9d0c8666d98 100644 --- a/src/themes/image-gallery/app/collection-page/collection-page.component.html +++ b/src/themes/image-gallery/app/collection-page/collection-page.component.html @@ -1,97 +1,107 @@
-
-
-
- -
-
- - - - +
+ @if (collectionRD?.hasSucceeded) { +
+ @if (collectionRD?.payload; as collection) { +
+
+
+ + + + + @if (logoRD$) { - - + + - - - - - - - - - - -
- -
-
+ } + + + + + + + + + +
+ +
+
- - + + - -
- - + + + + + + + @if (itemRD?.hasSucceeded) { +

{{'collection.page.browse.recent.head' | translate}}

+ [hideGear]="false" + [context]="'ItemPage'"> - -
- - - -
+
+ } + @if (itemRD?.hasFailed) { + + } + @if (!itemRD || itemRD.isLoading) { + + } + @if (!itemRD?.isLoading && itemRD?.payload?.page.length === 0) { + + } +
+ + +
-
- - - -
+ @if (collection.copyrightText) { +
+ + + +
+ } +
+ }
-
- - + } + @if (collectionRD?.hasFailed) { + + } + @if (collectionRD?.isLoading) { + + }
diff --git a/src/themes/image-gallery/app/collection-page/collection-page.component.scss b/src/themes/image-gallery/app/collection-page/collection-page.component.scss new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/themes/image-gallery/app/collection-page/collection-page.component.ts b/src/themes/image-gallery/app/collection-page/collection-page.component.ts index b8cc428b7ea..513cc3d2bb2 100644 --- a/src/themes/image-gallery/app/collection-page/collection-page.component.ts +++ b/src/themes/image-gallery/app/collection-page/collection-page.component.ts @@ -1,22 +1,146 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { AsyncPipe } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + Inject, + OnDestroy +} from '@angular/core'; +import { ActivatedRoute, Router, RouterOutlet } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { BehaviorSubject, combineLatest, map, Observable, startWith, Subject, switchMap } from 'rxjs'; import { CollectionPageComponent as BaseComponent } from '../../../../app/collection-page/collection-page.component'; +import { AuthService } from '../../../../app/core/auth/auth.service'; +import { DSONameService } from '../../../../app/core/breadcrumbs/dso-name.service'; +import { getBrowseLinksToFollow } from '../../../../app/core/browse/browse.service'; +import { SortDirection, SortOptions } from '../../../../app/core/cache/models/sort-options.model'; +import { AuthorizationDataService } from '../../../../app/core/data/feature-authorization/authorization-data.service'; +import { PaginatedList } from '../../../../app/core/data/paginated-list.model'; +import { RemoteData } from '../../../../app/core/data/remote-data'; +import { PaginationService } from '../../../../app/core/pagination/pagination.service'; +import { DSpaceObjectType } from '../../../../app/core/shared/dspace-object-type.model'; +import { Item } from '../../../../app/core/shared/item.model'; +import { getFirstSucceededRemoteData, toDSpaceObjectListRD } from '../../../../app/core/shared/operators'; +import { SearchService } from '../../../../app/core/shared/search/search.service'; import { fadeIn, fadeInOut } from '../../../../app/shared/animations/fade'; +import { ThemedComcolPageBrowseByComponent } from '../../../../app/shared/comcol/comcol-page-browse-by/themed-comcol-page-browse-by.component'; +import { ThemedComcolPageContentComponent } from '../../../../app/shared/comcol/comcol-page-content/themed-comcol-page-content.component'; +import { ThemedComcolPageHandleComponent } from '../../../../app/shared/comcol/comcol-page-handle/themed-comcol-page-handle.component'; +import { ComcolPageHeaderComponent } from '../../../../app/shared/comcol/comcol-page-header/comcol-page-header.component'; +import { ComcolPageLogoComponent } from '../../../../app/shared/comcol/comcol-page-logo/comcol-page-logo.component'; +import { DsoEditMenuComponent } from '../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { ErrorComponent } from '../../../../app/shared/error/error.component'; +import { ThemedLoadingComponent } from '../../../../app/shared/loading/themed-loading.component'; +import { ObjectGridComponent } from '../../../../app/shared/object-grid/object-grid.component'; +import { PaginationComponentOptions } from '../../../../app/shared/pagination/pagination-component-options.model'; +import { PaginatedSearchOptions } from '../../../../app/shared/search/models/paginated-search-options.model'; +import { VarDirective } from '../../../../app/shared/utils/var.directive'; +import { APP_CONFIG, AppConfig } from '../../../../config/app-config.interface'; +import { CommunityListComponent } from '../community-list-page/community-list/community-list.component'; @Component({ selector: 'ds-collection-page', - templateUrl: './collection-page.component.html', + // styleUrls: ['../../../../app/collection-page/collection-page.component.scss'], + styleUrls: ['./collection-page.component.scss'], // templateUrl: '../../../../app/collection-page/collection-page.component.html', - // styleUrls: ['./collection-page.component.scss'], - styleUrls: ['../../../../app/collection-page/collection-page.component.scss'], + templateUrl: './collection-page.component.html', changeDetection: ChangeDetectionStrategy.OnPush, animations: [ fadeIn, fadeInOut - ] + ], + imports: [ + AsyncPipe, + ComcolPageHeaderComponent, + ComcolPageLogoComponent, + CommunityListComponent, + DsoEditMenuComponent, + ErrorComponent, + ObjectGridComponent, + RouterOutlet, + ThemedComcolPageBrowseByComponent, + ThemedComcolPageContentComponent, + ThemedComcolPageHandleComponent, + ThemedLoadingComponent, + TranslateModule, + VarDirective, + ], + standalone: true, }) /** * This component represents a detail page for a single collection */ -export class CollectionPageComponent extends BaseComponent { +export class CollectionPageComponent extends BaseComponent implements OnDestroy { + + itemRD$: Observable>>; + + paginationConfig: PaginationComponentOptions; + + sortConfig: SortOptions; + + private paginationChanges$: Subject<{ + paginationConfig: PaginationComponentOptions, + sortConfig: SortOptions + }>; + + constructor( + private readonly searchService: SearchService, + private readonly paginationService: PaginationService, + route: ActivatedRoute, + router: Router, + authService: AuthService, + authorizationDataService: AuthorizationDataService, + public dsoNameService: DSONameService, + @Inject(APP_CONFIG) public appConfig: AppConfig, + ) { + super( + route, + router, + authService, + authorizationDataService, + dsoNameService + ); + + this.paginationConfig = Object.assign(new PaginationComponentOptions(), { + id: 'cp', + currentPage: 1, + pageSize: this.appConfig.browseBy.pageSize, + }); + + this.sortConfig = new SortOptions('dc.date.accessioned', SortDirection.DESC); + } + + ngOnInit(): void { + super.ngOnInit(); + + this.paginationChanges$ = new BehaviorSubject({ + paginationConfig: this.paginationConfig, + sortConfig: this.sortConfig + }); + + const currentPagination$ = this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig); + const currentSort$ = this.paginationService.getCurrentSort(this.paginationConfig.id, this.sortConfig); + + this.itemRD$ = combineLatest([currentPagination$, currentSort$]).pipe( + switchMap(([currentPagination, currentSort]) => this.collectionRD$.pipe( + getFirstSucceededRemoteData(), + map((rd) => rd.payload.id), + switchMap((id: string) => { + return this.searchService.search( + new PaginatedSearchOptions({ + scope: id, + pagination: currentPagination, + sort: currentSort, + dsoTypes: [DSpaceObjectType.ITEM] + }), null, true, true, ...getBrowseLinksToFollow()) + .pipe(toDSpaceObjectListRD()) as Observable>>; + }), + startWith(undefined) // Make sure switching pages shows loading component + ) + ) + ); + } + ngOnDestroy(): void { + this.paginationService.clearPagination(this.paginationConfig.id); + } } diff --git a/src/themes/image-gallery/app/community-list-page/community-list/community-list.component.ts b/src/themes/image-gallery/app/community-list-page/community-list/community-list.component.ts index 9c927075e0d..723f5616496 100644 --- a/src/themes/image-gallery/app/community-list-page/community-list/community-list.component.ts +++ b/src/themes/image-gallery/app/community-list-page/community-list/community-list.component.ts @@ -1,4 +1,11 @@ +import { CdkTreeModule } from '@angular/cdk/tree'; +import { AsyncPipe } from '@angular/common'; import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { ThemedLoadingComponent } from '../../../../../app/shared/loading/themed-loading.component'; +import { TruncatablePartComponent } from '../../../../../app/shared/truncatable/truncatable-part/truncatable-part.component'; +import { TruncatableComponent } from '../../../../../app/shared/truncatable/truncatable.component'; import { CommunityListComponent as BaseComponent } from '../../../../tamu/app/community-list-page/community-list/community-list.component'; /** @@ -10,9 +17,20 @@ import { CommunityListComponent as BaseComponent } from '../../../../tamu/app/co */ @Component({ selector: 'ds-community-list', + styleUrls: ['../../../../../app/community-list-page/community-list/community-list.component.scss'], // styleUrls: ['./community-list.component.scss'], - // templateUrl: './community-list.component.html' - templateUrl: '../../../../../app/community-list-page/community-list/community-list.component.html' + templateUrl: '../../../../../app/community-list-page/community-list/community-list.component.html', + // templateUrl: './community-list.component.html', + standalone: true, + imports: [ + AsyncPipe, + CdkTreeModule, + RouterLink, + ThemedLoadingComponent, + TranslateModule, + TruncatableComponent, + TruncatablePartComponent, + ], }) export class CommunityListComponent extends BaseComponent { diff --git a/src/themes/image-gallery/app/community-page/community-page.component.html b/src/themes/image-gallery/app/community-page/community-page.component.html index 9ee75f41178..ab80b0428bd 100644 --- a/src/themes/image-gallery/app/community-page/community-page.component.html +++ b/src/themes/image-gallery/app/community-page/community-page.component.html @@ -1,78 +1,87 @@
-
-
- -
-
- - - - - - - - - - - - - - - - - -
- -
-
- - - - + @if (communityRD?.hasSucceeded) { +
+ @if (communityRD?.payload; as communityPayload) { +
+
+
+ + + + @if (logoRD$) { + + + + + + } + + + + + + + + + +
+ +
+
+ + + - - - - + + + - - -
-

{{'collection.page.browse.recent.head' | translate}}

- - -
- - - -
- + + + @if (itemRD?.hasSucceeded) { +
+

{{'collection.page.browse.recent.head' | translate}}

+ + +
+ } + @if (itemRD?.hasFailed) { + + } + @if (!itemRD || itemRD.isLoading) { + + } + @if (!itemRD?.isLoading && itemRD?.payload?.page.length === 0) { + + } +
+ -
-
- - - -
+ +
+ @if (communityPayload.copyrightText) { +
+ + + +
+ } +
+ }
-
+ } - - + @if (communityRD?.hasFailed) { + + } + @if (communityRD?.isLoading) { + + } diff --git a/src/themes/image-gallery/app/community-page/community-page.component.scss b/src/themes/image-gallery/app/community-page/community-page.component.scss new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/themes/image-gallery/app/community-page/community-page.component.ts b/src/themes/image-gallery/app/community-page/community-page.component.ts index d14c3d07dff..ece1cb13119 100644 --- a/src/themes/image-gallery/app/community-page/community-page.component.ts +++ b/src/themes/image-gallery/app/community-page/community-page.component.ts @@ -1,69 +1,111 @@ -import { ChangeDetectionStrategy, Component, Inject, OnDestroy } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject, Observable, Subject, combineLatest as observableCombineLatest } from 'rxjs'; -import { map, startWith, switchMap } from 'rxjs/operators'; +import { AsyncPipe } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + Inject, + OnDestroy +} from '@angular/core'; +import { + ActivatedRoute, + Router, + RouterModule, + RouterOutlet, +} from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs'; +import { + map, + startWith, + switchMap +} from 'rxjs/operators'; import { CommunityPageComponent as BaseComponent } from '../../../../app/community-page/community-page.component'; import { AuthService } from '../../../../app/core/auth/auth.service'; import { DSONameService } from '../../../../app/core/breadcrumbs/dso-name.service'; -import { BROWSE_LINKS_TO_FOLLOW } from '../../../../app/core/browse/browse.service'; +import { getBrowseLinksToFollow } from '../../../../app/core/browse/browse.service'; import { SortDirection, SortOptions } from '../../../../app/core/cache/models/sort-options.model'; -import { CommunityDataService } from '../../../../app/core/data/community-data.service'; import { AuthorizationDataService } from '../../../../app/core/data/feature-authorization/authorization-data.service'; import { PaginatedList } from '../../../../app/core/data/paginated-list.model'; import { RemoteData } from '../../../../app/core/data/remote-data'; -import { MetadataService } from '../../../../app/core/metadata/metadata.service'; import { PaginationService } from '../../../../app/core/pagination/pagination.service'; import { DSpaceObjectType } from '../../../../app/core/shared/dspace-object-type.model'; import { Item } from '../../../../app/core/shared/item.model'; import { getFirstSucceededRemoteData, toDSpaceObjectListRD } from '../../../../app/core/shared/operators'; import { SearchService } from '../../../../app/core/shared/search/search.service'; import { fadeInOut } from '../../../../app/shared/animations/fade'; +import { ThemedComcolPageBrowseByComponent } from '../../../../app/shared/comcol/comcol-page-browse-by/themed-comcol-page-browse-by.component'; +import { ThemedComcolPageContentComponent } from '../../../../app/shared/comcol/comcol-page-content/themed-comcol-page-content.component'; +import { ThemedComcolPageHandleComponent } from '../../../../app/shared/comcol/comcol-page-handle/themed-comcol-page-handle.component'; +import { ComcolPageHeaderComponent } from '../../../../app/shared/comcol/comcol-page-header/comcol-page-header.component'; +import { ComcolPageLogoComponent } from '../../../../app/shared/comcol/comcol-page-logo/comcol-page-logo.component'; +import { DsoEditMenuComponent } from '../../../../app/shared/dso-page/dso-edit-menu/dso-edit-menu.component'; +import { ErrorComponent } from '../../../../app/shared/error/error.component'; +import { ThemedLoadingComponent } from '../../../../app/shared/loading/themed-loading.component'; +import { ObjectGridComponent } from '../../../../app/shared/object-grid/object-grid.component'; import { PaginationComponentOptions } from '../../../../app/shared/pagination/pagination-component-options.model'; import { PaginatedSearchOptions } from '../../../../app/shared/search/models/paginated-search-options.model'; +import { VarDirective } from '../../../../app/shared/utils/var.directive'; import { APP_CONFIG, AppConfig } from '../../../../config/app-config.interface'; +import { CommunityListComponent } from '../community-list-page/community-list/community-list.component'; @Component({ - selector: 'ds-community-page', + selector: 'ds-base-community-page', + styleUrls: ['./community-page.component.scss'], templateUrl: './community-page.component.html', - // templateUrl: '../../../../app/community-page/community-page.component.html', - // styleUrls: ['./community-page.component.scss'], - styleUrls: ['../../../../app/community-page/community-page.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - animations: [fadeInOut] + animations: [fadeInOut], + imports: [ + AsyncPipe, + ComcolPageHeaderComponent, + ComcolPageLogoComponent, + CommunityListComponent, + DsoEditMenuComponent, + ErrorComponent, + ObjectGridComponent, + RouterModule, + RouterOutlet, + ThemedComcolPageBrowseByComponent, + ThemedComcolPageContentComponent, + ThemedComcolPageHandleComponent, + ThemedLoadingComponent, + TranslateModule, + VarDirective, + ], + standalone: true, }) /** * This component represents a detail page for a single community */ export class CommunityPageComponent extends BaseComponent implements OnDestroy { + itemRD$: Observable>>; + paginationConfig: PaginationComponentOptions; + sortConfig: SortOptions; + private paginationChanges$: Subject<{ paginationConfig: PaginationComponentOptions, sortConfig: SortOptions }>; constructor( - private searchService: SearchService, - private paginationService: PaginationService, - communityDataService: CommunityDataService, - metadata: MetadataService, + private readonly searchService: SearchService, + private readonly paginationService: PaginationService, route: ActivatedRoute, router: Router, authService: AuthService, authorizationDataService: AuthorizationDataService, - dsoNameService: DSONameService, + public dsoNameService: DSONameService, @Inject(APP_CONFIG) public appConfig: AppConfig, ) { super( - communityDataService, - metadata, route, router, authService, authorizationDataService, dsoNameService ); + this.paginationConfig = Object.assign(new PaginationComponentOptions(), { id: 'cp', currentPage: 1, @@ -84,7 +126,7 @@ export class CommunityPageComponent extends BaseComponent implements OnDestroy { const currentPagination$ = this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig); const currentSort$ = this.paginationService.getCurrentSort(this.paginationConfig.id, this.sortConfig); - this.itemRD$ = observableCombineLatest([currentPagination$, currentSort$]).pipe( + this.itemRD$ = combineLatest([currentPagination$, currentSort$]).pipe( switchMap(([currentPagination, currentSort]) => this.communityRD$.pipe( getFirstSucceededRemoteData(), map((rd) => rd.payload.id), @@ -95,7 +137,7 @@ export class CommunityPageComponent extends BaseComponent implements OnDestroy { pagination: currentPagination, sort: currentSort, dsoTypes: [DSpaceObjectType.ITEM] - }), null, true, true, ...BROWSE_LINKS_TO_FOLLOW) + }), null, true, true, ...getBrowseLinksToFollow()) .pipe(toDSpaceObjectListRD()) as Observable>>; }), startWith(undefined) // Make sure switching pages shows loading component @@ -107,5 +149,4 @@ export class CommunityPageComponent extends BaseComponent implements OnDestroy { ngOnDestroy(): void { this.paginationService.clearPagination(this.paginationConfig.id); } - } diff --git a/src/themes/image-gallery/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.html b/src/themes/image-gallery/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.html index e068bc42e8b..c6c2b02d402 100644 --- a/src/themes/image-gallery/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.html +++ b/src/themes/image-gallery/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.html @@ -1,3 +1,4 @@ + -

- {{firstMetadataValue('dc.date.created')}} - - - - + } +
+ +

+ @if (dso.hasMetadata('dc.date.created')) { + {{firstMetadataValue('dc.date.created')}} + } + +
+ + diff --git a/src/themes/image-gallery/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts b/src/themes/image-gallery/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts index 98b8c2b0181..24e5881c1e9 100644 --- a/src/themes/image-gallery/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts +++ b/src/themes/image-gallery/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts @@ -1,10 +1,17 @@ +import { AsyncPipe } from '@angular/common'; import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; import { Context } from '../../../../../../../../app/core/shared/context.model'; import { ViewMode } from '../../../../../../../../app/core/shared/view-mode.model'; import { focusShadow } from '../../../../../../../../app/shared/animations/focus'; +import { ThemedBadgesComponent } from '../../../../../../../../app/shared/object-collection/shared/badges/themed-badges.component'; import { ItemSearchResult } from '../../../../../../../../app/shared/object-collection/shared/item-search-result.model'; import { listableObjectComponent } from '../../../../../../../../app/shared/object-collection/shared/listable-object/listable-object.decorator'; import { ItemSearchResultGridElementComponent as BaseComponent } from '../../../../../../../../app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component'; +import { TruncatablePartComponent } from '../../../../../../../../app/shared/truncatable/truncatable-part/truncatable-part.component'; +import { TruncatableComponent } from '../../../../../../../../app/shared/truncatable/truncatable.component'; +import { ThemedThumbnailComponent } from '../../../../../../../../app/thumbnail/themed-thumbnail.component'; @listableObjectComponent('PublicationSearchResult', ViewMode.GridElement, Context.Any, 'image-gallery') @listableObjectComponent(ItemSearchResult, ViewMode.GridElement, Context.Any, 'image-gallery') @@ -12,7 +19,17 @@ import { ItemSearchResultGridElementComponent as BaseComponent } from '../../../ selector: 'ds-item-search-result-grid-element-custom', styleUrls: ['./item-search-result-grid-element.component.scss'], templateUrl: './item-search-result-grid-element.component.html', - animations: [focusShadow] + animations: [focusShadow], + standalone: true, + imports: [ + AsyncPipe, + RouterLink, + ThemedBadgesComponent, + ThemedThumbnailComponent, + TranslateModule, + TruncatableComponent, + TruncatablePartComponent, + ], }) /** * The component for displaying a grid element for an item search result of the type Publication diff --git a/src/themes/image-gallery/eager-theme.module.ts b/src/themes/image-gallery/eager-theme.module.ts index 17c3bdc2953..f505c9aff0b 100644 --- a/src/themes/image-gallery/eager-theme.module.ts +++ b/src/themes/image-gallery/eager-theme.module.ts @@ -1,15 +1,8 @@ import { CdkTreeModule } from '@angular/cdk/tree'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { CommunityPageModule } from '../../app/community-page/community-page.module'; -import { NavbarModule } from '../../app/navbar/navbar.module'; + import { RootModule } from '../../app/root.module'; -import { SharedBrowseByModule } from '../../app/shared/browse-by/shared-browse-by.module'; -import { ComcolModule } from '../../app/shared/comcol/comcol.module'; -import { DsoPageModule } from '../../app/shared/dso-page/dso-page.module'; -import { ResultsBackButtonModule } from '../../app/shared/results-back-button/results-back-button.module'; -import { SharedModule } from '../../app/shared/shared.module'; -import { StatisticsModule } from '../../app/statistics/statistics.module'; import { CollectionPageComponent } from './app/collection-page/collection-page.component'; import { CommunityListComponent } from './app/community-list-page/community-list/community-list.component'; import { CommunityPageComponent } from './app/community-page/community-page.component'; @@ -20,35 +13,26 @@ import { ItemSearchResultGridElementComponent } from './app/shared/object-grid/s * Add components that use a custom decorator to ENTRY_COMPONENTS as well as DECLARATIONS. * This will ensure that decorator gets picked up when the app loads */ -const ENTRY_COMPONENTS = [ - CollectionPageComponent, - CommunityPageComponent, -]; +const ENTRY_COMPONENTS = []; const DECLARATIONS = [ ...ENTRY_COMPONENTS, + CollectionPageComponent, CommunityListComponent, + CommunityPageComponent, ItemGridElementComponent, ItemSearchResultGridElementComponent, ]; @NgModule({ imports: [ + CdkTreeModule, CommonModule, - SharedModule, - SharedBrowseByModule, - ResultsBackButtonModule, RootModule, - NavbarModule, - ComcolModule, - DsoPageModule, - StatisticsModule, - CommunityPageModule, - CdkTreeModule, + ...DECLARATIONS, ], - declarations: DECLARATIONS, providers: [ - ...ENTRY_COMPONENTS.map((component) => ({ provide: component })) + ...ENTRY_COMPONENTS.map((component) => ({ provide: component })), ], }) /**