UNPKG

primeng

Version:

[![npm version](https://badge.fury.io/js/primeng.svg)](https://badge.fury.io/js/primeng) [![npm downloads](https://img.shields.io/npm/dm/primeng.svg)](https://www.npmjs.com/package/primeng) [![Actions CI](https://github.com/primefaces/primeng/workflows/No

104 lines 15.7 kB
import { DomHandler } from 'primeng/dom'; import { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common'; import { Directive, ElementRef, Input, NgModule, inject, booleanAttribute, PLATFORM_ID } from '@angular/core'; import * as i0 from "@angular/core"; /** * Focus Trap keeps focus within a certain DOM element while tabbing. * @group Components */ export class FocusTrap { /** * When set as true, focus wouldn't be managed. * @group Props */ pFocusTrapDisabled = false; platformId = inject(PLATFORM_ID); host = inject(ElementRef); document = inject(DOCUMENT); firstHiddenFocusableElement; lastHiddenFocusableElement; ngOnInit() { if (isPlatformBrowser(this.platformId) && !this.pFocusTrapDisabled) { !this.firstHiddenFocusableElement && !this.lastHiddenFocusableElement && this.createHiddenFocusableElements(); } } ngOnChanges(changes) { if (changes.pFocusTrapDisabled && isPlatformBrowser(this.platformId)) { if (changes.pFocusTrapDisabled.currentValue) { this.removeHiddenFocusableElements(); } else { this.createHiddenFocusableElements(); } } } removeHiddenFocusableElements() { if (this.firstHiddenFocusableElement && this.firstHiddenFocusableElement.parentNode) { this.firstHiddenFocusableElement.parentNode.removeChild(this.firstHiddenFocusableElement); } if (this.lastHiddenFocusableElement && this.lastHiddenFocusableElement.parentNode) { this.lastHiddenFocusableElement.parentNode.removeChild(this.lastHiddenFocusableElement); } } getComputedSelector(selector) { return `:not(.p-hidden-focusable):not([data-p-hidden-focusable="true"])${selector ?? ''}`; } createHiddenFocusableElements() { const tabindex = '0'; const createFocusableElement = (onFocus) => { return DomHandler.createElement('span', { class: 'p-hidden-accessible p-hidden-focusable', tabindex, role: 'presentation', 'aria-hidden': true, 'data-p-hidden-accessible': true, 'data-p-hidden-focusable': true, onFocus: onFocus?.bind(this) }); }; this.firstHiddenFocusableElement = createFocusableElement(this.onFirstHiddenElementFocus); this.lastHiddenFocusableElement = createFocusableElement(this.onLastHiddenElementFocus); this.firstHiddenFocusableElement.setAttribute('data-pc-section', 'firstfocusableelement'); this.lastHiddenFocusableElement.setAttribute('data-pc-section', 'lastfocusableelement'); this.host.nativeElement.prepend(this.firstHiddenFocusableElement); this.host.nativeElement.append(this.lastHiddenFocusableElement); } onFirstHiddenElementFocus(event) { const { currentTarget, relatedTarget } = event; const focusableElement = relatedTarget === this.lastHiddenFocusableElement || !this.host.nativeElement?.contains(relatedTarget) ? DomHandler.getFirstFocusableElement(currentTarget.parentElement, ':not(.p-hidden-focusable)') : this.lastHiddenFocusableElement; DomHandler.focus(focusableElement); } onLastHiddenElementFocus(event) { const { currentTarget, relatedTarget } = event; const focusableElement = relatedTarget === this.firstHiddenFocusableElement || !this.host.nativeElement?.contains(relatedTarget) ? DomHandler.getLastFocusableElement(currentTarget.parentElement, ':not(.p-hidden-focusable)') : this.firstHiddenFocusableElement; DomHandler.focus(focusableElement); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FocusTrap, deps: [], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.0.1", type: FocusTrap, selector: "[pFocusTrap]", inputs: { pFocusTrapDisabled: ["pFocusTrapDisabled", "pFocusTrapDisabled", booleanAttribute] }, host: { classAttribute: "p-element" }, usesOnChanges: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FocusTrap, decorators: [{ type: Directive, args: [{ selector: '[pFocusTrap]', host: { class: 'p-element' } }] }], propDecorators: { pFocusTrapDisabled: [{ type: Input, args: [{ transform: booleanAttribute }] }] } }); export class FocusTrapModule { static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FocusTrapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.1", ngImport: i0, type: FocusTrapModule, declarations: [FocusTrap], imports: [CommonModule], exports: [FocusTrap] }); static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FocusTrapModule, imports: [CommonModule] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: FocusTrapModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule], exports: [FocusTrap], declarations: [FocusTrap] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2ZvY3VzdHJhcC9mb2N1c3RyYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBRTdIOzs7R0FHRztBQU9ILE1BQU0sT0FBTyxTQUFTO0lBQ2xCOzs7T0FHRztJQUNxQyxrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFFNUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVqQyxJQUFJLEdBQWUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXRDLFFBQVEsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFdEMsMkJBQTJCLENBQWU7SUFFMUMsMEJBQTBCLENBQWU7SUFFekMsUUFBUTtRQUNKLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDakUsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLElBQUksSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7UUFDbEgsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsa0JBQWtCLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbkUsSUFBSSxPQUFPLENBQUMsa0JB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SSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUU5TyxVQUFVLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsQ0FBQzt1R0FyRlEsU0FBUzsyRkFBVCxTQUFTLHVHQUtFLGdCQUFnQjs7MkZBTDNCLFNBQVM7a0JBTnJCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLElBQUksRUFBRTt3QkFDRixLQUFLLEVBQUUsV0FBVztxQkFDckI7aUJBQ0o7OEJBTTJDLGtCQUFrQjtzQkFBekQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTs7QUF3RjFDLE1BQU0sT0FBTyxlQUFlO3VHQUFmLGVBQWU7d0dBQWYsZUFBZSxpQkE3RmYsU0FBUyxhQXlGUixZQUFZLGFBekZiLFNBQVM7d0dBNkZULGVBQWUsWUFKZCxZQUFZOzsyRkFJYixlQUFlO2tCQUwzQixRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO29CQUNwQixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7aUJBQzVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRG9tSGFuZGxlciB9IGZyb20gJ3ByaW1lbmcvZG9tJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE5nTW9kdWxlLCBpbmplY3QsIGJvb2xlYW5BdHRyaWJ1dGUsIFBMQVRGT1JNX0lELCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogRm9jdXMgVHJhcCBrZWVwcyBmb2N1cyB3aXRoaW4gYSBjZXJ0YWluIERPTSBlbGVtZW50IHdoaWxlIHRhYmJpbmcuXG4gKiBAZ3JvdXAgQ29tcG9uZW50c1xuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1twRm9jdXNUcmFwXScsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ3AtZWxlbWVudCdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEZvY3VzVHJhcCB7XG4gICAgLyoqXG4gICAgICogV2hlbiBzZXQgYXMgdHJ1ZSwgZm9jdXMgd291bGRuJ3QgYmUgbWFuYWdlZC5cbiAgICAgKiBAZ3JvdXAgUHJvcHNcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcEZvY3VzVHJhcERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcblxuICAgIGhvc3Q6IEVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgICBkb2N1bWVudDogRG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gICAgZmlyc3RIaWRkZW5Gb2N1c2FibGVFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG5cbiAgICBsYXN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmICF0aGlzLnBGb2N1c1RyYXBEaXNhYmxlZCkge1xuICAgICAgICAgICAgIXRoaXMuZmlyc3RIaWRkZW5Gb2N1c2FibGVFbGVtZW50ICYmICF0aGlzLmxhc3RIaWRkZW5Gb2N1c2FibGVFbGVtZW50ICYmIHRoaXMuY3JlYXRlSGlkZGVuRm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMucEZvY3VzVHJhcERpc2FibGVkICYmIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLnBGb2N1c1RyYXBEaXNhYmxlZC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUhpZGRlbkZvY3VzYWJsZUVsZW1lbnRzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSGlkZGVuRm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUhpZGRlbkZvY3VzYWJsZUVsZW1lbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5maXJzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQgJiYgdGhpcy5maXJzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5maXJzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudCAmJiB0aGlzLmxhc3RIaWRkZW5Gb2N1c2FibGVFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmxhc3RIaWRkZW5Gb2N1c2FibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRDb21wdXRlZFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBgOm5vdCgucC1oaWRkZW4tZm9jdXNhYmxlKTpub3QoW2RhdGEtcC1oaWRkZW4tZm9jdXNhYmxlPVwidHJ1ZVwiXSkke3NlbGVjdG9yID8/ICcnfWA7XG4gICAgfVxuXG4gICAgY3JlYXRlSGlkZGVuRm9jdXNhYmxlRWxlbWVudHMoKSB7XG4gICAgICAgIGNvbnN0IHRhYmluZGV4ID0gJzAnO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZUZvY3VzYWJsZUVsZW1lbnQgPSAob25Gb2N1cykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIERvbUhhbmRsZXIuY3JlYXRlRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogJ3AtaGlkZGVuLWFjY2Vzc2libGUgcC1oaWRkZW4tZm9jdXNhYmxlJyxcbiAgICAgICAgICAgICAgICB0YWJpbmRleCxcbiAgICAgICAgICAgICAgICByb2xlOiAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgICAgICAgICAnYXJpYS1oaWRkZW4nOiB0cnVlLFxuICAgICAgICAgICAgICAgICdkYXRhLXAtaGlkZGVuLWFjY2Vzc2libGUnOiB0cnVlLFxuICAgICAgICAgICAgICAgICdkYXRhLXAtaGlkZGVuLWZvY3VzYWJsZSc6IHRydWUsXG4gICAgICAgICAgICAgICAgb25Gb2N1czogb25Gb2N1cz8uYmluZCh0aGlzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5maXJzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQgPSBjcmVhdGVGb2N1c2FibGVFbGVtZW50KHRoaXMub25GaXJzdEhpZGRlbkVsZW1lbnRGb2N1cyk7XG4gICAgICAgIHRoaXMubGFzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQgPSBjcmVhdGVGb2N1c2FibGVFbGVtZW50KHRoaXMub25MYXN0SGlkZGVuRWxlbWVudEZvY3VzKTtcblxuICAgICAgICB0aGlzLmZpcnN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGMtc2VjdGlvbicsICdmaXJzdGZvY3VzYWJsZWVsZW1lbnQnKTtcbiAgICAgICAgdGhpcy5sYXN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGMtc2VjdGlvbicsICdsYXN0Zm9jdXNhYmxlZWxlbWVudCcpO1xuXG4gICAgICAgIHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnByZXBlbmQodGhpcy5maXJzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5hcHBlbmQodGhpcy5sYXN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25GaXJzdEhpZGRlbkVsZW1lbnRGb2N1cyhldmVudCkge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQsIHJlbGF0ZWRUYXJnZXQgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50ID1cbiAgICAgICAgICAgIHJlbGF0ZWRUYXJnZXQgPT09IHRoaXMubGFzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQgfHwgIXRoaXMuaG9zdC5uYXRpdmVFbGVtZW50Py5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSA/IERvbUhhbmRsZXIuZ2V0Rmlyc3RGb2N1c2FibGVFbGVtZW50KGN1cnJlbnRUYXJnZXQucGFyZW50RWxlbWVudCwgJzpub3QoLnAtaGlkZGVuLWZvY3VzYWJsZSknKSA6IHRoaXMubGFzdEhpZGRlbkZvY3VzYWJsZUVsZW1lbnQ7XG5cbiAgICAgICAgRG9tSGFuZGxlci5mb2N1cyhmb2N1c2FibGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBvbkxhc3RIaWRkZW5FbGVtZW50Rm9jdXMoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50VGFyZ2V0LCByZWxhdGVkVGFyZ2V0IH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudCA9XG4gICAgICAgICAgICByZWxhdGVkVGFyZ2V0ID09PSB0aGlzLmZpcnN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudCB8fCAhdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQ/LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpID8gRG9tSGFuZGxlci5nZXRMYXN0Rm9jdXNhYmxlRWxlbWVudChjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQsICc6bm90KC5wLWhpZGRlbi1mb2N1c2FibGUpJykgOiB0aGlzLmZpcnN0SGlkZGVuRm9jdXNhYmxlRWxlbWVudDtcblxuICAgICAgICBEb21IYW5kbGVyLmZvY3VzKGZvY3VzYWJsZUVsZW1lbnQpO1xuICAgIH1cbn1cblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICBleHBvcnRzOiBbRm9jdXNUcmFwXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtGb2N1c1RyYXBdXG59KVxuZXhwb3J0IGNsYXNzIEZvY3VzVHJhcE1vZHVsZSB7fVxuIl19