ng-primitives 0.0.7 → 0.2.0
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/README.md +14 -4
- package/accordion/accordion-trigger/accordion-trigger.directive.d.ts +2 -1
- package/autofill/README.md +3 -0
- package/autofill/autofill/autofill.directive.d.ts +19 -0
- package/{select/select-button/select-button.token.d.ts → autofill/autofill/autofill.token.d.ts} +4 -4
- package/autofill/index.d.ts +9 -0
- package/avatar/avatar/avatar.directive.d.ts +2 -1
- package/button/README.md +3 -0
- package/button/button/button.directive.d.ts +27 -0
- package/{select/select-option/select-option.token.d.ts → button/button/button.token.d.ts} +4 -4
- package/button/index.d.ts +9 -0
- package/checkbox/checkbox/checkbox.directive.d.ts +11 -61
- package/checkbox/index.d.ts +0 -4
- package/esm2022/a11y/visually-hidden/visually-hidden.directive.mjs +3 -3
- package/esm2022/accordion/accordion/accordion.directive.mjs +5 -4
- package/esm2022/accordion/accordion-content/accordion-content.directive.mjs +5 -6
- package/esm2022/accordion/accordion-item/accordion-item.directive.mjs +5 -5
- package/esm2022/accordion/accordion-trigger/accordion-trigger.directive.mjs +8 -5
- package/esm2022/autofill/autofill/autofill.directive.mjs +71 -0
- package/esm2022/autofill/autofill/autofill.token.mjs +16 -0
- package/esm2022/autofill/index.mjs +10 -0
- package/esm2022/autofill/ng-primitives-autofill.mjs +5 -0
- package/esm2022/avatar/avatar/avatar.directive.mjs +7 -4
- package/esm2022/avatar/avatar-fallback/avatar-fallback.directive.mjs +3 -3
- package/esm2022/avatar/avatar-image/avatar-image.directive.mjs +3 -3
- package/esm2022/button/button/button.directive.mjs +47 -0
- package/esm2022/button/button/button.token.mjs +16 -0
- package/esm2022/button/index.mjs +10 -0
- package/esm2022/button/ng-primitives-button.mjs +5 -0
- package/esm2022/checkbox/checkbox/checkbox.directive.mjs +29 -79
- package/esm2022/checkbox/index.mjs +1 -5
- package/esm2022/file-upload/file-upload/file-upload.directive.mjs +7 -4
- package/esm2022/focus-trap/focus-trap/focus-trap.directive.mjs +262 -0
- package/esm2022/focus-trap/focus-trap/focus-trap.token.mjs +16 -0
- package/esm2022/focus-trap/index.mjs +10 -0
- package/esm2022/focus-trap/ng-primitives-focus-trap.mjs +5 -0
- package/esm2022/form-field/description/description.directive.mjs +14 -14
- package/esm2022/form-field/error/error.directive.mjs +27 -29
- package/esm2022/form-field/form-control/form-control.directive.mjs +22 -16
- package/esm2022/form-field/form-field/form-field.directive.mjs +3 -3
- package/esm2022/form-field/form-field/form-field.token.mjs +3 -7
- package/esm2022/form-field/label/label.directive.mjs +56 -17
- package/esm2022/input/index.mjs +10 -0
- package/esm2022/input/input/input.directive.mjs +55 -0
- package/esm2022/input/input/input.token.mjs +16 -0
- package/esm2022/input/ng-primitives-input.mjs +5 -0
- package/esm2022/interactions/focus/focus.directive.mjs +15 -10
- package/esm2022/interactions/focus-visible/focus-visible.directive.mjs +12 -7
- package/esm2022/interactions/hover/hover.directive.mjs +16 -11
- package/esm2022/interactions/index.mjs +5 -1
- package/esm2022/interactions/move/move.directive.mjs +216 -0
- package/esm2022/interactions/move/move.token.mjs +16 -0
- package/esm2022/interactions/press/press.directive.mjs +118 -0
- package/esm2022/interactions/press/press.token.mjs +16 -0
- package/esm2022/internal/disabled/disabled.mjs +19 -0
- package/esm2022/internal/index.mjs +11 -0
- package/esm2022/internal/ng-primitives-internal.mjs +5 -0
- package/esm2022/internal/orientation/orientation.mjs +19 -0
- package/esm2022/internal/style-injector/style-injector.mjs +81 -0
- package/esm2022/progress/progress/progress.directive.mjs +3 -3
- package/esm2022/progress/progress-indicator/progress-indicator.directive.mjs +3 -3
- package/esm2022/radio/radio-group/radio-group.directive.mjs +14 -54
- package/esm2022/radio/radio-indicator/radio-indicator.directive.mjs +8 -5
- package/esm2022/radio/radio-item/radio-item.directive.mjs +8 -6
- package/esm2022/resize/resize/resize.directive.mjs +3 -3
- package/esm2022/roving-focus/roving-focus-group/roving-focus-group.directive.mjs +14 -9
- package/esm2022/roving-focus/roving-focus-item/roving-focus-item.directive.mjs +3 -3
- package/esm2022/search/index.mjs +10 -0
- package/esm2022/search/ng-primitives-search.mjs +5 -0
- package/esm2022/search/search-field/search-field.directive.mjs +47 -0
- package/esm2022/search/search-field/search-field.token.mjs +16 -0
- package/esm2022/select/index.mjs +1 -7
- package/esm2022/select/select/select.directive.mjs +23 -36
- package/esm2022/select/select/select.token.mjs +1 -1
- package/esm2022/slider/slider/slider.directive.mjs +18 -5
- package/esm2022/slider/slider-range/slider-range.directive.mjs +6 -5
- package/esm2022/slider/slider-thumb/slider-thumb.directive.mjs +7 -4
- package/esm2022/slider/slider-track/slider-track.directive.mjs +8 -4
- package/esm2022/switch/switch/switch.directive.mjs +18 -58
- package/esm2022/switch/switch-thumb/switch-thumb.directive.mjs +9 -6
- package/esm2022/tabs/tab-button/tab-button.directive.mjs +8 -6
- package/esm2022/tabs/tab-list/tab-list.directive.mjs +3 -3
- package/esm2022/tabs/tab-panel/tab-panel.directive.mjs +5 -6
- package/esm2022/tabs/tabset/tabset.directive.mjs +14 -18
- package/esm2022/textarea/index.mjs +10 -0
- package/esm2022/textarea/ng-primitives-textarea.mjs +5 -0
- package/esm2022/textarea/textarea/textarea.directive.mjs +37 -0
- package/esm2022/textarea/textarea/textarea.token.mjs +16 -0
- package/esm2022/toggle/toggle/toggle.directive.mjs +33 -13
- package/esm2022/tooltip/tooltip/tooltip.directive.mjs +3 -3
- package/esm2022/tooltip/tooltip-trigger/tooltip-trigger.directive.mjs +7 -7
- package/esm2022/utils/helpers/focus-manager.mjs +3 -3
- package/esm2022/utils/index.mjs +2 -2
- package/esm2022/utils/signals/async.mjs +11 -17
- package/fesm2022/ng-primitives-a11y.mjs +3 -3
- package/fesm2022/ng-primitives-accordion.mjs +19 -16
- package/fesm2022/ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/ng-primitives-autofill.mjs +100 -0
- package/fesm2022/ng-primitives-autofill.mjs.map +1 -0
- package/fesm2022/ng-primitives-avatar.mjs +13 -10
- package/fesm2022/ng-primitives-avatar.mjs.map +1 -1
- package/fesm2022/ng-primitives-button.mjs +76 -0
- package/fesm2022/ng-primitives-button.mjs.map +1 -0
- package/fesm2022/ng-primitives-checkbox.mjs +25 -203
- package/fesm2022/ng-primitives-checkbox.mjs.map +1 -1
- package/fesm2022/ng-primitives-file-upload.mjs +6 -3
- package/fesm2022/ng-primitives-file-upload.mjs.map +1 -1
- package/fesm2022/ng-primitives-focus-trap.mjs +291 -0
- package/fesm2022/ng-primitives-focus-trap.mjs.map +1 -0
- package/fesm2022/ng-primitives-form-field.mjs +119 -80
- package/fesm2022/ng-primitives-form-field.mjs.map +1 -1
- package/fesm2022/ng-primitives-input.mjs +84 -0
- package/fesm2022/ng-primitives-input.mjs.map +1 -0
- package/fesm2022/ng-primitives-interactions.mjs +394 -26
- package/fesm2022/ng-primitives-interactions.mjs.map +1 -1
- package/fesm2022/ng-primitives-internal.mjs +132 -0
- package/fesm2022/ng-primitives-internal.mjs.map +1 -0
- package/fesm2022/ng-primitives-progress.mjs +6 -6
- package/fesm2022/ng-primitives-radio.mjs +25 -62
- package/fesm2022/ng-primitives-radio.mjs.map +1 -1
- package/fesm2022/ng-primitives-resize.mjs +3 -3
- package/fesm2022/ng-primitives-roving-focus.mjs +15 -10
- package/fesm2022/ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/ng-primitives-search.mjs +76 -0
- package/fesm2022/ng-primitives-search.mjs.map +1 -0
- package/fesm2022/ng-primitives-select.mjs +23 -395
- package/fesm2022/ng-primitives-select.mjs.map +1 -1
- package/fesm2022/ng-primitives-slider.mjs +35 -14
- package/fesm2022/ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/ng-primitives-switch.mjs +23 -62
- package/fesm2022/ng-primitives-switch.mjs.map +1 -1
- package/fesm2022/ng-primitives-tabs.mjs +27 -30
- package/fesm2022/ng-primitives-tabs.mjs.map +1 -1
- package/fesm2022/ng-primitives-textarea.mjs +66 -0
- package/fesm2022/ng-primitives-textarea.mjs.map +1 -0
- package/fesm2022/ng-primitives-toggle.mjs +32 -12
- package/fesm2022/ng-primitives-toggle.mjs.map +1 -1
- package/fesm2022/ng-primitives-tooltip.mjs +9 -9
- package/fesm2022/ng-primitives-tooltip.mjs.map +1 -1
- package/fesm2022/ng-primitives-utils.mjs +14 -20
- package/fesm2022/ng-primitives-utils.mjs.map +1 -1
- package/file-upload/file-upload/file-upload.directive.d.ts +2 -1
- package/focus-trap/README.md +3 -0
- package/focus-trap/focus-trap/focus-trap.directive.d.ts +64 -0
- package/{select/select-options/select-options.token.d.ts → focus-trap/focus-trap/focus-trap.token.d.ts} +4 -4
- package/focus-trap/index.d.ts +9 -0
- package/form-field/description/description.directive.d.ts +1 -1
- package/form-field/error/error.directive.d.ts +9 -5
- package/form-field/form-control/form-control.directive.d.ts +7 -3
- package/form-field/form-field/form-field.token.d.ts +1 -1
- package/form-field/label/label.directive.d.ts +3 -2
- package/input/README.md +3 -0
- package/input/index.d.ts +9 -0
- package/input/input/input.directive.d.ts +33 -0
- package/input/input/input.token.d.ts +14 -0
- package/interactions/focus/focus.directive.d.ts +6 -2
- package/interactions/focus-visible/focus-visible.directive.d.ts +5 -1
- package/interactions/hover/hover.directive.d.ts +5 -1
- package/interactions/index.d.ts +4 -0
- package/interactions/move/move.directive.d.ts +126 -0
- package/interactions/move/move.token.d.ts +14 -0
- package/interactions/press/press.directive.d.ts +59 -0
- package/interactions/press/press.token.d.ts +14 -0
- package/internal/README.md +3 -0
- package/internal/disabled/disabled.d.ts +21 -0
- package/internal/index.d.ts +10 -0
- package/internal/orientation/orientation.d.ts +22 -0
- package/internal/style-injector/style-injector.d.ts +36 -0
- package/package.json +49 -7
- package/radio/radio-group/radio-group.directive.d.ts +4 -41
- package/radio/radio-indicator/radio-indicator.directive.d.ts +2 -1
- package/radio/radio-item/radio-item.directive.d.ts +2 -1
- package/roving-focus/roving-focus-group/roving-focus-group.directive.d.ts +7 -2
- package/search/README.md +3 -0
- package/search/index.d.ts +9 -0
- package/search/search-field/search-field.directive.d.ts +15 -0
- package/search/search-field/search-field.token.d.ts +14 -0
- package/select/index.d.ts +0 -6
- package/select/select/select.directive.d.ts +7 -22
- package/select/select/select.token.d.ts +2 -2
- package/slider/slider/slider.directive.d.ts +4 -2
- package/slider/slider-thumb/slider-thumb.directive.d.ts +2 -1
- package/slider/slider-track/slider-track.directive.d.ts +1 -1
- package/switch/switch/switch.directive.d.ts +5 -45
- package/switch/switch-thumb/switch-thumb.directive.d.ts +2 -1
- package/tabs/tab-button/tab-button.directive.d.ts +2 -1
- package/tabs/tabset/tabset.directive.d.ts +3 -9
- package/textarea/README.md +3 -0
- package/textarea/index.d.ts +9 -0
- package/textarea/textarea/textarea.directive.d.ts +20 -0
- package/textarea/textarea/textarea.token.d.ts +14 -0
- package/toggle/toggle/toggle.directive.d.ts +16 -4
- package/utils/index.d.ts +1 -1
- package/utils/signals/async.d.ts +10 -12
- package/checkbox/checkbox-indicator/checkbox-indicator.directive.d.ts +0 -19
- package/checkbox/checkbox-indicator/checkbox-indicator.token.d.ts +0 -15
- package/checkbox/checkbox-input/checkbox-input.directive.d.ts +0 -10
- package/checkbox/checkbox-label/checkbox-label.directive.d.ts +0 -9
- package/esm2022/checkbox/checkbox-indicator/checkbox-indicator.directive.mjs +0 -51
- package/esm2022/checkbox/checkbox-indicator/checkbox-indicator.token.mjs +0 -17
- package/esm2022/checkbox/checkbox-input/checkbox-input.directive.mjs +0 -40
- package/esm2022/checkbox/checkbox-label/checkbox-label.directive.mjs +0 -32
- package/esm2022/select/select-button/select-button.directive.mjs +0 -84
- package/esm2022/select/select-button/select-button.token.mjs +0 -16
- package/esm2022/select/select-option/select-option.directive.mjs +0 -90
- package/esm2022/select/select-option/select-option.token.mjs +0 -16
- package/esm2022/select/select-options/select-options.directive.mjs +0 -157
- package/esm2022/select/select-options/select-options.token.mjs +0 -16
- package/select/select-button/select-button.directive.d.ts +0 -51
- package/select/select-option/select-option.directive.d.ts +0 -57
- package/select/select-options/select-options.directive.d.ts +0 -65
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the CC BY-ND 4.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
import { InteractivityChecker } from '@angular/cdk/a11y';
|
|
9
|
+
import { booleanAttribute, Directive, ElementRef, HostListener, inject, input, NgZone, } from '@angular/core';
|
|
10
|
+
import { NgpFocusTrapToken } from './focus-trap.token';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
/**
|
|
13
|
+
* This implementation is based on the Radix UI FocusScope:
|
|
14
|
+
* https://github.com/radix-ui/primitives/blob/main/packages/react/focus-scope/src/FocusScope.tsx#L306
|
|
15
|
+
*/
|
|
16
|
+
class FocusTrap {
|
|
17
|
+
constructor() {
|
|
18
|
+
/**
|
|
19
|
+
* Whether the focus trap is active.
|
|
20
|
+
*/
|
|
21
|
+
this.active = false;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Activates the focus trap.
|
|
25
|
+
*/
|
|
26
|
+
activate() {
|
|
27
|
+
this.active = true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Deactivates the focus trap.
|
|
31
|
+
*/
|
|
32
|
+
deactivate() {
|
|
33
|
+
this.active = false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class FocusTrapStack {
|
|
37
|
+
constructor() {
|
|
38
|
+
/**
|
|
39
|
+
* The stack of focus traps.
|
|
40
|
+
*/
|
|
41
|
+
this.stack = [];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Adds a focus trap to the stack.
|
|
45
|
+
*/
|
|
46
|
+
add(focusTrap) {
|
|
47
|
+
// deactivate the previous focus trap
|
|
48
|
+
this.stack.forEach(t => t.deactivate());
|
|
49
|
+
// add the new focus trap and activate it
|
|
50
|
+
this.stack.push(focusTrap);
|
|
51
|
+
focusTrap.activate();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Removes a focus trap from the stack.
|
|
55
|
+
*/
|
|
56
|
+
remove(focusTrap) {
|
|
57
|
+
// remove the focus trap
|
|
58
|
+
const index = this.stack.indexOf(focusTrap);
|
|
59
|
+
if (index >= 0) {
|
|
60
|
+
this.stack.splice(index, 1);
|
|
61
|
+
}
|
|
62
|
+
// activate the previous focus trap
|
|
63
|
+
const previous = this.stack[this.stack.length - 1];
|
|
64
|
+
if (previous) {
|
|
65
|
+
previous.activate();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// create a global stack of focus traps
|
|
70
|
+
const focusTrapStack = new FocusTrapStack();
|
|
71
|
+
export class NgpFocusTrap {
|
|
72
|
+
constructor() {
|
|
73
|
+
/**
|
|
74
|
+
* Create a new focus trap.
|
|
75
|
+
*/
|
|
76
|
+
this.focusTrap = new FocusTrap();
|
|
77
|
+
/**
|
|
78
|
+
* Access the interactivity checker.
|
|
79
|
+
*/
|
|
80
|
+
this.interactivityChecker = inject(InteractivityChecker);
|
|
81
|
+
/**
|
|
82
|
+
* Get the focus trap container element.
|
|
83
|
+
*/
|
|
84
|
+
this.elementRef = inject(ElementRef);
|
|
85
|
+
/**
|
|
86
|
+
* Access NgZone to run the focus trap events outside of Angular's zone.
|
|
87
|
+
*/
|
|
88
|
+
this.ngZone = inject(NgZone);
|
|
89
|
+
/**
|
|
90
|
+
* Store the mutation observer.
|
|
91
|
+
*/
|
|
92
|
+
this.mutationObserver = null;
|
|
93
|
+
/**
|
|
94
|
+
* Store the last focused element.
|
|
95
|
+
*/
|
|
96
|
+
this.lastFocusedElement = null;
|
|
97
|
+
/**
|
|
98
|
+
* Whether the focus trap is disabled.
|
|
99
|
+
*/
|
|
100
|
+
this.disabled = input(false, {
|
|
101
|
+
alias: 'ngpFocusTrapDisabled',
|
|
102
|
+
transform: booleanAttribute,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
ngOnInit() {
|
|
106
|
+
focusTrapStack.add(this.focusTrap);
|
|
107
|
+
this.mutationObserver = new MutationObserver(this.handleMutations.bind(this));
|
|
108
|
+
// setup event listeners
|
|
109
|
+
this.ngZone.runOutsideAngular(() => {
|
|
110
|
+
this.mutationObserver.observe(this.elementRef.nativeElement, {
|
|
111
|
+
childList: true,
|
|
112
|
+
subtree: true,
|
|
113
|
+
});
|
|
114
|
+
document.addEventListener('focusin', this.handleFocusIn.bind(this));
|
|
115
|
+
document.addEventListener('focusout', this.handleFocusOut.bind(this));
|
|
116
|
+
});
|
|
117
|
+
const previouslyFocusedElement = document.activeElement;
|
|
118
|
+
const hasFocusedCandidate = this.elementRef.nativeElement.contains(previouslyFocusedElement);
|
|
119
|
+
if (!hasFocusedCandidate) {
|
|
120
|
+
this.focusFirst();
|
|
121
|
+
// if the focus didn't change, focus the container
|
|
122
|
+
if (document.activeElement === previouslyFocusedElement) {
|
|
123
|
+
this.focus(this.elementRef.nativeElement);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
ngOnDestroy() {
|
|
128
|
+
focusTrapStack.remove(this.focusTrap);
|
|
129
|
+
this.mutationObserver?.disconnect();
|
|
130
|
+
}
|
|
131
|
+
handleFocusIn(event) {
|
|
132
|
+
if (!this.focusTrap.active || this.disabled()) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const target = event.target;
|
|
136
|
+
if (this.elementRef.nativeElement.contains(target)) {
|
|
137
|
+
this.lastFocusedElement = target;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.focus(this.lastFocusedElement);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Handles the `focusout` event.
|
|
145
|
+
*/
|
|
146
|
+
handleFocusOut(event) {
|
|
147
|
+
if (!this.focusTrap.active || this.disabled() || event.relatedTarget === null) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const relatedTarget = event.relatedTarget;
|
|
151
|
+
if (!this.elementRef.nativeElement.contains(relatedTarget)) {
|
|
152
|
+
this.focus(this.lastFocusedElement);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* If the focused element gets removed from the DOM, browsers move focus back to the document.body.
|
|
157
|
+
* We move focus to the container to keep focus trapped correctly.
|
|
158
|
+
*/
|
|
159
|
+
handleMutations(mutations) {
|
|
160
|
+
const focusedElement = document.activeElement;
|
|
161
|
+
if (focusedElement !== document.body) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
for (const mutation of mutations) {
|
|
165
|
+
if (mutation.removedNodes.length > 0) {
|
|
166
|
+
this.focus(this.elementRef.nativeElement);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Handles the `keydown` event.
|
|
172
|
+
*/
|
|
173
|
+
handleKeyDown(event) {
|
|
174
|
+
if (!this.focusTrap.active || this.disabled()) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const isTabKey = event.key === 'Tab' && !event.altKey && !event.ctrlKey && !event.metaKey;
|
|
178
|
+
const focusedElement = document.activeElement;
|
|
179
|
+
if (isTabKey && focusedElement) {
|
|
180
|
+
const container = event.currentTarget;
|
|
181
|
+
const [first, last] = this.getTabbableEdges(container);
|
|
182
|
+
const hasTabbableElementsInside = first && last;
|
|
183
|
+
// we can only wrap focus if we have tabbable edges
|
|
184
|
+
if (!hasTabbableElementsInside) {
|
|
185
|
+
if (focusedElement === container) {
|
|
186
|
+
event.preventDefault();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
if (!event.shiftKey && focusedElement === last) {
|
|
191
|
+
event.preventDefault();
|
|
192
|
+
this.focus(first);
|
|
193
|
+
}
|
|
194
|
+
else if (event.shiftKey && focusedElement === first) {
|
|
195
|
+
event.preventDefault();
|
|
196
|
+
this.focus(last);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Returns the first and last tabbable elements inside a container.
|
|
203
|
+
*/
|
|
204
|
+
getTabbableEdges(container) {
|
|
205
|
+
const candidates = this.getTabbableCandidates(container);
|
|
206
|
+
const first = this.findVisible(candidates);
|
|
207
|
+
const last = this.findVisible(candidates.reverse());
|
|
208
|
+
return [first, last];
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Returns a list of potential focusable elements inside a container.
|
|
212
|
+
*/
|
|
213
|
+
getTabbableCandidates(container) {
|
|
214
|
+
const nodes = [];
|
|
215
|
+
const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {
|
|
216
|
+
acceptNode: (node) => this.interactivityChecker.isFocusable(node)
|
|
217
|
+
? NodeFilter.FILTER_ACCEPT
|
|
218
|
+
: NodeFilter.FILTER_SKIP,
|
|
219
|
+
});
|
|
220
|
+
while (walker.nextNode()) {
|
|
221
|
+
nodes.push(walker.currentNode);
|
|
222
|
+
}
|
|
223
|
+
return nodes;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Returns the first visible element in a list..
|
|
227
|
+
*/
|
|
228
|
+
findVisible(elements) {
|
|
229
|
+
return elements.find(element => this.interactivityChecker.isVisible(element)) ?? null;
|
|
230
|
+
}
|
|
231
|
+
focus(element) {
|
|
232
|
+
element?.focus({ preventScroll: true });
|
|
233
|
+
}
|
|
234
|
+
focusFirst() {
|
|
235
|
+
const previouslyFocusedElement = document.activeElement;
|
|
236
|
+
for (const candidate of this.getTabbableCandidates(this.elementRef.nativeElement)) {
|
|
237
|
+
this.focus(candidate);
|
|
238
|
+
if (document.activeElement !== previouslyFocusedElement) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusTrap, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
244
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpFocusTrap, isStandalone: true, selector: "[ngpFocusTrap]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpFocusTrapDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "handleKeyDown($event)" }, properties: { "attr.tabindex": "-1", "attr.data-focus-trap": "!disabled()" } }, providers: [{ provide: NgpFocusTrapToken, useExisting: NgpFocusTrap }], exportAs: ["ngpFocusTrap"], ngImport: i0 }); }
|
|
245
|
+
}
|
|
246
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusTrap, decorators: [{
|
|
247
|
+
type: Directive,
|
|
248
|
+
args: [{
|
|
249
|
+
standalone: true,
|
|
250
|
+
selector: '[ngpFocusTrap]',
|
|
251
|
+
exportAs: 'ngpFocusTrap',
|
|
252
|
+
providers: [{ provide: NgpFocusTrapToken, useExisting: NgpFocusTrap }],
|
|
253
|
+
host: {
|
|
254
|
+
'[attr.tabindex]': '-1',
|
|
255
|
+
'[attr.data-focus-trap]': '!disabled()',
|
|
256
|
+
},
|
|
257
|
+
}]
|
|
258
|
+
}], propDecorators: { handleKeyDown: [{
|
|
259
|
+
type: HostListener,
|
|
260
|
+
args: ['keydown', ['$event']]
|
|
261
|
+
}] } });
|
|
262
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdHJhcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2ZvY3VzLXRyYXAvc3JjL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFdkQ7OztHQUdHO0FBRUgsTUFBTSxTQUFTO0lBQWY7UUFDRTs7V0FFRztRQUNILFdBQU0sR0FBWSxLQUFLLENBQUM7SUFlMUIsQ0FBQztJQWJDOztPQUVHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLGNBQWM7SUFBcEI7UUFDRTs7V0FFRztRQUNjLFVBQUssR0FBZ0IsRUFBRSxDQUFDO0lBZ0MzQyxDQUFDO0lBOUJDOztPQUVHO0lBQ0gsR0FBRyxDQUFDLFNBQW9CO1FBQ3RCLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXhDLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixTQUFTLENBQUMs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QUFFO3dCQUNKLGlCQUFpQixFQUFFLElBQUk7d0JBQ3ZCLHdCQUF3QixFQUFFLGFBQWE7cUJBQ3hDO2lCQUNGOzhCQTRIVyxhQUFhO3NCQUR0QixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENDIEJZLU5EIDQuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5pbXBvcnQgeyBJbnRlcmFjdGl2aXR5Q2hlY2tlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7XG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ncEZvY3VzVHJhcFRva2VuIH0gZnJvbSAnLi9mb2N1cy10cmFwLnRva2VuJztcblxuLyoqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBSYWRpeCBVSSBGb2N1c1Njb3BlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JhZGl4LXVpL3ByaW1pdGl2ZXMvYmxvYi9tYWluL3BhY2thZ2VzL3JlYWN0L2ZvY3VzLXNjb3BlL3NyYy9Gb2N1c1Njb3BlLnRzeCNMMzA2XG4gKi9cblxuY2xhc3MgRm9jdXNUcmFwIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvY3VzIHRyYXAgaXMgYWN0aXZlLlxuICAgKi9cbiAgYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyB0aGUgZm9jdXMgdHJhcC5cbiAgICovXG4gIGFjdGl2YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlcyB0aGUgZm9jdXMgdHJhcC5cbiAgICovXG4gIGRlYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgfVxufVxuXG5jbGFzcyBGb2N1c1RyYXBTdGFjayB7XG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgb2YgZm9jdXMgdHJhcHMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrOiBGb2N1c1RyYXBbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgZm9jdXMgdHJhcCB0byB0aGUgc3RhY2suXG4gICAqL1xuICBhZGQoZm9jdXNUcmFwOiBGb2N1c1RyYXApOiB2b2lkIHtcbiAgICAvLyBkZWFjdGl2YXRlIHRoZSBwcmV2aW91cyBmb2N1cyB0cmFwXG4gICAgdGhpcy5zdGFjay5mb3JFYWNoKHQgPT4gdC5kZWFjdGl2YXRlKCkpO1xuXG4gICAgLy8gYWRkIHRoZSBuZXcgZm9jdXMgdHJhcCBhbmQgYWN0aXZhdGUgaXRcbiAgICB0aGlzLnN0YWNrLnB1c2goZm9jdXNUcmFwKTtcbiAgICBmb2N1c1RyYXAuYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgZm9jdXMgdHJhcCBmcm9tIHRoZSBzdGFjay5cbiAgICovXG4gIHJlbW92ZShmb2N1c1RyYXA6IEZvY3VzVHJhcCk6IHZvaWQge1xuICAgIC8vIHJlbW92ZSB0aGUgZm9jdXMgdHJhcFxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdGFjay5pbmRleE9mKGZvY3VzVHJhcCk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5zdGFjay5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8vIGFjdGl2YXRlIHRoZSBwcmV2aW91cyBmb2N1cyB0cmFwXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgIHByZXZpb3VzLmFjdGl2YXRlKCk7XG4gICAgfVxuICB9XG59XG5cbi8vIGNyZWF0ZSBhIGdsb2JhbCBzdGFjayBvZiBmb2N1cyB0cmFwc1xuY29uc3QgZm9jdXNUcmFwU3RhY2sgPSBuZXcgRm9jdXNUcmFwU3RhY2soKTtcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW25ncEZvY3VzVHJhcF0nLFxuICBleHBvcnRBczogJ25ncEZvY3VzVHJhcCcsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRm9jdXNUcmFwVG9rZW4sIHVzZUV4aXN0aW5nOiBOZ3BGb2N1c1RyYXAgfV0sXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJy0xJyxcbiAgICAnW2F0dHIuZGF0YS1mb2N1cy10cmFwXSc6ICchZGlzYWJsZWQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIE5ncEZvY3VzVHJhcCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBmb2N1cyB0cmFwLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmb2N1c1RyYXAgPSBuZXcgRm9jdXNUcmFwKCk7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgaW50ZXJhY3Rpdml0eSBjaGVja2VyLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmFjdGl2aXR5Q2hlY2tlciA9IGluamVjdChJbnRlcmFjdGl2aXR5Q2hlY2tlcik7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZm9jdXMgdHJhcCBjb250YWluZXIgZWxlbWVudC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyBOZ1pvbmUgdG8gcnVuIHRoZSBmb2N1cyB0cmFwIGV2ZW50cyBvdXRzaWRlIG9mIEFuZ3VsYXIncyB6b25lLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAvKipcbiAgICogU3RvcmUgdGhlIG11dGF0aW9uIG9ic2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBtdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFN0b3JlIHRoZSBsYXN0IGZvY3VzZWQgZWxlbWVudC5cbiAgICovXG4gIHByaXZhdGUgbGFzdEZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2N1cyB0cmFwIGlzIGRpc2FibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWQgPSBpbnB1dChmYWxzZSwge1xuICAgIGFsaWFzOiAnbmdwRm9jdXNUcmFwRGlzYWJsZWQnLFxuICAgIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSxcbiAgfSk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgZm9jdXNUcmFwU3RhY2suYWRkKHRoaXMuZm9jdXNUcmFwKTtcblxuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuaGFuZGxlTXV0YXRpb25zLmJpbmQodGhpcykpO1xuXG4gICAgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyIS5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuaGFuZGxlRm9jdXNJbi5iaW5kKHRoaXMpKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgdGhpcy5oYW5kbGVGb2N1c091dC5iaW5kKHRoaXMpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGhhc0ZvY3VzZWRDYW5kaWRhdGUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpO1xuXG4gICAgaWYgKCFoYXNGb2N1c2VkQ2FuZGlkYXRlKSB7XG4gICAgICB0aGlzLmZvY3VzRmlyc3QoKTtcblxuICAgICAgLy8gaWYgdGhlIGZvY3VzIGRpZG4ndCBjaGFuZ2UsIGZvY3VzIHRoZSBjb250YWluZXJcbiAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5mb2N1cyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9jdXNUcmFwU3RhY2sucmVtb3ZlKHRoaXMuZm9jdXNUcmFwKTtcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRm9jdXNJbihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5mb2N1c1RyYXAuYWN0aXZlIHx8IHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgdGhpcy5sYXN0Rm9jdXNlZEVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXModGhpcy5sYXN0Rm9jdXNlZEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBgZm9jdXNvdXRgIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVGb2N1c091dChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghdGhpcy5mb2N1c1RyYXAuYWN0aXZlIHx8IHRoaXMuZGlzYWJsZWQoKSB8fCBldmVudC5yZWxhdGVkVGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICB0aGlzLmZvY3VzKHRoaXMubGFzdEZvY3VzZWRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBicm93c2VycyBtb3ZlIGZvY3VzIGJhY2sgdG8gdGhlIGRvY3VtZW50LmJvZHkuXG4gICAqIFdlIG1vdmUgZm9jdXMgdG8gdGhlIGNvbnRhaW5lciB0byBrZWVwIGZvY3VzIHRyYXBwZWQgY29ycmVjdGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVNdXRhdGlvbnMobXV0YXRpb25zOiBNdXRhdGlvblJlY29yZFtdKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgIGlmIChmb2N1c2VkRWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG4gICAgICBpZiAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5mb2N1cyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGBrZXlkb3duYCBldmVudC5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBwcm90ZWN0ZWQgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5mb2N1c1RyYXAuYWN0aXZlIHx8IHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzVGFiS2V5ID0gZXZlbnQua2V5ID09PSAnVGFiJyAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5O1xuICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICBpZiAoaXNUYWJLZXkgJiYgZm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBbZmlyc3QsIGxhc3RdID0gdGhpcy5nZXRUYWJiYWJsZUVkZ2VzKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBoYXNUYWJiYWJsZUVsZW1lbnRzSW5zaWRlID0gZmlyc3QgJiYgbGFzdDtcblxuICAgICAgLy8gd2UgY2FuIG9ubHkgd3JhcCBmb2N1cyBpZiB3ZSBoYXZlIHRhYmJhYmxlIGVkZ2VzXG4gICAgICBpZiAoIWhhc1RhYmJhYmxlRWxlbWVudHNJbnNpZGUpIHtcbiAgICAgICAgaWYgKGZvY3VzZWRFbGVtZW50ID09PSBjb250YWluZXIpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGZvY3VzZWRFbGVtZW50ID09PSBsYXN0KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmZvY3VzKGZpcnN0KTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5zaGlmdEtleSAmJiBmb2N1c2VkRWxlbWVudCA9PT0gZmlyc3QpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuZm9jdXMobGFzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlyc3QgYW5kIGxhc3QgdGFiYmFibGUgZWxlbWVudHMgaW5zaWRlIGEgY29udGFpbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUYWJiYWJsZUVkZ2VzKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5nZXRUYWJiYWJsZUNhbmRpZGF0ZXMoY29udGFpbmVyKTtcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuZmluZFZpc2libGUoY2FuZGlkYXRlcyk7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuZmluZFZpc2libGUoY2FuZGlkYXRlcy5yZXZlcnNlKCkpO1xuICAgIHJldHVybiBbZmlyc3QsIGxhc3RdIGFzIGNvbnN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHBvdGVudGlhbCBmb2N1c2FibGUgZWxlbWVudHMgaW5zaWRlIGEgY29udGFpbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUYWJiYWJsZUNhbmRpZGF0ZXMoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IG5vZGVzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihjb250YWluZXIsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgICBhY2NlcHROb2RlOiAobm9kZTogSFRNTEVsZW1lbnQpID0+XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpdml0eUNoZWNrZXIuaXNGb2N1c2FibGUobm9kZSlcbiAgICAgICAgICA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVFxuICAgICAgICAgIDogTm9kZUZpbHRlci5GSUxURVJfU0tJUCxcbiAgICB9KTtcbiAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgIG5vZGVzLnB1c2god2Fsa2VyLmN1cnJlbnROb2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IHZpc2libGUgZWxlbWVudCBpbiBhIGxpc3QuLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kVmlzaWJsZShlbGVtZW50czogSFRNTEVsZW1lbnRbXSkge1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKGVsZW1lbnQgPT4gdGhpcy5pbnRlcmFjdGl2aXR5Q2hlY2tlci5pc1Zpc2libGUoZWxlbWVudCkpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzKGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGwpIHtcbiAgICBlbGVtZW50Py5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRmlyc3QoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHRoaXMuZ2V0VGFiYmFibGVDYW5kaWRhdGVzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5mb2N1cyhjYW5kaWRhdGUpO1xuXG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -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 CC BY-ND 4.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 NgpFocusTrapToken = new InjectionToken('NgpFocusTrapToken');
|
|
10
|
+
/**
|
|
11
|
+
* Inject the FocusTrap directive instance
|
|
12
|
+
*/
|
|
13
|
+
export function injectFocusTrap() {
|
|
14
|
+
return inject(NgpFocusTrapToken);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdHJhcC50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXByaW1pdGl2ZXMvZm9jdXMtdHJhcC9zcmMvZm9jdXMtdHJhcC9mb2N1cy10cmFwLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3ZELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUFlLG1CQUFtQixDQUFDLENBQUM7QUFFdkY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQUM3QixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDQyBCWS1ORCA0LjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3BGb2N1c1RyYXAgfSBmcm9tICcuL2ZvY3VzLXRyYXAuZGlyZWN0aXZlJztcblxuZXhwb3J0IGNvbnN0IE5ncEZvY3VzVHJhcFRva2VuID0gbmV3IEluamVjdGlvblRva2VuPE5ncEZvY3VzVHJhcD4oJ05ncEZvY3VzVHJhcFRva2VuJyk7XG5cbi8qKlxuICogSW5qZWN0IHRoZSBGb2N1c1RyYXAgZGlyZWN0aXZlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RGb2N1c1RyYXAoKTogTmdwRm9jdXNUcmFwIHtcbiAgcmV0dXJuIGluamVjdChOZ3BGb2N1c1RyYXBUb2tlbik7XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 Angular Primitives.
|
|
3
|
+
* https://github.com/ng-primitives/ng-primitives
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the CC BY-ND 4.0 license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
export { NgpFocusTrap } from './focus-trap/focus-trap.directive';
|
|
9
|
+
export { NgpFocusTrapToken } from './focus-trap/focus-trap.token';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2ZvY3VzLXRyYXAvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENDIEJZLU5EIDQuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmV4cG9ydCB7IE5ncEZvY3VzVHJhcCB9IGZyb20gJy4vZm9jdXMtdHJhcC9mb2N1cy10cmFwLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBOZ3BGb2N1c1RyYXBUb2tlbiB9IGZyb20gJy4vZm9jdXMtdHJhcC9mb2N1cy10cmFwLnRva2VuJztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcHJpbWl0aXZlcy1mb2N1cy10cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9mb2N1cy10cmFwL3NyYy9uZy1wcmltaXRpdmVzLWZvY3VzLXRyYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -15,20 +15,20 @@ export class NgpDescription {
|
|
|
15
15
|
/**
|
|
16
16
|
* Access the form field that the description is associated with.
|
|
17
17
|
*/
|
|
18
|
-
this.formField = injectFormField(
|
|
18
|
+
this.formField = injectFormField();
|
|
19
19
|
/**
|
|
20
20
|
* The id of the description. If not provided, a unique id will be generated.
|
|
21
21
|
*/
|
|
22
22
|
this.id = input(uniqueId('ngp-description'));
|
|
23
23
|
effect(onCleanup => {
|
|
24
|
-
this.formField
|
|
25
|
-
onCleanup(() => this.formField
|
|
24
|
+
this.formField?.addDescription(this.id());
|
|
25
|
+
onCleanup(() => this.formField?.removeDescription(this.id()));
|
|
26
26
|
}, { allowSignalWrites: true });
|
|
27
27
|
}
|
|
28
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.
|
|
29
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.
|
|
28
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
29
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpDescription, isStandalone: true, selector: "[ngpDescription]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "id()", "attr.data-invalid": "formField?.invalid()", "attr.data-valid": "formField?.valid()", "attr.data-touched": "formField?.touched()", "attr.data-pristine": "formField?.pristine()", "attr.data-dirty": "formField?.dirty()", "attr.data-pending": "formField?.pending()", "attr.data-disabled": "formField?.disabled()" } }, providers: [{ provide: NgpDescriptionToken, useExisting: NgpDescription }], exportAs: ["ngpDescription"], ngImport: i0 }); }
|
|
30
30
|
}
|
|
31
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpDescription, decorators: [{
|
|
32
32
|
type: Directive,
|
|
33
33
|
args: [{
|
|
34
34
|
standalone: true,
|
|
@@ -37,14 +37,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
|
|
|
37
37
|
providers: [{ provide: NgpDescriptionToken, useExisting: NgpDescription }],
|
|
38
38
|
host: {
|
|
39
39
|
'[attr.id]': 'id()',
|
|
40
|
-
'[attr.data-invalid]': 'formField
|
|
41
|
-
'[attr.data-valid]': 'formField
|
|
42
|
-
'[attr.data-touched]': 'formField
|
|
43
|
-
'[attr.data-pristine]': 'formField
|
|
44
|
-
'[attr.data-dirty]': 'formField
|
|
45
|
-
'[attr.data-pending]': 'formField
|
|
46
|
-
'[attr.data-disabled]': 'formField
|
|
40
|
+
'[attr.data-invalid]': 'formField?.invalid()',
|
|
41
|
+
'[attr.data-valid]': 'formField?.valid()',
|
|
42
|
+
'[attr.data-touched]': 'formField?.touched()',
|
|
43
|
+
'[attr.data-pristine]': 'formField?.pristine()',
|
|
44
|
+
'[attr.data-dirty]': 'formField?.dirty()',
|
|
45
|
+
'[attr.data-pending]': 'formField?.pending()',
|
|
46
|
+
'[attr.data-disabled]': 'formField?.disabled()',
|
|
47
47
|
},
|
|
48
48
|
}]
|
|
49
49
|
}], ctorParameters: () => [] });
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9mb3JtLWZpZWxkL3NyYy9kZXNjcmlwdGlvbi9kZXNjcmlwdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBa0IxRCxNQUFNLE9BQU8sY0FBYztJQVd6QjtRQVZBOztXQUVHO1FBQ2dCLGNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUVqRDs7V0FFRztRQUNNLE9BQUUsR0FBRyxLQUFLLENBQVMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUd2RCxNQUFNLENBQ0osU0FBUyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQzs4R0FuQlUsY0FBYztrR0FBZCxjQUFjLDhoQkFaZCxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQzs7MkZBWS9ELGNBQWM7a0JBaEIxQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLGdCQUFnQixFQUFFLENBQUM7b0JBQzFFLElBQUksRUFBRTt3QkFDSixXQUFXLEVBQUUsTUFBTTt3QkFDbkIscUJBQXFCLEVBQUUsc0JBQXNCO3dCQUM3QyxtQkFBbUIsRUFBRSxvQkFBb0I7d0JBQ3pDLHFCQUFxQixFQUFFLHNCQUFzQjt3QkFDN0Msc0JBQXNCLEVBQUUsdUJBQXVCO3dCQUMvQyxtQkFBbUIsRUFBRSxvQkFBb0I7d0JBQ3pDLHFCQUFxQixFQUFFLHNCQUFzQjt3QkFDN0Msc0JBQXNCLEVBQUUsdUJBQXVCO3FCQUNoRDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENDIEJZLU5EIDQuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIGVmZmVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnbmctcHJpbWl0aXZlcy91dGlscyc7XG5pbXBvcnQgeyBpbmplY3RGb3JtRmllbGQgfSBmcm9tICcuLi9mb3JtLWZpZWxkL2Zvcm0tZmllbGQudG9rZW4nO1xuaW1wb3J0IHsgTmdwRGVzY3JpcHRpb25Ub2tlbiB9IGZyb20gJy4vZGVzY3JpcHRpb24udG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbbmdwRGVzY3JpcHRpb25dJyxcbiAgZXhwb3J0QXM6ICduZ3BEZXNjcmlwdGlvbicsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRGVzY3JpcHRpb25Ub2tlbiwgdXNlRXhpc3Rpbmc6IE5ncERlc2NyaXB0aW9uIH1dLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLmlkXSc6ICdpZCgpJyxcbiAgICAnW2F0dHIuZGF0YS1pbnZhbGlkXSc6ICdmb3JtRmllbGQ/LmludmFsaWQoKScsXG4gICAgJ1thdHRyLmRhdGEtdmFsaWRdJzogJ2Zvcm1GaWVsZD8udmFsaWQoKScsXG4gICAgJ1thdHRyLmRhdGEtdG91Y2hlZF0nOiAnZm9ybUZpZWxkPy50b3VjaGVkKCknLFxuICAgICdbYXR0ci5kYXRhLXByaXN0aW5lXSc6ICdmb3JtRmllbGQ/LnByaXN0aW5lKCknLFxuICAgICdbYXR0ci5kYXRhLWRpcnR5XSc6ICdmb3JtRmllbGQ/LmRpcnR5KCknLFxuICAgICdbYXR0ci5kYXRhLXBlbmRpbmddJzogJ2Zvcm1GaWVsZD8ucGVuZGluZygpJyxcbiAgICAnW2F0dHIuZGF0YS1kaXNhYmxlZF0nOiAnZm9ybUZpZWxkPy5kaXNhYmxlZCgpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmdwRGVzY3JpcHRpb24ge1xuICAvKipcbiAgICogQWNjZXNzIHRoZSBmb3JtIGZpZWxkIHRoYXQgdGhlIGRlc2NyaXB0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBmb3JtRmllbGQgPSBpbmplY3RGb3JtRmllbGQoKTtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBkZXNjcmlwdGlvbi4gSWYgbm90IHByb3ZpZGVkLCBhIHVuaXF1ZSBpZCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nPih1bmlxdWVJZCgnbmdwLWRlc2NyaXB0aW9uJykpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgIG9uQ2xlYW51cCA9PiB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkPy5hZGREZXNjcmlwdGlvbih0aGlzLmlkKCkpO1xuICAgICAgICBvbkNsZWFudXAoKCkgPT4gdGhpcy5mb3JtRmllbGQ/LnJlbW92ZURlc2NyaXB0aW9uKHRoaXMuaWQoKSkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* This source code is licensed under the CC BY-ND 4.0 license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
|
-
import { Directive, computed, input
|
|
9
|
-
import { uniqueId } from 'ng-primitives/utils';
|
|
8
|
+
import { Directive, computed, input } from '@angular/core';
|
|
9
|
+
import { onBooleanChange, uniqueId } from 'ng-primitives/utils';
|
|
10
10
|
import { injectFormField } from '../form-field/form-field.token';
|
|
11
11
|
import { NgpErrorToken } from './error.token';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
@@ -15,7 +15,7 @@ export class NgpError {
|
|
|
15
15
|
/**
|
|
16
16
|
* Access the form field that the description is associated with.
|
|
17
17
|
*/
|
|
18
|
-
this.formField = injectFormField(
|
|
18
|
+
this.formField = injectFormField();
|
|
19
19
|
/**
|
|
20
20
|
* The id of the error message. If not provided, a unique id will be generated.
|
|
21
21
|
*/
|
|
@@ -27,34 +27,32 @@ export class NgpError {
|
|
|
27
27
|
alias: 'ngpErrorValidator',
|
|
28
28
|
});
|
|
29
29
|
/**
|
|
30
|
-
* Determine
|
|
30
|
+
* Determine if there is an error message.
|
|
31
31
|
*/
|
|
32
|
-
this.
|
|
33
|
-
const errors = this.formField
|
|
32
|
+
this.hasError = computed(() => {
|
|
33
|
+
const errors = this.formField?.errors() ?? [];
|
|
34
34
|
const validator = this.validator();
|
|
35
|
-
|
|
36
|
-
if (!validator) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
return validator && errors.includes(validator) ? 'fail' : 'pass';
|
|
35
|
+
return validator ? errors?.includes(validator) : errors?.length > 0;
|
|
40
36
|
});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Determine whether the validator associated with this error is failing.
|
|
39
|
+
*/
|
|
40
|
+
this.state = computed(() => (this.hasError() ? 'fail' : 'pass'));
|
|
41
|
+
// add or remove the error message when the error state changes
|
|
42
|
+
onBooleanChange(this.hasError, () => this.formField?.addDescription(this.id()), () => this.formField?.removeDescription(this.id()));
|
|
44
43
|
}
|
|
45
44
|
ngOnChanges(changes) {
|
|
46
45
|
if ('id' in changes) {
|
|
47
|
-
this.formField
|
|
48
|
-
this.formField.addDescription(changes['id'].currentValue);
|
|
46
|
+
this.formField?.removeDescription(changes['id'].previousValue);
|
|
49
47
|
}
|
|
50
48
|
}
|
|
51
49
|
ngOnDestroy() {
|
|
52
|
-
this.formField
|
|
50
|
+
this.formField?.removeDescription(this.id());
|
|
53
51
|
}
|
|
54
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.
|
|
55
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.
|
|
52
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpError, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
53
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpError, isStandalone: true, selector: "[ngpError]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "ngpErrorValidator", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "id()", "attr.data-invalid": "formField?.invalid()", "attr.data-valid": "formField?.valid()", "attr.data-touched": "formField?.touched()", "attr.data-pristine": "formField?.pristine()", "attr.data-dirty": "formField?.dirty()", "attr.data-pending": "formField?.pending()", "attr.data-disabled": "formField?.disabled()", "attr.data-validator": "state()" } }, providers: [{ provide: NgpErrorToken, useExisting: NgpError }], exportAs: ["ngpError"], usesOnChanges: true, ngImport: i0 }); }
|
|
56
54
|
}
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpError, decorators: [{
|
|
58
56
|
type: Directive,
|
|
59
57
|
args: [{
|
|
60
58
|
standalone: true,
|
|
@@ -63,15 +61,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
|
|
|
63
61
|
providers: [{ provide: NgpErrorToken, useExisting: NgpError }],
|
|
64
62
|
host: {
|
|
65
63
|
'[attr.id]': 'id()',
|
|
66
|
-
'[attr.data-invalid]': 'formField
|
|
67
|
-
'[attr.data-valid]': 'formField
|
|
68
|
-
'[attr.data-touched]': 'formField
|
|
69
|
-
'[attr.data-pristine]': 'formField
|
|
70
|
-
'[attr.data-dirty]': 'formField
|
|
71
|
-
'[attr.data-pending]': 'formField
|
|
72
|
-
'[attr.data-disabled]': 'formField
|
|
64
|
+
'[attr.data-invalid]': 'formField?.invalid()',
|
|
65
|
+
'[attr.data-valid]': 'formField?.valid()',
|
|
66
|
+
'[attr.data-touched]': 'formField?.touched()',
|
|
67
|
+
'[attr.data-pristine]': 'formField?.pristine()',
|
|
68
|
+
'[attr.data-dirty]': 'formField?.dirty()',
|
|
69
|
+
'[attr.data-pending]': 'formField?.pending()',
|
|
70
|
+
'[attr.data-disabled]': 'formField?.disabled()',
|
|
73
71
|
'[attr.data-validator]': 'state()',
|
|
74
72
|
},
|
|
75
73
|
}]
|
|
76
|
-
}] });
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
74
|
+
}], ctorParameters: () => [] });
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9mb3JtLWZpZWxkL3NyYy9lcnJvci9lcnJvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLFNBQVMsRUFBdUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQW1COUMsTUFBTSxPQUFPLFFBQVE7SUFpQ25CO1FBaENBOztXQUVHO1FBQ2dCLGNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUVqRDs7V0FFRztRQUNNLE9BQUUsR0FBRyxLQUFLLENBQVMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFbkQ7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFnQixJQUFJLEVBQUU7WUFDOUMsS0FBSyxFQUFFLG1CQUFtQjtTQUMzQixDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNnQixhQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFbkMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO1FBRUg7O1dBRUc7UUFDZ0IsVUFBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRzdFLCtEQUErRDtRQUMvRCxlQUFlLENBQ2IsSUFBSSxDQUFDLFFBQVEsRUFDYixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFDL0MsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDOzhHQWxEVSxRQUFRO2tHQUFSLFFBQVEsc3NCQWJSLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7MkZBYW5ELFFBQVE7a0JBakJwQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLFVBQVUsRUFBRSxDQUFDO29CQUM5RCxJQUFJLEVBQUU7d0JBQ0osV0FBVyxFQUFFLE1BQU07d0JBQ25CLHFCQUFxQixFQUFFLHNCQUFzQjt3QkFDN0MsbUJBQW1CLEVBQUUsb0JBQW9CO3dCQUN6QyxxQkFBcUIsRUFBRSxzQkFBc0I7d0JBQzdDLHNCQUFzQixFQUFFLHVCQUF1Qjt3QkFDL0MsbUJBQW1CLEVBQUUsb0JBQW9CO3dCQUN6QyxxQkFBcUIsRUFBRSxzQkFBc0I7d0JBQzdDLHNCQUFzQixFQUFFLHVCQUF1Qjt3QkFDL0MsdUJBQXVCLEVBQUUsU0FBUztxQkFDbkM7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDQyBCWS1ORCA0LjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcywgY29tcHV0ZWQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBvbkJvb2xlYW5DaGFuZ2UsIHVuaXF1ZUlkIH0gZnJvbSAnbmctcHJpbWl0aXZlcy91dGlscyc7XG5pbXBvcnQgeyBpbmplY3RGb3JtRmllbGQgfSBmcm9tICcuLi9mb3JtLWZpZWxkL2Zvcm0tZmllbGQudG9rZW4nO1xuaW1wb3J0IHsgTmdwRXJyb3JUb2tlbiB9IGZyb20gJy4vZXJyb3IudG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbbmdwRXJyb3JdJyxcbiAgZXhwb3J0QXM6ICduZ3BFcnJvcicsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRXJyb3JUb2tlbiwgdXNlRXhpc3Rpbmc6IE5ncEVycm9yIH1dLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLmlkXSc6ICdpZCgpJyxcbiAgICAnW2F0dHIuZGF0YS1pbnZhbGlkXSc6ICdmb3JtRmllbGQ/LmludmFsaWQoKScsXG4gICAgJ1thdHRyLmRhdGEtdmFsaWRdJzogJ2Zvcm1GaWVsZD8udmFsaWQoKScsXG4gICAgJ1thdHRyLmRhdGEtdG91Y2hlZF0nOiAnZm9ybUZpZWxkPy50b3VjaGVkKCknLFxuICAgICdbYXR0ci5kYXRhLXByaXN0aW5lXSc6ICdmb3JtRmllbGQ/LnByaXN0aW5lKCknLFxuICAgICdbYXR0ci5kYXRhLWRpcnR5XSc6ICdmb3JtRmllbGQ/LmRpcnR5KCknLFxuICAgICdbYXR0ci5kYXRhLXBlbmRpbmddJzogJ2Zvcm1GaWVsZD8ucGVuZGluZygpJyxcbiAgICAnW2F0dHIuZGF0YS1kaXNhYmxlZF0nOiAnZm9ybUZpZWxkPy5kaXNhYmxlZCgpJyxcbiAgICAnW2F0dHIuZGF0YS12YWxpZGF0b3JdJzogJ3N0YXRlKCknLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBOZ3BFcnJvciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZm9ybSBmaWVsZCB0aGF0IHRoZSBkZXNjcmlwdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZm9ybUZpZWxkID0gaW5qZWN0Rm9ybUZpZWxkKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgZXJyb3IgbWVzc2FnZS4gSWYgbm90IHByb3ZpZGVkLCBhIHVuaXF1ZSBpZCB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nPih1bmlxdWVJZCgnbmdwLWVycm9yJykpO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRvciA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwsIHtcbiAgICBhbGlhczogJ25ncEVycm9yVmFsaWRhdG9yJyxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGVyZSBpcyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhc0Vycm9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZm9ybUZpZWxkPy5lcnJvcnMoKSA/PyBbXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLnZhbGlkYXRvcigpO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IGVycm9ycz8uaW5jbHVkZXModmFsaWRhdG9yKSA6IGVycm9ycz8ubGVuZ3RoID4gMDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGV0aGVyIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IgaXMgZmFpbGluZy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzdGF0ZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmhhc0Vycm9yKCkgPyAnZmFpbCcgOiAncGFzcycpKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBhZGQgb3IgcmVtb3ZlIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIGVycm9yIHN0YXRlIGNoYW5nZXNcbiAgICBvbkJvb2xlYW5DaGFuZ2UoXG4gICAgICB0aGlzLmhhc0Vycm9yLFxuICAgICAgKCkgPT4gdGhpcy5mb3JtRmllbGQ/LmFkZERlc2NyaXB0aW9uKHRoaXMuaWQoKSksXG4gICAgICAoKSA9PiB0aGlzLmZvcm1GaWVsZD8ucmVtb3ZlRGVzY3JpcHRpb24odGhpcy5pZCgpKSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICgnaWQnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkPy5yZW1vdmVEZXNjcmlwdGlvbihjaGFuZ2VzWydpZCddLnByZXZpb3VzVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUZpZWxkPy5yZW1vdmVEZXNjcmlwdGlvbih0aGlzLmlkKCkpO1xuICB9XG59XG4iXX0=
|