ng-primitives 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dialog/config/dialog.config.d.ts +43 -0
- package/dialog/dialog/dialog-ref.d.ts +40 -0
- package/dialog/dialog/dialog.directive.d.ts +29 -21
- package/dialog/dialog/dialog.service.d.ts +66 -0
- package/dialog/dialog-description/dialog-description.directive.d.ts +19 -0
- package/dialog/dialog-description/dialog-description.token.d.ts +14 -0
- package/dialog/dialog-overlay/dialog-overlay.directive.d.ts +8 -0
- package/dialog/{dialog-panel/dialog-panel.token.d.ts → dialog-overlay/dialog-overlay.token.d.ts} +4 -4
- package/dialog/dialog-title/dialog-title.directive.d.ts +14 -4
- package/dialog/dialog-trigger/dialog-trigger.directive.d.ts +24 -0
- package/dialog/dialog-trigger/dialog-trigger.token.d.ts +14 -0
- package/dialog/index.d.ts +8 -3
- package/esm2022/date-picker/date-picker-row-render/date-picker-row-render.directive.mjs +1 -2
- package/esm2022/dialog/config/dialog.config.mjs +28 -0
- package/esm2022/dialog/dialog/dialog-ref.mjs +44 -0
- package/esm2022/dialog/dialog/dialog.directive.mjs +59 -27
- package/esm2022/dialog/dialog/dialog.service.mjs +202 -0
- package/esm2022/dialog/dialog-description/dialog-description.directive.mjs +46 -0
- package/esm2022/dialog/dialog-description/dialog-description.token.mjs +16 -0
- package/esm2022/dialog/dialog-overlay/dialog-overlay.directive.mjs +35 -0
- package/esm2022/dialog/dialog-overlay/dialog-overlay.token.mjs +16 -0
- package/esm2022/dialog/dialog-title/dialog-title.directive.mjs +22 -7
- package/esm2022/dialog/dialog-trigger/dialog-trigger.directive.mjs +61 -0
- package/esm2022/dialog/dialog-trigger/dialog-trigger.token.mjs +16 -0
- package/esm2022/dialog/index.mjs +8 -3
- package/esm2022/internal/disabled/disabled.mjs +2 -2
- package/esm2022/utils/signals/async.mjs +3 -1
- package/fesm2022/ng-primitives-date-picker.mjs +0 -1
- package/fesm2022/ng-primitives-date-picker.mjs.map +1 -1
- package/fesm2022/ng-primitives-dialog.mjs +495 -46
- package/fesm2022/ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/ng-primitives-internal.mjs +1 -1
- package/fesm2022/ng-primitives-internal.mjs.map +1 -1
- package/fesm2022/ng-primitives-utils.mjs +2 -0
- package/fesm2022/ng-primitives-utils.mjs.map +1 -1
- package/package.json +7 -7
- package/dialog/dialog-panel/dialog-panel.directive.d.ts +0 -5
- package/esm2022/dialog/dialog-panel/dialog-panel.directive.mjs +0 -24
- package/esm2022/dialog/dialog-panel/dialog-panel.token.mjs +0 -16
|
@@ -1,34 +1,61 @@
|
|
|
1
|
-
import { booleanAttribute,
|
|
1
|
+
import { booleanAttribute, Directive, HostListener, input, signal } from '@angular/core';
|
|
2
|
+
import { NgpFocusTrap } from 'ng-primitives/focus-trap';
|
|
2
3
|
import { uniqueId } from 'ng-primitives/utils';
|
|
3
|
-
import {
|
|
4
|
+
import { injectDialogConfig } from '../config/dialog.config';
|
|
5
|
+
import { injectDialogRef } from './dialog-ref';
|
|
4
6
|
import { NgpDialogToken } from './dialog.token';
|
|
5
7
|
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "ng-primitives/focus-trap";
|
|
6
9
|
export class NgpDialog {
|
|
7
10
|
constructor() {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
this.config = injectDialogConfig();
|
|
12
|
+
/** Access the dialog ref */
|
|
13
|
+
this.dialogRef = injectDialogRef();
|
|
14
|
+
/** The id of the dialog */
|
|
11
15
|
this.id = input(uniqueId('ngp-dialog'));
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
*/
|
|
15
|
-
this.open = input(false, {
|
|
16
|
-
alias: 'ngpDialogOpen',
|
|
17
|
-
transform: booleanAttribute,
|
|
18
|
-
});
|
|
19
|
-
/**
|
|
20
|
-
* The type of the dialog.
|
|
21
|
-
*/
|
|
22
|
-
this.type = input('dialog', {
|
|
16
|
+
/** The dialog role. */
|
|
17
|
+
this.role = input(this.config.role, {
|
|
23
18
|
alias: 'ngpDialogRole',
|
|
24
19
|
});
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
/** Whether the dialog is a modal. */
|
|
21
|
+
this.modal = input(this.config.modal ?? false, {
|
|
22
|
+
alias: 'ngpDialogModal',
|
|
23
|
+
transform: booleanAttribute,
|
|
24
|
+
});
|
|
25
|
+
/** The labelledby ids */
|
|
26
|
+
this.labelledBy = signal([]);
|
|
27
|
+
/** The describedby ids */
|
|
28
|
+
this.describedBy = signal([]);
|
|
29
|
+
}
|
|
30
|
+
ngOnDestroy() {
|
|
31
|
+
this.close();
|
|
32
|
+
}
|
|
33
|
+
/** Close the dialog. */
|
|
34
|
+
close() {
|
|
35
|
+
this.dialogRef.close();
|
|
36
|
+
}
|
|
37
|
+
/** Stop click events from propagating to the overlay */
|
|
38
|
+
onClick(event) {
|
|
39
|
+
event.stopPropagation();
|
|
40
|
+
}
|
|
41
|
+
/** @internal register a labelledby id */
|
|
42
|
+
setLabelledBy(id) {
|
|
43
|
+
this.labelledBy.update(ids => [...ids, id]);
|
|
44
|
+
}
|
|
45
|
+
/** @internal register a describedby id */
|
|
46
|
+
setDescribedBy(id) {
|
|
47
|
+
this.describedBy.update(ids => [...ids, id]);
|
|
48
|
+
}
|
|
49
|
+
/** @internal remove a labelledby id */
|
|
50
|
+
removeLabelledBy(id) {
|
|
51
|
+
this.labelledBy.update(ids => ids.filter(i => i !== id));
|
|
52
|
+
}
|
|
53
|
+
/** @internal remove a describedby id */
|
|
54
|
+
removeDescribedBy(id) {
|
|
55
|
+
this.describedBy.update(ids => ids.filter(i => i !== id));
|
|
29
56
|
}
|
|
30
57
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialog, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
31
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.
|
|
58
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpDialog, isStandalone: true, selector: "[ngpDialog]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "ngpDialogRole", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "ngpDialogModal", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "onClick($event)" }, properties: { "id": "id()", "attr.role": "role()", "attr.aria-modal": "modal()", "attr.aria-labelledby": "labelledBy().join(\" \")", "attr.aria-describedby": "describedBy().join(\" \")" } }, providers: [{ provide: NgpDialogToken, useExisting: NgpDialog }], exportAs: ["ngpDialog"], hostDirectives: [{ directive: i1.NgpFocusTrap }], ngImport: i0 }); }
|
|
32
59
|
}
|
|
33
60
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialog, decorators: [{
|
|
34
61
|
type: Directive,
|
|
@@ -37,13 +64,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
|
|
|
37
64
|
selector: '[ngpDialog]',
|
|
38
65
|
exportAs: 'ngpDialog',
|
|
39
66
|
providers: [{ provide: NgpDialogToken, useExisting: NgpDialog }],
|
|
67
|
+
hostDirectives: [NgpFocusTrap],
|
|
40
68
|
host: {
|
|
41
|
-
|
|
69
|
+
tabindex: '-1',
|
|
42
70
|
'[id]': 'id()',
|
|
43
|
-
'[attr.
|
|
44
|
-
'[attr.
|
|
45
|
-
'[attr.aria-labelledby]': '
|
|
71
|
+
'[attr.role]': 'role()',
|
|
72
|
+
'[attr.aria-modal]': 'modal()',
|
|
73
|
+
'[attr.aria-labelledby]': 'labelledBy().join(" ")',
|
|
74
|
+
'[attr.aria-describedby]': 'describedBy().join(" ")',
|
|
46
75
|
},
|
|
47
76
|
}]
|
|
48
|
-
}]
|
|
49
|
-
|
|
77
|
+
}], propDecorators: { onClick: [{
|
|
78
|
+
type: HostListener,
|
|
79
|
+
args: ['click', ['$event']]
|
|
80
|
+
}] } });
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXByaW1pdGl2ZXMvZGlhbG9nL3NyYy9kaWFsb2cvZGlhbG9nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQWlCaEQsTUFBTSxPQUFPLFNBQVM7SUFmdEI7UUFnQm1CLFdBQU0sR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBRS9DLDRCQUE0QjtRQUNYLGNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUUvQywyQkFBMkI7UUFDbEIsT0FBRSxHQUFHLEtBQUssQ0FBUyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUVwRCx1QkFBdUI7UUFDZCxTQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3RDLEtBQUssRUFBRSxlQUFlO1NBQ3ZCLENBQUMsQ0FBQztRQUVILHFDQUFxQztRQUM1QixVQUFLLEdBQUcsS0FBSyxDQUF3QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUU7WUFDeEUsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixTQUFTLEVBQUUsZ0JBQWdCO1NBQzVCLENBQUMsQ0FBQztRQUVILHlCQUF5QjtRQUNOLGVBQVUsR0FBRyxNQUFNLENBQVcsRUFBRSxDQUFDLENBQUM7UUFFckQsMEJBQTBCO1FBQ1AsZ0JBQVcsR0FBRyxNQUFNLENBQVcsRUFBRSxDQUFDLENBQUM7S0FvQ3ZEO0lBbENDLFdBQVc7UUFDVCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx3REFBd0Q7SUFFOUMsT0FBTyxDQUFDLEtBQVk7UUFDNUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsYUFBYSxDQUFDLEVBQVU7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxjQUFjLENBQUMsRUFBVTtRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLGdCQUFnQixDQUFDLEVBQVU7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELHdDQUF3QztJQUN4QyxpQkFBaUIsQ0FBQyxFQUFVO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7OEdBM0RVLFNBQVM7a0dBQVQsU0FBUyx3c0JBWFQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDOzsyRkFXckQsU0FBUztrQkFmckIsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFFBQVEsRUFBRSxXQUFXO29CQUNyQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxXQUFXLEVBQUUsQ0FBQztvQkFDaEUsY0FBYyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUM5QixJQUFJLEVBQUU7d0JBQ0osUUFBUSxFQUFFLElBQUk7d0JBQ2QsTUFBTSxFQUFFLE1BQU07d0JBQ2QsYUFBYSxFQUFFLFFBQVE7d0JBQ3ZCLG1CQUFtQixFQUFFLFNBQVM7d0JBQzlCLHdCQUF3QixFQUFFLHdCQUF3Qjt3QkFDbEQseUJBQXlCLEVBQUUseUJBQXlCO3FCQUNyRDtpQkFDRjs4QkFzQ1csT0FBTztzQkFEaEIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBib29sZWFuQXR0cmlidXRlLCBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgaW5wdXQsIE9uRGVzdHJveSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3BGb2N1c1RyYXAgfSBmcm9tICduZy1wcmltaXRpdmVzL2ZvY3VzLXRyYXAnO1xuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICduZy1wcmltaXRpdmVzL3V0aWxzJztcbmltcG9ydCB7IGluamVjdERpYWxvZ0NvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9kaWFsb2cuY29uZmlnJztcbmltcG9ydCB7IGluamVjdERpYWxvZ1JlZiB9IGZyb20gJy4vZGlhbG9nLXJlZic7XG5pbXBvcnQgeyBOZ3BEaWFsb2dUb2tlbiB9IGZyb20gJy4vZGlhbG9nLnRva2VuJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW25ncERpYWxvZ10nLFxuICBleHBvcnRBczogJ25ncERpYWxvZycsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRGlhbG9nVG9rZW4sIHVzZUV4aXN0aW5nOiBOZ3BEaWFsb2cgfV0sXG4gIGhvc3REaXJlY3RpdmVzOiBbTmdwRm9jdXNUcmFwXSxcbiAgaG9zdDoge1xuICAgIHRhYmluZGV4OiAnLTEnLFxuICAgICdbaWRdJzogJ2lkKCknLFxuICAgICdbYXR0ci5yb2xlXSc6ICdyb2xlKCknLFxuICAgICdbYXR0ci5hcmlhLW1vZGFsXSc6ICdtb2RhbCgpJyxcbiAgICAnW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XSc6ICdsYWJlbGxlZEJ5KCkuam9pbihcIiBcIiknLFxuICAgICdbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSc6ICdkZXNjcmliZWRCeSgpLmpvaW4oXCIgXCIpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmdwRGlhbG9nIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3REaWFsb2dDb25maWcoKTtcblxuICAvKiogQWNjZXNzIHRoZSBkaWFsb2cgcmVmICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmID0gaW5qZWN0RGlhbG9nUmVmKCk7XG5cbiAgLyoqIFRoZSBpZCBvZiB0aGUgZGlhbG9nICovXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nPih1bmlxdWVJZCgnbmdwLWRpYWxvZycpKTtcblxuICAvKiogVGhlIGRpYWxvZyByb2xlLiAqL1xuICByZWFkb25seSByb2xlID0gaW5wdXQodGhpcy5jb25maWcucm9sZSwge1xuICAgIGFsaWFzOiAnbmdwRGlhbG9nUm9sZScsXG4gIH0pO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBkaWFsb2cgaXMgYSBtb2RhbC4gKi9cbiAgcmVhZG9ubHkgbW9kYWwgPSBpbnB1dDxib29sZWFuLCBCb29sZWFuSW5wdXQ+KHRoaXMuY29uZmlnLm1vZGFsID8/IGZhbHNlLCB7XG4gICAgYWxpYXM6ICduZ3BEaWFsb2dNb2RhbCcsXG4gICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxuICB9KTtcblxuICAvKiogVGhlIGxhYmVsbGVkYnkgaWRzICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsYWJlbGxlZEJ5ID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG5cbiAgLyoqIFRoZSBkZXNjcmliZWRieSBpZHMgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc2NyaWJlZEJ5ID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBkaWFsb2cuICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gIH1cblxuICAvKiogU3RvcCBjbGljayBldmVudHMgZnJvbSBwcm9wYWdhdGluZyB0byB0aGUgb3ZlcmxheSAqL1xuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIHByb3RlY3RlZCBvbkNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCByZWdpc3RlciBhIGxhYmVsbGVkYnkgaWQgKi9cbiAgc2V0TGFiZWxsZWRCeShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sYWJlbGxlZEJ5LnVwZGF0ZShpZHMgPT4gWy4uLmlkcywgaWRdKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgcmVnaXN0ZXIgYSBkZXNjcmliZWRieSBpZCAqL1xuICBzZXREZXNjcmliZWRCeShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNjcmliZWRCeS51cGRhdGUoaWRzID0+IFsuLi5pZHMsIGlkXSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIHJlbW92ZSBhIGxhYmVsbGVkYnkgaWQgKi9cbiAgcmVtb3ZlTGFiZWxsZWRCeShpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sYWJlbGxlZEJ5LnVwZGF0ZShpZHMgPT4gaWRzLmZpbHRlcihpID0+IGkgIT09IGlkKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIHJlbW92ZSBhIGRlc2NyaWJlZGJ5IGlkICovXG4gIHJlbW92ZURlc2NyaWJlZEJ5KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2NyaWJlZEJ5LnVwZGF0ZShpZHMgPT4gaWRzLmZpbHRlcihpID0+IGkgIT09IGlkKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { Overlay, OverlayConfig, OverlayContainer } from '@angular/cdk/overlay';
|
|
9
|
+
import { TemplatePortal } from '@angular/cdk/portal';
|
|
10
|
+
import { Injectable, Injector, inject, isDevMode, } from '@angular/core';
|
|
11
|
+
import { uniqueId } from 'ng-primitives/utils';
|
|
12
|
+
import { Subject, defer } from 'rxjs';
|
|
13
|
+
import { startWith } from 'rxjs/operators';
|
|
14
|
+
import { injectDialogConfig } from '../config/dialog.config';
|
|
15
|
+
import { NgpDialogRef } from './dialog-ref';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
/**
|
|
18
|
+
* This is based on the Angular CDK Dialog service.
|
|
19
|
+
* https://github.com/angular/components/blob/main/src/cdk/dialog/dialog.ts
|
|
20
|
+
*/
|
|
21
|
+
export class NgpDialogManager {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.overlay = inject(Overlay);
|
|
24
|
+
this.defaultOptions = injectDialogConfig();
|
|
25
|
+
this.parentDialogManager = inject(NgpDialogManager, {
|
|
26
|
+
optional: true,
|
|
27
|
+
skipSelf: true,
|
|
28
|
+
});
|
|
29
|
+
this.overlayContainer = inject(OverlayContainer);
|
|
30
|
+
this.scrollStrategy = this.defaultOptions.scrollStrategy ?? this.overlay.scrollStrategies.block();
|
|
31
|
+
this.openDialogsAtThisLevel = [];
|
|
32
|
+
this.afterAllClosedAtThisLevel = new Subject();
|
|
33
|
+
this.afterOpenedAtThisLevel = new Subject();
|
|
34
|
+
this.ariaHiddenElements = new Map();
|
|
35
|
+
/**
|
|
36
|
+
* Stream that emits when all open dialog have finished closing.
|
|
37
|
+
* Will emit on subscribe if there are no open dialogs to begin with.
|
|
38
|
+
*/
|
|
39
|
+
this.afterAllClosed = defer(() => this.openDialogs.length
|
|
40
|
+
? this.getAfterAllClosed()
|
|
41
|
+
: this.getAfterAllClosed().pipe(startWith(undefined)));
|
|
42
|
+
}
|
|
43
|
+
/** Keeps track of the currently-open dialogs. */
|
|
44
|
+
get openDialogs() {
|
|
45
|
+
return this.parentDialogManager
|
|
46
|
+
? this.parentDialogManager.openDialogs
|
|
47
|
+
: this.openDialogsAtThisLevel;
|
|
48
|
+
}
|
|
49
|
+
/** Stream that emits when a dialog has been opened. */
|
|
50
|
+
get afterOpened() {
|
|
51
|
+
return this.parentDialogManager
|
|
52
|
+
? this.parentDialogManager.afterOpened
|
|
53
|
+
: this.afterOpenedAtThisLevel;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Opens a modal dialog containing the given template.
|
|
57
|
+
*/
|
|
58
|
+
open(templateRef, config) {
|
|
59
|
+
const defaults = this.defaultOptions;
|
|
60
|
+
config = { ...defaults, ...config };
|
|
61
|
+
config.id = config.id ?? uniqueId('ngp-dialog');
|
|
62
|
+
if (config.id && this.getDialogById(config.id) && isDevMode()) {
|
|
63
|
+
throw Error(`Dialog with id "${config.id}" exists already. The dialog id must be unique.`);
|
|
64
|
+
}
|
|
65
|
+
const overlayConfig = this.getOverlayConfig(config);
|
|
66
|
+
const overlayRef = this.overlay.create(overlayConfig);
|
|
67
|
+
const dialogRef = new NgpDialogRef(overlayRef, config);
|
|
68
|
+
const injector = this.createInjector(config, dialogRef, undefined);
|
|
69
|
+
const context = {
|
|
70
|
+
$implicit: dialogRef,
|
|
71
|
+
close: dialogRef.close.bind(dialogRef),
|
|
72
|
+
};
|
|
73
|
+
overlayRef.attach(new TemplatePortal(templateRef, config.viewContainerRef, context, injector));
|
|
74
|
+
// If this is the first dialog that we're opening, hide all the non-overlay content.
|
|
75
|
+
if (!this.openDialogs.length) {
|
|
76
|
+
this.hideNonDialogContentFromAssistiveTechnology();
|
|
77
|
+
}
|
|
78
|
+
this.openDialogs.push(dialogRef);
|
|
79
|
+
dialogRef.closed.subscribe(() => this.removeOpenDialog(dialogRef, true));
|
|
80
|
+
this.afterOpened.next(dialogRef);
|
|
81
|
+
return dialogRef;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Closes all of the currently-open dialogs.
|
|
85
|
+
*/
|
|
86
|
+
closeAll() {
|
|
87
|
+
reverseForEach(this.openDialogs, dialog => dialog.close());
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Finds an open dialog by its id.
|
|
91
|
+
* @param id ID to use when looking up the dialog.
|
|
92
|
+
*/
|
|
93
|
+
getDialogById(id) {
|
|
94
|
+
return this.openDialogs.find(dialog => dialog.id === id);
|
|
95
|
+
}
|
|
96
|
+
ngOnDestroy() {
|
|
97
|
+
// Make one pass over all the dialogs that need to be untracked, but should not be closed. We
|
|
98
|
+
// want to stop tracking the open dialog even if it hasn't been closed, because the tracking
|
|
99
|
+
// determines when `aria-hidden` is removed from elements outside the dialog.
|
|
100
|
+
reverseForEach(this.openDialogsAtThisLevel, dialog => {
|
|
101
|
+
// Check for `false` specifically since we want `undefined` to be interpreted as `true`.
|
|
102
|
+
this.removeOpenDialog(dialog, false);
|
|
103
|
+
});
|
|
104
|
+
// Make a second pass and close the remaining dialogs. We do this second pass in order to
|
|
105
|
+
// correctly dispatch the `afterAllClosed` event in case we have a mixed array of dialogs
|
|
106
|
+
// that should be closed and dialogs that should not.
|
|
107
|
+
reverseForEach(this.openDialogsAtThisLevel, dialog => dialog.close());
|
|
108
|
+
this.afterAllClosedAtThisLevel.complete();
|
|
109
|
+
this.afterOpenedAtThisLevel.complete();
|
|
110
|
+
this.openDialogsAtThisLevel = [];
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Creates an overlay config from a dialog config.
|
|
114
|
+
*/
|
|
115
|
+
getOverlayConfig(config) {
|
|
116
|
+
const state = new OverlayConfig({
|
|
117
|
+
positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),
|
|
118
|
+
scrollStrategy: config.scrollStrategy || this.scrollStrategy,
|
|
119
|
+
hasBackdrop: false,
|
|
120
|
+
disposeOnNavigation: config.closeOnNavigation,
|
|
121
|
+
});
|
|
122
|
+
return state;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Creates a custom injector to be used inside the dialog. This allows a component loaded inside
|
|
126
|
+
* of a dialog to close itself and, optionally, to return a value.
|
|
127
|
+
*/
|
|
128
|
+
createInjector(config, dialogRef, fallbackInjector) {
|
|
129
|
+
const userInjector = config.injector || config.viewContainerRef?.injector;
|
|
130
|
+
const providers = [{ provide: NgpDialogRef, useValue: dialogRef }];
|
|
131
|
+
return Injector.create({ parent: userInjector || fallbackInjector, providers });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Removes a dialog from the array of open dialogs.
|
|
135
|
+
*/
|
|
136
|
+
removeOpenDialog(dialogRef, emitEvent) {
|
|
137
|
+
const index = this.openDialogs.indexOf(dialogRef);
|
|
138
|
+
if (index > -1) {
|
|
139
|
+
this.openDialogs.splice(index, 1);
|
|
140
|
+
// If all the dialogs were closed, remove/restore the `aria-hidden`
|
|
141
|
+
// to a the siblings and emit to the `afterAllClosed` stream.
|
|
142
|
+
if (!this.openDialogs.length) {
|
|
143
|
+
this.ariaHiddenElements.forEach((previousValue, element) => {
|
|
144
|
+
if (previousValue) {
|
|
145
|
+
element.setAttribute('aria-hidden', previousValue);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
element.removeAttribute('aria-hidden');
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
this.ariaHiddenElements.clear();
|
|
152
|
+
if (emitEvent) {
|
|
153
|
+
this.getAfterAllClosed().next();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Hides all of the content that isn't an overlay from assistive technology. */
|
|
159
|
+
hideNonDialogContentFromAssistiveTechnology() {
|
|
160
|
+
const overlayContainer = this.overlayContainer.getContainerElement();
|
|
161
|
+
// Ensure that the overlay container is attached to the DOM.
|
|
162
|
+
if (overlayContainer.parentElement) {
|
|
163
|
+
const siblings = overlayContainer.parentElement.children;
|
|
164
|
+
for (let i = siblings.length - 1; i > -1; i--) {
|
|
165
|
+
const sibling = siblings[i];
|
|
166
|
+
if (sibling !== overlayContainer &&
|
|
167
|
+
sibling.nodeName !== 'SCRIPT' &&
|
|
168
|
+
sibling.nodeName !== 'STYLE' &&
|
|
169
|
+
!sibling.hasAttribute('aria-live')) {
|
|
170
|
+
this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));
|
|
171
|
+
sibling.setAttribute('aria-hidden', 'true');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
getAfterAllClosed() {
|
|
177
|
+
const parent = this.parentDialogManager;
|
|
178
|
+
return parent ? parent.getAfterAllClosed() : this.afterAllClosedAtThisLevel;
|
|
179
|
+
}
|
|
180
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
181
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogManager, providedIn: 'root' }); }
|
|
182
|
+
}
|
|
183
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogManager, decorators: [{
|
|
184
|
+
type: Injectable,
|
|
185
|
+
args: [{
|
|
186
|
+
providedIn: 'root',
|
|
187
|
+
}]
|
|
188
|
+
}] });
|
|
189
|
+
/**
|
|
190
|
+
* Executes a callback against all elements in an array while iterating in reverse.
|
|
191
|
+
* Useful if the array is being modified as it is being iterated.
|
|
192
|
+
*/
|
|
193
|
+
function reverseForEach(items, callback) {
|
|
194
|
+
let i = items.length;
|
|
195
|
+
while (i--) {
|
|
196
|
+
callback(items[i]);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export function injectDialogManager() {
|
|
200
|
+
return inject(NgpDialogManager);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2RpYWxvZy9zcmMvZGlhbG9nL2RpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFrQixNQUFNLHNCQUFzQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFFBQVEsRUFJUixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQWMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFtQixrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRTVDOzs7R0FHRztBQUtILE1BQU0sT0FBTyxnQkFBZ0I7SUFIN0I7UUFJbUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixtQkFBYyxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDdEMsd0JBQW1CLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFO1lBQzlELFFBQVEsRUFBRSxJQUFJO1lBQ2QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7UUFDYyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxtQkFBYyxHQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsSUFBSSxJQUFJLENB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MUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3hDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO0lBQzlFLENBQUM7OEdBbE1VLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFzTUQ7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUksS0FBeUIsRUFBRSxRQUE4QjtJQUNsRixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRXJCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNYLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQU9ELE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgwqkgMjAyNCBBbmd1bGFyIFByaW1pdGl2ZXMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmctcHJpbWl0aXZlcy9uZy1wcmltaXRpdmVzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5Q29udGFpbmVyLCBTY3JvbGxTdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBTdGF0aWNQcm92aWRlcixcbiAgVGVtcGxhdGVSZWYsXG4gIGluamVjdCxcbiAgaXNEZXZNb2RlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnbmctcHJpbWl0aXZlcy91dGlscyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBkZWZlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTmdwRGlhbG9nQ29uZmlnLCBpbmplY3REaWFsb2dDb25maWcgfSBmcm9tICcuLi9jb25maWcvZGlhbG9nLmNvbmZpZyc7XG5pbXBvcnQgeyBOZ3BEaWFsb2dSZWYgfSBmcm9tICcuL2RpYWxvZy1yZWYnO1xuXG4vKipcbiAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIEFuZ3VsYXIgQ0RLIERpYWxvZyBzZXJ2aWNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21haW4vc3JjL2Nkay9kaWFsb2cvZGlhbG9nLnRzXG4gKi9cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5ncERpYWxvZ01hbmFnZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE9wdGlvbnMgPSBpbmplY3REaWFsb2dDb25maWcoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnREaWFsb2dNYW5hZ2VyID0gaW5qZWN0KE5ncERpYWxvZ01hbmFnZXIsIHtcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICBza2lwU2VsZjogdHJ1ZSxcbiAgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheUNvbnRhaW5lciA9IGluamVjdChPdmVybGF5Q29udGFpbmVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3kgPVxuICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMuc2Nyb2xsU3RyYXRlZ3kgPz8gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKTtcblxuICBwcml2YXRlIG9wZW5EaWFsb2dzQXRUaGlzTGV2ZWw6IE5ncERpYWxvZ1JlZltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbCA9IG5ldyBTdWJqZWN0PE5ncERpYWxvZ1JlZj4oKTtcbiAgcHJpdmF0ZSBhcmlhSGlkZGVuRWxlbWVudHMgPSBuZXcgTWFwPEVsZW1lbnQsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgLyoqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50bHktb3BlbiBkaWFsb2dzLiAqL1xuICBnZXQgb3BlbkRpYWxvZ3MoKTogcmVhZG9ubHkgTmdwRGlhbG9nUmVmW10ge1xuICAgIHJldHVybiB0aGlzLnBhcmVudERpYWxvZ01hbmFnZXJcbiAgICAgID8gdGhpcy5wYXJlbnREaWFsb2dNYW5hZ2VyLm9wZW5EaWFsb2dzXG4gICAgICA6IHRoaXMub3BlbkRpYWxvZ3NBdFRoaXNMZXZlbDtcbiAgfVxuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGEgZGlhbG9nIGhhcyBiZWVuIG9wZW5lZC4gKi9cbiAgZ2V0IGFmdGVyT3BlbmVkKCk6IFN1YmplY3Q8TmdwRGlhbG9nUmVmPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50RGlhbG9nTWFuYWdlclxuICAgICAgPyB0aGlzLnBhcmVudERpYWxvZ01hbmFnZXIuYWZ0ZXJPcGVuZWRcbiAgICAgIDogdGhpcy5hZnRlck9wZW5lZEF0VGhpc0xldmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gYWxsIG9wZW4gZGlhbG9nIGhhdmUgZmluaXNoZWQgY2xvc2luZy5cbiAgICogV2lsbCBlbWl0IG9uIHN1YnNjcmliZSBpZiB0aGVyZSBhcmUgbm8gb3BlbiBkaWFsb2dzIHRvIGJlZ2luIHdpdGguXG4gICAqL1xuICByZWFkb25seSBhZnRlckFsbENsb3NlZDogT2JzZXJ2YWJsZTx2b2lkPiA9IGRlZmVyKCgpID0+XG4gICAgdGhpcy5vcGVuRGlhbG9ncy5sZW5ndGhcbiAgICAgID8gdGhpcy5nZXRBZnRlckFsbENsb3NlZCgpXG4gICAgICA6IHRoaXMuZ2V0QWZ0ZXJBbGxDbG9zZWQoKS5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKSxcbiAgKTtcblxuICAvKipcbiAgICogT3BlbnMgYSBtb2RhbCBkaWFsb2cgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGVtcGxhdGUuXG4gICAqL1xuICBvcGVuKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxOZ3BEaWFsb2dDb250ZXh0PiwgY29uZmlnPzogTmdwRGlhbG9nQ29uZmlnKTogTmdwRGlhbG9nUmVmIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM7XG4gICAgY29uZmlnID0geyAuLi5kZWZhdWx0cywgLi4uY29uZmlnIH07XG4gICAgY29uZmlnLmlkID0gY29uZmlnLmlkID8/IHVuaXF1ZUlkKCduZ3AtZGlhbG9nJyk7XG5cbiAgICBpZiAoY29uZmlnLmlkICYmIHRoaXMuZ2V0RGlhbG9nQnlJZChjb25maWcuaWQpICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgRGlhbG9nIHdpdGggaWQgXCIke2NvbmZpZy5pZH1cIiBleGlzdHMgYWxyZWFkeS4gVGhlIGRpYWxvZyBpZCBtdXN0IGJlIHVuaXF1ZS5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gdGhpcy5nZXRPdmVybGF5Q29uZmlnKGNvbmZpZyk7XG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gbmV3IE5ncERpYWxvZ1JlZihvdmVybGF5UmVmLCBjb25maWcpO1xuICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5jcmVhdGVJbmplY3Rvcihjb25maWcsIGRpYWxvZ1JlZiwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBjb250ZXh0OiBOZ3BEaWFsb2dDb250ZXh0ID0ge1xuICAgICAgJGltcGxpY2l0OiBkaWFsb2dSZWYsXG4gICAgICBjbG9zZTogZGlhbG9nUmVmLmNsb3NlLmJpbmQoZGlhbG9nUmVmKSxcbiAgICB9O1xuXG4gICAgb3ZlcmxheVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRlbXBsYXRlUmVmLCBjb25maWcudmlld0NvbnRhaW5lclJlZiEsIGNvbnRleHQsIGluamVjdG9yKSk7XG5cbiAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaWFsb2cgdGhhdCB3ZSdyZSBvcGVuaW5nLCBoaWRlIGFsbCB0aGUgbm9uLW92ZXJsYXkgY29udGVudC5cbiAgICBpZiAoIXRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKTtcbiAgICB9XG5cbiAgICAodGhpcy5vcGVuRGlhbG9ncyBhcyBOZ3BEaWFsb2dSZWZbXSkucHVzaChkaWFsb2dSZWYpO1xuICAgIGRpYWxvZ1JlZi5jbG9zZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVtb3ZlT3BlbkRpYWxvZyhkaWFsb2dSZWYsIHRydWUpKTtcbiAgICB0aGlzLmFmdGVyT3BlbmVkLm5leHQoZGlhbG9nUmVmKTtcblxuICAgIHJldHVybiBkaWFsb2dSZWY7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBvZiB0aGUgY3VycmVudGx5LW9wZW4gZGlhbG9ncy5cbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIHJldmVyc2VGb3JFYWNoKHRoaXMub3BlbkRpYWxvZ3MsIGRpYWxvZyA9PiBkaWFsb2cuY2xvc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gb3BlbiBkaWFsb2cgYnkgaXRzIGlkLlxuICAgKiBAcGFyYW0gaWQgSUQgdG8gdXNlIHdoZW4gbG9va2luZyB1cCB0aGUgZGlhbG9nLlxuICAgKi9cbiAgZ2V0RGlhbG9nQnlJZChpZDogc3RyaW5nKTogTmdwRGlhbG9nUmVmIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuRGlhbG9ncy5maW5kKGRpYWxvZyA9PiBkaWFsb2cuaWQgPT09IGlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIE1ha2Ugb25lIHBhc3Mgb3ZlciBhbGwgdGhlIGRpYWxvZ3MgdGhhdCBuZWVkIHRvIGJlIHVudHJhY2tlZCwgYnV0IHNob3VsZCBub3QgYmUgY2xvc2VkLiBXZVxuICAgIC8vIHdhbnQgdG8gc3RvcCB0cmFja2luZyB0aGUgb3BlbiBkaWFsb2cgZXZlbiBpZiBpdCBoYXNuJ3QgYmVlbiBjbG9zZWQsIGJlY2F1c2UgdGhlIHRyYWNraW5nXG4gICAgLy8gZGV0ZXJtaW5lcyB3aGVuIGBhcmlhLWhpZGRlbmAgaXMgcmVtb3ZlZCBmcm9tIGVsZW1lbnRzIG91dHNpZGUgdGhlIGRpYWxvZy5cbiAgICByZXZlcnNlRm9yRWFjaCh0aGlzLm9wZW5EaWFsb2dzQXRUaGlzTGV2ZWwsIGRpYWxvZyA9PiB7XG4gICAgICAvLyBDaGVjayBmb3IgYGZhbHNlYCBzcGVjaWZpY2FsbHkgc2luY2Ugd2Ugd2FudCBgdW5kZWZpbmVkYCB0byBiZSBpbnRlcnByZXRlZCBhcyBgdHJ1ZWAuXG4gICAgICB0aGlzLnJlbW92ZU9wZW5EaWFsb2coZGlhbG9nLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBNYWtlIGEgc2Vjb25kIHBhc3MgYW5kIGNsb3NlIHRoZSByZW1haW5pbmcgZGlhbG9ncy4gV2UgZG8gdGhpcyBzZWNvbmQgcGFzcyBpbiBvcmRlciB0b1xuICAgIC8vIGNvcnJlY3RseSBkaXNwYXRjaCB0aGUgYGFmdGVyQWxsQ2xvc2VkYCBldmVudCBpbiBjYXNlIHdlIGhhdmUgYSBtaXhlZCBhcnJheSBvZiBkaWFsb2dzXG4gICAgLy8gdGhhdCBzaG91bGQgYmUgY2xvc2VkIGFuZCBkaWFsb2dzIHRoYXQgc2hvdWxkIG5vdC5cbiAgICByZXZlcnNlRm9yRWFjaCh0aGlzLm9wZW5EaWFsb2dzQXRUaGlzTGV2ZWwsIGRpYWxvZyA9PiBkaWFsb2cuY2xvc2UoKSk7XG5cbiAgICB0aGlzLmFmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWwuY29tcGxldGUoKTtcbiAgICB0aGlzLmFmdGVyT3BlbmVkQXRUaGlzTGV2ZWwuY29tcGxldGUoKTtcbiAgICB0aGlzLm9wZW5EaWFsb2dzQXRUaGlzTGV2ZWwgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG92ZXJsYXkgY29uZmlnIGZyb20gYSBkaWFsb2cgY29uZmlnLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29uZmlnKGNvbmZpZzogTmdwRGlhbG9nQ29uZmlnKTogT3ZlcmxheUNvbmZpZyB7XG4gICAgY29uc3Qgc3RhdGUgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5jZW50ZXJWZXJ0aWNhbGx5KCksXG4gICAgICBzY3JvbGxTdHJhdGVneTogY29uZmlnLnNjcm9sbFN0cmF0ZWd5IHx8IHRoaXMuc2Nyb2xsU3RyYXRlZ3ksXG4gICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICBkaXNwb3NlT25OYXZpZ2F0aW9uOiBjb25maWcuY2xvc2VPbk5hdmlnYXRpb24sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBpbmplY3RvciB0byBiZSB1c2VkIGluc2lkZSB0aGUgZGlhbG9nLiBUaGlzIGFsbG93cyBhIGNvbXBvbmVudCBsb2FkZWQgaW5zaWRlXG4gICAqIG9mIGEgZGlhbG9nIHRvIGNsb3NlIGl0c2VsZiBhbmQsIG9wdGlvbmFsbHksIHRvIHJldHVybiBhIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbmplY3RvcihcbiAgICBjb25maWc6IE5ncERpYWxvZ0NvbmZpZyxcbiAgICBkaWFsb2dSZWY6IE5ncERpYWxvZ1JlZixcbiAgICBmYWxsYmFja0luamVjdG9yOiBJbmplY3RvciB8IHVuZGVmaW5lZCxcbiAgKTogSW5qZWN0b3Ige1xuICAgIGNvbnN0IHVzZXJJbmplY3RvciA9IGNvbmZpZy5pbmplY3RvciB8fCBjb25maWcudmlld0NvbnRhaW5lclJlZj8uaW5qZWN0b3I7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBTdGF0aWNQcm92aWRlcltdID0gW3sgcHJvdmlkZTogTmdwRGlhbG9nUmVmLCB1c2VWYWx1ZTogZGlhbG9nUmVmIH1dO1xuXG4gICAgcmV0dXJuIEluamVjdG9yLmNyZWF0ZSh7IHBhcmVudDogdXNlckluamVjdG9yIHx8IGZhbGxiYWNrSW5qZWN0b3IsIHByb3ZpZGVycyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgZGlhbG9nIGZyb20gdGhlIGFycmF5IG9mIG9wZW4gZGlhbG9ncy5cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlT3BlbkRpYWxvZyhkaWFsb2dSZWY6IE5ncERpYWxvZ1JlZiwgZW1pdEV2ZW50OiBib29sZWFuKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5EaWFsb2dzLmluZGV4T2YoZGlhbG9nUmVmKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAodGhpcy5vcGVuRGlhbG9ncyBhcyBOZ3BEaWFsb2dSZWZbXSkuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgLy8gSWYgYWxsIHRoZSBkaWFsb2dzIHdlcmUgY2xvc2VkLCByZW1vdmUvcmVzdG9yZSB0aGUgYGFyaWEtaGlkZGVuYFxuICAgICAgLy8gdG8gYSB0aGUgc2libGluZ3MgYW5kIGVtaXQgdG8gdGhlIGBhZnRlckFsbENsb3NlZGAgc3RyZWFtLlxuICAgICAgaWYgKCF0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmFyaWFIaWRkZW5FbGVtZW50cy5mb3JFYWNoKChwcmV2aW91c1ZhbHVlLCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHByZXZpb3VzVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXJpYUhpZGRlbkVsZW1lbnRzLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICAgIHRoaXMuZ2V0QWZ0ZXJBbGxDbG9zZWQoKS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSGlkZXMgYWxsIG9mIHRoZSBjb250ZW50IHRoYXQgaXNuJ3QgYW4gb3ZlcmxheSBmcm9tIGFzc2lzdGl2ZSB0ZWNobm9sb2d5LiAqL1xuICBwcml2YXRlIGhpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKSB7XG4gICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lciA9IHRoaXMub3ZlcmxheUNvbnRhaW5lci5nZXRDb250YWluZXJFbGVtZW50KCk7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3ZlcmxheSBjb250YWluZXIgaXMgYXR0YWNoZWQgdG8gdGhlIERPTS5cbiAgICBpZiAob3ZlcmxheUNvbnRhaW5lci5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBjb25zdCBzaWJsaW5ncyA9IG92ZXJsYXlDb250YWluZXIucGFyZW50RWxlbWVudC5jaGlsZHJlbjtcblxuICAgICAgZm9yIChsZXQgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBzaWJsaW5nc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc2libGluZyAhPT0gb3ZlcmxheUNvbnRhaW5lciAmJlxuICAgICAgICAgIHNpYmxpbmcubm9kZU5hbWUgIT09ICdTQ1JJUFQnICYmXG4gICAgICAgICAgc2libGluZy5ub2RlTmFtZSAhPT0gJ1NUWUxFJyAmJlxuICAgICAgICAgICFzaWJsaW5nLmhhc0F0dHJpYnV0ZSgnYXJpYS1saXZlJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5hcmlhSGlkZGVuRWxlbWVudHMuc2V0KHNpYmxpbmcsIHNpYmxpbmcuZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKTtcbiAgICAgICAgICBzaWJsaW5nLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBZnRlckFsbENsb3NlZCgpOiBTdWJqZWN0PHZvaWQ+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudERpYWxvZ01hbmFnZXI7XG4gICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5nZXRBZnRlckFsbENsb3NlZCgpIDogdGhpcy5hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsO1xuICB9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjYWxsYmFjayBhZ2FpbnN0IGFsbCBlbGVtZW50cyBpbiBhbiBhcnJheSB3aGlsZSBpdGVyYXRpbmcgaW4gcmV2ZXJzZS5cbiAqIFVzZWZ1bCBpZiB0aGUgYXJyYXkgaXMgYmVpbmcgbW9kaWZpZWQgYXMgaXQgaXMgYmVpbmcgaXRlcmF0ZWQuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2VGb3JFYWNoPFQ+KGl0ZW1zOiBUW10gfCByZWFkb25seSBUW10sIGNhbGxiYWNrOiAoY3VycmVudDogVCkgPT4gdm9pZCkge1xuICBsZXQgaSA9IGl0ZW1zLmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgY2FsbGJhY2soaXRlbXNbaV0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdwRGlhbG9nQ29udGV4dCB7XG4gICRpbXBsaWNpdDogTmdwRGlhbG9nUmVmO1xuICBjbG9zZTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdERpYWxvZ01hbmFnZXIoKTogTmdwRGlhbG9nTWFuYWdlciB7XG4gIHJldHVybiBpbmplY3QoTmdwRGlhbG9nTWFuYWdlcik7XG59XG4iXX0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { Directive, input } from '@angular/core';
|
|
9
|
+
import { onChange, uniqueId } from 'ng-primitives/utils';
|
|
10
|
+
import { injectDialog } from '../dialog/dialog.token';
|
|
11
|
+
import { NgpDialogDescriptionToken } from './dialog-description.token';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
export class NgpDialogDescription {
|
|
14
|
+
constructor() {
|
|
15
|
+
/** Access the dialog */
|
|
16
|
+
this.dialog = injectDialog();
|
|
17
|
+
/** The id of the descriptions. */
|
|
18
|
+
this.id = input(uniqueId('ngp-dialog-description'));
|
|
19
|
+
onChange(this.id, (id, prevId) => {
|
|
20
|
+
if (prevId) {
|
|
21
|
+
this.dialog.removeDescribedBy(prevId);
|
|
22
|
+
}
|
|
23
|
+
if (id) {
|
|
24
|
+
this.dialog.setDescribedBy(id);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
ngOnDestroy() {
|
|
29
|
+
this.dialog.removeDescribedBy(this.id());
|
|
30
|
+
}
|
|
31
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
32
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpDialogDescription, isStandalone: true, selector: "[ngpDialogDescription]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "id()" } }, providers: [{ provide: NgpDialogDescriptionToken, useExisting: NgpDialogDescription }], exportAs: ["ngpDialogDescription"], ngImport: i0 }); }
|
|
33
|
+
}
|
|
34
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogDescription, decorators: [{
|
|
35
|
+
type: Directive,
|
|
36
|
+
args: [{
|
|
37
|
+
standalone: true,
|
|
38
|
+
selector: '[ngpDialogDescription]',
|
|
39
|
+
exportAs: 'ngpDialogDescription',
|
|
40
|
+
providers: [{ provide: NgpDialogDescriptionToken, useExisting: NgpDialogDescription }],
|
|
41
|
+
host: {
|
|
42
|
+
'[id]': 'id()',
|
|
43
|
+
},
|
|
44
|
+
}]
|
|
45
|
+
}], ctorParameters: () => [] });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLWRlc2NyaXB0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXByaW1pdGl2ZXMvZGlhbG9nL3NyYy9kaWFsb2ctZGVzY3JpcHRpb24vZGlhbG9nLWRlc2NyaXB0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFXdkUsTUFBTSxPQUFPLG9CQUFvQjtJQU8vQjtRQU5BLHdCQUF3QjtRQUNQLFdBQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUV6QyxrQ0FBa0M7UUFDekIsT0FBRSxHQUFHLEtBQUssQ0FBUyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1FBRzlELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBRUQsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs4R0FyQlUsb0JBQW9CO2tHQUFwQixvQkFBb0Isd09BTHBCLENBQUMsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLENBQUM7OzJGQUszRSxvQkFBb0I7a0JBVGhDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFdBQVcsc0JBQXNCLEVBQUUsQ0FBQztvQkFDdEYsSUFBSSxFQUFFO3dCQUNKLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgwqkgMjAyNCBBbmd1bGFyIFByaW1pdGl2ZXMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmctcHJpbWl0aXZlcy9uZy1wcmltaXRpdmVzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIGlucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG9uQ2hhbmdlLCB1bmlxdWVJZCB9IGZyb20gJ25nLXByaW1pdGl2ZXMvdXRpbHMnO1xuaW1wb3J0IHsgaW5qZWN0RGlhbG9nIH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy50b2tlbic7XG5pbXBvcnQgeyBOZ3BEaWFsb2dEZXNjcmlwdGlvblRva2VuIH0gZnJvbSAnLi9kaWFsb2ctZGVzY3JpcHRpb24udG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbbmdwRGlhbG9nRGVzY3JpcHRpb25dJyxcbiAgZXhwb3J0QXM6ICduZ3BEaWFsb2dEZXNjcmlwdGlvbicsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRGlhbG9nRGVzY3JpcHRpb25Ub2tlbiwgdXNlRXhpc3Rpbmc6IE5ncERpYWxvZ0Rlc2NyaXB0aW9uIH1dLFxuICBob3N0OiB7XG4gICAgJ1tpZF0nOiAnaWQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIE5ncERpYWxvZ0Rlc2NyaXB0aW9uIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIEFjY2VzcyB0aGUgZGlhbG9nICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nID0gaW5qZWN0RGlhbG9nKCk7XG5cbiAgLyoqIFRoZSBpZCBvZiB0aGUgZGVzY3JpcHRpb25zLiAqL1xuICByZWFkb25seSBpZCA9IGlucHV0PHN0cmluZz4odW5pcXVlSWQoJ25ncC1kaWFsb2ctZGVzY3JpcHRpb24nKSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgb25DaGFuZ2UodGhpcy5pZCwgKGlkLCBwcmV2SWQpID0+IHtcbiAgICAgIGlmIChwcmV2SWQpIHtcbiAgICAgICAgdGhpcy5kaWFsb2cucmVtb3ZlRGVzY3JpYmVkQnkocHJldklkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nLnNldERlc2NyaWJlZEJ5KGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nLnJlbW92ZURlc2NyaWJlZEJ5KHRoaXMuaWQoKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { InjectionToken, inject } from '@angular/core';
|
|
9
|
+
export const NgpDialogDescriptionToken = new InjectionToken('NgpDialogDescriptionToken');
|
|
10
|
+
/**
|
|
11
|
+
* Inject the DialogDescription directive instance
|
|
12
|
+
*/
|
|
13
|
+
export function injectDialogDescription() {
|
|
14
|
+
return inject(NgpDialogDescriptionToken);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLWRlc2NyaXB0aW9uLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9kaWFsb2cvc3JjL2RpYWxvZy1kZXNjcmlwdGlvbi9kaWFsb2ctZGVzY3JpcHRpb24udG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxjQUFjLENBQ3pELDJCQUEyQixDQUM1QixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLE9BQU8sTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3BEaWFsb2dEZXNjcmlwdGlvbiB9IGZyb20gJy4vZGlhbG9nLWRlc2NyaXB0aW9uLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBjb25zdCBOZ3BEaWFsb2dEZXNjcmlwdGlvblRva2VuID0gbmV3IEluamVjdGlvblRva2VuPE5ncERpYWxvZ0Rlc2NyaXB0aW9uPihcbiAgJ05ncERpYWxvZ0Rlc2NyaXB0aW9uVG9rZW4nLFxuKTtcblxuLyoqXG4gKiBJbmplY3QgdGhlIERpYWxvZ0Rlc2NyaXB0aW9uIGRpcmVjdGl2ZSBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0RGlhbG9nRGVzY3JpcHRpb24oKTogTmdwRGlhbG9nRGVzY3JpcHRpb24ge1xuICByZXR1cm4gaW5qZWN0KE5ncERpYWxvZ0Rlc2NyaXB0aW9uVG9rZW4pO1xufVxuIl19
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { Directive, HostListener } from '@angular/core';
|
|
9
|
+
import { injectDialogRef } from '../dialog/dialog-ref';
|
|
10
|
+
import { NgpDialogOverlayToken } from './dialog-overlay.token';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
export class NgpDialogOverlay {
|
|
13
|
+
constructor() {
|
|
14
|
+
/** Access the dialog ref. */
|
|
15
|
+
this.dialogRef = injectDialogRef();
|
|
16
|
+
}
|
|
17
|
+
close() {
|
|
18
|
+
this.dialogRef.close();
|
|
19
|
+
}
|
|
20
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogOverlay, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
21
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.1", type: NgpDialogOverlay, isStandalone: true, selector: "[ngpDialogOverlay]", host: { listeners: { "click": "close()" } }, providers: [{ provide: NgpDialogOverlayToken, useExisting: NgpDialogOverlay }], exportAs: ["ngpDialogOverlay"], ngImport: i0 }); }
|
|
22
|
+
}
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogOverlay, decorators: [{
|
|
24
|
+
type: Directive,
|
|
25
|
+
args: [{
|
|
26
|
+
standalone: true,
|
|
27
|
+
selector: '[ngpDialogOverlay]',
|
|
28
|
+
exportAs: 'ngpDialogOverlay',
|
|
29
|
+
providers: [{ provide: NgpDialogOverlayToken, useExisting: NgpDialogOverlay }],
|
|
30
|
+
}]
|
|
31
|
+
}], propDecorators: { close: [{
|
|
32
|
+
type: HostListener,
|
|
33
|
+
args: ['click']
|
|
34
|
+
}] } });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLW92ZXJsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9kaWFsb2cvc3JjL2RpYWxvZy1vdmVybGF5L2RpYWxvZy1vdmVybGF5LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBUS9ELE1BQU0sT0FBTyxnQkFBZ0I7SUFON0I7UUFPRSw2QkFBNkI7UUFDWixjQUFTLEdBQUcsZUFBZSxFQUFFLENBQUM7S0FNaEQ7SUFIVyxLQUFLO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDOzhHQVBVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLDhHQUZoQixDQUFDLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDOzsyRkFFbkUsZ0JBQWdCO2tCQU41QixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxXQUFXLGtCQUFrQixFQUFFLENBQUM7aUJBQy9FOzhCQU1XLEtBQUs7c0JBRGQsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgwqkgMjAyNCBBbmd1bGFyIFByaW1pdGl2ZXMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmctcHJpbWl0aXZlcy9uZy1wcmltaXRpdmVzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0RGlhbG9nUmVmIH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy1yZWYnO1xuaW1wb3J0IHsgTmdwRGlhbG9nT3ZlcmxheVRva2VuIH0gZnJvbSAnLi9kaWFsb2ctb3ZlcmxheS50b2tlbic7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1tuZ3BEaWFsb2dPdmVybGF5XScsXG4gIGV4cG9ydEFzOiAnbmdwRGlhbG9nT3ZlcmxheScsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRGlhbG9nT3ZlcmxheVRva2VuLCB1c2VFeGlzdGluZzogTmdwRGlhbG9nT3ZlcmxheSB9XSxcbn0pXG5leHBvcnQgY2xhc3MgTmdwRGlhbG9nT3ZlcmxheSB7XG4gIC8qKiBBY2Nlc3MgdGhlIGRpYWxvZyByZWYuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmID0gaW5qZWN0RGlhbG9nUmVmKCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBwcm90ZWN0ZWQgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the Apache 2.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { InjectionToken, inject } from '@angular/core';
|
|
9
|
+
export const NgpDialogOverlayToken = new InjectionToken('NgpDialogOverlayToken');
|
|
10
|
+
/**
|
|
11
|
+
* Inject the DialogOverlay directive instance
|
|
12
|
+
*/
|
|
13
|
+
export function injectDialogOverlay() {
|
|
14
|
+
return inject(NgpDialogOverlayToken);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLW92ZXJsYXkudG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2RpYWxvZy9zcmMvZGlhbG9nLW92ZXJsYXkvZGlhbG9nLW92ZXJsYXkudG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQW1CLHVCQUF1QixDQUFDLENBQUM7QUFFbkc7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3BEaWFsb2dPdmVybGF5IH0gZnJvbSAnLi9kaWFsb2ctb3ZlcmxheS5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgTmdwRGlhbG9nT3ZlcmxheVRva2VuID0gbmV3IEluamVjdGlvblRva2VuPE5ncERpYWxvZ092ZXJsYXk+KCdOZ3BEaWFsb2dPdmVybGF5VG9rZW4nKTtcblxuLyoqXG4gKiBJbmplY3QgdGhlIERpYWxvZ092ZXJsYXkgZGlyZWN0aXZlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3REaWFsb2dPdmVybGF5KCk6IE5ncERpYWxvZ092ZXJsYXkge1xuICByZXR1cm4gaW5qZWN0KE5ncERpYWxvZ092ZXJsYXlUb2tlbik7XG59XG4iXX0=
|
|
@@ -6,18 +6,30 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
8
|
import { Directive, input } from '@angular/core';
|
|
9
|
-
import { uniqueId } from 'ng-primitives/utils';
|
|
9
|
+
import { onChange, uniqueId } from 'ng-primitives/utils';
|
|
10
|
+
import { injectDialog } from '../dialog/dialog.token';
|
|
10
11
|
import { NgpDialogTitleToken } from './dialog-title.token';
|
|
11
12
|
import * as i0 from "@angular/core";
|
|
12
13
|
export class NgpDialogTitle {
|
|
13
14
|
constructor() {
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/** Access the dialog. */
|
|
16
|
+
this.dialog = injectDialog();
|
|
17
|
+
/** The id of the title. */
|
|
17
18
|
this.id = input(uniqueId('ngp-dialog-title'));
|
|
19
|
+
onChange(this.id, (id, prevId) => {
|
|
20
|
+
if (prevId) {
|
|
21
|
+
this.dialog.removeLabelledBy(prevId);
|
|
22
|
+
}
|
|
23
|
+
if (id) {
|
|
24
|
+
this.dialog.setLabelledBy(id);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
ngOnDestroy() {
|
|
29
|
+
this.dialog.removeLabelledBy(this.id());
|
|
18
30
|
}
|
|
19
31
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
20
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpDialogTitle, isStandalone: true, selector: "[ngpDialogTitle]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: NgpDialogTitleToken, useExisting: NgpDialogTitle }], exportAs: ["ngpDialogTitle"], ngImport: i0 }); }
|
|
32
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpDialogTitle, isStandalone: true, selector: "[ngpDialogTitle]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "id()" } }, providers: [{ provide: NgpDialogTitleToken, useExisting: NgpDialogTitle }], exportAs: ["ngpDialogTitle"], ngImport: i0 }); }
|
|
21
33
|
}
|
|
22
34
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDialogTitle, decorators: [{
|
|
23
35
|
type: Directive,
|
|
@@ -26,6 +38,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
|
|
|
26
38
|
selector: '[ngpDialogTitle]',
|
|
27
39
|
exportAs: 'ngpDialogTitle',
|
|
28
40
|
providers: [{ provide: NgpDialogTitleToken, useExisting: NgpDialogTitle }],
|
|
41
|
+
host: {
|
|
42
|
+
'[id]': 'id()',
|
|
43
|
+
},
|
|
29
44
|
}]
|
|
30
|
-
}] });
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
}], ctorParameters: () => [] });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXRpdGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXByaW1pdGl2ZXMvZGlhbG9nL3NyYy9kaWFsb2ctdGl0bGUvZGlhbG9nLXRpdGxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFXM0QsTUFBTSxPQUFPLGNBQWM7SUFPekI7UUFOQSx5QkFBeUI7UUFDUixXQUFNLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFFekMsMkJBQTJCO1FBQ2xCLE9BQUUsR0FBRyxLQUFLLENBQVMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUd4RCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMvQixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUVELElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7OEdBckJVLGNBQWM7a0dBQWQsY0FBYyxrT0FMZCxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQzs7MkZBSy9ELGNBQWM7a0JBVDFCLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDMUUsSUFBSSxFQUFFO3dCQUNKLE1BQU0sRUFBRSxNQUFNO3FCQUNmO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgwqkgMjAyNCBBbmd1bGFyIFByaW1pdGl2ZXMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmctcHJpbWl0aXZlcy9uZy1wcmltaXRpdmVzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIGlucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG9uQ2hhbmdlLCB1bmlxdWVJZCB9IGZyb20gJ25nLXByaW1pdGl2ZXMvdXRpbHMnO1xuaW1wb3J0IHsgaW5qZWN0RGlhbG9nIH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy50b2tlbic7XG5pbXBvcnQgeyBOZ3BEaWFsb2dUaXRsZVRva2VuIH0gZnJvbSAnLi9kaWFsb2ctdGl0bGUudG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbbmdwRGlhbG9nVGl0bGVdJyxcbiAgZXhwb3J0QXM6ICduZ3BEaWFsb2dUaXRsZScsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRGlhbG9nVGl0bGVUb2tlbiwgdXNlRXhpc3Rpbmc6IE5ncERpYWxvZ1RpdGxlIH1dLFxuICBob3N0OiB7XG4gICAgJ1tpZF0nOiAnaWQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIE5ncERpYWxvZ1RpdGxlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIEFjY2VzcyB0aGUgZGlhbG9nLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZyA9IGluamVjdERpYWxvZygpO1xuXG4gIC8qKiBUaGUgaWQgb2YgdGhlIHRpdGxlLiAqL1xuICByZWFkb25seSBpZCA9IGlucHV0PHN0cmluZz4odW5pcXVlSWQoJ25ncC1kaWFsb2ctdGl0bGUnKSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgb25DaGFuZ2UodGhpcy5pZCwgKGlkLCBwcmV2SWQpID0+IHtcbiAgICAgIGlmIChwcmV2SWQpIHtcbiAgICAgICAgdGhpcy5kaWFsb2cucmVtb3ZlTGFiZWxsZWRCeShwcmV2SWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5kaWFsb2cuc2V0TGFiZWxsZWRCeShpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZy5yZW1vdmVMYWJlbGxlZEJ5KHRoaXMuaWQoKSk7XG4gIH1cbn1cbiJdfQ==
|