ngx-modal-ease
Version:
ngx-modal-ease is a versatile Angular library providing a lightweight, simple, and performant modal. This library supports data communication between components, opening of multiple modals, custom animations, and a range of customisable options.
1 lines • 18.9 kB
Source Map (JSON)
{"version":3,"file":"ngx-modal-ease.mjs","sources":["../../../projects/ngx-modal-ease/src/lib/modal/modal.component.ts","../../../projects/ngx-modal-ease/src/lib/modal/modal.component.html","../../../projects/ngx-modal-ease/src/lib/modal/modal.service.ts","../../../projects/ngx-modal-ease/src/public-api.ts","../../../projects/ngx-modal-ease/src/ngx-modal-ease.ts"],"sourcesContent":["import {\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n OnInit,\r\n ComponentRef,\r\n} from '@angular/core';\r\n\r\nimport { ModalService } from './modal.service';\r\nimport { Options } from './modal-options';\r\n\r\n@Component({\r\n selector: 'app-modal',\r\n templateUrl: './modal.component.html',\r\n styleUrls: ['./modal.component.css'],\r\n imports: [],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class ModalComponent implements OnInit, AfterViewInit {\r\n @ViewChild('modal') modal!: ElementRef<HTMLDivElement>;\r\n @ViewChild('overlay') overlay!: ElementRef<HTMLDivElement>;\r\n options!: Options | undefined;\r\n modalLeaveAnimation = '';\r\n overlayLeaveAnimation = '';\r\n overlayClosed = false;\r\n modalClosed = false;\r\n layerLevel = 0;\r\n\r\n constructor(\r\n private modalService: ModalService,\r\n private element: ElementRef<HTMLElement>,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.options = this.modalService.options;\r\n this.modalService.modalInstances.push(this);\r\n this.modalService.layerLevel += 1;\r\n this.layerLevel = this.modalService.layerLevel;\r\n\r\n if (this.options?.actions?.escape === false) return;\r\n\r\n document.addEventListener('keydown', this.handleEscape);\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.addOptionsAndAnimations();\r\n }\r\n\r\n /**\r\n * Multiple modals might register multiple event listener, hence the 'layerLevel' variable and two times the condition check for the escape option.\r\n * Arrow function to respect the this instance.\r\n */\r\n private handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n if (this.options?.actions?.escape === false) return;\r\n\r\n if (this.layerLevel === this.modalService.layerLevel) {\r\n this.modalService.closedOnClickOrEscape = true;\r\n this.modalService.close();\r\n }\r\n }\r\n };\r\n\r\n onClose() {\r\n if (this.options?.actions?.click === false) return;\r\n this.modalService.closedOnClickOrEscape = true;\r\n this.modalService.close();\r\n }\r\n\r\n /**\r\n * Add options and animations\r\n * Apply user style and animations, listen to animation ends. Apply z-indexes on overlay and modal, with 1000 as incremental value.\r\n */\r\n private addOptionsAndAnimations() {\r\n this.modal.nativeElement.style.width = this.options?.size?.width || '';\r\n this.modal.nativeElement.style.maxWidth =\r\n this.options?.size?.maxWidth || '';\r\n this.modal.nativeElement.style.height = this.options?.size?.height || '';\r\n this.modal.nativeElement.style.maxHeight =\r\n this.options?.size?.maxHeight || '';\r\n this.modal.nativeElement.style.padding =\r\n this.options?.size?.padding || '0.5rem';\r\n\r\n const overlayZIndex = 1000 * this.modalService.modalInstances.length;\r\n this.overlay.nativeElement.style.zIndex = `${overlayZIndex}`;\r\n this.modal.nativeElement.style.zIndex = `${overlayZIndex + 1000}`;\r\n\r\n this.modalLeaveAnimation = this.options?.modal?.leave || '';\r\n this.overlayLeaveAnimation = this.options?.overlay?.leave || '';\r\n this.modal.nativeElement.style.animation = this.options?.modal?.enter || '';\r\n this.modal.nativeElement.style.top = this.options?.modal?.top || '50%';\r\n this.modal.nativeElement.style.left = this.options?.modal?.left || '50%';\r\n\r\n this.overlay.nativeElement.style.animation =\r\n this.options?.overlay?.enter || '';\r\n this.overlay.nativeElement.style.backgroundColor =\r\n this.options?.overlay?.backgroundColor || '';\r\n }\r\n\r\n private removeElementIfNotAnimated(\r\n element: HTMLDivElement,\r\n animation: string,\r\n ) {\r\n if (!animation) {\r\n element.remove();\r\n\r\n if (element.classList.contains('ngx-modal')) {\r\n this.modalClosed = true;\r\n } else {\r\n this.overlayClosed = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clean the DOM\r\n * Apply the leaving animations and clean the DOM. Three different use cases.\r\n * Last In First Out\r\n */\r\n close(userComponent: ComponentRef<any>) {\r\n this.modalService.layerLevel -= 1;\r\n\r\n this.modal.nativeElement.style.animation = this.modalLeaveAnimation;\r\n this.overlay.nativeElement.style.animation = this.overlayLeaveAnimation;\r\n document.removeEventListener('keydown', this.handleEscape);\r\n\r\n // First: no animations on both elements\r\n if (!this.modalLeaveAnimation && !this.overlayLeaveAnimation) {\r\n this.element.nativeElement.remove();\r\n userComponent.destroy();\r\n return;\r\n }\r\n\r\n // Second: 1/2 animated, remove directly element if not animated\r\n this.removeElementIfNotAnimated(\r\n this.modal.nativeElement,\r\n this.modalLeaveAnimation,\r\n );\r\n this.removeElementIfNotAnimated(\r\n this.overlay?.nativeElement,\r\n this.overlayLeaveAnimation,\r\n );\r\n\r\n // Third: Both animated with differents animation time, remove modal component as soon as last one ends\r\n this.modal.nativeElement.addEventListener('animationend', () => {\r\n this.modal.nativeElement.remove();\r\n this.modalClosed = true;\r\n this.removeModalComponent(userComponent);\r\n });\r\n this.overlay.nativeElement.addEventListener('animationend', () => {\r\n this.overlay.nativeElement.remove();\r\n this.overlayClosed = true;\r\n this.removeModalComponent(userComponent);\r\n });\r\n }\r\n\r\n /**\r\n * Remove modal when both animations come to an end.\r\n */\r\n private removeModalComponent(userComponent: ComponentRef<any>) {\r\n if (this.modalClosed && this.overlayClosed) {\r\n this.element.nativeElement.remove();\r\n userComponent.destroy();\r\n }\r\n }\r\n}\r\n","<div class=\"modal-container\">\n <section class=\"ngx-modal\" #modal>\n <ng-content></ng-content>\n </section>\n\n <div class=\"ngx-overlay\" #overlay (click)=\"onClose()\"></div>\n</div>\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n EnvironmentInjector,\r\n Inject,\r\n Injectable,\r\n PLATFORM_ID,\r\n Type,\r\n createComponent,\r\n} from '@angular/core';\r\nimport { ModalComponent } from './modal.component';\r\nimport { ModalResponse, Options } from './modal-options';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { PromiseModal } from './internal-interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ModalService {\r\n private libraryComponent!: ComponentRef<ModalComponent>;\r\n private userComponent!: ComponentRef<any>;\r\n /**\r\n * Internal use only.\r\n */\r\n options!: Options | undefined;\r\n /**\r\n * Internal use only.\r\n */\r\n modalInstances: ModalComponent[] = [];\r\n /**\r\n * Internal use only.\r\n */\r\n layerLevel = 0;\r\n /**\r\n * Internal use only.\r\n */\r\n closedOnClickOrEscape = false;\r\n private isBrowser = true;\r\n private promiseContainer: PromiseModal[] = [];\r\n\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: EnvironmentInjector,\r\n @Inject(PLATFORM_ID) platformId: Object\r\n ) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n }\r\n\r\n /**\r\n * Opens a custom component within a modal.\r\n * @param componentToCreate The custom component to display within the modal.\r\n * @param options Additional options for configuring the modal appearance and animations.\r\n * @returns A Promise that will emit custom data on closing the modal.\r\n * ```\r\n * this.modalService.open(ModalContentComponent, {\r\n * modal: {\r\n * enter: 'enter-scale-down 0.1s ease-out',\r\n * leave: 'fade-out 0.5s',\r\n * },\r\n * overlay: {\r\n * leave: 'fade-out 0.3s',\r\n * },\r\n * data: {\r\n * type: 'Angular modal library',\r\n * },\r\n * })\r\n * .then((dataFromComponent) => {\r\n * ...\r\n * });\r\n * ```\r\n */\r\n open<C>(componentToCreate: Type<C>, options?: Options) {\r\n this.options = options;\r\n this.openComponent(componentToCreate, options);\r\n\r\n return new Promise<ModalResponse>((resolve) => {\r\n if (!this.isBrowser) return;\r\n this.promiseContainer.push({\r\n resolve,\r\n userComponent: this.userComponent,\r\n libraryComponent: this.libraryComponent,\r\n });\r\n });\r\n }\r\n\r\n private openComponent<C>(componentToCreate: Type<C>, options?: Options) {\r\n if (!this.isBrowser) return;\r\n\r\n this.userComponent = createComponent(componentToCreate, {\r\n environmentInjector: this.injector,\r\n elementInjector: options?.injector,\r\n });\r\n\r\n this.libraryComponent = createComponent(ModalComponent, {\r\n environmentInjector: this.injector,\r\n projectableNodes: [[this.userComponent.location.nativeElement]],\r\n });\r\n\r\n this.instantiateProps(options?.data);\r\n\r\n this.appRef.attachView(this.userComponent.hostView);\r\n this.appRef.attachView(this.libraryComponent.hostView);\r\n document.body.appendChild(this.libraryComponent.location.nativeElement);\r\n }\r\n\r\n /**\r\n * Set user provided data into the component instance.\r\n */\r\n private instantiateProps(data: Options['data'] = {}) {\r\n for (const key of Object.keys(data)) {\r\n this.userComponent.instance[key] = data[key];\r\n }\r\n }\r\n\r\n /**\r\n * Close the current modal.\r\n * @param data The optional data to emit on closing the modal (communication from modal to caller).\r\n */\r\n close(data?: unknown) {\r\n if (this.promiseContainer.length === 0) return;\r\n\r\n const { userComponent, libraryComponent, resolve } =\r\n this.promiseContainer.pop()!;\r\n this.modalInstances.pop()?.close(userComponent);\r\n\r\n const response = {\r\n closedOnClickOrEscape: this.closedOnClickOrEscape,\r\n data,\r\n };\r\n\r\n this.closedOnClickOrEscape = false;\r\n this.appRef.detachView(userComponent.hostView);\r\n this.appRef.detachView(libraryComponent.hostView);\r\n\r\n return resolve(response);\r\n }\r\n\r\n /**\r\n * Close all modal instances.\r\n * Respective animations will be applied.\r\n */\r\n closeAll() {\r\n for (let i = this.modalInstances.length - 1; i > -1; i--) {\r\n this.close();\r\n }\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-modal-ease\r\n */\r\n\r\nexport * from './lib/modal/modal.service';\r\nexport * from './lib/modal/modal-options';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ModalService"],"mappings":"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"}