mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
74 lines
3.0 KiB
TypeScript
74 lines
3.0 KiB
TypeScript
import { Component, ComponentFactoryResolver, Input, OnInit, ViewChild } from '@angular/core';
|
|
import { MetadataRepresentation } from '../../core/shared/metadata-representation/metadata-representation.model';
|
|
import { getMetadataRepresentationComponent } from './metadata-representation.decorator';
|
|
import { Context } from '../../core/shared/context.model';
|
|
import { GenericConstructor } from '../../core/shared/generic-constructor';
|
|
import { MetadataRepresentationListElementComponent } from '../object-list/metadata-representation-list-element/metadata-representation-list-element.component';
|
|
import { MetadataRepresentationDirective } from './metadata-representation.directive';
|
|
import { hasValue } from '../empty.util';
|
|
import { ThemeService } from '../theme-support/theme.service';
|
|
|
|
@Component({
|
|
selector: 'ds-metadata-representation-loader',
|
|
// styleUrls: ['./metadata-representation-loader.component.scss'],
|
|
templateUrl: './metadata-representation-loader.component.html'
|
|
})
|
|
/**
|
|
* Component for determining what component to use depending on the item's entity type (dspace.entity.type), its metadata representation and, optionally, its context
|
|
*/
|
|
export class MetadataRepresentationLoaderComponent implements OnInit {
|
|
private componentRefInstance: MetadataRepresentationListElementComponent;
|
|
|
|
/**
|
|
* The item or metadata to determine the component for
|
|
*/
|
|
private _mdRepresentation: MetadataRepresentation;
|
|
get mdRepresentation(): MetadataRepresentation {
|
|
return this._mdRepresentation;
|
|
}
|
|
@Input() set mdRepresentation(nextValue: MetadataRepresentation) {
|
|
this._mdRepresentation = nextValue;
|
|
if (hasValue(this.componentRefInstance)) {
|
|
this.componentRefInstance.metadataRepresentation = nextValue;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The optional context
|
|
*/
|
|
@Input() context: Context;
|
|
|
|
/**
|
|
* Directive to determine where the dynamic child component is located
|
|
*/
|
|
@ViewChild(MetadataRepresentationDirective, {static: true}) mdRepDirective: MetadataRepresentationDirective;
|
|
|
|
constructor(
|
|
private componentFactoryResolver: ComponentFactoryResolver,
|
|
private themeService: ThemeService
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* Set up the dynamic child component
|
|
*/
|
|
ngOnInit(): void {
|
|
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent());
|
|
|
|
const viewContainerRef = this.mdRepDirective.viewContainerRef;
|
|
viewContainerRef.clear();
|
|
|
|
const componentRef = viewContainerRef.createComponent(componentFactory);
|
|
this.componentRefInstance = componentRef.instance as MetadataRepresentationListElementComponent;
|
|
this.componentRefInstance.metadataRepresentation = this.mdRepresentation;
|
|
}
|
|
|
|
/**
|
|
* Fetch the component depending on the item's entity type, metadata representation type and context
|
|
* @returns {string}
|
|
*/
|
|
private getComponent(): GenericConstructor<MetadataRepresentationListElementComponent> {
|
|
return getMetadataRepresentationComponent(this.mdRepresentation.itemType, this.mdRepresentation.representationType, this.context, this.themeService.getThemeName());
|
|
}
|
|
}
|