design-angular-kit 0.13.0 → 1.0.0-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 +61 -31
- package/esm2020/design-angular-kit.mjs +5 -0
- package/esm2020/lib/badge/badge.directive.mjs +83 -0
- package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +66 -0
- package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +89 -0
- package/esm2020/lib/button/button.directive.mjs +185 -0
- package/esm2020/lib/button/button.module.mjs +18 -0
- package/esm2020/lib/checkbox/checkbox.component.mjs +138 -0
- package/esm2020/lib/collapse/collapse-group.component.mjs +57 -0
- package/esm2020/lib/collapse/collapse-item.component.mjs +79 -0
- package/esm2020/lib/collapse/collapse.config.mjs +12 -0
- package/esm2020/lib/collapse/collapse.directive.mjs +55 -0
- package/esm2020/lib/collapse/collapse.module.mjs +22 -0
- package/esm2020/lib/design-angular-kit.module.mjs +142 -0
- package/esm2020/lib/dropdown/dropdown-divider.component.mjs +11 -0
- package/esm2020/lib/dropdown/dropdown-item.component.mjs +97 -0
- package/esm2020/lib/dropdown/dropdown.component.mjs +143 -0
- package/esm2020/lib/dropdown/dropdown.config.mjs +12 -0
- package/esm2020/lib/dropdown/dropdown.directive.mjs +156 -0
- package/esm2020/lib/dropdown/dropdown.module.mjs +25 -0
- package/esm2020/lib/enums/icons.enum.mjs +27 -0
- package/esm2020/lib/form-input/form-input-password.utils.mjs +154 -0
- package/esm2020/lib/form-input/form-input.component.mjs +495 -0
- package/esm2020/lib/form-input/it-prefix.directive.mjs +13 -0
- package/esm2020/lib/form-input/it-suffix.directive.mjs +13 -0
- package/esm2020/lib/form-input/it-text-prefix.directive.mjs +13 -0
- package/esm2020/lib/form-input/it-text-suffix.directive.mjs +13 -0
- package/esm2020/lib/form-input/mark-matching-text.pipe.mjs +36 -0
- package/esm2020/lib/icon/icon.component.mjs +87 -0
- package/esm2020/lib/icon/icon.module.mjs +18 -0
- package/esm2020/lib/models/Alignment.mjs +15 -0
- package/esm2020/lib/models/ButtonSize.mjs +15 -0
- package/esm2020/lib/models/InputType.mjs +44 -0
- package/esm2020/lib/models/ThemeColor.mjs +30 -0
- package/esm2020/lib/popover/popover.config.mjs +17 -0
- package/esm2020/lib/popover/popover.directive.mjs +33 -0
- package/esm2020/lib/popover/popover.module.mjs +19 -0
- package/esm2020/lib/progress-bar/progress-bar.component.mjs +98 -0
- package/esm2020/lib/radio/radio.component.mjs +287 -0
- package/esm2020/lib/radio/unique-selection-dispatcher.mjs +55 -0
- package/esm2020/lib/tabs/tab-group.component.mjs +177 -0
- package/esm2020/lib/tabs/tab.component.mjs +73 -0
- package/esm2020/lib/tabs/tabs.module.mjs +20 -0
- package/esm2020/lib/toggle/toggle.component.mjs +86 -0
- package/esm2020/lib/tooltip/tooltip.config.mjs +17 -0
- package/esm2020/lib/tooltip/tooltip.directive.mjs +43 -0
- package/esm2020/lib/tooltip/tooltip.module.mjs +19 -0
- package/esm2020/lib/util/focus-mouse.directive.mjs +32 -0
- package/esm2020/lib/util/util.mjs +12 -0
- package/esm2020/lib/util/utils.module.mjs +16 -0
- package/esm2020/public_api.mjs +40 -0
- package/fesm2015/design-angular-kit.mjs +3181 -0
- package/fesm2015/design-angular-kit.mjs.map +1 -0
- package/fesm2020/design-angular-kit.mjs +3160 -0
- package/fesm2020/design-angular-kit.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/badge/badge.directive.d.ts +11 -5
- package/lib/breadcrumb/breadcrumb-item.component.d.ts +16 -5
- package/lib/breadcrumb/breadcrumb.component.d.ts +12 -5
- package/lib/button/button.directive.d.ts +72 -0
- package/lib/button/button.module.d.ts +8 -0
- package/lib/checkbox/checkbox.component.d.ts +25 -5
- package/lib/collapse/collapse-group.component.d.ts +6 -2
- package/lib/collapse/collapse-item.component.d.ts +16 -8
- package/lib/collapse/collapse.config.d.ts +6 -0
- package/lib/collapse/collapse.directive.d.ts +13 -28
- package/lib/collapse/collapse.module.d.ts +12 -0
- package/lib/design-angular-kit.module.d.ts +27 -0
- package/lib/dropdown/dropdown-divider.component.d.ts +3 -0
- package/lib/dropdown/dropdown-item.component.d.ts +22 -8
- package/lib/dropdown/dropdown.component.d.ts +34 -26
- package/lib/dropdown/dropdown.config.d.ts +6 -0
- package/lib/dropdown/dropdown.directive.d.ts +77 -0
- package/lib/dropdown/dropdown.module.d.ts +15 -0
- package/lib/enums/icons.enum.d.ts +23 -0
- package/lib/form-input/form-input-password.utils.d.ts +45 -0
- package/lib/form-input/form-input.component.d.ts +202 -20
- package/lib/form-input/it-prefix.directive.d.ts +5 -0
- package/lib/form-input/it-suffix.directive.d.ts +5 -0
- package/lib/form-input/it-text-prefix.directive.d.ts +5 -0
- package/lib/form-input/it-text-suffix.directive.d.ts +5 -0
- package/lib/form-input/mark-matching-text.pipe.d.ts +10 -0
- package/lib/icon/icon.component.d.ts +34 -0
- package/lib/icon/icon.module.d.ts +8 -0
- package/lib/models/Alignment.d.ts +12 -0
- package/lib/models/ButtonSize.d.ts +1 -1
- package/lib/models/InputType.d.ts +22 -1
- package/lib/models/ThemeColor.d.ts +1 -1
- package/lib/popover/popover.config.d.ts +5 -6
- package/lib/popover/popover.directive.d.ts +13 -108
- package/lib/popover/popover.module.d.ts +9 -0
- package/lib/progress-bar/progress-bar.component.d.ts +25 -19
- package/lib/radio/radio.component.d.ts +22 -10
- package/lib/radio/unique-selection-dispatcher.d.ts +3 -0
- package/lib/tabs/tab-group.component.d.ts +17 -11
- package/lib/tabs/tab.component.d.ts +6 -2
- package/lib/tabs/tabs.module.d.ts +10 -0
- package/lib/toggle/toggle.component.d.ts +9 -4
- package/lib/tooltip/tooltip.config.d.ts +7 -7
- package/lib/tooltip/tooltip.directive.d.ts +12 -92
- package/lib/tooltip/tooltip.module.d.ts +9 -0
- package/lib/util/focus-mouse.directive.d.ts +13 -0
- package/lib/util/utils.module.d.ts +7 -0
- package/package.json +34 -20
- package/public_api.d.ts +16 -2
- package/bundles/design-angular-kit.umd.js +0 -6258
- package/bundles/design-angular-kit.umd.js.map +0 -1
- package/bundles/design-angular-kit.umd.min.js +0 -31
- package/bundles/design-angular-kit.umd.min.js.map +0 -1
- package/design-angular-kit.d.ts +0 -8
- package/design-angular-kit.metadata.json +0 -1
- package/esm2015/design-angular-kit.js +0 -14
- package/esm2015/lib/badge/badge.directive.js +0 -116
- package/esm2015/lib/breadcrumb/breadcrumb-item.component.js +0 -117
- package/esm2015/lib/breadcrumb/breadcrumb.component.js +0 -128
- package/esm2015/lib/button/button.component.js +0 -165
- package/esm2015/lib/checkbox/checkbox.component.js +0 -170
- package/esm2015/lib/collapse/collapse-group.component.js +0 -87
- package/esm2015/lib/collapse/collapse-item.component.js +0 -148
- package/esm2015/lib/collapse/collapse.directive.js +0 -153
- package/esm2015/lib/design-angular-kit.module.js +0 -90
- package/esm2015/lib/dropdown/dropdown-divider.component.js +0 -18
- package/esm2015/lib/dropdown/dropdown-header.component.js +0 -29
- package/esm2015/lib/dropdown/dropdown-item.component.js +0 -157
- package/esm2015/lib/dropdown/dropdown.component.js +0 -248
- package/esm2015/lib/form-input/form-input.component.js +0 -489
- package/esm2015/lib/models/ButtonSize.js +0 -25
- package/esm2015/lib/models/IconPosition.js +0 -21
- package/esm2015/lib/models/InputType.js +0 -33
- package/esm2015/lib/models/InteractionTrigger.js +0 -35
- package/esm2015/lib/models/ThemeColor.js +0 -45
- package/esm2015/lib/popover/popover.component.js +0 -134
- package/esm2015/lib/popover/popover.config.js +0 -35
- package/esm2015/lib/popover/popover.directive.js +0 -433
- package/esm2015/lib/popover/popup.js +0 -105
- package/esm2015/lib/popover/positioning.js +0 -349
- package/esm2015/lib/popover/triggers.js +0 -99
- package/esm2015/lib/progress-bar/progress-bar.component.js +0 -170
- package/esm2015/lib/radio/radio.component.js +0 -526
- package/esm2015/lib/radio/unique-selection-dispatcher.js +0 -70
- package/esm2015/lib/tabs/tab-group.component.js +0 -339
- package/esm2015/lib/tabs/tab.component.js +0 -143
- package/esm2015/lib/toggle/toggle.component.js +0 -173
- package/esm2015/lib/tooltip/popup.js +0 -105
- package/esm2015/lib/tooltip/positioning.js +0 -349
- package/esm2015/lib/tooltip/tooltip.component.js +0 -77
- package/esm2015/lib/tooltip/tooltip.config.js +0 -31
- package/esm2015/lib/tooltip/tooltip.directive.js +0 -384
- package/esm2015/lib/tooltip/triggers.js +0 -99
- package/esm2015/lib/util/util.js +0 -30
- package/esm2015/public_api.js +0 -31
- package/esm5/design-angular-kit.js +0 -14
- package/esm5/lib/badge/badge.directive.js +0 -145
- package/esm5/lib/breadcrumb/breadcrumb-item.component.js +0 -135
- package/esm5/lib/breadcrumb/breadcrumb.component.js +0 -164
- package/esm5/lib/button/button.component.js +0 -221
- package/esm5/lib/checkbox/checkbox.component.js +0 -200
- package/esm5/lib/collapse/collapse-group.component.js +0 -102
- package/esm5/lib/collapse/collapse-item.component.js +0 -183
- package/esm5/lib/collapse/collapse.directive.js +0 -210
- package/esm5/lib/design-angular-kit.module.js +0 -94
- package/esm5/lib/dropdown/dropdown-divider.component.js +0 -20
- package/esm5/lib/dropdown/dropdown-header.component.js +0 -27
- package/esm5/lib/dropdown/dropdown-item.component.js +0 -197
- package/esm5/lib/dropdown/dropdown.component.js +0 -309
- package/esm5/lib/form-input/form-input.component.js +0 -582
- package/esm5/lib/models/ButtonSize.js +0 -25
- package/esm5/lib/models/IconPosition.js +0 -21
- package/esm5/lib/models/InputType.js +0 -33
- package/esm5/lib/models/InteractionTrigger.js +0 -35
- package/esm5/lib/models/ThemeColor.js +0 -45
- package/esm5/lib/popover/popover.component.js +0 -144
- package/esm5/lib/popover/popover.config.js +0 -37
- package/esm5/lib/popover/popover.directive.js +0 -573
- package/esm5/lib/popover/popup.js +0 -116
- package/esm5/lib/popover/positioning.js +0 -446
- package/esm5/lib/popover/triggers.js +0 -115
- package/esm5/lib/progress-bar/progress-bar.component.js +0 -218
- package/esm5/lib/radio/radio.component.js +0 -610
- package/esm5/lib/radio/unique-selection-dispatcher.js +0 -108
- package/esm5/lib/tabs/tab-group.component.js +0 -401
- package/esm5/lib/tabs/tab.component.js +0 -156
- package/esm5/lib/toggle/toggle.component.js +0 -200
- package/esm5/lib/tooltip/popup.js +0 -116
- package/esm5/lib/tooltip/positioning.js +0 -446
- package/esm5/lib/tooltip/tooltip.component.js +0 -80
- package/esm5/lib/tooltip/tooltip.config.js +0 -33
- package/esm5/lib/tooltip/tooltip.directive.js +0 -516
- package/esm5/lib/tooltip/triggers.js +0 -115
- package/esm5/lib/util/util.js +0 -48
- package/esm5/public_api.js +0 -31
- package/fesm2015/design-angular-kit.js +0 -5094
- package/fesm2015/design-angular-kit.js.map +0 -1
- package/fesm5/design-angular-kit.js +0 -6314
- package/fesm5/design-angular-kit.js.map +0 -1
- package/lib/button/button.component.d.ts +0 -50
- package/lib/dropdown/dropdown-header.component.d.ts +0 -3
- package/lib/models/IconPosition.d.ts +0 -9
- package/lib/models/InteractionTrigger.d.ts +0 -19
- package/lib/popover/popover.component.d.ts +0 -25
- package/lib/popover/popup.d.ts +0 -27
- package/lib/popover/positioning.d.ts +0 -32
- package/lib/popover/triggers.d.ts +0 -18
- package/lib/tooltip/popup.d.ts +0 -27
- package/lib/tooltip/positioning.d.ts +0 -32
- package/lib/tooltip/tooltip.component.d.ts +0 -20
- package/lib/tooltip/triggers.d.ts +0 -18
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, forwardRef, ChangeDetectionStrategy, Directive, ContentChildren, Optional, HostBinding } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./unique-selection-dispatcher";
|
|
5
|
+
import * as i2 from "../util/focus-mouse.directive";
|
|
6
|
+
let identifier = 0;
|
|
7
|
+
function _coerceBooleanProperty(value) {
|
|
8
|
+
return value != null && `${value}` !== 'false';
|
|
9
|
+
}
|
|
10
|
+
export class RadioChange {
|
|
11
|
+
constructor(source, value) {
|
|
12
|
+
this.source = source;
|
|
13
|
+
this.value = value;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class RadioGroupDirective {
|
|
17
|
+
constructor(_changeDetector) {
|
|
18
|
+
this._changeDetector = _changeDetector;
|
|
19
|
+
this.role = 'radiogroup';
|
|
20
|
+
/**
|
|
21
|
+
* Il valore selezionato per il gruppo. Dovrebbe essere uguale al valore del radio button selezionato se
|
|
22
|
+
* *esiste* un radio button con un valore corrispondente. Se *non esiste* un radio button corrispondente
|
|
23
|
+
* questo valore persiste ed è applicato nel caso in cui un nuovo radio button viene aggiunto con il valore
|
|
24
|
+
* corrispondente.
|
|
25
|
+
*/
|
|
26
|
+
this._value = null;
|
|
27
|
+
/** L'attributo HTML name da applicare ai radio button in questo gruppo */
|
|
28
|
+
this._name = `it-radio-group-${identifier++}`;
|
|
29
|
+
/** Il radio button attualmente selezionato. */
|
|
30
|
+
this._selected = null;
|
|
31
|
+
/** se `value` è stato settato al suo valore iniziale. */
|
|
32
|
+
this._isInitialized = false;
|
|
33
|
+
/** Se il radio group è disabilitato. */
|
|
34
|
+
this._disabled = false;
|
|
35
|
+
/**
|
|
36
|
+
* Evento emesso quando il valore del gruppo cambia.
|
|
37
|
+
* Gli eventi di change sono emessi soltanto quando il valore cambia a causa dell'interazione dell'utente
|
|
38
|
+
* con il radio button (stesso comportamento di `<input type-"radio">`).
|
|
39
|
+
*/
|
|
40
|
+
this.change = new EventEmitter();
|
|
41
|
+
/** Il metodo da chiamare per aggiornare ngModel */
|
|
42
|
+
this._controlValueAccessorChangeFn = () => { };
|
|
43
|
+
this.onTouched = () => { };
|
|
44
|
+
}
|
|
45
|
+
/** Nome del gruppo di radio button. Tutti i radio button all'interno del gruppo avranno questo nome. */
|
|
46
|
+
get name() { return this._name; }
|
|
47
|
+
set name(value) {
|
|
48
|
+
this._name = value;
|
|
49
|
+
this._updateRadioButtonNames();
|
|
50
|
+
}
|
|
51
|
+
/** Valore del radio button. */
|
|
52
|
+
get value() { return this._value; }
|
|
53
|
+
set value(newValue) {
|
|
54
|
+
if (this._value !== newValue) {
|
|
55
|
+
this._value = newValue;
|
|
56
|
+
this._updateSelectedRadioFromValue();
|
|
57
|
+
this._checkSelectedRadioButton();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
_checkSelectedRadioButton() {
|
|
61
|
+
if (this._selected && !this._selected.checked) {
|
|
62
|
+
this._selected.checked = true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Il radio button selezionato. */
|
|
66
|
+
get selected() { return this._selected; }
|
|
67
|
+
set selected(selected) {
|
|
68
|
+
this._selected = selected;
|
|
69
|
+
this.value = selected ? selected.value : null;
|
|
70
|
+
this._checkSelectedRadioButton();
|
|
71
|
+
}
|
|
72
|
+
/** Se il gruppo è disabled */
|
|
73
|
+
get disabled() { return this._disabled; }
|
|
74
|
+
set disabled(value) {
|
|
75
|
+
this._disabled = _coerceBooleanProperty(value);
|
|
76
|
+
this._markRadiosForCheck();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Inizializza le proprietà quando il contenuto dei figliè disponibile.
|
|
80
|
+
* Questo permette di propagare gli attributi rilevanti ai radio buttons associati.
|
|
81
|
+
*/
|
|
82
|
+
ngAfterContentInit() {
|
|
83
|
+
this._isInitialized = true;
|
|
84
|
+
}
|
|
85
|
+
_touch() {
|
|
86
|
+
if (this.onTouched) {
|
|
87
|
+
this.onTouched();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
_updateRadioButtonNames() {
|
|
91
|
+
if (this._radios) {
|
|
92
|
+
this._radios.forEach(radio => {
|
|
93
|
+
radio.name = this.name;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Aggiorna il radio button `selected` a seconda del suo _value. */
|
|
98
|
+
_updateSelectedRadioFromValue() {
|
|
99
|
+
this._selected = null;
|
|
100
|
+
this._radios.forEach(radio => {
|
|
101
|
+
radio.checked = this.value === radio.value;
|
|
102
|
+
if (radio.checked) {
|
|
103
|
+
this._selected = radio;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/** Invia l'evento change con la selezione corrente e il valore del gruppo. */
|
|
108
|
+
_emitChangeEvent() {
|
|
109
|
+
if (this._isInitialized) {
|
|
110
|
+
this.change.emit(new RadioChange(this._selected, this._value));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
_markRadiosForCheck() {
|
|
114
|
+
if (this._radios) {
|
|
115
|
+
this._radios.forEach(radio => radio._markForCheck());
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
writeValue(value) {
|
|
119
|
+
this.value = value;
|
|
120
|
+
this._changeDetector.markForCheck();
|
|
121
|
+
}
|
|
122
|
+
registerOnChange(fn) {
|
|
123
|
+
this._controlValueAccessorChangeFn = fn;
|
|
124
|
+
}
|
|
125
|
+
registerOnTouched(fn) {
|
|
126
|
+
this.onTouched = fn;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
RadioGroupDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: RadioGroupDirective, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
130
|
+
RadioGroupDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.11", type: RadioGroupDirective, selector: "it-radio-group", inputs: { name: "name", value: "value", selected: "selected", disabled: "disabled" }, outputs: { change: "change" }, host: { properties: { "attr.role": "this.role" } }, providers: [{
|
|
131
|
+
provide: NG_VALUE_ACCESSOR,
|
|
132
|
+
useExisting: forwardRef(() => RadioGroupDirective),
|
|
133
|
+
multi: true
|
|
134
|
+
}], queries: [{ propertyName: "_radios", predicate: i0.forwardRef(function () { return RadioButtonComponent; }), descendants: true }], exportAs: ["itRadioGroup"], ngImport: i0 });
|
|
135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: RadioGroupDirective, decorators: [{
|
|
136
|
+
type: Directive,
|
|
137
|
+
args: [{
|
|
138
|
+
selector: 'it-radio-group',
|
|
139
|
+
exportAs: 'itRadioGroup',
|
|
140
|
+
providers: [{
|
|
141
|
+
provide: NG_VALUE_ACCESSOR,
|
|
142
|
+
useExisting: forwardRef(() => RadioGroupDirective),
|
|
143
|
+
multi: true
|
|
144
|
+
}]
|
|
145
|
+
}]
|
|
146
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { role: [{
|
|
147
|
+
type: HostBinding,
|
|
148
|
+
args: ['attr.role']
|
|
149
|
+
}], change: [{
|
|
150
|
+
type: Output
|
|
151
|
+
}], _radios: [{
|
|
152
|
+
type: ContentChildren,
|
|
153
|
+
args: [forwardRef(() => RadioButtonComponent), { descendants: true }]
|
|
154
|
+
}], name: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], value: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], selected: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], disabled: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}] } });
|
|
163
|
+
/**
|
|
164
|
+
* Un radio button con design bootstrap italia. Supporta tutte le funzionalità di una radio HTML5,
|
|
165
|
+
* ed espone una API simile. Una `<it-radio-button>` può essere checked, unchecked, o disabled.
|
|
166
|
+
*/
|
|
167
|
+
export class RadioButtonComponent {
|
|
168
|
+
constructor(radioGroup, _changeDetector, _radioDispatcher) {
|
|
169
|
+
this._changeDetector = _changeDetector;
|
|
170
|
+
this._radioDispatcher = _radioDispatcher;
|
|
171
|
+
this.id = `radio-${identifier++}`;
|
|
172
|
+
/**
|
|
173
|
+
* Evento emesso quando il valore `checked` del radio button cambia.
|
|
174
|
+
*/
|
|
175
|
+
this.change = new EventEmitter();
|
|
176
|
+
/** Se il radio button è checked. */
|
|
177
|
+
this._checked = false;
|
|
178
|
+
/** il valore assegnato al radio button. */
|
|
179
|
+
this._value = null;
|
|
180
|
+
this._removeUniqueSelectionListener = () => { };
|
|
181
|
+
this.radioGroup = radioGroup;
|
|
182
|
+
this._removeUniqueSelectionListener =
|
|
183
|
+
_radioDispatcher.listen((id, name) => {
|
|
184
|
+
if (id !== this.id && name === this.name) {
|
|
185
|
+
this.checked = false;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/** se il radio button è checked. */
|
|
190
|
+
get checked() { return this._checked; }
|
|
191
|
+
set checked(value) {
|
|
192
|
+
const newCheckedState = _coerceBooleanProperty(value);
|
|
193
|
+
if (this._checked !== newCheckedState) {
|
|
194
|
+
this._checked = newCheckedState;
|
|
195
|
+
if (newCheckedState && this.radioGroup && this.radioGroup.value !== this.value) {
|
|
196
|
+
this.radioGroup.selected = this;
|
|
197
|
+
}
|
|
198
|
+
else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) {
|
|
199
|
+
this.radioGroup.selected = null;
|
|
200
|
+
}
|
|
201
|
+
if (newCheckedState) {
|
|
202
|
+
this._radioDispatcher.notify(this.id, this.name);
|
|
203
|
+
}
|
|
204
|
+
this._changeDetector.markForCheck();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/** Il valore di questo radio button. */
|
|
208
|
+
get value() { return this._value; }
|
|
209
|
+
set value(value) {
|
|
210
|
+
if (this._value !== value) {
|
|
211
|
+
this._value = value;
|
|
212
|
+
if (this.radioGroup !== null) {
|
|
213
|
+
if (!this.checked) {
|
|
214
|
+
this.checked = this.radioGroup.value === value;
|
|
215
|
+
}
|
|
216
|
+
if (this.checked) {
|
|
217
|
+
this.radioGroup.selected = this;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Se il radio button è disabled. */
|
|
223
|
+
get disabled() {
|
|
224
|
+
return this._disabled || (this.radioGroup !== null && this.radioGroup.disabled);
|
|
225
|
+
}
|
|
226
|
+
set disabled(value) {
|
|
227
|
+
const newDisabledState = !!value;
|
|
228
|
+
if (this._disabled !== newDisabledState) {
|
|
229
|
+
this._disabled = newDisabledState;
|
|
230
|
+
this._changeDetector.markForCheck();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Segna il radio button come da controllare per la change detection.
|
|
235
|
+
*/
|
|
236
|
+
_markForCheck() {
|
|
237
|
+
this._changeDetector.markForCheck();
|
|
238
|
+
}
|
|
239
|
+
ngOnInit() {
|
|
240
|
+
if (this.radioGroup) {
|
|
241
|
+
// Se il radio button è all'interno di un gruppo, determina se deve essere selezionato
|
|
242
|
+
this.checked = this.radioGroup.value === this._value;
|
|
243
|
+
// Copia il `name` del radio group
|
|
244
|
+
this.name = this.radioGroup.name;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
ngOnDestroy() {
|
|
248
|
+
this._removeUniqueSelectionListener();
|
|
249
|
+
}
|
|
250
|
+
_emitChangeEvent() {
|
|
251
|
+
this.change.emit(new RadioChange(this, this._value));
|
|
252
|
+
}
|
|
253
|
+
_onInputChange(event) {
|
|
254
|
+
event.stopPropagation();
|
|
255
|
+
const groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value;
|
|
256
|
+
this.checked = true;
|
|
257
|
+
this._emitChangeEvent();
|
|
258
|
+
if (this.radioGroup) {
|
|
259
|
+
this.radioGroup._controlValueAccessorChangeFn(this.value);
|
|
260
|
+
this.radioGroup._touch();
|
|
261
|
+
if (groupValueChanged) {
|
|
262
|
+
this.radioGroup._emitChangeEvent();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
RadioButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: RadioButtonComponent, deps: [{ token: RadioGroupDirective, optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.UniqueSelectionDispatcher }], target: i0.ɵɵFactoryTarget.Component });
|
|
268
|
+
RadioButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.11", type: RadioButtonComponent, selector: "it-radio-button", inputs: { name: "name", label: "label", checked: "checked", value: "value", disabled: "disabled" }, outputs: { change: "change" }, exportAs: ["itRadioButton"], ngImport: i0, template: "<div class=\"form-check\">\n <input type=\"radio\"\n focusMouse\n [id]=\"id\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n (change)=\"_onInputChange($event)\">\n <label\n [attr.for]=\"id\">{{label}}</label>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.FocusMouseDirective, selector: "[focusMouse]", exportAs: ["focusMouse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: RadioButtonComponent, decorators: [{
|
|
270
|
+
type: Component,
|
|
271
|
+
args: [{ selector: 'it-radio-button', exportAs: 'itRadioButton', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-check\">\n <input type=\"radio\"\n focusMouse\n [id]=\"id\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [attr.name]=\"name\"\n (change)=\"_onInputChange($event)\">\n <label\n [attr.for]=\"id\">{{label}}</label>\n</div>\n" }]
|
|
272
|
+
}], ctorParameters: function () { return [{ type: RadioGroupDirective, decorators: [{
|
|
273
|
+
type: Optional
|
|
274
|
+
}] }, { type: i0.ChangeDetectorRef }, { type: i1.UniqueSelectionDispatcher }]; }, propDecorators: { name: [{
|
|
275
|
+
type: Input
|
|
276
|
+
}], label: [{
|
|
277
|
+
type: Input
|
|
278
|
+
}], checked: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], value: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], disabled: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], change: [{
|
|
285
|
+
type: Output
|
|
286
|
+
}] } });
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvcmFkaW8vcmFkaW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvcmFkaW8vcmFkaW8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBQ1YsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBSWYsUUFBUSxFQUNSLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFHekUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRW5CLFNBQVMsc0JBQXNCLENBQUMsS0FBVTtJQUN4QyxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsS0FBSyxPQUFPLENBQUM7QUFDakQsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLFlBQ1MsTUFBNEIsRUFDNUIsS0FBVTtRQURWLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBQzVCLFVBQUssR0FBTCxLQUFLLENBQUs7SUFDZixDQUFDO0NBQ047QUFXRCxNQUFNLE9BQU8sbUJBQW1CO0lBb0Y5QixZQUNVLGVBQWtDO1FBQWxDLG9CQUFlLEdBQWYsZUFBZSxDQUFtQjtRQW5GbEIsU0FBSSxHQUFHLFlBQVksQ0FBQztRQUU5Qzs7Ozs7V0FLRztRQUNLLFdBQU0sR0FBUSxJQUFJLENBQUM7UUFFM0IsMEVBQTBFO1FBQ2xFLFVBQUssR0FBRyxrQkFBa0IsVUFBVSxFQUFFLEVBQUUsQ0FBQztRQUVqRCwrQ0FBK0M7UUFDdkMsY0FBUyxHQUFnQyxJ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Y2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIGZvcndhcmRSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBEaXJlY3RpdmUsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIEhvc3RCaW5kaW5nXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlciB9IGZyb20gJy4vdW5pcXVlLXNlbGVjdGlvbi1kaXNwYXRjaGVyJztcblxubGV0IGlkZW50aWZpZXIgPSAwO1xuXG5mdW5jdGlvbiBfY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgYCR7dmFsdWV9YCAhPT0gJ2ZhbHNlJztcbn1cblxuZXhwb3J0IGNsYXNzIFJhZGlvQ2hhbmdlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNvdXJjZTogUmFkaW9CdXR0b25Db21wb25lbnQsXG4gICAgcHVibGljIHZhbHVlOiBhbnlcbiAgKSB7IH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaXQtcmFkaW8tZ3JvdXAnLCAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gIGV4cG9ydEFzOiAnaXRSYWRpb0dyb3VwJyxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhZGlvR3JvdXBEaXJlY3RpdmUpLFxuICAgIG11bHRpOiB0cnVlXG4gIH1dXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSByb2xlID0gJ3JhZGlvZ3JvdXAnO1xuXG4gIC8qKlxuICAgKiBJbCB2YWxvcmUgc2VsZXppb25hdG8gcGVyIGlsIGdydXBwby4gRG92cmViYmUgZXNzZXJlIHVndWFsZSBhbCB2YWxvcmUgZGVsIHJhZGlvIGJ1dHRvbiBzZWxlemlvbmF0byBzZVxuICAgKiAqZXNpc3RlKiB1biByYWRpbyBidXR0b24gY29uIHVuIHZhbG9yZSBjb3JyaXNwb25kZW50ZS4gU2UgKm5vbiBlc2lzdGUqIHVuIHJhZGlvIGJ1dHRvbiBjb3JyaXNwb25kZW50ZVxuICAgKiBxdWVzdG8gdmFsb3JlIHBlcnNpc3RlIGVkIMOoIGFwcGxpY2F0byBuZWwgY2FzbyBpbiBjdWkgdW4gbnVvdm8gcmFkaW8gYnV0dG9uIHZpZW5lIGFnZ2l1bnRvIGNvbiBpbCB2YWxvcmVcbiAgICogY29ycmlzcG9uZGVudGUuXG4gICAqL1xuICBwcml2YXRlIF92YWx1ZTogYW55ID0gbnVsbDtcblxuICAvKiogTCdhdHRyaWJ1dG8gSFRNTCBuYW1lIGRhIGFwcGxpY2FyZSBhaSByYWRpbyBidXR0b24gaW4gcXVlc3RvIGdydXBwbyAqL1xuICBwcml2YXRlIF9uYW1lID0gYGl0LXJhZGlvLWdyb3VwLSR7aWRlbnRpZmllcisrfWA7XG5cbiAgLyoqIElsIHJhZGlvIGJ1dHRvbiBhdHR1YWxtZW50ZSBzZWxlemlvbmF0by4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IFJhZGlvQnV0dG9uQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIHNlIGB2YWx1ZWAgw6ggc3RhdG8gc2V0dGF0byBhbCBzdW8gdmFsb3JlIGluaXppYWxlLiAqL1xuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLyoqIFNlIGlsIHJhZGlvIGdyb3VwIMOoIGRpc2FiaWxpdGF0by4gKi9cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuXG5cbiAgLyoqXG4gICAqIEV2ZW50byBlbWVzc28gcXVhbmRvIGlsIHZhbG9yZSBkZWwgZ3J1cHBvIGNhbWJpYS5cbiAgICogR2xpIGV2ZW50aSBkaSBjaGFuZ2Ugc29ubyBlbWVzc2kgc29sdGFudG8gcXVhbmRvIGlsIHZhbG9yZSBjYW1iaWEgYSBjYXVzYSBkZWxsJ2ludGVyYXppb25lIGRlbGwndXRlbnRlXG4gICAqIGNvbiBpbCByYWRpbyBidXR0b24gKHN0ZXNzbyBjb21wb3J0YW1lbnRvIGRpIGA8aW5wdXQgdHlwZS1cInJhZGlvXCI+YCkuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8UmFkaW9DaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4oKTtcblxuICAvKiogcmFkaW8gYnV0dG9ucyBmaWdsaS4gKi9cbiAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IFJhZGlvQnV0dG9uQ29tcG9uZW50KSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBfcmFkaW9zOiBRdWVyeUxpc3Q8UmFkaW9CdXR0b25Db21wb25lbnQ+OyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG5cbiAgLyoqIElsIG1ldG9kbyBkYSBjaGlhbWFyZSBwZXIgYWdnaW9ybmFyZSBuZ01vZGVsICovXG4gIF9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKiogTm9tZSBkZWwgZ3J1cHBvIGRpIHJhZGlvIGJ1dHRvbi4gVHV0dGkgaSByYWRpbyBidXR0b24gYWxsJ2ludGVybm8gZGVsIGdydXBwbyBhdnJhbm5vIHF1ZXN0byBub21lLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbmFtZTsgfVxuICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICAgIHRoaXMuX3VwZGF0ZVJhZGlvQnV0dG9uTmFtZXMoKTtcbiAgfVxuXG4gIC8qKiBWYWxvcmUgZGVsIHJhZGlvIGJ1dHRvbi4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfVxuICBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkUmFkaW9Gcm9tVmFsdWUoKTtcbiAgICAgIHRoaXMuX2NoZWNrU2VsZWN0ZWRSYWRpb0J1dHRvbigpO1xuICAgIH1cbiAgfVxuXG4gIF9jaGVja1NlbGVjdGVkUmFkaW9CdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkICYmICF0aGlzLl9zZWxlY3RlZC5jaGVja2VkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKiogSWwgcmFkaW8gYnV0dG9uIHNlbGV6aW9uYXRvLiAqL1xuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZDsgfVxuICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IFJhZGlvQnV0dG9uQ29tcG9uZW50IHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiBudWxsO1xuICAgIHRoaXMuX2NoZWNrU2VsZWN0ZWRSYWRpb0J1dHRvbigpO1xuICB9XG5cbiAgLyoqIFNlIGlsIGdydXBwbyDDqCBkaXNhYmxlZCAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfVxuICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IF9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuX21hcmtSYWRpb3NGb3JDaGVjaygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIEluaXppYWxpenphIGxlIHByb3ByaWV0w6AgcXVhbmRvIGlsIGNvbnRlbnV0byBkZWkgZmlnbGnDqCBkaXNwb25pYmlsZS5cbiAgICogUXVlc3RvIHBlcm1ldHRlIGRpIHByb3BhZ2FyZSBnbGkgYXR0cmlidXRpIHJpbGV2YW50aSBhaSByYWRpbyBidXR0b25zIGFzc29jaWF0aS5cbiAgICovXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIF90b3VjaCgpIHtcbiAgICBpZiAodGhpcy5vblRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmFkaW9CdXR0b25OYW1lcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmFkaW9zKSB7XG4gICAgICB0aGlzLl9yYWRpb3MuZm9yRWFjaChyYWRpbyA9PiB7XG4gICAgICAgIHJhZGlvLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQWdnaW9ybmEgaWwgcmFkaW8gYnV0dG9uIGBzZWxlY3RlZGAgYSBzZWNvbmRhIGRlbCBzdW8gX3ZhbHVlLiAqL1xuICBwcml2YXRlIF91cGRhdGVTZWxlY3RlZFJhZGlvRnJvbVZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gbnVsbDtcbiAgICB0aGlzLl9yYWRpb3MuZm9yRWFjaChyYWRpbyA9PiB7XG4gICAgICByYWRpby5jaGVja2VkID0gdGhpcy52YWx1ZSA9PT0gcmFkaW8udmFsdWU7XG4gICAgICBpZiAocmFkaW8uY2hlY2tlZCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHJhZGlvO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEludmlhIGwnZXZlbnRvIGNoYW5nZSBjb24gbGEgc2VsZXppb25lIGNvcnJlbnRlIGUgaWwgdmFsb3JlIGRlbCBncnVwcG8uICovXG4gIF9lbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQobmV3IFJhZGlvQ2hhbmdlKHRoaXMuX3NlbGVjdGVkLCB0aGlzLl92YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXJrUmFkaW9zRm9yQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMuX3JhZGlvcykge1xuICAgICAgdGhpcy5fcmFkaW9zLmZvckVhY2gocmFkaW8gPT4gcmFkaW8uX21hcmtGb3JDaGVjaygpKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG59XG5cbi8qKlxuICogVW4gcmFkaW8gYnV0dG9uIGNvbiBkZXNpZ24gYm9vdHN0cmFwIGl0YWxpYS4gU3VwcG9ydGEgdHV0dGUgbGUgZnVuemlvbmFsaXTDoCBkaSB1bmEgcmFkaW8gSFRNTDUsXG4gKiBlZCBlc3BvbmUgdW5hIEFQSSBzaW1pbGUuIFVuYSBgPGl0LXJhZGlvLWJ1dHRvbj5gIHB1w7IgZXNzZXJlIGNoZWNrZWQsIHVuY2hlY2tlZCwgbyBkaXNhYmxlZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaXQtcmFkaW8tYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JhZGlvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmFkaW8uY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdpdFJhZGlvQnV0dG9uJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUmFkaW9CdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgaWQgPSBgcmFkaW8tJHtpZGVudGlmaWVyKyt9YDtcblxuICAvKiogQXR0cmlidXRvICduYW1lJyB1c2F0byBwZXIgcmFnZ3J1cHBhcmUgaSByYWRpbyBidXR0b24gcGVyIHVuJ3VuaWNhIHNlbGV6aW9uZS4gKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMJ2V0aWNoZXR0YSBkZWxyYWRpbyBidXR0b24uICovXG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIHNlIGlsIHJhZGlvIGJ1dHRvbiDDqCBjaGVja2VkLiAqL1xuICBASW5wdXQoKVxuICBnZXQgY2hlY2tlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7IH1cbiAgc2V0IGNoZWNrZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBuZXdDaGVja2VkU3RhdGUgPSBfY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodGhpcy5fY2hlY2tlZCAhPT0gbmV3Q2hlY2tlZFN0YXRlKSB7XG4gICAgICB0aGlzLl9jaGVja2VkID0gbmV3Q2hlY2tlZFN0YXRlO1xuICAgICAgaWYgKG5ld0NoZWNrZWRTdGF0ZSAmJiB0aGlzLnJhZGlvR3JvdXAgJiYgdGhpcy5yYWRpb0dyb3VwLnZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMucmFkaW9Hcm91cC5zZWxlY3RlZCA9IHRoaXM7XG4gICAgICB9IGVsc2UgaWYgKCFuZXdDaGVja2VkU3RhdGUgJiYgdGhpcy5yYWRpb0dyb3VwICYmIHRoaXMucmFkaW9Hcm91cC52YWx1ZSA9PT0gdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3Q2hlY2tlZFN0YXRlKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvRGlzcGF0Y2hlci5ub3RpZnkodGhpcy5pZCwgdGhpcy5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIElsIHZhbG9yZSBkaSBxdWVzdG8gcmFkaW8gYnV0dG9uLiAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXAgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLnJhZGlvR3JvdXAudmFsdWUgPT09IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICB0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlIGlsIHJhZGlvIGJ1dHRvbiDDqCBkaXNhYmxlZC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCAodGhpcy5yYWRpb0dyb3VwICE9PSBudWxsICYmIHRoaXMucmFkaW9Hcm91cC5kaXNhYmxlZCk7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgbmV3RGlzYWJsZWRTdGF0ZSA9ICEhdmFsdWU7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkICE9PSBuZXdEaXNhYmxlZFN0YXRlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IG5ld0Rpc2FibGVkU3RhdGU7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlbnRvIGVtZXNzbyBxdWFuZG8gaWwgdmFsb3JlIGBjaGVja2VkYCBkZWwgcmFkaW8gYnV0dG9uIGNhbWJpYS5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJhZGlvQ2hhbmdlPigpO1xuXG4gIC8qKiBJbCByYWRpbyBncm91cCBwYWRyZS4gUHXDsiBlc3NlcmUgcHJlc2VudGUgbyBtZW5vLiAqL1xuICByYWRpb0dyb3VwOiBSYWRpb0dyb3VwRGlyZWN0aXZlO1xuXG4gIC8qKiBTZSBpbCByYWRpbyBidXR0b24gw6ggY2hlY2tlZC4gKi9cbiAgcHJpdmF0ZSBfY2hlY2tlZCA9IGZhbHNlO1xuXG4gIC8qKiBTZSBpbCByYWRpbyBidXR0b24gw6ggZGlzYWJsZWQuICovXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKiBpbCB2YWxvcmUgYXNzZWduYXRvIGFsIHJhZGlvIGJ1dHRvbi4gKi9cbiAgcHJpdmF0ZSBfdmFsdWU6IGFueSA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlVW5pcXVlU2VsZWN0aW9uTGlzdGVuZXI6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcmFkaW9Hcm91cDogUmFkaW9Hcm91cERpcmVjdGl2ZSxcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfcmFkaW9EaXNwYXRjaGVyOiBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyXG4gICkge1xuICAgIHRoaXMucmFkaW9Hcm91cCA9IHJhZGlvR3JvdXA7XG5cbiAgICB0aGlzLl9yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lciA9XG4gICAgICBfcmFkaW9EaXNwYXRjaGVyLmxpc3RlbigoaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChpZCAhPT0gdGhpcy5pZCAmJiBuYW1lID09PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VnbmEgaWwgcmFkaW8gYnV0dG9uIGNvbWUgZGEgY29udHJvbGxhcmUgcGVyIGxhIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAqL1xuICBfbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmFkaW9Hcm91cCkge1xuICAgICAgLy8gU2UgaWwgcmFkaW8gYnV0dG9uIMOoIGFsbCdpbnRlcm5vIGRpIHVuIGdydXBwbywgZGV0ZXJtaW5hIHNlIGRldmUgZXNzZXJlIHNlbGV6aW9uYXRvXG4gICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLnJhZGlvR3JvdXAudmFsdWUgPT09IHRoaXMuX3ZhbHVlO1xuICAgICAgLy8gQ29waWEgaWwgYG5hbWVgIGRlbCByYWRpbyBncm91cFxuICAgICAgdGhpcy5uYW1lID0gdGhpcy5yYWRpb0dyb3VwLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fcmVtb3ZlVW5pcXVlU2VsZWN0aW9uTGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRDaGFuZ2VFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBSYWRpb0NoYW5nZSh0aGlzLCB0aGlzLl92YWx1ZSkpO1xuICB9XG5cbiAgX29uSW5wdXRDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBncm91cFZhbHVlQ2hhbmdlZCA9IHRoaXMucmFkaW9Hcm91cCAmJiB0aGlzLnZhbHVlICE9PSB0aGlzLnJhZGlvR3JvdXAudmFsdWU7XG4gICAgdGhpcy5jaGVja2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTtcblxuICAgIGlmICh0aGlzLnJhZGlvR3JvdXApIHtcbiAgICAgIHRoaXMucmFkaW9Hcm91cC5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMucmFkaW9Hcm91cC5fdG91Y2goKTtcbiAgICAgIGlmIChncm91cFZhbHVlQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLnJhZGlvR3JvdXAuX2VtaXRDaGFuZ2VFdmVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIj5cbiAgPGlucHV0IHR5cGU9XCJyYWRpb1wiXG4gICAgZm9jdXNNb3VzZVxuICAgIFtpZF09XCJpZFwiXG4gICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgIChjaGFuZ2UpPVwiX29uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiPlxuICA8bGFiZWxcbiAgICBbYXR0ci5mb3JdPVwiaWRcIj57e2xhYmVsfX08L2xhYmVsPlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
import { Injectable } from '@angular/core';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* Class to coordinate unique selection based on name.
|
|
12
|
+
* Intended to be consumed as an Angular service.
|
|
13
|
+
* This service is needed because native radio change events are only fired on the item currently
|
|
14
|
+
* being selected, and we still need to uncheck the previous selection.
|
|
15
|
+
*
|
|
16
|
+
* This service does not *store* any IDs and names because they may change at any time, so it is
|
|
17
|
+
* less error-prone if they are simply passed through when the events occur.
|
|
18
|
+
*/
|
|
19
|
+
export class UniqueSelectionDispatcher {
|
|
20
|
+
constructor() {
|
|
21
|
+
this._listeners = [];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Notify other items that selection for the given name has been set.
|
|
25
|
+
* @param id ID of the item.
|
|
26
|
+
* @param name Name of the item.
|
|
27
|
+
*/
|
|
28
|
+
notify(id, name) {
|
|
29
|
+
for (const listener of this._listeners) {
|
|
30
|
+
listener(id, name);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Listen for future changes to item selection.
|
|
35
|
+
* @return Function used to deregister listener
|
|
36
|
+
*/
|
|
37
|
+
listen(listener) {
|
|
38
|
+
this._listeners.push(listener);
|
|
39
|
+
return () => {
|
|
40
|
+
this._listeners = this._listeners.filter((registered) => {
|
|
41
|
+
return listener !== registered;
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
ngOnDestroy() {
|
|
46
|
+
this._listeners = [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
UniqueSelectionDispatcher.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: UniqueSelectionDispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
50
|
+
UniqueSelectionDispatcher.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: UniqueSelectionDispatcher, providedIn: 'root' });
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: UniqueSelectionDispatcher, decorators: [{
|
|
52
|
+
type: Injectable,
|
|
53
|
+
args: [{ providedIn: 'root' }]
|
|
54
|
+
}] });
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLXNlbGVjdGlvbi1kaXNwYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvcmFkaW8vdW5pcXVlLXNlbGVjdGlvbi1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7O0FBTXBEOzs7Ozs7OztHQVFHO0FBRUgsTUFBTSxPQUFPLHlCQUF5QjtJQUR0QztRQUVVLGVBQVUsR0FBd0MsRUFBRSxDQUFDO0tBNkI5RDtJQTNCQzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEVBQVUsRUFBRSxJQUFZO1FBQzdCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN0QyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxRQUEyQztRQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixPQUFPLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUE2QyxFQUFFLEVBQUU7Z0JBQ3pGLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7dUhBN0JVLHlCQUF5QjsySEFBekIseUJBQXlCLGNBRGIsTUFBTTs0RkFDbEIseUJBQXlCO2tCQURyQyxVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cblxuLy8gVXNlcnMgb2YgdGhlIERpc3BhdGNoZXIgbmV2ZXIgbmVlZCB0byBzZWUgdGhpcyB0eXBlLCBidXQgVHlwZVNjcmlwdCByZXF1aXJlcyBpdCB0byBiZSBleHBvcnRlZC5cbmV4cG9ydCB0eXBlIFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXJMaXN0ZW5lciA9IChpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKlxuICogQ2xhc3MgdG8gY29vcmRpbmF0ZSB1bmlxdWUgc2VsZWN0aW9uIGJhc2VkIG9uIG5hbWUuXG4gKiBJbnRlbmRlZCB0byBiZSBjb25zdW1lZCBhcyBhbiBBbmd1bGFyIHNlcnZpY2UuXG4gKiBUaGlzIHNlcnZpY2UgaXMgbmVlZGVkIGJlY2F1c2UgbmF0aXZlIHJhZGlvIGNoYW5nZSBldmVudHMgYXJlIG9ubHkgZmlyZWQgb24gdGhlIGl0ZW0gY3VycmVudGx5XG4gKiBiZWluZyBzZWxlY3RlZCwgYW5kIHdlIHN0aWxsIG5lZWQgdG8gdW5jaGVjayB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICpcbiAqIFRoaXMgc2VydmljZSBkb2VzIG5vdCAqc3RvcmUqIGFueSBJRHMgYW5kIG5hbWVzIGJlY2F1c2UgdGhleSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLCBzbyBpdCBpc1xuICogbGVzcyBlcnJvci1wcm9uZSBpZiB0aGV5IGFyZSBzaW1wbHkgcGFzc2VkIHRocm91Z2ggd2hlbiB0aGUgZXZlbnRzIG9jY3VyLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyTGlzdGVuZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBOb3RpZnkgb3RoZXIgaXRlbXMgdGhhdCBzZWxlY3Rpb24gZm9yIHRoZSBnaXZlbiBuYW1lIGhhcyBiZWVuIHNldC5cbiAgICogQHBhcmFtIGlkIElEIG9mIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgbm90aWZ5KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihpZCwgbmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgZnV0dXJlIGNoYW5nZXMgdG8gaXRlbSBzZWxlY3Rpb24uXG4gICAqIEByZXR1cm4gRnVuY3Rpb24gdXNlZCB0byBkZXJlZ2lzdGVyIGxpc3RlbmVyXG4gICAqL1xuICBsaXN0ZW4obGlzdGVuZXI6IFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXJMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLmZpbHRlcigocmVnaXN0ZXJlZDogVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlckxpc3RlbmVyKSA9PiB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lciAhPT0gcmVnaXN0ZXJlZDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { Component, ContentChildren, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { Subscription, merge } from 'rxjs';
|
|
3
|
+
import { Util } from '../util/util';
|
|
4
|
+
import { ItTabComponent } from './tab.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "../util/focus-mouse.directive";
|
|
8
|
+
/** Usato per generare ID univoci per ogni componente tab */
|
|
9
|
+
let nextId = 0;
|
|
10
|
+
/** Un change event emesso ai cambi di selezione. */
|
|
11
|
+
export class TabChangeEvent {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Un componente tab-group con design bootstrap italia. Utilizzabile con il tag `<it-tab-group>`.
|
|
15
|
+
*
|
|
16
|
+
* Supporta al suo interno tab di base `<it-tab>` con una label e un contenuto.
|
|
17
|
+
*/
|
|
18
|
+
export class ItTabGroupComponent {
|
|
19
|
+
constructor(_changeDetectorRef) {
|
|
20
|
+
this._changeDetectorRef = _changeDetectorRef;
|
|
21
|
+
/** L'indice del tab che dovrebbe essere selezionato dopo che il contenuto e' stato controllato */
|
|
22
|
+
this._indexToSelect = 0;
|
|
23
|
+
/** Subscription all'aggiunta e rimozione di tab. */
|
|
24
|
+
this._tabsSubscription = Subscription.EMPTY;
|
|
25
|
+
/** Subscription ai cambiamenti alle label dei tab. */
|
|
26
|
+
this._tabLabelSubscription = Subscription.EMPTY;
|
|
27
|
+
this._isPill = false;
|
|
28
|
+
this._selectedIndex = null;
|
|
29
|
+
this._dark = false;
|
|
30
|
+
/** abilita il supporto al data-binding bidirezionale `[(selectedIndex)]` */
|
|
31
|
+
this.selectedIndexChange = new EventEmitter();
|
|
32
|
+
/** emesso quando la selezione del tab cambia. */
|
|
33
|
+
this.selectedTabChange = new EventEmitter(true);
|
|
34
|
+
this._groupId = nextId++;
|
|
35
|
+
}
|
|
36
|
+
/** Se le tab sono formattate come pill. */
|
|
37
|
+
get pill() { return this._isPill; }
|
|
38
|
+
set pill(value) {
|
|
39
|
+
this._isPill = Util.coerceBooleanProperty(value);
|
|
40
|
+
}
|
|
41
|
+
/** L'indice della tab attiva. */
|
|
42
|
+
get selectedIndex() { return this._selectedIndex; }
|
|
43
|
+
set selectedIndex(value) {
|
|
44
|
+
this._indexToSelect = Util.coerceNumberProperty(value, null);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Se il tab-group ha un tema scuro
|
|
48
|
+
*/
|
|
49
|
+
get dark() { return this._dark; }
|
|
50
|
+
set dark(value) {
|
|
51
|
+
this._dark = Util.coerceBooleanProperty(value);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Dopo che il contenuto è controllato, il componente conosce i tab che sono stati definiti
|
|
55
|
+
* e qual è l'indice del tab selezionato.
|
|
56
|
+
*/
|
|
57
|
+
ngAfterContentChecked() {
|
|
58
|
+
this.changeTab(this._indexToSelect);
|
|
59
|
+
}
|
|
60
|
+
changeTab(newIndex) {
|
|
61
|
+
// Non fissare `indexToSelect` immediatamente nel setter perchè può accadere che
|
|
62
|
+
// il numero di tab cambi prima che avvenga la change detection.
|
|
63
|
+
const indexToSelect = this._indexToSelect = this._clampTabIndex(newIndex);
|
|
64
|
+
// Se il nuovo tab è disabilitato, non fare niente
|
|
65
|
+
if (this._tabs && this._tabs.length > 0 && this._tabs.toArray()[indexToSelect].disabled) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (this._selectedIndex !== indexToSelect && this._selectedIndex != null) {
|
|
69
|
+
const tabChangeEvent = this._createChangeEvent(indexToSelect);
|
|
70
|
+
this.selectedTabChange.emit(tabChangeEvent);
|
|
71
|
+
// Emetto questo valore dopo che è partita la change detection
|
|
72
|
+
// dal momento che il contenuto controllato potrebbe contenere questa variabile
|
|
73
|
+
Promise.resolve().then(() => this.selectedIndexChange.emit(indexToSelect));
|
|
74
|
+
}
|
|
75
|
+
// Setta la posizione per ogni tab.
|
|
76
|
+
this._tabs.forEach((tab, index) => {
|
|
77
|
+
tab.position = index - indexToSelect;
|
|
78
|
+
tab.isActive = index === indexToSelect;
|
|
79
|
+
});
|
|
80
|
+
if (this._selectedIndex !== indexToSelect) {
|
|
81
|
+
this._selectedIndex = indexToSelect;
|
|
82
|
+
this._changeDetectorRef.markForCheck();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
ngAfterContentInit() {
|
|
86
|
+
this._subscribeToTabLabels();
|
|
87
|
+
// Sottoscrivi al cambiamento nel numero di tab, così da
|
|
88
|
+
// poter ri-renderizzare il contenuto quando nuove tab vengono aggiunte o rimosse.
|
|
89
|
+
this._tabsSubscription = this._tabs.changes.subscribe(() => {
|
|
90
|
+
const indexToSelect = this._clampTabIndex(this._indexToSelect);
|
|
91
|
+
// Mantieni il tab selezionato precedentemente se un nuovo tab è aggiunto o rimosso e non ci sono
|
|
92
|
+
// cambiamenti espliciti che selezionino un tab differente.
|
|
93
|
+
if (indexToSelect === this._selectedIndex) {
|
|
94
|
+
const tabs = this._tabs.toArray();
|
|
95
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
96
|
+
if (tabs[i].isActive) {
|
|
97
|
+
// Assegna `_indexToSelect` e `_selectedIndex` in modo da non emettere un change event
|
|
98
|
+
// per evitare al consumer loop infiniti in alcuni casi limite come ad esempio
|
|
99
|
+
// se si aggiunge un tab all'interno dell'evento `selectedIndexChange`.
|
|
100
|
+
this._indexToSelect = this._selectedIndex = i;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
this._subscribeToTabLabels();
|
|
106
|
+
this._changeDetectorRef.markForCheck();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
ngOnDestroy() {
|
|
110
|
+
this._tabsSubscription.unsubscribe();
|
|
111
|
+
this._tabLabelSubscription.unsubscribe();
|
|
112
|
+
}
|
|
113
|
+
_createChangeEvent(index) {
|
|
114
|
+
const event = new TabChangeEvent;
|
|
115
|
+
event.index = index;
|
|
116
|
+
if (this._tabs && this._tabs.length) {
|
|
117
|
+
event.tab = this._tabs.toArray()[index];
|
|
118
|
+
}
|
|
119
|
+
return event;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Sottoscrivi a cambiamenti nelle label dei tab. Necessario perchè l'input per la label è sul TabComponent
|
|
123
|
+
* mentre il data binding è all'interno di TabGroupComponent. Per fare in modo che il binding sia aggiornato
|
|
124
|
+
* bisogna sottoscriversi ai cambiamenti e azionare la change detection in maniera manuale.
|
|
125
|
+
*/
|
|
126
|
+
_subscribeToTabLabels() {
|
|
127
|
+
if (this._tabLabelSubscription) {
|
|
128
|
+
this._tabLabelSubscription.unsubscribe();
|
|
129
|
+
}
|
|
130
|
+
this._tabLabelSubscription = merge(...this._tabs.map(tab => tab._disableChange), ...this._tabs.map(tab => tab._labelChange)).subscribe(() => {
|
|
131
|
+
this._changeDetectorRef.markForCheck();
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/** fissa l'indice tra 0 e la dimensione dei tab. */
|
|
135
|
+
_clampTabIndex(index) {
|
|
136
|
+
return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));
|
|
137
|
+
}
|
|
138
|
+
/** ritorna un id univoco per ogni label di tab */
|
|
139
|
+
_getTabLabelId(i) {
|
|
140
|
+
return `it-tab-label-${this._groupId}-${i}`;
|
|
141
|
+
}
|
|
142
|
+
/** ritorna un id univoco per ogni elemento di contenuto del tab */
|
|
143
|
+
_getTabContentId(i) {
|
|
144
|
+
return `it-tab-content-${this._groupId}-${i}`;
|
|
145
|
+
}
|
|
146
|
+
/** restituisce il tabIndex del tab. */
|
|
147
|
+
_getTabIndex(tab, idx) {
|
|
148
|
+
if (tab.disabled) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return this.selectedIndex === idx ? 0 : -1;
|
|
152
|
+
}
|
|
153
|
+
_handleClick($event, index) {
|
|
154
|
+
$event.preventDefault();
|
|
155
|
+
this.changeTab(index);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
ItTabGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: ItTabGroupComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
159
|
+
ItTabGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.11", type: ItTabGroupComponent, selector: "it-tab-group", inputs: { pill: "pill", selectedIndex: "selectedIndex", dark: "dark" }, outputs: { selectedIndexChange: "selectedIndexChange", selectedTabChange: "selectedTabChange" }, queries: [{ propertyName: "_tabs", predicate: ItTabComponent }], exportAs: ["itTabGroup"], ngImport: i0, template: "<ul class=\"nav\" [ngClass]=\"{'nav-dark': dark, 'nav-tabs': !pill, 'nav-pills mb-3': pill}\" role=\"tablist\">\n\n <li class=\"nav-item\" *ngFor=\"let tab of _tabs; let i = index\">\n <a\n focusMouse\n href=\"#\"\n role=\"tab\"\n [attr.aria-controls]=\"_getTabContentId(i)\"\n [attr.aria-selected]=\"selectedIndex == i\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledby) ? tab.ariaLabelledby : null\"\n [ngClass]=\"{ 'nav-link': true, 'active': selectedIndex == i, 'disabled': tab.disabled }\"\n [id]=\"_getTabLabelId(i)\"\n (click)=\"_handleClick($event, i)\"\n >\n <i *ngIf=\"tab.icon\" class=\"it-ico-lg d-block text-center\" [ngClass]=\"tab.icon\"></i>\n {{tab.label}}\n </a>\n </li>\n</ul>\n<div class=\"tab-content\">\n <ng-container *ngFor=\"let tab of _tabs; let i = index\">\n <div\n [ngClass]=\"{ 'tab-pane p-3': true, 'show active': selectedIndex == i }\"\n [id]=\"_getTabContentId(i)\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"_getTabLabelId(i)\">\n <ng-container *ngTemplateOutlet=\"tab._implicitContent\"></ng-container>\n </div>\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.FocusMouseDirective, selector: "[focusMouse]", exportAs: ["focusMouse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
160
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: ItTabGroupComponent, decorators: [{
|
|
161
|
+
type: Component,
|
|
162
|
+
args: [{ selector: 'it-tab-group', exportAs: 'itTabGroup', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"nav\" [ngClass]=\"{'nav-dark': dark, 'nav-tabs': !pill, 'nav-pills mb-3': pill}\" role=\"tablist\">\n\n <li class=\"nav-item\" *ngFor=\"let tab of _tabs; let i = index\">\n <a\n focusMouse\n href=\"#\"\n role=\"tab\"\n [attr.aria-controls]=\"_getTabContentId(i)\"\n [attr.aria-selected]=\"selectedIndex == i\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledby) ? tab.ariaLabelledby : null\"\n [ngClass]=\"{ 'nav-link': true, 'active': selectedIndex == i, 'disabled': tab.disabled }\"\n [id]=\"_getTabLabelId(i)\"\n (click)=\"_handleClick($event, i)\"\n >\n <i *ngIf=\"tab.icon\" class=\"it-ico-lg d-block text-center\" [ngClass]=\"tab.icon\"></i>\n {{tab.label}}\n </a>\n </li>\n</ul>\n<div class=\"tab-content\">\n <ng-container *ngFor=\"let tab of _tabs; let i = index\">\n <div\n [ngClass]=\"{ 'tab-pane p-3': true, 'show active': selectedIndex == i }\"\n [id]=\"_getTabContentId(i)\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"_getTabLabelId(i)\">\n <ng-container *ngTemplateOutlet=\"tab._implicitContent\"></ng-container>\n </div>\n </ng-container>\n</div>\n" }]
|
|
163
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { _tabs: [{
|
|
164
|
+
type: ContentChildren,
|
|
165
|
+
args: [ItTabComponent]
|
|
166
|
+
}], pill: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], selectedIndex: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], dark: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], selectedIndexChange: [{
|
|
173
|
+
type: Output
|
|
174
|
+
}], selectedTabChange: [{
|
|
175
|
+
type: Output
|
|
176
|
+
}] } });
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3RhYnMvdGFiLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3RhYnMvdGFiLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsZUFBZSxFQUVmLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBSWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFFakQsNERBQTREO0FBQzVELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUVmLG9EQUFvRDtBQUNwRCxNQUFNLE9BQU8sY0FBYztDQUsxQjtBQUVBOzs7O0VBSUU7QUFTSCxNQUFNLE9BQU8sbUJBQW1CO0lBaUQ5QixZQUFvQixrQkFBcUM7UUFBckMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQTdDekQsa0dBQWtHO1FBQzFGLG1CQUFjLEdBQWtCLENBQUMsQ0FBQztRQUUxQyxvREFBb0Q7UUFDNUMsc0JBQWlCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUUvQyxzREFBc0Q7UUFDOUMsMEJBQXFCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQVEzQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBU2hCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQVVyQyxVQUFLLEdBQUcsS0FBSyxDQUFDO1FB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QUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNoQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQWEsRUFBRSxLQUFhO1FBQ3ZDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7O2lIQWxMVSxtQkFBbUI7cUdBQW5CLG1CQUFtQixtUEFFYixjQUFjLHVEQzVDakMsOHRDQStCQTs0RkRXYSxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsY0FBYyxZQUNkLFlBQVksaUJBR1AsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTt3R0FJZCxLQUFLO3NCQUFyQyxlQUFlO3VCQUFDLGNBQWM7Z0JBYTNCLElBQUk7c0JBRFAsS0FBSztnQkFVRixhQUFhO3NCQURoQixLQUFLO2dCQVdGLElBQUk7c0JBRFAsS0FBSztnQkFRYSxtQkFBbUI7c0JBQXJDLE1BQU07Z0JBR1ksaUJBQWlCO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEl0VGFiQ29tcG9uZW50IH0gZnJvbSAnLi90YWIuY29tcG9uZW50JztcblxuLyoqIFVzYXRvIHBlciBnZW5lcmFyZSBJRCB1bml2b2NpIHBlciBvZ25pIGNvbXBvbmVudGUgdGFiICovXG5sZXQgbmV4dElkID0gMDtcblxuLyoqIFVuIGNoYW5nZSBldmVudCBlbWVzc28gYWkgY2FtYmkgZGkgc2VsZXppb25lLiAqL1xuZXhwb3J0IGNsYXNzIFRhYkNoYW5nZUV2ZW50IHtcbiAgLyoqIEluZGljZSBkZWwgdGFiIHNlbGV6aW9uYXRvLiAqL1xuICBpbmRleDogbnVtYmVyO1xuICAvKiogUmlmZXJpbWVudG8gYWwgdGFiIHNlbGV6aW9uYXRvLiAqL1xuICB0YWI6IEl0VGFiQ29tcG9uZW50O1xufVxuXG4gLyoqXG4gKiBVbiBjb21wb25lbnRlIHRhYi1ncm91cCBjb24gZGVzaWduIGJvb3RzdHJhcCBpdGFsaWEuIFV0aWxpenphYmlsZSBjb24gaWwgdGFnIGA8aXQtdGFiLWdyb3VwPmAuXG4gKlxuICogU3VwcG9ydGEgYWwgc3VvIGludGVybm8gdGFiIGRpIGJhc2UgYDxpdC10YWI+YCBjb24gdW5hIGxhYmVsIGUgdW4gY29udGVudXRvLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC10YWItZ3JvdXAnLFxuICBleHBvcnRBczogJ2l0VGFiR3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFiLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFiLWdyb3VwLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBJdFRhYkdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25EZXN0cm95IHtcblxuICBAQ29udGVudENoaWxkcmVuKEl0VGFiQ29tcG9uZW50KSBfdGFiczogUXVlcnlMaXN0PEl0VGFiQ29tcG9uZW50PjtcblxuICAvKiogTCdpbmRpY2UgZGVsIHRhYiBjaGUgZG92cmViYmUgZXNzZXJlIHNlbGV6aW9uYXRvIGRvcG8gY2hlIGlsIGNvbnRlbnV0byBlJyBzdGF0byBjb250cm9sbGF0byAqL1xuICBwcml2YXRlIF9pbmRleFRvU2VsZWN0OiBudW1iZXIgfCBudWxsID0gMDtcblxuICAvKiogU3Vic2NyaXB0aW9uIGFsbCdhZ2dpdW50YSBlIHJpbW96aW9uZSBkaSB0YWIuICovXG4gIHByaXZhdGUgX3RhYnNTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgLyoqIFN1YnNjcmlwdGlvbiBhaSBjYW1iaWFtZW50aSBhbGxlIGxhYmVsIGRlaSB0YWIuICovXG4gIHByaXZhdGUgX3RhYkxhYmVsU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIC8qKiBTZSBsZSB0YWIgc29ubyBmb3JtYXR0YXRlIGNvbWUgcGlsbC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHBpbGwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc1BpbGw7IH1cbiAgc2V0IHBpbGwodmFsdWUpIHtcbiAgICB0aGlzLl9pc1BpbGwgPSBVdGlsLmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfaXNQaWxsID0gZmFsc2U7XG5cblxuICAvKiogTCdpbmRpY2UgZGVsbGEgdGFiIGF0dGl2YS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHNlbGVjdGVkSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4OyB9XG4gIHNldCBzZWxlY3RlZEluZGV4KHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG4gICAgdGhpcy5faW5kZXhUb1NlbGVjdCA9IFV0aWwuY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIG51bGwpO1xuICB9XG4gIHByaXZhdGUgX3NlbGVjdGVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZSBpbCB0YWItZ3JvdXAgaGEgdW4gdGVtYSBzY3Vyb1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRhcmsoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kYXJrOyB9XG4gIHNldCBkYXJrKHZhbHVlKSB7XG4gICAgdGhpcy5fZGFyayA9IFV0aWwuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9kYXJrID0gZmFsc2U7XG5cbiAgLyoqIGFiaWxpdGEgaWwgc3VwcG9ydG8gYWwgZGF0YS1iaW5kaW5nIGJpZGlyZXppb25hbGUgYFsoc2VsZWN0ZWRJbmRleCldYCAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWRJbmRleENoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAvKiogZW1lc3NvIHF1YW5kbyBsYSBzZWxlemlvbmUgZGVsIHRhYiBjYW1iaWEuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RlZFRhYkNoYW5nZTogRXZlbnRFbWl0dGVyPFRhYkNoYW5nZUV2ZW50PiA9XG4gICAgICBuZXcgRXZlbnRFbWl0dGVyPFRhYkNoYW5nZUV2ZW50Pih0cnVlKTtcblxuICBwcml2YXRlIF9ncm91cElkOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5fZ3JvdXBJZCA9IG5leHRJZCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIERvcG8gY2hlIGlsIGNvbnRlbnV0byDDqCBjb250cm9sbGF0bywgaWwgY29tcG9uZW50ZSBjb25vc2NlIGkgdGFiIGNoZSBzb25vIHN0YXRpIGRlZmluaXRpXG4gICAqIGUgcXVhbCDDqCBsJ2luZGljZSBkZWwgdGFiIHNlbGV6aW9uYXRvLlxuICAgKi9cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlVGFiKHRoaXMuX2luZGV4VG9TZWxlY3QpO1xuICB9XG5cbiAgY2hhbmdlVGFiKG5ld0luZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIC8vIE5vbiBmaXNzYXJlIGBpbmRleFRvU2VsZWN0YCBpbW1lZGlhdGFtZW50ZSBuZWwgc2V0dGVyIHBlcmNow6ggcHXDsiBhY2NhZGVyZSBjaGVcbiAgICAvLyBpbCBudW1lcm8gZGkgdGFiIGNhbWJpIHByaW1hIGNoZSBhdnZlbmdhIGxhIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgY29uc3QgaW5kZXhUb1NlbGVjdCA9IHRoaXMuX2luZGV4VG9TZWxlY3QgPSB0aGlzLl9jbGFtcFRhYkluZGV4KG5ld0luZGV4KTtcblxuICAgIC8vIFNlIGlsIG51b3ZvIHRhYiDDqCBkaXNhYmlsaXRhdG8sIG5vbiBmYXJlIG5pZW50ZVxuICAgIGlmICh0aGlzLl90YWJzICYmIHRoaXMuX3RhYnMubGVuZ3RoID4gMCAmJiB0aGlzLl90YWJzLnRvQXJyYXkoKVtpbmRleFRvU2VsZWN0XS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEluZGV4ICE9PSBpbmRleFRvU2VsZWN0ICYmIHRoaXMuX3NlbGVjdGVkSW5kZXggIT0gbnVsbCkge1xuICAgICAgY29uc3QgdGFiQ2hhbmdlRXZlbnQgPSB0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudChpbmRleFRvU2VsZWN0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJDaGFuZ2UuZW1pdCh0YWJDaGFuZ2VFdmVudCk7XG4gICAgICAvLyBFbWV0dG8gcXVlc3RvIHZhbG9yZSBkb3BvIGNoZSDDqCBwYXJ0aXRhIGxhIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIC8vIGRhbCBtb21lbnRvIGNoZSBpbCBjb250ZW51dG8gY29udHJvbGxhdG8gcG90cmViYmUgY29udGVuZXJlIHF1ZXN0YSB2YXJpYWJpbGVcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5zZWxlY3RlZEluZGV4Q2hhbmdlLmVtaXQoaW5kZXhUb1NlbGVjdCkpO1xuICAgIH1cblxuICAgIC8vIFNldHRhIGxhIHBvc2l6aW9uZSBwZXIgb2duaSB0YWIuXG4gICAgdGhpcy5fdGFicy5mb3JFYWNoKCh0YWI6IEl0VGFiQ29tcG9uZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICB0YWIucG9zaXRpb24gPSBpbmRleCAtIGluZGV4VG9TZWxlY3Q7XG4gICAgICB0YWIuaXNBY3RpdmUgPSBpbmRleCA9PT0gaW5kZXhUb1NlbGVjdDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEluZGV4ICE9PSBpbmRleFRvU2VsZWN0KSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gaW5kZXhUb1NlbGVjdDtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpYmVUb1RhYkxhYmVscygpO1xuXG4gICAgLy8gU290dG9zY3JpdmkgYWwgY2FtYmlhbWVudG8gbmVsIG51bWVybyBkaSB0YWIsIGNvc8OsIGRhXG4gICAgLy8gcG90ZXIgcmktcmVuZGVyaXp6YXJlIGlsIGNvbnRlbnV0byBxdWFuZG8gbnVvdmUgdGFiIHZlbmdvbm8gYWdnaXVudGUgbyByaW1vc3NlLlxuICAgIHRoaXMuX3RhYnNTdWJzY3JpcHRpb24gPSB0aGlzLl90YWJzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4VG9TZWxlY3QgPSB0aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpO1xuXG4gICAgICAvLyBNYW50aWVuaSBpbCB0YWIgc2VsZXppb25hdG8gcHJlY2VkZW50ZW1lbnRlIHNlIHVuIG51b3ZvIHRhYiDDqCBhZ2dpdW50byBvIHJpbW9zc28gZSBub24gY2kgc29ub1xuICAgICAgLy8gY2FtYmlhbWVudGkgZXNwbGljaXRpIGNoZSBzZWxlemlvbmlubyB1biB0YWIgZGlmZmVyZW50ZS5cbiAgICAgIGlmIChpbmRleFRvU2VsZWN0ID09PSB0aGlzLl9zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLl90YWJzLnRvQXJyYXkoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGFic1tpXS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgLy8gQXNzZWduYSBgX2luZGV4VG9TZWxlY3RgIGUgYF9zZWxlY3RlZEluZGV4YCBpbiBtb2RvIGRhIG5vbiBlbWV0dGVyZSB1biBjaGFuZ2UgZXZlbnRcbiAgICAgICAgICAgIC8vIHBlciBldml0YXJlIGFsIGNvbnN1bWVyIGxvb3AgaW5maW5pdGkgaW4gYWxjdW5pIGNhc2kgbGltaXRlIGNvbWUgYWQgZXNlbXBpb1xuICAgICAgICAgICAgLy8gc2Ugc2kgYWdnaXVuZ2UgdW4gdGFiIGFsbCdpbnRlcm5vIGRlbGwnZXZlbnRvIGBzZWxlY3RlZEluZGV4Q2hhbmdlYC5cbiAgICAgICAgICAgIHRoaXMuX2luZGV4VG9TZWxlY3QgPSB0aGlzLl9zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdWJzY3JpYmVUb1RhYkxhYmVscygpO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl90YWJzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUNoYW5nZUV2ZW50KGluZGV4OiBudW1iZXIpOiBUYWJDaGFuZ2VFdmVudCB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgVGFiQ2hhbmdlRXZlbnQ7XG4gICAgZXZlbnQuaW5kZXggPSBpbmRleDtcbiAgICBpZiAodGhpcy5fdGFicyAmJiB0aGlzLl90YWJzLmxlbmd0aCkge1xuICAgICAgZXZlbnQudGFiID0gdGhpcy5fdGFicy50b0FycmF5KClbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogU290dG9zY3JpdmkgYSBjYW1iaWFtZW50aSBuZWxsZSBsYWJlbCBkZWkgdGFiLiBOZWNlc3NhcmlvIHBlcmNow6ggbCdpbnB1dCBwZXIgbGEgbGFiZWwgw6ggc3VsIFRhYkNvbXBvbmVudFxuICAgKiBtZW50cmUgaWwgZGF0YSBiaW5kaW5nIMOoIGFsbCdpbnRlcm5vIGRpIFRhYkdyb3VwQ29tcG9uZW50LiBQZXIgZmFyZSBpbiBtb2RvIGNoZSBpbCBiaW5kaW5nIHNpYSBhZ2dpb3JuYXRvXG4gICAqIGJpc29nbmEgc290dG9zY3JpdmVyc2kgYWkgY2FtYmlhbWVudGkgZSBhemlvbmFyZSBsYSBjaGFuZ2UgZGV0ZWN0aW9uIGluIG1hbmllcmEgbWFudWFsZS5cbiAgICovXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvVGFiTGFiZWxzKCkge1xuICAgIGlmICh0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbiA9IG1lcmdlKFxuICAgICAgICAuLi50aGlzLl90YWJzLm1hcCh0YWIgPT4gdGFiLl9kaXNhYmxlQ2hhbmdlKSxcbiAgICAgICAgLi4udGhpcy5fdGFicy5tYXAodGFiID0+IHRhYi5fbGFiZWxDaGFuZ2UpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogZmlzc2EgbCdpbmRpY2UgdHJhIDAgZSBsYSBkaW1lbnNpb25lIGRlaSB0YWIuICovXG4gIHByaXZhdGUgX2NsYW1wVGFiSW5kZXgoaW5kZXg6IG51bWJlciB8IG51bGwpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLl90YWJzLmxlbmd0aCAtIDEsIE1hdGgubWF4KGluZGV4IHx8IDAsIDApKTtcbiAgfVxuXG4gIC8qKiByaXRvcm5hIHVuIGlkIHVuaXZvY28gcGVyIG9nbmkgbGFiZWwgZGkgdGFiICovXG4gIF9nZXRUYWJMYWJlbElkKGk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBpdC10YWItbGFiZWwtJHt0aGlzLl9ncm91cElkfS0ke2l9YDtcbiAgfVxuXG4gIC8qKiByaXRvcm5hIHVuIGlkIHVuaXZvY28gcGVyIG9nbmkgZWxlbWVudG8gZGkgY29udGVudXRvIGRlbCB0YWIgKi9cbiAgX2dldFRhYkNvbnRlbnRJZChpOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaXQtdGFiLWNvbnRlbnQtJHt0aGlzLl9ncm91cElkfS0ke2l9YDtcbiAgfVxuXG4gIC8qKiByZXN0aXR1aXNjZSBpbCB0YWJJbmRleCBkZWwgdGFiLiAqL1xuICBfZ2V0VGFiSW5kZXgodGFiOiBJdFRhYkNvbXBvbmVudCwgaWR4OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodGFiLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gaWR4ID8gMCA6IC0xO1xuICB9XG5cbiAgX2hhbmRsZUNsaWNrKCRldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmNoYW5nZVRhYihpbmRleCk7XG4gIH1cblxufVxuIiwiPHVsIGNsYXNzPVwibmF2XCIgW25nQ2xhc3NdPVwieyduYXYtZGFyayc6IGRhcmssICduYXYtdGFicyc6ICFwaWxsLCAnbmF2LXBpbGxzIG1iLTMnOiBwaWxsfVwiIHJvbGU9XCJ0YWJsaXN0XCI+XG5cbiAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIiAqbmdGb3I9XCJsZXQgdGFiIG9mIF90YWJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGFcbiAgICBmb2N1c01vdXNlXG4gICAgICBocmVmPVwiI1wiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiX2dldFRhYkNvbnRlbnRJZChpKVwiXG4gICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInNlbGVjdGVkSW5kZXggPT0gaVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYi5hcmlhTGFiZWwgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiKCF0YWIuYXJpYUxhYmVsICYmIHRhYi5hcmlhTGFiZWxsZWRieSkgPyB0YWIuYXJpYUxhYmVsbGVkYnkgOiBudWxsXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ25hdi1saW5rJzogdHJ1ZSwgJ2FjdGl2ZSc6IHNlbGVjdGVkSW5kZXggPT0gaSwgJ2Rpc2FibGVkJzogdGFiLmRpc2FibGVkIH1cIlxuICAgICAgW2lkXT1cIl9nZXRUYWJMYWJlbElkKGkpXCJcbiAgICAgIChjbGljayk9XCJfaGFuZGxlQ2xpY2soJGV2ZW50LCBpKVwiXG4gICAgICA+XG4gICAgICA8aSAqbmdJZj1cInRhYi5pY29uXCIgY2xhc3M9XCJpdC1pY28tbGcgZC1ibG9jayB0ZXh0LWNlbnRlclwiIFtuZ0NsYXNzXT1cInRhYi5pY29uXCI+PC9pPlxuICAgICAge3t0YWIubGFiZWx9fVxuICAgIDwvYT5cbiAgPC9saT5cbjwvdWw+XG48ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFiIG9mIF90YWJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgPGRpdlxuICAgICAgW25nQ2xhc3NdPVwieyAndGFiLXBhbmUgcC0zJzogdHJ1ZSwgJ3Nob3cgYWN0aXZlJzogc2VsZWN0ZWRJbmRleCA9PSBpIH1cIlxuICAgICAgW2lkXT1cIl9nZXRUYWJDb250ZW50SWQoaSlcIlxuICAgICAgcm9sZT1cInRhYnBhbmVsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfZ2V0VGFiTGFiZWxJZChpKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYi5faW1wbGljaXRDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
|