@agorapulse/ui-components 18.0.9 → 18.0.11
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/agorapulse-ui-components-18.0.11.tgz +0 -0
- package/esm2022/datepicker/datepicker.component.mjs +1 -1
- package/esm2022/index.mjs +2 -1
- package/esm2022/input-search/input-search.component.mjs +5 -4
- package/esm2022/nav-selector/agorapulse-ui-components-nav-selector.mjs +5 -0
- package/esm2022/nav-selector/directives/tree-node-accessibility.directive.mjs +30 -0
- package/esm2022/nav-selector/nav-selector-category/nav-selector-category.component.mjs +81 -0
- package/esm2022/nav-selector/nav-selector-category/nav-selector-category.presenter.mjs +29 -0
- package/esm2022/nav-selector/nav-selector-group/nav-selector-group.component.mjs +142 -0
- package/esm2022/nav-selector/nav-selector-group/nav-selector-group.presenter.mjs +31 -0
- package/esm2022/nav-selector/nav-selector-leaf/nav-selector-leaf.component.mjs +240 -0
- package/esm2022/nav-selector/nav-selector-leaf/nav-selector-leaf.presenter.mjs +35 -0
- package/esm2022/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.component.mjs +39 -0
- package/esm2022/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.presenter.mjs +18 -0
- package/esm2022/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.component.mjs +92 -0
- package/esm2022/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.presenter.mjs +31 -0
- package/esm2022/nav-selector/nav-selector.component.mjs +123 -0
- package/esm2022/nav-selector/nav-selector.mjs +9 -0
- package/esm2022/nav-selector/nav-selector.state.mjs +173 -0
- package/esm2022/nav-selector/public_api.mjs +2 -0
- package/esm2022/nav-selector/utils/leaf.utils.mjs +10 -0
- package/esm2022/nav-selector/utils/nav-selector.accessibility.mjs +171 -0
- package/esm2022/nav-selector/utils/nav-selector.builder.mjs +263 -0
- package/esm2022/nav-selector/utils/nav-selector.filter.mjs +102 -0
- package/esm2022/nav-selector/utils/nav-selector.folding.mjs +219 -0
- package/esm2022/nav-selector/utils/nav-selector.minifying.mjs +50 -0
- package/esm2022/nav-selector/utils/nav-selector.multi-select.mjs +208 -0
- package/esm2022/nav-selector/utils/nav-selector.single-select.mjs +91 -0
- package/esm2022/nav-selector/utils/nav-selector.view-more.mjs +98 -0
- package/fesm2022/agorapulse-ui-components-datepicker.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-input-search.mjs +4 -3
- package/fesm2022/agorapulse-ui-components-input-search.mjs.map +1 -1
- package/fesm2022/agorapulse-ui-components-nav-selector.mjs +2198 -0
- package/fesm2022/agorapulse-ui-components-nav-selector.mjs.map +1 -0
- package/fesm2022/agorapulse-ui-components.mjs +1 -0
- package/fesm2022/agorapulse-ui-components.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/input-search/input-search.component.d.ts +1 -1
- package/nav-selector/directives/tree-node-accessibility.directive.d.ts +9 -0
- package/nav-selector/index.d.ts +5 -0
- package/nav-selector/nav-selector-category/nav-selector-category.component.d.ts +16 -0
- package/nav-selector/nav-selector-category/nav-selector-category.presenter.d.ts +14 -0
- package/nav-selector/nav-selector-group/nav-selector-group.component.d.ts +29 -0
- package/nav-selector/nav-selector-group/nav-selector-group.presenter.d.ts +17 -0
- package/nav-selector/nav-selector-leaf/nav-selector-leaf.component.d.ts +51 -0
- package/nav-selector/nav-selector-leaf/nav-selector-leaf.presenter.d.ts +19 -0
- package/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.component.d.ts +13 -0
- package/nav-selector/nav-selector-leaf-detail/nav-selector-leaf-detail.presenter.d.ts +10 -0
- package/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.component.d.ts +24 -0
- package/nav-selector/nav-selector-leaf-details/nav-selector-leaf-details.presenter.d.ts +14 -0
- package/nav-selector/nav-selector.component.d.ts +29 -0
- package/nav-selector/nav-selector.d.ts +220 -0
- package/nav-selector/nav-selector.state.d.ts +47 -0
- package/nav-selector/public_api.d.ts +2 -0
- package/nav-selector/utils/leaf.utils.d.ts +5 -0
- package/nav-selector/utils/nav-selector.accessibility.d.ts +52 -0
- package/nav-selector/utils/nav-selector.builder.d.ts +32 -0
- package/nav-selector/utils/nav-selector.filter.d.ts +30 -0
- package/nav-selector/utils/nav-selector.folding.d.ts +47 -0
- package/nav-selector/utils/nav-selector.minifying.d.ts +27 -0
- package/nav-selector/utils/nav-selector.multi-select.d.ts +54 -0
- package/nav-selector/utils/nav-selector.single-select.d.ts +15 -0
- package/nav-selector/utils/nav-selector.view-more.d.ts +30 -0
- package/package.json +13 -7
- package/agorapulse-ui-components-18.0.9.tgz +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { computed, effect, Injectable, signal } from '@angular/core';
|
|
2
|
+
import { isInternalNavSelectorEntryALeaf, isInternalNavSelectorEntryANode, } from './nav-selector';
|
|
3
|
+
import { NavSelectorAccessibility } from './utils/nav-selector.accessibility';
|
|
4
|
+
import { NavSelectorBuilder } from './utils/nav-selector.builder';
|
|
5
|
+
import { NavSelectorFilter } from './utils/nav-selector.filter';
|
|
6
|
+
import { NavSelectorFolding } from './utils/nav-selector.folding';
|
|
7
|
+
import { NavSelectorMinifying } from './utils/nav-selector.minifying';
|
|
8
|
+
import { NavSelectorMultiSelect } from './utils/nav-selector.multi-select';
|
|
9
|
+
import { NavSelectorSingleSelect } from './utils/nav-selector.single-select';
|
|
10
|
+
import { NavSelectorViewMore } from './utils/nav-selector.view-more';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
/**
|
|
13
|
+
* NavSelectorState is a service that manages the state of the nav selector.
|
|
14
|
+
*
|
|
15
|
+
* It should be provided by the component to ensure that if many nav selectors are used in the same page, they don't share the same state.
|
|
16
|
+
*/
|
|
17
|
+
export class NavSelectorState {
|
|
18
|
+
entries = signal([]);
|
|
19
|
+
multipleModeEnabled = signal(false);
|
|
20
|
+
_texts = signal({
|
|
21
|
+
title: '',
|
|
22
|
+
only: '',
|
|
23
|
+
tokenInvalid: '',
|
|
24
|
+
featureLocked: '',
|
|
25
|
+
searchPlaceholder: '',
|
|
26
|
+
noResults: '',
|
|
27
|
+
viewMore: '',
|
|
28
|
+
viewLess: '',
|
|
29
|
+
});
|
|
30
|
+
lastSelectedUids = signal([]);
|
|
31
|
+
isMultipleModeEnabled = this.multipleModeEnabled;
|
|
32
|
+
search = signal('');
|
|
33
|
+
filteredEntries = computed(() => NavSelectorFilter.filter(this.entries(), this.search()));
|
|
34
|
+
noResults = computed(() => this.filteredEntries().every(({ hidden }) => hidden));
|
|
35
|
+
texts = this._texts.asReadonly();
|
|
36
|
+
leafActionProjection = signal(undefined);
|
|
37
|
+
expanded = signal(true);
|
|
38
|
+
expandedAfterDelay = signal(true);
|
|
39
|
+
selectedUidsChangeCallback = null;
|
|
40
|
+
constructor() {
|
|
41
|
+
effect(() => {
|
|
42
|
+
const newSelectedUids = this.collectSelectedUids(this.entries());
|
|
43
|
+
if (this.selectedUidsChangeCallback) {
|
|
44
|
+
this.selectedUidsChangeCallback(newSelectedUids);
|
|
45
|
+
}
|
|
46
|
+
}, { allowSignalWrites: true });
|
|
47
|
+
}
|
|
48
|
+
updateMultiModeEnabled(enabled) {
|
|
49
|
+
this.multipleModeEnabled.set(enabled);
|
|
50
|
+
}
|
|
51
|
+
updateEntries(entries, initialSelectedEntryUids, detailsDisplayedLimit) {
|
|
52
|
+
if (this.multipleModeEnabled()) {
|
|
53
|
+
this.entries.set(NavSelectorBuilder.buildInMultipleMode(entries, initialSelectedEntryUids, detailsDisplayedLimit));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.entries.set(NavSelectorBuilder.build(entries, initialSelectedEntryUids?.[0] ?? null, detailsDisplayedLimit));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
onGroupToggleFolding(group) {
|
|
60
|
+
this.entries.update(entries => NavSelectorFolding.toggleFolding(entries, group.uid, !this.expanded()));
|
|
61
|
+
}
|
|
62
|
+
onNodeSelect(node) {
|
|
63
|
+
this.entries.update(entries => NavSelectorMultiSelect.selectInMultipleMode(entries, node.uid));
|
|
64
|
+
}
|
|
65
|
+
onLeafClicked(leaf) {
|
|
66
|
+
if (!leaf.selectable) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (this.multipleModeEnabled()) {
|
|
70
|
+
this.entries.update(entries => NavSelectorMultiSelect.selectInMultipleMode(entries, leaf.uid));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.entries.update(entries => NavSelectorSingleSelect.select(entries, leaf.uid));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
onLeafToggleFolding(leaf) {
|
|
77
|
+
this.entries.update(entries => NavSelectorFolding.toggleFolding(entries, leaf.uid, !this.expanded()));
|
|
78
|
+
}
|
|
79
|
+
onLeafDetailClicked(leafDetail) {
|
|
80
|
+
this.entries.update(entries => NavSelectorSingleSelect.select(entries, leafDetail.uid));
|
|
81
|
+
}
|
|
82
|
+
updateTexts(texts) {
|
|
83
|
+
this._texts.set(texts);
|
|
84
|
+
}
|
|
85
|
+
selectOnlyLeaf(leaf) {
|
|
86
|
+
this.entries.update(entries => NavSelectorMultiSelect.selectOnlyALeafInMultipleMode(entries, leaf.uid));
|
|
87
|
+
}
|
|
88
|
+
toggleExpanded() {
|
|
89
|
+
this.expanded.update(expanded => !expanded);
|
|
90
|
+
this.entries.update(entries => {
|
|
91
|
+
if (this.expanded()) {
|
|
92
|
+
return NavSelectorMinifying.expand(entries);
|
|
93
|
+
}
|
|
94
|
+
return NavSelectorMinifying.minify(entries);
|
|
95
|
+
});
|
|
96
|
+
if (!this.expanded()) {
|
|
97
|
+
setTimeout(() => this.expandedAfterDelay.set(this.expanded()), 150);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.expandedAfterDelay.set(this.expanded());
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
onSelectionChange(uids) {
|
|
104
|
+
// Avoid infinite loop if you put unexisting uids as select will generate the same entries but with different reference
|
|
105
|
+
if (JSON.stringify(uids) === JSON.stringify(this.lastSelectedUids())) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this.lastSelectedUids.set(uids);
|
|
109
|
+
const selectedUids = this.collectSelectedUids(this.entries());
|
|
110
|
+
const uidToSelect = uids.filter(uid => selectedUids.every(selectedUid => selectedUid !== uid));
|
|
111
|
+
const uidToUnselect = selectedUids.filter(uid => uids.every(selectedUid => selectedUid !== uid));
|
|
112
|
+
if (!uidToSelect.length && !uidToUnselect.length) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let entries = this.entries();
|
|
116
|
+
if (this.multipleModeEnabled()) {
|
|
117
|
+
for (const uid of [...uidToSelect, ...uidToUnselect]) {
|
|
118
|
+
entries = NavSelectorMultiSelect.selectInMultipleMode(entries, uid);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
entries = NavSelectorSingleSelect.select(entries, uids[0]);
|
|
123
|
+
}
|
|
124
|
+
this.entries.set(entries);
|
|
125
|
+
}
|
|
126
|
+
registerOnSelectedUidsChange(callback) {
|
|
127
|
+
this.selectedUidsChangeCallback = callback;
|
|
128
|
+
}
|
|
129
|
+
onArrowDown() {
|
|
130
|
+
this.entries.update(entries => NavSelectorAccessibility.focusNext(entries));
|
|
131
|
+
}
|
|
132
|
+
onArrowUp() {
|
|
133
|
+
this.entries.update(entries => NavSelectorAccessibility.focusPrevious(entries));
|
|
134
|
+
}
|
|
135
|
+
collectSelectedUids(entries) {
|
|
136
|
+
return entries.flatMap(entry => {
|
|
137
|
+
if (isInternalNavSelectorEntryALeaf(entry)) {
|
|
138
|
+
if (entry.details.length) {
|
|
139
|
+
return entry.details.flatMap(detail => (detail.selected ? [detail.uid] : []));
|
|
140
|
+
}
|
|
141
|
+
return entry.selected ? [entry.uid] : [];
|
|
142
|
+
}
|
|
143
|
+
else if (isInternalNavSelectorEntryANode(entry)) {
|
|
144
|
+
return this.collectSelectedUids(entry.children);
|
|
145
|
+
}
|
|
146
|
+
return [];
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
updateLeafAction(leafActionProjection) {
|
|
150
|
+
this.leafActionProjection.set(leafActionProjection);
|
|
151
|
+
}
|
|
152
|
+
fold(entry) {
|
|
153
|
+
this.entries.update(entries => NavSelectorFolding.fold(entries, entry.uid, !this.expanded()));
|
|
154
|
+
}
|
|
155
|
+
unfold(entry) {
|
|
156
|
+
this.entries.update(entries => NavSelectorFolding.unfold(entries, entry.uid, !this.expanded()));
|
|
157
|
+
}
|
|
158
|
+
updateDetailsDisplayedLimit(detailsDisplayedLimit) {
|
|
159
|
+
this.entries.update(entries => NavSelectorViewMore.changeViewMoreDetailsDisplayedLimit(entries, detailsDisplayedLimit));
|
|
160
|
+
}
|
|
161
|
+
viewMore(leaf) {
|
|
162
|
+
this.entries.update(entries => NavSelectorViewMore.viewMore(entries, leaf.uid));
|
|
163
|
+
}
|
|
164
|
+
viewLess(leaf) {
|
|
165
|
+
this.entries.update(entries => NavSelectorViewMore.viewLess(entries, leaf.uid));
|
|
166
|
+
}
|
|
167
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: NavSelectorState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
168
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: NavSelectorState });
|
|
169
|
+
}
|
|
170
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: NavSelectorState, decorators: [{
|
|
171
|
+
type: Injectable
|
|
172
|
+
}], ctorParameters: () => [] });
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LXNlbGVjdG9yLnN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL25hdi1zZWxlY3Rvci9zcmMvbmF2LXNlbGVjdG9yLnN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUlILCtCQUErQixFQUMvQiwrQkFBK0IsR0FHbEMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFFckU7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFDakIsT0FBTyxHQUFHLE1BQU0sQ0FBNkIsRUFBRSxDQUFDLENBQUM7SUFDakQsbUJBQW1CLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdDLE1BQU0sR0FBRyxNQUFNLENBQTZCO1FBQ2hELEtBQUssRUFBRSxFQUFFO1FBQ1QsSUFBSSxFQUFFLEVBQUU7UUFDUixZQUFZLEVBQUUsRUFBRTtRQUNoQixhQUFhLEVBQUUsRUFBRTtRQUNqQixpQkFBaUIs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QUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUErQjtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELDJCQUEyQixDQUFDLHFCQUE2QjtRQUNyRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLG1DQUFtQyxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUE2QjtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUE2QjtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQzt1R0FoTFEsZ0JBQWdCOzJHQUFoQixnQkFBZ0I7OzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgZWZmZWN0LCBJbmplY3RhYmxlLCBzaWduYWwsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEludGVybmFsTmF2U2VsZWN0b3JFbnRyeSxcbiAgICBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZixcbiAgICBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZkRldGFpbHMsXG4gICAgaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBTGVhZixcbiAgICBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFOb2RlLFxuICAgIE5hdlNlbGVjdG9yRW50cnksXG4gICAgTmF2U2VsZWN0b3JUcmFuc2xhdGVkVGV4dHMsXG59IGZyb20gJy4vbmF2LXNlbGVjdG9yJztcbmltcG9ydCB7IE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eSB9IGZyb20gJy4vdXRpbHMvbmF2LXNlbGVjdG9yLmFjY2Vzc2liaWxpdHknO1xuaW1wb3J0IHsgTmF2U2VsZWN0b3JCdWlsZGVyIH0gZnJvbSAnLi91dGlscy9uYXYtc2VsZWN0b3IuYnVpbGRlcic7XG5pbXBvcnQgeyBOYXZTZWxlY3RvckZpbHRlciB9IGZyb20gJy4vdXRpbHMvbmF2LXNlbGVjdG9yLmZpbHRlcic7XG5pbXBvcnQgeyBOYXZTZWxlY3RvckZvbGRpbmcgfSBmcm9tICcuL3V0aWxzL25hdi1zZWxlY3Rvci5mb2xkaW5nJztcbmltcG9ydCB7IE5hdlNlbGVjdG9yTWluaWZ5aW5nIH0gZnJvbSAnLi91dGlscy9uYXYtc2VsZWN0b3IubWluaWZ5aW5nJztcbmltcG9ydCB7IE5hdlNlbGVjdG9yTXVsdGlTZWxlY3QgfSBmcm9tICcuL3V0aWxzL25hdi1zZWxlY3Rvci5tdWx0aS1zZWxlY3QnO1xuaW1wb3J0IHsgTmF2U2VsZWN0b3JTaW5nbGVTZWxlY3QgfSBmcm9tICcuL3V0aWxzL25hdi1zZWxlY3Rvci5zaW5nbGUtc2VsZWN0JztcbmltcG9ydCB7IE5hdlNlbGVjdG9yVmlld01vcmUgfSBmcm9tICcuL3V0aWxzL25hdi1zZWxlY3Rvci52aWV3LW1vcmUnO1xuXG4vKipcbiAqIE5hdlNlbGVjdG9yU3RhdGUgaXMgYSBzZXJ2aWNlIHRoYXQgbWFuYWdlcyB0aGUgc3RhdGUgb2YgdGhlIG5hdiBzZWxlY3Rvci5cbiAqXG4gKiBJdCBzaG91bGQgYmUgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCB0byBlbnN1cmUgdGhhdCBpZiBtYW55IG5hdiBzZWxlY3RvcnMgYXJlIHVzZWQgaW4gdGhlIHNhbWUgcGFnZSwgdGhleSBkb24ndCBzaGFyZSB0aGUgc2FtZSBzdGF0ZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5hdlNlbGVjdG9yU3RhdGUge1xuICAgIHByaXZhdGUgZW50cmllcyA9IHNpZ25hbDxJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlbXT4oW10pO1xuICAgIHByaXZhdGUgbXVsdGlwbGVNb2RlRW5hYmxlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfdGV4dHMgPSBzaWduYWw8TmF2U2VsZWN0b3JUcmFuc2xhdGVkVGV4dHM+KHtcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBvbmx5OiAnJyxcbiAgICAgICAgdG9rZW5JbnZhbGlkOiAnJyxcbiAgICAgICAgZmVhdHVyZUxvY2tlZDogJycsXG4gICAgICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgbm9SZXN1bHRzOiAnJyxcbiAgICAgICAgdmlld01vcmU6ICcnLFxuICAgICAgICB2aWV3TGVzczogJycsXG4gICAgfSk7XG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWRVaWRzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG5cbiAgICBpc011bHRpcGxlTW9kZUVuYWJsZWQgPSB0aGlzLm11bHRpcGxlTW9kZUVuYWJsZWQ7XG4gICAgc2VhcmNoID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICAgIGZpbHRlcmVkRW50cmllcyA9IGNvbXB1dGVkKCgpID0+IE5hdlNlbGVjdG9yRmlsdGVyLmZpbHRlcih0aGlzLmVudHJpZXMoKSwgdGhpcy5zZWFyY2goKSkpO1xuICAgIG5vUmVzdWx0cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZmlsdGVyZWRFbnRyaWVzKCkuZXZlcnkoKHsgaGlkZGVuIH0pID0+IGhpZGRlbikpO1xuICAgIHRleHRzID0gdGhpcy5fdGV4dHMuYXNSZWFkb25seSgpO1xuXG4gICAgbGVhZkFjdGlvblByb2plY3Rpb24gPSBzaWduYWw8UmVhZG9ubHlBcnJheTxUZW1wbGF0ZVJlZjx1bmtub3duPj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICBleHBhbmRlZCA9IHNpZ25hbCh0cnVlKTtcbiAgICBleHBhbmRlZEFmdGVyRGVsYXkgPSBzaWduYWwodHJ1ZSk7XG5cbiAgICBzZWxlY3RlZFVpZHNDaGFuZ2VDYWxsYmFjazogKChzZWxlY3RlZFVpZHM6IHN0cmluZ1tdKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTZWxlY3RlZFVpZHMgPSB0aGlzLmNvbGxlY3RTZWxlY3RlZFVpZHModGhpcy5lbnRyaWVzKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVWlkc0NoYW5nZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVaWRzQ2hhbmdlQ2FsbGJhY2sobmV3U2VsZWN0ZWRVaWRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlTXVsdGlNb2RlRW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVNb2RlRW5hYmxlZC5zZXQoZW5hYmxlZCk7XG4gICAgfVxuXG4gICAgdXBkYXRlRW50cmllcyhlbnRyaWVzOiBOYXZTZWxlY3RvckVudHJ5W10sIGluaXRpYWxTZWxlY3RlZEVudHJ5VWlkczogc3RyaW5nW10sIGRldGFpbHNEaXNwbGF5ZWRMaW1pdDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlTW9kZUVuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChOYXZTZWxlY3RvckJ1aWxkZXIuYnVpbGRJbk11bHRpcGxlTW9kZShlbnRyaWVzLCBpbml0aWFsU2VsZWN0ZWRFbnRyeVVpZHMsIGRldGFpbHNEaXNwbGF5ZWRMaW1pdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChOYXZTZWxlY3RvckJ1aWxkZXIuYnVpbGQoZW50cmllcywgaW5pdGlhbFNlbGVjdGVkRW50cnlVaWRzPy5bMF0gPz8gbnVsbCwgZGV0YWlsc0Rpc3BsYXllZExpbWl0KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkdyb3VwVG9nZ2xlRm9sZGluZyhncm91cDogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5KSB7XG4gICAgICAgIHRoaXMuZW50cmllcy51cGRhdGUoZW50cmllcyA9PiBOYXZTZWxlY3RvckZvbGRpbmcudG9nZ2xlRm9sZGluZyhlbnRyaWVzLCBncm91cC51aWQsICF0aGlzLmV4cGFuZGVkKCkpKTtcbiAgICB9XG5cbiAgICBvbk5vZGVTZWxlY3Qobm9kZTogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5KSB7XG4gICAgICAgIHRoaXMuZW50cmllcy51cGRhdGUoZW50cmllcyA9PiBOYXZTZWxlY3Rvck11bHRpU2VsZWN0LnNlbGVjdEluTXVsdGlwbGVNb2RlKGVudHJpZXMsIG5vZGUudWlkKSk7XG4gICAgfVxuXG4gICAgb25MZWFmQ2xpY2tlZChsZWFmOiBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZikge1xuICAgICAgICBpZiAoIWxlYWYuc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlTW9kZUVuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnVwZGF0ZShlbnRyaWVzID0+IE5hdlNlbGVjdG9yTXVsdGlTZWxlY3Quc2VsZWN0SW5NdWx0aXBsZU1vZGUoZW50cmllcywgbGVhZi51aWQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy51cGRhdGUoZW50cmllcyA9PiBOYXZTZWxlY3RvclNpbmdsZVNlbGVjdC5zZWxlY3QoZW50cmllcywgbGVhZi51aWQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTGVhZlRvZ2dsZUZvbGRpbmcobGVhZjogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5KSB7XG4gICAgICAgIHRoaXMuZW50cmllcy51cGRhdGUoZW50cmllcyA9PiBOYXZTZWxlY3RvckZvbGRpbmcudG9nZ2xlRm9sZGluZyhlbnRyaWVzLCBsZWFmLnVpZCwgIXRoaXMuZXhwYW5kZWQoKSkpO1xuICAgIH1cblxuICAgIG9uTGVhZkRldGFpbENsaWNrZWQobGVhZkRldGFpbDogSW50ZXJuYWxOYXZTZWxlY3RvckxlYWZEZXRhaWxzKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy51cGRhdGUoZW50cmllcyA9PiBOYXZTZWxlY3RvclNpbmdsZVNlbGVjdC5zZWxlY3QoZW50cmllcywgbGVhZkRldGFpbC51aWQpKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUZXh0cyh0ZXh0czogTmF2U2VsZWN0b3JUcmFuc2xhdGVkVGV4dHMpIHtcbiAgICAgICAgdGhpcy5fdGV4dHMuc2V0KHRleHRzKTtcbiAgICB9XG5cbiAgICBzZWxlY3RPbmx5TGVhZihsZWFmOiBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZikge1xuICAgICAgICB0aGlzLmVudHJpZXMudXBkYXRlKGVudHJpZXMgPT4gTmF2U2VsZWN0b3JNdWx0aVNlbGVjdC5zZWxlY3RPbmx5QUxlYWZJbk11bHRpcGxlTW9kZShlbnRyaWVzLCBsZWFmLnVpZCkpO1xuICAgIH1cblxuICAgIHRvZ2dsZUV4cGFuZGVkKCkge1xuICAgICAgICB0aGlzLmV4cGFuZGVkLnVwZGF0ZShleHBhbmRlZCA9PiAhZXhwYW5kZWQpO1xuICAgICAgICB0aGlzLmVudHJpZXMudXBkYXRlKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYXZTZWxlY3Rvck1pbmlmeWluZy5leHBhbmQoZW50cmllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gTmF2U2VsZWN0b3JNaW5pZnlpbmcubWluaWZ5KGVudHJpZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLmV4cGFuZGVkKCkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5leHBhbmRlZEFmdGVyRGVsYXkuc2V0KHRoaXMuZXhwYW5kZWQoKSksIDE1MCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkQWZ0ZXJEZWxheS5zZXQodGhpcy5leHBhbmRlZCgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKHVpZHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIC8vIEF2b2lkIGluZmluaXRlIGxvb3AgaWYgeW91IHB1dCB1bmV4aXN0aW5nIHVpZHMgYXMgc2VsZWN0IHdpbGwgZ2VuZXJhdGUgdGhlIHNhbWUgZW50cmllcyBidXQgd2l0aCBkaWZmZXJlbnQgcmVmZXJlbmNlXG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh1aWRzKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5sYXN0U2VsZWN0ZWRVaWRzKCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRVaWRzLnNldCh1aWRzKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRVaWRzID0gdGhpcy5jb2xsZWN0U2VsZWN0ZWRVaWRzKHRoaXMuZW50cmllcygpKTtcbiAgICAgICAgY29uc3QgdWlkVG9TZWxlY3QgPSB1aWRzLmZpbHRlcih1aWQgPT4gc2VsZWN0ZWRVaWRzLmV2ZXJ5KHNlbGVjdGVkVWlkID0+IHNlbGVjdGVkVWlkICE9PSB1aWQpKTtcbiAgICAgICAgY29uc3QgdWlkVG9VbnNlbGVjdCA9IHNlbGVjdGVkVWlkcy5maWx0ZXIodWlkID0+IHVpZHMuZXZlcnkoc2VsZWN0ZWRVaWQgPT4gc2VsZWN0ZWRVaWQgIT09IHVpZCkpO1xuXG4gICAgICAgIGlmICghdWlkVG9TZWxlY3QubGVuZ3RoICYmICF1aWRUb1Vuc2VsZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZU1vZGVFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdWlkIG9mIFsuLi51aWRUb1NlbGVjdCwgLi4udWlkVG9VbnNlbGVjdF0pIHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzID0gTmF2U2VsZWN0b3JNdWx0aVNlbGVjdC5zZWxlY3RJbk11bHRpcGxlTW9kZShlbnRyaWVzLCB1aWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW50cmllcyA9IE5hdlNlbGVjdG9yU2luZ2xlU2VsZWN0LnNlbGVjdChlbnRyaWVzLCB1aWRzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGVudHJpZXMpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25TZWxlY3RlZFVpZHNDaGFuZ2UoY2FsbGJhY2s6IChzZWxlY3RlZFVpZHM6IHN0cmluZ1tdKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVaWRzQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBvbkFycm93RG93bigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnVwZGF0ZShlbnRyaWVzID0+IE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eS5mb2N1c05leHQoZW50cmllcykpO1xuICAgIH1cblxuICAgIG9uQXJyb3dVcCgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnVwZGF0ZShlbnRyaWVzID0+IE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eS5mb2N1c1ByZXZpb3VzKGVudHJpZXMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RTZWxlY3RlZFVpZHMoZW50cmllczogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLmZsYXRNYXAoZW50cnkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUxlYWYoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRldGFpbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5kZXRhaWxzLmZsYXRNYXAoZGV0YWlsID0+IChkZXRhaWwuc2VsZWN0ZWQgPyBbZGV0YWlsLnVpZF0gOiBbXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuc2VsZWN0ZWQgPyBbZW50cnkudWlkXSA6IFtdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFOb2RlKGVudHJ5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3RTZWxlY3RlZFVpZHMoZW50cnkuY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVMZWFmQWN0aW9uKGxlYWZBY3Rpb25Qcm9qZWN0aW9uOiBSZWFkb25seUFycmF5PFRlbXBsYXRlUmVmPHVua25vd24+Pikge1xuICAgICAgICB0aGlzLmxlYWZBY3Rpb25Qcm9qZWN0aW9uLnNldChsZWFmQWN0aW9uUHJvamVjdGlvbik7XG4gICAgfVxuXG4gICAgZm9sZChlbnRyeTogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5KSB7XG4gICAgICAgIHRoaXMuZW50cmllcy51cGRhdGUoZW50cmllcyA9PiBOYXZTZWxlY3RvckZvbGRpbmcuZm9sZChlbnRyaWVzLCBlbnRyeS51aWQsICF0aGlzLmV4cGFuZGVkKCkpKTtcbiAgICB9XG5cbiAgICB1bmZvbGQoZW50cnk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeSkge1xuICAgICAgICB0aGlzLmVudHJpZXMudXBkYXRlKGVudHJpZXMgPT4gTmF2U2VsZWN0b3JGb2xkaW5nLnVuZm9sZChlbnRyaWVzLCBlbnRyeS51aWQsICF0aGlzLmV4cGFuZGVkKCkpKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEZXRhaWxzRGlzcGxheWVkTGltaXQoZGV0YWlsc0Rpc3BsYXllZExpbWl0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnVwZGF0ZShlbnRyaWVzID0+IE5hdlNlbGVjdG9yVmlld01vcmUuY2hhbmdlVmlld01vcmVEZXRhaWxzRGlzcGxheWVkTGltaXQoZW50cmllcywgZGV0YWlsc0Rpc3BsYXllZExpbWl0KSk7XG4gICAgfVxuXG4gICAgdmlld01vcmUobGVhZjogSW50ZXJuYWxOYXZTZWxlY3RvckxlYWYpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnVwZGF0ZShlbnRyaWVzID0+IE5hdlNlbGVjdG9yVmlld01vcmUudmlld01vcmUoZW50cmllcywgbGVhZi51aWQpKTtcbiAgICB9XG5cbiAgICB2aWV3TGVzcyhsZWFmOiBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZikge1xuICAgICAgICB0aGlzLmVudHJpZXMudXBkYXRlKGVudHJpZXMgPT4gTmF2U2VsZWN0b3JWaWV3TW9yZS52aWV3TGVzcyhlbnRyaWVzLCBsZWFmLnVpZCkpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './nav-selector.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9uYXYtc2VsZWN0b3Ivc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsY0FBYywwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gICAgTmF2U2VsZWN0b3JDYXRlZ29yeSxcbiAgICBOYXZTZWxlY3Rvckdyb3VwLFxuICAgIE5hdlNlbGVjdG9yTGVhZixcbiAgICBOYXZTZWxlY3RvckxlYWZEZXRhaWxzLFxuICAgIE5hdlNlbGVjdG9yVHJhbnNsYXRlZFRleHRzLFxuICAgIE5vZGVBY2Nlc3NpYmlsaXR5LFxufSBmcm9tICcuL25hdi1zZWxlY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL25hdi1zZWxlY3Rvci5jb21wb25lbnQnO1xuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const isInternalNavSelectorEntryALeafFocusable = (leaf, { parentFolded, minified }) => {
|
|
2
|
+
if (parentFolded) {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
if (minified) {
|
|
6
|
+
return !leaf.disabled && !leaf.displayTokenInvalid && !leaf.displayFeatureLocked;
|
|
7
|
+
}
|
|
8
|
+
return !leaf.disabled;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9uYXYtc2VsZWN0b3Ivc3JjL3V0aWxzL2xlYWYudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sd0NBQXdDLEdBQUcsQ0FDcEQsSUFBNkIsRUFDN0IsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFnRCxFQUNqRSxFQUFFO0lBQ1QsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNmLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDckYsQ0FBQztJQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVybmFsTmF2U2VsZWN0b3JMZWFmIH0gZnJvbSAnLi4vbmF2LXNlbGVjdG9yJztcblxuZXhwb3J0IGNvbnN0IGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUxlYWZGb2N1c2FibGUgPSAoXG4gICAgbGVhZjogSW50ZXJuYWxOYXZTZWxlY3RvckxlYWYsXG4gICAgeyBwYXJlbnRGb2xkZWQsIG1pbmlmaWVkIH06IHsgcGFyZW50Rm9sZGVkOiBib29sZWFuOyBtaW5pZmllZDogYm9vbGVhbiB9XG4pOiBib29sZWFuID0+IHtcbiAgICBpZiAocGFyZW50Rm9sZGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1pbmlmaWVkKSB7XG4gICAgICAgIHJldHVybiAhbGVhZi5kaXNhYmxlZCAmJiAhbGVhZi5kaXNwbGF5VG9rZW5JbnZhbGlkICYmICFsZWFmLmRpc3BsYXlGZWF0dXJlTG9ja2VkO1xuICAgIH1cbiAgICByZXR1cm4gIWxlYWYuZGlzYWJsZWQ7XG59O1xuIl19
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { isInternalNavSelectorEntryACategory, isInternalNavSelectorEntryAGroup, isInternalNavSelectorEntryALeaf, isInternalNavSelectorEntryALeafDetails, } from '../nav-selector';
|
|
2
|
+
/**
|
|
3
|
+
* NavSelectorAccessibility is a utility class that provides methods to manage the accessibility and the focusability of nav selector entries.
|
|
4
|
+
*/
|
|
5
|
+
export class NavSelectorAccessibility {
|
|
6
|
+
/**
|
|
7
|
+
* Set tabIndex to 0 for the first focusable entry and -1 for all other entries
|
|
8
|
+
* @param entries nav selector entries
|
|
9
|
+
*/
|
|
10
|
+
static resetFocus(entries) {
|
|
11
|
+
return entries.reduce((acc, entry) => {
|
|
12
|
+
if (!acc.length) {
|
|
13
|
+
return [{ ...entry, accessibility: { ...entry.accessibility, tabIndex: entry.focusable ? 0 : -1 } }];
|
|
14
|
+
}
|
|
15
|
+
if (acc.every(({ focusable }) => !focusable)) {
|
|
16
|
+
return [...acc, { ...entry, accessibility: { ...entry.accessibility, tabIndex: entry.focusable ? 0 : -1 } }];
|
|
17
|
+
}
|
|
18
|
+
return [...acc, entry];
|
|
19
|
+
}, []);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Focus the given entry and set tabIndex to 0 for the given uid and -1 for all other entries
|
|
23
|
+
* @param entries nav selector entries
|
|
24
|
+
* @param uid the uid of the entry to focus
|
|
25
|
+
*/
|
|
26
|
+
static focus(entries, uid) {
|
|
27
|
+
return entries.map(entry => {
|
|
28
|
+
if (isInternalNavSelectorEntryAGroup(entry) || isInternalNavSelectorEntryACategory(entry)) {
|
|
29
|
+
return {
|
|
30
|
+
...this.focusAnEntry(entry, uid),
|
|
31
|
+
children: NavSelectorAccessibility.focus(entry.children, uid),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (isInternalNavSelectorEntryALeaf(entry)) {
|
|
35
|
+
return {
|
|
36
|
+
...this.focusAnEntry(entry, uid),
|
|
37
|
+
details: entry.details.map(detail => this.focusAnEntry(detail, uid)),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return this.focusAnEntry(entry, uid);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Unfocus the given entry and set tabIndex to -1 for the given uid and 0 for all other entries
|
|
45
|
+
* @param entries nav selector entries
|
|
46
|
+
* @param uid the uid of the entry to unfocus
|
|
47
|
+
*/
|
|
48
|
+
static unfocus(entries, uid) {
|
|
49
|
+
return entries.map(entry => {
|
|
50
|
+
if (isInternalNavSelectorEntryAGroup(entry) || isInternalNavSelectorEntryACategory(entry)) {
|
|
51
|
+
return {
|
|
52
|
+
...this.unfocusAnEntry(entry, uid),
|
|
53
|
+
children: NavSelectorAccessibility.unfocus(entry.children, uid),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (isInternalNavSelectorEntryALeaf(entry)) {
|
|
57
|
+
return {
|
|
58
|
+
...this.unfocusAnEntry(entry, uid),
|
|
59
|
+
details: entry.details.map(detail => this.unfocusAnEntry(detail, uid)),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return this.unfocusAnEntry(entry, uid);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Focus the previous entry focusable and set tabIndex to 0 for the previous focusable entry and -1 for all other entries
|
|
67
|
+
*
|
|
68
|
+
* If not previous entries are focusable, entries will not be modified
|
|
69
|
+
*
|
|
70
|
+
* @param entries nav selector entries
|
|
71
|
+
*/
|
|
72
|
+
static focusPrevious(entries) {
|
|
73
|
+
const flattenEntries = this.flatten(entries);
|
|
74
|
+
const idxFocusedId = flattenEntries.findIndex(({ accessibility }) => accessibility.tabIndex === 0);
|
|
75
|
+
if (idxFocusedId === 0 || this.previousEntryIsFirstAndNotFocusable(flattenEntries, idxFocusedId)) {
|
|
76
|
+
return entries;
|
|
77
|
+
}
|
|
78
|
+
const focusedEntry = flattenEntries[idxFocusedId];
|
|
79
|
+
focusedEntry.accessibility.tabIndex = -1;
|
|
80
|
+
for (let i = idxFocusedId - 1; i >= 0; i--) {
|
|
81
|
+
const entry = flattenEntries[i];
|
|
82
|
+
if (entry.focusable) {
|
|
83
|
+
entry.accessibility.tabIndex = 0;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return this.unflatten(flattenEntries);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Focus the next entry focusable and set tabIndex to 0 for the next focusable entry and -1 for all other entries
|
|
91
|
+
*
|
|
92
|
+
* If not next entries are focusable, entries will not be modified
|
|
93
|
+
*
|
|
94
|
+
* @param entries nav selector entries
|
|
95
|
+
*/
|
|
96
|
+
static focusNext(entries) {
|
|
97
|
+
const flattenEntries = this.flatten(entries);
|
|
98
|
+
const focusableFlattenEntries = flattenEntries.filter(entry => entry.focusable);
|
|
99
|
+
const idxFocusedId = focusableFlattenEntries.findIndex(({ accessibility }) => accessibility.tabIndex === 0);
|
|
100
|
+
if (focusableFlattenEntries.length - 1 <= idxFocusedId) {
|
|
101
|
+
return entries;
|
|
102
|
+
}
|
|
103
|
+
focusableFlattenEntries[idxFocusedId].accessibility.tabIndex = -1;
|
|
104
|
+
focusableFlattenEntries[idxFocusedId + 1].accessibility.tabIndex = 0;
|
|
105
|
+
return this.unflatten(flattenEntries);
|
|
106
|
+
}
|
|
107
|
+
static previousEntryIsFirstAndNotFocusable(flattenEntries, idxFocusedId) {
|
|
108
|
+
if (idxFocusedId - 1 === 0) {
|
|
109
|
+
const previous = flattenEntries[0];
|
|
110
|
+
return !previous.focusable;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
static focusAnEntry(entry, uid) {
|
|
115
|
+
return { ...entry, accessibility: { ...entry.accessibility, tabIndex: entry.uid === uid ? 0 : -1 } };
|
|
116
|
+
}
|
|
117
|
+
static unfocusAnEntry(entry, uid) {
|
|
118
|
+
return { ...entry, accessibility: { ...entry.accessibility, tabIndex: entry.uid === uid ? -1 : entry.accessibility.tabIndex } };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Flatten the nav selector entries. It is easier to work with flat entries for the focus management as we need to know which is the previous or the next entry
|
|
122
|
+
* @param entries nav selector entries
|
|
123
|
+
*/
|
|
124
|
+
static flatten(entries) {
|
|
125
|
+
return entries.flatMap(entry => {
|
|
126
|
+
if (isInternalNavSelectorEntryAGroup(entry) || isInternalNavSelectorEntryACategory(entry)) {
|
|
127
|
+
return [{ ...entry, children: [] }, ...this.flatten(entry.children)];
|
|
128
|
+
}
|
|
129
|
+
if (isInternalNavSelectorEntryALeaf(entry)) {
|
|
130
|
+
return [{ ...entry, details: [] }, ...entry.details.map(detail => ({ ...detail }))];
|
|
131
|
+
}
|
|
132
|
+
return [{ ...entry }];
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Unflatten the nav selector entries
|
|
137
|
+
* @param entries nav selector entries
|
|
138
|
+
*/
|
|
139
|
+
static unflatten(entries) {
|
|
140
|
+
return entries.reduceRight((acc, entry) => {
|
|
141
|
+
if (!acc.length) {
|
|
142
|
+
return [entry];
|
|
143
|
+
}
|
|
144
|
+
if (entry.accessibility.ariaLevel < acc[0].accessibility.ariaLevel) {
|
|
145
|
+
if (isInternalNavSelectorEntryALeaf(entry)) {
|
|
146
|
+
return [
|
|
147
|
+
{
|
|
148
|
+
...entry,
|
|
149
|
+
details: acc
|
|
150
|
+
.filter(it => isInternalNavSelectorEntryALeafDetails(it))
|
|
151
|
+
// Force destroying the reference to the original object else Angular will not detect the change
|
|
152
|
+
.map(it => ({ ...it })),
|
|
153
|
+
},
|
|
154
|
+
...acc.filter(it => !isInternalNavSelectorEntryALeafDetails(it)),
|
|
155
|
+
];
|
|
156
|
+
}
|
|
157
|
+
else if (isInternalNavSelectorEntryAGroup(entry) || isInternalNavSelectorEntryACategory(entry)) {
|
|
158
|
+
return [
|
|
159
|
+
{
|
|
160
|
+
...entry,
|
|
161
|
+
children: acc.filter(({ accessibility }) => accessibility.ariaLevel > entry.accessibility.ariaLevel),
|
|
162
|
+
},
|
|
163
|
+
...acc.filter(({ accessibility }) => accessibility.ariaLevel <= entry.accessibility.ariaLevel),
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return [entry, ...acc];
|
|
168
|
+
}, []);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LXNlbGVjdG9yLmFjY2Vzc2liaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3VpLWNvbXBvbmVudHMvbmF2LXNlbGVjdG9yL3NyYy91dGlscy9uYXYtc2VsZWN0b3IuYWNjZXNzaWJpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBS0gsbUNBQW1DLEVBQ25DLGdDQUFnQyxFQUNoQywrQkFBK0IsRUFDL0Isc0NBQXNDLEdBQ3pDLE1BQU0saUJBQWlCLENBQUM7QUFFekI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2pDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBbUM7UUFDakQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLENBQUM7WUFFRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLGFBQWEsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMs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Q2xFO3dCQUNELEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsc0NBQXNDLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ25FLENBQUM7Z0JBQ04sQ0FBQztxQkFBTSxJQUFJLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxJQUFJLG1DQUFtQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQy9GLE9BQU87d0JBQ0g7NEJBQ0ksR0FBRyxLQUFLOzRCQUNSLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUNoQixDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQ3BEO3lCQUNqQzt3QkFDRCxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO3FCQUNqRyxDQUFDO2dCQUNOLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUMsRUFBRSxFQUFnQyxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnksXG4gICAgSW50ZXJuYWxOYXZTZWxlY3Rvckdyb3VwLFxuICAgIEludGVybmFsTmF2U2VsZWN0b3JMZWFmLFxuICAgIEludGVybmFsTmF2U2VsZWN0b3JMZWFmRGV0YWlscyxcbiAgICBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFDYXRlZ29yeSxcbiAgICBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFHcm91cCxcbiAgICBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFMZWFmLFxuICAgIGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUxlYWZEZXRhaWxzLFxufSBmcm9tICcuLi9uYXYtc2VsZWN0b3InO1xuXG4vKipcbiAqIE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eSBpcyBhIHV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIG1hbmFnZSB0aGUgYWNjZXNzaWJpbGl0eSBhbmQgdGhlIGZvY3VzYWJpbGl0eSBvZiBuYXYgc2VsZWN0b3IgZW50cmllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogU2V0IHRhYkluZGV4IHRvIDAgZm9yIHRoZSBmaXJzdCBmb2N1c2FibGUgZW50cnkgYW5kIC0xIGZvciBhbGwgb3RoZXIgZW50cmllc1xuICAgICAqIEBwYXJhbSBlbnRyaWVzIG5hdiBzZWxlY3RvciBlbnRyaWVzXG4gICAgICovXG4gICAgc3RhdGljIHJlc2V0Rm9jdXMoZW50cmllczogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5W10pOiBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlbXSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLnJlZHVjZSgoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY2MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt7IC4uLmVudHJ5LCBhY2Nlc3NpYmlsaXR5OiB7IC4uLmVudHJ5LmFjY2Vzc2liaWxpdHksIHRhYkluZGV4OiBlbnRyeS5mb2N1c2FibGUgPyAwIDogLTEgfSB9XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFjYy5ldmVyeSgoeyBmb2N1c2FibGUgfSkgPT4gIWZvY3VzYWJsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLmFjYywgeyAuLi5lbnRyeSwgYWNjZXNzaWJpbGl0eTogeyAuLi5lbnRyeS5hY2Nlc3NpYmlsaXR5LCB0YWJJbmRleDogZW50cnkuZm9jdXNhYmxlID8gMCA6IC0xIH0gfV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbLi4uYWNjLCBlbnRyeV07XG4gICAgICAgIH0sIFtdIGFzIEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb2N1cyB0aGUgZ2l2ZW4gZW50cnkgYW5kIHNldCB0YWJJbmRleCB0byAwIGZvciB0aGUgZ2l2ZW4gdWlkIGFuZCAtMSBmb3IgYWxsIG90aGVyIGVudHJpZXNcbiAgICAgKiBAcGFyYW0gZW50cmllcyBuYXYgc2VsZWN0b3IgZW50cmllc1xuICAgICAqIEBwYXJhbSB1aWQgdGhlIHVpZCBvZiB0aGUgZW50cnkgdG8gZm9jdXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9jdXM8VCBleHRlbmRzIEludGVybmFsTmF2U2VsZWN0b3JFbnRyeT4oZW50cmllczogVFtdLCB1aWQ6IHN0cmluZyk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdIHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgIGlmIChpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFHcm91cChlbnRyeSkgfHwgaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBQ2F0ZWdvcnkoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5mb2N1c0FuRW50cnkoZW50cnksIHVpZCksXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBOYXZTZWxlY3RvckFjY2Vzc2liaWxpdHkuZm9jdXMoZW50cnkuY2hpbGRyZW4sIHVpZCksXG4gICAgICAgICAgICAgICAgfSBhcyBJbnRlcm5hbE5hdlNlbGVjdG9yR3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBTGVhZihlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmZvY3VzQW5FbnRyeShlbnRyeSwgdWlkKSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogZW50cnkuZGV0YWlscy5tYXAoZGV0YWlsID0+IHRoaXMuZm9jdXNBbkVudHJ5KGRldGFpbCwgdWlkKSksXG4gICAgICAgICAgICAgICAgfSBhcyBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvY3VzQW5FbnRyeShlbnRyeSwgdWlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5mb2N1cyB0aGUgZ2l2ZW4gZW50cnkgYW5kIHNldCB0YWJJbmRleCB0byAtMSBmb3IgdGhlIGdpdmVuIHVpZCBhbmQgMCBmb3IgYWxsIG90aGVyIGVudHJpZXNcbiAgICAgKiBAcGFyYW0gZW50cmllcyBuYXYgc2VsZWN0b3IgZW50cmllc1xuICAgICAqIEBwYXJhbSB1aWQgdGhlIHVpZCBvZiB0aGUgZW50cnkgdG8gdW5mb2N1c1xuICAgICAqL1xuICAgIHN0YXRpYyB1bmZvY3VzKGVudHJpZXM6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdLCB1aWQ6IHN0cmluZyk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdIHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgIGlmIChpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFHcm91cChlbnRyeSkgfHwgaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBQ2F0ZWdvcnkoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy51bmZvY3VzQW5FbnRyeShlbnRyeSwgdWlkKSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IE5hdlNlbGVjdG9yQWNjZXNzaWJpbGl0eS51bmZvY3VzKGVudHJ5LmNoaWxkcmVuLCB1aWQpLFxuICAgICAgICAgICAgICAgIH0gYXMgSW50ZXJuYWxOYXZTZWxlY3Rvckdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUxlYWYoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy51bmZvY3VzQW5FbnRyeShlbnRyeSwgdWlkKSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogZW50cnkuZGV0YWlscy5tYXAoZGV0YWlsID0+IHRoaXMudW5mb2N1c0FuRW50cnkoZGV0YWlsLCB1aWQpKSxcbiAgICAgICAgICAgICAgICB9IGFzIEludGVybmFsTmF2U2VsZWN0b3JMZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5mb2N1c0FuRW50cnkoZW50cnksIHVpZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvY3VzIHRoZSBwcmV2aW91cyBlbnRyeSBmb2N1c2FibGUgYW5kIHNldCB0YWJJbmRleCB0byAwIGZvciB0aGUgcHJldmlvdXMgZm9jdXNhYmxlIGVudHJ5IGFuZCAtMSBmb3IgYWxsIG90aGVyIGVudHJpZXNcbiAgICAgKlxuICAgICAqIElmIG5vdCBwcmV2aW91cyBlbnRyaWVzIGFyZSBmb2N1c2FibGUsIGVudHJpZXMgd2lsbCBub3QgYmUgbW9kaWZpZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRyaWVzIG5hdiBzZWxlY3RvciBlbnRyaWVzXG4gICAgICovXG4gICAgc3RhdGljIGZvY3VzUHJldmlvdXM8VCBleHRlbmRzIEludGVybmFsTmF2U2VsZWN0b3JFbnRyeT4oZW50cmllczogVFtdKTogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5W10ge1xuICAgICAgICBjb25zdCBmbGF0dGVuRW50cmllcyA9IHRoaXMuZmxhdHRlbihlbnRyaWVzKTtcblxuICAgICAgICBjb25zdCBpZHhGb2N1c2VkSWQgPSBmbGF0dGVuRW50cmllcy5maW5kSW5kZXgoKHsgYWNjZXNzaWJpbGl0eSB9KSA9PiBhY2Nlc3NpYmlsaXR5LnRhYkluZGV4ID09PSAwKTtcblxuICAgICAgICBpZiAoaWR4Rm9jdXNlZElkID09PSAwIHx8IHRoaXMucHJldmlvdXNFbnRyeUlzRmlyc3RBbmROb3RGb2N1c2FibGUoZmxhdHRlbkVudHJpZXMsIGlkeEZvY3VzZWRJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9jdXNlZEVudHJ5ID0gZmxhdHRlbkVudHJpZXNbaWR4Rm9jdXNlZElkXTtcbiAgICAgICAgZm9jdXNlZEVudHJ5LmFjY2Vzc2liaWxpdHkudGFiSW5kZXggPSAtMTtcblxuICAgICAgICBmb3IgKGxldCBpID0gaWR4Rm9jdXNlZElkIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZmxhdHRlbkVudHJpZXNbaV07XG4gICAgICAgICAgICBpZiAoZW50cnkuZm9jdXNhYmxlKSB7XG4gICAgICAgICAgICAgICAgZW50cnkuYWNjZXNzaWJpbGl0eS50YWJJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy51bmZsYXR0ZW4oZmxhdHRlbkVudHJpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvY3VzIHRoZSBuZXh0IGVudHJ5IGZvY3VzYWJsZSBhbmQgc2V0IHRhYkluZGV4IHRvIDAgZm9yIHRoZSBuZXh0IGZvY3VzYWJsZSBlbnRyeSBhbmQgLTEgZm9yIGFsbCBvdGhlciBlbnRyaWVzXG4gICAgICpcbiAgICAgKiBJZiBub3QgbmV4dCBlbnRyaWVzIGFyZSBmb2N1c2FibGUsIGVudHJpZXMgd2lsbCBub3QgYmUgbW9kaWZpZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRyaWVzIG5hdiBzZWxlY3RvciBlbnRyaWVzXG4gICAgICovXG4gICAgc3RhdGljIGZvY3VzTmV4dDxUIGV4dGVuZHMgSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5PihlbnRyaWVzOiBUW10pOiBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlbXSB7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5FbnRyaWVzID0gdGhpcy5mbGF0dGVuKGVudHJpZXMpO1xuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZUZsYXR0ZW5FbnRyaWVzID0gZmxhdHRlbkVudHJpZXMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5LmZvY3VzYWJsZSk7XG5cbiAgICAgICAgY29uc3QgaWR4Rm9jdXNlZElkID0gZm9jdXNhYmxlRmxhdHRlbkVudHJpZXMuZmluZEluZGV4KCh7IGFjY2Vzc2liaWxpdHkgfSkgPT4gYWNjZXNzaWJpbGl0eS50YWJJbmRleCA9PT0gMCk7XG5cbiAgICAgICAgaWYgKGZvY3VzYWJsZUZsYXR0ZW5FbnRyaWVzLmxlbmd0aCAtIDEgPD0gaWR4Rm9jdXNlZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvY3VzYWJsZUZsYXR0ZW5FbnRyaWVzW2lkeEZvY3VzZWRJZF0uYWNjZXNzaWJpbGl0eS50YWJJbmRleCA9IC0xO1xuXG4gICAgICAgIGZvY3VzYWJsZUZsYXR0ZW5FbnRyaWVzW2lkeEZvY3VzZWRJZCArIDFdLmFjY2Vzc2liaWxpdHkudGFiSW5kZXggPSAwO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnVuZmxhdHRlbihmbGF0dGVuRW50cmllcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHJldmlvdXNFbnRyeUlzRmlyc3RBbmROb3RGb2N1c2FibGUoZmxhdHRlbkVudHJpZXM6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeVtdLCBpZHhGb2N1c2VkSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaWR4Rm9jdXNlZElkIC0gMSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBmbGF0dGVuRW50cmllc1swXTtcbiAgICAgICAgICAgIHJldHVybiAhcHJldmlvdXMuZm9jdXNhYmxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb2N1c0FuRW50cnkoZW50cnk6IEludGVybmFsTmF2U2VsZWN0b3JFbnRyeSwgdWlkOiBzdHJpbmcpOiBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnkge1xuICAgICAgICByZXR1cm4geyAuLi5lbnRyeSwgYWNjZXNzaWJpbGl0eTogeyAuLi5lbnRyeS5hY2Nlc3NpYmlsaXR5LCB0YWJJbmRleDogZW50cnkudWlkID09PSB1aWQgPyAwIDogLTEgfSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHVuZm9jdXNBbkVudHJ5KGVudHJ5OiBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnksIHVpZDogc3RyaW5nKTogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5IHtcbiAgICAgICAgcmV0dXJuIHsgLi4uZW50cnksIGFjY2Vzc2liaWxpdHk6IHsgLi4uZW50cnkuYWNjZXNzaWJpbGl0eSwgdGFiSW5kZXg6IGVudHJ5LnVpZCA9PT0gdWlkID8gLTEgOiBlbnRyeS5hY2Nlc3NpYmlsaXR5LnRhYkluZGV4IH0gfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVuIHRoZSBuYXYgc2VsZWN0b3IgZW50cmllcy4gSXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBmbGF0IGVudHJpZXMgZm9yIHRoZSBmb2N1cyBtYW5hZ2VtZW50IGFzIHdlIG5lZWQgdG8ga25vdyB3aGljaCBpcyB0aGUgcHJldmlvdXMgb3IgdGhlIG5leHQgZW50cnlcbiAgICAgKiBAcGFyYW0gZW50cmllcyBuYXYgc2VsZWN0b3IgZW50cmllc1xuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZsYXR0ZW4oZW50cmllczogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5W10pOiBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlbXSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLmZsYXRNYXAoZW50cnkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUdyb3VwKGVudHJ5KSB8fCBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFDYXRlZ29yeShlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3sgLi4uZW50cnksIGNoaWxkcmVuOiBbXSB9LCAuLi50aGlzLmZsYXR0ZW4oZW50cnkuY2hpbGRyZW4pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFMZWFmKGVudHJ5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbeyAuLi5lbnRyeSwgZGV0YWlsczogW10gfSwgLi4uZW50cnkuZGV0YWlscy5tYXAoZGV0YWlsID0+ICh7IC4uLmRldGFpbCB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFt7IC4uLmVudHJ5IH1dO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmZsYXR0ZW4gdGhlIG5hdiBzZWxlY3RvciBlbnRyaWVzXG4gICAgICogQHBhcmFtIGVudHJpZXMgbmF2IHNlbGVjdG9yIGVudHJpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyB1bmZsYXR0ZW48VCBleHRlbmRzIEludGVybmFsTmF2U2VsZWN0b3JFbnRyeT4oZW50cmllczogVFtdKTogSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5W10ge1xuICAgICAgICByZXR1cm4gZW50cmllcy5yZWR1Y2VSaWdodCgoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY2MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtlbnRyeV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50cnkuYWNjZXNzaWJpbGl0eS5hcmlhTGV2ZWwgPCBhY2NbMF0uYWNjZXNzaWJpbGl0eS5hcmlhTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBTGVhZihlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBhY2NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpdCA9PiBpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFMZWFmRGV0YWlscyhpdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIGRlc3Ryb3lpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb2JqZWN0IGVsc2UgQW5ndWxhciB3aWxsIG5vdCBkZXRlY3QgdGhlIGNoYW5nZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGl0ID0+ICh7IC4uLml0IH0pKSBhcyBJbnRlcm5hbE5hdlNlbGVjdG9yTGVhZkRldGFpbHNbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5hY2MuZmlsdGVyKGl0ID0+ICFpc0ludGVybmFsTmF2U2VsZWN0b3JFbnRyeUFMZWFmRGV0YWlscyhpdCkpLFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlBR3JvdXAoZW50cnkpIHx8IGlzSW50ZXJuYWxOYXZTZWxlY3RvckVudHJ5QUNhdGVnb3J5KGVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBhY2MuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyBhY2Nlc3NpYmlsaXR5IH0pID0+IGFjY2Vzc2liaWxpdHkuYXJpYUxldmVsID4gZW50cnkuYWNjZXNzaWJpbGl0eS5hcmlhTGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIGFzIEludGVybmFsTmF2U2VsZWN0b3JMZWFmW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uYWNjLmZpbHRlcigoeyBhY2Nlc3NpYmlsaXR5IH0pID0+IGFjY2Vzc2liaWxpdHkuYXJpYUxldmVsIDw9IGVudHJ5LmFjY2Vzc2liaWxpdHkuYXJpYUxldmVsKSxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2VudHJ5LCAuLi5hY2NdO1xuICAgICAgICB9LCBbXSBhcyBJbnRlcm5hbE5hdlNlbGVjdG9yRW50cnlbXSk7XG4gICAgfVxufVxuIl19
|