UNPKG

primeng

Version:

PrimeNG is an open source UI library for Angular featuring a rich set of 80+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeB

1,240 lines (1,231 loc) 50.3 kB
import * as i3 from '@angular/common'; import { isPlatformBrowser, CommonModule, DOCUMENT } from '@angular/common'; import * as i0 from '@angular/core'; import { Directive, Injectable, inject, ViewChild, SkipSelf, Optional, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule, createComponent, Inject } from '@angular/core'; import { uuid, setAttribute, addClass, removeClass, getOuterWidth, getOuterHeight, getViewport, hasClass, appendChild } from '@primeuix/utils'; import { animation, style, animate, trigger, transition, useAnimation } from '@angular/animations'; import { TranslationKeys, SharedModule } from 'primeng/api'; import { BaseComponent } from 'primeng/basecomponent'; import { Button } from 'primeng/button'; import { DomHandler } from 'primeng/dom'; import { FocusTrap } from 'primeng/focustrap'; import { WindowMaximizeIcon, WindowMinimizeIcon, TimesIcon } from 'primeng/icons'; import { ZIndexUtils } from 'primeng/utils'; import { DialogStyle } from 'primeng/dialog'; import { Subject } from 'rxjs'; class DynamicDialogContent { viewContainerRef; constructor(viewContainerRef) { this.viewContainerRef = viewContainerRef; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogContent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.5", type: DynamicDialogContent, isStandalone: true, selector: "[pDynamicDialogContent]", ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogContent, decorators: [{ type: Directive, args: [{ selector: '[pDynamicDialogContent]', standalone: true }] }], ctorParameters: () => [{ type: i0.ViewContainerRef }] }); class DynamicDialogStyle extends DialogStyle { name = 'dialog'; static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogStyle, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogStyle }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogStyle, decorators: [{ type: Injectable }] }); /** * * DynamicDialog is a container to display content in an overlay window. * * [Live Demo](https://www.primeng.org/dynamicdialog) * * @module dynamicdialogstyle * */ var DynamicDialogClasses; (function (DynamicDialogClasses) { /** * Class name of the mask element */ DynamicDialogClasses["mask"] = "p-dialog-mask"; /** * Class name of the root element */ DynamicDialogClasses["root"] = "p-dialog"; /** * Class name of the header element */ DynamicDialogClasses["header"] = "p-dialog-header"; /** * Class name of the title element */ DynamicDialogClasses["title"] = "p-dialog-title"; /** * Class name of the header actions element */ DynamicDialogClasses["headerActions"] = "p-dialog-header-actions"; /** * Class name of the maximize button element */ DynamicDialogClasses["pcMaximizeButton"] = "p-dialog-maximize-button"; /** * Class name of the close button element */ DynamicDialogClasses["pcCloseButton"] = "p-dialog-close-button"; /** * Class name of the content element */ DynamicDialogClasses["content"] = "p-dialog-content"; /** * Class name of the footer element */ DynamicDialogClasses["footer"] = "p-dialog-footer"; })(DynamicDialogClasses || (DynamicDialogClasses = {})); /** * Dialogs can be created dynamically with any component as the content using a DialogService. * @group Components */ class DynamicDialogConfig { /** * An object to pass to the component loaded inside the Dialog. * @group Props */ data; /** * An object to pass to the component loaded inside the Dialog. * @group Props */ inputValues; /** * Header text of the dialog. * @group Props */ header; /** * Identifies the element (or elements) that labels the element it is applied to. * @group Props */ ariaLabelledBy; /** * Footer text of the dialog. * @group Props */ footer; /** * Width of the dialog. * @group Props */ width; /** * Height of the dialog. * @group Props */ height; /** * Specifies if pressing escape key should hide the dialog. * @group Props */ closeOnEscape = false; /** * Specifies if autofocus should happen on show. * @group Props */ focusOnShow = true; /** * When enabled, can only focus on elements inside the dialog. * @group Props */ focusTrap = true; /** * Base zIndex value to use in layering. * @group Props */ baseZIndex; /** * Whether to re-enforce layering through applying zIndex. * @group Props */ autoZIndex = false; /** * Specifies if clicking the modal background should hide the dialog. * @group Props */ dismissableMask = false; /** * Inline style of the component. * @group Props */ rtl = false; /** * Inline style of the comopnent. * @group Props */ style; /** * Inline style of the content. * @group Props */ contentStyle; /** * Style class of the component. * @group Props */ styleClass; /** * Transition options of the animation. * @group Props */ transitionOptions; /** * Adds a close icon to the header to hide the dialog. * @group Props */ closable = false; /** * Whether to show the header or not. * @group Props */ showHeader = false; /** * Defines if background should be blocked when dialog is displayed. * @group Props */ modal = false; /** * Style class of the mask. * @group Props */ maskStyleClass; /** * Enables resizing of the content. * @group Props */ resizable = false; /** * Enables dragging to change the position using header. * @group Props */ draggable = false; /** * Keeps dialog in the viewport. * @group Props */ keepInViewport = false; /** * Minimum value for the left coordinate of dialog in dragging. * @group Props */ minX; /** * Minimum value for the top coordinate of dialog in dragging. * @group Props */ minY; /** * Whether the dialog can be displayed full screen. * @group Props */ maximizable = false; /** * Name of the maximize icon. * @group Props */ maximizeIcon; /** * Name of the minimize icon. * @group Props */ minimizeIcon; /** * Position of the dialog, options are "center", "top", "bottom", "left", "right", "top-left", "top-right", "bottom-left" or "bottom-right". * @group Props */ position; /** * Defines a string that labels the close button for accessibility. * @group Props */ closeAriaLabel; /** * Target element to attach the overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). * @group Props */ appendTo; /** * A boolean to determine if it can be duplicate. * @group Props */ duplicate = false; /** * Object literal to define widths per screen size. * @group Props */ breakpoints; /** * Dialog templates. * @group Props */ templates; } /** * Dynamic Dialog instance. * @group Components */ class DynamicDialogRef { constructor() { } /** * Closes dialog. * @group Method */ close(result) { this._onClose.next(result); setTimeout(() => { this._onClose.complete(); }, 1000); } /** * Destroys the dialog instance. * @group Method */ destroy() { this._onDestroy.next(null); } /** * Callback to invoke on drag start. * @param {MouseEvent} event - Mouse event. * @group Method */ dragStart(event) { this._onDragStart.next(event); } /** * Callback to invoke on drag end. * @param {MouseEvent} event - Mouse event. * @group Method */ dragEnd(event) { this._onDragEnd.next(event); } /** * Callback to invoke on resize start. * @param {MouseEvent} event - Mouse event. * @group Method */ resizeInit(event) { this._onResizeInit.next(event); } /** * Callback to invoke on resize start. * @param {MouseEvent} event - Mouse event. * @group Method */ resizeEnd(event) { this._onResizeEnd.next(event); } /** * Callback to invoke on dialog is maximized. * @param {*} value - Size value. * @group Method */ maximize(value) { this._onMaximize.next(value); } _onClose = new Subject(); /** * Event triggered on dialog is closed. * @group Events */ onClose = this._onClose.asObservable(); _onDestroy = new Subject(); /** * Event triggered on dialog instance is destroyed. * @group Events */ onDestroy = this._onDestroy.asObservable(); _onDragStart = new Subject(); /** * Event triggered on drag start. * @param {MouseEvent} event - Mouse event. * @group Events */ onDragStart = this._onDragStart.asObservable(); _onDragEnd = new Subject(); /** * Event triggered on drag end. * @param {MouseEvent} event - Mouse event. * @group Events */ onDragEnd = this._onDragEnd.asObservable(); _onResizeInit = new Subject(); /** * Event triggered on resize start. * @param {MouseEvent} event - Mouse event. * @group Events */ onResizeInit = this._onResizeInit.asObservable(); _onResizeEnd = new Subject(); /** * Event triggered on resize end. * @param {MouseEvent} event - Mouse event. * @group Events */ onResizeEnd = this._onResizeEnd.asObservable(); _onMaximize = new Subject(); /** * Event triggered on dialog is maximized. * @param {*} value - Size value. * @group Events */ onMaximize = this._onMaximize.asObservable(); /** * Event triggered on child component load. * @param {*} value - Chi. * @group Events */ onChildComponentLoaded = new Subject(); } const showAnimation = animation([style({ transform: '{{transform}}', opacity: 0 }), animate('{{transition}}', style({ transform: 'none', opacity: 1 }))]); const hideAnimation = animation([animate('{{transition}}', style({ transform: '{{transform}}', opacity: 0 }))]); class DynamicDialogComponent extends BaseComponent { renderer; ddconfig; dialogRef; zone; parentDialog; visible = true; componentRef; mask; resizing; dragging; maximized; _style = {}; originalStyle; lastPageX; lastPageY; ariaLabelledBy; id = uuid('pn_id_'); styleElement; insertionPoint; maskViewChild; contentViewChild; footerViewChild; headerViewChild; childComponentType; inputValues; container; wrapper; documentKeydownListener; documentEscapeListener; maskClickListener; transformOptions = 'scale(0.7)'; documentResizeListener; documentResizeEndListener; documentDragListener; documentDragEndListener; _componentStyle = inject(DynamicDialogStyle); get minX() { return this.ddconfig.minX ? this.ddconfig.minX : 0; } get minY() { return this.ddconfig.minY ? this.ddconfig.minY : 0; } get keepInViewport() { return this.ddconfig.keepInViewport; } get maximizable() { return this.ddconfig.maximizable; } get maximizeIcon() { return this.ddconfig.maximizeIcon; } get minimizeIcon() { return this.ddconfig.minimizeIcon; } get closable() { return this.ddconfig.closable; } get style() { return this._style; } get position() { return this.ddconfig.position; } get defaultCloseAriaLabel() { return this.config.getTranslation(TranslationKeys.ARIA)['close']; } set style(value) { if (value) { this._style = { ...value }; this.originalStyle = value; } } get parent() { const domElements = Array.from(this.document.getElementsByClassName('p-dialog')); if (domElements.length > 1) { return domElements.pop(); } } get parentContent() { const domElements = Array.from(this.document.getElementsByClassName('p-dialog')); if (domElements.length > 0) { const contentElements = domElements[domElements.length - 1].querySelector('.p-dialog-content'); if (contentElements) return Array.isArray(contentElements) ? contentElements[0] : contentElements; } } get header() { return this.ddconfig.header; } get data() { return this.ddconfig.data; } get breakpoints() { return this.ddconfig.breakpoints; } get footerTemplate() { return this.ddconfig?.templates?.footer; } get headerTemplate() { return this.ddconfig?.templates?.header; } get contentTemplate() { return this.ddconfig?.templates?.content; } get minimizeIconTemplate() { return this.ddconfig?.templates?.minimizeicon; } get maximizeIconTemplate() { return this.ddconfig?.templates?.maximizeicon; } get closeIconTemplate() { return this.ddconfig?.templates?.closeicon; } get maskClass() { const positions = ['left', 'right', 'top', 'topleft', 'topright', 'bottom', 'bottomleft', 'bottomright']; const pos = positions.find((item) => item === this.position); return { 'p-dialog-mask': true, 'p-overlay-mask p-overlay-mask-enter': this.ddconfig.modal || this.ddconfig.dismissableMask, [`p-dialog-${pos}`]: pos }; } get dialogId() { return this.attrSelector; } zIndexForLayering; constructor(renderer, ddconfig, dialogRef, zone, parentDialog) { super(); this.renderer = renderer; this.ddconfig = ddconfig; this.dialogRef = dialogRef; this.zone = zone; this.parentDialog = parentDialog; } ngOnInit() { super.ngOnInit(); if (this.breakpoints) { this.createStyle(); } } createStyle() { if (isPlatformBrowser(this.platformId)) { if (!this.styleElement) { this.styleElement = this.renderer.createElement('style'); this.styleElement.type = 'text/css'; this.renderer.appendChild(this.document.head, this.styleElement); let innerHTML = ''; for (let breakpoint in this.breakpoints) { innerHTML += ` @media screen and (max-width: ${breakpoint}) { .p-dialog[id=${this.dialogId}]:not(.p-dialog-maximized) { width: ${this.breakpoints[breakpoint]} !important; } } `; } this.renderer.setProperty(this.styleElement, 'innerHTML', innerHTML); setAttribute(this.styleElement, 'nonce', this.config?.csp()?.nonce); } } } destroyStyle() { if (this.styleElement) { this.renderer.removeChild(this.document.head, this.styleElement); this.styleElement = null; } } ngAfterViewInit() { super.ngAfterViewInit(); this.loadChildComponent(this.childComponentType); this.ariaLabelledBy = this.getAriaLabelledBy(); this.cd.detectChanges(); } getAriaLabelledBy() { return this.header !== null ? uuid('pn_id_') + '_header' : null; } loadChildComponent(componentType) { let viewContainerRef = this.insertionPoint?.viewContainerRef; viewContainerRef?.clear(); this.componentRef = viewContainerRef?.createComponent(componentType); if (this.inputValues) { Object.entries(this.inputValues).forEach(([key, value]) => { this.componentRef.setInput(key, value); }); } this.dialogRef.onChildComponentLoaded.next(this.componentRef.instance); } moveOnTop() { if (this.ddconfig.autoZIndex !== false) { ZIndexUtils.set('modal', this.container, (this.ddconfig.baseZIndex || 0) + this.config.zIndex.modal); this.wrapper.style.zIndex = String(parseInt(this.container.style.zIndex, 10) - 1); } else { this.zIndexForLayering = ZIndexUtils.generateZIndex('modal', (this.ddconfig.baseZIndex || 0) + this.config.zIndex.modal); } } onAnimationStart(event) { switch (event.toState) { case 'visible': this.container = event.element; this.wrapper = this.container.parentElement; this.moveOnTop(); if (this.parent) { this.unbindGlobalListeners(); } this.bindGlobalListeners(); this.container?.setAttribute(this.id, ''); if (this.ddconfig.modal !== false) { this.enableModality(); } if (this.ddconfig.focusOnShow !== false) { this.focus(); } break; case 'void': if (this.wrapper && this.ddconfig.modal !== false) { addClass(this.wrapper, 'p-overlay-mask-leave'); } break; } } onAnimationEnd(event) { if (event.toState === 'void') { if (this.parentContent) { this.focus(this.parentContent); } this.onContainerDestroy(); this.dialogRef.destroy(); } } onContainerDestroy() { this.unbindGlobalListeners(); if (this.container && this.ddconfig.autoZIndex !== false) { ZIndexUtils.clear(this.container); } if (this.zIndexForLayering) { ZIndexUtils.revertZIndex(this.zIndexForLayering); } if (this.ddconfig.modal !== false) { this.disableModality(); } this.container = null; } close() { this.visible = false; this.cd.markForCheck(); } hide() { if (this.dialogRef) { this.dialogRef.close(); } } enableModality() { if (this.ddconfig.dismissableMask) { this.maskClickListener = this.renderer.listen(this.wrapper, 'mousedown', (event) => { if (this.wrapper && this.wrapper.isSameNode(event.target)) { this.hide(); } }); } if (this.ddconfig.modal !== false) { addClass(this.document.body, 'p-overflow-hidden'); } } disableModality() { if (this.wrapper) { if (this.ddconfig.dismissableMask) { this.unbindMaskClickListener(); } if (this.ddconfig.modal !== false) { removeClass(this.document.body, 'p-overflow-hidden'); } if (!this.cd.destroyed) { this.cd.detectChanges(); } } } focus(focusParentElement = this.contentViewChild.nativeElement) { let focusable = DomHandler.getFocusableElement(focusParentElement, '[autofocus]'); if (focusable) { this.zone.runOutsideAngular(() => { setTimeout(() => focusable.focus(), 5); }); return; } const focusableElement = DomHandler.getFocusableElement(focusParentElement); if (focusableElement) { this.zone.runOutsideAngular(() => { setTimeout(() => focusableElement.focus(), 5); }); } else if (this.footerViewChild) { // If the content section is empty try to focus on footer this.focus(this.footerViewChild.nativeElement); } else if (!focusableElement && this.headerViewChild) { this.focus(this.headerViewChild.nativeElement); } } maximize() { this.maximized = !this.maximized; if (this.maximized) { addClass(this.document.body, 'p-overflow-hidden'); } else { removeClass(this.document.body, 'p-overflow-hidden'); } this.dialogRef.maximize({ maximized: this.maximized }); } initResize(event) { if (this.ddconfig.resizable) { if (!this.documentResizeListener) { this.bindDocumentResizeListeners(); } this.resizing = true; this.lastPageX = event.pageX; this.lastPageY = event.pageY; addClass(this.document.body, 'p-unselectable-text'); this.dialogRef.resizeInit(event); } } onResize(event) { if (this.resizing) { let deltaX = event.pageX - this.lastPageX; let deltaY = event.pageY - this.lastPageY; let containerWidth = getOuterWidth(this.container); let containerHeight = getOuterHeight(this.container); let contentHeight = getOuterHeight(this.contentViewChild.nativeElement); let newWidth = containerWidth + deltaX; let newHeight = containerHeight + deltaY; let minWidth = this.container.style.minWidth; let minHeight = this.container.style.minHeight; let offset = this.container.getBoundingClientRect(); let viewport = getViewport(); let hasBeenDragged = !parseInt(this.container.style.top) || !parseInt(this.container.style.left); if (hasBeenDragged) { newWidth += deltaX; newHeight += deltaY; } if ((!minWidth || newWidth > parseInt(minWidth)) && offset.left + newWidth < viewport.width) { this._style.width = newWidth + 'px'; this.container.style.width = this._style.width; } if ((!minHeight || newHeight > parseInt(minHeight)) && offset.top + newHeight < viewport.height) { this.contentViewChild.nativeElement.style.height = contentHeight + newHeight - containerHeight + 'px'; if (this._style.height) { this._style.height = newHeight + 'px'; this.container.style.height = this._style.height; } } this.lastPageX = event.pageX; this.lastPageY = event.pageY; } } resizeEnd(event) { if (this.resizing) { this.resizing = false; removeClass(this.document.body, 'p-unselectable-text'); this.dialogRef.resizeEnd(event); } } initDrag(event) { if (hasClass(event.target, 'p-dialog-header-icon') || hasClass(event.target.parentElement, 'p-dialog-header-icon')) { return; } if (this.ddconfig.draggable) { this.dragging = true; this.lastPageX = event.pageX; this.lastPageY = event.pageY; this.container.style.margin = '0'; addClass(this.document.body, 'p-unselectable-text'); this.dialogRef.dragStart(event); } } onDrag(event) { if (this.dragging) { let containerWidth = getOuterWidth(this.container); let containerHeight = getOuterHeight(this.container); let deltaX = event.pageX - this.lastPageX; let deltaY = event.pageY - this.lastPageY; let offset = this.container.getBoundingClientRect(); let leftPos = offset.left + deltaX; let topPos = offset.top + deltaY; let viewport = getViewport(); this.container.style.position = 'fixed'; if (this.keepInViewport) { if (leftPos >= this.minX && leftPos + containerWidth < viewport.width) { this._style.left = leftPos + 'px'; this.lastPageX = event.pageX; this.container.style.left = leftPos + 'px'; } if (topPos >= this.minY && topPos + containerHeight < viewport.height) { this._style.top = topPos + 'px'; this.lastPageY = event.pageY; this.container.style.top = topPos + 'px'; } } else { this.lastPageX = event.pageX; this.container.style.left = leftPos + 'px'; this.lastPageY = event.pageY; this.container.style.top = topPos + 'px'; } } } endDrag(event) { if (this.dragging) { this.dragging = false; removeClass(this.document.body, 'p-unselectable-text'); this.dialogRef.dragEnd(event); this.cd.detectChanges(); } } resetPosition() { this.container.style.position = ''; this.container.style.left = ''; this.container.style.top = ''; this.container.style.margin = ''; } bindDocumentDragListener() { if (isPlatformBrowser(this.platformId)) { this.zone.runOutsideAngular(() => { this.documentDragListener = this.renderer.listen(this.document, 'mousemove', this.onDrag.bind(this)); }); } } bindDocumentDragEndListener() { if (isPlatformBrowser(this.platformId)) { this.zone.runOutsideAngular(() => { this.documentDragEndListener = this.renderer.listen(this.document, 'mouseup', this.endDrag.bind(this)); }); } } unbindDocumentDragEndListener() { if (this.documentDragEndListener) { this.documentDragEndListener(); this.documentDragListener = null; } } unbindDocumentDragListener() { if (this.documentDragListener) { this.documentDragListener(); this.documentDragListener = null; } } bindDocumentResizeListeners() { if (isPlatformBrowser(this.platformId)) { this.zone.runOutsideAngular(() => { this.documentResizeListener = this.renderer.listen(this.document, 'mousemove', this.onResize.bind(this)); this.documentResizeEndListener = this.renderer.listen(this.document, 'mouseup', this.resizeEnd.bind(this)); }); } } unbindDocumentResizeListeners() { if (this.documentResizeListener && this.documentResizeEndListener) { this.documentResizeListener(); this.documentResizeEndListener(); this.documentResizeListener = null; this.documentResizeEndListener = null; } } bindGlobalListeners() { if (this.ddconfig.closeOnEscape !== false) { this.bindDocumentEscapeListener(); } if (this.ddconfig.resizable) { this.bindDocumentResizeListeners(); } if (this.ddconfig.draggable) { this.bindDocumentDragListener(); this.bindDocumentDragEndListener(); } } unbindGlobalListeners() { this.unbindDocumentEscapeListener(); this.unbindDocumentResizeListeners(); this.unbindDocumentDragListener(); this.unbindDocumentDragEndListener(); } bindDocumentEscapeListener() { const documentTarget = this.maskViewChild ? this.maskViewChild.nativeElement.ownerDocument : 'document'; this.documentEscapeListener = this.renderer.listen(documentTarget, 'keydown', (event) => { if (event.which == 27) { const currentZIndex = ZIndexUtils.getCurrent(); if (parseInt(this.container.style.zIndex) == currentZIndex || this.zIndexForLayering == currentZIndex) { this.hide(); } } }); } unbindDocumentEscapeListener() { if (this.documentEscapeListener) { this.documentEscapeListener(); this.documentEscapeListener = null; } } unbindMaskClickListener() { if (this.maskClickListener) { this.maskClickListener(); this.maskClickListener = null; } } ngOnDestroy() { this.onContainerDestroy(); if (this.componentRef) { this.componentRef.destroy(); } this.destroyStyle(); super.ngOnDestroy(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogComponent, deps: [{ token: i0.Renderer2 }, { token: DynamicDialogConfig }, { token: DynamicDialogRef }, { token: i0.NgZone }, { token: DynamicDialogComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: DynamicDialogComponent, isStandalone: true, selector: "p-dynamicDialog, p-dynamicdialog, p-dynamic-dialog", providers: [DynamicDialogStyle], viewQueries: [{ propertyName: "insertionPoint", first: true, predicate: DynamicDialogContent, descendants: true }, { propertyName: "maskViewChild", first: true, predicate: ["mask"], descendants: true }, { propertyName: "contentViewChild", first: true, predicate: ["content"], descendants: true }, { propertyName: "footerViewChild", first: true, predicate: ["footer"], descendants: true }, { propertyName: "headerViewChild", first: true, predicate: ["titlebar"], descendants: true }], usesInheritance: true, ngImport: i0, template: ` <div #mask [ngStyle]="{ position: 'fixed', height: '100%', width: '100%', left: 0, top: 0, display: 'flex', 'justify-content': position === 'left' || position === 'topleft' || position === 'bottomleft' ? 'flex-start' : position === 'right' || position === 'topright' || position === 'bottomright' ? 'flex-end' : 'center', 'align-items': position === 'top' || position === 'topleft' || position === 'topright' ? 'flex-start' : position === 'bottom' || position === 'bottomleft' || position === 'bottomright' ? 'flex-end' : 'center', 'pointer-events': ddconfig.modal ? 'auto' : 'none' }" [class]="ddconfig.maskStyleClass" [ngClass]="maskClass" > <div *ngIf="visible" #container [ngClass]="{ 'p-dialog p-component': true, 'p-dialog-maximized': maximizable && maximized }" [ngStyle]="{ display: 'flex', 'flex-direction': 'column', 'pointer-events': 'auto' }" [style]="ddconfig.style" [class]="ddconfig.styleClass" [@animation]="{ value: 'visible', params: { transform: transformOptions, transition: ddconfig.transitionOptions || '150ms cubic-bezier(0, 0, 0.2, 1)' } }" (@animation.start)="onAnimationStart($event)" (@animation.done)="onAnimationEnd($event)" role="dialog" pFocusTrap [pFocusTrapDisabled]="ddconfig.focusTrap === false" [style.width]="ddconfig.width" [style.height]="ddconfig.height" [attr.aria-labelledby]="ariaLabelledBy" [attr.aria-modal]="true" [attr.id]="dialogId" > <div *ngIf="ddconfig.resizable" [ngClass]="'p-resizable-handle'" style="z-index: 90;" (mousedown)="initResize($event)"></div> <div #titlebar [ngClass]="'p-dialog-header'" (mousedown)="initDrag($event)" *ngIf="ddconfig.showHeader !== false"> <ng-container *ngComponentOutlet="headerTemplate"></ng-container> <ng-container *ngIf="!headerTemplate"> <span [ngClass]="'p-dialog-title'" [id]="ariaLabelledBy">{{ ddconfig.header }}</span> <div [ngClass]="'p-dialog-header-actions'"> <p-button *ngIf="ddconfig.maximizable" [styleClass]="'p-dialog-maximize-button'" (onClick)="maximize()" (keydown.enter)="maximize()" rounded text [tabindex]="maximizable ? '0' : '-1'"> <ng-container *ngIf="!maximizeIcon"> <WindowMaximizeIcon *ngIf="!maximized && !maximizeIconTemplate" /> <WindowMinimizeIcon *ngIf="maximized && !minimizeIconTemplate" /> </ng-container> <ng-container *ngIf="!maximized"> <ng-template *ngTemplateOutlet="maximizeIconTemplate"></ng-template> </ng-container> <ng-container *ngIf="maximized"> <ng-template *ngTemplateOutlet="minimizeIconTemplate"></ng-template> </ng-container> </p-button> <p-button *ngIf="closable" [styleClass]="'p-dialog-close-button'" [ariaLabel]="ddconfig.closeAriaLabel || defaultCloseAriaLabel" (onClick)="hide()" (keydown.enter)="hide()" rounded text severity="secondary"> <ng-container *ngIf="!closeIconTemplate"> <TimesIcon /> </ng-container> <span *ngIf="closeIconTemplate"> <ng-template *ngTemplateOutlet="closeIconTemplate"></ng-template> </span> </p-button> </div> </ng-container> </div> <div #content [ngClass]="'p-dialog-content'" [ngStyle]="ddconfig.contentStyle"> <ng-template pDynamicDialogContent *ngIf="!contentTemplate"></ng-template> <ng-container *ngComponentOutlet="contentTemplate"></ng-container> </div> <div #footer [ngClass]="'p-dialog-footer'" *ngIf="ddconfig.footer || footerTemplate"> <ng-container *ngIf="!footerTemplate"> {{ ddconfig.footer }} </ng-container> <ng-container *ngComponentOutlet="footerTemplate"></ng-container> </div> </div> </div> `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: DynamicDialogContent, selector: "[pDynamicDialogContent]" }, { kind: "component", type: WindowMaximizeIcon, selector: "WindowMaximizeIcon" }, { kind: "component", type: WindowMinimizeIcon, selector: "WindowMinimizeIcon" }, { kind: "component", type: TimesIcon, selector: "TimesIcon" }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: FocusTrap, selector: "[pFocusTrap]", inputs: ["pFocusTrapDisabled"] }], animations: [trigger('animation', [transition('void => visible', [useAnimation(showAnimation)]), transition('visible => void', [useAnimation(hideAnimation)])])], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogComponent, decorators: [{ type: Component, args: [{ selector: 'p-dynamicDialog, p-dynamicdialog, p-dynamic-dialog', standalone: true, imports: [CommonModule, SharedModule, DynamicDialogContent, WindowMaximizeIcon, WindowMinimizeIcon, TimesIcon, Button, FocusTrap], template: ` <div #mask [ngStyle]="{ position: 'fixed', height: '100%', width: '100%', left: 0, top: 0, display: 'flex', 'justify-content': position === 'left' || position === 'topleft' || position === 'bottomleft' ? 'flex-start' : position === 'right' || position === 'topright' || position === 'bottomright' ? 'flex-end' : 'center', 'align-items': position === 'top' || position === 'topleft' || position === 'topright' ? 'flex-start' : position === 'bottom' || position === 'bottomleft' || position === 'bottomright' ? 'flex-end' : 'center', 'pointer-events': ddconfig.modal ? 'auto' : 'none' }" [class]="ddconfig.maskStyleClass" [ngClass]="maskClass" > <div *ngIf="visible" #container [ngClass]="{ 'p-dialog p-component': true, 'p-dialog-maximized': maximizable && maximized }" [ngStyle]="{ display: 'flex', 'flex-direction': 'column', 'pointer-events': 'auto' }" [style]="ddconfig.style" [class]="ddconfig.styleClass" [@animation]="{ value: 'visible', params: { transform: transformOptions, transition: ddconfig.transitionOptions || '150ms cubic-bezier(0, 0, 0.2, 1)' } }" (@animation.start)="onAnimationStart($event)" (@animation.done)="onAnimationEnd($event)" role="dialog" pFocusTrap [pFocusTrapDisabled]="ddconfig.focusTrap === false" [style.width]="ddconfig.width" [style.height]="ddconfig.height" [attr.aria-labelledby]="ariaLabelledBy" [attr.aria-modal]="true" [attr.id]="dialogId" > <div *ngIf="ddconfig.resizable" [ngClass]="'p-resizable-handle'" style="z-index: 90;" (mousedown)="initResize($event)"></div> <div #titlebar [ngClass]="'p-dialog-header'" (mousedown)="initDrag($event)" *ngIf="ddconfig.showHeader !== false"> <ng-container *ngComponentOutlet="headerTemplate"></ng-container> <ng-container *ngIf="!headerTemplate"> <span [ngClass]="'p-dialog-title'" [id]="ariaLabelledBy">{{ ddconfig.header }}</span> <div [ngClass]="'p-dialog-header-actions'"> <p-button *ngIf="ddconfig.maximizable" [styleClass]="'p-dialog-maximize-button'" (onClick)="maximize()" (keydown.enter)="maximize()" rounded text [tabindex]="maximizable ? '0' : '-1'"> <ng-container *ngIf="!maximizeIcon"> <WindowMaximizeIcon *ngIf="!maximized && !maximizeIconTemplate" /> <WindowMinimizeIcon *ngIf="maximized && !minimizeIconTemplate" /> </ng-container> <ng-container *ngIf="!maximized"> <ng-template *ngTemplateOutlet="maximizeIconTemplate"></ng-template> </ng-container> <ng-container *ngIf="maximized"> <ng-template *ngTemplateOutlet="minimizeIconTemplate"></ng-template> </ng-container> </p-button> <p-button *ngIf="closable" [styleClass]="'p-dialog-close-button'" [ariaLabel]="ddconfig.closeAriaLabel || defaultCloseAriaLabel" (onClick)="hide()" (keydown.enter)="hide()" rounded text severity="secondary"> <ng-container *ngIf="!closeIconTemplate"> <TimesIcon /> </ng-container> <span *ngIf="closeIconTemplate"> <ng-template *ngTemplateOutlet="closeIconTemplate"></ng-template> </span> </p-button> </div> </ng-container> </div> <div #content [ngClass]="'p-dialog-content'" [ngStyle]="ddconfig.contentStyle"> <ng-template pDynamicDialogContent *ngIf="!contentTemplate"></ng-template> <ng-container *ngComponentOutlet="contentTemplate"></ng-container> </div> <div #footer [ngClass]="'p-dialog-footer'" *ngIf="ddconfig.footer || footerTemplate"> <ng-container *ngIf="!footerTemplate"> {{ ddconfig.footer }} </ng-container> <ng-container *ngComponentOutlet="footerTemplate"></ng-container> </div> </div> </div> `, animations: [trigger('animation', [transition('void => visible', [useAnimation(showAnimation)]), transition('visible => void', [useAnimation(hideAnimation)])])], changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.None, providers: [DynamicDialogStyle] }] }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: DynamicDialogConfig }, { type: DynamicDialogRef }, { type: i0.NgZone }, { type: DynamicDialogComponent, decorators: [{ type: SkipSelf }, { type: Optional }] }], propDecorators: { insertionPoint: [{ type: ViewChild, args: [DynamicDialogContent] }], maskViewChild: [{ type: ViewChild, args: ['mask'] }], contentViewChild: [{ type: ViewChild, args: ['content'] }], footerViewChild: [{ type: ViewChild, args: ['footer'] }], headerViewChild: [{ type: ViewChild, args: ['titlebar'] }] } }); class DynamicDialogModule { static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogModule, imports: [DynamicDialogComponent, SharedModule], exports: [DynamicDialogComponent, SharedModule] }); static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogModule, imports: [DynamicDialogComponent, SharedModule, SharedModule] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicDialogModule, decorators: [{ type: NgModule, args: [{ imports: [DynamicDialogComponent, SharedModule], exports: [DynamicDialogComponent, SharedModule] }] }] }); class DynamicDialogInjector { _parentInjector; _additionalTokens; constructor(_parentInjector, _additionalTokens) { this._parentInjector = _parentInjector; this._additionalTokens = _additionalTokens; } get(token, notFoundValue, options) { const value = this._additionalTokens.get(token); if (value) return value; return this._parentInjector.get(token, notFoundValue); } } /** * Dynamic Dialog component methods. * @group Service */ class DialogService { appRef; injector; document; dialogComponentRefMap = new Map(); constructor(appRef, injector, document) { this.appRef = appRef; this.injector = injector; this.document = document; } /** * Displays the dialog using the dynamic dialog object options. * @param {*} componentType - Dynamic component for content template. * @param {DynamicDialogConfig} config - DynamicDialog object. * @returns {DynamicDialogRef} DynamicDialog instance. * @group Method */ open(componentType, config) { if (!this.duplicationPermission(componentType, config)) { return null; } const dialogRef = this.appendDialogComponentToBody(config, componentType); this.dialogComponentRefMap.get(dialogRef).instance.childComponentType = componentType; this.dialogComponentRefMap.get(dialogRef).instance.inputValues = config.inputValues; return dialogRef; } /** * Returns the dynamic dialog component instance. * @param {ref} DynamicDialogRef - DynamicDialog instance. * @group Method */ getInstance(ref) { return this.dialogComponentRefMap.get(ref).instance; } appendDialogComponentToBody(config, componentType) { const map = new WeakMap(); map.set(DynamicDialogConfig, config); const dialogRef = new DynamicDialogRef(); map.set(DynamicDialogRef, dialogRef); const sub = dialogRef.onClose.subscribe(() => { this.dialogComponentRefMap.get(dialogRef).instance.close(); }); const destroySub = dialogRef.onDestroy.subscribe(() => { this.removeDialogComponentFromBody(dialogRef); destroySub.unsubscribe(); sub.unsubscribe(); }); const componentRef = createComponent(DynamicDialogComponent, { environmentInjector: this.appRef.injector, elementInjector: new DynamicDialogInjector(this.injector, map) }); this.appRef.attachView(componentRef.hostView); const domElem = componentRef.hostView.rootNodes[0]; if (!config.appendTo || config.appendTo === 'body') { this.document.body.appendChild(domElem); } else { appendChild(config.appendTo, domElem); } this.dialogComponentRefMap.set(dialogRef, componentRef); return dialogRef; } removeDialogComponentFromBody(dialogRef) { if (!dialogRef || !this.dialogComponentRefMap.has(dialogRef)) { return; } const dialogComponentRef = this.dialogComponentRefMap.get(dialogRef); this.appRef.detachView(dialogComponentRef.hostView); dialogComponentRef.destroy(); dialogComponentRef.changeDetectorRef.detectChanges(); this.dialogComponentRefMap.delete(dialogRef); } duplicationPermission(componentType, config) { if (config.duplicate) { return true; } let permission = true; for (const [key, value] of this.dialogComponentRefMap) { if (value.instance.childComponentType === componentType) { permission = false; break; } } return permission; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DialogService, deps: [{ token: i0.ApplicationRef }, { token: i0.Injector }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DialogService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DialogService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i0.Injector }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }] }); /** * Generated bundle index. Do not edit. */ e