@skyux/tabs 4.6.9 → 5.0.0-beta.4
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/LICENSE +21 -0
- package/bundles/skyux-tabs-testing.umd.js +324 -221
- package/bundles/skyux-tabs-testing.umd.js.map +1 -1
- package/bundles/skyux-tabs.umd.js +657 -782
- package/bundles/skyux-tabs.umd.js.map +1 -1
- package/documentation.json +5509 -0
- package/esm2015/modules/sectioned-form/sectioned-form-section.component.js +29 -32
- package/esm2015/modules/sectioned-form/sectioned-form.component.js +52 -41
- package/esm2015/modules/sectioned-form/sectioned-form.module.js +30 -19
- package/esm2015/modules/sectioned-form/sectioned-form.service.js +9 -8
- package/esm2015/modules/shared/sky-tabs-resources.module.js +41 -0
- package/esm2015/modules/tabs/tab-button.component.js +41 -47
- package/esm2015/modules/tabs/tab-index.js +2 -1
- package/esm2015/modules/tabs/tab.component.js +31 -41
- package/esm2015/modules/tabs/tabs.module.js +45 -23
- package/esm2015/modules/tabs/tabset-active-tab-unregistered-args.js +2 -1
- package/esm2015/modules/tabs/tabset-adapter.service.js +9 -8
- package/esm2015/modules/tabs/tabset-buttons-display-mode.js +2 -1
- package/esm2015/modules/tabs/tabset-nav-button.component.js +21 -26
- package/esm2015/modules/tabs/tabset-permalink.service.js +11 -15
- package/esm2015/modules/tabs/tabset-style.js +2 -1
- package/esm2015/modules/tabs/tabset-tab-indexes-change.js +2 -1
- package/esm2015/modules/tabs/tabset.component.js +56 -57
- package/esm2015/modules/tabs/tabset.service.js +10 -8
- package/esm2015/modules/vertical-tabset/vertical-tab-media-query.service.js +9 -8
- package/esm2015/modules/vertical-tabset/vertical-tab.component.js +57 -65
- package/esm2015/modules/vertical-tabset/vertical-tabset-adapter.service.js +10 -12
- package/esm2015/modules/vertical-tabset/vertical-tabset-group.component.js +75 -54
- package/esm2015/modules/vertical-tabset/vertical-tabset.component.js +70 -57
- package/esm2015/modules/vertical-tabset/vertical-tabset.module.js +47 -30
- package/esm2015/modules/vertical-tabset/vertical-tabset.service.js +19 -16
- package/esm2015/public-api.js +23 -0
- package/esm2015/skyux-tabs.js +2 -18
- package/esm2015/testing/public-api.js +3 -0
- package/esm2015/testing/skyux-tabs-testing.js +2 -2
- package/esm2015/testing/tabs/tab-fixture-tab.js +2 -1
- package/esm2015/testing/tabs/tabset-fixture.js +1 -1
- package/fesm2015/skyux-tabs-testing.js.map +1 -1
- package/fesm2015/skyux-tabs.js +596 -518
- package/fesm2015/skyux-tabs.js.map +1 -1
- package/modules/sectioned-form/sectioned-form-section.component.d.ts +3 -0
- package/modules/sectioned-form/sectioned-form.component.d.ts +3 -0
- package/modules/sectioned-form/sectioned-form.module.d.ts +9 -0
- package/modules/sectioned-form/sectioned-form.service.d.ts +3 -0
- package/modules/shared/sky-tabs-resources.module.d.ts +14 -0
- package/modules/tabs/tab-button.component.d.ts +4 -1
- package/modules/tabs/tab.component.d.ts +4 -1
- package/modules/tabs/tabs.module.d.ts +15 -0
- package/modules/tabs/tabset-adapter.service.d.ts +3 -0
- package/modules/tabs/tabset-nav-button.component.d.ts +3 -0
- package/modules/tabs/tabset-permalink.service.d.ts +3 -0
- package/modules/tabs/tabset.component.d.ts +4 -1
- package/modules/tabs/tabset.service.d.ts +3 -0
- package/modules/vertical-tabset/vertical-tab-media-query.service.d.ts +3 -0
- package/modules/vertical-tabset/vertical-tab.component.d.ts +3 -0
- package/modules/vertical-tabset/vertical-tabset-adapter.service.d.ts +3 -0
- package/modules/vertical-tabset/vertical-tabset-group.component.d.ts +3 -0
- package/modules/vertical-tabset/vertical-tabset.component.d.ts +3 -0
- package/modules/vertical-tabset/vertical-tabset.module.d.ts +11 -0
- package/modules/vertical-tabset/vertical-tabset.service.d.ts +3 -0
- package/package.json +14 -29
- package/public-api.d.ts +16 -0
- package/skyux-tabs.d.ts +2 -17
- package/testing/package.json +2 -5
- package/testing/{public_api.d.ts → public-api.d.ts} +0 -0
- package/testing/skyux-tabs-testing.d.ts +2 -1
- package/CHANGELOG.md +0 -218
- package/bundles/skyux-tabs-testing.umd.min.js +0 -16
- package/bundles/skyux-tabs-testing.umd.min.js.map +0 -1
- package/bundles/skyux-tabs.umd.min.js +0 -16
- package/bundles/skyux-tabs.umd.min.js.map +0 -1
- package/esm2015/modules/shared/tabs-resources.module.js +0 -17
- package/esm2015/plugin-resources/tabs-resources-provider.js +0 -16
- package/esm2015/public_api.js +0 -10
- package/esm2015/testing/public_api.js +0 -2
- package/esm5/modules/sectioned-form/sectioned-form-section.component.js +0 -84
- package/esm5/modules/sectioned-form/sectioned-form.component.js +0 -111
- package/esm5/modules/sectioned-form/sectioned-form.module.js +0 -31
- package/esm5/modules/sectioned-form/sectioned-form.service.js +0 -35
- package/esm5/modules/shared/tabs-resources.module.js +0 -20
- package/esm5/modules/tabs/tab-button.component.js +0 -72
- package/esm5/modules/tabs/tab-index.js +0 -1
- package/esm5/modules/tabs/tab.component.js +0 -173
- package/esm5/modules/tabs/tabs.module.js +0 -44
- package/esm5/modules/tabs/tabset-active-tab-unregistered-args.js +0 -1
- package/esm5/modules/tabs/tabset-adapter.service.js +0 -58
- package/esm5/modules/tabs/tabset-buttons-display-mode.js +0 -1
- package/esm5/modules/tabs/tabset-nav-button.component.js +0 -145
- package/esm5/modules/tabs/tabset-permalink.service.js +0 -129
- package/esm5/modules/tabs/tabset-style.js +0 -1
- package/esm5/modules/tabs/tabset-tab-indexes-change.js +0 -1
- package/esm5/modules/tabs/tabset.component.js +0 -434
- package/esm5/modules/tabs/tabset.service.js +0 -122
- package/esm5/modules/vertical-tabset/vertical-tab-media-query.service.js +0 -76
- package/esm5/modules/vertical-tabset/vertical-tab.component.js +0 -214
- package/esm5/modules/vertical-tabset/vertical-tabset-adapter.service.js +0 -51
- package/esm5/modules/vertical-tabset/vertical-tabset-group.component.js +0 -119
- package/esm5/modules/vertical-tabset/vertical-tabset.component.js +0 -145
- package/esm5/modules/vertical-tabset/vertical-tabset.module.js +0 -46
- package/esm5/modules/vertical-tabset/vertical-tabset.service.js +0 -176
- package/esm5/plugin-resources/tabs-resources-provider.js +0 -17
- package/esm5/public_api.js +0 -10
- package/esm5/skyux-tabs.js +0 -21
- package/esm5/testing/public_api.js +0 -2
- package/esm5/testing/skyux-tabs-testing.js +0 -5
- package/esm5/testing/tabs/tab-fixture-tab.js +0 -1
- package/esm5/testing/tabs/tabset-fixture.js +0 -168
- package/fesm5/skyux-tabs-testing.js +0 -174
- package/fesm5/skyux-tabs-testing.js.map +0 -1
- package/fesm5/skyux-tabs.js +0 -2182
- package/fesm5/skyux-tabs.js.map +0 -1
- package/modules/shared/tabs-resources.module.d.ts +0 -2
- package/plugin-resources/tabs-resources-provider.d.ts +0 -5
- package/public_api.d.ts +0 -9
- package/skyux-tabs.metadata.json +0 -1
- package/src/assets/img/guidelines/tabs/tabs-anatomy.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-behavior-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-2.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-3.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-4.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-options-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-options-2.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-collapsed-closed.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-collapsed-open.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-hover.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-selected.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-unselected.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-2.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-3.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-4.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-5.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-anatomy-1.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-anatomy-2.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-layout-1.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-hover.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-selected-group.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-selected.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-unselected-group.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-unselected.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-1.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-2.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-3.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-4.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-5.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-6.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-7.png +0 -0
- package/src/assets/locales/resources_en_US.json +0 -26
- package/testing/skyux-tabs-testing.metadata.json +0 -1
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, OnDestroy, Output, QueryList, ViewEncapsulation } from '@angular/core';
|
|
3
|
-
import { combineLatest, race, Subject } from 'rxjs';
|
|
4
|
-
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
|
5
|
-
import { SkyTabComponent } from './tab.component';
|
|
6
|
-
import { SkyTabsetAdapterService } from './tabset-adapter.service';
|
|
7
|
-
import { SkyTabsetPermalinkService } from './tabset-permalink.service';
|
|
8
|
-
import { SkyTabsetService } from './tabset.service';
|
|
9
|
-
var SkyTabsetComponent = /** @class */ (function () {
|
|
10
|
-
function SkyTabsetComponent(changeDetector, elementRef, adapterService, permalinkService, tabsetService) {
|
|
11
|
-
this.changeDetector = changeDetector;
|
|
12
|
-
this.elementRef = elementRef;
|
|
13
|
-
this.adapterService = adapterService;
|
|
14
|
-
this.permalinkService = permalinkService;
|
|
15
|
-
this.tabsetService = tabsetService;
|
|
16
|
-
/**
|
|
17
|
-
* Fires when the active tab changes. This event emits the index of the active tab.
|
|
18
|
-
*/
|
|
19
|
-
this.activeChange = new EventEmitter();
|
|
20
|
-
/**
|
|
21
|
-
* Fires when users click the button to add a new tab.
|
|
22
|
-
* The new tab button is added to the tab area when you specify a listener for this event.
|
|
23
|
-
*/
|
|
24
|
-
this.newTab = new EventEmitter();
|
|
25
|
-
/**
|
|
26
|
-
* Fires when users click the button to open a tab.
|
|
27
|
-
* The open tab button is added to the tab area when you specify a listener for this event.
|
|
28
|
-
*/
|
|
29
|
-
this.openTab = new EventEmitter();
|
|
30
|
-
/**
|
|
31
|
-
* Fires when any tab's `tabIndex` value changes.
|
|
32
|
-
*/
|
|
33
|
-
this.tabIndexesChange = new EventEmitter();
|
|
34
|
-
this.tabButtons = [];
|
|
35
|
-
this.ngUnsubscribe = new Subject();
|
|
36
|
-
this.tabComponentsStateChangeUnsubscribe = new Subject();
|
|
37
|
-
}
|
|
38
|
-
Object.defineProperty(SkyTabsetComponent.prototype, "active", {
|
|
39
|
-
get: function () {
|
|
40
|
-
return this._active;
|
|
41
|
-
},
|
|
42
|
-
/**
|
|
43
|
-
* Activates a tab by its `tabIndex` property.
|
|
44
|
-
*/
|
|
45
|
-
set: function (value) {
|
|
46
|
-
var _this = this;
|
|
47
|
-
if (value === undefined ||
|
|
48
|
-
this.tabsetService.tabIndexesEqual(value, this._active)) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
this._active = value;
|
|
52
|
-
if (this.tabs) {
|
|
53
|
-
this.tabsetService.setActiveTabIndex(value);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
// On init, wait for children tabs to render before broadcasting the active tab index.
|
|
57
|
-
setTimeout(function () {
|
|
58
|
-
if (_this.tabsetService.isValidTabIndex(value)) {
|
|
59
|
-
// On init, yield to the permalink ID, if it exists.
|
|
60
|
-
if (_this.getActiveTabIndexByPermalinkId() === undefined) {
|
|
61
|
-
_this.tabsetService.setActiveTabIndex(value);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
// Activate the first tab if the new tab index is invalid.
|
|
66
|
-
_this._active = _this.tabsetService.activateFirstTab();
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
enumerable: true,
|
|
72
|
-
configurable: true
|
|
73
|
-
});
|
|
74
|
-
Object.defineProperty(SkyTabsetComponent.prototype, "permalinkId", {
|
|
75
|
-
get: function () {
|
|
76
|
-
return this._permalinkId || '';
|
|
77
|
-
},
|
|
78
|
-
/**
|
|
79
|
-
* Distinguishes a tabset's unique state in the URL by generating a query parameter
|
|
80
|
-
* that is written as `?<queryParam>-active-tab=<sanitized-tab-heading>`.
|
|
81
|
-
* The query parameter's value is parsed automatically from the selected tab's heading text,
|
|
82
|
-
* but you can supply a custom query parameter value for each tab with its `permalinkValue`.
|
|
83
|
-
*/
|
|
84
|
-
set: function (value) {
|
|
85
|
-
if (!value) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
var sanitized = this.permalinkService.urlify(value);
|
|
89
|
-
this._permalinkId = sanitized + "-active-tab";
|
|
90
|
-
},
|
|
91
|
-
enumerable: true,
|
|
92
|
-
configurable: true
|
|
93
|
-
});
|
|
94
|
-
Object.defineProperty(SkyTabsetComponent.prototype, "tabStyle", {
|
|
95
|
-
get: function () {
|
|
96
|
-
return this._tabStyle || 'tabs';
|
|
97
|
-
},
|
|
98
|
-
/**
|
|
99
|
-
* Specifies the behavior for a series of tabs.
|
|
100
|
-
* @deprecated The property was designed to create wizards by setting tabStyle="wizard" on tabsets in modals,
|
|
101
|
-
* but this wizard implementation was replaced by the
|
|
102
|
-
* [progress indicator component](https://developer.blackbaud.com/skyux/components/progress-indicator).
|
|
103
|
-
* @default 'tabs'
|
|
104
|
-
*/
|
|
105
|
-
set: function (value) {
|
|
106
|
-
/*istanbul ignore else*/
|
|
107
|
-
if (value && value.toLowerCase() === 'wizard') {
|
|
108
|
-
console.warn('The tabset wizard is deprecated. Please implement the new approach using ' +
|
|
109
|
-
'progress indicator as documented here: https://developer.blackbaud.com/skyux/components/wizard.');
|
|
110
|
-
}
|
|
111
|
-
this._tabStyle = value;
|
|
112
|
-
},
|
|
113
|
-
enumerable: true,
|
|
114
|
-
configurable: true
|
|
115
|
-
});
|
|
116
|
-
Object.defineProperty(SkyTabsetComponent.prototype, "tabDisplayMode", {
|
|
117
|
-
get: function () {
|
|
118
|
-
return this._tabDisplayMode || 'tabs';
|
|
119
|
-
},
|
|
120
|
-
set: function (value) {
|
|
121
|
-
this._tabDisplayMode = value;
|
|
122
|
-
this.changeDetector.markForCheck();
|
|
123
|
-
},
|
|
124
|
-
enumerable: true,
|
|
125
|
-
configurable: true
|
|
126
|
-
});
|
|
127
|
-
SkyTabsetComponent.prototype.ngAfterViewInit = function () {
|
|
128
|
-
var _this = this;
|
|
129
|
-
this.initTabComponents();
|
|
130
|
-
this.listenTabComponentsStructuralChange();
|
|
131
|
-
var initialTabIndex = this.getInitialTabIndex();
|
|
132
|
-
this.tabsetService.setActiveTabIndex(initialTabIndex);
|
|
133
|
-
this.listenTabButtonsOverflowChange();
|
|
134
|
-
this.listenLocationPopStateChange();
|
|
135
|
-
// If the currently active tab is getting unregistered, activate the next one.
|
|
136
|
-
this.tabsetService.activeTabUnregistered
|
|
137
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
138
|
-
.subscribe(function (tab) {
|
|
139
|
-
// Wait for the new tabs to render before activating.
|
|
140
|
-
setTimeout(function () {
|
|
141
|
-
_this.tabsetService.activateNearestTab(tab.arrayIndex);
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
// Let the tabset render the initial active index before listening for changes.
|
|
145
|
-
setTimeout(function () {
|
|
146
|
-
_this.listenTabComponentsStateChange();
|
|
147
|
-
_this.listenActiveIndexChange();
|
|
148
|
-
_this.permalinkService.init();
|
|
149
|
-
});
|
|
150
|
-
};
|
|
151
|
-
SkyTabsetComponent.prototype.ngOnDestroy = function () {
|
|
152
|
-
this.ngUnsubscribe.next();
|
|
153
|
-
this.ngUnsubscribe.complete();
|
|
154
|
-
this.unsubscribeTabComponentsStateChange();
|
|
155
|
-
this.permalinkService.clearParam(this.permalinkId);
|
|
156
|
-
};
|
|
157
|
-
SkyTabsetComponent.prototype.onWindowResize = function () {
|
|
158
|
-
this.adapterService.detectOverflow();
|
|
159
|
-
};
|
|
160
|
-
SkyTabsetComponent.prototype.onTabCloseClick = function (tabButton) {
|
|
161
|
-
var _this = this;
|
|
162
|
-
var tabComponent = this.tabs.find(function (tab) {
|
|
163
|
-
return _this.tabsetService.tabIndexesEqual(tab.tabIndex, tabButton.tabIndex);
|
|
164
|
-
});
|
|
165
|
-
tabComponent.close.emit();
|
|
166
|
-
};
|
|
167
|
-
SkyTabsetComponent.prototype.onTabButtonClick = function (tabButton) {
|
|
168
|
-
this.tabsetService.setActiveTabIndex(tabButton.tabIndex);
|
|
169
|
-
};
|
|
170
|
-
SkyTabsetComponent.prototype.onNewTabClick = function () {
|
|
171
|
-
this.newTab.emit();
|
|
172
|
-
};
|
|
173
|
-
SkyTabsetComponent.prototype.onOpenTabClick = function () {
|
|
174
|
-
this.openTab.emit();
|
|
175
|
-
};
|
|
176
|
-
/**
|
|
177
|
-
* Sets the initial active tab index based on the following criteria.
|
|
178
|
-
* 1. Does the URL include a query param that reflects this tabset's active tab?
|
|
179
|
-
* 2. Does one of the tab components have their `active` property set to `true`?
|
|
180
|
-
* 3. Is the tabset component's `active` property set to a specific tab index?
|
|
181
|
-
*/
|
|
182
|
-
SkyTabsetComponent.prototype.getInitialTabIndex = function () {
|
|
183
|
-
var _a;
|
|
184
|
-
var activeIndex = this.getActiveTabIndexByPermalinkId();
|
|
185
|
-
if (activeIndex === undefined) {
|
|
186
|
-
activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
187
|
-
if (activeIndex === undefined) {
|
|
188
|
-
activeIndex = this.active;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return activeIndex;
|
|
192
|
-
};
|
|
193
|
-
SkyTabsetComponent.prototype.listenActiveIndexChange = function () {
|
|
194
|
-
var _this = this;
|
|
195
|
-
this.tabsetService.activeTabIndex
|
|
196
|
-
.pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
|
|
197
|
-
.subscribe(function (activeIndex) {
|
|
198
|
-
_this.updateTabsetComponent(activeIndex);
|
|
199
|
-
});
|
|
200
|
-
};
|
|
201
|
-
SkyTabsetComponent.prototype.listenTabComponentsStructuralChange = function () {
|
|
202
|
-
var _this = this;
|
|
203
|
-
this.tabs.changes
|
|
204
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
205
|
-
.subscribe(function () {
|
|
206
|
-
_this.resetTabComponents();
|
|
207
|
-
});
|
|
208
|
-
};
|
|
209
|
-
SkyTabsetComponent.prototype.listenTabComponentsStateChange = function () {
|
|
210
|
-
var _this = this;
|
|
211
|
-
combineLatest(this.tabs.map(function (tab) { return tab.activeChange; }))
|
|
212
|
-
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
213
|
-
.subscribe(function () {
|
|
214
|
-
// Wait for the tab components to render changes before finding the active one.
|
|
215
|
-
setTimeout(function () {
|
|
216
|
-
var _a;
|
|
217
|
-
var tabIndex = (_a = _this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
218
|
-
_this.tabsetService.setActiveTabIndex(tabIndex);
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
combineLatest(this.tabs.map(function (tab) { return tab.tabIndexChange; }))
|
|
222
|
-
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
223
|
-
.subscribe(function () {
|
|
224
|
-
// Don't emit the first change.
|
|
225
|
-
if (_this.lastActiveTabIndex !== undefined) {
|
|
226
|
-
// Wait for the tab components to render changes before updating the view.
|
|
227
|
-
setTimeout(function () {
|
|
228
|
-
_this.updateTabsetComponent(_this.tabsetService.currentActiveTabIndex, true);
|
|
229
|
-
_this.emitTabIndexChange();
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
combineLatest(this.tabs.map(function (tab) { return tab.stateChange; }))
|
|
234
|
-
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
235
|
-
.subscribe(function () {
|
|
236
|
-
// Wait for the tab components to render changes before finding the active one.
|
|
237
|
-
setTimeout(function () {
|
|
238
|
-
_this.updateTabsetComponent(_this.tabsetService.currentActiveTabIndex, true);
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
};
|
|
242
|
-
SkyTabsetComponent.prototype.initTabComponents = function () {
|
|
243
|
-
this.tabs.forEach(function (tab) { return tab.init(); });
|
|
244
|
-
};
|
|
245
|
-
SkyTabsetComponent.prototype.resetTabComponents = function () {
|
|
246
|
-
var _a;
|
|
247
|
-
this.unsubscribeTabComponentsStateChange();
|
|
248
|
-
this.tabsetService.unregisterAll();
|
|
249
|
-
// If there are no tab components, do a hard reset of the view.
|
|
250
|
-
if (this.tabs.length === 0) {
|
|
251
|
-
this.updateTabsetComponent(0, true);
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
this.initTabComponents();
|
|
255
|
-
var activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
256
|
-
this.tabsetService.setActiveTabIndex(activeIndex, {
|
|
257
|
-
emitChange: false
|
|
258
|
-
});
|
|
259
|
-
this.listenTabComponentsStateChange();
|
|
260
|
-
};
|
|
261
|
-
SkyTabsetComponent.prototype.emitTabIndexChange = function () {
|
|
262
|
-
this.tabIndexesChange.emit({
|
|
263
|
-
tabs: this.tabs.map(function (tab) { return ({
|
|
264
|
-
tabHeading: tab.tabHeading,
|
|
265
|
-
tabIndex: tab.tabIndex
|
|
266
|
-
}); })
|
|
267
|
-
});
|
|
268
|
-
};
|
|
269
|
-
SkyTabsetComponent.prototype.unsubscribeTabComponentsStateChange = function () {
|
|
270
|
-
this.tabComponentsStateChangeUnsubscribe.next();
|
|
271
|
-
this.tabComponentsStateChangeUnsubscribe.complete();
|
|
272
|
-
this.tabComponentsStateChangeUnsubscribe = new Subject();
|
|
273
|
-
};
|
|
274
|
-
SkyTabsetComponent.prototype.listenTabButtonsOverflowChange = function () {
|
|
275
|
-
var _this = this;
|
|
276
|
-
this.adapterService.registerTabset(this.elementRef);
|
|
277
|
-
this.adapterService.overflowChange
|
|
278
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
279
|
-
.subscribe(function (isOverflowing) {
|
|
280
|
-
_this.tabDisplayMode = (isOverflowing) ? 'dropdown' : 'tabs';
|
|
281
|
-
_this.changeDetector.markForCheck();
|
|
282
|
-
});
|
|
283
|
-
};
|
|
284
|
-
/**
|
|
285
|
-
* Listen for back/forward history button presses to detect query param changes in the URL.
|
|
286
|
-
*/
|
|
287
|
-
SkyTabsetComponent.prototype.listenLocationPopStateChange = function () {
|
|
288
|
-
var _this = this;
|
|
289
|
-
this.permalinkService.popStateChange
|
|
290
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
291
|
-
.subscribe(function () {
|
|
292
|
-
_this.setActiveTabIndexByPermalinkId();
|
|
293
|
-
});
|
|
294
|
-
};
|
|
295
|
-
SkyTabsetComponent.prototype.setActiveTabIndexByPermalinkId = function () {
|
|
296
|
-
var activeIndex = this.getActiveTabIndexByPermalinkId();
|
|
297
|
-
this.tabsetService.setActiveTabIndex(activeIndex);
|
|
298
|
-
};
|
|
299
|
-
SkyTabsetComponent.prototype.getActiveTabIndexByPermalinkId = function () {
|
|
300
|
-
var _a;
|
|
301
|
-
if (this.permalinkId) {
|
|
302
|
-
var paramValue_1 = this.permalinkService.getParam(this.permalinkId);
|
|
303
|
-
if (paramValue_1) {
|
|
304
|
-
return (_a = this.tabs.find(function (tab) { return tab.permalinkValue === paramValue_1; })) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
};
|
|
308
|
-
SkyTabsetComponent.prototype.getActiveTabComponent = function () {
|
|
309
|
-
return this.tabs.toArray().reverse().find(function (tab) { return tab.active === true; });
|
|
310
|
-
};
|
|
311
|
-
SkyTabsetComponent.prototype.createTabButtons = function (activeIndex) {
|
|
312
|
-
var _this = this;
|
|
313
|
-
return this.tabs.map(function (tab) { return ({
|
|
314
|
-
active: _this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex),
|
|
315
|
-
closeable: tab.closeable,
|
|
316
|
-
ariaControls: tab.tabPanelId,
|
|
317
|
-
disabled: tab.disabled,
|
|
318
|
-
/*tslint:disable-next-line:no-null-keyword*/
|
|
319
|
-
buttonHref: (tab.disabled) ? null : _this.permalinkService.getParamHref(_this.permalinkId, tab.permalinkValue),
|
|
320
|
-
buttonId: tab.tabButtonId,
|
|
321
|
-
buttonTextCount: tab.tabHeaderCount,
|
|
322
|
-
buttonText: tab.tabHeading,
|
|
323
|
-
tabIndex: tab.tabIndex
|
|
324
|
-
}); });
|
|
325
|
-
};
|
|
326
|
-
SkyTabsetComponent.prototype.updateTabButtons = function (activeIndex) {
|
|
327
|
-
var _this = this;
|
|
328
|
-
this.tabButtons.forEach(function (button) {
|
|
329
|
-
button.active = _this.tabsetService.tabIndexesEqual(button.tabIndex, activeIndex);
|
|
330
|
-
});
|
|
331
|
-
};
|
|
332
|
-
/**
|
|
333
|
-
* Updates the UI and state of the tabset component after the tab index or
|
|
334
|
-
* tab components have changed.
|
|
335
|
-
* @param activeIndex The currently active tab index.
|
|
336
|
-
* @param regenerateTabButtons Indicates if tab button view models should be regenerated.
|
|
337
|
-
* Setting this value to `false` will simply update the existing tab buttons. Setting this value
|
|
338
|
-
* to `true` is only necessary when the underlying tab components have changed and the tab
|
|
339
|
-
* buttons must reflect those changes.
|
|
340
|
-
*/
|
|
341
|
-
SkyTabsetComponent.prototype.updateTabsetComponent = function (activeIndex, regenerateTabButtons) {
|
|
342
|
-
var _this = this;
|
|
343
|
-
if (regenerateTabButtons === void 0) { regenerateTabButtons = false; }
|
|
344
|
-
var _a;
|
|
345
|
-
// Activate/deactivate tab components.
|
|
346
|
-
this.tabs.forEach(function (tab) {
|
|
347
|
-
_this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex)
|
|
348
|
-
? tab.activate()
|
|
349
|
-
: tab.deactivate();
|
|
350
|
-
});
|
|
351
|
-
// Update the tab button models.
|
|
352
|
-
if (regenerateTabButtons || !this.tabButtons.length) {
|
|
353
|
-
this.tabButtons = this.createTabButtons(activeIndex);
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
this.updateTabButtons(activeIndex);
|
|
357
|
-
}
|
|
358
|
-
// Update the dropdown trigger button text.
|
|
359
|
-
this.dropdownTriggerButtonText = (_a = this.tabButtons.find(function (b) {
|
|
360
|
-
return _this.tabsetService.tabIndexesEqual(b.tabIndex, activeIndex);
|
|
361
|
-
})) === null || _a === void 0 ? void 0 : _a.buttonText;
|
|
362
|
-
// Set the query params based on active tab.
|
|
363
|
-
if (this.permalinkId) {
|
|
364
|
-
var activeTabComponent = this.tabs.find(function (tab) {
|
|
365
|
-
return _this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex);
|
|
366
|
-
});
|
|
367
|
-
this.permalinkService.setParam(this.permalinkId, activeTabComponent.permalinkValue);
|
|
368
|
-
}
|
|
369
|
-
// Wait for tab button view models to render before gauging dimensions.
|
|
370
|
-
setTimeout(function () {
|
|
371
|
-
_this.adapterService.detectOverflow();
|
|
372
|
-
});
|
|
373
|
-
this.changeDetector.markForCheck();
|
|
374
|
-
// Emit the new active index value to consumers.
|
|
375
|
-
if (this.lastActiveTabIndex !== activeIndex) {
|
|
376
|
-
this.lastActiveTabIndex = activeIndex;
|
|
377
|
-
this.activeChange.emit(activeIndex);
|
|
378
|
-
}
|
|
379
|
-
};
|
|
380
|
-
SkyTabsetComponent.ctorParameters = function () { return [
|
|
381
|
-
{ type: ChangeDetectorRef },
|
|
382
|
-
{ type: ElementRef },
|
|
383
|
-
{ type: SkyTabsetAdapterService },
|
|
384
|
-
{ type: SkyTabsetPermalinkService },
|
|
385
|
-
{ type: SkyTabsetService }
|
|
386
|
-
]; };
|
|
387
|
-
__decorate([
|
|
388
|
-
Input()
|
|
389
|
-
], SkyTabsetComponent.prototype, "active", null);
|
|
390
|
-
__decorate([
|
|
391
|
-
Input()
|
|
392
|
-
], SkyTabsetComponent.prototype, "ariaLabel", void 0);
|
|
393
|
-
__decorate([
|
|
394
|
-
Input()
|
|
395
|
-
], SkyTabsetComponent.prototype, "ariaLabelledBy", void 0);
|
|
396
|
-
__decorate([
|
|
397
|
-
Input()
|
|
398
|
-
], SkyTabsetComponent.prototype, "permalinkId", null);
|
|
399
|
-
__decorate([
|
|
400
|
-
Input()
|
|
401
|
-
], SkyTabsetComponent.prototype, "tabStyle", null);
|
|
402
|
-
__decorate([
|
|
403
|
-
Output()
|
|
404
|
-
], SkyTabsetComponent.prototype, "activeChange", void 0);
|
|
405
|
-
__decorate([
|
|
406
|
-
Output()
|
|
407
|
-
], SkyTabsetComponent.prototype, "newTab", void 0);
|
|
408
|
-
__decorate([
|
|
409
|
-
Output()
|
|
410
|
-
], SkyTabsetComponent.prototype, "openTab", void 0);
|
|
411
|
-
__decorate([
|
|
412
|
-
Output()
|
|
413
|
-
], SkyTabsetComponent.prototype, "tabIndexesChange", void 0);
|
|
414
|
-
__decorate([
|
|
415
|
-
ContentChildren(SkyTabComponent)
|
|
416
|
-
], SkyTabsetComponent.prototype, "tabs", void 0);
|
|
417
|
-
SkyTabsetComponent = __decorate([
|
|
418
|
-
Component({
|
|
419
|
-
selector: 'sky-tabset',
|
|
420
|
-
template: "<div\n class=\"sky-tabset\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\"\n (window:resize)=\"onWindowResize()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\"\n buttonType=\"tab\"\n >\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item *ngFor=\"let tabButton of tabButtons\"\n class=\"sky-tab-dropdown-menu-item\"\n >\n <div\n class=\"sky-tab-dropdown-item\"\n [ngClass]=\"{\n 'sky-tab-dropdown-item-selected': tabButton.active\n }\"\n >\n <ng-container *ngTemplateOutlet=\"tabButtonTemplate; context: {\n $implicit: tabButton\n }\"></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span\n class=\"sky-tabset-tabs\"\n >\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container *ngTemplateOutlet=\"tabButtonTemplate; context: {\n $implicit: tabButton\n }\"></ng-container>\n </ng-container>\n </span>\n <span\n class=\"sky-tabset-btns\"\n >\n <button *ngIf=\"newTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-new sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_add' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onNewTabClick()\"\n >\n <sky-icon\n icon=\"plus-circle\"\n size=\"lg\"\n >\n </sky-icon>\n </button>\n <button *ngIf=\"openTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-open sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_open' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onOpenTabClick()\"\n >\n <sky-icon\n icon=\"folder-open-o\"\n size=\"lg\"\n >\n </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template\n let-tabButton\n #tabButtonTemplate\n>\n <sky-tab-button\n [active]=\"tabButton.active\"\n [ariaControls]=\"tabButton.ariaControls\"\n [buttonHref]=\"tabButton.buttonHref\"\n [buttonId]=\"tabButton.buttonId\"\n [buttonText]=\"tabButton.buttonText\"\n [buttonTextCount]=\"tabButton.buttonTextCount\"\n [closeable]=\"tabButton.closeable\"\n [disabled]=\"tabButton.disabled\"\n [tabStyle]=\"tabStyle\"\n (buttonClick)=\"onTabButtonClick(tabButton)\"\n (closeClick)=\"onTabCloseClick(tabButton)\"\n ></sky-tab-button>\n</ng-template>\n",
|
|
421
|
-
providers: [
|
|
422
|
-
SkyTabsetAdapterService,
|
|
423
|
-
SkyTabsetPermalinkService,
|
|
424
|
-
SkyTabsetService
|
|
425
|
-
],
|
|
426
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
427
|
-
encapsulation: ViewEncapsulation.None,
|
|
428
|
-
styles: [".sky-tabset{align-items:center;border-bottom:2px solid #0974a1;display:flex;list-style-type:none;margin:0;overflow:hidden;padding:0 0 0 15px;white-space:nowrap}.sky-tabset.sky-tabset-style-wizard{border-bottom:none;padding-bottom:10px;padding-left:0}.sky-tabset-btns{order:1;padding-left:10px}.sky-tabset-dropdown{order:0;max-width:100%}.sky-tabset-mode-dropdown{line-height:0}.sky-tabset-mode-dropdown .sky-tabset-tabs{visibility:hidden;order:2}.sky-tab-dropdown-menu-item sky-tab-button{display:flex;min-width:300px}.sky-tab-dropdown-menu-item .sky-dropdown-item{margin:0}.sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{width:100%;margin-right:0}.sky-tab-dropdown-menu-item .sky-btn-tab{margin:0;border-radius:0;width:100%;display:flex}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-tab-heading{flex:1 1 auto}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-btn-tab-close{flex:0 1 auto}.sky-tabset-tabs{order:0;white-space:nowrap}.sky-tabset-btn-new,.sky-tabset-btn-open{color:#0974a1}.sky-theme-modern .sky-tabset{border-bottom:1px solid #d2d2d2;overflow:visible}.sky-theme-modern .sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{margin-right:0}"]
|
|
429
|
-
})
|
|
430
|
-
], SkyTabsetComponent);
|
|
431
|
-
return SkyTabsetComponent;
|
|
432
|
-
}());
|
|
433
|
-
export { SkyTabsetComponent };
|
|
434
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC90YWJzLyIsInNvdXJjZXMiOlsibW9kdWxlcy90YWJzL3RhYnNldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsYUFBYSxFQUNiLElBQUksRUFDSixPQUFPLEVBQ1IsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVixNQUFNLGdCQUFnQixDQUFDO0FBVXhCLE9BQU8sRUFDTCxlQUFlLEVBQ2hCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLHVCQUF1QixFQUN4QixNQUFNLDBCQUEwQixDQUFDO0FBTWxDLE9BQU8sRUFDTCx5QkFBeUIsRUFDMUIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFpQzFCO0lBK0pFLDRCQUNVLGNBQWlDLEVBQ2pDLFVBQXNCLEVBQ3RCLGNBQXVDLEVBQ3ZDLGdCQUEyQyxFQUMzQyxhQUErQjtRQUovQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7UUFDdkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEyQjtRQUMzQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFqRXpDOztXQUVHO1FBRUksaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRXREOzs7V0FHRztRQUVJLFdBQU0sR0FBRyxJQUFJ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ZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICBjb21iaW5lTGF0ZXN0LFxuICByYWNlLFxuICBTdWJqZWN0XG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgdGFrZVVudGlsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgU2t5VGFiSW5kZXhcbn0gZnJvbSAnLi90YWItaW5kZXgnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRTdHlsZVxufSBmcm9tICcuL3RhYnNldC1zdHlsZSc7XG5cbmltcG9ydCB7XG4gIFNreVRhYkNvbXBvbmVudFxufSBmcm9tICcuL3RhYi5jb21wb25lbnQnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRBZGFwdGVyU2VydmljZVxufSBmcm9tICcuL3RhYnNldC1hZGFwdGVyLnNlcnZpY2UnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGVcbn0gZnJvbSAnLi90YWJzZXQtYnV0dG9ucy1kaXNwbGF5LW1vZGUnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRQZXJtYWxpbmtTZXJ2aWNlXG59IGZyb20gJy4vdGFic2V0LXBlcm1hbGluay5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgU2t5VGFic2V0U2VydmljZVxufSBmcm9tICcuL3RhYnNldC5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgU2t5VGFic2V0VGFiSW5kZXhlc0NoYW5nZVxufSBmcm9tICcuL3RhYnNldC10YWItaW5kZXhlcy1jaGFuZ2UnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgVGFiQnV0dG9uVmlld01vZGVsIHtcbiAgYWN0aXZlOiBib29sZWFuO1xuICBhcmlhQ29udHJvbHM6IHN0cmluZztcbiAgYnV0dG9uSHJlZjogc3RyaW5nO1xuICBidXR0b25JZDogc3RyaW5nO1xuICBidXR0b25UZXh0OiBzdHJpbmc7XG4gIGJ1dHRvblRleHRDb3VudDogc3RyaW5nO1xuICBjbG9zZWFibGU6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICB0YWJJbmRleDogU2t5VGFiSW5kZXg7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS10YWJzZXQnLFxuICBzdHlsZVVybHM6IFsnLi90YWJzZXQuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnNldC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlLFxuICAgIFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UsXG4gICAgU2t5VGFic2V0U2VydmljZVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTa3lUYWJzZXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZXMgYSB0YWIgYnkgaXRzIGB0YWJJbmRleGAgcHJvcGVydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFjdGl2ZSh2YWx1ZTogU2t5VGFiSW5kZXgpIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHZhbHVlLCB0aGlzLl9hY3RpdmUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPbiBpbml0LCB3YWl0IGZvciBjaGlsZHJlbiB0YWJzIHRvIHJlbmRlciBiZWZvcmUgYnJvYWRjYXN0aW5nIHRoZSBhY3RpdmUgdGFiIGluZGV4LlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRhYnNldFNlcnZpY2UuaXNWYWxpZFRhYkluZGV4KHZhbHVlKSkge1xuICAgICAgICAgIC8vIE9uIGluaXQsIHlpZWxkIHRvIHRoZSBwZXJtYWxpbmsgSUQsIGlmIGl0IGV4aXN0cy5cbiAgICAgICAgICBpZiAodGhpcy5nZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgZmlyc3QgdGFiIGlmIHRoZSBuZXcgdGFiIGluZGV4IGlzIGludmFsaWQuXG4gICAgICAgICAgdGhpcy5fYWN0aXZlID0gdGhpcy50YWJzZXRTZXJ2aWNlLmFjdGl2YXRlRmlyc3RUYWIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogU2t5VGFiSW5kZXgge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuIEFSSUEgbGFiZWwgZm9yIHRoZSB0YWJzZXQuIFRoaXMgc2V0cyB0aGUgdGFic2V0J3MgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBJZiB0aGUgdGFic2V0IGluY2x1ZGVzIGEgdmlzaWJsZSBsYWJlbCwgdXNlIGBhcmlhTGFiZWxsZWRCeWAgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBIVE1MIGVsZW1lbnQgSUQgKHdpdGhvdXQgdGhlIGxlYWRpbmcgYCNgKSBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgdGFic2V0LiBUaGlzIHNldHMgdGhlIHRhYnNldCdzIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBJZiB0aGUgdGFic2V0IGRvZXMgbm90IGluY2x1ZGUgYSB2aXNpYmxlIGxhYmVsLCB1c2UgYGFyaWFMYWJlbGAgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXN0aW5ndWlzaGVzIGEgdGFic2V0J3MgdW5pcXVlIHN0YXRlIGluIHRoZSBVUkwgYnkgZ2VuZXJhdGluZyBhIHF1ZXJ5IHBhcmFtZXRlclxuICAgKiB0aGF0IGlzIHdyaXR0ZW4gYXMgYD88cXVlcnlQYXJhbT4tYWN0aXZlLXRhYj08c2FuaXRpemVkLXRhYi1oZWFkaW5nPmAuXG4gICAqIFRoZSBxdWVyeSBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBwYXJzZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBzZWxlY3RlZCB0YWIncyBoZWFkaW5nIHRleHQsXG4gICAqIGJ1dCB5b3UgY2FuIHN1cHBseSBhIGN1c3RvbSBxdWVyeSBwYXJhbWV0ZXIgdmFsdWUgZm9yIGVhY2ggdGFiIHdpdGggaXRzIGBwZXJtYWxpbmtWYWx1ZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHBlcm1hbGlua0lkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLnVybGlmeSh2YWx1ZSk7XG4gICAgdGhpcy5fcGVybWFsaW5rSWQgPSBgJHtzYW5pdGl6ZWR9LWFjdGl2ZS10YWJgO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJtYWxpbmtJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wZXJtYWxpbmtJZCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGJlaGF2aW9yIGZvciBhIHNlcmllcyBvZiB0YWJzLlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgcHJvcGVydHkgd2FzIGRlc2lnbmVkIHRvIGNyZWF0ZSB3aXphcmRzIGJ5IHNldHRpbmcgdGFiU3R5bGU9XCJ3aXphcmRcIiBvbiB0YWJzZXRzIGluIG1vZGFscyxcbiAgICogYnV0IHRoaXMgd2l6YXJkIGltcGxlbWVudGF0aW9uIHdhcyByZXBsYWNlZCBieSB0aGVcbiAgICogW3Byb2dyZXNzIGluZGljYXRvciBjb21wb25lbnRdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9wcm9ncmVzcy1pbmRpY2F0b3IpLlxuICAgKiBAZGVmYXVsdCAndGFicydcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdGFiU3R5bGUodmFsdWU6IFNreVRhYnNldFN0eWxlKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZWxzZSovXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd3aXphcmQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdUaGUgdGFic2V0IHdpemFyZCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgaW1wbGVtZW50IHRoZSBuZXcgYXBwcm9hY2ggdXNpbmcgJyArXG4gICAgICAgICdwcm9ncmVzcyBpbmRpY2F0b3IgYXMgZG9jdW1lbnRlZCBoZXJlOiBodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvd2l6YXJkLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fdGFiU3R5bGUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFiU3R5bGUoKTogU2t5VGFic2V0U3R5bGUge1xuICAgIHJldHVybiB0aGlzLl90YWJTdHlsZSB8fCAndGFicyc7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYWN0aXZlIHRhYiBjaGFuZ2VzLiBUaGlzIGV2ZW50IGVtaXRzIHRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIHRhYi5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgYWN0aXZlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lUYWJJbmRleD4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjbGljayB0aGUgYnV0dG9uIHRvIGFkZCBhIG5ldyB0YWIuXG4gICAqIFRoZSBuZXcgdGFiIGJ1dHRvbiBpcyBhZGRlZCB0byB0aGUgdGFiIGFyZWEgd2hlbiB5b3Ugc3BlY2lmeSBhIGxpc3RlbmVyIGZvciB0aGlzIGV2ZW50LlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBuZXdUYWIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgY2xpY2sgdGhlIGJ1dHRvbiB0byBvcGVuIGEgdGFiLlxuICAgKiBUaGUgb3BlbiB0YWIgYnV0dG9uIGlzIGFkZGVkIHRvIHRoZSB0YWIgYXJlYSB3aGVuIHlvdSBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG9wZW5UYWIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gYW55IHRhYidzIGB0YWJJbmRleGAgdmFsdWUgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdGFiSW5kZXhlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5VGFic2V0VGFiSW5kZXhlc0NoYW5nZT4oKTtcblxuICBwdWJsaWMgc2V0IHRhYkRpc3BsYXlNb2RlKHZhbHVlOiBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGUpIHtcbiAgICB0aGlzLl90YWJEaXNwbGF5TW9kZSA9IHZhbHVlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYkRpc3BsYXlNb2RlKCk6IFNreVRhYnNldEJ1dHRvbnNEaXNwbGF5TW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkRpc3BsYXlNb2RlIHx8ICd0YWJzJztcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5VGFiQ29tcG9uZW50KVxuICBwdWJsaWMgdGFiczogUXVlcnlMaXN0PFNreVRhYkNvbXBvbmVudD47XG5cbiAgcHVibGljIGRyb3Bkb3duVHJpZ2dlckJ1dHRvblRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IHRoZSBkZXByZWNhdGVkIHRhYnNldC1uYXYtYnV0dG9uIGNvbXBvbmVudC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbGFzdEFjdGl2ZVRhYkluZGV4OiBTa3lUYWJJbmRleDtcblxuICBwdWJsaWMgdGFiQnV0dG9uczogVGFiQnV0dG9uVmlld01vZGVsW10gPSBbXTtcblxuICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgdGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX2FjdGl2ZTogU2t5VGFiSW5kZXg7XG5cbiAgcHJpdmF0ZSBfcGVybWFsaW5rSWQ6IHN0cmluZztcblxuICBwcml2YXRlIF90YWJEaXNwbGF5TW9kZTogU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlO1xuXG4gIHByaXZhdGUgX3RhYlN0eWxlOiBTa3lUYWJzZXRTdHlsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBhZGFwdGVyU2VydmljZTogU2t5VGFic2V0QWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtYWxpbmtTZXJ2aWNlOiBTa3lUYWJzZXRQZXJtYWxpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGFic2V0U2VydmljZTogU2t5VGFic2V0U2VydmljZVxuICApIHsgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmluaXRUYWJDb21wb25lbnRzKCk7XG4gICAgdGhpcy5saXN0ZW5UYWJDb21wb25lbnRzU3RydWN0dXJhbENoYW5nZSgpO1xuXG4gICAgY29uc3QgaW5pdGlhbFRhYkluZGV4ID0gdGhpcy5nZXRJbml0aWFsVGFiSW5kZXgoKTtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgoaW5pdGlhbFRhYkluZGV4KTtcblxuICAgIHRoaXMubGlzdGVuVGFiQnV0dG9uc092ZXJmbG93Q2hhbmdlKCk7XG4gICAgdGhpcy5saXN0ZW5Mb2NhdGlvblBvcFN0YXRlQ2hhbmdlKCk7XG5cbiAgICAvLyBJZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWIgaXMgZ2V0dGluZyB1bnJlZ2lzdGVyZWQsIGFjdGl2YXRlIHRoZSBuZXh0IG9uZS5cbiAgICB0aGlzLnRhYnNldFNlcnZpY2UuYWN0aXZlVGFiVW5yZWdpc3RlcmVkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUodGFiID0+IHtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5ldyB0YWJzIHRvIHJlbmRlciBiZWZvcmUgYWN0aXZhdGluZy5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLmFjdGl2YXRlTmVhcmVzdFRhYih0YWIuYXJyYXlJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAvLyBMZXQgdGhlIHRhYnNldCByZW5kZXIgdGhlIGluaXRpYWwgYWN0aXZlIGluZGV4IGJlZm9yZSBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxpc3RlblRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpO1xuICAgICAgdGhpcy5saXN0ZW5BY3RpdmVJbmRleENoYW5nZSgpO1xuICAgICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmluaXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVUYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgICB0aGlzLnBlcm1hbGlua1NlcnZpY2UuY2xlYXJQYXJhbSh0aGlzLnBlcm1hbGlua0lkKTtcbiAgfVxuXG4gIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmRldGVjdE92ZXJmbG93KCk7XG4gIH1cblxuICBwdWJsaWMgb25UYWJDbG9zZUNsaWNrKHRhYkJ1dHRvbjogVGFiQnV0dG9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgdGFiQ29tcG9uZW50ID0gdGhpcy50YWJzLmZpbmQodGFiID0+XG4gICAgICB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgdGFiQnV0dG9uLnRhYkluZGV4KVxuICAgICk7XG5cbiAgICB0YWJDb21wb25lbnQuY2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG9uVGFiQnV0dG9uQ2xpY2sodGFiQnV0dG9uOiBUYWJCdXR0b25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodGFiQnV0dG9uLnRhYkluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBvbk5ld1RhYkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMubmV3VGFiLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk9wZW5UYWJDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5UYWIuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGluaXRpYWwgYWN0aXZlIHRhYiBpbmRleCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhLlxuICAgKiAxLiBEb2VzIHRoZSBVUkwgaW5jbHVkZSBhIHF1ZXJ5IHBhcmFtIHRoYXQgcmVmbGVjdHMgdGhpcyB0YWJzZXQncyBhY3RpdmUgdGFiP1xuICAgKiAyLiBEb2VzIG9uZSBvZiB0aGUgdGFiIGNvbXBvbmVudHMgaGF2ZSB0aGVpciBgYWN0aXZlYCBwcm9wZXJ0eSBzZXQgdG8gYHRydWVgP1xuICAgKiAzLiBJcyB0aGUgdGFic2V0IGNvbXBvbmVudCdzIGBhY3RpdmVgIHByb3BlcnR5IHNldCB0byBhIHNwZWNpZmljIHRhYiBpbmRleD9cbiAgICovXG4gIHByaXZhdGUgZ2V0SW5pdGlhbFRhYkluZGV4KCk6IFNreVRhYkluZGV4IHtcbiAgICBsZXQgYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGl2ZUluZGV4ID0gdGhpcy5hY3RpdmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5BY3RpdmVJbmRleENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UuYWN0aXZlVGFiSW5kZXhcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShhY3RpdmVJbmRleCA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlVGFic2V0Q29tcG9uZW50KGFjdGl2ZUluZGV4KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5UYWJDb21wb25lbnRzU3RydWN0dXJhbENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnMuY2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldFRhYkNvbXBvbmVudHMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKHRhYiA9PiB0YWIuYWN0aXZlQ2hhbmdlKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbChyYWNlKHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUsIHRoaXMubmdVbnN1YnNjcmliZSkpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0YWIgY29tcG9uZW50cyB0byByZW5kZXIgY2hhbmdlcyBiZWZvcmUgZmluZGluZyB0aGUgYWN0aXZlIG9uZS5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFiSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICAgICAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodGFiSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKHRhYiA9PiB0YWIudGFiSW5kZXhDaGFuZ2UpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHJhY2UodGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSwgdGhpcy5uZ1Vuc3Vic2NyaWJlKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgZW1pdCB0aGUgZmlyc3QgY2hhbmdlLlxuICAgICAgICBpZiAodGhpcy5sYXN0QWN0aXZlVGFiSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0YWIgY29tcG9uZW50cyB0byByZW5kZXIgY2hhbmdlcyBiZWZvcmUgdXBkYXRpbmcgdGhlIHZpZXcuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudCh0aGlzLnRhYnNldFNlcnZpY2UuY3VycmVudEFjdGl2ZVRhYkluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFRhYkluZGV4Q2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKHRhYiA9PiB0YWIuc3RhdGVDaGFuZ2UpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHJhY2UodGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSwgdGhpcy5uZ1Vuc3Vic2NyaWJlKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRhYiBjb21wb25lbnRzIHRvIHJlbmRlciBjaGFuZ2VzIGJlZm9yZSBmaW5kaW5nIHRoZSBhY3RpdmUgb25lLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudCh0aGlzLnRhYnNldFNlcnZpY2UuY3VycmVudEFjdGl2ZVRhYkluZGV4LCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRhYkNvbXBvbmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy50YWJzLmZvckVhY2godGFiID0+IHRhYi5pbml0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhYkNvbXBvbmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZVRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpO1xuICAgIHRoaXMudGFic2V0U2VydmljZS51bnJlZ2lzdGVyQWxsKCk7XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdGFiIGNvbXBvbmVudHMsIGRvIGEgaGFyZCByZXNldCBvZiB0aGUgdmlldy5cbiAgICBpZiAodGhpcy50YWJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy51cGRhdGVUYWJzZXRDb21wb25lbnQoMCwgdHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbml0VGFiQ29tcG9uZW50cygpO1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJDb21wb25lbnQoKT8udGFiSW5kZXg7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KGFjdGl2ZUluZGV4LCB7XG4gICAgICBlbWl0Q2hhbmdlOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMubGlzdGVuVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRUYWJJbmRleENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkluZGV4ZXNDaGFuZ2UuZW1pdCh7XG4gICAgICB0YWJzOiB0aGlzLnRhYnMubWFwKHRhYiA9PiAoe1xuICAgICAgICB0YWJIZWFkaW5nOiB0YWIudGFiSGVhZGluZyxcbiAgICAgICAgdGFiSW5kZXg6IHRhYi50YWJJbmRleFxuICAgICAgfSkpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuVGFiQnV0dG9uc092ZXJmbG93Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UucmVnaXN0ZXJUYWJzZXQodGhpcy5lbGVtZW50UmVmKTtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLm92ZXJmbG93Q2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoaXNPdmVyZmxvd2luZyA9PiB7XG4gICAgICAgIHRoaXMudGFiRGlzcGxheU1vZGUgPSAoaXNPdmVyZmxvd2luZykgPyAnZHJvcGRvd24nIDogJ3RhYnMnO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBiYWNrL2ZvcndhcmQgaGlzdG9yeSBidXR0b24gcHJlc3NlcyB0byBkZXRlY3QgcXVlcnkgcGFyYW0gY2hhbmdlcyBpbiB0aGUgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXN0ZW5Mb2NhdGlvblBvcFN0YXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMucGVybWFsaW5rU2VydmljZS5wb3BTdGF0ZUNoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpO1xuICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleChhY3RpdmVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpOiBTa3lUYWJJbmRleCB7XG4gICAgaWYgKHRoaXMucGVybWFsaW5rSWQpIHtcbiAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSB0aGlzLnBlcm1hbGlua1NlcnZpY2UuZ2V0UGFyYW0odGhpcy5wZXJtYWxpbmtJZCk7XG4gICAgICBpZiAocGFyYW1WYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJzLmZpbmQodGFiID0+IHRhYi5wZXJtYWxpbmtWYWx1ZSA9PT0gcGFyYW1WYWx1ZSk/LnRhYkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk6IFNreVRhYkNvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMudGFicy50b0FycmF5KCkucmV2ZXJzZSgpLmZpbmQodGFiID0+IHRhYi5hY3RpdmUgPT09IHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUYWJCdXR0b25zKGFjdGl2ZUluZGV4OiBTa3lUYWJJbmRleCk6IFRhYkJ1dHRvblZpZXdNb2RlbFtdIHtcbiAgICByZXR1cm4gdGhpcy50YWJzLm1hcCh0YWIgPT4gKHtcbiAgICAgIGFjdGl2ZTogdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KSxcbiAgICAgIGNsb3NlYWJsZTogdGFiLmNsb3NlYWJsZSxcbiAgICAgIGFyaWFDb250cm9sczogdGFiLnRhYlBhbmVsSWQsXG4gICAgICBkaXNhYmxlZDogdGFiLmRpc2FibGVkLFxuICAgICAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbnVsbC1rZXl3b3JkKi9cbiAgICAgIGJ1dHRvbkhyZWY6ICh0YWIuZGlzYWJsZWQpID8gbnVsbCA6IHRoaXMucGVybWFsaW5rU2VydmljZS5nZXRQYXJhbUhyZWYoXG4gICAgICAgIHRoaXMucGVybWFsaW5rSWQsXG4gICAgICAgIHRhYi5wZXJtYWxpbmtWYWx1ZVxuICAgICAgKSxcbiAgICAgIGJ1dHRvbklkOiB0YWIudGFiQnV0dG9uSWQsXG4gICAgICBidXR0b25UZXh0Q291bnQ6IHRhYi50YWJIZWFkZXJDb3VudCxcbiAgICAgIGJ1dHRvblRleHQ6IHRhYi50YWJIZWFkaW5nLFxuICAgICAgdGFiSW5kZXg6IHRhYi50YWJJbmRleFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFiQnV0dG9ucyhhY3RpdmVJbmRleDogU2t5VGFiSW5kZXgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgYnV0dG9uLmFjdGl2ZSA9IHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwoYnV0dG9uLnRhYkluZGV4LCBhY3RpdmVJbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgVUkgYW5kIHN0YXRlIG9mIHRoZSB0YWJzZXQgY29tcG9uZW50IGFmdGVyIHRoZSB0YWIgaW5kZXggb3JcbiAgICogdGFiIGNvbXBvbmVudHMgaGF2ZSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gYWN0aXZlSW5kZXggVGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiIGluZGV4LlxuICAgKiBAcGFyYW0gcmVnZW5lcmF0ZVRhYkJ1dHRvbnMgSW5kaWNhdGVzIGlmIHRhYiBidXR0b24gdmlldyBtb2RlbHMgc2hvdWxkIGJlIHJlZ2VuZXJhdGVkLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCB3aWxsIHNpbXBseSB1cGRhdGUgdGhlIGV4aXN0aW5nIHRhYiBidXR0b25zLiBTZXR0aW5nIHRoaXMgdmFsdWVcbiAgICogdG8gYHRydWVgIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIHVuZGVybHlpbmcgdGFiIGNvbXBvbmVudHMgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgdGFiXG4gICAqIGJ1dHRvbnMgbXVzdCByZWZsZWN0IHRob3NlIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVRhYnNldENvbXBvbmVudChcbiAgICBhY3RpdmVJbmRleDogU2t5VGFiSW5kZXgsXG4gICAgcmVnZW5lcmF0ZVRhYkJ1dHRvbnMgPSBmYWxzZVxuICApOiB2b2lkIHtcblxuICAgIC8vIEFjdGl2YXRlL2RlYWN0aXZhdGUgdGFiIGNvbXBvbmVudHMuXG4gICAgdGhpcy50YWJzLmZvckVhY2godGFiID0+IHtcbiAgICAgIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCBhY3RpdmVJbmRleClcbiAgICAgICAgPyB0YWIuYWN0aXZhdGUoKVxuICAgICAgICA6IHRhYi5kZWFjdGl2YXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHRhYiBidXR0b24gbW9kZWxzLlxuICAgIGlmIChyZWdlbmVyYXRlVGFiQnV0dG9ucyB8fCAhdGhpcy50YWJCdXR0b25zLmxlbmd0aCkge1xuICAgICAgdGhpcy50YWJCdXR0b25zID0gdGhpcy5jcmVhdGVUYWJCdXR0b25zKGFjdGl2ZUluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVUYWJCdXR0b25zKGFjdGl2ZUluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRyb3Bkb3duIHRyaWdnZXIgYnV0dG9uIHRleHQuXG4gICAgdGhpcy5kcm9wZG93blRyaWdnZXJCdXR0b25UZXh0ID0gdGhpcy50YWJCdXR0b25zLmZpbmQoYiA9PiB7XG4gICAgICByZXR1cm4gdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbChiLnRhYkluZGV4LCBhY3RpdmVJbmRleCk7XG4gICAgfSk/LmJ1dHRvblRleHQ7XG5cbiAgICAvLyBTZXQgdGhlIHF1ZXJ5IHBhcmFtcyBiYXNlZCBvbiBhY3RpdmUgdGFiLlxuICAgIGlmICh0aGlzLnBlcm1hbGlua0lkKSB7XG4gICAgICBjb25zdCBhY3RpdmVUYWJDb21wb25lbnQgPSB0aGlzLnRhYnMuZmluZCh0YWIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLnNldFBhcmFtKHRoaXMucGVybWFsaW5rSWQsIGFjdGl2ZVRhYkNvbXBvbmVudC5wZXJtYWxpbmtWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgdGFiIGJ1dHRvbiB2aWV3IG1vZGVscyB0byByZW5kZXIgYmVmb3JlIGdhdWdpbmcgZGltZW5zaW9ucy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuZGV0ZWN0T3ZlcmZsb3coKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG5cbiAgICAvLyBFbWl0IHRoZSBuZXcgYWN0aXZlIGluZGV4IHZhbHVlIHRvIGNvbnN1bWVycy5cbiAgICBpZiAodGhpcy5sYXN0QWN0aXZlVGFiSW5kZXggIT09IGFjdGl2ZUluZGV4KSB7XG4gICAgICB0aGlzLmxhc3RBY3RpdmVUYWJJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdChhY3RpdmVJbmRleCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
4
|
-
/**
|
|
5
|
-
* @internal
|
|
6
|
-
*/
|
|
7
|
-
var SkyTabsetService = /** @class */ (function () {
|
|
8
|
-
function SkyTabsetService() {
|
|
9
|
-
this.currentActiveTabIndex = 0;
|
|
10
|
-
this._activeTabIndex = new BehaviorSubject(0);
|
|
11
|
-
this._activeTabUnregistered = new Subject();
|
|
12
|
-
this.tabs = [];
|
|
13
|
-
this.tabCounter = 0;
|
|
14
|
-
}
|
|
15
|
-
Object.defineProperty(SkyTabsetService.prototype, "activeTabUnregistered", {
|
|
16
|
-
get: function () {
|
|
17
|
-
return this._activeTabUnregistered.asObservable();
|
|
18
|
-
},
|
|
19
|
-
enumerable: true,
|
|
20
|
-
configurable: true
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(SkyTabsetService.prototype, "activeTabIndex", {
|
|
23
|
-
get: function () {
|
|
24
|
-
return this._activeTabIndex.asObservable();
|
|
25
|
-
},
|
|
26
|
-
enumerable: true,
|
|
27
|
-
configurable: true
|
|
28
|
-
});
|
|
29
|
-
/**
|
|
30
|
-
* Sets the active tab by its unique `tabIndex` property.
|
|
31
|
-
*/
|
|
32
|
-
SkyTabsetService.prototype.setActiveTabIndex = function (value, config) {
|
|
33
|
-
if (config === void 0) { config = {
|
|
34
|
-
emitChange: true
|
|
35
|
-
}; }
|
|
36
|
-
if (value !== undefined &&
|
|
37
|
-
!this.tabIndexesEqual(value, this.currentActiveTabIndex)) {
|
|
38
|
-
this.currentActiveTabIndex = value;
|
|
39
|
-
if (config.emitChange) {
|
|
40
|
-
this._activeTabIndex.next(value);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* Registers a tab component.
|
|
46
|
-
*/
|
|
47
|
-
SkyTabsetService.prototype.registerTab = function (tabIndex) {
|
|
48
|
-
if (tabIndex === undefined) {
|
|
49
|
-
tabIndex = this.tabCounter;
|
|
50
|
-
this.tabCounter++;
|
|
51
|
-
}
|
|
52
|
-
this.tabs.push({ tabIndex: tabIndex });
|
|
53
|
-
return tabIndex;
|
|
54
|
-
};
|
|
55
|
-
SkyTabsetService.prototype.updateTabIndex = function (currentTabIndex, newTabIndex) {
|
|
56
|
-
var _this = this;
|
|
57
|
-
var found = this.tabs.find(function (tab) { return _this.tabIndexesEqual(tab.tabIndex, currentTabIndex); });
|
|
58
|
-
found.tabIndex = newTabIndex;
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* Unregisters a tab component.
|
|
62
|
-
*/
|
|
63
|
-
SkyTabsetService.prototype.unregisterTab = function (tabIndex) {
|
|
64
|
-
var _this = this;
|
|
65
|
-
var index = this.tabs.findIndex(function (tab) { return _this.tabIndexesEqual(tab.tabIndex, tabIndex); });
|
|
66
|
-
// Notify the tabset component when an active tab is unregistered.
|
|
67
|
-
if (this.isTabIndexActive(this.tabs[index].tabIndex)) {
|
|
68
|
-
this._activeTabUnregistered.next({
|
|
69
|
-
arrayIndex: index
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
this.tabs.splice(index, 1);
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* Unregisters all tab components at once.
|
|
76
|
-
*/
|
|
77
|
-
SkyTabsetService.prototype.unregisterAll = function () {
|
|
78
|
-
this.tabs = [];
|
|
79
|
-
};
|
|
80
|
-
/**
|
|
81
|
-
* Compares two tab indexes and returns `true` if they are equal.
|
|
82
|
-
*/
|
|
83
|
-
SkyTabsetService.prototype.tabIndexesEqual = function (tabIndex1, tabIndex2) {
|
|
84
|
-
return (tabIndex1 === tabIndex2 ||
|
|
85
|
-
+tabIndex1 === +tabIndex2);
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* Verifies if a provided tab index is registered.
|
|
89
|
-
*/
|
|
90
|
-
SkyTabsetService.prototype.isValidTabIndex = function (tabIndex) {
|
|
91
|
-
var _this = this;
|
|
92
|
-
return this.tabs.some(function (tab) { return _this.tabIndexesEqual(tab.tabIndex, tabIndex); });
|
|
93
|
-
};
|
|
94
|
-
/**
|
|
95
|
-
* Activates the first registered tab.
|
|
96
|
-
*/
|
|
97
|
-
SkyTabsetService.prototype.activateFirstTab = function () {
|
|
98
|
-
var firstTabIndex = this.tabs[0] && this.tabs[0].tabIndex;
|
|
99
|
-
if (firstTabIndex !== undefined) {
|
|
100
|
-
this.setActiveTabIndex(firstTabIndex);
|
|
101
|
-
return firstTabIndex;
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
/**
|
|
105
|
-
* Activates the next registered tab, or the previous one based on a provided array index.
|
|
106
|
-
*/
|
|
107
|
-
SkyTabsetService.prototype.activateNearestTab = function (arrayIndex) {
|
|
108
|
-
var newActiveTab = this.tabs[arrayIndex] || this.tabs[arrayIndex - 1];
|
|
109
|
-
if (newActiveTab) {
|
|
110
|
-
this.currentActiveTabIndex = newActiveTab.tabIndex;
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
SkyTabsetService.prototype.isTabIndexActive = function (tabIndex) {
|
|
114
|
-
return this.tabIndexesEqual(tabIndex, this.currentActiveTabIndex);
|
|
115
|
-
};
|
|
116
|
-
SkyTabsetService = __decorate([
|
|
117
|
-
Injectable()
|
|
118
|
-
], SkyTabsetService);
|
|
119
|
-
return SkyTabsetService;
|
|
120
|
-
}());
|
|
121
|
-
export { SkyTabsetService };
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2t5dXgvdGFicy8iLCJzb3VyY2VzIjpbIm1vZHVsZXMvdGFicy90YWJzZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFDUixNQUFNLE1BQU0sQ0FBQztBQVVkOztHQUVHO0FBRUg7SUFBQTtRQVVTLDBCQUFxQixHQUFnQixDQUFDLENBQUM7UUFFdEMsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBYyxDQUFDLENBQUMsQ0FBQztRQUV0RCwyQkFBc0IsR0FBRyxJQUFJLE9BQU8sRUFBc0MsQ0FBQztRQUUzRSxTQUFJLEdBRU4sRUFBRSxDQUFDO1FBRUQsZUFBVSxHQUFHLENBQUMsQ0FBQztJQXNHekIsQ0FBQztJQXhIQyxzQkFBVyxtREFBcUI7YUFBaEM7WUFDRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwRCxDQUFDOzs7T0FBQTtJQUVELHNCQUFXLDRDQUFjO2FBQXpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdDLENBQUM7OztPQUFBO0lBY0Q7O09BRUc7SUFDSSw0Q0FBaUIsR0FBeEIsVUFBeUIsS0FBa0IsRUFBRSxNQUU1QztRQUY0Qyx1QkFBQSxFQUFBO1lBQzNDLFVBQVUsRUFBRSxJQUFJO1NBQ2pCO1FBQ0MsSUFDRSxLQUFLLEtBQUssU0FBUztZQUNuQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUN4RDtZQUNBLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkMsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FB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LENBQUMsUUFBUSxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVPLDJDQUFnQixHQUF4QixVQUF5QixRQUFxQjtRQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUF6SFUsZ0JBQWdCO1FBRDVCLFVBQVUsRUFBRTtPQUNBLGdCQUFnQixDQTBINUI7SUFBRCx1QkFBQztDQUFBLEFBMUhELElBMEhDO1NBMUhZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgU2t5VGFiSW5kZXhcbn0gZnJvbSAnLi90YWItaW5kZXgnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRBY3RpdmVUYWJVbnJlZ2lzdGVyZWRBcmdzXG59IGZyb20gJy4vdGFic2V0LWFjdGl2ZS10YWItdW5yZWdpc3RlcmVkLWFyZ3MnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2t5VGFic2V0U2VydmljZSB7XG5cbiAgcHVibGljIGdldCBhY3RpdmVUYWJVbnJlZ2lzdGVyZWQoKTogT2JzZXJ2YWJsZTxTa3lUYWJzZXRBY3RpdmVUYWJVbnJlZ2lzdGVyZWRBcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVRhYlVucmVnaXN0ZXJlZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlVGFiSW5kZXgoKTogT2JzZXJ2YWJsZTxTa3lUYWJJbmRleD4ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVUYWJJbmRleC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjdXJyZW50QWN0aXZlVGFiSW5kZXg6IFNreVRhYkluZGV4ID0gMDtcblxuICBwcml2YXRlIF9hY3RpdmVUYWJJbmRleCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2t5VGFiSW5kZXg+KDApO1xuXG4gIHByaXZhdGUgX2FjdGl2ZVRhYlVucmVnaXN0ZXJlZCA9IG5ldyBTdWJqZWN0PFNreVRhYnNldEFjdGl2ZVRhYlVucmVnaXN0ZXJlZEFyZ3M+KCk7XG5cbiAgcHJpdmF0ZSB0YWJzOiB7XG4gICAgdGFiSW5kZXg6IFNreVRhYkluZGV4O1xuICB9W10gPSBbXTtcblxuICBwcml2YXRlIHRhYkNvdW50ZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgdGFiIGJ5IGl0cyB1bmlxdWUgYHRhYkluZGV4YCBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmVUYWJJbmRleCh2YWx1ZTogU2t5VGFiSW5kZXgsIGNvbmZpZyA9IHtcbiAgICBlbWl0Q2hhbmdlOiB0cnVlXG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhdGhpcy50YWJJbmRleGVzRXF1YWwodmFsdWUsIHRoaXMuY3VycmVudEFjdGl2ZVRhYkluZGV4KVxuICAgICkge1xuICAgICAgdGhpcy5jdXJyZW50QWN0aXZlVGFiSW5kZXggPSB2YWx1ZTtcbiAgICAgIGlmIChjb25maWcuZW1pdENoYW5nZSkge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYWJJbmRleC5uZXh0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdGFiIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRhYih0YWJJbmRleD86IFNreVRhYkluZGV4KTogU2t5VGFiSW5kZXgge1xuICAgIGlmICh0YWJJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWJJbmRleCA9IHRoaXMudGFiQ291bnRlcjtcbiAgICAgIHRoaXMudGFiQ291bnRlcisrO1xuICAgIH1cblxuICAgIHRoaXMudGFicy5wdXNoKHsgdGFiSW5kZXggfSk7XG5cbiAgICByZXR1cm4gdGFiSW5kZXg7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlVGFiSW5kZXgoY3VycmVudFRhYkluZGV4OiBTa3lUYWJJbmRleCwgbmV3VGFiSW5kZXg6IFNreVRhYkluZGV4KTogdm9pZCB7XG4gICAgY29uc3QgZm91bmQgPSB0aGlzLnRhYnMuZmluZCh0YWIgPT4gdGhpcy50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCBjdXJyZW50VGFiSW5kZXgpKTtcbiAgICBmb3VuZC50YWJJbmRleCA9IG5ld1RhYkluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdGFiIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVGFiKHRhYkluZGV4OiBTa3lUYWJJbmRleCk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50YWJzLmZpbmRJbmRleCh0YWIgPT4gdGhpcy50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCB0YWJJbmRleCkpO1xuXG4gICAgLy8gTm90aWZ5IHRoZSB0YWJzZXQgY29tcG9uZW50IHdoZW4gYW4gYWN0aXZlIHRhYiBpcyB1bnJlZ2lzdGVyZWQuXG4gICAgaWYgKHRoaXMuaXNUYWJJbmRleEFjdGl2ZSh0aGlzLnRhYnNbaW5kZXhdLnRhYkluZGV4KSkge1xuICAgICAgdGhpcy5fYWN0aXZlVGFiVW5yZWdpc3RlcmVkLm5leHQoe1xuICAgICAgICBhcnJheUluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy50YWJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYWxsIHRhYiBjb21wb25lbnRzIGF0IG9uY2UuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlckFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlcyB0d28gdGFiIGluZGV4ZXMgYW5kIHJldHVybnMgYHRydWVgIGlmIHRoZXkgYXJlIGVxdWFsLlxuICAgKi9cbiAgcHVibGljIHRhYkluZGV4ZXNFcXVhbCh0YWJJbmRleDE6IFNreVRhYkluZGV4LCB0YWJJbmRleDI6IFNreVRhYkluZGV4KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRhYkluZGV4MSA9PT0gdGFiSW5kZXgyIHx8XG4gICAgICArdGFiSW5kZXgxID09PSArdGFiSW5kZXgyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhIHByb3ZpZGVkIHRhYiBpbmRleCBpcyByZWdpc3RlcmVkLlxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRUYWJJbmRleCh0YWJJbmRleDogU2t5VGFiSW5kZXgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJzLnNvbWUodGFiID0+IHRoaXMudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgdGFiSW5kZXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZXMgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgdGFiLlxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlRmlyc3RUYWIoKTogU2t5VGFiSW5kZXggfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpcnN0VGFiSW5kZXggPSB0aGlzLnRhYnNbMF0gJiYgdGhpcy50YWJzWzBdLnRhYkluZGV4O1xuICAgIGlmIChmaXJzdFRhYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlVGFiSW5kZXgoZmlyc3RUYWJJbmRleCk7XG4gICAgICByZXR1cm4gZmlyc3RUYWJJbmRleDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGVzIHRoZSBuZXh0IHJlZ2lzdGVyZWQgdGFiLCBvciB0aGUgcHJldmlvdXMgb25lIGJhc2VkIG9uIGEgcHJvdmlkZWQgYXJyYXkgaW5kZXguXG4gICAqL1xuICBwdWJsaWMgYWN0aXZhdGVOZWFyZXN0VGFiKGFycmF5SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5ld0FjdGl2ZVRhYiA9IHRoaXMudGFic1thcnJheUluZGV4XSB8fCB0aGlzLnRhYnNbYXJyYXlJbmRleCAtIDFdO1xuICAgIGlmIChuZXdBY3RpdmVUYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudEFjdGl2ZVRhYkluZGV4ID0gbmV3QWN0aXZlVGFiLnRhYkluZGV4O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNUYWJJbmRleEFjdGl2ZSh0YWJJbmRleDogU2t5VGFiSW5kZXgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJJbmRleGVzRXF1YWwodGFiSW5kZXgsIHRoaXMuY3VycmVudEFjdGl2ZVRhYkluZGV4KTtcbiAgfVxufVxuIl19
|