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?.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 @@
-
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 })),
],
})
/**