Skip to content

Instantly share code, notes, and snippets.

@talamaska
Last active November 11, 2020 09:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save talamaska/ae5572d58d0e5cebcb32b23964ddb464 to your computer and use it in GitHub Desktop.
Save talamaska/ae5572d58d0e5cebcb32b23964ddb464 to your computer and use it in GitHub Desktop.
template modals
interface CustomOverlayConfig {
hasBackdropClick?: boolean;
isCentered?: boolean;
size?: any;
top?: string;
}
const DEFAULT_CUSTOM_CONFIG: CustomOverlayConfig = {
hasBackdropClick: false,
isCentered: true,
size: null
};
@Injectable()
export class TemplateModalService {
public dialogRef: TemplateModalOverlayRef;
public customConfig: CustomOverlayConfig;
constructor(
private injector: Injector,
private overlay: Overlay
) { }
open(templateRef: CdkPortal, config: FormModalConfig = {}, customConfig: CustomOverlayConfig = {}) {...}
public dialogRef: TemplateModalOverlayRef;
@ViewChild('ratingModal') ratingModal: TemplatePortal<any>;
public closeModal() {
this.dialogRef.close();
this.modalData.next({});
}
<ng-template cdkPortal #ratingModal="cdkPortal">
<rating-modal [modalData]="modalData | async" (close)="closeModal()" (ratings)="updateRating($event)" (rate)="rateEvent($event)"></rating-modal>
</ng-template>
this.dialogRef = this.modalService.open(this.ratingModal, {}, {
isCentered: false
});
import { OverlayRef } from '@angular/cdk/overlay';
export class TemplateModalOverlayRef {
constructor(private overlayRef: OverlayRef) { }
close(): void {
this.overlayRef.dispose();
}
}
private attachModalContainer(
overlayRef: OverlayRef,
config: FormModalConfig,
dialogRef: TemplateModalOverlayRef,
templateRef: CdkPortal // this was added
) {
const containerRef = overlayRef.attach(templateRef); // this was changed
return containerRef;
}
private getOverlayConfig(config: FormModalConfig): OverlayConfig {
let positionStrategy = this.overlay.position()
.global();
if (this.customConfig.isCentered) {
positionStrategy = positionStrategy
.centerHorizontally()
.centerVertically();
}
if (this.customConfig.size) {
positionStrategy = positionStrategy
.width(this.customConfig.size.width)
.height(this.customConfig.size.height);
}
if (this.customConfig.top) {
positionStrategy = positionStrategy
.top(this.customConfig.top)
.centerHorizontally();
}
@rjstalb
Copy link

rjstalb commented Oct 13, 2020

I'm also getting error 'there is no directive with exportAs set to cdkPortal'. I've made all of the adjustments, and I'm importing PortalModule. Was this every resolved?

@rjstalb
Copy link

rjstalb commented Oct 13, 2020

I'm also getting error 'there is no directive with exportAs set to cdkPortal'. I've made all of the adjustments, and I'm importing PortalModule. Was this every resolved?

Gotta love it - a minute after I submit this, I found my error. I was not, in fact, importing Portal Module in the correct dependent component module.

Anyway, thanks for the great tutorial!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment