@skyux/tabs 8.7.2 → 9.0.0-alpha.1
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/documentation.json +100 -100
- package/esm2022/lib/modules/sectioned-form/sectioned-form-section.component.mjs +65 -0
- package/esm2022/lib/modules/sectioned-form/sectioned-form.component.mjs +187 -0
- package/{esm2020 → esm2022}/lib/modules/sectioned-form/sectioned-form.module.mjs +11 -11
- package/{esm2020 → esm2022}/lib/modules/sectioned-form/sectioned-form.service.mjs +4 -4
- package/esm2022/lib/modules/shared/sky-tabs-resources.module.mjs +61 -0
- package/esm2022/lib/modules/shared/tab-id.service.mjs +50 -0
- package/{esm2020 → esm2022}/lib/modules/tabs/tab-button-adapter.service.mjs +4 -4
- package/esm2022/lib/modules/tabs/tab-button.component.mjs +162 -0
- package/esm2022/lib/modules/tabs/tab.component.mjs +197 -0
- package/{esm2020 → esm2022}/lib/modules/tabs/tabs.module.mjs +21 -21
- package/esm2022/lib/modules/tabs/tabset-adapter.service.mjs +68 -0
- package/{esm2020 → esm2022}/lib/modules/tabs/tabset-nav-button-disabled.pipe.mjs +4 -4
- package/esm2022/lib/modules/tabs/tabset-nav-button.component.mjs +149 -0
- package/esm2022/lib/modules/tabs/tabset-permalink.service.mjs +128 -0
- package/esm2022/lib/modules/tabs/tabset.component.mjs +466 -0
- package/esm2022/lib/modules/tabs/tabset.service.mjs +198 -0
- package/esm2022/lib/modules/vertical-tabset/vertical-tab-media-query.service.mjs +68 -0
- package/esm2022/lib/modules/vertical-tabset/vertical-tab.component.mjs +217 -0
- package/esm2022/lib/modules/vertical-tabset/vertical-tabset-adapter.service.mjs +48 -0
- package/esm2022/lib/modules/vertical-tabset/vertical-tabset-group.component.mjs +108 -0
- package/esm2022/lib/modules/vertical-tabset/vertical-tabset.component.mjs +158 -0
- package/{esm2020 → esm2022}/lib/modules/vertical-tabset/vertical-tabset.module.mjs +21 -21
- package/esm2022/lib/modules/vertical-tabset/vertical-tabset.service.mjs +169 -0
- package/esm2022/testing/tabs/tabset-fixture.mjs +129 -0
- package/fesm2022/skyux-tabs-testing.mjs +136 -0
- package/{fesm2020 → fesm2022}/skyux-tabs-testing.mjs.map +1 -1
- package/fesm2022/skyux-tabs.mjs +2586 -0
- package/{fesm2020 → fesm2022}/skyux-tabs.mjs.map +1 -1
- package/lib/modules/sectioned-form/sectioned-form-section.component.d.ts +1 -1
- package/lib/modules/sectioned-form/sectioned-form.component.d.ts +1 -1
- package/lib/modules/tabs/tab-button.component.d.ts +1 -1
- package/lib/modules/tabs/tab.component.d.ts +1 -1
- package/lib/modules/tabs/tabset-nav-button.component.d.ts +1 -1
- package/lib/modules/tabs/tabset.component.d.ts +1 -1
- package/lib/modules/vertical-tabset/vertical-tab.component.d.ts +1 -1
- package/lib/modules/vertical-tabset/vertical-tabset-group.component.d.ts +1 -1
- package/lib/modules/vertical-tabset/vertical-tabset.component.d.ts +1 -1
- package/package.json +21 -29
- package/esm2020/lib/modules/sectioned-form/sectioned-form-section.component.mjs +0 -67
- package/esm2020/lib/modules/sectioned-form/sectioned-form.component.mjs +0 -187
- package/esm2020/lib/modules/shared/sky-tabs-resources.module.mjs +0 -61
- package/esm2020/lib/modules/shared/tab-id.service.mjs +0 -53
- package/esm2020/lib/modules/tabs/tab-button.component.mjs +0 -162
- package/esm2020/lib/modules/tabs/tab.component.mjs +0 -198
- package/esm2020/lib/modules/tabs/tabset-adapter.service.mjs +0 -68
- package/esm2020/lib/modules/tabs/tabset-nav-button.component.mjs +0 -149
- package/esm2020/lib/modules/tabs/tabset-permalink.service.mjs +0 -128
- package/esm2020/lib/modules/tabs/tabset.component.mjs +0 -429
- package/esm2020/lib/modules/tabs/tabset.service.mjs +0 -196
- package/esm2020/lib/modules/vertical-tabset/vertical-tab-media-query.service.mjs +0 -71
- package/esm2020/lib/modules/vertical-tabset/vertical-tab.component.mjs +0 -216
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset-adapter.service.mjs +0 -51
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset-group.component.mjs +0 -110
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset.component.mjs +0 -159
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset.service.mjs +0 -167
- package/esm2020/testing/tabs/tabset-fixture.mjs +0 -128
- package/fesm2015/skyux-tabs-testing.mjs +0 -147
- package/fesm2015/skyux-tabs-testing.mjs.map +0 -1
- package/fesm2015/skyux-tabs.mjs +0 -2560
- package/fesm2015/skyux-tabs.mjs.map +0 -1
- package/fesm2020/skyux-tabs-testing.mjs +0 -135
- package/fesm2020/skyux-tabs.mjs +0 -2544
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/sectioned-form/types/sectioned-form-message-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/sectioned-form/types/sectioned-form-message.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tab-button-view-model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tab-index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tab-layout-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tabset-active-tab-unregistered-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tabset-buttons-display-mode.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tabset-nav-button-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tabset-style.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/tabs/tabset-tab-indexes-change.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-tabs.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/skyux-tabs-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/tabs/tab-fixture-tab.mjs +0 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@skyux/core";
|
|
6
|
+
import * as i2 from "@angular/common";
|
|
7
|
+
import * as i3 from "@skyux/i18n";
|
|
8
|
+
import * as i4 from "./tabset-nav-button-disabled.pipe";
|
|
9
|
+
const buttonTypeNext = 'next';
|
|
10
|
+
const buttonTypePrevious = 'previous';
|
|
11
|
+
const buttonTypeFinish = 'finish';
|
|
12
|
+
export class SkyTabsetNavButtonComponent {
|
|
13
|
+
/**
|
|
14
|
+
* The tabset wizard component to associate with the nav button.
|
|
15
|
+
* @required
|
|
16
|
+
*/
|
|
17
|
+
get tabset() {
|
|
18
|
+
return this.#_tabset;
|
|
19
|
+
}
|
|
20
|
+
set tabset(value) {
|
|
21
|
+
this.#_tabset = value;
|
|
22
|
+
if (this.#currentTabsetSub) {
|
|
23
|
+
this.#currentTabsetSub.unsubscribe();
|
|
24
|
+
}
|
|
25
|
+
if (value) {
|
|
26
|
+
this.#currentTabsetSub = value.activeChange
|
|
27
|
+
.pipe(distinctUntilChanged(), takeUntil(this.#ngUnsubscribe))
|
|
28
|
+
.subscribe((index) => {
|
|
29
|
+
this.#activeSkyTabIndex = index;
|
|
30
|
+
this.#tabCount = this.#_tabset?.tabs?.length;
|
|
31
|
+
this.#updateTabToSelect();
|
|
32
|
+
this.#updateButtonVisibility();
|
|
33
|
+
this.#updateButtonProperties();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.#logger.error('The SkyTabsetNavButtonComponent requires a reference to the SkyTabsetComponent it controls.');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The type of nav button to include.
|
|
42
|
+
* @required
|
|
43
|
+
*/
|
|
44
|
+
get buttonType() {
|
|
45
|
+
return this.#_buttonType;
|
|
46
|
+
}
|
|
47
|
+
set buttonType(value) {
|
|
48
|
+
this.#_buttonType = value;
|
|
49
|
+
this.#updateTabToSelect();
|
|
50
|
+
this.#updateButtonProperties();
|
|
51
|
+
this.#updateButtonVisibility();
|
|
52
|
+
if (value === buttonTypeFinish) {
|
|
53
|
+
this.type = 'submit';
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.type = 'button';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Whether to disable the nav button.
|
|
61
|
+
* Defaults to the disabled state of the next tab for `next`, the existence of a previous tab for `previous`,
|
|
62
|
+
* and false for `finish`.
|
|
63
|
+
*/
|
|
64
|
+
set disabled(value) {
|
|
65
|
+
this.#_disabled = value;
|
|
66
|
+
}
|
|
67
|
+
get disabled() {
|
|
68
|
+
return this.#_disabled;
|
|
69
|
+
}
|
|
70
|
+
#_buttonType;
|
|
71
|
+
#_disabled;
|
|
72
|
+
#_tabset;
|
|
73
|
+
#activeIndexNumber;
|
|
74
|
+
#activeSkyTabIndex;
|
|
75
|
+
#currentTabsetSub;
|
|
76
|
+
#logger;
|
|
77
|
+
#tabCount;
|
|
78
|
+
#ngUnsubscribe;
|
|
79
|
+
constructor(logger) {
|
|
80
|
+
this.isVisible = false;
|
|
81
|
+
this.type = 'submit';
|
|
82
|
+
this.#ngUnsubscribe = new Subject();
|
|
83
|
+
this.#logger = logger;
|
|
84
|
+
}
|
|
85
|
+
ngOnDestroy() {
|
|
86
|
+
this.#ngUnsubscribe.next();
|
|
87
|
+
this.#ngUnsubscribe.complete();
|
|
88
|
+
}
|
|
89
|
+
buttonClick() {
|
|
90
|
+
/* istanbul ignore else */
|
|
91
|
+
if (this.tabToSelect && !this.tabToSelect.disabled && this.tabset) {
|
|
92
|
+
this.tabset.active = this.tabToSelect.tabIndex;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
#updateButtonVisibility() {
|
|
96
|
+
const isLastStep = !!this.#tabCount && this.#activeIndexNumber === this.#tabCount - 1;
|
|
97
|
+
if (this.buttonType === buttonTypeFinish) {
|
|
98
|
+
this.isVisible = isLastStep;
|
|
99
|
+
}
|
|
100
|
+
else if (this.buttonType === buttonTypeNext) {
|
|
101
|
+
this.isVisible = !isLastStep;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.isVisible = true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
#updateButtonProperties() {
|
|
108
|
+
if (this.buttonType === buttonTypeNext ||
|
|
109
|
+
this.buttonType === buttonTypeFinish) {
|
|
110
|
+
this.buttonClassName = 'sky-btn-primary';
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.buttonClassName = 'sky-btn-default';
|
|
114
|
+
}
|
|
115
|
+
this.ariaControls = this.tabToSelect?.tabPanelId;
|
|
116
|
+
}
|
|
117
|
+
#updateTabToSelect() {
|
|
118
|
+
if (this.tabset?.tabs) {
|
|
119
|
+
const tabs = this.tabset.tabs.toArray();
|
|
120
|
+
this.tabToSelect = undefined;
|
|
121
|
+
// tab index can be a number or a string, but we need the actual number index
|
|
122
|
+
this.#activeIndexNumber = tabs.findIndex((tab) => tab.tabIndex === this.#activeSkyTabIndex);
|
|
123
|
+
/* istanbul ignore else */
|
|
124
|
+
if (this.#activeIndexNumber !== undefined) {
|
|
125
|
+
if (this.buttonType === buttonTypeNext) {
|
|
126
|
+
this.tabToSelect = tabs[this.#activeIndexNumber + 1];
|
|
127
|
+
}
|
|
128
|
+
else if (this.buttonType === buttonTypePrevious) {
|
|
129
|
+
this.tabToSelect = tabs[this.#activeIndexNumber - 1];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTabsetNavButtonComponent, deps: [{ token: i1.SkyLogService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
135
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyTabsetNavButtonComponent, selector: "sky-tabset-nav-button", inputs: { tabset: "tabset", buttonType: "buttonType", buttonText: "buttonText", disabled: "disabled" }, ngImport: i0, template: "<button\n *ngIf=\"isVisible\"\n class=\"sky-btn sky-margin-inline-sm\"\n [attr.aria-controls]=\"ariaControls\"\n [disabled]=\"\n disabled\n | skyTabsetNavButtonDisabled\n : buttonType\n : !!tabToSelect\n : tabToSelect?.disabled\n \"\n [ngClass]=\"buttonClassName\"\n [type]=\"type\"\n (click)=\"buttonType === 'finish' ? null : buttonClick()\"\n>\n {{ buttonText || ('skyux_tabs_navigator_' + buttonType | skyLibResources) }}\n</button>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.SkyLibResourcesPipe, name: "skyLibResources" }, { kind: "pipe", type: i4.SkyTabsetNavButtonDisabledPipe, name: "skyTabsetNavButtonDisabled" }] }); }
|
|
136
|
+
}
|
|
137
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTabsetNavButtonComponent, decorators: [{
|
|
138
|
+
type: Component,
|
|
139
|
+
args: [{ selector: 'sky-tabset-nav-button', template: "<button\n *ngIf=\"isVisible\"\n class=\"sky-btn sky-margin-inline-sm\"\n [attr.aria-controls]=\"ariaControls\"\n [disabled]=\"\n disabled\n | skyTabsetNavButtonDisabled\n : buttonType\n : !!tabToSelect\n : tabToSelect?.disabled\n \"\n [ngClass]=\"buttonClassName\"\n [type]=\"type\"\n (click)=\"buttonType === 'finish' ? null : buttonClick()\"\n>\n {{ buttonText || ('skyux_tabs_navigator_' + buttonType | skyLibResources) }}\n</button>\n" }]
|
|
140
|
+
}], ctorParameters: function () { return [{ type: i1.SkyLogService }]; }, propDecorators: { tabset: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}], buttonType: [{
|
|
143
|
+
type: Input
|
|
144
|
+
}], buttonText: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], disabled: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}] } });
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LW5hdi1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RhYnMvc3JjL2xpYi9tb2R1bGVzL3RhYnMvdGFic2V0LW5hdi1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RhYnMvc3JjL2xpYi9tb2R1bGVzL3RhYnMvdGFic2V0LW5hdi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHNUQsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFPakUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBQzlCLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDO0FBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0FBTWxDLE1BQU0sT0FBTywyQkFBMkI7SUFDdEM7OztPQUdHO0lBQ0gsSUFDVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLE1BQU0sQ0FBQyxLQUFxQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7UUFFRCxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsWUFBWTtpQkFDeEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUks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QTJCLHFLQ25CeEMsOGRBaUJBOzsyRkRFYSwyQkFBMkI7a0JBSnZDLFNBQVM7K0JBQ0UsdUJBQXVCO29HQVN0QixNQUFNO3NCQURoQixLQUFLO2dCQWtDSyxVQUFVO3NCQURwQixLQUFLO2dCQXVCQyxVQUFVO3NCQURoQixLQUFLO2dCQVNLLFFBQVE7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNreUxvZ1NlcnZpY2UgfSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5VGFiSW5kZXggfSBmcm9tICcuL3RhYi1pbmRleCc7XG5pbXBvcnQgeyBTa3lUYWJDb21wb25lbnQgfSBmcm9tICcuL3RhYi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5VGFic2V0TmF2QnV0dG9uVHlwZSB9IGZyb20gJy4vdGFic2V0LW5hdi1idXR0b24tdHlwZSc7XG5pbXBvcnQgeyBTa3lUYWJzZXRDb21wb25lbnQgfSBmcm9tICcuL3RhYnNldC5jb21wb25lbnQnO1xuXG5jb25zdCBidXR0b25UeXBlTmV4dCA9ICduZXh0JztcbmNvbnN0IGJ1dHRvblR5cGVQcmV2aW91cyA9ICdwcmV2aW91cyc7XG5jb25zdCBidXR0b25UeXBlRmluaXNoID0gJ2ZpbmlzaCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS10YWJzZXQtbmF2LWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzZXQtbmF2LWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRhYnNldE5hdkJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUaGUgdGFic2V0IHdpemFyZCBjb21wb25lbnQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5hdiBidXR0b24uXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGdldCB0YWJzZXQoKTogU2t5VGFic2V0Q29tcG9uZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3RhYnNldDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdGFic2V0KHZhbHVlOiBTa3lUYWJzZXRDb21wb25lbnQgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfdGFic2V0ID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy4jY3VycmVudFRhYnNldFN1Yikge1xuICAgICAgdGhpcy4jY3VycmVudFRhYnNldFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy4jY3VycmVudFRhYnNldFN1YiA9IHZhbHVlLmFjdGl2ZUNoYW5nZVxuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGluZGV4OiBTa3lUYWJJbmRleCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2FjdGl2ZVNreVRhYkluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgdGhpcy4jdGFiQ291bnQgPSB0aGlzLiNfdGFic2V0Py50YWJzPy5sZW5ndGg7XG4gICAgICAgICAgdGhpcy4jdXBkYXRlVGFiVG9TZWxlY3QoKTtcbiAgICAgICAgICB0aGlzLiN1cGRhdGVCdXR0b25WaXNpYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy4jdXBkYXRlQnV0dG9uUHJvcGVydGllcygpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jbG9nZ2VyLmVycm9yKFxuICAgICAgICAnVGhlIFNreVRhYnNldE5hdkJ1dHRvbkNvbXBvbmVudCByZXF1aXJlcyBhIHJlZmVyZW5jZSB0byB0aGUgU2t5VGFic2V0Q29tcG9uZW50IGl0IGNvbnRyb2xzLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIG5hdiBidXR0b24gdG8gaW5jbHVkZS5cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGJ1dHRvblR5cGUoKTogU2t5VGFic2V0TmF2QnV0dG9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19idXR0b25UeXBlO1xuICB9XG5cbiAgcHVibGljIHNldCBidXR0b25UeXBlKHZhbHVlOiBTa3lUYWJzZXROYXZCdXR0b25UeXBlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2J1dHRvblR5cGUgPSB2YWx1ZTtcbiAgICB0aGlzLiN1cGRhdGVUYWJUb1NlbGVjdCgpO1xuICAgIHRoaXMuI3VwZGF0ZUJ1dHRvblByb3BlcnRpZXMoKTtcbiAgICB0aGlzLiN1cGRhdGVCdXR0b25WaXNpYmlsaXR5KCk7XG5cbiAgICBpZiAodmFsdWUgPT09IGJ1dHRvblR5cGVGaW5pc2gpIHtcbiAgICAgIHRoaXMudHlwZSA9ICdzdWJtaXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnR5cGUgPSAnYnV0dG9uJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxhYmVsIHRvIGRpc3BsYXkgb24gdGhlIG5hdiBidXR0b24uIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBkZWZhdWx0cyBmb3IgZWFjaCBgYnV0dG9uVHlwZWA6XG4gICAqIGBuZXh0YCA9IFwiTmV4dFwiLCBgcHJldmlvdXNgID0gXCJQcmV2aW91c1wiLCBgZmluaXNoYCA9IFwiRmluaXNoXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBidXR0b25UZXh0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIG5hdiBidXR0b24uXG4gICAqIERlZmF1bHRzIHRvIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgbmV4dCB0YWIgZm9yIGBuZXh0YCwgdGhlIGV4aXN0ZW5jZSBvZiBhIHByZXZpb3VzIHRhYiBmb3IgYHByZXZpb3VzYCxcbiAgICogYW5kIGZhbHNlIGZvciBgZmluaXNoYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19kaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBidXR0b25DbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGlzVmlzaWJsZSA9IGZhbHNlO1xuICBwdWJsaWMgdHlwZTogJ3N1Ym1pdCcgfCAnYnV0dG9uJyA9ICdzdWJtaXQnO1xuICBwdWJsaWMgYXJpYUNvbnRyb2xzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIHRhYlRvU2VsZWN0OiBTa3lUYWJDb21wb25lbnQgfCB1bmRlZmluZWQ7XG5cbiAgI19idXR0b25UeXBlOiBTa3lUYWJzZXROYXZCdXR0b25UeXBlIHwgdW5kZWZpbmVkO1xuICAjX2Rpc2FibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAjX3RhYnNldDogU2t5VGFic2V0Q29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICAjYWN0aXZlSW5kZXhOdW1iZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgI2FjdGl2ZVNreVRhYkluZGV4OiBTa3lUYWJJbmRleCB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRUYWJzZXRTdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgI2xvZ2dlcjogU2t5TG9nU2VydmljZTtcbiAgI3RhYkNvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICNuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihsb2dnZXI6IFNreUxvZ1NlcnZpY2UpIHtcbiAgICB0aGlzLiNsb2dnZXIgPSBsb2dnZXI7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGJ1dHRvbkNsaWNrKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMudGFiVG9TZWxlY3QgJiYgIXRoaXMudGFiVG9TZWxlY3QuZGlzYWJsZWQgJiYgdGhpcy50YWJzZXQpIHtcbiAgICAgIHRoaXMudGFic2V0LmFjdGl2ZSA9IHRoaXMudGFiVG9TZWxlY3QudGFiSW5kZXg7XG4gICAgfVxuICB9XG5cbiAgI3VwZGF0ZUJ1dHRvblZpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgY29uc3QgaXNMYXN0U3RlcCA9XG4gICAgICAhIXRoaXMuI3RhYkNvdW50ICYmIHRoaXMuI2FjdGl2ZUluZGV4TnVtYmVyID09PSB0aGlzLiN0YWJDb3VudCAtIDE7XG5cbiAgICBpZiAodGhpcy5idXR0b25UeXBlID09PSBidXR0b25UeXBlRmluaXNoKSB7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IGlzTGFzdFN0ZXA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJ1dHRvblR5cGUgPT09IGJ1dHRvblR5cGVOZXh0KSB7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA9ICFpc0xhc3RTdGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgI3VwZGF0ZUJ1dHRvblByb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5idXR0b25UeXBlID09PSBidXR0b25UeXBlTmV4dCB8fFxuICAgICAgdGhpcy5idXR0b25UeXBlID09PSBidXR0b25UeXBlRmluaXNoXG4gICAgKSB7XG4gICAgICB0aGlzLmJ1dHRvbkNsYXNzTmFtZSA9ICdza3ktYnRuLXByaW1hcnknO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1dHRvbkNsYXNzTmFtZSA9ICdza3ktYnRuLWRlZmF1bHQnO1xuICAgIH1cblxuICAgIHRoaXMuYXJpYUNvbnRyb2xzID0gdGhpcy50YWJUb1NlbGVjdD8udGFiUGFuZWxJZDtcbiAgfVxuXG4gICN1cGRhdGVUYWJUb1NlbGVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50YWJzZXQ/LnRhYnMpIHtcbiAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLnRhYnNldC50YWJzLnRvQXJyYXkoKTtcbiAgICAgIHRoaXMudGFiVG9TZWxlY3QgPSB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIHRhYiBpbmRleCBjYW4gYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcsIGJ1dCB3ZSBuZWVkIHRoZSBhY3R1YWwgbnVtYmVyIGluZGV4XG4gICAgICB0aGlzLiNhY3RpdmVJbmRleE51bWJlciA9IHRhYnMuZmluZEluZGV4KFxuICAgICAgICAodGFiKSA9PiB0YWIudGFiSW5kZXggPT09IHRoaXMuI2FjdGl2ZVNreVRhYkluZGV4XG4gICAgICApO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMuI2FjdGl2ZUluZGV4TnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9uVHlwZSA9PT0gYnV0dG9uVHlwZU5leHQpIHtcbiAgICAgICAgICB0aGlzLnRhYlRvU2VsZWN0ID0gdGFic1t0aGlzLiNhY3RpdmVJbmRleE51bWJlciArIDFdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnV0dG9uVHlwZSA9PT0gYnV0dG9uVHlwZVByZXZpb3VzKSB7XG4gICAgICAgICAgdGhpcy50YWJUb1NlbGVjdCA9IHRhYnNbdGhpcy4jYWN0aXZlSW5kZXhOdW1iZXIgLSAxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGJ1dHRvblxuICAqbmdJZj1cImlzVmlzaWJsZVwiXG4gIGNsYXNzPVwic2t5LWJ0biBza3ktbWFyZ2luLWlubGluZS1zbVwiXG4gIFthdHRyLmFyaWEtY29udHJvbHNdPVwiYXJpYUNvbnRyb2xzXCJcbiAgW2Rpc2FibGVkXT1cIlxuICAgIGRpc2FibGVkXG4gICAgICB8IHNreVRhYnNldE5hdkJ1dHRvbkRpc2FibGVkXG4gICAgICAgIDogYnV0dG9uVHlwZVxuICAgICAgICA6ICEhdGFiVG9TZWxlY3RcbiAgICAgICAgOiB0YWJUb1NlbGVjdD8uZGlzYWJsZWRcbiAgXCJcbiAgW25nQ2xhc3NdPVwiYnV0dG9uQ2xhc3NOYW1lXCJcbiAgW3R5cGVdPVwidHlwZVwiXG4gIChjbGljayk9XCJidXR0b25UeXBlID09PSAnZmluaXNoJyA/IG51bGwgOiBidXR0b25DbGljaygpXCJcbj5cbiAge3sgYnV0dG9uVGV4dCB8fCAoJ3NreXV4X3RhYnNfbmF2aWdhdG9yXycgKyBidXR0b25UeXBlIHwgc2t5TGliUmVzb3VyY2VzKSB9fVxuPC9idXR0b24+XG4iXX0=
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/router";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export class SkyTabsetPermalinkService {
|
|
10
|
+
get popStateChange() {
|
|
11
|
+
return this.#popStateChange;
|
|
12
|
+
}
|
|
13
|
+
#popStateChange;
|
|
14
|
+
#subscription;
|
|
15
|
+
#activatedRoute;
|
|
16
|
+
#location;
|
|
17
|
+
#router;
|
|
18
|
+
constructor(activatedRoute, location, router) {
|
|
19
|
+
this.#activatedRoute = activatedRoute;
|
|
20
|
+
this.#location = location;
|
|
21
|
+
this.#router = router;
|
|
22
|
+
this.#popStateChange = new Subject();
|
|
23
|
+
}
|
|
24
|
+
ngOnDestroy() {
|
|
25
|
+
if (this.#subscription) {
|
|
26
|
+
this.#subscription.unsubscribe();
|
|
27
|
+
}
|
|
28
|
+
this.#popStateChange.complete();
|
|
29
|
+
}
|
|
30
|
+
init() {
|
|
31
|
+
this.#subscription = this.#location.subscribe(() => {
|
|
32
|
+
this.#popStateChange.next();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns the value of a URL query param.
|
|
37
|
+
*/
|
|
38
|
+
getParam(name) {
|
|
39
|
+
return this.#getParams()[name];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sets the value of a URL query param.
|
|
43
|
+
*/
|
|
44
|
+
setParam(name, value) {
|
|
45
|
+
const params = this.#getParams();
|
|
46
|
+
if (value === null) {
|
|
47
|
+
delete params[name];
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
params[name] = value;
|
|
51
|
+
}
|
|
52
|
+
// Update the URL without triggering a navigation state change.
|
|
53
|
+
// See: https://stackoverflow.com/a/46486677
|
|
54
|
+
const url = this.#router
|
|
55
|
+
.createUrlTree([], {
|
|
56
|
+
relativeTo: this.#activatedRoute,
|
|
57
|
+
queryParams: params,
|
|
58
|
+
queryParamsHandling: 'merge',
|
|
59
|
+
})
|
|
60
|
+
.toString();
|
|
61
|
+
// Abort redirect if the current URL is equal to the new URL.
|
|
62
|
+
if (this.#location.isCurrentPathEqualTo(url)) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.#location.go(url);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Removes the provided query param from the URL.
|
|
69
|
+
*/
|
|
70
|
+
clearParam(name) {
|
|
71
|
+
this.setParam(name, null);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns a relative URL that includes the provided query parameter. The value is intended to be
|
|
75
|
+
* used by an HTML anchor element.
|
|
76
|
+
*/
|
|
77
|
+
getParamHref(name, value) {
|
|
78
|
+
if (!name) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const params = this.#getParams();
|
|
82
|
+
params[name] = value;
|
|
83
|
+
const baseUrl = this.#location.path().split('?')[0];
|
|
84
|
+
const paramString = Object.keys(params)
|
|
85
|
+
.map((k) => `${k}=${params[k]}`)
|
|
86
|
+
.join('&');
|
|
87
|
+
return this.#location.prepareExternalUrl(`${baseUrl}?${paramString}`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Converts the provided string into a value that can be safely used in a URL.
|
|
91
|
+
*/
|
|
92
|
+
urlify(value) {
|
|
93
|
+
if (!value) {
|
|
94
|
+
return '';
|
|
95
|
+
}
|
|
96
|
+
const sanitized = value
|
|
97
|
+
.toLowerCase()
|
|
98
|
+
// Remove special characters.
|
|
99
|
+
.replace(/[_~`@!#$%^&*()[\]{};:'/\\<>,.?=+|"]/g, '')
|
|
100
|
+
// Replace space characters with a dash.
|
|
101
|
+
.replace(/\s/g, '-')
|
|
102
|
+
// Remove any double-dashes.
|
|
103
|
+
.replace(/--/g, '-');
|
|
104
|
+
return sanitized;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Returns all query params that exist in the current URL.
|
|
108
|
+
*/
|
|
109
|
+
#getParams() {
|
|
110
|
+
const params = {};
|
|
111
|
+
const path = this.#location.path();
|
|
112
|
+
if (path.indexOf('?') === -1) {
|
|
113
|
+
return params;
|
|
114
|
+
}
|
|
115
|
+
const existingParamPairs = path.split('?')[1].split('&');
|
|
116
|
+
existingParamPairs.forEach((pair) => {
|
|
117
|
+
const fragments = pair.split('=');
|
|
118
|
+
params[fragments[0]] = decodeURIComponent(fragments[1]);
|
|
119
|
+
});
|
|
120
|
+
return params;
|
|
121
|
+
}
|
|
122
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTabsetPermalinkService, deps: [{ token: i1.ActivatedRoute }, { token: i2.Location }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
123
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTabsetPermalinkService }); }
|
|
124
|
+
}
|
|
125
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTabsetPermalinkService, decorators: [{
|
|
126
|
+
type: Injectable
|
|
127
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.Location }, { type: i1.Router }]; } });
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXBlcm1hbGluay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RhYnMvc3JjL2xpYi9tb2R1bGVzL3RhYnMvdGFic2V0LXBlcm1hbGluay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHdEQsT0FBTyxFQUFjLE9BQU8sRUFBb0IsTUFBTSxNQUFNLENBQUM7Ozs7QUFTN0Q7O0dBRUc7QUFFSCxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDLElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELGVBQWUsQ0FBZ0I7SUFFL0IsYUFBYSxDQUErQjtJQUU1QyxlQUFlLENBQWlCO0lBQ2hDLFNBQVMsQ0FBVztJQUNwQixPQUFPLENBQVM7SUFFaEIsWUFDRSxjQUE4QixFQUM5QixRQUFrQixFQUNsQixNQUFjO1FBRWQsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQzdDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMs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T0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzhHQS9JVSx5QkFBeUI7a0hBQXpCLHlCQUF5Qjs7MkZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbkxpa2UgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIFBlcm1hbGlua1BhcmFtcyB7XG4gIFtfOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTa3lUYWJzZXRQZXJtYWxpbmtTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHVibGljIGdldCBwb3BTdGF0ZUNoYW5nZSgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy4jcG9wU3RhdGVDaGFuZ2U7XG4gIH1cblxuICAjcG9wU3RhdGVDaGFuZ2U6IFN1YmplY3Q8dm9pZD47XG5cbiAgI3N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uTGlrZSB8IHVuZGVmaW5lZDtcblxuICAjYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlO1xuICAjbG9jYXRpb246IExvY2F0aW9uO1xuICAjcm91dGVyOiBSb3V0ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICByb3V0ZXI6IFJvdXRlclxuICApIHtcbiAgICB0aGlzLiNhY3RpdmF0ZWRSb3V0ZSA9IGFjdGl2YXRlZFJvdXRlO1xuICAgIHRoaXMuI2xvY2F0aW9uID0gbG9jYXRpb247XG4gICAgdGhpcy4jcm91dGVyID0gcm91dGVyO1xuXG4gICAgdGhpcy4jcG9wU3RhdGVDaGFuZ2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNzdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLiNwb3BTdGF0ZUNoYW5nZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uID0gdGhpcy4jbG9jYXRpb24uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuI3BvcFN0YXRlQ2hhbmdlLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIFVSTCBxdWVyeSBwYXJhbS5cbiAgICovXG4gIHB1YmxpYyBnZXRQYXJhbShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNnZXRQYXJhbXMoKVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFVSTCBxdWVyeSBwYXJhbS5cbiAgICovXG4gIHB1YmxpYyBzZXRQYXJhbShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy4jZ2V0UGFyYW1zKCk7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSBwYXJhbXNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtc1tuYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgVVJMIHdpdGhvdXQgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gc3RhdGUgY2hhbmdlLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2NDg2Njc3XG4gICAgY29uc3QgdXJsID0gdGhpcy4jcm91dGVyXG4gICAgICAuY3JlYXRlVXJsVHJlZShbXSwge1xuICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLiNhY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcXVlcnlQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIH0pXG4gICAgICAudG9TdHJpbmcoKTtcblxuICAgIC8vIEFib3J0IHJlZGlyZWN0IGlmIHRoZSBjdXJyZW50IFVSTCBpcyBlcXVhbCB0byB0aGUgbmV3IFVSTC5cbiAgICBpZiAodGhpcy4jbG9jYXRpb24uaXNDdXJyZW50UGF0aEVxdWFsVG8odXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuI2xvY2F0aW9uLmdvKHVybCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgcHJvdmlkZWQgcXVlcnkgcGFyYW0gZnJvbSB0aGUgVVJMLlxuICAgKi9cbiAgcHVibGljIGNsZWFyUGFyYW0obmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYXJhbShuYW1lLCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVsYXRpdmUgVVJMIHRoYXQgaW5jbHVkZXMgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIHZhbHVlIGlzIGludGVuZGVkIHRvIGJlXG4gICAqIHVzZWQgYnkgYW4gSFRNTCBhbmNob3IgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBnZXRQYXJhbUhyZWYobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLiNnZXRQYXJhbXMoKTtcbiAgICBwYXJhbXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLiNsb2NhdGlvbi5wYXRoKCkuc3BsaXQoJz8nKVswXTtcbiAgICBjb25zdCBwYXJhbVN0cmluZyA9IE9iamVjdC5rZXlzKHBhcmFtcylcbiAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7cGFyYW1zW2tdfWApXG4gICAgICAuam9pbignJicpO1xuXG4gICAgcmV0dXJuIHRoaXMuI2xvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChgJHtiYXNlVXJsfT8ke3BhcmFtU3RyaW5nfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIHNhZmVseSB1c2VkIGluIGEgVVJMLlxuICAgKi9cbiAgcHVibGljIHVybGlmeSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gdmFsdWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG5cbiAgICAgIC8vIFJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICAucmVwbGFjZSgvW19+YEAhIyQlXiYqKClbXFxde307OicvXFxcXDw+LC4/PSt8XCJdL2csICcnKVxuXG4gICAgICAvLyBSZXBsYWNlIHNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIGRhc2guXG4gICAgICAucmVwbGFjZSgvXFxzL2csICctJylcblxuICAgICAgLy8gUmVtb3ZlIGFueSBkb3VibGUtZGFzaGVzLlxuICAgICAgLnJlcGxhY2UoLy0tL2csICctJyk7XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIHF1ZXJ5IHBhcmFtcyB0aGF0IGV4aXN0IGluIHRoZSBjdXJyZW50IFVSTC5cbiAgICovXG4gICNnZXRQYXJhbXMoKTogUGVybWFsaW5rUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXM6IFBlcm1hbGlua1BhcmFtcyA9IHt9O1xuXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuI2xvY2F0aW9uLnBhdGgoKTtcbiAgICBpZiAocGF0aC5pbmRleE9mKCc/JykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nUGFyYW1QYWlycyA9IHBhdGguc3BsaXQoJz8nKVsxXS5zcGxpdCgnJicpO1xuICAgIGV4aXN0aW5nUGFyYW1QYWlycy5mb3JFYWNoKChwYWlyKSA9PiB7XG4gICAgICBjb25zdCBmcmFnbWVudHMgPSBwYWlyLnNwbGl0KCc9Jyk7XG4gICAgICBwYXJhbXNbZnJhZ21lbnRzWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChmcmFnbWVudHNbMV0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuIl19
|