Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | 5x 5x 5x 5x 5x 5x 5x 5x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x 1x 1x 1x 1x 1x 1x | import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
DestroyRef,
Injector,
Input,
OnChanges,
OnInit,
SimpleChange,
ViewChild,
ViewContainerRef,
inject,
} from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { ReplaySubject } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { CMSFacade } from 'ish-core/facades/cms.facade';
import { ContentPageletView } from 'ish-core/models/content-view/content-view.model';
import { whenTruthy } from 'ish-core/utils/operators';
import { CMSComponentProvider, CMS_COMPONENT } from 'ish-shared/cms/configurations/injection-keys';
import { CMSComponent } from 'ish-shared/cms/models/cms-component/cms-component.model';
/**
* The Content Pagelet Component renders the pagelet for the given 'pageletId'.
* For the rendering an Angular component is used that has to be provided
* for the DefinitionQualifiedName of the pagelet.
*
* @example
* <ish-content-pagelet [pageletId]="pagelet"></ish-content-pagelet>
*/
@Component({
selector: 'ish-content-pagelet',
templateUrl: './content-pagelet.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ContentPageletComponent implements OnChanges, OnInit {
/**
* The Id of the Pagelet that is to be rendered.
*/
@Input() pageletId: string;
@ViewChild('cmsOutlet', { read: ViewContainerRef, static: true }) cmsOutlet: ViewContainerRef;
private pageletId$ = new ReplaySubject<string>(1);
private destroyRef = inject(DestroyRef);
constructor(private injector: Injector, private cmsFacade: CMSFacade, private cdRef: ChangeDetectorRef) {}
ngOnInit() {
this.pageletId$
.pipe(
switchMap(pageletId => this.cmsFacade.pagelet$(pageletId)),
whenTruthy(),
takeUntilDestroyed(this.destroyRef)
)
.subscribe(pagelet => {
this.mapComponent(pagelet);
this.cdRef.markForCheck();
});
}
ngOnChanges() {
this.pageletId$.next(this.pageletId);
}
private mapComponent(pagelet: ContentPageletView) {
const components = this.injector.get<CMSComponentProvider[]>(CMS_COMPONENT, []);
const mappedComponent = components.find(c => c.definitionQualifiedName === pagelet.definitionQualifiedName);
if (mappedComponent) {
const componentRef = this.createComponent(mappedComponent);
this.initializeComponent(componentRef.instance, pagelet);
} else {
console.warn(`did not find mapping for ${pagelet.id} (${pagelet.definitionQualifiedName})`);
}
}
private createComponent(mappedComponent: CMSComponentProvider) {
this.cmsOutlet.clear();
return this.cmsOutlet.createComponent(mappedComponent.class);
}
private initializeComponent(instance: CMSComponent, pagelet: ContentPageletView) {
instance.pagelet = pagelet;
// OnChanges has to be manually invoked on dynamically created components
Iif (instance.ngOnChanges) {
instance.ngOnChanges({ pagelet: new SimpleChange(undefined, pagelet, true) });
}
}
}
|