@skyux/tabs 5.7.2 → 6.0.0-beta.2
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/esm2020/index.mjs +23 -0
- package/esm2020/lib/modules/sectioned-form/sectioned-form-section.component.mjs +62 -0
- package/esm2020/lib/modules/sectioned-form/sectioned-form.component.mjs +109 -0
- package/esm2020/lib/modules/sectioned-form/sectioned-form.module.mjs +35 -0
- package/esm2020/lib/modules/sectioned-form/sectioned-form.service.mjs +35 -0
- package/esm2020/lib/modules/shared/sky-tabs-resources.module.mjs +52 -0
- package/esm2020/lib/modules/tabs/tab-button.component.mjs +70 -0
- package/esm2020/lib/modules/tabs/tab-index.mjs +2 -0
- package/esm2020/lib/modules/tabs/tab.component.mjs +131 -0
- package/esm2020/lib/modules/tabs/tabs.module.mjs +57 -0
- package/esm2020/lib/modules/tabs/tabset-active-tab-unregistered-args.mjs +2 -0
- package/esm2020/lib/modules/tabs/tabset-adapter.service.mjs +56 -0
- package/esm2020/lib/modules/tabs/tabset-buttons-display-mode.mjs +2 -0
- package/esm2020/lib/modules/tabs/tabset-nav-button.component.mjs +116 -0
- package/esm2020/lib/modules/tabs/tabset-permalink.service.mjs +126 -0
- package/esm2020/lib/modules/tabs/tabset-style.mjs +2 -0
- package/esm2020/lib/modules/tabs/tabset-tab-indexes-change.mjs +2 -0
- package/esm2020/lib/modules/tabs/tabset.component.mjs +396 -0
- package/esm2020/lib/modules/tabs/tabset.service.mjs +110 -0
- package/esm2020/lib/modules/vertical-tabset/vertical-tab-media-query.service.mjs +72 -0
- package/esm2020/lib/modules/vertical-tabset/vertical-tab.component.mjs +197 -0
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset-adapter.service.mjs +48 -0
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset-group.component.mjs +83 -0
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset.component.mjs +150 -0
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset.module.mjs +60 -0
- package/esm2020/lib/modules/vertical-tabset/vertical-tabset.service.mjs +168 -0
- package/esm2020/skyux-tabs.mjs +5 -0
- package/esm2020/testing/public-api.mjs +3 -0
- package/esm2020/testing/skyux-tabs-testing.mjs +5 -0
- package/esm2020/testing/tabs/tab-fixture-tab.mjs +2 -0
- package/esm2020/testing/tabs/tabset-fixture.mjs +130 -0
- package/fesm2015/{skyux-tabs-testing.js → skyux-tabs-testing.mjs} +1 -1
- package/fesm2015/skyux-tabs-testing.mjs.map +1 -0
- package/fesm2015/{skyux-tabs.js → skyux-tabs.mjs} +184 -235
- package/fesm2015/skyux-tabs.mjs.map +1 -0
- package/{esm2015/testing/tabs/tabset-fixture.js → fesm2020/skyux-tabs-testing.mjs} +39 -43
- package/fesm2020/skyux-tabs-testing.mjs.map +1 -0
- package/fesm2020/skyux-tabs.mjs +2005 -0
- package/fesm2020/skyux-tabs.mjs.map +1 -0
- package/package.json +44 -20
- package/testing/package.json +5 -5
- package/bundles/skyux-tabs-testing.umd.js +0 -498
- package/bundles/skyux-tabs.umd.js +0 -2260
- package/esm2015/index.js +0 -23
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js +0 -67
- package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js.map +0 -1
- package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js +0 -116
- package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js.map +0 -1
- package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js +0 -35
- package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js.map +0 -1
- package/esm2015/lib/modules/sectioned-form/sectioned-form.service.js +0 -35
- package/esm2015/lib/modules/sectioned-form/sectioned-form.service.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-tabs-resources.module.js +0 -52
- package/esm2015/lib/modules/shared/sky-tabs-resources.module.js.map +0 -1
- package/esm2015/lib/modules/tabs/tab-button.component.js +0 -76
- package/esm2015/lib/modules/tabs/tab-button.component.js.map +0 -1
- package/esm2015/lib/modules/tabs/tab-index.js +0 -2
- package/esm2015/lib/modules/tabs/tab-index.js.map +0 -1
- package/esm2015/lib/modules/tabs/tab.component.js +0 -135
- package/esm2015/lib/modules/tabs/tab.component.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabs.module.js +0 -57
- package/esm2015/lib/modules/tabs/tabs.module.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset-active-tab-unregistered-args.js +0 -2
- package/esm2015/lib/modules/tabs/tabset-active-tab-unregistered-args.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset-adapter.service.js +0 -56
- package/esm2015/lib/modules/tabs/tabset-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset-buttons-display-mode.js +0 -2
- package/esm2015/lib/modules/tabs/tabset-buttons-display-mode.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset-nav-button.component.js +0 -119
- package/esm2015/lib/modules/tabs/tabset-nav-button.component.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset-permalink.service.js +0 -126
- package/esm2015/lib/modules/tabs/tabset-permalink.service.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset-style.js +0 -2
- package/esm2015/lib/modules/tabs/tabset-style.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset-tab-indexes-change.js +0 -2
- package/esm2015/lib/modules/tabs/tabset-tab-indexes-change.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset.component.js +0 -407
- package/esm2015/lib/modules/tabs/tabset.component.js.map +0 -1
- package/esm2015/lib/modules/tabs/tabset.service.js +0 -110
- package/esm2015/lib/modules/tabs/tabset.service.js.map +0 -1
- package/esm2015/lib/modules/vertical-tabset/vertical-tab-media-query.service.js +0 -72
- package/esm2015/lib/modules/vertical-tabset/vertical-tab-media-query.service.js.map +0 -1
- package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js +0 -203
- package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js.map +0 -1
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset-adapter.service.js +0 -48
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js +0 -89
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js.map +0 -1
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js +0 -157
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js.map +0 -1
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js +0 -60
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js.map +0 -1
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js +0 -170
- package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js.map +0 -1
- package/esm2015/skyux-tabs.js +0 -5
- package/esm2015/skyux-tabs.js.map +0 -1
- package/esm2015/testing/public-api.js +0 -3
- package/esm2015/testing/public-api.js.map +0 -1
- package/esm2015/testing/skyux-tabs-testing.js +0 -5
- package/esm2015/testing/skyux-tabs-testing.js.map +0 -1
- package/esm2015/testing/tabs/tab-fixture-tab.js +0 -2
- package/esm2015/testing/tabs/tab-fixture-tab.js.map +0 -1
- package/esm2015/testing/tabs/tabset-fixture.js.map +0 -1
- package/fesm2015/skyux-tabs-testing.js.map +0 -1
- package/fesm2015/skyux-tabs.js.map +0 -1
|
@@ -1,407 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, QueryList, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import { Subject, combineLatest, race } from 'rxjs';
|
|
3
|
-
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { SkyTabComponent } from './tab.component';
|
|
5
|
-
import { SkyTabsetAdapterService } from './tabset-adapter.service';
|
|
6
|
-
import { SkyTabsetPermalinkService } from './tabset-permalink.service';
|
|
7
|
-
import { SkyTabsetService } from './tabset.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "./tabset-adapter.service";
|
|
10
|
-
import * as i2 from "./tabset-permalink.service";
|
|
11
|
-
import * as i3 from "./tabset.service";
|
|
12
|
-
import * as i4 from "@skyux/popovers";
|
|
13
|
-
import * as i5 from "@skyux/indicators";
|
|
14
|
-
import * as i6 from "./tab-button.component";
|
|
15
|
-
import * as i7 from "@angular/common";
|
|
16
|
-
import * as i8 from "@skyux/theme";
|
|
17
|
-
import * as i9 from "@skyux/i18n";
|
|
18
|
-
export class SkyTabsetComponent {
|
|
19
|
-
constructor(changeDetector, elementRef, adapterService, permalinkService, tabsetService) {
|
|
20
|
-
this.changeDetector = changeDetector;
|
|
21
|
-
this.elementRef = elementRef;
|
|
22
|
-
this.adapterService = adapterService;
|
|
23
|
-
this.permalinkService = permalinkService;
|
|
24
|
-
this.tabsetService = tabsetService;
|
|
25
|
-
/**
|
|
26
|
-
* Fires when the active tab changes. This event emits the index of the active tab.
|
|
27
|
-
*/
|
|
28
|
-
this.activeChange = new EventEmitter();
|
|
29
|
-
/**
|
|
30
|
-
* Fires when users click the button to add a new tab.
|
|
31
|
-
* The new tab button is added to the tab area when you specify a listener for this event.
|
|
32
|
-
*/
|
|
33
|
-
this.newTab = new EventEmitter();
|
|
34
|
-
/**
|
|
35
|
-
* Fires when users click the button to open a tab.
|
|
36
|
-
* The open tab button is added to the tab area when you specify a listener for this event.
|
|
37
|
-
*/
|
|
38
|
-
this.openTab = new EventEmitter();
|
|
39
|
-
/**
|
|
40
|
-
* Fires when any tab's `tabIndex` value changes.
|
|
41
|
-
*/
|
|
42
|
-
this.tabIndexesChange = new EventEmitter();
|
|
43
|
-
this.tabButtons = [];
|
|
44
|
-
this.ngUnsubscribe = new Subject();
|
|
45
|
-
this.tabComponentsStateChangeUnsubscribe = new Subject();
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Activates a tab by its `tabIndex` property.
|
|
49
|
-
*/
|
|
50
|
-
set active(value) {
|
|
51
|
-
if (value === undefined ||
|
|
52
|
-
this.tabsetService.tabIndexesEqual(value, this._active)) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
this._active = value;
|
|
56
|
-
if (this.tabs) {
|
|
57
|
-
this.tabsetService.setActiveTabIndex(value);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
// On init, wait for children tabs to render before broadcasting the active tab index.
|
|
61
|
-
setTimeout(() => {
|
|
62
|
-
if (this.tabsetService.isValidTabIndex(value)) {
|
|
63
|
-
// On init, yield to the permalink ID, if it exists.
|
|
64
|
-
if (this.getActiveTabIndexByPermalinkId() === undefined) {
|
|
65
|
-
this.tabsetService.setActiveTabIndex(value);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
// Activate the first tab if the new tab index is invalid.
|
|
70
|
-
this._active = this.tabsetService.activateFirstTab();
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
get active() {
|
|
76
|
-
return this._active;
|
|
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 permalinkId(value) {
|
|
85
|
-
if (!value) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const sanitized = this.permalinkService.urlify(value);
|
|
89
|
-
this._permalinkId = `${sanitized}-active-tab`;
|
|
90
|
-
}
|
|
91
|
-
get permalinkId() {
|
|
92
|
-
return this._permalinkId || '';
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Specifies the behavior for a series of tabs.
|
|
96
|
-
* @deprecated The property was designed to create wizards by setting tabStyle="wizard" on tabsets in modals,
|
|
97
|
-
* but this wizard implementation was replaced by the
|
|
98
|
-
* [progress indicator component](https://developer.blackbaud.com/skyux/components/progress-indicator).
|
|
99
|
-
* @default "tabs"
|
|
100
|
-
*/
|
|
101
|
-
set tabStyle(value) {
|
|
102
|
-
/*istanbul ignore else*/
|
|
103
|
-
if (value && value.toLowerCase() === 'wizard') {
|
|
104
|
-
console.warn('The tabset wizard is deprecated. Please implement the new approach using ' +
|
|
105
|
-
'progress indicator as documented here: https://developer.blackbaud.com/skyux/components/wizard.');
|
|
106
|
-
}
|
|
107
|
-
this._tabStyle = value;
|
|
108
|
-
}
|
|
109
|
-
get tabStyle() {
|
|
110
|
-
return this._tabStyle || 'tabs';
|
|
111
|
-
}
|
|
112
|
-
set tabDisplayMode(value) {
|
|
113
|
-
this._tabDisplayMode = value;
|
|
114
|
-
this.changeDetector.markForCheck();
|
|
115
|
-
}
|
|
116
|
-
get tabDisplayMode() {
|
|
117
|
-
return this._tabDisplayMode || 'tabs';
|
|
118
|
-
}
|
|
119
|
-
ngAfterViewInit() {
|
|
120
|
-
this.initTabComponents();
|
|
121
|
-
this.listenTabComponentsStructuralChange();
|
|
122
|
-
const initialTabIndex = this.getInitialTabIndex();
|
|
123
|
-
this.tabsetService.setActiveTabIndex(initialTabIndex);
|
|
124
|
-
this.listenTabButtonsOverflowChange();
|
|
125
|
-
this.listenLocationPopStateChange();
|
|
126
|
-
// If the currently active tab is getting unregistered, activate the next one.
|
|
127
|
-
this.tabsetService.activeTabUnregistered
|
|
128
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
129
|
-
.subscribe((tab) => {
|
|
130
|
-
// Wait for the new tabs to render before activating.
|
|
131
|
-
setTimeout(() => {
|
|
132
|
-
this.tabsetService.activateNearestTab(tab.arrayIndex);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
// Let the tabset render the initial active index before listening for changes.
|
|
136
|
-
setTimeout(() => {
|
|
137
|
-
this.listenTabComponentsStateChange();
|
|
138
|
-
this.listenActiveIndexChange();
|
|
139
|
-
this.permalinkService.init();
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
ngOnDestroy() {
|
|
143
|
-
this.ngUnsubscribe.next();
|
|
144
|
-
this.ngUnsubscribe.complete();
|
|
145
|
-
this.unsubscribeTabComponentsStateChange();
|
|
146
|
-
if (this.permalinkId) {
|
|
147
|
-
this.permalinkService.clearParam(this.permalinkId);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
onWindowResize() {
|
|
151
|
-
this.adapterService.detectOverflow();
|
|
152
|
-
}
|
|
153
|
-
onTabCloseClick(tabButton) {
|
|
154
|
-
const tabComponent = this.tabs.find((tab) => this.tabsetService.tabIndexesEqual(tab.tabIndex, tabButton.tabIndex));
|
|
155
|
-
tabComponent.close.emit();
|
|
156
|
-
}
|
|
157
|
-
onTabButtonClick(tabButton) {
|
|
158
|
-
this.tabsetService.setActiveTabIndex(tabButton.tabIndex);
|
|
159
|
-
}
|
|
160
|
-
onNewTabClick() {
|
|
161
|
-
this.newTab.emit();
|
|
162
|
-
}
|
|
163
|
-
onOpenTabClick() {
|
|
164
|
-
this.openTab.emit();
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Sets the initial active tab index based on the following criteria.
|
|
168
|
-
* 1. Does the URL include a query param that reflects this tabset's active tab?
|
|
169
|
-
* 2. Does one of the tab components have their `active` property set to `true`?
|
|
170
|
-
* 3. Is the tabset component's `active` property set to a specific tab index?
|
|
171
|
-
*/
|
|
172
|
-
getInitialTabIndex() {
|
|
173
|
-
var _a;
|
|
174
|
-
let activeIndex = this.getActiveTabIndexByPermalinkId();
|
|
175
|
-
if (activeIndex === undefined) {
|
|
176
|
-
activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
177
|
-
if (activeIndex === undefined) {
|
|
178
|
-
activeIndex = this.active;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return activeIndex;
|
|
182
|
-
}
|
|
183
|
-
listenActiveIndexChange() {
|
|
184
|
-
this.tabsetService.activeTabIndex
|
|
185
|
-
.pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
|
|
186
|
-
.subscribe((activeIndex) => {
|
|
187
|
-
this.updateTabsetComponent(activeIndex);
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
listenTabComponentsStructuralChange() {
|
|
191
|
-
this.tabs.changes.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
192
|
-
this.resetTabComponents();
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
listenTabComponentsStateChange() {
|
|
196
|
-
combineLatest(this.tabs.map((tab) => tab.activeChange))
|
|
197
|
-
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
198
|
-
.subscribe(() => {
|
|
199
|
-
// Wait for the tab components to render changes before finding the active one.
|
|
200
|
-
setTimeout(() => {
|
|
201
|
-
var _a;
|
|
202
|
-
const tabIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
203
|
-
this.tabsetService.setActiveTabIndex(tabIndex);
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
combineLatest(this.tabs.map((tab) => tab.tabIndexChange))
|
|
207
|
-
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
208
|
-
.subscribe(() => {
|
|
209
|
-
// Don't emit the first change.
|
|
210
|
-
if (this.lastActiveTabIndex !== undefined) {
|
|
211
|
-
// Wait for the tab components to render changes before updating the view.
|
|
212
|
-
setTimeout(() => {
|
|
213
|
-
this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
|
|
214
|
-
this.emitTabIndexChange();
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
combineLatest(this.tabs.map((tab) => tab.stateChange))
|
|
219
|
-
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
220
|
-
.subscribe(() => {
|
|
221
|
-
// Wait for the tab components to render changes before finding the active one.
|
|
222
|
-
setTimeout(() => {
|
|
223
|
-
this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
initTabComponents() {
|
|
228
|
-
this.tabs.forEach((tab) => tab.init());
|
|
229
|
-
}
|
|
230
|
-
resetTabComponents() {
|
|
231
|
-
var _a;
|
|
232
|
-
this.unsubscribeTabComponentsStateChange();
|
|
233
|
-
this.tabsetService.unregisterAll();
|
|
234
|
-
// If there are no tab components, do a hard reset of the view.
|
|
235
|
-
if (this.tabs.length === 0) {
|
|
236
|
-
this.updateTabsetComponent(0, true);
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
this.initTabComponents();
|
|
240
|
-
const activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
241
|
-
this.tabsetService.setActiveTabIndex(activeIndex, {
|
|
242
|
-
emitChange: false,
|
|
243
|
-
});
|
|
244
|
-
this.listenTabComponentsStateChange();
|
|
245
|
-
}
|
|
246
|
-
emitTabIndexChange() {
|
|
247
|
-
this.tabIndexesChange.emit({
|
|
248
|
-
tabs: this.tabs.map((tab) => ({
|
|
249
|
-
tabHeading: tab.tabHeading,
|
|
250
|
-
tabIndex: tab.tabIndex,
|
|
251
|
-
})),
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
unsubscribeTabComponentsStateChange() {
|
|
255
|
-
this.tabComponentsStateChangeUnsubscribe.next();
|
|
256
|
-
this.tabComponentsStateChangeUnsubscribe.complete();
|
|
257
|
-
this.tabComponentsStateChangeUnsubscribe = new Subject();
|
|
258
|
-
}
|
|
259
|
-
listenTabButtonsOverflowChange() {
|
|
260
|
-
this.adapterService.registerTabset(this.elementRef);
|
|
261
|
-
this.adapterService.overflowChange
|
|
262
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
263
|
-
.subscribe((isOverflowing) => {
|
|
264
|
-
this.tabDisplayMode = isOverflowing ? 'dropdown' : 'tabs';
|
|
265
|
-
this.changeDetector.markForCheck();
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Listen for back/forward history button presses to detect query param changes in the URL.
|
|
270
|
-
*/
|
|
271
|
-
listenLocationPopStateChange() {
|
|
272
|
-
this.permalinkService.popStateChange
|
|
273
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
274
|
-
.subscribe(() => {
|
|
275
|
-
this.setActiveTabIndexByPermalinkId();
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
setActiveTabIndexByPermalinkId() {
|
|
279
|
-
const activeIndex = this.getActiveTabIndexByPermalinkId();
|
|
280
|
-
this.tabsetService.setActiveTabIndex(activeIndex);
|
|
281
|
-
}
|
|
282
|
-
getActiveTabIndexByPermalinkId() {
|
|
283
|
-
var _a;
|
|
284
|
-
if (this.permalinkId) {
|
|
285
|
-
const paramValue = this.permalinkService.getParam(this.permalinkId);
|
|
286
|
-
if (paramValue) {
|
|
287
|
-
return (_a = this.tabs.find((tab) => tab.permalinkValue === paramValue)) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
getActiveTabComponent() {
|
|
292
|
-
return this.tabs
|
|
293
|
-
.toArray()
|
|
294
|
-
.reverse()
|
|
295
|
-
.find((tab) => tab.active === true);
|
|
296
|
-
}
|
|
297
|
-
createTabButtons(activeIndex) {
|
|
298
|
-
return this.tabs.map((tab) => ({
|
|
299
|
-
active: this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex),
|
|
300
|
-
closeable: tab.closeable,
|
|
301
|
-
ariaControls: tab.tabPanelId,
|
|
302
|
-
disabled: tab.disabled,
|
|
303
|
-
/*tslint:disable-next-line:no-null-keyword*/
|
|
304
|
-
buttonHref: tab.disabled
|
|
305
|
-
? null
|
|
306
|
-
: this.permalinkService.getParamHref(this.permalinkId, tab.permalinkValue),
|
|
307
|
-
buttonId: tab.tabButtonId,
|
|
308
|
-
buttonTextCount: tab.tabHeaderCount,
|
|
309
|
-
buttonText: tab.tabHeading,
|
|
310
|
-
tabIndex: tab.tabIndex,
|
|
311
|
-
}));
|
|
312
|
-
}
|
|
313
|
-
updateTabButtons(activeIndex) {
|
|
314
|
-
this.tabButtons.forEach((button) => {
|
|
315
|
-
button.active = this.tabsetService.tabIndexesEqual(button.tabIndex, activeIndex);
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Updates the UI and state of the tabset component after the tab index or
|
|
320
|
-
* tab components have changed.
|
|
321
|
-
* @param activeIndex The currently active tab index.
|
|
322
|
-
* @param regenerateTabButtons Indicates if tab button view models should be regenerated.
|
|
323
|
-
* Setting this value to `false` will simply update the existing tab buttons. Setting this value
|
|
324
|
-
* to `true` is only necessary when the underlying tab components have changed and the tab
|
|
325
|
-
* buttons must reflect those changes.
|
|
326
|
-
*/
|
|
327
|
-
updateTabsetComponent(activeIndex, regenerateTabButtons = false) {
|
|
328
|
-
var _a;
|
|
329
|
-
// Activate/deactivate tab components.
|
|
330
|
-
this.tabs.forEach((tab) => {
|
|
331
|
-
this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex)
|
|
332
|
-
? tab.activate()
|
|
333
|
-
: tab.deactivate();
|
|
334
|
-
});
|
|
335
|
-
// Update the tab button models.
|
|
336
|
-
if (regenerateTabButtons || !this.tabButtons.length) {
|
|
337
|
-
this.tabButtons = this.createTabButtons(activeIndex);
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
this.updateTabButtons(activeIndex);
|
|
341
|
-
}
|
|
342
|
-
// Update the dropdown trigger button text.
|
|
343
|
-
this.dropdownTriggerButtonText = (_a = this.tabButtons.find((b) => {
|
|
344
|
-
return this.tabsetService.tabIndexesEqual(b.tabIndex, activeIndex);
|
|
345
|
-
})) === null || _a === void 0 ? void 0 : _a.buttonText;
|
|
346
|
-
// Set the query params based on active tab.
|
|
347
|
-
if (this.permalinkId) {
|
|
348
|
-
const activeTabComponent = this.tabs.find((tab) => {
|
|
349
|
-
return this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex);
|
|
350
|
-
});
|
|
351
|
-
this.permalinkService.setParam(this.permalinkId, activeTabComponent.permalinkValue);
|
|
352
|
-
}
|
|
353
|
-
// Wait for tab button view models to render before gauging dimensions.
|
|
354
|
-
setTimeout(() => {
|
|
355
|
-
this.adapterService.detectOverflow();
|
|
356
|
-
});
|
|
357
|
-
this.changeDetector.markForCheck();
|
|
358
|
-
// Emit the new active index value to consumers.
|
|
359
|
-
if (this.lastActiveTabIndex !== activeIndex) {
|
|
360
|
-
this.lastActiveTabIndex = activeIndex;
|
|
361
|
-
this.activeChange.emit(activeIndex);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
SkyTabsetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsetComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyTabsetAdapterService }, { token: i2.SkyTabsetPermalinkService }, { token: i3.SkyTabsetService }], target: i0.ɵɵFactoryTarget.Component });
|
|
366
|
-
SkyTabsetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyTabsetComponent, selector: "sky-tabset", inputs: { active: "active", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", permalinkId: "permalinkId", tabStyle: "tabStyle" }, outputs: { activeChange: "activeChange", newTab: "newTab", openTab: "openTab", tabIndexesChange: "tabIndexesChange" }, providers: [
|
|
367
|
-
SkyTabsetAdapterService,
|
|
368
|
-
SkyTabsetPermalinkService,
|
|
369
|
-
SkyTabsetService,
|
|
370
|
-
], queries: [{ propertyName: "tabs", predicate: SkyTabComponent }], ngImport: i0, template: "<div\n class=\"sky-tabset\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"\n 'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\n \"\n (window:resize)=\"onWindowResize()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\" buttonType=\"tab\">\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item\n *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\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span class=\"sky-tabset-tabs\">\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </ng-container>\n </span>\n <span class=\"sky-tabset-btns\">\n <button\n *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 icon=\"plus-circle\" size=\"lg\"> </sky-icon>\n </button>\n <button\n *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 icon=\"folder-open-o\" size=\"lg\"> </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template let-tabButton #tabButtonTemplate>\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", 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}\n"], components: [{ type: i4.λ3, selector: "sky-dropdown", inputs: ["buttonStyle", "buttonType", "disabled", "dismissOnBlur", "label", "horizontalAlignment", "messageStream", "title", "trigger"] }, { type: i4.λ2, selector: "sky-dropdown-button" }, { type: i4.λ4, selector: "sky-dropdown-menu", inputs: ["ariaLabelledBy", "ariaRole", "useNativeFocus"], outputs: ["menuChanges"] }, { type: i4.λ1, selector: "sky-dropdown-item", inputs: ["ariaRole"] }, { type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { type: i6.SkyTabButtonComponent, selector: "sky-tab-button", inputs: ["active", "ariaControls", "buttonHref", "buttonId", "buttonText", "buttonTextCount", "closeable", "disabled", "tabStyle"], outputs: ["buttonClick", "closeClick"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }], pipes: { "skyLibResources": i9.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
371
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsetComponent, decorators: [{
|
|
372
|
-
type: Component,
|
|
373
|
-
args: [{
|
|
374
|
-
selector: 'sky-tabset',
|
|
375
|
-
styleUrls: ['./tabset.component.scss'],
|
|
376
|
-
templateUrl: './tabset.component.html',
|
|
377
|
-
providers: [
|
|
378
|
-
SkyTabsetAdapterService,
|
|
379
|
-
SkyTabsetPermalinkService,
|
|
380
|
-
SkyTabsetService,
|
|
381
|
-
],
|
|
382
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
383
|
-
encapsulation: ViewEncapsulation.None,
|
|
384
|
-
}]
|
|
385
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyTabsetAdapterService }, { type: i2.SkyTabsetPermalinkService }, { type: i3.SkyTabsetService }]; }, propDecorators: { active: [{
|
|
386
|
-
type: Input
|
|
387
|
-
}], ariaLabel: [{
|
|
388
|
-
type: Input
|
|
389
|
-
}], ariaLabelledBy: [{
|
|
390
|
-
type: Input
|
|
391
|
-
}], permalinkId: [{
|
|
392
|
-
type: Input
|
|
393
|
-
}], tabStyle: [{
|
|
394
|
-
type: Input
|
|
395
|
-
}], activeChange: [{
|
|
396
|
-
type: Output
|
|
397
|
-
}], newTab: [{
|
|
398
|
-
type: Output
|
|
399
|
-
}], openTab: [{
|
|
400
|
-
type: Output
|
|
401
|
-
}], tabIndexesChange: [{
|
|
402
|
-
type: Output
|
|
403
|
-
}], tabs: [{
|
|
404
|
-
type: ContentChildren,
|
|
405
|
-
args: [SkyTabComponent]
|
|
406
|
-
}] } });
|
|
407
|
-
//# sourceMappingURL=tabset.component.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tabset.component.js","sourceRoot":"","sources":["../../../../../../../../libs/components/tabs/src/lib/modules/tabs/tabset.component.ts","../../../../../../../../libs/components/tabs/src/lib/modules/tabs/tabset.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n QueryList,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { Subject, combineLatest, race } from 'rxjs';\nimport { distinctUntilChanged, takeUntil } from 'rxjs/operators';\n\nimport { SkyTabIndex } from './tab-index';\nimport { SkyTabComponent } from './tab.component';\nimport { SkyTabsetAdapterService } from './tabset-adapter.service';\nimport { SkyTabsetButtonsDisplayMode } from './tabset-buttons-display-mode';\nimport { SkyTabsetPermalinkService } from './tabset-permalink.service';\nimport { SkyTabsetStyle } from './tabset-style';\nimport { SkyTabsetTabIndexesChange } from './tabset-tab-indexes-change';\nimport { SkyTabsetService } from './tabset.service';\n\n/**\n * @internal\n */\ninterface TabButtonViewModel {\n active: boolean;\n ariaControls: string;\n buttonHref: string;\n buttonId: string;\n buttonText: string;\n buttonTextCount: string;\n closeable: boolean;\n disabled: boolean;\n tabIndex: SkyTabIndex;\n}\n\n@Component({\n selector: 'sky-tabset',\n styleUrls: ['./tabset.component.scss'],\n templateUrl: './tabset.component.html',\n providers: [\n SkyTabsetAdapterService,\n SkyTabsetPermalinkService,\n SkyTabsetService,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class SkyTabsetComponent implements AfterViewInit, OnDestroy {\n /**\n * Activates a tab by its `tabIndex` property.\n */\n @Input()\n public set active(value: SkyTabIndex) {\n if (\n value === undefined ||\n this.tabsetService.tabIndexesEqual(value, this._active)\n ) {\n return;\n }\n\n this._active = value;\n\n if (this.tabs) {\n this.tabsetService.setActiveTabIndex(value);\n } else {\n // On init, wait for children tabs to render before broadcasting the active tab index.\n setTimeout(() => {\n if (this.tabsetService.isValidTabIndex(value)) {\n // On init, yield to the permalink ID, if it exists.\n if (this.getActiveTabIndexByPermalinkId() === undefined) {\n this.tabsetService.setActiveTabIndex(value);\n }\n } else {\n // Activate the first tab if the new tab index is invalid.\n this._active = this.tabsetService.activateFirstTab();\n }\n });\n }\n }\n\n public get active(): SkyTabIndex {\n return this._active;\n }\n\n /**\n * Specifies an ARIA label for the tabset. This sets the tabset's `aria-label` attribute\n * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility).\n * If the tabset includes a visible label, use `ariaLabelledBy` instead.\n */\n @Input()\n public ariaLabel: string;\n\n /**\n * Specifies the HTML element ID (without the leading `#`) of the element that labels\n * the tabset. This sets the tabset's `aria-labelledby` attribute\n * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility).\n * If the tabset does not include a visible label, use `ariaLabel` instead.\n */\n @Input()\n public ariaLabelledBy: string;\n\n /**\n * Distinguishes a tabset's unique state in the URL by generating a query parameter\n * that is written as `?<queryParam>-active-tab=<sanitized-tab-heading>`.\n * The query parameter's value is parsed automatically from the selected tab's heading text,\n * but you can supply a custom query parameter value for each tab with its `permalinkValue`.\n */\n @Input()\n public set permalinkId(value: string) {\n if (!value) {\n return;\n }\n\n const sanitized = this.permalinkService.urlify(value);\n this._permalinkId = `${sanitized}-active-tab`;\n }\n\n public get permalinkId(): string {\n return this._permalinkId || '';\n }\n\n /**\n * Specifies the behavior for a series of tabs.\n * @deprecated The property was designed to create wizards by setting tabStyle=\"wizard\" on tabsets in modals,\n * but this wizard implementation was replaced by the\n * [progress indicator component](https://developer.blackbaud.com/skyux/components/progress-indicator).\n * @default \"tabs\"\n */\n @Input()\n public set tabStyle(value: SkyTabsetStyle) {\n /*istanbul ignore else*/\n if (value && value.toLowerCase() === 'wizard') {\n console.warn(\n 'The tabset wizard is deprecated. Please implement the new approach using ' +\n 'progress indicator as documented here: https://developer.blackbaud.com/skyux/components/wizard.'\n );\n }\n\n this._tabStyle = value;\n }\n\n public get tabStyle(): SkyTabsetStyle {\n return this._tabStyle || 'tabs';\n }\n\n /**\n * Fires when the active tab changes. This event emits the index of the active tab.\n */\n @Output()\n public activeChange = new EventEmitter<SkyTabIndex>();\n\n /**\n * Fires when users click the button to add a new tab.\n * The new tab button is added to the tab area when you specify a listener for this event.\n */\n @Output()\n public newTab = new EventEmitter<void>();\n\n /**\n * Fires when users click the button to open a tab.\n * The open tab button is added to the tab area when you specify a listener for this event.\n */\n @Output()\n public openTab = new EventEmitter<void>();\n\n /**\n * Fires when any tab's `tabIndex` value changes.\n */\n @Output()\n public tabIndexesChange = new EventEmitter<SkyTabsetTabIndexesChange>();\n\n public set tabDisplayMode(value: SkyTabsetButtonsDisplayMode) {\n this._tabDisplayMode = value;\n this.changeDetector.markForCheck();\n }\n\n public get tabDisplayMode(): SkyTabsetButtonsDisplayMode {\n return this._tabDisplayMode || 'tabs';\n }\n\n @ContentChildren(SkyTabComponent)\n public tabs: QueryList<SkyTabComponent>;\n\n public dropdownTriggerButtonText: string;\n\n /**\n * This property is used by the deprecated tabset-nav-button component.\n * @internal\n */\n public lastActiveTabIndex: SkyTabIndex;\n\n public tabButtons: TabButtonViewModel[] = [];\n\n private ngUnsubscribe = new Subject<void>();\n\n private tabComponentsStateChangeUnsubscribe = new Subject<void>();\n\n private _active: SkyTabIndex;\n\n private _permalinkId: string;\n\n private _tabDisplayMode: SkyTabsetButtonsDisplayMode;\n\n private _tabStyle: SkyTabsetStyle;\n\n constructor(\n private changeDetector: ChangeDetectorRef,\n private elementRef: ElementRef,\n private adapterService: SkyTabsetAdapterService,\n private permalinkService: SkyTabsetPermalinkService,\n private tabsetService: SkyTabsetService\n ) {}\n\n public ngAfterViewInit(): void {\n this.initTabComponents();\n this.listenTabComponentsStructuralChange();\n\n const initialTabIndex = this.getInitialTabIndex();\n this.tabsetService.setActiveTabIndex(initialTabIndex);\n\n this.listenTabButtonsOverflowChange();\n this.listenLocationPopStateChange();\n\n // If the currently active tab is getting unregistered, activate the next one.\n this.tabsetService.activeTabUnregistered\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((tab) => {\n // Wait for the new tabs to render before activating.\n setTimeout(() => {\n this.tabsetService.activateNearestTab(tab.arrayIndex);\n });\n });\n\n // Let the tabset render the initial active index before listening for changes.\n setTimeout(() => {\n this.listenTabComponentsStateChange();\n this.listenActiveIndexChange();\n this.permalinkService.init();\n });\n }\n\n public ngOnDestroy(): void {\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n this.unsubscribeTabComponentsStateChange();\n if (this.permalinkId) {\n this.permalinkService.clearParam(this.permalinkId);\n }\n }\n\n public onWindowResize(): void {\n this.adapterService.detectOverflow();\n }\n\n public onTabCloseClick(tabButton: TabButtonViewModel): void {\n const tabComponent = this.tabs.find((tab) =>\n this.tabsetService.tabIndexesEqual(tab.tabIndex, tabButton.tabIndex)\n );\n\n tabComponent.close.emit();\n }\n\n public onTabButtonClick(tabButton: TabButtonViewModel): void {\n this.tabsetService.setActiveTabIndex(tabButton.tabIndex);\n }\n\n public onNewTabClick(): void {\n this.newTab.emit();\n }\n\n public onOpenTabClick(): void {\n this.openTab.emit();\n }\n\n /**\n * Sets the initial active tab index based on the following criteria.\n * 1. Does the URL include a query param that reflects this tabset's active tab?\n * 2. Does one of the tab components have their `active` property set to `true`?\n * 3. Is the tabset component's `active` property set to a specific tab index?\n */\n private getInitialTabIndex(): SkyTabIndex {\n let activeIndex: SkyTabIndex = this.getActiveTabIndexByPermalinkId();\n if (activeIndex === undefined) {\n activeIndex = this.getActiveTabComponent()?.tabIndex;\n if (activeIndex === undefined) {\n activeIndex = this.active;\n }\n }\n\n return activeIndex;\n }\n\n private listenActiveIndexChange(): void {\n this.tabsetService.activeTabIndex\n .pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))\n .subscribe((activeIndex) => {\n this.updateTabsetComponent(activeIndex);\n });\n }\n\n private listenTabComponentsStructuralChange(): void {\n this.tabs.changes.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {\n this.resetTabComponents();\n });\n }\n\n private listenTabComponentsStateChange(): void {\n combineLatest(this.tabs.map((tab) => tab.activeChange))\n .pipe(\n takeUntil(\n race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)\n )\n )\n .subscribe(() => {\n // Wait for the tab components to render changes before finding the active one.\n setTimeout(() => {\n const tabIndex = this.getActiveTabComponent()?.tabIndex;\n this.tabsetService.setActiveTabIndex(tabIndex);\n });\n });\n\n combineLatest(this.tabs.map((tab) => tab.tabIndexChange))\n .pipe(\n takeUntil(\n race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)\n )\n )\n .subscribe(() => {\n // Don't emit the first change.\n if (this.lastActiveTabIndex !== undefined) {\n // Wait for the tab components to render changes before updating the view.\n setTimeout(() => {\n this.updateTabsetComponent(\n this.tabsetService.currentActiveTabIndex,\n true\n );\n this.emitTabIndexChange();\n });\n }\n });\n\n combineLatest(this.tabs.map((tab) => tab.stateChange))\n .pipe(\n takeUntil(\n race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)\n )\n )\n .subscribe(() => {\n // Wait for the tab components to render changes before finding the active one.\n setTimeout(() => {\n this.updateTabsetComponent(\n this.tabsetService.currentActiveTabIndex,\n true\n );\n });\n });\n }\n\n private initTabComponents(): void {\n this.tabs.forEach((tab) => tab.init());\n }\n\n private resetTabComponents(): void {\n this.unsubscribeTabComponentsStateChange();\n this.tabsetService.unregisterAll();\n\n // If there are no tab components, do a hard reset of the view.\n if (this.tabs.length === 0) {\n this.updateTabsetComponent(0, true);\n return;\n }\n\n this.initTabComponents();\n const activeIndex = this.getActiveTabComponent()?.tabIndex;\n this.tabsetService.setActiveTabIndex(activeIndex, {\n emitChange: false,\n });\n this.listenTabComponentsStateChange();\n }\n\n private emitTabIndexChange(): void {\n this.tabIndexesChange.emit({\n tabs: this.tabs.map((tab) => ({\n tabHeading: tab.tabHeading,\n tabIndex: tab.tabIndex,\n })),\n });\n }\n\n private unsubscribeTabComponentsStateChange(): void {\n this.tabComponentsStateChangeUnsubscribe.next();\n this.tabComponentsStateChangeUnsubscribe.complete();\n this.tabComponentsStateChangeUnsubscribe = new Subject<void>();\n }\n\n private listenTabButtonsOverflowChange(): void {\n this.adapterService.registerTabset(this.elementRef);\n this.adapterService.overflowChange\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe((isOverflowing) => {\n this.tabDisplayMode = isOverflowing ? 'dropdown' : 'tabs';\n this.changeDetector.markForCheck();\n });\n }\n\n /**\n * Listen for back/forward history button presses to detect query param changes in the URL.\n */\n private listenLocationPopStateChange(): void {\n this.permalinkService.popStateChange\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(() => {\n this.setActiveTabIndexByPermalinkId();\n });\n }\n\n private setActiveTabIndexByPermalinkId(): void {\n const activeIndex = this.getActiveTabIndexByPermalinkId();\n this.tabsetService.setActiveTabIndex(activeIndex);\n }\n\n private getActiveTabIndexByPermalinkId(): SkyTabIndex {\n if (this.permalinkId) {\n const paramValue = this.permalinkService.getParam(this.permalinkId);\n if (paramValue) {\n return this.tabs.find((tab) => tab.permalinkValue === paramValue)\n ?.tabIndex;\n }\n }\n }\n\n private getActiveTabComponent(): SkyTabComponent {\n return this.tabs\n .toArray()\n .reverse()\n .find((tab) => tab.active === true);\n }\n\n private createTabButtons(activeIndex: SkyTabIndex): TabButtonViewModel[] {\n return this.tabs.map((tab) => ({\n active: this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex),\n closeable: tab.closeable,\n ariaControls: tab.tabPanelId,\n disabled: tab.disabled,\n /*tslint:disable-next-line:no-null-keyword*/\n buttonHref: tab.disabled\n ? null\n : this.permalinkService.getParamHref(\n this.permalinkId,\n tab.permalinkValue\n ),\n buttonId: tab.tabButtonId,\n buttonTextCount: tab.tabHeaderCount,\n buttonText: tab.tabHeading,\n tabIndex: tab.tabIndex,\n }));\n }\n\n private updateTabButtons(activeIndex: SkyTabIndex): void {\n this.tabButtons.forEach((button) => {\n button.active = this.tabsetService.tabIndexesEqual(\n button.tabIndex,\n activeIndex\n );\n });\n }\n\n /**\n * Updates the UI and state of the tabset component after the tab index or\n * tab components have changed.\n * @param activeIndex The currently active tab index.\n * @param regenerateTabButtons Indicates if tab button view models should be regenerated.\n * Setting this value to `false` will simply update the existing tab buttons. Setting this value\n * to `true` is only necessary when the underlying tab components have changed and the tab\n * buttons must reflect those changes.\n */\n private updateTabsetComponent(\n activeIndex: SkyTabIndex,\n regenerateTabButtons = false\n ): void {\n // Activate/deactivate tab components.\n this.tabs.forEach((tab) => {\n this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex)\n ? tab.activate()\n : tab.deactivate();\n });\n\n // Update the tab button models.\n if (regenerateTabButtons || !this.tabButtons.length) {\n this.tabButtons = this.createTabButtons(activeIndex);\n } else {\n this.updateTabButtons(activeIndex);\n }\n\n // Update the dropdown trigger button text.\n this.dropdownTriggerButtonText = this.tabButtons.find((b) => {\n return this.tabsetService.tabIndexesEqual(b.tabIndex, activeIndex);\n })?.buttonText;\n\n // Set the query params based on active tab.\n if (this.permalinkId) {\n const activeTabComponent = this.tabs.find((tab) => {\n return this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex);\n });\n this.permalinkService.setParam(\n this.permalinkId,\n activeTabComponent.permalinkValue\n );\n }\n\n // Wait for tab button view models to render before gauging dimensions.\n setTimeout(() => {\n this.adapterService.detectOverflow();\n });\n\n this.changeDetector.markForCheck();\n\n // Emit the new active index value to consumers.\n if (this.lastActiveTabIndex !== activeIndex) {\n this.lastActiveTabIndex = activeIndex;\n this.activeChange.emit(activeIndex);\n }\n }\n}\n","<div\n class=\"sky-tabset\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"\n 'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\n \"\n (window:resize)=\"onWindowResize()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\" buttonType=\"tab\">\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item\n *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\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span class=\"sky-tabset-tabs\">\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </ng-container>\n </span>\n <span class=\"sky-tabset-btns\">\n <button\n *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 icon=\"plus-circle\" size=\"lg\"> </sky-icon>\n </button>\n <button\n *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 icon=\"folder-open-o\" size=\"lg\"> </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template let-tabButton #tabButtonTemplate>\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"]}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* @internal
|
|
6
|
-
*/
|
|
7
|
-
export class SkyTabsetService {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.currentActiveTabIndex = 0;
|
|
10
|
-
this._activeTabIndex = new BehaviorSubject(0);
|
|
11
|
-
this._activeTabUnregistered = new Subject();
|
|
12
|
-
this.tabs = [];
|
|
13
|
-
this.tabCounter = 0;
|
|
14
|
-
}
|
|
15
|
-
get activeTabUnregistered() {
|
|
16
|
-
return this._activeTabUnregistered.asObservable();
|
|
17
|
-
}
|
|
18
|
-
get activeTabIndex() {
|
|
19
|
-
return this._activeTabIndex.asObservable();
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Sets the active tab by its unique `tabIndex` property.
|
|
23
|
-
*/
|
|
24
|
-
setActiveTabIndex(value, config = {
|
|
25
|
-
emitChange: true,
|
|
26
|
-
}) {
|
|
27
|
-
if (value !== undefined &&
|
|
28
|
-
!this.tabIndexesEqual(value, this.currentActiveTabIndex)) {
|
|
29
|
-
this.currentActiveTabIndex = value;
|
|
30
|
-
/* istanbul ignore else */
|
|
31
|
-
if (config.emitChange) {
|
|
32
|
-
this._activeTabIndex.next(value);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Registers a tab component.
|
|
38
|
-
*/
|
|
39
|
-
registerTab(tabIndex) {
|
|
40
|
-
if (tabIndex === undefined) {
|
|
41
|
-
tabIndex = this.tabCounter;
|
|
42
|
-
this.tabCounter++;
|
|
43
|
-
}
|
|
44
|
-
this.tabs.push({ tabIndex });
|
|
45
|
-
return tabIndex;
|
|
46
|
-
}
|
|
47
|
-
updateTabIndex(currentTabIndex, newTabIndex) {
|
|
48
|
-
const found = this.tabs.find((tab) => this.tabIndexesEqual(tab.tabIndex, currentTabIndex));
|
|
49
|
-
found.tabIndex = newTabIndex;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Unregisters a tab component.
|
|
53
|
-
*/
|
|
54
|
-
unregisterTab(tabIndex) {
|
|
55
|
-
const index = this.tabs.findIndex((tab) => this.tabIndexesEqual(tab.tabIndex, tabIndex));
|
|
56
|
-
// Notify the tabset component when an active tab is unregistered.
|
|
57
|
-
if (this.isTabIndexActive(this.tabs[index].tabIndex)) {
|
|
58
|
-
this._activeTabUnregistered.next({
|
|
59
|
-
arrayIndex: index,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
this.tabs.splice(index, 1);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Unregisters all tab components at once.
|
|
66
|
-
*/
|
|
67
|
-
unregisterAll() {
|
|
68
|
-
this.tabs = [];
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Compares two tab indexes and returns `true` if they are equal.
|
|
72
|
-
*/
|
|
73
|
-
tabIndexesEqual(tabIndex1, tabIndex2) {
|
|
74
|
-
return tabIndex1 === tabIndex2 || +tabIndex1 === +tabIndex2;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Verifies if a provided tab index is registered.
|
|
78
|
-
*/
|
|
79
|
-
isValidTabIndex(tabIndex) {
|
|
80
|
-
return this.tabs.some((tab) => this.tabIndexesEqual(tab.tabIndex, tabIndex));
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Activates the first registered tab.
|
|
84
|
-
*/
|
|
85
|
-
activateFirstTab() {
|
|
86
|
-
const firstTabIndex = this.tabs[0] && this.tabs[0].tabIndex;
|
|
87
|
-
if (firstTabIndex !== undefined) {
|
|
88
|
-
this.setActiveTabIndex(firstTabIndex);
|
|
89
|
-
return firstTabIndex;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Activates the next registered tab, or the previous one based on a provided array index.
|
|
94
|
-
*/
|
|
95
|
-
activateNearestTab(arrayIndex) {
|
|
96
|
-
const newActiveTab = this.tabs[arrayIndex] || this.tabs[arrayIndex - 1];
|
|
97
|
-
if (newActiveTab) {
|
|
98
|
-
this.currentActiveTabIndex = newActiveTab.tabIndex;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
isTabIndexActive(tabIndex) {
|
|
102
|
-
return this.tabIndexesEqual(tabIndex, this.currentActiveTabIndex);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
SkyTabsetService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
106
|
-
SkyTabsetService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsetService });
|
|
107
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsetService, decorators: [{
|
|
108
|
-
type: Injectable
|
|
109
|
-
}] });
|
|
110
|
-
//# sourceMappingURL=tabset.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tabset.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/tabs/src/lib/modules/tabs/tabset.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\n\nimport { SkyTabIndex } from './tab-index';\nimport { SkyTabsetActiveTabUnregisteredArgs } from './tabset-active-tab-unregistered-args';\n\n/**\n * @internal\n */\n@Injectable()\nexport class SkyTabsetService {\n public get activeTabUnregistered(): Observable<SkyTabsetActiveTabUnregisteredArgs> {\n return this._activeTabUnregistered.asObservable();\n }\n\n public get activeTabIndex(): Observable<SkyTabIndex> {\n return this._activeTabIndex.asObservable();\n }\n\n public currentActiveTabIndex: SkyTabIndex = 0;\n\n private _activeTabIndex = new BehaviorSubject<SkyTabIndex>(0);\n\n private _activeTabUnregistered =\n new Subject<SkyTabsetActiveTabUnregisteredArgs>();\n\n private tabs: {\n tabIndex: SkyTabIndex;\n }[] = [];\n\n private tabCounter = 0;\n\n /**\n * Sets the active tab by its unique `tabIndex` property.\n */\n public setActiveTabIndex(\n value: SkyTabIndex,\n config = {\n emitChange: true,\n }\n ): void {\n if (\n value !== undefined &&\n !this.tabIndexesEqual(value, this.currentActiveTabIndex)\n ) {\n this.currentActiveTabIndex = value;\n /* istanbul ignore else */\n if (config.emitChange) {\n this._activeTabIndex.next(value);\n }\n }\n }\n\n /**\n * Registers a tab component.\n */\n public registerTab(tabIndex?: SkyTabIndex): SkyTabIndex {\n if (tabIndex === undefined) {\n tabIndex = this.tabCounter;\n this.tabCounter++;\n }\n\n this.tabs.push({ tabIndex });\n\n return tabIndex;\n }\n\n public updateTabIndex(\n currentTabIndex: SkyTabIndex,\n newTabIndex: SkyTabIndex\n ): void {\n const found = this.tabs.find((tab) =>\n this.tabIndexesEqual(tab.tabIndex, currentTabIndex)\n );\n found.tabIndex = newTabIndex;\n }\n\n /**\n * Unregisters a tab component.\n */\n public unregisterTab(tabIndex: SkyTabIndex): void {\n const index = this.tabs.findIndex((tab) =>\n this.tabIndexesEqual(tab.tabIndex, tabIndex)\n );\n\n // Notify the tabset component when an active tab is unregistered.\n if (this.isTabIndexActive(this.tabs[index].tabIndex)) {\n this._activeTabUnregistered.next({\n arrayIndex: index,\n });\n }\n\n this.tabs.splice(index, 1);\n }\n\n /**\n * Unregisters all tab components at once.\n */\n public unregisterAll(): void {\n this.tabs = [];\n }\n\n /**\n * Compares two tab indexes and returns `true` if they are equal.\n */\n public tabIndexesEqual(\n tabIndex1: SkyTabIndex,\n tabIndex2: SkyTabIndex\n ): boolean {\n return tabIndex1 === tabIndex2 || +tabIndex1 === +tabIndex2;\n }\n\n /**\n * Verifies if a provided tab index is registered.\n */\n public isValidTabIndex(tabIndex: SkyTabIndex): boolean {\n return this.tabs.some((tab) =>\n this.tabIndexesEqual(tab.tabIndex, tabIndex)\n );\n }\n\n /**\n * Activates the first registered tab.\n */\n public activateFirstTab(): SkyTabIndex | undefined {\n const firstTabIndex = this.tabs[0] && this.tabs[0].tabIndex;\n if (firstTabIndex !== undefined) {\n this.setActiveTabIndex(firstTabIndex);\n return firstTabIndex;\n }\n }\n\n /**\n * Activates the next registered tab, or the previous one based on a provided array index.\n */\n public activateNearestTab(arrayIndex: number): void {\n const newActiveTab = this.tabs[arrayIndex] || this.tabs[arrayIndex - 1];\n if (newActiveTab) {\n this.currentActiveTabIndex = newActiveTab.tabIndex;\n }\n }\n\n private isTabIndexActive(tabIndex: SkyTabIndex): boolean {\n return this.tabIndexesEqual(tabIndex, this.currentActiveTabIndex);\n }\n}\n"]}
|