@skyux/popovers 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/documentation.json +2 -2
- package/esm2020/index.mjs +23 -0
- package/esm2020/lib/modules/dropdown/dropdown-button.component.mjs +14 -0
- package/esm2020/lib/modules/dropdown/dropdown-extensions.mjs +14 -0
- package/esm2020/lib/modules/dropdown/dropdown-item.component.mjs +69 -0
- package/esm2020/lib/modules/dropdown/dropdown-menu.component.mjs +305 -0
- package/esm2020/lib/modules/dropdown/dropdown.component.mjs +359 -0
- package/esm2020/lib/modules/dropdown/dropdown.module.mjs +60 -0
- package/esm2020/lib/modules/dropdown/types/dropdown-horizontal-alignment.mjs +2 -0
- package/esm2020/lib/modules/dropdown/types/dropdown-menu-change.mjs +2 -0
- package/esm2020/lib/modules/dropdown/types/dropdown-message-type.mjs +40 -0
- package/esm2020/lib/modules/dropdown/types/dropdown-message.mjs +2 -0
- package/esm2020/lib/modules/dropdown/types/dropdown-trigger-type.mjs +2 -0
- package/esm2020/lib/modules/popover/popover-adapter.service.mjs +74 -0
- package/esm2020/lib/modules/popover/popover-animation-state.mjs +2 -0
- package/esm2020/lib/modules/popover/popover-animation.mjs +19 -0
- package/esm2020/lib/modules/popover/popover-content.component.mjs +261 -0
- package/esm2020/lib/modules/popover/popover-context.mjs +10 -0
- package/esm2020/lib/modules/popover/popover-extensions.mjs +29 -0
- package/esm2020/lib/modules/popover/popover.component.mjs +198 -0
- package/esm2020/lib/modules/popover/popover.directive.mjs +176 -0
- package/esm2020/lib/modules/popover/popover.module.mjs +55 -0
- package/esm2020/lib/modules/popover/types/popover-adapter-arrow-coordinates.mjs +2 -0
- package/esm2020/lib/modules/popover/types/popover-adapter-elements.mjs +2 -0
- package/esm2020/lib/modules/popover/types/popover-alignment.mjs +2 -0
- package/esm2020/lib/modules/popover/types/popover-message-type.mjs +24 -0
- package/esm2020/lib/modules/popover/types/popover-message.mjs +2 -0
- package/esm2020/lib/modules/popover/types/popover-placement.mjs +2 -0
- package/esm2020/lib/modules/popover/types/popover-position.mjs +2 -0
- package/esm2020/lib/modules/popover/types/popover-trigger.mjs +2 -0
- package/esm2020/lib/modules/shared/sky-popovers-resources.module.mjs +47 -0
- package/esm2020/skyux-popovers.mjs +5 -0
- package/esm2020/testing/dropdown/dropdown-fixture.mjs +133 -0
- package/esm2020/testing/dropdown/dropdown-testing.module.mjs +15 -0
- package/esm2020/testing/dropdown/popovers-fixture-dropdown-item.mjs +2 -0
- package/esm2020/testing/dropdown/popovers-fixture-dropdown-menu.mjs +2 -0
- package/esm2020/testing/dropdown/popovers-fixture-dropdown.mjs +2 -0
- package/esm2020/testing/popover/popover-fixture.mjs +86 -0
- package/esm2020/testing/popover/popover-testing.module.mjs +29 -0
- package/esm2020/testing/public-api.mjs +8 -0
- package/esm2020/testing/skyux-popovers-testing.mjs +5 -0
- package/fesm2015/{skyux-popovers-testing.js → skyux-popovers-testing.mjs} +9 -9
- package/fesm2015/skyux-popovers-testing.mjs.map +1 -0
- package/fesm2015/skyux-popovers.mjs +1705 -0
- package/fesm2015/skyux-popovers.mjs.map +1 -0
- package/fesm2020/skyux-popovers-testing.mjs +266 -0
- package/fesm2020/skyux-popovers-testing.mjs.map +1 -0
- package/{fesm2015/skyux-popovers.js → fesm2020/skyux-popovers.mjs} +53 -88
- package/fesm2020/skyux-popovers.mjs.map +1 -0
- package/package.json +40 -16
- package/testing/package.json +5 -5
- package/bundles/skyux-popovers-testing.umd.js +0 -682
- package/bundles/skyux-popovers.umd.js +0 -1889
- package/esm2015/index.js +0 -23
- package/esm2015/index.js.map +0 -1
- package/esm2015/lib/modules/dropdown/dropdown-button.component.js +0 -17
- package/esm2015/lib/modules/dropdown/dropdown-button.component.js.map +0 -1
- package/esm2015/lib/modules/dropdown/dropdown-extensions.js +0 -14
- package/esm2015/lib/modules/dropdown/dropdown-extensions.js.map +0 -1
- package/esm2015/lib/modules/dropdown/dropdown-item.component.js +0 -75
- package/esm2015/lib/modules/dropdown/dropdown-item.component.js.map +0 -1
- package/esm2015/lib/modules/dropdown/dropdown-menu.component.js +0 -311
- package/esm2015/lib/modules/dropdown/dropdown-menu.component.js.map +0 -1
- package/esm2015/lib/modules/dropdown/dropdown.component.js +0 -363
- package/esm2015/lib/modules/dropdown/dropdown.component.js.map +0 -1
- package/esm2015/lib/modules/dropdown/dropdown.module.js +0 -60
- package/esm2015/lib/modules/dropdown/dropdown.module.js.map +0 -1
- package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js +0 -2
- package/esm2015/lib/modules/dropdown/types/dropdown-horizontal-alignment.js.map +0 -1
- package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js +0 -2
- package/esm2015/lib/modules/dropdown/types/dropdown-menu-change.js.map +0 -1
- package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js +0 -40
- package/esm2015/lib/modules/dropdown/types/dropdown-message-type.js.map +0 -1
- package/esm2015/lib/modules/dropdown/types/dropdown-message.js +0 -2
- package/esm2015/lib/modules/dropdown/types/dropdown-message.js.map +0 -1
- package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js +0 -2
- package/esm2015/lib/modules/dropdown/types/dropdown-trigger-type.js.map +0 -1
- package/esm2015/lib/modules/popover/popover-adapter.service.js +0 -74
- package/esm2015/lib/modules/popover/popover-adapter.service.js.map +0 -1
- package/esm2015/lib/modules/popover/popover-animation-state.js +0 -2
- package/esm2015/lib/modules/popover/popover-animation-state.js.map +0 -1
- package/esm2015/lib/modules/popover/popover-animation.js +0 -19
- package/esm2015/lib/modules/popover/popover-animation.js.map +0 -1
- package/esm2015/lib/modules/popover/popover-content.component.js +0 -271
- package/esm2015/lib/modules/popover/popover-content.component.js.map +0 -1
- package/esm2015/lib/modules/popover/popover-context.js +0 -10
- package/esm2015/lib/modules/popover/popover-context.js.map +0 -1
- package/esm2015/lib/modules/popover/popover-extensions.js +0 -29
- package/esm2015/lib/modules/popover/popover-extensions.js.map +0 -1
- package/esm2015/lib/modules/popover/popover.component.js +0 -203
- package/esm2015/lib/modules/popover/popover.component.js.map +0 -1
- package/esm2015/lib/modules/popover/popover.directive.js +0 -176
- package/esm2015/lib/modules/popover/popover.directive.js.map +0 -1
- package/esm2015/lib/modules/popover/popover.module.js +0 -56
- package/esm2015/lib/modules/popover/popover.module.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js +0 -2
- package/esm2015/lib/modules/popover/types/popover-adapter-arrow-coordinates.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-adapter-elements.js +0 -2
- package/esm2015/lib/modules/popover/types/popover-adapter-elements.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-alignment.js +0 -2
- package/esm2015/lib/modules/popover/types/popover-alignment.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-message-type.js +0 -24
- package/esm2015/lib/modules/popover/types/popover-message-type.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-message.js +0 -2
- package/esm2015/lib/modules/popover/types/popover-message.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-placement.js +0 -2
- package/esm2015/lib/modules/popover/types/popover-placement.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-position.js +0 -2
- package/esm2015/lib/modules/popover/types/popover-position.js.map +0 -1
- package/esm2015/lib/modules/popover/types/popover-trigger.js +0 -2
- package/esm2015/lib/modules/popover/types/popover-trigger.js.map +0 -1
- package/esm2015/lib/modules/shared/sky-popovers-resources.module.js +0 -47
- package/esm2015/lib/modules/shared/sky-popovers-resources.module.js.map +0 -1
- package/esm2015/skyux-popovers.js +0 -5
- package/esm2015/skyux-popovers.js.map +0 -1
- package/esm2015/testing/dropdown/dropdown-fixture.js +0 -138
- package/esm2015/testing/dropdown/dropdown-fixture.js.map +0 -1
- package/esm2015/testing/dropdown/dropdown-testing.module.js +0 -15
- package/esm2015/testing/dropdown/dropdown-testing.module.js.map +0 -1
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js +0 -2
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-item.js.map +0 -1
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js +0 -2
- package/esm2015/testing/dropdown/popovers-fixture-dropdown-menu.js.map +0 -1
- package/esm2015/testing/dropdown/popovers-fixture-dropdown.js +0 -2
- package/esm2015/testing/dropdown/popovers-fixture-dropdown.js.map +0 -1
- package/esm2015/testing/popover/popover-fixture.js +0 -86
- package/esm2015/testing/popover/popover-fixture.js.map +0 -1
- package/esm2015/testing/popover/popover-testing.module.js +0 -29
- package/esm2015/testing/popover/popover-testing.module.js.map +0 -1
- package/esm2015/testing/public-api.js +0 -8
- package/esm2015/testing/public-api.js.map +0 -1
- package/esm2015/testing/skyux-popovers-testing.js +0 -5
- package/esm2015/testing/skyux-popovers-testing.js.map +0 -1
- package/fesm2015/skyux-popovers-testing.js.map +0 -1
- package/fesm2015/skyux-popovers.js.map +0 -1
|
@@ -0,0 +1,1705 @@
|
|
|
1
|
+
import * as i4 from '@angular/common';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { NgModule, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, ElementRef, TemplateRef, Optional, ViewChild, EventEmitter, Output, ContentChildren, Injectable, ViewContainerRef, Directive } from '@angular/core';
|
|
5
|
+
import * as i1 from '@skyux/core';
|
|
6
|
+
import { SkyAffixAutoFitContext, SkyAffixModule, SkyOverlayModule } from '@skyux/core';
|
|
7
|
+
import * as i3 from '@skyux/indicators';
|
|
8
|
+
import { SkyIconModule } from '@skyux/indicators';
|
|
9
|
+
import * as i2 from '@skyux/theme';
|
|
10
|
+
import { SkyThemeModule } from '@skyux/theme';
|
|
11
|
+
import * as i5 from '@skyux/i18n';
|
|
12
|
+
import { getLibStringForLocale, SkyI18nModule, SKY_LIB_RESOURCES_PROVIDERS } from '@skyux/i18n';
|
|
13
|
+
import { Subject, fromEvent } from 'rxjs';
|
|
14
|
+
import { takeUntil } from 'rxjs/operators';
|
|
15
|
+
import { trigger, state, style, transition, animate } from '@angular/animations';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Specifies the type of message to send.
|
|
19
|
+
*/
|
|
20
|
+
var SkyDropdownMessageType;
|
|
21
|
+
(function (SkyDropdownMessageType) {
|
|
22
|
+
/**
|
|
23
|
+
* Opens the dropdown menu.
|
|
24
|
+
*/
|
|
25
|
+
SkyDropdownMessageType[SkyDropdownMessageType["Open"] = 0] = "Open";
|
|
26
|
+
/**
|
|
27
|
+
* Closes the dropdown menu.
|
|
28
|
+
*/
|
|
29
|
+
SkyDropdownMessageType[SkyDropdownMessageType["Close"] = 1] = "Close";
|
|
30
|
+
/**
|
|
31
|
+
* Puts focus on the dropdown button.
|
|
32
|
+
*/
|
|
33
|
+
SkyDropdownMessageType[SkyDropdownMessageType["FocusTriggerButton"] = 2] = "FocusTriggerButton";
|
|
34
|
+
/**
|
|
35
|
+
* Puts focus on the next item in the dropdown menu.
|
|
36
|
+
*/
|
|
37
|
+
SkyDropdownMessageType[SkyDropdownMessageType["FocusNextItem"] = 3] = "FocusNextItem";
|
|
38
|
+
/**
|
|
39
|
+
* Puts focus on the previous item in the dropdown menu.
|
|
40
|
+
*/
|
|
41
|
+
SkyDropdownMessageType[SkyDropdownMessageType["FocusPreviousItem"] = 4] = "FocusPreviousItem";
|
|
42
|
+
/**
|
|
43
|
+
* Repositions the dropdown menu next to the dropdown button. This is useful for when the
|
|
44
|
+
* dropdown menu's width and height change while it is open.
|
|
45
|
+
*/
|
|
46
|
+
SkyDropdownMessageType[SkyDropdownMessageType["Reposition"] = 5] = "Reposition";
|
|
47
|
+
/**
|
|
48
|
+
* Puts focus on the first item in the dropdown menu.
|
|
49
|
+
*/
|
|
50
|
+
SkyDropdownMessageType[SkyDropdownMessageType["FocusFirstItem"] = 6] = "FocusFirstItem";
|
|
51
|
+
/**
|
|
52
|
+
* Puts focus on the last item in the dropdown menu.
|
|
53
|
+
*/
|
|
54
|
+
SkyDropdownMessageType[SkyDropdownMessageType["FocusLastItem"] = 7] = "FocusLastItem";
|
|
55
|
+
})(SkyDropdownMessageType || (SkyDropdownMessageType = {}));
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* NOTICE: DO NOT MODIFY THIS FILE!
|
|
59
|
+
* The contents of this file were automatically generated by
|
|
60
|
+
* the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-popovers' schematic.
|
|
61
|
+
* To update this file, simply rerun the command.
|
|
62
|
+
*/
|
|
63
|
+
const RESOURCES = {
|
|
64
|
+
'EN-US': {
|
|
65
|
+
skyux_dropdown_context_menu_default_label: { message: 'Context menu' },
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
class SkyPopoversResourcesProvider {
|
|
69
|
+
getString(localeInfo, name) {
|
|
70
|
+
return getLibStringForLocale(RESOURCES, localeInfo.locale, name);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Import into any component library module that needs to use resource strings.
|
|
75
|
+
*/
|
|
76
|
+
class SkyPopoversResourcesModule {
|
|
77
|
+
}
|
|
78
|
+
SkyPopoversResourcesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
79
|
+
SkyPopoversResourcesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, exports: [SkyI18nModule] });
|
|
80
|
+
SkyPopoversResourcesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, providers: [
|
|
81
|
+
{
|
|
82
|
+
provide: SKY_LIB_RESOURCES_PROVIDERS,
|
|
83
|
+
useClass: SkyPopoversResourcesProvider,
|
|
84
|
+
multi: true,
|
|
85
|
+
},
|
|
86
|
+
], imports: [SkyI18nModule] });
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoversResourcesModule, decorators: [{
|
|
88
|
+
type: NgModule,
|
|
89
|
+
args: [{
|
|
90
|
+
exports: [SkyI18nModule],
|
|
91
|
+
providers: [
|
|
92
|
+
{
|
|
93
|
+
provide: SKY_LIB_RESOURCES_PROVIDERS,
|
|
94
|
+
useClass: SkyPopoversResourcesProvider,
|
|
95
|
+
multi: true,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
}]
|
|
99
|
+
}] });
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Specifies the button for the dropdown menu.
|
|
103
|
+
*/
|
|
104
|
+
class SkyDropdownButtonComponent {
|
|
105
|
+
}
|
|
106
|
+
SkyDropdownButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
107
|
+
SkyDropdownButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyDropdownButtonComponent, selector: "sky-dropdown-button", ngImport: i0, template: "<ng-content></ng-content>\n" });
|
|
108
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownButtonComponent, decorators: [{
|
|
109
|
+
type: Component,
|
|
110
|
+
args: [{ selector: 'sky-dropdown-button', template: "<ng-content></ng-content>\n" }]
|
|
111
|
+
}] });
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Specifies the items to display on the dropdown menu.
|
|
115
|
+
*/
|
|
116
|
+
class SkyDropdownItemComponent {
|
|
117
|
+
constructor(elementRef, changeDetector, renderer) {
|
|
118
|
+
this.elementRef = elementRef;
|
|
119
|
+
this.changeDetector = changeDetector;
|
|
120
|
+
this.renderer = renderer;
|
|
121
|
+
this.isActive = false;
|
|
122
|
+
this.isDisabled = false;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Specifies an ARIA role for the dropdown menu item
|
|
126
|
+
* [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
|
|
127
|
+
* by indicating how the item functions and what it controls. For information about
|
|
128
|
+
* how an ARIA role indicates what an item represents on a web page, see the
|
|
129
|
+
* [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
|
|
130
|
+
* @default "menuitem"
|
|
131
|
+
*/
|
|
132
|
+
set ariaRole(value) {
|
|
133
|
+
this._ariaRole = value;
|
|
134
|
+
}
|
|
135
|
+
get ariaRole() {
|
|
136
|
+
return this._ariaRole || 'menuitem';
|
|
137
|
+
}
|
|
138
|
+
get buttonElement() {
|
|
139
|
+
return this.elementRef.nativeElement.querySelector('button,a');
|
|
140
|
+
}
|
|
141
|
+
ngAfterViewInit() {
|
|
142
|
+
this.isDisabled = !this.isFocusable();
|
|
143
|
+
// Make sure anchor elements are tab-able.
|
|
144
|
+
const buttonElement = this.buttonElement;
|
|
145
|
+
/* istanbul ignore else */
|
|
146
|
+
if (buttonElement) {
|
|
147
|
+
this.renderer.setAttribute(buttonElement, 'tabIndex', '0');
|
|
148
|
+
}
|
|
149
|
+
this.changeDetector.detectChanges();
|
|
150
|
+
}
|
|
151
|
+
focusElement(enableNativeFocus) {
|
|
152
|
+
this.isActive = true;
|
|
153
|
+
if (enableNativeFocus) {
|
|
154
|
+
this.buttonElement.focus();
|
|
155
|
+
}
|
|
156
|
+
this.changeDetector.detectChanges();
|
|
157
|
+
}
|
|
158
|
+
isFocusable() {
|
|
159
|
+
/*tslint:disable no-null-keyword */
|
|
160
|
+
const isFocusable = this.buttonElement &&
|
|
161
|
+
this.buttonElement.getAttribute('disabled') === null;
|
|
162
|
+
/*tslint:enable */
|
|
163
|
+
return isFocusable;
|
|
164
|
+
}
|
|
165
|
+
resetState() {
|
|
166
|
+
this.isActive = false;
|
|
167
|
+
this.changeDetector.markForCheck();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
SkyDropdownItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownItemComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
171
|
+
SkyDropdownItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyDropdownItemComponent, selector: "sky-dropdown-item", inputs: { ariaRole: "ariaRole" }, ngImport: i0, template: "<div\n class=\"sky-dropdown-item\"\n [attr.role]=\"ariaRole\"\n [ngClass]=\"{\n 'sky-dropdown-item-active': isActive,\n 'sky-dropdown-item-disabled': isDisabled\n }\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left}.sky-dropdown-item.sky-dropdown-item-active,.sky-dropdown-item:hover{background-color:#eeeeef}.sky-dropdown-item.sky-dropdown-item-disabled{cursor:default}.sky-dropdown-item.sky-dropdown-item-disabled:hover{background-color:transparent}.sky-dropdown-item>a,.sky-dropdown-item>button{background-color:transparent;border:none;color:#212327;cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-dropdown-item>a:hover,.sky-dropdown-item>button:hover{text-decoration:none}.sky-dropdown-item>a[disabled],.sky-dropdown-item>button[disabled]{color:#686c73}.sky-dropdown-item>a[disabled]:hover,.sky-dropdown-item>button[disabled]:hover{cursor:default}.sky-theme-modern .sky-dropdown-item{margin:0}.sky-theme-modern .sky-dropdown-item.sky-dropdown-item-active,.sky-theme-modern .sky-dropdown-item:hover{background-color:transparent}.sky-theme-modern .sky-dropdown-item>a,.sky-theme-modern .sky-dropdown-item>button{padding:8px 20px;transition:box-shadow .15s}.sky-theme-modern .sky-dropdown-item>a:hover,.sky-theme-modern .sky-dropdown-item>button:hover{outline:solid 1px #1870B8;outline-offset:-1px}.sky-theme-modern .sky-dropdown-item>a:focus,.sky-theme-modern .sky-dropdown-item>a:active,.sky-theme-modern .sky-dropdown-item>button:focus,.sky-theme-modern .sky-dropdown-item>button:active{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern .sky-dropdown-item>a:focus:not(:active),.sky-theme-modern .sky-dropdown-item>button:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>a,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>button{color:#fbfcfe}\n"], directives: [{ type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
172
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownItemComponent, decorators: [{
|
|
173
|
+
type: Component,
|
|
174
|
+
args: [{ selector: 'sky-dropdown-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-dropdown-item\"\n [attr.role]=\"ariaRole\"\n [ngClass]=\"{\n 'sky-dropdown-item-active': isActive,\n 'sky-dropdown-item-disabled': isDisabled\n }\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left}.sky-dropdown-item.sky-dropdown-item-active,.sky-dropdown-item:hover{background-color:#eeeeef}.sky-dropdown-item.sky-dropdown-item-disabled{cursor:default}.sky-dropdown-item.sky-dropdown-item-disabled:hover{background-color:transparent}.sky-dropdown-item>a,.sky-dropdown-item>button{background-color:transparent;border:none;color:#212327;cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-dropdown-item>a:hover,.sky-dropdown-item>button:hover{text-decoration:none}.sky-dropdown-item>a[disabled],.sky-dropdown-item>button[disabled]{color:#686c73}.sky-dropdown-item>a[disabled]:hover,.sky-dropdown-item>button[disabled]:hover{cursor:default}.sky-theme-modern .sky-dropdown-item{margin:0}.sky-theme-modern .sky-dropdown-item.sky-dropdown-item-active,.sky-theme-modern .sky-dropdown-item:hover{background-color:transparent}.sky-theme-modern .sky-dropdown-item>a,.sky-theme-modern .sky-dropdown-item>button{padding:8px 20px;transition:box-shadow .15s}.sky-theme-modern .sky-dropdown-item>a:hover,.sky-theme-modern .sky-dropdown-item>button:hover{outline:solid 1px #1870B8;outline-offset:-1px}.sky-theme-modern .sky-dropdown-item>a:focus,.sky-theme-modern .sky-dropdown-item>a:active,.sky-theme-modern .sky-dropdown-item>button:focus,.sky-theme-modern .sky-dropdown-item>button:active{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern .sky-dropdown-item>a:focus:not(:active),.sky-theme-modern .sky-dropdown-item>button:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>a,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-item>button{color:#fbfcfe}\n"] }]
|
|
175
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { ariaRole: [{
|
|
176
|
+
type: Input
|
|
177
|
+
}] } });
|
|
178
|
+
|
|
179
|
+
function parseAffixHorizontalAlignment$1(alignment) {
|
|
180
|
+
switch (alignment) {
|
|
181
|
+
case 'center':
|
|
182
|
+
return 'center';
|
|
183
|
+
case 'left':
|
|
184
|
+
return 'left';
|
|
185
|
+
case 'right':
|
|
186
|
+
return 'right';
|
|
187
|
+
/* istanbul ignore next */
|
|
188
|
+
default:
|
|
189
|
+
throw `SkyAffixHorizontalAlignment does not have a matching value for '${alignment}'!`;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Creates a dropdown menu that displays menu items that users may select.
|
|
195
|
+
*/
|
|
196
|
+
class SkyDropdownComponent {
|
|
197
|
+
constructor(changeDetector, affixService, overlayService, themeSvc) {
|
|
198
|
+
this.changeDetector = changeDetector;
|
|
199
|
+
this.affixService = affixService;
|
|
200
|
+
this.overlayService = overlayService;
|
|
201
|
+
this.themeSvc = themeSvc;
|
|
202
|
+
/**
|
|
203
|
+
* Provides an observable to send commands to the dropdown. The commands should respect
|
|
204
|
+
* the [[SkyDropdownMessage]] type.
|
|
205
|
+
*/
|
|
206
|
+
this.messageStream = new Subject();
|
|
207
|
+
this.isMouseEnter = false;
|
|
208
|
+
this.isVisible = false;
|
|
209
|
+
this.ngUnsubscribe = new Subject();
|
|
210
|
+
this._isOpen = false;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Specifies a background color for the dropdown button. Available values are `default` and
|
|
214
|
+
* `primary`. These values set the background color from the
|
|
215
|
+
* [secondary and primary button classes](https://developer.blackbaud.com/skyux/components/button) respectively.
|
|
216
|
+
* @default "default"
|
|
217
|
+
*/
|
|
218
|
+
set buttonStyle(value) {
|
|
219
|
+
this._buttonStyle = value;
|
|
220
|
+
}
|
|
221
|
+
get buttonStyle() {
|
|
222
|
+
return this._buttonStyle || 'default';
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Specifies the type of button to render as the dropdown's trigger element. To display a button
|
|
226
|
+
* with text and a caret, specify `select` and then enter the button text in a
|
|
227
|
+
* `sky-dropdown-button` element. To display a round button with an ellipsis, specify
|
|
228
|
+
* `context-menu`. And to display a button with a [Font Awesome icon](http://fontawesome.io/icons/), specify the icon's class name.
|
|
229
|
+
* For example, to display the `fa-filter` icon, specify `filter`.
|
|
230
|
+
* @default "select"
|
|
231
|
+
*/
|
|
232
|
+
set buttonType(value) {
|
|
233
|
+
this._buttonType = value;
|
|
234
|
+
}
|
|
235
|
+
get buttonType() {
|
|
236
|
+
return this._buttonType || 'select';
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Indicates whether to disable the dropdown button.
|
|
240
|
+
* @default false
|
|
241
|
+
*/
|
|
242
|
+
set disabled(value) {
|
|
243
|
+
this._disabled = value;
|
|
244
|
+
}
|
|
245
|
+
get disabled() {
|
|
246
|
+
return this._disabled || false;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Indicates whether to close the dropdown when users click away from the menu.
|
|
250
|
+
* @default true
|
|
251
|
+
*/
|
|
252
|
+
set dismissOnBlur(value) {
|
|
253
|
+
this._dismissOnBlur = value;
|
|
254
|
+
}
|
|
255
|
+
get dismissOnBlur() {
|
|
256
|
+
if (this._dismissOnBlur === undefined) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
return this._dismissOnBlur;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Specifies the horizontal alignment of the dropdown menu in relation to the dropdown button.
|
|
263
|
+
* @default "left"
|
|
264
|
+
*/
|
|
265
|
+
set horizontalAlignment(value) {
|
|
266
|
+
this._horizontalAlignment = value;
|
|
267
|
+
}
|
|
268
|
+
get horizontalAlignment() {
|
|
269
|
+
return this._horizontalAlignment || 'left';
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Specifies how users interact with the dropdown button to expose the dropdown menu.
|
|
273
|
+
* We recommend the default `click` value because the `hover` value can pose
|
|
274
|
+
* [accessibility](https://developer.blackbaud.com/skyux/learn/accessibility) issues
|
|
275
|
+
* for users on touch devices such as phones and tablets.
|
|
276
|
+
* @deprecated We recommend against using this property. If you choose to use the deprecated
|
|
277
|
+
* `hover` value anyway, we recommend that you not use it in combination with the `title`
|
|
278
|
+
* property. (This property will be removed in the next major version release.)
|
|
279
|
+
* @default "click"
|
|
280
|
+
*/
|
|
281
|
+
set trigger(value) {
|
|
282
|
+
this._trigger = value;
|
|
283
|
+
}
|
|
284
|
+
get trigger() {
|
|
285
|
+
return this._trigger || 'click';
|
|
286
|
+
}
|
|
287
|
+
set isOpen(value) {
|
|
288
|
+
this._isOpen = value;
|
|
289
|
+
this.changeDetector.markForCheck();
|
|
290
|
+
}
|
|
291
|
+
get isOpen() {
|
|
292
|
+
return this._isOpen || false;
|
|
293
|
+
}
|
|
294
|
+
set menuContainerElementRef(value) {
|
|
295
|
+
if (value) {
|
|
296
|
+
this._menuContainerElementRef = value;
|
|
297
|
+
this.destroyAffixer();
|
|
298
|
+
this.createAffixer();
|
|
299
|
+
this.changeDetector.markForCheck();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
get menuContainerElementRef() {
|
|
303
|
+
return this._menuContainerElementRef;
|
|
304
|
+
}
|
|
305
|
+
ngOnInit() {
|
|
306
|
+
var _a;
|
|
307
|
+
this.addEventListeners();
|
|
308
|
+
this.messageStream
|
|
309
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
310
|
+
.subscribe((message) => {
|
|
311
|
+
this.handleIncomingMessages(message);
|
|
312
|
+
});
|
|
313
|
+
// Load proper icons on theme change.
|
|
314
|
+
(_a = this.themeSvc) === null || _a === void 0 ? void 0 : _a.settingsChange.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
315
|
+
this.changeDetector.markForCheck();
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
ngOnDestroy() {
|
|
319
|
+
this.destroyAffixer();
|
|
320
|
+
this.destroyOverlay();
|
|
321
|
+
clearTimeout(this._positionTimeout);
|
|
322
|
+
this.ngUnsubscribe.next();
|
|
323
|
+
this.ngUnsubscribe.complete();
|
|
324
|
+
this.ngUnsubscribe = undefined;
|
|
325
|
+
}
|
|
326
|
+
addEventListeners() {
|
|
327
|
+
const buttonElement = this.triggerButton.nativeElement;
|
|
328
|
+
fromEvent(buttonElement, 'click')
|
|
329
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
330
|
+
.subscribe(() => {
|
|
331
|
+
if (this.isOpen) {
|
|
332
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
this.sendMessage(SkyDropdownMessageType.Open);
|
|
336
|
+
// Wait for dropdown to open, then set focus on first item.
|
|
337
|
+
setTimeout(() => {
|
|
338
|
+
this.sendMessage(SkyDropdownMessageType.FocusFirstItem);
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
fromEvent(buttonElement, 'keydown')
|
|
343
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
344
|
+
.subscribe((event) => {
|
|
345
|
+
const key = event.key.toLowerCase();
|
|
346
|
+
/* tslint:disable-next-line:switch-default */
|
|
347
|
+
switch (key) {
|
|
348
|
+
case 'escape':
|
|
349
|
+
/*istanbul ignore else*/
|
|
350
|
+
if (this.isOpen) {
|
|
351
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
352
|
+
this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
353
|
+
event.stopPropagation();
|
|
354
|
+
}
|
|
355
|
+
break;
|
|
356
|
+
case 'tab':
|
|
357
|
+
if (this.isOpen && this.dismissOnBlur) {
|
|
358
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
359
|
+
}
|
|
360
|
+
break;
|
|
361
|
+
case 'arrowup':
|
|
362
|
+
case 'up':
|
|
363
|
+
if (!this.isOpen) {
|
|
364
|
+
this.sendMessage(SkyDropdownMessageType.Open);
|
|
365
|
+
this.sendMessage(SkyDropdownMessageType.FocusLastItem);
|
|
366
|
+
event.preventDefault();
|
|
367
|
+
event.stopPropagation();
|
|
368
|
+
}
|
|
369
|
+
break;
|
|
370
|
+
case 'enter':
|
|
371
|
+
case 'arrowdown':
|
|
372
|
+
case 'down':
|
|
373
|
+
case ' ': // Spacebar.
|
|
374
|
+
/*istanbul ignore else*/
|
|
375
|
+
if (!this.isOpen) {
|
|
376
|
+
this.sendMessage(SkyDropdownMessageType.Open);
|
|
377
|
+
this.sendMessage(SkyDropdownMessageType.FocusFirstItem);
|
|
378
|
+
event.preventDefault();
|
|
379
|
+
event.stopPropagation();
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
fromEvent(buttonElement, 'mouseenter')
|
|
385
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
386
|
+
.subscribe(() => {
|
|
387
|
+
this.isMouseEnter = true;
|
|
388
|
+
if (this.trigger === 'hover') {
|
|
389
|
+
this.sendMessage(SkyDropdownMessageType.Open);
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
fromEvent(buttonElement, 'mouseleave')
|
|
393
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
394
|
+
.subscribe(() => {
|
|
395
|
+
this.isMouseEnter = false;
|
|
396
|
+
if (this.trigger === 'hover') {
|
|
397
|
+
// Allow the dropdown menu to set isMouseEnter before checking if the close action
|
|
398
|
+
// should be taken.
|
|
399
|
+
setTimeout(() => {
|
|
400
|
+
if (!this.isMouseEnter) {
|
|
401
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
createOverlay() {
|
|
408
|
+
if (this.overlay) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
const overlay = this.overlayService.create({
|
|
412
|
+
enableScroll: true,
|
|
413
|
+
enablePointerEvents: true,
|
|
414
|
+
});
|
|
415
|
+
overlay.attachTemplate(this.menuContainerTemplateRef);
|
|
416
|
+
overlay.backdropClick.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
417
|
+
if (this.dismissOnBlur) {
|
|
418
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
this.overlay = overlay;
|
|
422
|
+
}
|
|
423
|
+
destroyAffixer() {
|
|
424
|
+
/*istanbul ignore else*/
|
|
425
|
+
if (this.affixer) {
|
|
426
|
+
this.affixer.destroy();
|
|
427
|
+
this.affixer = undefined;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
destroyOverlay() {
|
|
431
|
+
/*istanbul ignore else*/
|
|
432
|
+
if (this.overlay) {
|
|
433
|
+
this.overlayService.close(this.overlay);
|
|
434
|
+
this.overlay = undefined;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
createAffixer() {
|
|
438
|
+
const affixer = this.affixService.createAffixer(this.menuContainerElementRef);
|
|
439
|
+
affixer.placementChange
|
|
440
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
441
|
+
.subscribe((change) => {
|
|
442
|
+
this.isVisible = change.placement !== null;
|
|
443
|
+
this.changeDetector.markForCheck();
|
|
444
|
+
});
|
|
445
|
+
this.affixer = affixer;
|
|
446
|
+
}
|
|
447
|
+
handleIncomingMessages(message) {
|
|
448
|
+
if (!this.disabled) {
|
|
449
|
+
/* tslint:disable-next-line:switch-default */
|
|
450
|
+
switch (message.type) {
|
|
451
|
+
case SkyDropdownMessageType.Open:
|
|
452
|
+
this.isOpen = true;
|
|
453
|
+
this.positionDropdownMenu();
|
|
454
|
+
break;
|
|
455
|
+
case SkyDropdownMessageType.Close:
|
|
456
|
+
this.isOpen = false;
|
|
457
|
+
this.destroyOverlay();
|
|
458
|
+
break;
|
|
459
|
+
case SkyDropdownMessageType.Reposition:
|
|
460
|
+
// Only reposition the dropdown if it is already open.
|
|
461
|
+
/* istanbul ignore else */
|
|
462
|
+
if (this.isOpen && this.affixer) {
|
|
463
|
+
this.affixer.reaffix();
|
|
464
|
+
}
|
|
465
|
+
break;
|
|
466
|
+
case SkyDropdownMessageType.FocusTriggerButton:
|
|
467
|
+
this.triggerButton.nativeElement.focus();
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
sendMessage(type) {
|
|
473
|
+
this.messageStream.next({ type });
|
|
474
|
+
}
|
|
475
|
+
positionDropdownMenu() {
|
|
476
|
+
this.isVisible = false;
|
|
477
|
+
this.createOverlay();
|
|
478
|
+
this.changeDetector.markForCheck();
|
|
479
|
+
// Explicitly declare the `setTimeout` from the `window` object in order to use the DOM typings
|
|
480
|
+
// during a unit test (instead of confusing this with Node's `setTimeout`).
|
|
481
|
+
this._positionTimeout = window.setTimeout(() => {
|
|
482
|
+
this.affixer.affixTo(this.triggerButton.nativeElement, {
|
|
483
|
+
autoFitContext: SkyAffixAutoFitContext.Viewport,
|
|
484
|
+
enableAutoFit: true,
|
|
485
|
+
horizontalAlignment: parseAffixHorizontalAlignment$1(this.horizontalAlignment),
|
|
486
|
+
isSticky: true,
|
|
487
|
+
placement: 'below',
|
|
488
|
+
});
|
|
489
|
+
this.isVisible = true;
|
|
490
|
+
this.changeDetector.markForCheck();
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
SkyDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyAffixService }, { token: i1.SkyOverlayService }, { token: i2.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
495
|
+
SkyDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyDropdownComponent, selector: "sky-dropdown", inputs: { buttonStyle: "buttonStyle", buttonType: "buttonType", disabled: "disabled", dismissOnBlur: "dismissOnBlur", label: "label", horizontalAlignment: "horizontalAlignment", messageStream: "messageStream", title: "title", trigger: "trigger" }, viewQueries: [{ propertyName: "menuContainerElementRef", first: true, predicate: ["menuContainerElementRef"], descendants: true, read: ElementRef }, { propertyName: "menuContainerTemplateRef", first: true, predicate: ["menuContainerTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<div class=\"sky-dropdown\">\n <button\n class=\"sky-btn sky-dropdown-button\"\n type=\"button\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"isOpen ? menuId : null\"\n [attr.aria-haspopup]=\"menuAriaRole\"\n [attr.aria-label]=\"\n label || ('skyux_dropdown_context_menu_default_label' | skyLibResources)\n \"\n [attr.title]=\"title\"\n [disabled]=\"disabled\"\n [ngClass]=\"[\n 'sky-dropdown-button-type-' + buttonType,\n 'sky-btn-' + buttonStyle\n ]\"\n #triggerButton\n >\n <ng-container [ngSwitch]=\"buttonType\">\n <ng-template ngSwitchCase=\"context-menu\">\n <sky-icon *skyThemeIf=\"'default'\" icon=\"ellipsis-h\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"ellipsis\"\n iconType=\"skyux\"\n ></sky-icon>\n </ng-template>\n\n <ng-template ngSwitchDefault>\n <div\n *ngIf=\"buttonType === 'select' || buttonType === 'tab' || !buttonType\"\n class=\"sky-dropdown-button-container\"\n >\n <div class=\"sky-dropdown-button-content-container\">\n <ng-content select=\"sky-dropdown-button\"> </ng-content>\n </div>\n <div class=\"sky-dropdown-button-icon-container\">\n <sky-icon\n *skyThemeIf=\"'default'\"\n class=\"sky-dropdown-caret\"\n icon=\"caret-down\"\n >\n </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n class=\"sky-dropdown-caret\"\n icon=\"chevron-down\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </div>\n </div>\n <div\n *ngIf=\"buttonType !== 'select' && buttonType !== 'tab' && buttonType\"\n >\n <sky-icon [icon]=\"buttonType\" size=\"lg\"></sky-icon>\n </div>\n </ng-template>\n </ng-container>\n </button>\n</div>\n\n<ng-template #menuContainerTemplateRef>\n <div\n class=\"sky-dropdown-menu-container\"\n [class.hidden]=\"!isVisible\"\n #menuContainerElementRef\n >\n <ng-content select=\"sky-dropdown-menu\"></ng-content>\n </div>\n</ng-template>\n", styles: [".sky-dropdown-button-type-tab{background-color:transparent;border:none;border-radius:4px 4px 0 0;color:#686c73;cursor:pointer;display:inline-block;font-weight:600;line-height:1.8;padding:8px 16px;background-color:#0974a1;color:#fff;max-width:100%;text-align:left}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#eeeeef;color:#212327;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled{background-color:#cdcfd2;cursor:default;outline:none;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled:hover{color:#686c73;cursor:default;text-decoration:none}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#0974a1;color:#fff}.sky-dropdown-button-type-context-menu{border-radius:50%;padding:3px 8px}.sky-dropdown-caret{margin-left:10px}.sky-dropdown-button-container{display:flex}.sky-dropdown-button-content-container{flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.sky-dropdown-button-icon-container{flex-grow:1}.sky-dropdown-menu-container{position:fixed}.hidden{visibility:hidden}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}:host-context(.sky-theme-modern) .sky-dropdown-caret{margin-left:10px}.sky-theme-modern .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}.sky-theme-modern .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}.sky-theme-modern .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}.sky-theme-modern .sky-dropdown-caret{margin-left:10px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab:hover{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab:hover{color:#fff}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}\n"], components: [{ type: i3.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i2.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "skyLibResources": i5.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
496
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownComponent, decorators: [{
|
|
497
|
+
type: Component,
|
|
498
|
+
args: [{ selector: 'sky-dropdown', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-dropdown\">\n <button\n class=\"sky-btn sky-dropdown-button\"\n type=\"button\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"isOpen ? menuId : null\"\n [attr.aria-haspopup]=\"menuAriaRole\"\n [attr.aria-label]=\"\n label || ('skyux_dropdown_context_menu_default_label' | skyLibResources)\n \"\n [attr.title]=\"title\"\n [disabled]=\"disabled\"\n [ngClass]=\"[\n 'sky-dropdown-button-type-' + buttonType,\n 'sky-btn-' + buttonStyle\n ]\"\n #triggerButton\n >\n <ng-container [ngSwitch]=\"buttonType\">\n <ng-template ngSwitchCase=\"context-menu\">\n <sky-icon *skyThemeIf=\"'default'\" icon=\"ellipsis-h\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"ellipsis\"\n iconType=\"skyux\"\n ></sky-icon>\n </ng-template>\n\n <ng-template ngSwitchDefault>\n <div\n *ngIf=\"buttonType === 'select' || buttonType === 'tab' || !buttonType\"\n class=\"sky-dropdown-button-container\"\n >\n <div class=\"sky-dropdown-button-content-container\">\n <ng-content select=\"sky-dropdown-button\"> </ng-content>\n </div>\n <div class=\"sky-dropdown-button-icon-container\">\n <sky-icon\n *skyThemeIf=\"'default'\"\n class=\"sky-dropdown-caret\"\n icon=\"caret-down\"\n >\n </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n class=\"sky-dropdown-caret\"\n icon=\"chevron-down\"\n iconType=\"skyux\"\n >\n </sky-icon>\n </div>\n </div>\n <div\n *ngIf=\"buttonType !== 'select' && buttonType !== 'tab' && buttonType\"\n >\n <sky-icon [icon]=\"buttonType\" size=\"lg\"></sky-icon>\n </div>\n </ng-template>\n </ng-container>\n </button>\n</div>\n\n<ng-template #menuContainerTemplateRef>\n <div\n class=\"sky-dropdown-menu-container\"\n [class.hidden]=\"!isVisible\"\n #menuContainerElementRef\n >\n <ng-content select=\"sky-dropdown-menu\"></ng-content>\n </div>\n</ng-template>\n", styles: [".sky-dropdown-button-type-tab{background-color:transparent;border:none;border-radius:4px 4px 0 0;color:#686c73;cursor:pointer;display:inline-block;font-weight:600;line-height:1.8;padding:8px 16px;background-color:#0974a1;color:#fff;max-width:100%;text-align:left}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#eeeeef;color:#212327;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled{background-color:#cdcfd2;cursor:default;outline:none;text-decoration:none}.sky-dropdown-button-type-tab.sky-btn-tab-disabled:hover{color:#686c73;cursor:default;text-decoration:none}.sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:#0974a1;color:#fff}.sky-dropdown-button-type-context-menu{border-radius:50%;padding:3px 8px}.sky-dropdown-caret{margin-left:10px}.sky-dropdown-button-container{display:flex}.sky-dropdown-button-content-container{flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.sky-dropdown-button-icon-container{flex-grow:1}.sky-dropdown-menu-container{position:fixed}.hidden{visibility:hidden}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}:host-context(.sky-theme-modern) .sky-dropdown-caret{margin-left:10px}.sky-theme-modern .sky-dropdown-button-type-tab{border:none;border-radius:0;font-weight:400;padding:10px 15px;transition:box-shadow .15s;background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus){background-color:transparent;border-bottom:solid 1px #00b4f1;padding-bottom:9px}.sky-theme-modern .sky-dropdown-button-type-tab:focus{background-color:transparent;outline:none}.sky-theme-modern .sky-dropdown-button-type-tab:focus:not(:active){outline:solid 2px #1870B8;outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-dropdown-button-type-tab:active{border-bottom:solid 3px #00b4f1;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:not(:active){border-bottom:solid 3px #1870B8;padding-bottom:7px}.sky-theme-modern .sky-dropdown-button-type-tab:hover:not(.sky-btn-tab-disabled){background-color:transparent;color:#212327}.sky-theme-modern .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern .sky-dropdown-button-type-tab .sky-tab-header-count{color:#686c73}.sky-theme-modern .sky-dropdown-caret{margin-left:10px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab:hover{color:#fff}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-btn-tab-close,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab:hover{color:#fff}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-btn-tab-close,.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-button-type-tab .sky-tab-header-count{color:#efefef}\n"] }]
|
|
499
|
+
}], ctorParameters: function () {
|
|
500
|
+
return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyAffixService }, { type: i1.SkyOverlayService }, { type: i2.SkyThemeService, decorators: [{
|
|
501
|
+
type: Optional
|
|
502
|
+
}] }];
|
|
503
|
+
}, propDecorators: { buttonStyle: [{
|
|
504
|
+
type: Input
|
|
505
|
+
}], buttonType: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], disabled: [{
|
|
508
|
+
type: Input
|
|
509
|
+
}], dismissOnBlur: [{
|
|
510
|
+
type: Input
|
|
511
|
+
}], label: [{
|
|
512
|
+
type: Input
|
|
513
|
+
}], horizontalAlignment: [{
|
|
514
|
+
type: Input
|
|
515
|
+
}], messageStream: [{
|
|
516
|
+
type: Input
|
|
517
|
+
}], title: [{
|
|
518
|
+
type: Input
|
|
519
|
+
}], trigger: [{
|
|
520
|
+
type: Input
|
|
521
|
+
}], menuContainerElementRef: [{
|
|
522
|
+
type: ViewChild,
|
|
523
|
+
args: ['menuContainerElementRef', {
|
|
524
|
+
read: ElementRef,
|
|
525
|
+
}]
|
|
526
|
+
}], menuContainerTemplateRef: [{
|
|
527
|
+
type: ViewChild,
|
|
528
|
+
args: ['menuContainerTemplateRef', {
|
|
529
|
+
read: TemplateRef,
|
|
530
|
+
static: true,
|
|
531
|
+
}]
|
|
532
|
+
}], triggerButton: [{
|
|
533
|
+
type: ViewChild,
|
|
534
|
+
args: ['triggerButton', {
|
|
535
|
+
read: ElementRef,
|
|
536
|
+
static: true,
|
|
537
|
+
}]
|
|
538
|
+
}] } });
|
|
539
|
+
|
|
540
|
+
let nextId = 0;
|
|
541
|
+
/**
|
|
542
|
+
* Creates a menu that contains dropdown menu items.
|
|
543
|
+
*
|
|
544
|
+
*/
|
|
545
|
+
class SkyDropdownMenuComponent {
|
|
546
|
+
constructor(changeDetector, elementRef, dropdownComponent) {
|
|
547
|
+
this.changeDetector = changeDetector;
|
|
548
|
+
this.elementRef = elementRef;
|
|
549
|
+
this.dropdownComponent = dropdownComponent;
|
|
550
|
+
/**
|
|
551
|
+
* Fires when the dropdown menu's active index or selected item changes. This event provides an
|
|
552
|
+
* observable to emit changes, and the response is of
|
|
553
|
+
* the SkyDropdownMenuChange type.
|
|
554
|
+
*/
|
|
555
|
+
this.menuChanges = new EventEmitter();
|
|
556
|
+
this.dropdownMenuId = `sky-dropdown-menu-${++nextId}`;
|
|
557
|
+
this.ngUnsubscribe = new Subject();
|
|
558
|
+
this._menuIndex = 0;
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Specifies an ARIA role for the dropdown menu
|
|
562
|
+
* [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
|
|
563
|
+
* by indicating how the dropdown menu functions and what it controls. The dropdown button
|
|
564
|
+
* inherits this value to set its `aria-haspopup` property. For information
|
|
565
|
+
* about how an ARIA role indicates what an item represents on a web page, see the
|
|
566
|
+
* [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
|
|
567
|
+
* @default "menu"
|
|
568
|
+
*/
|
|
569
|
+
set ariaRole(value) {
|
|
570
|
+
this._ariaRole = value;
|
|
571
|
+
}
|
|
572
|
+
get ariaRole() {
|
|
573
|
+
return this._ariaRole || 'menu';
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Indicates whether to use the browser's native focus function when users navigate through menu
|
|
577
|
+
* items with the keyboard. To disable the native focus function, set this property to `false`.
|
|
578
|
+
* For example, to let users interact with the dropdown menu but keep the keyboard focus on a
|
|
579
|
+
* different element, set this property to `false`.
|
|
580
|
+
* @default true
|
|
581
|
+
*/
|
|
582
|
+
set useNativeFocus(value) {
|
|
583
|
+
this._useNativeFocus = value;
|
|
584
|
+
}
|
|
585
|
+
get useNativeFocus() {
|
|
586
|
+
if (this._useNativeFocus === undefined) {
|
|
587
|
+
return true;
|
|
588
|
+
}
|
|
589
|
+
return this._useNativeFocus;
|
|
590
|
+
}
|
|
591
|
+
get hasFocusableItems() {
|
|
592
|
+
const found = this.menuItems.find((item) => item.isFocusable());
|
|
593
|
+
return found !== undefined;
|
|
594
|
+
}
|
|
595
|
+
set menuIndex(value) {
|
|
596
|
+
if (value < 0) {
|
|
597
|
+
value = this.menuItems.length - 1;
|
|
598
|
+
}
|
|
599
|
+
if (value >= this.menuItems.length) {
|
|
600
|
+
value = 0;
|
|
601
|
+
}
|
|
602
|
+
this._menuIndex = value;
|
|
603
|
+
}
|
|
604
|
+
get menuIndex() {
|
|
605
|
+
return this._menuIndex;
|
|
606
|
+
}
|
|
607
|
+
ngAfterContentInit() {
|
|
608
|
+
/* istanbul ignore else */
|
|
609
|
+
if (this.dropdownComponent) {
|
|
610
|
+
this.dropdownComponent.menuId = this.dropdownMenuId;
|
|
611
|
+
this.dropdownComponent.menuAriaRole = this.ariaRole;
|
|
612
|
+
this.dropdownComponent.messageStream
|
|
613
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
614
|
+
.subscribe((message) => {
|
|
615
|
+
/* tslint:disable-next-line:switch-default */
|
|
616
|
+
switch (message.type) {
|
|
617
|
+
case SkyDropdownMessageType.Open:
|
|
618
|
+
case SkyDropdownMessageType.Close:
|
|
619
|
+
this.reset();
|
|
620
|
+
break;
|
|
621
|
+
case SkyDropdownMessageType.FocusFirstItem:
|
|
622
|
+
this.focusFirstItem();
|
|
623
|
+
break;
|
|
624
|
+
case SkyDropdownMessageType.FocusNextItem:
|
|
625
|
+
this.focusNextItem();
|
|
626
|
+
break;
|
|
627
|
+
case SkyDropdownMessageType.FocusPreviousItem:
|
|
628
|
+
this.focusPreviousItem();
|
|
629
|
+
break;
|
|
630
|
+
case SkyDropdownMessageType.FocusLastItem:
|
|
631
|
+
this.focusLastItem();
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
});
|
|
635
|
+
this.menuChanges
|
|
636
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
637
|
+
.subscribe((change) => {
|
|
638
|
+
// Close the dropdown when a menu item is selected.
|
|
639
|
+
if (change.selectedItem) {
|
|
640
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
641
|
+
this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
642
|
+
}
|
|
643
|
+
if (change.items) {
|
|
644
|
+
// Update the popover style and position whenever the number of items changes.
|
|
645
|
+
this.sendMessage(SkyDropdownMessageType.Reposition);
|
|
646
|
+
}
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
// Reset dropdown whenever the menu items change.
|
|
650
|
+
this.menuItems.changes
|
|
651
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
652
|
+
.subscribe((items) => {
|
|
653
|
+
this.reset();
|
|
654
|
+
this.menuChanges.emit({
|
|
655
|
+
items: items.toArray(),
|
|
656
|
+
});
|
|
657
|
+
});
|
|
658
|
+
this.addEventListeners();
|
|
659
|
+
}
|
|
660
|
+
ngOnDestroy() {
|
|
661
|
+
this.ngUnsubscribe.next();
|
|
662
|
+
this.ngUnsubscribe.complete();
|
|
663
|
+
this.ngUnsubscribe = undefined;
|
|
664
|
+
}
|
|
665
|
+
focusFirstItem() {
|
|
666
|
+
if (!this.hasFocusableItems) {
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
this.menuIndex = 0;
|
|
670
|
+
const firstItem = this.getItemByIndex(this.menuIndex);
|
|
671
|
+
if (firstItem && firstItem.isFocusable()) {
|
|
672
|
+
this.focusItem(firstItem);
|
|
673
|
+
}
|
|
674
|
+
else {
|
|
675
|
+
this.focusNextItem();
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
focusLastItem() {
|
|
679
|
+
if (!this.hasFocusableItems) {
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
this.menuIndex = this.menuItems.length - 1;
|
|
683
|
+
const lastItem = this.getItemByIndex(this.menuIndex);
|
|
684
|
+
if (lastItem && lastItem.isFocusable()) {
|
|
685
|
+
this.focusItem(lastItem);
|
|
686
|
+
}
|
|
687
|
+
else {
|
|
688
|
+
this.focusPreviousItem();
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
focusPreviousItem() {
|
|
692
|
+
if (!this.hasFocusableItems) {
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
this.menuIndex--;
|
|
696
|
+
const previousItem = this.getItemByIndex(this.menuIndex);
|
|
697
|
+
if (previousItem && previousItem.isFocusable()) {
|
|
698
|
+
this.focusItem(previousItem);
|
|
699
|
+
}
|
|
700
|
+
else {
|
|
701
|
+
this.focusPreviousItem();
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
focusNextItem() {
|
|
705
|
+
if (!this.hasFocusableItems) {
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
this.menuIndex++;
|
|
709
|
+
const nextItem = this.getItemByIndex(this.menuIndex);
|
|
710
|
+
if (nextItem && nextItem.isFocusable()) {
|
|
711
|
+
this.focusItem(nextItem);
|
|
712
|
+
}
|
|
713
|
+
else {
|
|
714
|
+
this.focusNextItem();
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
reset() {
|
|
718
|
+
this._menuIndex = -1;
|
|
719
|
+
this.resetItemsActiveState();
|
|
720
|
+
this.changeDetector.markForCheck();
|
|
721
|
+
}
|
|
722
|
+
resetItemsActiveState() {
|
|
723
|
+
this.menuItems.forEach((item) => {
|
|
724
|
+
item.resetState();
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
focusItem(item) {
|
|
728
|
+
this.resetItemsActiveState();
|
|
729
|
+
item.focusElement(this.useNativeFocus);
|
|
730
|
+
this.menuChanges.emit({
|
|
731
|
+
activeIndex: this.menuIndex,
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
getItemByIndex(index) {
|
|
735
|
+
return this.menuItems.find((item, i) => {
|
|
736
|
+
return i === index;
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
selectItemByEventTarget(target) {
|
|
740
|
+
const selectedItem = this.menuItems.find((item, i) => {
|
|
741
|
+
const found = item.elementRef.nativeElement.contains(target);
|
|
742
|
+
if (found) {
|
|
743
|
+
this.menuIndex = i;
|
|
744
|
+
this.menuChanges.next({
|
|
745
|
+
activeIndex: this.menuIndex,
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
return found;
|
|
749
|
+
});
|
|
750
|
+
/* istanbul ignore else */
|
|
751
|
+
if (selectedItem) {
|
|
752
|
+
this.menuChanges.next({
|
|
753
|
+
selectedItem,
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
sendMessage(type) {
|
|
758
|
+
this.dropdownComponent.messageStream.next({ type });
|
|
759
|
+
}
|
|
760
|
+
addEventListeners() {
|
|
761
|
+
const dropdownMenuElement = this.elementRef.nativeElement;
|
|
762
|
+
fromEvent(dropdownMenuElement, 'click')
|
|
763
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
764
|
+
.subscribe((event) => {
|
|
765
|
+
this.selectItemByEventTarget(event.target);
|
|
766
|
+
});
|
|
767
|
+
fromEvent(dropdownMenuElement, 'keydown')
|
|
768
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
769
|
+
.subscribe((event) => {
|
|
770
|
+
const key = event.key.toLowerCase();
|
|
771
|
+
/*tslint:disable-next-line:switch-default*/
|
|
772
|
+
switch (key) {
|
|
773
|
+
case 'escape':
|
|
774
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
775
|
+
this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
776
|
+
event.stopPropagation();
|
|
777
|
+
event.preventDefault();
|
|
778
|
+
break;
|
|
779
|
+
case 'arrowdown':
|
|
780
|
+
case 'down':
|
|
781
|
+
this.focusNextItem();
|
|
782
|
+
event.preventDefault();
|
|
783
|
+
break;
|
|
784
|
+
case 'arrowup':
|
|
785
|
+
case 'up':
|
|
786
|
+
this.focusPreviousItem();
|
|
787
|
+
event.preventDefault();
|
|
788
|
+
break;
|
|
789
|
+
case 'tab':
|
|
790
|
+
if (this.dropdownComponent.dismissOnBlur) {
|
|
791
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
792
|
+
}
|
|
793
|
+
this.sendMessage(SkyDropdownMessageType.FocusTriggerButton);
|
|
794
|
+
break;
|
|
795
|
+
}
|
|
796
|
+
});
|
|
797
|
+
fromEvent(dropdownMenuElement, 'mouseenter')
|
|
798
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
799
|
+
.subscribe(() => {
|
|
800
|
+
this.dropdownComponent.isMouseEnter = true;
|
|
801
|
+
});
|
|
802
|
+
fromEvent(dropdownMenuElement, 'mouseleave')
|
|
803
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
804
|
+
.subscribe(() => {
|
|
805
|
+
this.dropdownComponent.isMouseEnter = false;
|
|
806
|
+
// Allow the dropdown component to set isMouseEnter before checking if the close action
|
|
807
|
+
// should be taken.
|
|
808
|
+
setTimeout(() => {
|
|
809
|
+
if (this.dropdownComponent.trigger === 'hover' &&
|
|
810
|
+
this.dropdownComponent.isMouseEnter === false) {
|
|
811
|
+
this.sendMessage(SkyDropdownMessageType.Close);
|
|
812
|
+
}
|
|
813
|
+
});
|
|
814
|
+
});
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
SkyDropdownMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: SkyDropdownComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
818
|
+
SkyDropdownMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyDropdownMenuComponent, selector: "sky-dropdown-menu", inputs: { ariaLabelledBy: "ariaLabelledBy", ariaRole: "ariaRole", useNativeFocus: "useNativeFocus" }, outputs: { menuChanges: "menuChanges" }, queries: [{ propertyName: "menuItems", predicate: SkyDropdownItemComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"sky-dropdown-menu sky-shadow sky-elevation-4\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.role]=\"ariaRole\"\n [id]=\"dropdownMenuId\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-menu{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px);display:flex;flex-direction:column;background-color:#fff}.sky-dropdown-menu button{overflow:hidden;text-overflow:ellipsis}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
819
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownMenuComponent, decorators: [{
|
|
820
|
+
type: Component,
|
|
821
|
+
args: [{ selector: 'sky-dropdown-menu', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-dropdown-menu sky-shadow sky-elevation-4\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.role]=\"ariaRole\"\n [id]=\"dropdownMenuId\"\n>\n <ng-content> </ng-content>\n</div>\n", styles: [".sky-dropdown-menu{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px);display:flex;flex-direction:column;background-color:#fff}.sky-dropdown-menu button{overflow:hidden;text-overflow:ellipsis}.sky-theme-modern.sky-theme-mode-dark .sky-dropdown-menu{background-color:#252a2e;color:#fff}\n"] }]
|
|
822
|
+
}], ctorParameters: function () {
|
|
823
|
+
return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: SkyDropdownComponent, decorators: [{
|
|
824
|
+
type: Optional
|
|
825
|
+
}] }];
|
|
826
|
+
}, propDecorators: { ariaLabelledBy: [{
|
|
827
|
+
type: Input
|
|
828
|
+
}], ariaRole: [{
|
|
829
|
+
type: Input
|
|
830
|
+
}], useNativeFocus: [{
|
|
831
|
+
type: Input
|
|
832
|
+
}], menuChanges: [{
|
|
833
|
+
type: Output
|
|
834
|
+
}], menuItems: [{
|
|
835
|
+
type: ContentChildren,
|
|
836
|
+
args: [SkyDropdownItemComponent, { descendants: true }]
|
|
837
|
+
}] } });
|
|
838
|
+
|
|
839
|
+
class SkyDropdownModule {
|
|
840
|
+
}
|
|
841
|
+
SkyDropdownModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
842
|
+
SkyDropdownModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, declarations: [SkyDropdownButtonComponent,
|
|
843
|
+
SkyDropdownComponent,
|
|
844
|
+
SkyDropdownItemComponent,
|
|
845
|
+
SkyDropdownMenuComponent], imports: [CommonModule,
|
|
846
|
+
SkyAffixModule,
|
|
847
|
+
SkyIconModule,
|
|
848
|
+
SkyOverlayModule,
|
|
849
|
+
SkyPopoversResourcesModule,
|
|
850
|
+
SkyThemeModule], exports: [SkyDropdownButtonComponent,
|
|
851
|
+
SkyDropdownComponent,
|
|
852
|
+
SkyDropdownItemComponent,
|
|
853
|
+
SkyDropdownMenuComponent] });
|
|
854
|
+
SkyDropdownModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, imports: [[
|
|
855
|
+
CommonModule,
|
|
856
|
+
SkyAffixModule,
|
|
857
|
+
SkyIconModule,
|
|
858
|
+
SkyOverlayModule,
|
|
859
|
+
SkyPopoversResourcesModule,
|
|
860
|
+
SkyThemeModule,
|
|
861
|
+
]] });
|
|
862
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyDropdownModule, decorators: [{
|
|
863
|
+
type: NgModule,
|
|
864
|
+
args: [{
|
|
865
|
+
declarations: [
|
|
866
|
+
SkyDropdownButtonComponent,
|
|
867
|
+
SkyDropdownComponent,
|
|
868
|
+
SkyDropdownItemComponent,
|
|
869
|
+
SkyDropdownMenuComponent,
|
|
870
|
+
],
|
|
871
|
+
imports: [
|
|
872
|
+
CommonModule,
|
|
873
|
+
SkyAffixModule,
|
|
874
|
+
SkyIconModule,
|
|
875
|
+
SkyOverlayModule,
|
|
876
|
+
SkyPopoversResourcesModule,
|
|
877
|
+
SkyThemeModule,
|
|
878
|
+
],
|
|
879
|
+
exports: [
|
|
880
|
+
SkyDropdownButtonComponent,
|
|
881
|
+
SkyDropdownComponent,
|
|
882
|
+
SkyDropdownItemComponent,
|
|
883
|
+
SkyDropdownMenuComponent,
|
|
884
|
+
],
|
|
885
|
+
}]
|
|
886
|
+
}] });
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* @internal
|
|
890
|
+
*/
|
|
891
|
+
class SkyPopoverAdapterService {
|
|
892
|
+
getArrowCoordinates(elements, placement, themeName) {
|
|
893
|
+
const callerRect = elements.caller.nativeElement.getBoundingClientRect();
|
|
894
|
+
const popoverRect = elements.popover.nativeElement.getBoundingClientRect();
|
|
895
|
+
const arrowRect = elements.popoverArrow.nativeElement.getBoundingClientRect();
|
|
896
|
+
const pixelTolerance = 20;
|
|
897
|
+
let top;
|
|
898
|
+
let left;
|
|
899
|
+
if (placement === 'above' || placement === 'below') {
|
|
900
|
+
left = callerRect.left + callerRect.width * 0.5;
|
|
901
|
+
// Make sure the arrow never detaches from the popover.
|
|
902
|
+
if (left - pixelTolerance < popoverRect.left) {
|
|
903
|
+
left = popoverRect.left + pixelTolerance;
|
|
904
|
+
}
|
|
905
|
+
else if (left + pixelTolerance > popoverRect.right) {
|
|
906
|
+
left = popoverRect.right - pixelTolerance;
|
|
907
|
+
}
|
|
908
|
+
if (placement === 'above') {
|
|
909
|
+
if (themeName !== 'modern') {
|
|
910
|
+
top = callerRect.top - arrowRect.height;
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
913
|
+
top = callerRect.top - arrowRect.height + 5;
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
else {
|
|
917
|
+
if (themeName !== 'modern') {
|
|
918
|
+
top = callerRect.bottom;
|
|
919
|
+
}
|
|
920
|
+
else {
|
|
921
|
+
top = callerRect.bottom + 4;
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
else {
|
|
926
|
+
top = callerRect.top + callerRect.height * 0.5;
|
|
927
|
+
// Make sure the arrow never detaches from the popover.
|
|
928
|
+
if (top - pixelTolerance < popoverRect.top) {
|
|
929
|
+
top = popoverRect.top + pixelTolerance;
|
|
930
|
+
}
|
|
931
|
+
else if (top + pixelTolerance > popoverRect.bottom) {
|
|
932
|
+
top = popoverRect.bottom - pixelTolerance;
|
|
933
|
+
}
|
|
934
|
+
if (placement === 'left') {
|
|
935
|
+
if (themeName !== 'modern') {
|
|
936
|
+
left = callerRect.left - arrowRect.width;
|
|
937
|
+
}
|
|
938
|
+
else {
|
|
939
|
+
left = callerRect.left - arrowRect.width + 5;
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
else {
|
|
943
|
+
if (themeName !== 'modern') {
|
|
944
|
+
left = callerRect.right;
|
|
945
|
+
}
|
|
946
|
+
else {
|
|
947
|
+
left = callerRect.right + 4;
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
return { top, left };
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
SkyPopoverAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverAdapterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
955
|
+
SkyPopoverAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverAdapterService });
|
|
956
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverAdapterService, decorators: [{
|
|
957
|
+
type: Injectable
|
|
958
|
+
}] });
|
|
959
|
+
|
|
960
|
+
/**
|
|
961
|
+
* @internal
|
|
962
|
+
*/
|
|
963
|
+
const skyPopoverAnimation = trigger('skyPopoverAnimation', [
|
|
964
|
+
state('void', style({
|
|
965
|
+
opacity: 0,
|
|
966
|
+
})),
|
|
967
|
+
state('open', style({
|
|
968
|
+
opacity: 1,
|
|
969
|
+
})),
|
|
970
|
+
state('closed', style({
|
|
971
|
+
opacity: 0,
|
|
972
|
+
})),
|
|
973
|
+
transition('void => *', [animate('250ms')]),
|
|
974
|
+
transition('open => closed', [animate('150ms')]),
|
|
975
|
+
transition('closed => open', [animate('150ms')]),
|
|
976
|
+
]);
|
|
977
|
+
|
|
978
|
+
function parseAffixPlacement(placement) {
|
|
979
|
+
switch (placement) {
|
|
980
|
+
case 'above':
|
|
981
|
+
return 'above';
|
|
982
|
+
case 'below':
|
|
983
|
+
return 'below';
|
|
984
|
+
case 'right':
|
|
985
|
+
return 'right';
|
|
986
|
+
case 'left':
|
|
987
|
+
return 'left';
|
|
988
|
+
/* istanbul ignore next */
|
|
989
|
+
default:
|
|
990
|
+
throw `SkyAffixPlacement does not have a matching value for '${placement}'!`;
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
function parseAffixHorizontalAlignment(alignment) {
|
|
994
|
+
switch (alignment) {
|
|
995
|
+
case 'center':
|
|
996
|
+
return 'center';
|
|
997
|
+
case 'left':
|
|
998
|
+
return 'left';
|
|
999
|
+
case 'right':
|
|
1000
|
+
return 'right';
|
|
1001
|
+
/* istanbul ignore next */
|
|
1002
|
+
default:
|
|
1003
|
+
throw `SkyAffixHorizontalAlignment does not have a matching value for '${alignment}'!`;
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
/**
|
|
1008
|
+
* @dynamic
|
|
1009
|
+
* @internal
|
|
1010
|
+
*/
|
|
1011
|
+
class SkyPopoverContext {
|
|
1012
|
+
constructor(args) {
|
|
1013
|
+
this.contentTemplateRef = args.contentTemplateRef;
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
/**
|
|
1018
|
+
* @internal
|
|
1019
|
+
*/
|
|
1020
|
+
class SkyPopoverContentComponent {
|
|
1021
|
+
constructor(changeDetector, elementRef, affixService, coreAdapterService, adapterService, context, themeSvc) {
|
|
1022
|
+
this.changeDetector = changeDetector;
|
|
1023
|
+
this.elementRef = elementRef;
|
|
1024
|
+
this.affixService = affixService;
|
|
1025
|
+
this.coreAdapterService = coreAdapterService;
|
|
1026
|
+
this.adapterService = adapterService;
|
|
1027
|
+
this.context = context;
|
|
1028
|
+
this.themeSvc = themeSvc;
|
|
1029
|
+
this.dismissOnBlur = true;
|
|
1030
|
+
this.enableAnimations = true;
|
|
1031
|
+
this.isOpen = false;
|
|
1032
|
+
this.popoverType = 'info';
|
|
1033
|
+
this.ngUnsubscribe = new Subject();
|
|
1034
|
+
this._closed = new Subject();
|
|
1035
|
+
this._isMouseEnter = new Subject();
|
|
1036
|
+
this._opened = new Subject();
|
|
1037
|
+
}
|
|
1038
|
+
get animationState() {
|
|
1039
|
+
return this.isOpen ? 'open' : 'closed';
|
|
1040
|
+
}
|
|
1041
|
+
get closed() {
|
|
1042
|
+
return this._closed.asObservable();
|
|
1043
|
+
}
|
|
1044
|
+
get opened() {
|
|
1045
|
+
return this._opened.asObservable();
|
|
1046
|
+
}
|
|
1047
|
+
get isMouseEnter() {
|
|
1048
|
+
return this._isMouseEnter.asObservable();
|
|
1049
|
+
}
|
|
1050
|
+
ngOnInit() {
|
|
1051
|
+
var _a;
|
|
1052
|
+
/*istanbul ignore next*/
|
|
1053
|
+
this.contentTarget.createEmbeddedView((_a = this.context) === null || _a === void 0 ? void 0 : _a.contentTemplateRef);
|
|
1054
|
+
this.addEventListeners();
|
|
1055
|
+
/*istanbul ignore else*/
|
|
1056
|
+
if (this.themeSvc) {
|
|
1057
|
+
this.themeSvc.settingsChange
|
|
1058
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1059
|
+
.subscribe((themeSettings) => {
|
|
1060
|
+
var _a, _b;
|
|
1061
|
+
/*istanbul ignore next*/
|
|
1062
|
+
this.themeName = (_b = (_a = themeSettings.currentSettings) === null || _a === void 0 ? void 0 : _a.theme) === null || _b === void 0 ? void 0 : _b.name;
|
|
1063
|
+
});
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
ngOnDestroy() {
|
|
1067
|
+
this.ngUnsubscribe.next();
|
|
1068
|
+
this.ngUnsubscribe.complete();
|
|
1069
|
+
this._closed.complete();
|
|
1070
|
+
this._isMouseEnter.complete();
|
|
1071
|
+
this._opened.complete();
|
|
1072
|
+
/* istanbul ignore else */
|
|
1073
|
+
if (this.affixer) {
|
|
1074
|
+
this.affixer.destroy();
|
|
1075
|
+
}
|
|
1076
|
+
this._closed =
|
|
1077
|
+
this._isMouseEnter =
|
|
1078
|
+
this._opened =
|
|
1079
|
+
this.affixer =
|
|
1080
|
+
this.ngUnsubscribe =
|
|
1081
|
+
undefined;
|
|
1082
|
+
}
|
|
1083
|
+
onAnimationEvent(event) {
|
|
1084
|
+
var _a, _b;
|
|
1085
|
+
if (event.fromState === 'void') {
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
if (event.phaseName === 'done') {
|
|
1089
|
+
if (event.toState === 'open') {
|
|
1090
|
+
/*istanbul ignore next*/
|
|
1091
|
+
(_a = this._opened) === null || _a === void 0 ? void 0 : _a.next();
|
|
1092
|
+
}
|
|
1093
|
+
else {
|
|
1094
|
+
/*istanbul ignore next*/
|
|
1095
|
+
(_b = this._closed) === null || _b === void 0 ? void 0 : _b.next();
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
open(caller, config) {
|
|
1100
|
+
this.caller = caller;
|
|
1101
|
+
this.dismissOnBlur = config.dismissOnBlur;
|
|
1102
|
+
this.enableAnimations = config.enableAnimations;
|
|
1103
|
+
this.horizontalAlignment = config.horizontalAlignment;
|
|
1104
|
+
this.placement = config.placement;
|
|
1105
|
+
this.popoverTitle = config.popoverTitle;
|
|
1106
|
+
if (config.popoverType) {
|
|
1107
|
+
this.popoverType = config.popoverType;
|
|
1108
|
+
}
|
|
1109
|
+
this.changeDetector.markForCheck();
|
|
1110
|
+
// Indicates if the popover should be displayed statically.
|
|
1111
|
+
// Please note: This feature is internal-only and used by the visual tests to capture multiple
|
|
1112
|
+
// states simultaneously without the overhead of event listeners.
|
|
1113
|
+
/* istanbul ignore if */
|
|
1114
|
+
if (config.isStatic) {
|
|
1115
|
+
this.isOpen = true;
|
|
1116
|
+
this.changeDetector.markForCheck();
|
|
1117
|
+
return;
|
|
1118
|
+
}
|
|
1119
|
+
// Let the styles render before gauging the affix dimensions.
|
|
1120
|
+
setTimeout(() => {
|
|
1121
|
+
var _a;
|
|
1122
|
+
/*istanbul ignore next*/
|
|
1123
|
+
if (!((_a = this.popoverRef) === null || _a === void 0 ? void 0 : _a.nativeElement) ||
|
|
1124
|
+
!this.ngUnsubscribe ||
|
|
1125
|
+
this.ngUnsubscribe.isStopped) {
|
|
1126
|
+
return;
|
|
1127
|
+
}
|
|
1128
|
+
if (!this.affixer) {
|
|
1129
|
+
this.setupAffixer();
|
|
1130
|
+
}
|
|
1131
|
+
const affixOptions = {
|
|
1132
|
+
autoFitContext: SkyAffixAutoFitContext.Viewport,
|
|
1133
|
+
enableAutoFit: true,
|
|
1134
|
+
horizontalAlignment: parseAffixHorizontalAlignment(this.horizontalAlignment),
|
|
1135
|
+
isSticky: true,
|
|
1136
|
+
placement: parseAffixPlacement(this.placement),
|
|
1137
|
+
};
|
|
1138
|
+
// Ensure that we are positioning the vertical alginment correctly. These
|
|
1139
|
+
// are the default alignments for all popovers but ensure that we are future proof here.
|
|
1140
|
+
if (affixOptions.placement === 'left' ||
|
|
1141
|
+
affixOptions.placement === 'right') {
|
|
1142
|
+
affixOptions.verticalAlignment = 'middle';
|
|
1143
|
+
}
|
|
1144
|
+
else if (affixOptions.placement === 'above') {
|
|
1145
|
+
affixOptions.verticalAlignment = 'bottom';
|
|
1146
|
+
}
|
|
1147
|
+
else {
|
|
1148
|
+
affixOptions.verticalAlignment = 'top';
|
|
1149
|
+
}
|
|
1150
|
+
this.affixer.affixTo(this.caller.nativeElement, affixOptions);
|
|
1151
|
+
this.updateArrowOffset();
|
|
1152
|
+
this.isOpen = true;
|
|
1153
|
+
this.changeDetector.markForCheck();
|
|
1154
|
+
});
|
|
1155
|
+
}
|
|
1156
|
+
close() {
|
|
1157
|
+
this.isOpen = false;
|
|
1158
|
+
this.changeDetector.markForCheck();
|
|
1159
|
+
}
|
|
1160
|
+
applyFocus() {
|
|
1161
|
+
if (this.isOpen) {
|
|
1162
|
+
this.coreAdapterService.getFocusableChildrenAndApplyFocus(this.popoverRef, '.sky-popover', true);
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
setupAffixer() {
|
|
1166
|
+
const affixer = this.affixService.createAffixer(this.popoverRef);
|
|
1167
|
+
affixer.offsetChange.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
1168
|
+
this.updateArrowOffset();
|
|
1169
|
+
this.changeDetector.markForCheck();
|
|
1170
|
+
});
|
|
1171
|
+
affixer.overflowScroll.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
1172
|
+
this.updateArrowOffset();
|
|
1173
|
+
this.changeDetector.markForCheck();
|
|
1174
|
+
});
|
|
1175
|
+
affixer.placementChange
|
|
1176
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1177
|
+
.subscribe((change) => {
|
|
1178
|
+
this.placement = change.placement;
|
|
1179
|
+
this.changeDetector.markForCheck();
|
|
1180
|
+
});
|
|
1181
|
+
this.affixer = affixer;
|
|
1182
|
+
}
|
|
1183
|
+
updateArrowOffset() {
|
|
1184
|
+
const { top, left } = this.adapterService.getArrowCoordinates({
|
|
1185
|
+
caller: this.caller,
|
|
1186
|
+
popover: this.popoverRef,
|
|
1187
|
+
popoverArrow: this.arrowRef,
|
|
1188
|
+
}, this.placement, this.themeName);
|
|
1189
|
+
this.arrowTop = top;
|
|
1190
|
+
this.arrowLeft = left;
|
|
1191
|
+
}
|
|
1192
|
+
isFocusLeavingElement(event) {
|
|
1193
|
+
const focusableItems = this.coreAdapterService.getFocusableChildren(this.elementRef.nativeElement);
|
|
1194
|
+
const isFirstItem = focusableItems[0] === event.target && event.shiftKey;
|
|
1195
|
+
const isLastItem = focusableItems[focusableItems.length - 1] === event.target &&
|
|
1196
|
+
!event.shiftKey;
|
|
1197
|
+
return focusableItems.length === 0 || isFirstItem || isLastItem;
|
|
1198
|
+
}
|
|
1199
|
+
addEventListeners() {
|
|
1200
|
+
const hostElement = this.elementRef.nativeElement;
|
|
1201
|
+
fromEvent(hostElement, 'mouseenter')
|
|
1202
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1203
|
+
.subscribe(() => this._isMouseEnter.next(true));
|
|
1204
|
+
fromEvent(hostElement, 'mouseleave')
|
|
1205
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1206
|
+
.subscribe(() => this._isMouseEnter.next(false));
|
|
1207
|
+
fromEvent(hostElement, 'keydown')
|
|
1208
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1209
|
+
.subscribe((event) => {
|
|
1210
|
+
const key = event.key.toLowerCase();
|
|
1211
|
+
/* tslint:disable-next-line:switch-default */
|
|
1212
|
+
switch (key) {
|
|
1213
|
+
case 'escape':
|
|
1214
|
+
this.close();
|
|
1215
|
+
this.caller.nativeElement.focus();
|
|
1216
|
+
event.preventDefault();
|
|
1217
|
+
event.stopPropagation();
|
|
1218
|
+
break;
|
|
1219
|
+
// Since the popover now lives in an overlay at the bottom of the document body, we need
|
|
1220
|
+
// to handle the tab key ourselves. Otherwise, focus would be moved to the browser's
|
|
1221
|
+
// search bar.
|
|
1222
|
+
case 'tab':
|
|
1223
|
+
if (!this.dismissOnBlur) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1226
|
+
/*istanbul ignore else*/
|
|
1227
|
+
if (this.isFocusLeavingElement(event)) {
|
|
1228
|
+
this.close();
|
|
1229
|
+
this.caller.nativeElement.focus();
|
|
1230
|
+
event.preventDefault();
|
|
1231
|
+
event.stopPropagation();
|
|
1232
|
+
}
|
|
1233
|
+
break;
|
|
1234
|
+
}
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
SkyPopoverContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverContentComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyAffixService }, { token: i1.SkyCoreAdapterService }, { token: SkyPopoverAdapterService }, { token: SkyPopoverContext, optional: true }, { token: i2.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
1239
|
+
SkyPopoverContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyPopoverContentComponent, selector: "sky-popover-content", providers: [SkyPopoverAdapterService], viewQueries: [{ propertyName: "arrowRef", first: true, predicate: ["arrowRef"], descendants: true, read: ElementRef, static: true }, { propertyName: "popoverRef", first: true, predicate: ["popoverRef"], descendants: true, read: ElementRef, static: true }, { propertyName: "contentTarget", first: true, predicate: ["contentTarget"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div\n class=\"sky-popover-container sky-popover-max-height\"\n [@.disabled]=\"!enableAnimations\"\n [@skyPopoverAnimation]=\"animationState\"\n [class.sky-popover-hidden]=\"!placement\"\n [ngClass]=\"[\n 'sky-popover-alignment-' + horizontalAlignment,\n 'sky-popover-placement-' + placement,\n 'sky-popover-' + popoverType\n ]\"\n (@skyPopoverAnimation.done)=\"onAnimationEvent($event)\"\n (@skyPopoverAnimation.start)=\"onAnimationEvent($event)\"\n #popoverRef\n>\n <div\n class=\"sky-popover\"\n tabindex=\"-1\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n >\n <header\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-header\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg sky-margin-stacked-lg': 'modern'\n }\"\n >\n <h1\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-title\"\n [skyThemeClass]=\"{\n 'sky-emphasized': 'default',\n 'sky-font-emphasized': 'modern'\n }\"\n >\n {{ popoverTitle }}\n </h1>\n </header>\n <div\n class=\"sky-popover-body\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg': 'modern'\n }\"\n >\n <ng-container #contentTarget></ng-container>\n </div>\n <span\n aria-hidden=\"true\"\n class=\"sky-popover-arrow\"\n [style.left.px]=\"arrowLeft\"\n [style.top.px]=\"arrowTop\"\n #arrowRef\n ></span>\n </div>\n</div>\n", styles: [".sky-popover-container{position:fixed;min-width:276px;max-width:276px}.sky-popover-container.sky-popover-hidden{visibility:hidden;opacity:0;pointer-events:none!important}.sky-popover-container.sky-popover-hidden *{pointer-events:none!important}.sky-popover-container.sky-popover-static .sky-popover-arrow{position:absolute}.sky-popover-container:focus{outline:none}@media (max-width: 276px){.sky-popover-container{max-width:100%;min-width:auto}}.sky-popover{background-color:#fff}.sky-popover-header{padding-bottom:0}.sky-popover-header+.sky-popover-body{padding-top:2px}.sky-popover-title{margin:0}.sky-popover-arrow{width:0;height:0;position:fixed;border:10px solid transparent}.sky-popover-placement-above{padding-bottom:10px}.sky-popover-placement-above .sky-popover{border-bottom:10px solid #00b4f1}.sky-popover-placement-above .sky-popover-arrow{border-bottom:0;border-top-color:#00b4f1;bottom:0;left:50%;margin-left:-10px}.sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044}.sky-popover-placement-below{padding-top:10px}.sky-popover-placement-below .sky-popover{border-top:10px solid #00b4f1}.sky-popover-placement-below .sky-popover-arrow{border-top:0;border-bottom-color:#00b4f1;top:0;left:50%;margin-left:-10px}.sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044}.sky-popover-placement-right{padding-left:10px}.sky-popover-placement-right .sky-popover{border-left:10px solid #00b4f1}.sky-popover-placement-right .sky-popover-arrow{border-left:0;border-right-color:#00b4f1;left:0;top:50%;margin-top:-10px}.sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-right-color:#ef4044}.sky-popover-placement-left{padding-right:10px}.sky-popover-placement-left .sky-popover{border-right:10px solid #00b4f1}.sky-popover-placement-left .sky-popover-arrow{border-right:0;border-left-color:#00b4f1;right:0;top:50%;margin-top:-10px}.sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-left-color:#ef4044}.sky-popover-placement-above.sky-popover-alignment-left .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-left .sky-popover-arrow{left:40px;right:auto}.sky-popover-placement-above.sky-popover-alignment-right .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-right .sky-popover-arrow{left:auto;right:40px}.sky-popover-max-height .sky-popover{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}:host-context(.sky-theme-modern) .sky-popover{border-radius:6px}:host-context(.sky-theme-modern) .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-above{padding-bottom:10px}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-below{padding-top:10px}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-right{padding-left:10px}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-left{padding-right:10px}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover{border-radius:6px}.sky-theme-modern .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}.sky-theme-modern .sky-popover-placement-above{padding-bottom:10px}.sky-theme-modern .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover-placement-below{padding-top:10px}.sky-theme-modern .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-right{padding-left:10px}.sky-theme-modern .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-left{padding-right:10px}.sky-theme-modern .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}\n"], directives: [{ type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [skyPopoverAnimation] });
|
|
1240
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverContentComponent, decorators: [{
|
|
1241
|
+
type: Component,
|
|
1242
|
+
args: [{ selector: 'sky-popover-content', animations: [skyPopoverAnimation], providers: [SkyPopoverAdapterService], template: "<div\n class=\"sky-popover-container sky-popover-max-height\"\n [@.disabled]=\"!enableAnimations\"\n [@skyPopoverAnimation]=\"animationState\"\n [class.sky-popover-hidden]=\"!placement\"\n [ngClass]=\"[\n 'sky-popover-alignment-' + horizontalAlignment,\n 'sky-popover-placement-' + placement,\n 'sky-popover-' + popoverType\n ]\"\n (@skyPopoverAnimation.done)=\"onAnimationEvent($event)\"\n (@skyPopoverAnimation.start)=\"onAnimationEvent($event)\"\n #popoverRef\n>\n <div\n class=\"sky-popover\"\n tabindex=\"-1\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n >\n <header\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-header\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg sky-margin-stacked-lg': 'modern'\n }\"\n >\n <h1\n *ngIf=\"popoverTitle\"\n class=\"sky-popover-title\"\n [skyThemeClass]=\"{\n 'sky-emphasized': 'default',\n 'sky-font-emphasized': 'modern'\n }\"\n >\n {{ popoverTitle }}\n </h1>\n </header>\n <div\n class=\"sky-popover-body\"\n [skyThemeClass]=\"{\n 'sky-padding-even-default': 'default',\n 'sky-padding-even-lg': 'modern'\n }\"\n >\n <ng-container #contentTarget></ng-container>\n </div>\n <span\n aria-hidden=\"true\"\n class=\"sky-popover-arrow\"\n [style.left.px]=\"arrowLeft\"\n [style.top.px]=\"arrowTop\"\n #arrowRef\n ></span>\n </div>\n</div>\n", styles: [".sky-popover-container{position:fixed;min-width:276px;max-width:276px}.sky-popover-container.sky-popover-hidden{visibility:hidden;opacity:0;pointer-events:none!important}.sky-popover-container.sky-popover-hidden *{pointer-events:none!important}.sky-popover-container.sky-popover-static .sky-popover-arrow{position:absolute}.sky-popover-container:focus{outline:none}@media (max-width: 276px){.sky-popover-container{max-width:100%;min-width:auto}}.sky-popover{background-color:#fff}.sky-popover-header{padding-bottom:0}.sky-popover-header+.sky-popover-body{padding-top:2px}.sky-popover-title{margin:0}.sky-popover-arrow{width:0;height:0;position:fixed;border:10px solid transparent}.sky-popover-placement-above{padding-bottom:10px}.sky-popover-placement-above .sky-popover{border-bottom:10px solid #00b4f1}.sky-popover-placement-above .sky-popover-arrow{border-bottom:0;border-top-color:#00b4f1;bottom:0;left:50%;margin-left:-10px}.sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044}.sky-popover-placement-below{padding-top:10px}.sky-popover-placement-below .sky-popover{border-top:10px solid #00b4f1}.sky-popover-placement-below .sky-popover-arrow{border-top:0;border-bottom-color:#00b4f1;top:0;left:50%;margin-left:-10px}.sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044}.sky-popover-placement-right{padding-left:10px}.sky-popover-placement-right .sky-popover{border-left:10px solid #00b4f1}.sky-popover-placement-right .sky-popover-arrow{border-left:0;border-right-color:#00b4f1;left:0;top:50%;margin-top:-10px}.sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-right-color:#ef4044}.sky-popover-placement-left{padding-right:10px}.sky-popover-placement-left .sky-popover{border-right:10px solid #00b4f1}.sky-popover-placement-left .sky-popover-arrow{border-right:0;border-left-color:#00b4f1;right:0;top:50%;margin-top:-10px}.sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-left-color:#ef4044}.sky-popover-placement-above.sky-popover-alignment-left .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-left .sky-popover-arrow{left:40px;right:auto}.sky-popover-placement-above.sky-popover-alignment-right .sky-popover-arrow,.sky-popover-placement-below.sky-popover-alignment-right .sky-popover-arrow{left:auto;right:40px}.sky-popover-max-height .sky-popover{overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}:host-context(.sky-theme-modern) .sky-popover{border-radius:6px}:host-context(.sky-theme-modern) .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-above{padding-bottom:10px}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-below{padding-top:10px}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-right{padding-left:10px}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}:host-context(.sky-theme-modern) .sky-popover-placement-left{padding-right:10px}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}:host-context(.sky-theme-modern) .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover{border-radius:6px}.sky-theme-modern .sky-popover-arrow{transform:rotate(45deg);border-color:transparent}.sky-theme-modern .sky-popover-placement-above{padding-bottom:10px}.sky-theme-modern .sky-popover-placement-above .sky-popover{border-bottom:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-above .sky-popover-arrow{bottom:1px;border-radius:0 0 3px;border-bottom:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover{border-bottom-color:#ef4044}.sky-theme-modern .sky-popover-placement-above.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-right-color:#ef4044;border-top-color:transparent;border-left-color:transparent}.sky-theme-modern .sky-popover-placement-below{padding-top:10px}.sky-theme-modern .sky-popover-placement-below .sky-popover{border-top:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-below .sky-popover-arrow{top:1px;border-radius:3px 0 0;border-top:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover{border-top-color:#ef4044}.sky-theme-modern .sky-popover-placement-below.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-left-color:#ef4044;border-bottom-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-right{padding-left:10px}.sky-theme-modern .sky-popover-placement-right .sky-popover{border-left:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-right .sky-popover-arrow{left:1px;border-radius:0 0 0 3px;border-bottom:solid 10px #00b4f1;border-left:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover{border-left-color:#ef4044}.sky-theme-modern .sky-popover-placement-right.sky-popover-danger .sky-popover-arrow{border-bottom-color:#ef4044;border-left-color:#ef4044;border-top-color:transparent;border-right-color:transparent}.sky-theme-modern .sky-popover-placement-left{padding-right:10px}.sky-theme-modern .sky-popover-placement-left .sky-popover{border-right:6px solid #00b4f1}.sky-theme-modern .sky-popover-placement-left .sky-popover-arrow{right:1px;border-radius:0 3px 0 0;border-top:solid 10px #00b4f1;border-right:solid 10px #00b4f1}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover{border-right-color:#ef4044}.sky-theme-modern .sky-popover-placement-left.sky-popover-danger .sky-popover-arrow{border-top-color:#ef4044;border-right-color:#ef4044;border-bottom-color:transparent;border-left-color:transparent}\n"] }]
|
|
1243
|
+
}], ctorParameters: function () {
|
|
1244
|
+
return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyAffixService }, { type: i1.SkyCoreAdapterService }, { type: SkyPopoverAdapterService }, { type: SkyPopoverContext, decorators: [{
|
|
1245
|
+
type: Optional
|
|
1246
|
+
}] }, { type: i2.SkyThemeService, decorators: [{
|
|
1247
|
+
type: Optional
|
|
1248
|
+
}] }];
|
|
1249
|
+
}, propDecorators: { arrowRef: [{
|
|
1250
|
+
type: ViewChild,
|
|
1251
|
+
args: ['arrowRef', {
|
|
1252
|
+
read: ElementRef,
|
|
1253
|
+
static: true,
|
|
1254
|
+
}]
|
|
1255
|
+
}], popoverRef: [{
|
|
1256
|
+
type: ViewChild,
|
|
1257
|
+
args: ['popoverRef', {
|
|
1258
|
+
read: ElementRef,
|
|
1259
|
+
static: true,
|
|
1260
|
+
}]
|
|
1261
|
+
}], contentTarget: [{
|
|
1262
|
+
type: ViewChild,
|
|
1263
|
+
args: ['contentTarget', {
|
|
1264
|
+
read: ViewContainerRef,
|
|
1265
|
+
static: true,
|
|
1266
|
+
}]
|
|
1267
|
+
}] } });
|
|
1268
|
+
|
|
1269
|
+
class SkyPopoverComponent {
|
|
1270
|
+
constructor(overlayService) {
|
|
1271
|
+
this.overlayService = overlayService;
|
|
1272
|
+
/**
|
|
1273
|
+
* Fires when users close the popover.
|
|
1274
|
+
*/
|
|
1275
|
+
this.popoverClosed = new EventEmitter();
|
|
1276
|
+
/**
|
|
1277
|
+
* Fires when users open the popover.
|
|
1278
|
+
*/
|
|
1279
|
+
this.popoverOpened = new EventEmitter();
|
|
1280
|
+
/**
|
|
1281
|
+
* Indicates that the popover is in the process of being opened or closed.
|
|
1282
|
+
* @internal
|
|
1283
|
+
*/
|
|
1284
|
+
this.isActive = false;
|
|
1285
|
+
/**
|
|
1286
|
+
* Used by unit tests to disable animations since the component is injected at the bottom of the
|
|
1287
|
+
* document body.
|
|
1288
|
+
* @internal
|
|
1289
|
+
*/
|
|
1290
|
+
this.enableAnimations = true;
|
|
1291
|
+
this.isMouseEnter = false;
|
|
1292
|
+
this.isMarkedForCloseOnMouseLeave = false;
|
|
1293
|
+
this.ngUnsubscribe = new Subject();
|
|
1294
|
+
}
|
|
1295
|
+
/**
|
|
1296
|
+
* Specifies the horizontal alignment of the popover in relation to the trigger element.
|
|
1297
|
+
* The `skyPopoverAlignment` property on the popover directive overwrites this property.
|
|
1298
|
+
* Options include:`"center"`, `"right"`, and `'"left"`.
|
|
1299
|
+
* @default "center"
|
|
1300
|
+
*/
|
|
1301
|
+
set alignment(value) {
|
|
1302
|
+
this._alignment = value;
|
|
1303
|
+
}
|
|
1304
|
+
get alignment() {
|
|
1305
|
+
return this._alignment || 'center';
|
|
1306
|
+
}
|
|
1307
|
+
/**
|
|
1308
|
+
* Indicates whether to close the popover when it loses focus.
|
|
1309
|
+
* To require users to click a trigger button to close the popover, set this input to false.
|
|
1310
|
+
* @default true
|
|
1311
|
+
*/
|
|
1312
|
+
set dismissOnBlur(value) {
|
|
1313
|
+
this._dismissOnBlur = value;
|
|
1314
|
+
}
|
|
1315
|
+
get dismissOnBlur() {
|
|
1316
|
+
if (this._dismissOnBlur === undefined) {
|
|
1317
|
+
return true;
|
|
1318
|
+
}
|
|
1319
|
+
return this._dismissOnBlur;
|
|
1320
|
+
}
|
|
1321
|
+
/**
|
|
1322
|
+
* Specifies the placement of the popover in relation to the trigger element.
|
|
1323
|
+
* The `skyPopoverPlacement` property on the popover directive overwrites this property.
|
|
1324
|
+
* Options include:`"above"`, `"below"`, `"right"`, and `"left"`.
|
|
1325
|
+
* @default "above"
|
|
1326
|
+
*/
|
|
1327
|
+
set placement(value) {
|
|
1328
|
+
this._placement = value;
|
|
1329
|
+
}
|
|
1330
|
+
get placement() {
|
|
1331
|
+
return this._placement || 'above';
|
|
1332
|
+
}
|
|
1333
|
+
ngOnDestroy() {
|
|
1334
|
+
this.ngUnsubscribe.next();
|
|
1335
|
+
this.ngUnsubscribe.complete();
|
|
1336
|
+
this.ngUnsubscribe = undefined;
|
|
1337
|
+
if (this.overlay) {
|
|
1338
|
+
this.overlayService.close(this.overlay);
|
|
1339
|
+
this.overlay = undefined;
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
/**
|
|
1343
|
+
* Positions the popover next to a given caller element.
|
|
1344
|
+
* @param caller The element that opened the popover.
|
|
1345
|
+
* @param placement The placement of the popover.
|
|
1346
|
+
* @param alignment The horizontal alignment of the popover.
|
|
1347
|
+
* @internal
|
|
1348
|
+
*/
|
|
1349
|
+
positionNextTo(caller, placement, alignment) {
|
|
1350
|
+
if (!this.overlay) {
|
|
1351
|
+
this.setupOverlay();
|
|
1352
|
+
}
|
|
1353
|
+
this.placement = placement;
|
|
1354
|
+
this.alignment = alignment;
|
|
1355
|
+
this.isActive = true;
|
|
1356
|
+
this.contentRef.open(caller, {
|
|
1357
|
+
dismissOnBlur: this.dismissOnBlur,
|
|
1358
|
+
enableAnimations: this.enableAnimations,
|
|
1359
|
+
horizontalAlignment: this.alignment,
|
|
1360
|
+
isStatic: false,
|
|
1361
|
+
placement: this.placement,
|
|
1362
|
+
popoverTitle: this.popoverTitle,
|
|
1363
|
+
popoverType: this.popoverType,
|
|
1364
|
+
});
|
|
1365
|
+
}
|
|
1366
|
+
/**
|
|
1367
|
+
* Closes the popover.
|
|
1368
|
+
* @internal
|
|
1369
|
+
*/
|
|
1370
|
+
close() {
|
|
1371
|
+
var _a;
|
|
1372
|
+
/*istanbul ignore next*/
|
|
1373
|
+
(_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.close();
|
|
1374
|
+
}
|
|
1375
|
+
/**
|
|
1376
|
+
* Brings focus to the popover element if its open.
|
|
1377
|
+
* @internal
|
|
1378
|
+
*/
|
|
1379
|
+
applyFocus() {
|
|
1380
|
+
var _a;
|
|
1381
|
+
/*istanbul ignore next*/
|
|
1382
|
+
(_a = this.contentRef) === null || _a === void 0 ? void 0 : _a.applyFocus();
|
|
1383
|
+
}
|
|
1384
|
+
/**
|
|
1385
|
+
* Adds a flag to the popover to close when the mouse leaves the popover's bounds.
|
|
1386
|
+
* @internal
|
|
1387
|
+
*/
|
|
1388
|
+
markForCloseOnMouseLeave() {
|
|
1389
|
+
this.isMarkedForCloseOnMouseLeave = true;
|
|
1390
|
+
}
|
|
1391
|
+
setupOverlay() {
|
|
1392
|
+
const overlay = this.overlayService.create({
|
|
1393
|
+
enableScroll: true,
|
|
1394
|
+
enablePointerEvents: true,
|
|
1395
|
+
});
|
|
1396
|
+
overlay.backdropClick.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
1397
|
+
if (this.dismissOnBlur) {
|
|
1398
|
+
this.close();
|
|
1399
|
+
}
|
|
1400
|
+
});
|
|
1401
|
+
const contentRef = overlay.attachComponent(SkyPopoverContentComponent, [
|
|
1402
|
+
{
|
|
1403
|
+
provide: SkyPopoverContext,
|
|
1404
|
+
useValue: new SkyPopoverContext({
|
|
1405
|
+
contentTemplateRef: this.templateRef,
|
|
1406
|
+
}),
|
|
1407
|
+
},
|
|
1408
|
+
]);
|
|
1409
|
+
contentRef.opened.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
1410
|
+
this.popoverOpened.emit(this);
|
|
1411
|
+
});
|
|
1412
|
+
contentRef.closed.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
|
|
1413
|
+
/*istanbul ignore else*/
|
|
1414
|
+
if (this.isActive) {
|
|
1415
|
+
this.overlayService.close(this.overlay);
|
|
1416
|
+
this.overlay = undefined;
|
|
1417
|
+
this.isActive = false;
|
|
1418
|
+
this.popoverClosed.emit(this);
|
|
1419
|
+
}
|
|
1420
|
+
});
|
|
1421
|
+
contentRef.isMouseEnter
|
|
1422
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1423
|
+
.subscribe((isMouseEnter) => {
|
|
1424
|
+
this.isMouseEnter = isMouseEnter;
|
|
1425
|
+
if (this.isMarkedForCloseOnMouseLeave) {
|
|
1426
|
+
this.isMarkedForCloseOnMouseLeave = false;
|
|
1427
|
+
this.close();
|
|
1428
|
+
}
|
|
1429
|
+
});
|
|
1430
|
+
this.overlay = overlay;
|
|
1431
|
+
this.contentRef = contentRef;
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
SkyPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverComponent, deps: [{ token: i1.SkyOverlayService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1435
|
+
SkyPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyPopoverComponent, selector: "sky-popover", inputs: { alignment: "alignment", dismissOnBlur: "dismissOnBlur", placement: "placement", popoverTitle: "popoverTitle", popoverType: "popoverType" }, outputs: { popoverClosed: "popoverClosed", popoverOpened: "popoverOpened" }, viewQueries: [{ propertyName: "templateRef", first: true, predicate: ["templateRef"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n" });
|
|
1436
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverComponent, decorators: [{
|
|
1437
|
+
type: Component,
|
|
1438
|
+
args: [{ selector: 'sky-popover', template: "<ng-template #templateRef>\n <ng-content></ng-content>\n</ng-template>\n" }]
|
|
1439
|
+
}], ctorParameters: function () { return [{ type: i1.SkyOverlayService }]; }, propDecorators: { alignment: [{
|
|
1440
|
+
type: Input
|
|
1441
|
+
}], dismissOnBlur: [{
|
|
1442
|
+
type: Input
|
|
1443
|
+
}], placement: [{
|
|
1444
|
+
type: Input
|
|
1445
|
+
}], popoverTitle: [{
|
|
1446
|
+
type: Input
|
|
1447
|
+
}], popoverType: [{
|
|
1448
|
+
type: Input
|
|
1449
|
+
}], popoverClosed: [{
|
|
1450
|
+
type: Output
|
|
1451
|
+
}], popoverOpened: [{
|
|
1452
|
+
type: Output
|
|
1453
|
+
}], templateRef: [{
|
|
1454
|
+
type: ViewChild,
|
|
1455
|
+
args: ['templateRef', {
|
|
1456
|
+
read: TemplateRef,
|
|
1457
|
+
static: true,
|
|
1458
|
+
}]
|
|
1459
|
+
}] } });
|
|
1460
|
+
|
|
1461
|
+
/**
|
|
1462
|
+
* Specifies the type of message to send to the popover component.
|
|
1463
|
+
*/
|
|
1464
|
+
var SkyPopoverMessageType;
|
|
1465
|
+
(function (SkyPopoverMessageType) {
|
|
1466
|
+
/**
|
|
1467
|
+
* Opens the popover.
|
|
1468
|
+
*/
|
|
1469
|
+
SkyPopoverMessageType[SkyPopoverMessageType["Open"] = 0] = "Open";
|
|
1470
|
+
/**
|
|
1471
|
+
* Closes the popover.
|
|
1472
|
+
*/
|
|
1473
|
+
SkyPopoverMessageType[SkyPopoverMessageType["Close"] = 1] = "Close";
|
|
1474
|
+
/**
|
|
1475
|
+
* Repositions the popover to the appropriate position.
|
|
1476
|
+
* This is useful for when the popover's width and height change while it is open.
|
|
1477
|
+
*/
|
|
1478
|
+
SkyPopoverMessageType[SkyPopoverMessageType["Reposition"] = 2] = "Reposition";
|
|
1479
|
+
/**
|
|
1480
|
+
* Brings focus to the popover element.
|
|
1481
|
+
*/
|
|
1482
|
+
SkyPopoverMessageType[SkyPopoverMessageType["Focus"] = 3] = "Focus";
|
|
1483
|
+
})(SkyPopoverMessageType || (SkyPopoverMessageType = {}));
|
|
1484
|
+
|
|
1485
|
+
class SkyPopoverDirective {
|
|
1486
|
+
constructor(elementRef) {
|
|
1487
|
+
this.elementRef = elementRef;
|
|
1488
|
+
/**
|
|
1489
|
+
* Provides an observable to send commands to the popover that respect the `SkyPopoverMessage` type.
|
|
1490
|
+
*/
|
|
1491
|
+
this.skyPopoverMessageStream = new Subject();
|
|
1492
|
+
this.ngUnsubscribe = new Subject();
|
|
1493
|
+
}
|
|
1494
|
+
/**
|
|
1495
|
+
* Specifies the user action that displays the popover.
|
|
1496
|
+
*/
|
|
1497
|
+
set skyPopoverTrigger(value) {
|
|
1498
|
+
this._trigger = value;
|
|
1499
|
+
}
|
|
1500
|
+
get skyPopoverTrigger() {
|
|
1501
|
+
return this._trigger || 'click';
|
|
1502
|
+
}
|
|
1503
|
+
ngOnInit() {
|
|
1504
|
+
this.addEventListeners();
|
|
1505
|
+
}
|
|
1506
|
+
ngOnDestroy() {
|
|
1507
|
+
this.removeEventListeners();
|
|
1508
|
+
}
|
|
1509
|
+
togglePopover() {
|
|
1510
|
+
if (this.skyPopover.isActive) {
|
|
1511
|
+
this.sendMessage(SkyPopoverMessageType.Close);
|
|
1512
|
+
return;
|
|
1513
|
+
}
|
|
1514
|
+
this.sendMessage(SkyPopoverMessageType.Open);
|
|
1515
|
+
}
|
|
1516
|
+
positionPopover() {
|
|
1517
|
+
this.skyPopover.positionNextTo(this.elementRef, this.skyPopoverPlacement, this.skyPopoverAlignment);
|
|
1518
|
+
}
|
|
1519
|
+
closePopover() {
|
|
1520
|
+
this.skyPopover.close();
|
|
1521
|
+
}
|
|
1522
|
+
closePopoverOrMarkForClose() {
|
|
1523
|
+
if (this.skyPopover.isMouseEnter) {
|
|
1524
|
+
this.skyPopover.markForCloseOnMouseLeave();
|
|
1525
|
+
}
|
|
1526
|
+
else {
|
|
1527
|
+
this.sendMessage(SkyPopoverMessageType.Close);
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
addEventListeners() {
|
|
1531
|
+
const element = this.elementRef.nativeElement;
|
|
1532
|
+
this.skyPopoverMessageStream
|
|
1533
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1534
|
+
.subscribe((message) => {
|
|
1535
|
+
this.handleIncomingMessages(message);
|
|
1536
|
+
});
|
|
1537
|
+
fromEvent(element, 'keydown')
|
|
1538
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1539
|
+
.subscribe((event) => {
|
|
1540
|
+
if (!this.skyPopover.isActive) {
|
|
1541
|
+
return;
|
|
1542
|
+
}
|
|
1543
|
+
const key = event.key.toLowerCase();
|
|
1544
|
+
/* tslint:disable-next-line:switch-default */
|
|
1545
|
+
switch (key) {
|
|
1546
|
+
case 'escape':
|
|
1547
|
+
this.sendMessage(SkyPopoverMessageType.Close);
|
|
1548
|
+
event.preventDefault();
|
|
1549
|
+
event.stopPropagation();
|
|
1550
|
+
break;
|
|
1551
|
+
case 'tab':
|
|
1552
|
+
if (this.skyPopover.dismissOnBlur) {
|
|
1553
|
+
this.sendMessage(SkyPopoverMessageType.Close);
|
|
1554
|
+
}
|
|
1555
|
+
break;
|
|
1556
|
+
case 'arrowdown':
|
|
1557
|
+
case 'arrowleft':
|
|
1558
|
+
case 'arrowright':
|
|
1559
|
+
case 'arrowup':
|
|
1560
|
+
case 'down':
|
|
1561
|
+
case 'left':
|
|
1562
|
+
case 'right':
|
|
1563
|
+
case 'up':
|
|
1564
|
+
this.sendMessage(SkyPopoverMessageType.Focus);
|
|
1565
|
+
event.stopPropagation();
|
|
1566
|
+
event.preventDefault();
|
|
1567
|
+
break;
|
|
1568
|
+
}
|
|
1569
|
+
});
|
|
1570
|
+
fromEvent(element, 'click')
|
|
1571
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1572
|
+
.subscribe(() => {
|
|
1573
|
+
if (this.skyPopover) {
|
|
1574
|
+
this.togglePopover();
|
|
1575
|
+
}
|
|
1576
|
+
});
|
|
1577
|
+
fromEvent(element, 'mouseenter')
|
|
1578
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1579
|
+
.subscribe(() => {
|
|
1580
|
+
if (this.skyPopover) {
|
|
1581
|
+
this.skyPopover.isMouseEnter = true;
|
|
1582
|
+
if (!this.skyPopover.isActive &&
|
|
1583
|
+
this.skyPopoverTrigger === 'mouseenter') {
|
|
1584
|
+
this.sendMessage(SkyPopoverMessageType.Open);
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1587
|
+
});
|
|
1588
|
+
fromEvent(element, 'mouseleave')
|
|
1589
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
1590
|
+
.subscribe(() => {
|
|
1591
|
+
if (this.skyPopover) {
|
|
1592
|
+
this.skyPopover.isMouseEnter = false;
|
|
1593
|
+
if (this.skyPopover.isActive &&
|
|
1594
|
+
this.skyPopoverTrigger === 'mouseenter') {
|
|
1595
|
+
// Give the popover a chance to set its isMouseEnter flag before checking to see
|
|
1596
|
+
// if it should be closed.
|
|
1597
|
+
setTimeout(() => {
|
|
1598
|
+
this.closePopoverOrMarkForClose();
|
|
1599
|
+
});
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
});
|
|
1603
|
+
}
|
|
1604
|
+
removeEventListeners() {
|
|
1605
|
+
this.ngUnsubscribe.next();
|
|
1606
|
+
this.ngUnsubscribe.complete();
|
|
1607
|
+
this.ngUnsubscribe = undefined;
|
|
1608
|
+
}
|
|
1609
|
+
handleIncomingMessages(message) {
|
|
1610
|
+
/* tslint:disable-next-line:switch-default */
|
|
1611
|
+
switch (message.type) {
|
|
1612
|
+
case SkyPopoverMessageType.Open:
|
|
1613
|
+
this.positionPopover();
|
|
1614
|
+
break;
|
|
1615
|
+
case SkyPopoverMessageType.Close:
|
|
1616
|
+
/*istanbul ignore else*/
|
|
1617
|
+
if (this.skyPopover.isActive) {
|
|
1618
|
+
this.closePopover();
|
|
1619
|
+
}
|
|
1620
|
+
break;
|
|
1621
|
+
case SkyPopoverMessageType.Reposition:
|
|
1622
|
+
// Only reposition the popover if it is already open.
|
|
1623
|
+
if (this.skyPopover.isActive) {
|
|
1624
|
+
this.positionPopover();
|
|
1625
|
+
}
|
|
1626
|
+
break;
|
|
1627
|
+
case SkyPopoverMessageType.Focus:
|
|
1628
|
+
this.skyPopover.applyFocus();
|
|
1629
|
+
break;
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
sendMessage(messageType) {
|
|
1633
|
+
this.skyPopoverMessageStream.next({ type: messageType });
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
SkyPopoverDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
1637
|
+
SkyPopoverDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.7", type: SkyPopoverDirective, selector: "[skyPopover]", inputs: { skyPopover: "skyPopover", skyPopoverAlignment: "skyPopoverAlignment", skyPopoverMessageStream: "skyPopoverMessageStream", skyPopoverPlacement: "skyPopoverPlacement", skyPopoverTrigger: "skyPopoverTrigger" }, ngImport: i0 });
|
|
1638
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverDirective, decorators: [{
|
|
1639
|
+
type: Directive,
|
|
1640
|
+
args: [{
|
|
1641
|
+
selector: '[skyPopover]',
|
|
1642
|
+
}]
|
|
1643
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { skyPopover: [{
|
|
1644
|
+
type: Input
|
|
1645
|
+
}], skyPopoverAlignment: [{
|
|
1646
|
+
type: Input
|
|
1647
|
+
}], skyPopoverMessageStream: [{
|
|
1648
|
+
type: Input
|
|
1649
|
+
}], skyPopoverPlacement: [{
|
|
1650
|
+
type: Input
|
|
1651
|
+
}], skyPopoverTrigger: [{
|
|
1652
|
+
type: Input
|
|
1653
|
+
}] } });
|
|
1654
|
+
|
|
1655
|
+
class SkyPopoverModule {
|
|
1656
|
+
}
|
|
1657
|
+
SkyPopoverModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
1658
|
+
SkyPopoverModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, declarations: [SkyPopoverComponent,
|
|
1659
|
+
SkyPopoverContentComponent,
|
|
1660
|
+
SkyPopoverDirective], imports: [CommonModule,
|
|
1661
|
+
SkyAffixModule,
|
|
1662
|
+
SkyIconModule,
|
|
1663
|
+
SkyOverlayModule,
|
|
1664
|
+
SkyPopoversResourcesModule,
|
|
1665
|
+
SkyThemeModule], exports: [SkyPopoverComponent,
|
|
1666
|
+
SkyPopoverContentComponent,
|
|
1667
|
+
SkyPopoverDirective] });
|
|
1668
|
+
SkyPopoverModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, imports: [[
|
|
1669
|
+
CommonModule,
|
|
1670
|
+
SkyAffixModule,
|
|
1671
|
+
SkyIconModule,
|
|
1672
|
+
SkyOverlayModule,
|
|
1673
|
+
SkyPopoversResourcesModule,
|
|
1674
|
+
SkyThemeModule,
|
|
1675
|
+
]] });
|
|
1676
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyPopoverModule, decorators: [{
|
|
1677
|
+
type: NgModule,
|
|
1678
|
+
args: [{
|
|
1679
|
+
declarations: [
|
|
1680
|
+
SkyPopoverComponent,
|
|
1681
|
+
SkyPopoverContentComponent,
|
|
1682
|
+
SkyPopoverDirective,
|
|
1683
|
+
],
|
|
1684
|
+
imports: [
|
|
1685
|
+
CommonModule,
|
|
1686
|
+
SkyAffixModule,
|
|
1687
|
+
SkyIconModule,
|
|
1688
|
+
SkyOverlayModule,
|
|
1689
|
+
SkyPopoversResourcesModule,
|
|
1690
|
+
SkyThemeModule,
|
|
1691
|
+
],
|
|
1692
|
+
exports: [
|
|
1693
|
+
SkyPopoverComponent,
|
|
1694
|
+
SkyPopoverContentComponent,
|
|
1695
|
+
SkyPopoverDirective,
|
|
1696
|
+
],
|
|
1697
|
+
}]
|
|
1698
|
+
}] });
|
|
1699
|
+
|
|
1700
|
+
/**
|
|
1701
|
+
* Generated bundle index. Do not edit.
|
|
1702
|
+
*/
|
|
1703
|
+
|
|
1704
|
+
export { SkyDropdownMessageType, SkyDropdownModule, SkyPopoverMessageType, SkyPopoverModule, SkyDropdownItemComponent as λ1, SkyDropdownButtonComponent as λ2, SkyDropdownComponent as λ3, SkyDropdownMenuComponent as λ4, SkyPopoverContentComponent as λ5, SkyPopoverComponent as λ6, SkyPopoverDirective as λ7 };
|
|
1705
|
+
//# sourceMappingURL=skyux-popovers.mjs.map
|