@skyux/core 5.9.0 → 5.9.3
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/bundles/skyux-core.umd.js +14 -6
- package/documentation.json +6 -6
- package/esm2015/lib/modules/adapter-service/adapter.service.js +13 -5
- package/esm2015/lib/modules/adapter-service/adapter.service.js.map +1 -1
- package/esm2015/lib/modules/scrollable-host/scrollable-host.service.js +1 -1
- package/esm2015/lib/modules/scrollable-host/scrollable-host.service.js.map +1 -1
- package/fesm2015/skyux-core.js +14 -6
- package/fesm2015/skyux-core.js.map +1 -1
- package/package.json +2 -2
@@ -137,6 +137,9 @@
|
|
137
137
|
* @return Returns `true` if a child element with autofocus is found.
|
138
138
|
*/
|
139
139
|
SkyCoreAdapterService.prototype.applyAutoFocus = function (elementRef) {
|
140
|
+
if (!elementRef) {
|
141
|
+
return false;
|
142
|
+
}
|
140
143
|
var elementWithAutoFocus = elementRef.nativeElement.querySelector('[autofocus]');
|
141
144
|
// Child was found with the autofocus property. Set focus and return true.
|
142
145
|
if (elementWithAutoFocus) {
|
@@ -160,11 +163,13 @@
|
|
160
163
|
SkyCoreAdapterService.prototype.getFocusableChildrenAndApplyFocus = function (elementRef, containerSelector, focusOnContainerIfNoChildrenFound) {
|
161
164
|
if (focusOnContainerIfNoChildrenFound === void 0) { focusOnContainerIfNoChildrenFound = false; }
|
162
165
|
var containerElement = elementRef.nativeElement.querySelector(containerSelector);
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
166
|
+
if (containerElement) {
|
167
|
+
var focusableChildren = this.getFocusableChildren(containerElement);
|
168
|
+
// Focus first focusable child if available. Otherwise, set focus on container.
|
169
|
+
if (!this.focusFirstElement(focusableChildren) &&
|
170
|
+
focusOnContainerIfNoChildrenFound) {
|
171
|
+
containerElement.focus();
|
172
|
+
}
|
168
173
|
}
|
169
174
|
};
|
170
175
|
/**
|
@@ -175,6 +180,9 @@
|
|
175
180
|
*/
|
176
181
|
SkyCoreAdapterService.prototype.getFocusableChildren = function (element, options) {
|
177
182
|
var _this = this;
|
183
|
+
if (!element) {
|
184
|
+
return [];
|
185
|
+
}
|
178
186
|
var elements = Array.prototype.slice.call(element.querySelectorAll(SKY_TABBABLE_SELECTOR));
|
179
187
|
// Unless ignoreTabIndex = true, filter out elements with tabindex = -1.
|
180
188
|
if (!options || !options.ignoreTabIndex) {
|
@@ -3150,7 +3158,7 @@
|
|
3150
3158
|
});
|
3151
3159
|
_this.observeForScrollableHostChanges(scrollableHost, parentMutationObserver);
|
3152
3160
|
documentHiddenElementMutationObserver = _this.mutationObserverSvc.create(function () {
|
3153
|
-
if (!elementRef.nativeElement.offsetParent) {
|
3161
|
+
if (scrollableHost && !elementRef.nativeElement.offsetParent) {
|
3154
3162
|
scrollableHost = undefined;
|
3155
3163
|
_this.observeForScrollableHostChanges(scrollableHost, parentMutationObserver);
|
3156
3164
|
notifySubscribers(subscribers, scrollableHost);
|
package/documentation.json
CHANGED
@@ -1843,7 +1843,7 @@
|
|
1843
1843
|
"sources": [
|
1844
1844
|
{
|
1845
1845
|
"fileName": "projects/core/src/modules/adapter-service/adapter.service.ts",
|
1846
|
-
"line":
|
1846
|
+
"line": 154,
|
1847
1847
|
"character": 9
|
1848
1848
|
}
|
1849
1849
|
],
|
@@ -1915,7 +1915,7 @@
|
|
1915
1915
|
"sources": [
|
1916
1916
|
{
|
1917
1917
|
"fileName": "projects/core/src/modules/adapter-service/adapter.service.ts",
|
1918
|
-
"line":
|
1918
|
+
"line": 127,
|
1919
1919
|
"character": 9
|
1920
1920
|
}
|
1921
1921
|
],
|
@@ -2000,7 +2000,7 @@
|
|
2000
2000
|
"sources": [
|
2001
2001
|
{
|
2002
2002
|
"fileName": "projects/core/src/modules/adapter-service/adapter.service.ts",
|
2003
|
-
"line":
|
2003
|
+
"line": 187,
|
2004
2004
|
"character": 9
|
2005
2005
|
}
|
2006
2006
|
],
|
@@ -2056,7 +2056,7 @@
|
|
2056
2056
|
"sources": [
|
2057
2057
|
{
|
2058
2058
|
"fileName": "projects/core/src/modules/adapter-service/adapter.service.ts",
|
2059
|
-
"line":
|
2059
|
+
"line": 196,
|
2060
2060
|
"character": 9
|
2061
2061
|
}
|
2062
2062
|
],
|
@@ -2122,7 +2122,7 @@
|
|
2122
2122
|
"sources": [
|
2123
2123
|
{
|
2124
2124
|
"fileName": "projects/core/src/modules/adapter-service/adapter.service.ts",
|
2125
|
-
"line":
|
2125
|
+
"line": 230,
|
2126
2126
|
"character": 9
|
2127
2127
|
}
|
2128
2128
|
],
|
@@ -2263,7 +2263,7 @@
|
|
2263
2263
|
"sources": [
|
2264
2264
|
{
|
2265
2265
|
"fileName": "projects/core/src/modules/adapter-service/adapter.service.ts",
|
2266
|
-
"line":
|
2266
|
+
"line": 247,
|
2267
2267
|
"character": 9
|
2268
2268
|
}
|
2269
2269
|
],
|
@@ -73,6 +73,9 @@ export class SkyCoreAdapterService {
|
|
73
73
|
* @return Returns `true` if a child element with autofocus is found.
|
74
74
|
*/
|
75
75
|
applyAutoFocus(elementRef) {
|
76
|
+
if (!elementRef) {
|
77
|
+
return false;
|
78
|
+
}
|
76
79
|
const elementWithAutoFocus = elementRef.nativeElement.querySelector('[autofocus]');
|
77
80
|
// Child was found with the autofocus property. Set focus and return true.
|
78
81
|
if (elementWithAutoFocus) {
|
@@ -95,11 +98,13 @@ export class SkyCoreAdapterService {
|
|
95
98
|
*/
|
96
99
|
getFocusableChildrenAndApplyFocus(elementRef, containerSelector, focusOnContainerIfNoChildrenFound = false) {
|
97
100
|
const containerElement = elementRef.nativeElement.querySelector(containerSelector);
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
101
|
+
if (containerElement) {
|
102
|
+
const focusableChildren = this.getFocusableChildren(containerElement);
|
103
|
+
// Focus first focusable child if available. Otherwise, set focus on container.
|
104
|
+
if (!this.focusFirstElement(focusableChildren) &&
|
105
|
+
focusOnContainerIfNoChildrenFound) {
|
106
|
+
containerElement.focus();
|
107
|
+
}
|
103
108
|
}
|
104
109
|
}
|
105
110
|
/**
|
@@ -109,6 +114,9 @@ export class SkyCoreAdapterService {
|
|
109
114
|
* @param options - Options for getting focusable children.
|
110
115
|
*/
|
111
116
|
getFocusableChildren(element, options) {
|
117
|
+
if (!element) {
|
118
|
+
return [];
|
119
|
+
}
|
112
120
|
let elements = Array.prototype.slice.call(element.querySelectorAll(SKY_TABBABLE_SELECTOR));
|
113
121
|
// Unless ignoreTabIndex = true, filter out elements with tabindex = -1.
|
114
122
|
if (!options || !options.ignoreTabIndex) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"adapter.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/adapter-service/adapter.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ElementRef,\n Injectable,\n Renderer2,\n RendererFactory2,\n} from '@angular/core';\n\nimport { SkyMediaBreakpoints } from '../media-query/media-breakpoints';\n\nimport { SkyFocusableChildrenOptions } from './focusable-children-options';\n\nconst SKY_TABBABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled])',\n 'button:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '*[contenteditable=true]:not([disabled])',\n '*[tabindex]:not([disabled])',\n].join(', ');\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SkyCoreAdapterService {\n private renderer: Renderer2;\n\n constructor(private rendererFactory: RendererFactory2) {\n this.renderer = this.rendererFactory.createRenderer(undefined, undefined);\n }\n\n /**\n * Set the responsive container CSS class for a given element.\n *\n * @param elementRef - The element that will recieve the new CSS class.\n * @param breakpoint - The SkyMediaBreakpoint will determine which class\n * gets set. For example a SkyMediaBreakpoint of `xs` will set a CSS class of `sky-responsive-container-xs`.\n */\n public setResponsiveContainerClass(\n elementRef: ElementRef,\n breakpoint: SkyMediaBreakpoints\n ): void {\n const nativeEl: HTMLElement = elementRef.nativeElement;\n\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-xs');\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-sm');\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-md');\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-lg');\n\n let newClass: string;\n\n switch (breakpoint) {\n case SkyMediaBreakpoints.xs: {\n newClass = 'sky-responsive-container-xs';\n break;\n }\n case SkyMediaBreakpoints.sm: {\n newClass = 'sky-responsive-container-sm';\n break;\n }\n case SkyMediaBreakpoints.md: {\n newClass = 'sky-responsive-container-md';\n break;\n }\n default: {\n newClass = 'sky-responsive-container-lg';\n break;\n }\n }\n\n this.renderer.addClass(nativeEl, newClass);\n }\n\n /**\n * This method temporarily enables/disables pointer events.\n * This is helpful to prevent iFrames from interfering with drag events.\n *\n * @param enable - Set to `true` to enable pointer events. Set to `false` to disable.\n */\n public toggleIframePointerEvents(enable: boolean): void {\n const iframes = document.querySelectorAll('iframe');\n for (let i = 0; i < iframes.length; i++) {\n // Setting to empty string will allow iframe to fall back to its prior CSS assignment.\n iframes[i].style.pointerEvents = enable ? '' : 'none';\n }\n }\n\n /**\n * Focuses on the first element found with an `autofocus` attribute inside the supplied `elementRef`.\n *\n * @param elementRef - The element to search within.\n * @return Returns `true` if a child element with autofocus is found.\n */\n public applyAutoFocus(elementRef: ElementRef): boolean {\n const elementWithAutoFocus =\n elementRef.nativeElement.querySelector('[autofocus]');\n\n // Child was found with the autofocus property. Set focus and return true.\n if (elementWithAutoFocus) {\n elementWithAutoFocus.focus();\n return true;\n }\n\n // No children were found with autofocus property. Return false.\n return false;\n }\n\n /**\n * Sets focus on the first focusable child of the `elementRef` parameter.\n * If no focusable children are found, and `focusOnContainerIfNoChildrenFound` is `true`,\n * focus will be set on the container element.\n *\n * @param elementRef - The element to search within.\n * @param containerSelector - A CSS selector indicating the container that should\n * recieve focus if no focusable children are found.\n * @param focusOnContainerIfNoChildrenFound - It set to `true`, the container will\n * recieve focus if no focusable children are found.\n */\n public getFocusableChildrenAndApplyFocus(\n elementRef: ElementRef,\n containerSelector: string,\n focusOnContainerIfNoChildrenFound: boolean = false\n ): void {\n const containerElement =\n elementRef.nativeElement.querySelector(containerSelector);\n const focusableChildren = this.getFocusableChildren(containerElement);\n\n // Focus first focusable child if available. Otherwise, set focus on container.\n if (\n !this.focusFirstElement(focusableChildren) &&\n focusOnContainerIfNoChildrenFound\n ) {\n containerElement.focus();\n }\n }\n\n /**\n * Returns an array of all focusable children of provided `element`.\n *\n * @param element - The HTMLElement to search within.\n * @param options - Options for getting focusable children.\n */\n public getFocusableChildren(\n element: HTMLElement,\n options?: SkyFocusableChildrenOptions\n ): HTMLElement[] {\n let elements = Array.prototype.slice.call(\n element.querySelectorAll(SKY_TABBABLE_SELECTOR)\n );\n\n // Unless ignoreTabIndex = true, filter out elements with tabindex = -1.\n if (!options || !options.ignoreTabIndex) {\n elements = elements.filter((el: HTMLElement) => {\n return el.tabIndex !== -1;\n });\n }\n\n // Unless ignoreVisibility = true, filter out elements that are not visible.\n if (!options || !options.ignoreVisibility) {\n elements = elements.filter((el: HTMLElement) => {\n return this.isVisible(el);\n });\n }\n\n return elements;\n }\n\n /**\n * Returns the clientWidth of the provided elementRef.\n * @param elementRef - The element to calculate width from.\n */\n public getWidth(elementRef: ElementRef): number {\n return elementRef.nativeElement.clientWidth;\n }\n\n /**\n * Checks if an event target has a higher z-index than a given element.\n * @param target The event target element.\n * @param element The element to test against. A z-index must be explicitly set for this element.\n */\n public isTargetAboveElement(\n target: EventTarget,\n element: HTMLElement\n ): boolean {\n const zIndex: string = getComputedStyle(element).zIndex;\n\n let el: HTMLElement = target as HTMLElement;\n\n while (el) {\n // Getting the computed style only works for elements that exist in the DOM.\n // In certain scenarios, an element is removed after a click event; by the time the event\n // bubbles up to other elements, however, the element has been removed and the computed style returns empty.\n // In this case, we'll need to check the z-index directly, via the style property.\n const targetZIndex: string =\n getComputedStyle(el).zIndex || el.style.zIndex;\n if (\n targetZIndex !== '' &&\n targetZIndex !== 'auto' &&\n +targetZIndex > +zIndex\n ) {\n return true;\n }\n\n el = el.parentElement as HTMLElement;\n }\n\n return false;\n }\n\n /**\n * Remove inline height styles from the provided elements.\n * @param elementRef - The element to search within.\n * @param selector - The CSS selector to use when finding elements for removing height.\n */\n public resetHeight(elementRef: ElementRef, selector: string): void {\n const children = elementRef.nativeElement.querySelectorAll(selector);\n /* istanbul ignore else */\n if (children.length > 0) {\n for (let i = 0; i < children.length; i++) {\n // Setting style attributes with Web API requires null instead of undefined.\n // tslint:disable-next-line: no-null-keyword\n children[i].style.height = null;\n }\n }\n }\n\n /**\n * Sets all element heights to match the height of the tallest element.\n * @param elementRef - The element to search within.\n * @param selector - The CSS selector to use when finding elements for syncing height.\n */\n public syncMaxHeight(elementRef: ElementRef, selector: string): void {\n const children = elementRef.nativeElement.querySelectorAll(selector);\n /* istanbul ignore else */\n if (children.length > 0) {\n let maxHeight = 0;\n for (let i = 0; i < children.length; i++) {\n maxHeight = Math.max(maxHeight, children[i].offsetHeight);\n }\n for (let i = 0; i < children.length; i++) {\n children[i].style.height = maxHeight + 'px';\n }\n }\n }\n\n private focusFirstElement(list: Array<HTMLElement>): boolean {\n if (list.length > 0) {\n list[0].focus();\n return true;\n }\n return false;\n }\n\n private isVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element);\n const isHidden = style.display === 'none' || style.visibility === 'hidden';\n if (isHidden) {\n return false;\n }\n\n const hasBounds = !!(\n element.offsetWidth ||\n element.offsetHeight ||\n element.getClientRects().length\n );\n return hasBounds;\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"adapter.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/adapter-service/adapter.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ElementRef,\n Injectable,\n Renderer2,\n RendererFactory2,\n} from '@angular/core';\n\nimport { SkyMediaBreakpoints } from '../media-query/media-breakpoints';\n\nimport { SkyFocusableChildrenOptions } from './focusable-children-options';\n\nconst SKY_TABBABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled])',\n 'button:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '*[contenteditable=true]:not([disabled])',\n '*[tabindex]:not([disabled])',\n].join(', ');\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SkyCoreAdapterService {\n private renderer: Renderer2;\n\n constructor(private rendererFactory: RendererFactory2) {\n this.renderer = this.rendererFactory.createRenderer(undefined, undefined);\n }\n\n /**\n * Set the responsive container CSS class for a given element.\n *\n * @param elementRef - The element that will recieve the new CSS class.\n * @param breakpoint - The SkyMediaBreakpoint will determine which class\n * gets set. For example a SkyMediaBreakpoint of `xs` will set a CSS class of `sky-responsive-container-xs`.\n */\n public setResponsiveContainerClass(\n elementRef: ElementRef,\n breakpoint: SkyMediaBreakpoints\n ): void {\n const nativeEl: HTMLElement = elementRef.nativeElement;\n\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-xs');\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-sm');\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-md');\n this.renderer.removeClass(nativeEl, 'sky-responsive-container-lg');\n\n let newClass: string;\n\n switch (breakpoint) {\n case SkyMediaBreakpoints.xs: {\n newClass = 'sky-responsive-container-xs';\n break;\n }\n case SkyMediaBreakpoints.sm: {\n newClass = 'sky-responsive-container-sm';\n break;\n }\n case SkyMediaBreakpoints.md: {\n newClass = 'sky-responsive-container-md';\n break;\n }\n default: {\n newClass = 'sky-responsive-container-lg';\n break;\n }\n }\n\n this.renderer.addClass(nativeEl, newClass);\n }\n\n /**\n * This method temporarily enables/disables pointer events.\n * This is helpful to prevent iFrames from interfering with drag events.\n *\n * @param enable - Set to `true` to enable pointer events. Set to `false` to disable.\n */\n public toggleIframePointerEvents(enable: boolean): void {\n const iframes = document.querySelectorAll('iframe');\n for (let i = 0; i < iframes.length; i++) {\n // Setting to empty string will allow iframe to fall back to its prior CSS assignment.\n iframes[i].style.pointerEvents = enable ? '' : 'none';\n }\n }\n\n /**\n * Focuses on the first element found with an `autofocus` attribute inside the supplied `elementRef`.\n *\n * @param elementRef - The element to search within.\n * @return Returns `true` if a child element with autofocus is found.\n */\n public applyAutoFocus(elementRef: ElementRef): boolean {\n if (!elementRef) {\n return false;\n }\n\n const elementWithAutoFocus =\n elementRef.nativeElement.querySelector('[autofocus]');\n\n // Child was found with the autofocus property. Set focus and return true.\n if (elementWithAutoFocus) {\n elementWithAutoFocus.focus();\n return true;\n }\n\n // No children were found with autofocus property. Return false.\n return false;\n }\n\n /**\n * Sets focus on the first focusable child of the `elementRef` parameter.\n * If no focusable children are found, and `focusOnContainerIfNoChildrenFound` is `true`,\n * focus will be set on the container element.\n *\n * @param elementRef - The element to search within.\n * @param containerSelector - A CSS selector indicating the container that should\n * recieve focus if no focusable children are found.\n * @param focusOnContainerIfNoChildrenFound - It set to `true`, the container will\n * recieve focus if no focusable children are found.\n */\n public getFocusableChildrenAndApplyFocus(\n elementRef: ElementRef,\n containerSelector: string,\n focusOnContainerIfNoChildrenFound: boolean = false\n ): void {\n const containerElement =\n elementRef.nativeElement.querySelector(containerSelector);\n\n if (containerElement) {\n const focusableChildren = this.getFocusableChildren(containerElement);\n\n // Focus first focusable child if available. Otherwise, set focus on container.\n if (\n !this.focusFirstElement(focusableChildren) &&\n focusOnContainerIfNoChildrenFound\n ) {\n containerElement.focus();\n }\n }\n }\n\n /**\n * Returns an array of all focusable children of provided `element`.\n *\n * @param element - The HTMLElement to search within.\n * @param options - Options for getting focusable children.\n */\n public getFocusableChildren(\n element: HTMLElement,\n options?: SkyFocusableChildrenOptions\n ): HTMLElement[] {\n if (!element) {\n return [];\n }\n\n let elements = Array.prototype.slice.call(\n element.querySelectorAll(SKY_TABBABLE_SELECTOR)\n );\n\n // Unless ignoreTabIndex = true, filter out elements with tabindex = -1.\n if (!options || !options.ignoreTabIndex) {\n elements = elements.filter((el: HTMLElement) => {\n return el.tabIndex !== -1;\n });\n }\n\n // Unless ignoreVisibility = true, filter out elements that are not visible.\n if (!options || !options.ignoreVisibility) {\n elements = elements.filter((el: HTMLElement) => {\n return this.isVisible(el);\n });\n }\n\n return elements;\n }\n\n /**\n * Returns the clientWidth of the provided elementRef.\n * @param elementRef - The element to calculate width from.\n */\n public getWidth(elementRef: ElementRef): number {\n return elementRef.nativeElement.clientWidth;\n }\n\n /**\n * Checks if an event target has a higher z-index than a given element.\n * @param target The event target element.\n * @param element The element to test against. A z-index must be explicitly set for this element.\n */\n public isTargetAboveElement(\n target: EventTarget,\n element: HTMLElement\n ): boolean {\n const zIndex: string = getComputedStyle(element).zIndex;\n\n let el: HTMLElement = target as HTMLElement;\n\n while (el) {\n // Getting the computed style only works for elements that exist in the DOM.\n // In certain scenarios, an element is removed after a click event; by the time the event\n // bubbles up to other elements, however, the element has been removed and the computed style returns empty.\n // In this case, we'll need to check the z-index directly, via the style property.\n const targetZIndex: string =\n getComputedStyle(el).zIndex || el.style.zIndex;\n if (\n targetZIndex !== '' &&\n targetZIndex !== 'auto' &&\n +targetZIndex > +zIndex\n ) {\n return true;\n }\n\n el = el.parentElement as HTMLElement;\n }\n\n return false;\n }\n\n /**\n * Remove inline height styles from the provided elements.\n * @param elementRef - The element to search within.\n * @param selector - The CSS selector to use when finding elements for removing height.\n */\n public resetHeight(elementRef: ElementRef, selector: string): void {\n const children = elementRef.nativeElement.querySelectorAll(selector);\n /* istanbul ignore else */\n if (children.length > 0) {\n for (let i = 0; i < children.length; i++) {\n // Setting style attributes with Web API requires null instead of undefined.\n // tslint:disable-next-line: no-null-keyword\n children[i].style.height = null;\n }\n }\n }\n\n /**\n * Sets all element heights to match the height of the tallest element.\n * @param elementRef - The element to search within.\n * @param selector - The CSS selector to use when finding elements for syncing height.\n */\n public syncMaxHeight(elementRef: ElementRef, selector: string): void {\n const children = elementRef.nativeElement.querySelectorAll(selector);\n /* istanbul ignore else */\n if (children.length > 0) {\n let maxHeight = 0;\n for (let i = 0; i < children.length; i++) {\n maxHeight = Math.max(maxHeight, children[i].offsetHeight);\n }\n for (let i = 0; i < children.length; i++) {\n children[i].style.height = maxHeight + 'px';\n }\n }\n }\n\n private focusFirstElement(list: Array<HTMLElement>): boolean {\n if (list.length > 0) {\n list[0].focus();\n return true;\n }\n return false;\n }\n\n private isVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element);\n const isHidden = style.display === 'none' || style.visibility === 'hidden';\n if (isHidden) {\n return false;\n }\n\n const hasBounds = !!(\n element.offsetWidth ||\n element.offsetHeight ||\n element.getClientRects().length\n );\n return hasBounds;\n }\n}\n"]}
|
@@ -50,7 +50,7 @@ export class SkyScrollableHostService {
|
|
50
50
|
});
|
51
51
|
this.observeForScrollableHostChanges(scrollableHost, parentMutationObserver);
|
52
52
|
documentHiddenElementMutationObserver = this.mutationObserverSvc.create(() => {
|
53
|
-
if (!elementRef.nativeElement.offsetParent) {
|
53
|
+
if (scrollableHost && !elementRef.nativeElement.offsetParent) {
|
54
54
|
scrollableHost = undefined;
|
55
55
|
this.observeForScrollableHostChanges(scrollableHost, parentMutationObserver);
|
56
56
|
notifySubscribers(subscribers, scrollableHost);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"scrollable-host.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/scrollable-host/scrollable-host.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ElementRef, Injectable } from '@angular/core';\n\nimport { Observable, Subject, Subscriber, Subscription, fromEvent } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { MutationObserverService } from '../mutation/mutation-observer-service';\nimport { SkyAppWindowRef } from '../window/window-ref';\n\nfunction notifySubscribers(subscribers: Subscriber<unknown>[], item?: unknown) {\n for (const subscriber of subscribers) {\n subscriber.next(item);\n }\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SkyScrollableHostService {\n constructor(\n private mutationObserverSvc: MutationObserverService,\n private windowRef: SkyAppWindowRef\n ) {}\n\n /**\n * Returns the given element's current scrollable host\n * @param elementRef The element whose scrollable host is being requested\n * @returns The current scrollable host\n */\n public getScrollableHost(elementRef: ElementRef): HTMLElement | Window {\n return this.findScrollableHost(elementRef.nativeElement);\n }\n\n /**\n * Returns an observable which emits the given element's current scrollable host\n * @param elementRef The element whose scrollable host is being requested\n * @param completionObservable An observable which alerts the internal observers that they should complete\n * @returns An observable which emits the current scrollable host\n * @internal\n */\n public watchScrollableHost(\n elementRef: ElementRef\n ): Observable<HTMLElement | Window> {\n const subscribers: Subscriber<HTMLElement | Window>[] = [];\n let parentMutationObserver: MutationObserver;\n let documentHiddenElementMutationObserver: MutationObserver;\n\n return new Observable((subscriber) => {\n subscribers.push(subscriber);\n\n let scrollableHost = this.findScrollableHost(elementRef.nativeElement);\n if (subscribers.length === 1) {\n parentMutationObserver = this.mutationObserverSvc.create(() => {\n const newScrollableHost = this.findScrollableHost(\n elementRef.nativeElement\n );\n\n if (\n newScrollableHost !== scrollableHost &&\n elementRef.nativeElement.offsetParent\n ) {\n scrollableHost = newScrollableHost;\n this.observeForScrollableHostChanges(\n scrollableHost,\n parentMutationObserver\n );\n\n notifySubscribers(subscribers, scrollableHost);\n }\n });\n this.observeForScrollableHostChanges(\n scrollableHost,\n parentMutationObserver\n );\n\n documentHiddenElementMutationObserver = this.mutationObserverSvc.create(\n () => {\n if (!elementRef.nativeElement.offsetParent) {\n scrollableHost = undefined;\n\n this.observeForScrollableHostChanges(\n scrollableHost,\n parentMutationObserver\n );\n\n notifySubscribers(subscribers, scrollableHost);\n }\n }\n );\n this.observeDocumentHiddenElementChanges(\n documentHiddenElementMutationObserver\n );\n }\n subscriber.next(scrollableHost);\n\n subscriber.add(() => {\n const subIndex = subscribers.indexOf(subscriber);\n\n /* sanity check */\n /* istanbul ignore else */\n if (subIndex >= 0) {\n subscribers.splice(subIndex, 1);\n }\n\n if (subscribers.length === 0) {\n documentHiddenElementMutationObserver.disconnect();\n parentMutationObserver.disconnect();\n }\n });\n });\n }\n\n /**\n * Returns an observable which emits whenever the element's scrollable host emits a scroll event. The observable will always emit the scroll events from the elements current scrollable host and will update based on any scrollable host changes. The observable will also emit once whenever the scrollable host changes.\n * @param elementRef The element whose scrollable host scroll events are being requested\n * @param completionObservable An observable which alerts the internal observers that they should complete\n * @returns An observable which emits when the elements scrollable host is scrolled or is changed\n */\n public watchScrollableHostScrollEvents(\n elementRef: ElementRef\n ): Observable<void> {\n const subscribers: Subscriber<void>[] = [];\n let scrollableHost: HTMLElement | Window;\n\n let newScrollableHostObservable = new Subject();\n let scrollableHostSubscription: Subscription;\n let scrollEventSubscription: Subscription;\n return new Observable((subscriber) => {\n subscribers.push(subscriber);\n\n if (subscribers.length === 1) {\n scrollableHostSubscription = this.watchScrollableHost(\n elementRef\n ).subscribe((newScrollableHost) => {\n newScrollableHostObservable.next();\n newScrollableHostObservable.complete();\n if (scrollableHost && scrollableHost !== newScrollableHost) {\n notifySubscribers(subscribers);\n }\n scrollableHost = newScrollableHost;\n newScrollableHostObservable = new Subject();\n if (newScrollableHost) {\n scrollEventSubscription = fromEvent(newScrollableHost, 'scroll')\n .pipe(takeUntil(newScrollableHostObservable))\n .subscribe(() => {\n notifySubscribers(subscribers);\n });\n }\n });\n }\n\n subscriber.add(() => {\n const subIndex = subscribers.indexOf(subscriber);\n\n /* sanity check */\n /* istanbul ignore else */\n if (subIndex >= 0) {\n subscribers.splice(subIndex, 1);\n }\n\n if (subscribers.length === 0) {\n scrollableHostSubscription.unsubscribe();\n scrollEventSubscription.unsubscribe();\n newScrollableHostObservable.complete();\n }\n });\n });\n }\n\n private findScrollableHost(element: HTMLElement): HTMLElement | Window {\n const regex = /(auto|scroll)/;\n const windowObj = this.windowRef.nativeWindow;\n const bodyObj = windowObj.document.body;\n\n /* Sanity check */\n if (!element) {\n return windowObj;\n }\n\n let style = windowObj.getComputedStyle(element);\n let parent: HTMLElement = element;\n\n do {\n parent = parent.parentNode as HTMLElement;\n\n /* Sanity check for if this function is called for an element which has been removed from the DOM */\n if (!(parent instanceof HTMLElement)) {\n return windowObj;\n }\n\n style = windowObj.getComputedStyle(parent);\n } while (\n !regex.test(style.overflow) &&\n !regex.test(style.overflowY) &&\n parent !== bodyObj\n );\n\n if (parent === bodyObj) {\n return windowObj;\n }\n\n return parent;\n }\n\n private observeDocumentHiddenElementChanges(\n mutationObserver: MutationObserver\n ) {\n mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'style', 'hidden'],\n childList: true,\n subtree: true,\n });\n }\n\n private observeForScrollableHostChanges(\n element: HTMLElement | Window,\n mutationObserver: MutationObserver\n ) {\n mutationObserver.disconnect();\n if (element instanceof HTMLElement) {\n mutationObserver.observe(element, {\n attributes: true,\n attributeFilter: ['class', 'style'],\n childList: true,\n subtree: true,\n });\n } else {\n mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'style'],\n childList: true,\n subtree: true,\n });\n }\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"scrollable-host.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/scrollable-host/scrollable-host.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ElementRef, Injectable } from '@angular/core';\n\nimport { Observable, Subject, Subscriber, Subscription, fromEvent } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { MutationObserverService } from '../mutation/mutation-observer-service';\nimport { SkyAppWindowRef } from '../window/window-ref';\n\nfunction notifySubscribers(subscribers: Subscriber<unknown>[], item?: unknown) {\n for (const subscriber of subscribers) {\n subscriber.next(item);\n }\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SkyScrollableHostService {\n constructor(\n private mutationObserverSvc: MutationObserverService,\n private windowRef: SkyAppWindowRef\n ) {}\n\n /**\n * Returns the given element's current scrollable host\n * @param elementRef The element whose scrollable host is being requested\n * @returns The current scrollable host\n */\n public getScrollableHost(elementRef: ElementRef): HTMLElement | Window {\n return this.findScrollableHost(elementRef.nativeElement);\n }\n\n /**\n * Returns an observable which emits the given element's current scrollable host\n * @param elementRef The element whose scrollable host is being requested\n * @param completionObservable An observable which alerts the internal observers that they should complete\n * @returns An observable which emits the current scrollable host\n * @internal\n */\n public watchScrollableHost(\n elementRef: ElementRef\n ): Observable<HTMLElement | Window> {\n const subscribers: Subscriber<HTMLElement | Window>[] = [];\n let parentMutationObserver: MutationObserver;\n let documentHiddenElementMutationObserver: MutationObserver;\n\n return new Observable((subscriber) => {\n subscribers.push(subscriber);\n\n let scrollableHost = this.findScrollableHost(elementRef.nativeElement);\n if (subscribers.length === 1) {\n parentMutationObserver = this.mutationObserverSvc.create(() => {\n const newScrollableHost = this.findScrollableHost(\n elementRef.nativeElement\n );\n\n if (\n newScrollableHost !== scrollableHost &&\n elementRef.nativeElement.offsetParent\n ) {\n scrollableHost = newScrollableHost;\n this.observeForScrollableHostChanges(\n scrollableHost,\n parentMutationObserver\n );\n\n notifySubscribers(subscribers, scrollableHost);\n }\n });\n this.observeForScrollableHostChanges(\n scrollableHost,\n parentMutationObserver\n );\n\n documentHiddenElementMutationObserver = this.mutationObserverSvc.create(\n () => {\n if (scrollableHost && !elementRef.nativeElement.offsetParent) {\n scrollableHost = undefined;\n\n this.observeForScrollableHostChanges(\n scrollableHost,\n parentMutationObserver\n );\n\n notifySubscribers(subscribers, scrollableHost);\n }\n }\n );\n this.observeDocumentHiddenElementChanges(\n documentHiddenElementMutationObserver\n );\n }\n subscriber.next(scrollableHost);\n\n subscriber.add(() => {\n const subIndex = subscribers.indexOf(subscriber);\n\n /* sanity check */\n /* istanbul ignore else */\n if (subIndex >= 0) {\n subscribers.splice(subIndex, 1);\n }\n\n if (subscribers.length === 0) {\n documentHiddenElementMutationObserver.disconnect();\n parentMutationObserver.disconnect();\n }\n });\n });\n }\n\n /**\n * Returns an observable which emits whenever the element's scrollable host emits a scroll event. The observable will always emit the scroll events from the elements current scrollable host and will update based on any scrollable host changes. The observable will also emit once whenever the scrollable host changes.\n * @param elementRef The element whose scrollable host scroll events are being requested\n * @param completionObservable An observable which alerts the internal observers that they should complete\n * @returns An observable which emits when the elements scrollable host is scrolled or is changed\n */\n public watchScrollableHostScrollEvents(\n elementRef: ElementRef\n ): Observable<void> {\n const subscribers: Subscriber<void>[] = [];\n let scrollableHost: HTMLElement | Window;\n\n let newScrollableHostObservable = new Subject();\n let scrollableHostSubscription: Subscription;\n let scrollEventSubscription: Subscription;\n return new Observable((subscriber) => {\n subscribers.push(subscriber);\n\n if (subscribers.length === 1) {\n scrollableHostSubscription = this.watchScrollableHost(\n elementRef\n ).subscribe((newScrollableHost) => {\n newScrollableHostObservable.next();\n newScrollableHostObservable.complete();\n if (scrollableHost && scrollableHost !== newScrollableHost) {\n notifySubscribers(subscribers);\n }\n scrollableHost = newScrollableHost;\n newScrollableHostObservable = new Subject();\n if (newScrollableHost) {\n scrollEventSubscription = fromEvent(newScrollableHost, 'scroll')\n .pipe(takeUntil(newScrollableHostObservable))\n .subscribe(() => {\n notifySubscribers(subscribers);\n });\n }\n });\n }\n\n subscriber.add(() => {\n const subIndex = subscribers.indexOf(subscriber);\n\n /* sanity check */\n /* istanbul ignore else */\n if (subIndex >= 0) {\n subscribers.splice(subIndex, 1);\n }\n\n if (subscribers.length === 0) {\n scrollableHostSubscription.unsubscribe();\n scrollEventSubscription.unsubscribe();\n newScrollableHostObservable.complete();\n }\n });\n });\n }\n\n private findScrollableHost(element: HTMLElement): HTMLElement | Window {\n const regex = /(auto|scroll)/;\n const windowObj = this.windowRef.nativeWindow;\n const bodyObj = windowObj.document.body;\n\n /* Sanity check */\n if (!element) {\n return windowObj;\n }\n\n let style = windowObj.getComputedStyle(element);\n let parent: HTMLElement = element;\n\n do {\n parent = parent.parentNode as HTMLElement;\n\n /* Sanity check for if this function is called for an element which has been removed from the DOM */\n if (!(parent instanceof HTMLElement)) {\n return windowObj;\n }\n\n style = windowObj.getComputedStyle(parent);\n } while (\n !regex.test(style.overflow) &&\n !regex.test(style.overflowY) &&\n parent !== bodyObj\n );\n\n if (parent === bodyObj) {\n return windowObj;\n }\n\n return parent;\n }\n\n private observeDocumentHiddenElementChanges(\n mutationObserver: MutationObserver\n ) {\n mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'style', 'hidden'],\n childList: true,\n subtree: true,\n });\n }\n\n private observeForScrollableHostChanges(\n element: HTMLElement | Window,\n mutationObserver: MutationObserver\n ) {\n mutationObserver.disconnect();\n if (element instanceof HTMLElement) {\n mutationObserver.observe(element, {\n attributes: true,\n attributeFilter: ['class', 'style'],\n childList: true,\n subtree: true,\n });\n } else {\n mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'style'],\n childList: true,\n subtree: true,\n });\n }\n }\n}\n"]}
|
package/fesm2015/skyux-core.js
CHANGED
@@ -116,6 +116,9 @@ class SkyCoreAdapterService {
|
|
116
116
|
* @return Returns `true` if a child element with autofocus is found.
|
117
117
|
*/
|
118
118
|
applyAutoFocus(elementRef) {
|
119
|
+
if (!elementRef) {
|
120
|
+
return false;
|
121
|
+
}
|
119
122
|
const elementWithAutoFocus = elementRef.nativeElement.querySelector('[autofocus]');
|
120
123
|
// Child was found with the autofocus property. Set focus and return true.
|
121
124
|
if (elementWithAutoFocus) {
|
@@ -138,11 +141,13 @@ class SkyCoreAdapterService {
|
|
138
141
|
*/
|
139
142
|
getFocusableChildrenAndApplyFocus(elementRef, containerSelector, focusOnContainerIfNoChildrenFound = false) {
|
140
143
|
const containerElement = elementRef.nativeElement.querySelector(containerSelector);
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
144
|
+
if (containerElement) {
|
145
|
+
const focusableChildren = this.getFocusableChildren(containerElement);
|
146
|
+
// Focus first focusable child if available. Otherwise, set focus on container.
|
147
|
+
if (!this.focusFirstElement(focusableChildren) &&
|
148
|
+
focusOnContainerIfNoChildrenFound) {
|
149
|
+
containerElement.focus();
|
150
|
+
}
|
146
151
|
}
|
147
152
|
}
|
148
153
|
/**
|
@@ -152,6 +157,9 @@ class SkyCoreAdapterService {
|
|
152
157
|
* @param options - Options for getting focusable children.
|
153
158
|
*/
|
154
159
|
getFocusableChildren(element, options) {
|
160
|
+
if (!element) {
|
161
|
+
return [];
|
162
|
+
}
|
155
163
|
let elements = Array.prototype.slice.call(element.querySelectorAll(SKY_TABBABLE_SELECTOR));
|
156
164
|
// Unless ignoreTabIndex = true, filter out elements with tabindex = -1.
|
157
165
|
if (!options || !options.ignoreTabIndex) {
|
@@ -2632,7 +2640,7 @@ class SkyScrollableHostService {
|
|
2632
2640
|
});
|
2633
2641
|
this.observeForScrollableHostChanges(scrollableHost, parentMutationObserver);
|
2634
2642
|
documentHiddenElementMutationObserver = this.mutationObserverSvc.create(() => {
|
2635
|
-
if (!elementRef.nativeElement.offsetParent) {
|
2643
|
+
if (scrollableHost && !elementRef.nativeElement.offsetParent) {
|
2636
2644
|
scrollableHost = undefined;
|
2637
2645
|
this.observeForScrollableHostChanges(scrollableHost, parentMutationObserver);
|
2638
2646
|
notifySubscribers(subscribers, scrollableHost);
|