Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/app/core/shared/listable.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { SimpleItemComponent } from 'src/app/item-page/simple/item-types/simple-item/simple-item.component';

import { CollectionAdminSearchResultGridElementComponent } from '../../admin/admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component';
import { CommunityAdminSearchResultGridElementComponent } from '../../admin/admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component';
Expand Down Expand Up @@ -67,6 +68,7 @@ import { ItemPageDateFieldComponent } from '../../item-page/simple/field-compone
import { GenericItemPageFieldComponent } from '../../item-page/simple/field-components/specific-field/generic/generic-item-page-field.component';
import { ThemedItemPageTitleFieldComponent } from '../../item-page/simple/field-components/specific-field/title/themed-item-page-field.component';
import { ItemPageUriFieldComponent } from '../../item-page/simple/field-components/specific-field/uri/item-page-uri-field.component';
import { LearningObjectComponent } from '../../item-page/simple/item-types/learning-object/learning-object.component';
import { PublicationComponent } from '../../item-page/simple/item-types/publication/publication.component';
import { UntypedItemComponent } from '../../item-page/simple/item-types/untyped-item/untyped-item.component';
import { ThemedMetadataRepresentationListComponent } from '../../item-page/simple/metadata-representation-list/themed-metadata-representation-list.component';
Expand Down Expand Up @@ -207,6 +209,8 @@ const ENTRY_COMPONENTS = [
ItemSearchResultListElementSubmissionComponent,
PublicationComponent,
UntypedItemComponent,
LearningObjectComponent,
SimpleItemComponent,
];

@NgModule({
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<ds-metadata-field-wrapper [label]="label" [ngClass]="placeholderFontClass">
<ng-container *ngFor="let objectPage of objects; let i = index">
<ng-container *ngVar="(objectPage | async) as itemsRD">
<ds-listable-object-component-loader *ngFor="let item of itemsRD?.payload?.page" [object]="item"
[viewMode]="viewMode">
</ds-listable-object-component-loader>

<ds-loading
*ngIf="(i + 1) === objects.length && (itemsRD || i > 0) && !(itemsRD?.hasSucceeded && itemsRD?.payload && itemsRD?.payload?.page?.length > 0)"
message="{{ 'loading.default' | translate }}">
</ds-loading>

<div class="d-inline-block w-100 mt-2" *ngIf="(i + 1) === objects.length && itemsRD?.payload?.page?.length > 0">
<div *ngIf="itemsRD?.payload?.totalPages > objects.length" class="float-left" id="view-more">
<button class="btn btn-link btn-link-inline text-capitalize" (click)="increase()">
{{ 'item.page.related-items.view-more' | translate:{
amount: (itemsRD?.payload?.totalElements - (incrementBy * objects.length) < incrementBy) ?
itemsRD?.payload?.totalElements - (incrementBy * objects.length) : incrementBy } }} {{label}} </button>
</div>
<div *ngIf="objects.length > 1" class="float-right" id="view-less">
<button class="btn btn-link btn-link-inline text-capitalize" (click)="decrease()">
{{ 'item.page.related-items.view-less' | translate:{ amount: itemsRD?.payload?.page?.length } }} {{label}}
</button>
</div>
</div>
</ng-container>
</ng-container>
</ds-metadata-field-wrapper>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
:host ds-themed-thumbnail,
:host ds-thumbnail,
:host .thumbnail,
:host .img-placeholder {
display: none;
}

:host .list-content,
:host .content,
:host .media-body {
margin-left: 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import {
AsyncPipe,
isPlatformBrowser,
NgClass,
NgFor,
NgIf,
} from '@angular/common';
import {
Component,
ElementRef,
Inject,
Input,
OnInit,
PLATFORM_ID,
} from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import { Observable } from 'rxjs';

import {
APP_CONFIG,
AppConfig,
} from '../../../../config/app-config.interface';
import { FindListOptions } from '../../../core/data/find-list-options.model';
import { PaginatedList } from '../../../core/data/paginated-list.model';
import { RelationshipDataService } from '../../../core/data/relationship-data.service';
import { RemoteData } from '../../../core/data/remote-data';
import { Item } from '../../../core/shared/item.model';
import { ViewMode } from '../../../core/shared/view-mode.model';
import { ThemedLoadingComponent } from '../../../shared/loading/themed-loading.component';
import { MetadataFieldWrapperComponent } from '../../../shared/metadata-field-wrapper/metadata-field-wrapper.component';
import { ListableObjectComponentLoaderComponent } from '../../../shared/object-collection/shared/listable-object/listable-object-component-loader.component';
import { setPlaceHolderAttributes } from '../../../shared/utils/object-list-utils';
import { VarDirective } from '../../../shared/utils/var.directive';
import { AbstractIncrementalListComponent } from '../abstract-incremental-list/abstract-incremental-list.component';

@Component({
selector: 'ds-elte-related-items',
styleUrls: ['./elte-related-items.component.scss'],
templateUrl: './elte-related-items.component.html',
standalone: true,
imports: [
MetadataFieldWrapperComponent,
NgClass, NgFor, VarDirective,
ListableObjectComponentLoaderComponent,
NgIf, ThemedLoadingComponent, AsyncPipe, TranslateModule,
],
})
export class ElteRelatedItemsComponent
extends AbstractIncrementalListComponent<Observable<RemoteData<PaginatedList<Item>>>>
implements OnInit {

@Input() parentItem!: Item;

@Input() relationType!: string;

@Input() incrementBy = 5;

@Input() options = new FindListOptions();

@Input() label!: string;

viewMode = ViewMode.ListElement;

private readonly fetchThumbnail = false;

constructor(
public relationshipService: RelationshipDataService,
protected elementRef: ElementRef,
@Inject(APP_CONFIG) protected appConfig: AppConfig,
@Inject(PLATFORM_ID) private platformId: any,
) { super(); }

ngOnInit(): void {
if (isPlatformBrowser(this.platformId)) {
const width = this.elementRef.nativeElement.offsetWidth;
this.placeholderFontClass = setPlaceHolderAttributes(width);
} else {
this.placeholderFontClass = 'hide-placeholder-text';
}
super.ngOnInit();
}

getPage(page: number): Observable<RemoteData<PaginatedList<Item>>> {
return this.relationshipService.getRelatedItemsByLabel(
this.parentItem,
this.relationType,
Object.assign(this.options, {
elementsPerPage: this.incrementBy,
currentPage: page,
fetchThumbnail: this.fetchThumbnail,
}),
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<ds-results-back-button *ngIf="showBackButton$ | async" [back]="back"></ds-results-back-button>
<div class="row" *ngIf="iiifEnabled">
<div class="col-12">
<ds-mirador-viewer id="iiif-viewer" [object]="object" [searchable]="iiifSearchEnabled" [query]="iiifQuery$ | async">
</ds-mirador-viewer>
</div>
</div>
<div class="d-flex flex-row">
<ds-item-page-title-field [item]="object" class="mr-auto">
</ds-item-page-title-field>
<ds-dso-edit-menu></ds-dso-edit-menu>
</div>
<div class="row">
<div class="col-xs-12 col-md-4">
<ng-container *ngIf="!(mediaViewer.image || mediaViewer.video)">
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
</ds-metadata-field-wrapper>
</ng-container>
<div *ngIf="mediaViewer.image || mediaViewer.video" class="mb-2">
<ds-media-viewer [item]="object"></ds-media-viewer>
</div>
<ds-item-page-file-section [item]="object"></ds-item-page-file-section>
<ds-item-page-date-field [item]="object"></ds-item-page-date-field>
<ds-metadata-representation-list class="ds-item-page-mixed-author-field" [parentItem]="object" [itemType]="'Person'"
[metadataFields]="['dc.contributor.author']" [label]="'relationships.isAuthorOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list class="ds-item-page-mixed-author-field" [parentItem]="object" [itemType]="'Person'"
[metadataFields]="['dc.contributor.translator']" [label]="'relationships.isTranslatorOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list class="ds-item-page-mixed-author-field" [parentItem]="object" [itemType]="'Person'"
[metadataFields]="['dc.contributor.editor']" [label]="'relationships.isEditorOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list class="ds-item-page-mixed-author-field" [parentItem]="object" [itemType]="'Person'"
[metadataFields]="['dc.contributor.collector']" [label]="'relationships.isCollectorOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list class="ds-item-page-mixed-author-field" [parentItem]="object" [itemType]="'Person'"
[metadataFields]="['dc.contributor.selector']" [label]="'relationships.isSelectorOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list class="ds-item-page-mixed-author-field" [parentItem]="object" [itemType]="'Person'"
[metadataFields]="['dc.contributor.other']" [label]="'relationships.isContributorOfLearningObject' | translate">
</ds-metadata-representation-list>
</div>
<div class="col-xs-12 col-md-7">
<ds-generic-item-page-field [item]="object" [fields]="['dc.description']" [label]="'learningobject.description'">
</ds-generic-item-page-field>
<ds-generic-item-page-field [item]="object" [fields]="['dc.description.requirements']" [label]="'learningobject.description.requirements'">
</ds-generic-item-page-field>
<ds-item-page-uri-field [item]="object" [fields]="['dc.identifier.uri']" [label]="'item.page.uri'">
</ds-item-page-uri-field>
<ds-item-page-collections [item]="object"></ds-item-page-collections>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'EducationLevel'"
[metadataFields]="['education.educationlevel']" [label]="'relationships.isEducationLevelOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'Course'"
[metadataFields]="['education.course']" [label]="'relationships.isCourseOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'SchoolSubject'"
[metadataFields]="['education.schoolsubject']" [label]="'relationships.isSchoolSubjectOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'Type'"
[metadataFields]="['dc.type']" [label]="'relationships.isTypeOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'FieldOfScience'"
[metadataFields]="['education.fieldofscience']" [label]="'relationships.isFieldOfScienceOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'Format'"
[metadataFields]="['dc.format']" [label]="'relationships.isFormatOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'TeachingMethod'"
[metadataFields]="['education.teachingmethod']" [label]="'relationships.isTeachingMethodOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'License'"
[metadataFields]="['dc.rights.license']" [label]="'relationships.isLicenseOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-generic-item-page-field [item]="object" [fields]="['dc.rights']"
[label]="'learningobject.rights'">
</ds-generic-item-page-field>
<ds-generic-item-page-field [item]="object" [fields]="['education.recommended.collection']"
[label]="'learningobject.recommended.collection'">
</ds-generic-item-page-field>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'AccessLevel'"
[metadataFields]="['education.recommended.accesslevel']" [label]="'relationships.isRecommendedAccessLevelOfLO' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'AccessLevel'"
[metadataFields]="['education.accesslevel']" [label]="'relationships.isAccessLevelOfLearningObject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'Department'"
[metadataFields]="['education.downloadaccess']" [label]="'relationships.isDownloadPermissionOfLO' | translate">
</ds-metadata-representation-list>
<ds-generic-item-page-field [item]="object" [fields]="['education.note']" [label]="'learningobject.education.note'">
</ds-generic-item-page-field>
<ds-generic-item-page-field [item]="object" [fields]="['dc.subject']"
[separator]="', '" [label]="'item.page.subject'">
</ds-generic-item-page-field>
<ds-generic-item-page-field [item]="object" [fields]="['dc.format.isresponsive']" [label]="'learningobject.format.isresponsive'">
</ds-generic-item-page-field>
<ds-generic-item-page-field [item]="object" [fields]="['dc.format.isaccessible']" [label]="'learningobject.format.isaccessible'">
</ds-generic-item-page-field>
<ds-generic-item-page-field [item]="object" [fields]="['education.classification']" [label]="'learningobject.education.classification'">
</ds-generic-item-page-field>
<!--Field of Science record fields-->
<ds-metadata-representation-list [parentItem]="object" [itemType]="'FieldOfScience'"
[metadataFields]="['education.fieldofscience.parent']" [label]="'relationships.isParentOfFieldOfScience' | translate">
</ds-metadata-representation-list>
<!--School subject record fields-->
<ds-metadata-representation-list [parentItem]="object" [itemType]="'Faculty'"
[metadataFields]="['education.faculty']" [label]="'relationships.isFacultyOfSchoolSubject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'Department'"
[metadataFields]="['education.department']" [label]="'relationships.isDepartmentOfSchoolSubject' | translate">
</ds-metadata-representation-list>
<ds-metadata-representation-list [parentItem]="object" [itemType]="'Institute'"
[metadataFields]="['education.institute']" [label]="'relationships.isInstituteOfSchoolSubject' | translate">
</ds-metadata-representation-list>
<!--Course record fields-->
<ds-metadata-representation-list [parentItem]="object" [itemType]="'DoctoralSchool'"
[metadataFields]="['education.doctoralschool']" [label]="'relationships.isDoctoralSchoolOfCourse' | translate">
</ds-metadata-representation-list>
<div>
<a class="btn btn-outline-primary" role="button" [routerLink]="[itemPageRoute + '/full']" tabindex="0">
<i class="fas fa-info-circle"></i> {{"item.page.link.full" | translate}}
</a>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@import '../../../../../styles/variables.scss';
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
} from '@angular/core';
import { RouterLink } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';

import { ViewMode } from '../../../../core/shared/view-mode.model';
import { DsoEditMenuComponent } from '../../../../shared/dso-page/dso-edit-menu/dso-edit-menu.component';
import { MetadataFieldWrapperComponent } from '../../../../shared/metadata-field-wrapper/metadata-field-wrapper.component';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
import { ThemedResultsBackButtonComponent } from '../../../../shared/results-back-button/themed-results-back-button.component';
import { ThemedThumbnailComponent } from '../../../../thumbnail/themed-thumbnail.component';
import { CollectionsComponent } from '../../../field-components/collections/collections.component';
import { ThemedMediaViewerComponent } from '../../../media-viewer/themed-media-viewer.component';
import { MiradorViewerComponent } from '../../../mirador-viewer/mirador-viewer.component';
import { ElteRelatedItemsComponent } from '../../elte-related-items/elte-related-items.component';
import { ThemedFileSectionComponent } from '../../field-components/file-section/themed-file-section.component';
import { ItemPageAbstractFieldComponent } from '../../field-components/specific-field/abstract/item-page-abstract-field.component';
import { ItemPageDateFieldComponent } from '../../field-components/specific-field/date/item-page-date-field.component';
import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
import { ThemedItemPageTitleFieldComponent } from '../../field-components/specific-field/title/themed-item-page-field.component';
import { ItemPageUriFieldComponent } from '../../field-components/specific-field/uri/item-page-uri-field.component';
import { ThemedMetadataRepresentationListComponent } from '../../metadata-representation-list/themed-metadata-representation-list.component';
import { ItemComponent } from '../shared/item.component';

@listableObjectComponent('LearningObject', ViewMode.StandalonePage)
@listableObjectComponent('FieldOfScience', ViewMode.StandalonePage)
@listableObjectComponent('SchoolSubject', ViewMode.StandalonePage)
@listableObjectComponent('Course', ViewMode.StandalonePage)
@listableObjectComponent('Department', ViewMode.StandalonePage)
@listableObjectComponent('Institute', ViewMode.StandalonePage)
@listableObjectComponent('DoctoralSchool', ViewMode.StandalonePage)
@Component({
selector: 'ds-learning-object',
styleUrls: ['./learning-object.component.scss'],
templateUrl: './learning-object.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [NgIf, ThemedResultsBackButtonComponent, MiradorViewerComponent, ThemedItemPageTitleFieldComponent, DsoEditMenuComponent, MetadataFieldWrapperComponent, ThemedThumbnailComponent, ThemedMediaViewerComponent, ThemedFileSectionComponent, ItemPageDateFieldComponent, ThemedMetadataRepresentationListComponent, GenericItemPageFieldComponent, ElteRelatedItemsComponent, ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, CollectionsComponent, RouterLink, AsyncPipe, TranslateModule],
})
export class LearningObjectComponent extends ItemComponent {

}
Loading
Loading