@internetarchive/modal-manager 2.0.4-alpha-webdev7960.0 → 2.0.4-alpha-webdev7960.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/dist/src/assets/arrow-left-icon.js +12 -12
- package/dist/src/assets/arrow-left-icon.js.map +1 -1
- package/dist/src/assets/ia-logo-icon.js +27 -27
- package/dist/src/assets/ia-logo-icon.js.map +1 -1
- package/dist/src/modal-config.js.map +1 -1
- package/dist/src/modal-manager-host-bridge-interface.js.map +1 -1
- package/dist/src/modal-manager-host-bridge.js.map +1 -1
- package/dist/src/modal-manager-interface.js.map +1 -1
- package/dist/src/modal-manager-mode.js.map +1 -1
- package/dist/src/modal-manager.d.ts +1 -1
- package/dist/src/modal-manager.js +41 -39
- package/dist/src/modal-manager.js.map +1 -1
- package/dist/src/modal-template.js +220 -220
- package/dist/src/modal-template.js.map +1 -1
- package/dist/src/shoelace/active-elements.js.map +1 -1
- package/dist/src/shoelace/modal.js.map +1 -1
- package/dist/src/shoelace/tabbable.js.map +1 -1
- package/dist/test/modal-config.test.js.map +1 -1
- package/dist/test/modal-manager.test.js +75 -40
- package/dist/test/modal-manager.test.js.map +1 -1
- package/dist/test/modal-template.test.js +22 -22
- package/dist/test/modal-template.test.js.map +1 -1
- package/dist/vite.config.js.map +1 -1
- package/index.ts +7 -7
- package/package.json +1 -1
- package/src/assets/arrow-left-icon.ts +15 -15
- package/src/assets/ia-logo-icon.ts +30 -30
- package/src/modal-config.ts +133 -133
- package/src/modal-manager-host-bridge-interface.ts +13 -13
- package/src/modal-manager-host-bridge.ts +82 -82
- package/src/modal-manager-interface.ts +30 -30
- package/src/modal-manager-mode.ts +10 -10
- package/src/modal-manager.ts +305 -303
- package/src/modal-template.ts +343 -343
- package/src/shoelace/active-elements.ts +33 -33
- package/src/shoelace/modal.ts +166 -166
- package/src/shoelace/tabbable.ts +223 -223
- package/test/modal-config.test.ts +77 -77
- package/test/modal-manager.test.ts +393 -347
- package/test/modal-template.test.ts +206 -206
- package/vite.config.ts +23 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabbable.js","sourceRoot":"","sources":["../../../src/shoelace/tabbable.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\r\n// Cached compute style calls. This is specifically for browsers that dont support `checkVisibility()`.\r\n// computedStyle calls are \"live\" so they only need to be retrieved once for an element.\r\nconst computedStyleMap = new WeakMap<Element, CSSStyleDeclaration>();\r\n\r\nfunction getCachedComputedStyle(el: HTMLElement): CSSStyleDeclaration {\r\n let computedStyle: undefined | CSSStyleDeclaration = computedStyleMap.get(el);\r\n\r\n if (!computedStyle) {\r\n computedStyle = window.getComputedStyle(el, null);\r\n computedStyleMap.set(el, computedStyle);\r\n }\r\n\r\n return computedStyle;\r\n}\r\n\r\nfunction isVisible(el: HTMLElement): boolean {\r\n // This is the fastest check, but isn't supported in Safari.\r\n if ('checkVisibility' in el && typeof el['checkVisibility'] === 'function') {\r\n // Opacity is focusable, visibility is not.\r\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\r\n return (el as any)['checkVisibility']({\r\n checkOpacity: false,\r\n checkVisibilityCSS: true,\r\n });\r\n }\r\n\r\n // Fallback \"polyfill\" for \"checkVisibility\"\r\n const computedStyle = getCachedComputedStyle(el as HTMLElement);\r\n\r\n return (\r\n computedStyle.visibility !== 'hidden' && computedStyle.display !== 'none'\r\n );\r\n}\r\n\r\n// While this behavior isn't standard in Safari / Chrome yet, I think it's the most reasonable\r\n// way of handling tabbable overflow areas. Browser sniffing seems gross, and it's the most\r\n// accessible way of handling overflow areas. [Konnor]\r\nfunction isOverflowingAndTabbable(el: HTMLElement): boolean {\r\n const computedStyle = getCachedComputedStyle(el);\r\n\r\n const { overflowY, overflowX } = computedStyle;\r\n\r\n if (overflowY === 'scroll' || overflowX === 'scroll') {\r\n return true;\r\n }\r\n\r\n if (overflowY !== 'auto' || overflowX !== 'auto') {\r\n return false;\r\n }\r\n\r\n // Always overflow === \"auto\" by this point\r\n const isOverflowingY = el.scrollHeight > el.clientHeight;\r\n\r\n if (isOverflowingY && overflowY === 'auto') {\r\n return true;\r\n }\r\n\r\n const isOverflowingX = el.scrollWidth > el.clientWidth;\r\n\r\n if (isOverflowingX && overflowX === 'auto') {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** Determines if the specified element is tabbable using heuristics inspired by https://github.com/focus-trap/tabbable */\r\nfunction isTabbable(el: HTMLElement) {\r\n const tag = el.tagName.toLowerCase();\r\n\r\n const tabindex = Number(el.getAttribute('tabindex'));\r\n const hasTabindex = el.hasAttribute('tabindex');\r\n\r\n // elements with a tabindex attribute that is either NaN or <= -1 are not tabbable\r\n if (hasTabindex && (isNaN(tabindex) || tabindex <= -1)) {\r\n return false;\r\n }\r\n\r\n // Elements with a disabled attribute are not tabbable\r\n if (el.hasAttribute('disabled')) {\r\n return false;\r\n }\r\n\r\n // If any parents have \"inert\", we aren't \"tabbable\"\r\n if (el.closest('[inert]')) {\r\n return false;\r\n }\r\n\r\n // Radios without a checked attribute are not tabbable\r\n if (\r\n tag === 'input' &&\r\n el.getAttribute('type') === 'radio' &&\r\n !el.hasAttribute('checked')\r\n ) {\r\n return false;\r\n }\r\n\r\n if (!isVisible(el)) {\r\n return false;\r\n }\r\n\r\n // Audio and video elements with the controls attribute are tabbable\r\n if ((tag === 'audio' || tag === 'video') && el.hasAttribute('controls')) {\r\n return true;\r\n }\r\n\r\n // Elements with a tabindex other than -1 are tabbable\r\n if (el.hasAttribute('tabindex')) {\r\n return true;\r\n }\r\n\r\n // Elements with a contenteditable attribute are tabbable\r\n if (\r\n el.hasAttribute('contenteditable') &&\r\n el.getAttribute('contenteditable') !== 'false'\r\n ) {\r\n return true;\r\n }\r\n\r\n // At this point, the following elements are considered tabbable\r\n const isNativelyTabbable = [\r\n 'button',\r\n 'input',\r\n 'select',\r\n 'textarea',\r\n 'a',\r\n 'audio',\r\n 'video',\r\n 'summary',\r\n 'iframe',\r\n ].includes(tag);\r\n\r\n if (isNativelyTabbable) {\r\n return true;\r\n }\r\n\r\n // We save the overflow checks for last, because they're the most expensive\r\n return isOverflowingAndTabbable(el);\r\n}\r\n\r\n/**\r\n * Returns the first and last bounding elements that are tabbable. This is more performant than checking every single\r\n * element because it short-circuits after finding the first and last ones.\r\n */\r\nexport function getTabbableBoundary(root: HTMLElement | ShadowRoot) {\r\n const tabbableElements = getTabbableElements(root);\r\n\r\n // Find the first and last tabbable elements\r\n const start = tabbableElements[0] ?? null;\r\n const end = tabbableElements[tabbableElements.length - 1] ?? null;\r\n\r\n return { start, end };\r\n}\r\n\r\n/**\r\n * This looks funky. Basically a slot's children will always be picked up *if* they're within the `root` element.\r\n * However, there is an edge case when, if the `root` is wrapped by another shadow DOM, it won't grab the children.\r\n * This fixes that fun edge case.\r\n */\r\nfunction getSlottedChildrenOutsideRootElement(\r\n slotElement: HTMLSlotElement,\r\n root: HTMLElement | ShadowRoot\r\n) {\r\n return (\r\n (slotElement.getRootNode({ composed: true }) as ShadowRoot | null)?.host !==\r\n root\r\n );\r\n}\r\n\r\nexport function getTabbableElements(root: HTMLElement | ShadowRoot) {\r\n const walkedEls = new WeakMap();\r\n const tabbableElements: HTMLElement[] = [];\r\n\r\n function walk(el: HTMLElement | ShadowRoot) {\r\n if (el instanceof Element) {\r\n // if the element has \"inert\" we can just no-op it.\r\n if (el.hasAttribute('inert') || el.closest('[inert]')) {\r\n return;\r\n }\r\n\r\n if (walkedEls.has(el)) {\r\n return;\r\n }\r\n walkedEls.set(el, true);\r\n\r\n if (!tabbableElements.includes(el) && isTabbable(el)) {\r\n tabbableElements.push(el);\r\n }\r\n\r\n if (\r\n el instanceof HTMLSlotElement &&\r\n getSlottedChildrenOutsideRootElement(el, root)\r\n ) {\r\n el.assignedElements({ flatten: true }).forEach(\r\n (assignedEl: Element) => {\r\n walk(assignedEl as HTMLElement | ShadowRoot);\r\n }\r\n );\r\n }\r\n\r\n if (el.shadowRoot !== null && el.shadowRoot.mode === 'open') {\r\n walk(el.shadowRoot);\r\n }\r\n }\r\n\r\n for (const e of Array.from(el.children) as HTMLElement[]) {\r\n walk(e);\r\n }\r\n }\r\n\r\n // Collect all elements including the root\r\n walk(root);\r\n\r\n // Is this worth having? Most sorts will always add increased overhead. And positive tabindexes shouldn't really be used.\r\n // So is it worth being right? Or fast?\r\n return tabbableElements.sort((a, b) => {\r\n // Make sure we sort by tabindex.\r\n const aTabindex = Number(a.getAttribute('tabindex')) || 0;\r\n const bTabindex = Number(b.getAttribute('tabindex')) || 0;\r\n return bTabindex - aTabindex;\r\n });\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"tabbable.js","sourceRoot":"","sources":["../../../src/shoelace/tabbable.ts"],"names":[],"mappings":"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","sourcesContent":["/* istanbul ignore file */\n// Cached compute style calls. This is specifically for browsers that dont support `checkVisibility()`.\n// computedStyle calls are \"live\" so they only need to be retrieved once for an element.\nconst computedStyleMap = new WeakMap<Element, CSSStyleDeclaration>();\n\nfunction getCachedComputedStyle(el: HTMLElement): CSSStyleDeclaration {\n let computedStyle: undefined | CSSStyleDeclaration = computedStyleMap.get(el);\n\n if (!computedStyle) {\n computedStyle = window.getComputedStyle(el, null);\n computedStyleMap.set(el, computedStyle);\n }\n\n return computedStyle;\n}\n\nfunction isVisible(el: HTMLElement): boolean {\n // This is the fastest check, but isn't supported in Safari.\n if ('checkVisibility' in el && typeof el['checkVisibility'] === 'function') {\n // Opacity is focusable, visibility is not.\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n return (el as any)['checkVisibility']({\n checkOpacity: false,\n checkVisibilityCSS: true,\n });\n }\n\n // Fallback \"polyfill\" for \"checkVisibility\"\n const computedStyle = getCachedComputedStyle(el as HTMLElement);\n\n return (\n computedStyle.visibility !== 'hidden' && computedStyle.display !== 'none'\n );\n}\n\n// While this behavior isn't standard in Safari / Chrome yet, I think it's the most reasonable\n// way of handling tabbable overflow areas. Browser sniffing seems gross, and it's the most\n// accessible way of handling overflow areas. [Konnor]\nfunction isOverflowingAndTabbable(el: HTMLElement): boolean {\n const computedStyle = getCachedComputedStyle(el);\n\n const { overflowY, overflowX } = computedStyle;\n\n if (overflowY === 'scroll' || overflowX === 'scroll') {\n return true;\n }\n\n if (overflowY !== 'auto' || overflowX !== 'auto') {\n return false;\n }\n\n // Always overflow === \"auto\" by this point\n const isOverflowingY = el.scrollHeight > el.clientHeight;\n\n if (isOverflowingY && overflowY === 'auto') {\n return true;\n }\n\n const isOverflowingX = el.scrollWidth > el.clientWidth;\n\n if (isOverflowingX && overflowX === 'auto') {\n return true;\n }\n\n return false;\n}\n\n/** Determines if the specified element is tabbable using heuristics inspired by https://github.com/focus-trap/tabbable */\nfunction isTabbable(el: HTMLElement) {\n const tag = el.tagName.toLowerCase();\n\n const tabindex = Number(el.getAttribute('tabindex'));\n const hasTabindex = el.hasAttribute('tabindex');\n\n // elements with a tabindex attribute that is either NaN or <= -1 are not tabbable\n if (hasTabindex && (isNaN(tabindex) || tabindex <= -1)) {\n return false;\n }\n\n // Elements with a disabled attribute are not tabbable\n if (el.hasAttribute('disabled')) {\n return false;\n }\n\n // If any parents have \"inert\", we aren't \"tabbable\"\n if (el.closest('[inert]')) {\n return false;\n }\n\n // Radios without a checked attribute are not tabbable\n if (\n tag === 'input' &&\n el.getAttribute('type') === 'radio' &&\n !el.hasAttribute('checked')\n ) {\n return false;\n }\n\n if (!isVisible(el)) {\n return false;\n }\n\n // Audio and video elements with the controls attribute are tabbable\n if ((tag === 'audio' || tag === 'video') && el.hasAttribute('controls')) {\n return true;\n }\n\n // Elements with a tabindex other than -1 are tabbable\n if (el.hasAttribute('tabindex')) {\n return true;\n }\n\n // Elements with a contenteditable attribute are tabbable\n if (\n el.hasAttribute('contenteditable') &&\n el.getAttribute('contenteditable') !== 'false'\n ) {\n return true;\n }\n\n // At this point, the following elements are considered tabbable\n const isNativelyTabbable = [\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'a',\n 'audio',\n 'video',\n 'summary',\n 'iframe',\n ].includes(tag);\n\n if (isNativelyTabbable) {\n return true;\n }\n\n // We save the overflow checks for last, because they're the most expensive\n return isOverflowingAndTabbable(el);\n}\n\n/**\n * Returns the first and last bounding elements that are tabbable. This is more performant than checking every single\n * element because it short-circuits after finding the first and last ones.\n */\nexport function getTabbableBoundary(root: HTMLElement | ShadowRoot) {\n const tabbableElements = getTabbableElements(root);\n\n // Find the first and last tabbable elements\n const start = tabbableElements[0] ?? null;\n const end = tabbableElements[tabbableElements.length - 1] ?? null;\n\n return { start, end };\n}\n\n/**\n * This looks funky. Basically a slot's children will always be picked up *if* they're within the `root` element.\n * However, there is an edge case when, if the `root` is wrapped by another shadow DOM, it won't grab the children.\n * This fixes that fun edge case.\n */\nfunction getSlottedChildrenOutsideRootElement(\n slotElement: HTMLSlotElement,\n root: HTMLElement | ShadowRoot\n) {\n return (\n (slotElement.getRootNode({ composed: true }) as ShadowRoot | null)?.host !==\n root\n );\n}\n\nexport function getTabbableElements(root: HTMLElement | ShadowRoot) {\n const walkedEls = new WeakMap();\n const tabbableElements: HTMLElement[] = [];\n\n function walk(el: HTMLElement | ShadowRoot) {\n if (el instanceof Element) {\n // if the element has \"inert\" we can just no-op it.\n if (el.hasAttribute('inert') || el.closest('[inert]')) {\n return;\n }\n\n if (walkedEls.has(el)) {\n return;\n }\n walkedEls.set(el, true);\n\n if (!tabbableElements.includes(el) && isTabbable(el)) {\n tabbableElements.push(el);\n }\n\n if (\n el instanceof HTMLSlotElement &&\n getSlottedChildrenOutsideRootElement(el, root)\n ) {\n el.assignedElements({ flatten: true }).forEach(\n (assignedEl: Element) => {\n walk(assignedEl as HTMLElement | ShadowRoot);\n }\n );\n }\n\n if (el.shadowRoot !== null && el.shadowRoot.mode === 'open') {\n walk(el.shadowRoot);\n }\n }\n\n for (const e of Array.from(el.children) as HTMLElement[]) {\n walk(e);\n }\n }\n\n // Collect all elements including the root\n walk(root);\n\n // Is this worth having? Most sorts will always add increased overhead. And positive tabindexes shouldn't really be used.\n // So is it worth being right? Or fast?\n return tabbableElements.sort((a, b) => {\n // Make sure we sort by tabindex.\n const aTabindex = Number(a.getAttribute('tabindex')) || 0;\n const bTabindex = Number(b.getAttribute('tabindex')) || 0;\n return bTabindex - aTabindex;\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modal-config.test.js","sourceRoot":"","sources":["../../test/modal-config.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\
|
|
1
|
+
{"version":3,"file":"modal-config.test.js","sourceRoot":"","sources":["../../test/modal-config.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { html } from 'lit';\n\nimport { ModalConfig } from '../src/modal-config';\n\ndescribe('Modal Config', () => {\n it('can be instantiated properly', async () => {\n const config = new ModalConfig();\n const title = html`Foo`;\n config.title = title;\n config.headerColor = 'green';\n\n expect(config.title).to.equal(title);\n expect(config.headerColor).to.equal('green');\n });\n\n it('can be instantiated properly with constructor', async () => {\n const title = html`Foo`;\n const subtitle = html`Bar`;\n const headline = html`Baz`;\n const message = html`Boop`;\n\n const headerColor = 'blue';\n const showProcessingIndicator = true;\n const processingImageMode = 'processing';\n const showCloseButton = false;\n const showLeftNavButton = false;\n const leftNavButtonText = 'Previous';\n const showHeaderLogo = false;\n const closeOnBackdropClick = false;\n\n const config = new ModalConfig({\n title: title,\n subtitle: subtitle,\n headline: headline,\n message: message,\n headerColor: headerColor,\n showProcessingIndicator: showProcessingIndicator,\n processingImageMode: processingImageMode,\n showCloseButton: showCloseButton,\n showLeftNavButton: showLeftNavButton,\n leftNavButtonText: leftNavButtonText,\n showHeaderLogo: showHeaderLogo,\n closeOnBackdropClick: closeOnBackdropClick,\n });\n\n expect(config.title).to.equal(title);\n expect(config.subtitle).to.equal(subtitle);\n expect(config.headline).to.equal(headline);\n expect(config.message).to.equal(message);\n\n expect(config.headerColor).to.equal(headerColor);\n expect(config.showProcessingIndicator).to.equal(showProcessingIndicator);\n expect(config.processingImageMode).to.equal(processingImageMode);\n expect(config.showCloseButton).to.equal(showCloseButton);\n expect(config.showLeftNavButton).to.equal(showLeftNavButton);\n expect(config.leftNavButtonText).to.equal(leftNavButtonText);\n expect(config.showHeaderLogo).to.equal(showHeaderLogo);\n expect(config.closeOnBackdropClick).to.equal(closeOnBackdropClick);\n });\n\n it('instantiates properly with defaults', async () => {\n const config = new ModalConfig();\n expect(config.title).to.equal(undefined);\n expect(config.subtitle).to.equal(undefined);\n expect(config.headline).to.equal(undefined);\n expect(config.message).to.equal(undefined);\n expect(config.headerColor).to.equal('#55A183');\n expect(config.showProcessingIndicator).to.equal(false);\n expect(config.processingImageMode).to.equal('complete');\n expect(config.showCloseButton).to.equal(true);\n expect(config.showLeftNavButton).to.equal(false);\n expect(config.leftNavButtonText).to.equal('');\n expect(config.showHeaderLogo).to.equal(true);\n expect(config.closeOnBackdropClick).to.equal(true);\n });\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
|
-
import { fixture, expect, oneEvent, elementUpdated } from '@open-wc/testing';
|
|
2
|
+
import { fixture, expect, oneEvent, elementUpdated, nextFrame, } from '@open-wc/testing';
|
|
3
3
|
import { html } from 'lit';
|
|
4
4
|
import '../src/modal-manager';
|
|
5
5
|
import { ModalConfig } from '../src/modal-config';
|
|
@@ -7,14 +7,14 @@ import { ModalManagerMode } from '../src/modal-manager-mode';
|
|
|
7
7
|
import { getTabbableElements } from '../src/shoelace/tabbable';
|
|
8
8
|
describe('Modal Manager', () => {
|
|
9
9
|
it('defaults to closed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
10
|
-
const el = (yield fixture(html `
|
|
11
|
-
<modal-manager></modal-manager>
|
|
10
|
+
const el = (yield fixture(html `
|
|
11
|
+
<modal-manager></modal-manager>
|
|
12
12
|
`));
|
|
13
13
|
expect(el.mode).to.equal('closed');
|
|
14
14
|
}));
|
|
15
15
|
it('can be closed by calling closeModal', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
|
-
const el = (yield fixture(html `
|
|
17
|
-
<modal-manager .mode=${ModalManagerMode.Open}></modal-manager>
|
|
16
|
+
const el = (yield fixture(html `
|
|
17
|
+
<modal-manager .mode=${ModalManagerMode.Open}></modal-manager>
|
|
18
18
|
`));
|
|
19
19
|
el.customModalContent = 'foo';
|
|
20
20
|
yield elementUpdated(el);
|
|
@@ -26,8 +26,8 @@ describe('Modal Manager', () => {
|
|
|
26
26
|
}));
|
|
27
27
|
it('can be closed by clicking on the backdrop', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
28
|
var _a;
|
|
29
|
-
const el = (yield fixture(html `
|
|
30
|
-
<modal-manager .mode=${ModalManagerMode.Open}></modal-manager>
|
|
29
|
+
const el = (yield fixture(html `
|
|
30
|
+
<modal-manager .mode=${ModalManagerMode.Open}></modal-manager>
|
|
31
31
|
`));
|
|
32
32
|
const backdrop = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.backdrop');
|
|
33
33
|
const clickEvent = new MouseEvent('click');
|
|
@@ -36,8 +36,8 @@ describe('Modal Manager', () => {
|
|
|
36
36
|
expect(el.mode).to.equal('closed');
|
|
37
37
|
}));
|
|
38
38
|
it('emits a modeChanged event when opening', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
39
|
-
const el = (yield fixture(html `
|
|
40
|
-
<modal-manager></modal-manager>
|
|
39
|
+
const el = (yield fixture(html `
|
|
40
|
+
<modal-manager></modal-manager>
|
|
41
41
|
`));
|
|
42
42
|
const config = new ModalConfig();
|
|
43
43
|
setTimeout(() => {
|
|
@@ -47,8 +47,8 @@ describe('Modal Manager', () => {
|
|
|
47
47
|
expect(response.detail.mode).to.equal(ModalManagerMode.Open);
|
|
48
48
|
}));
|
|
49
49
|
it('emits a modeChanged event when closing', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
50
|
-
const el = (yield fixture(html `
|
|
51
|
-
<modal-manager></modal-manager>
|
|
50
|
+
const el = (yield fixture(html `
|
|
51
|
+
<modal-manager></modal-manager>
|
|
52
52
|
`));
|
|
53
53
|
const config = new ModalConfig();
|
|
54
54
|
el.showModal({ config });
|
|
@@ -60,8 +60,8 @@ describe('Modal Manager', () => {
|
|
|
60
60
|
expect(response.detail.mode).to.equal(ModalManagerMode.Closed);
|
|
61
61
|
}));
|
|
62
62
|
it('can show a modal', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
-
const el = (yield fixture(html `
|
|
64
|
-
<modal-manager></modal-manager>
|
|
63
|
+
const el = (yield fixture(html `
|
|
64
|
+
<modal-manager></modal-manager>
|
|
65
65
|
`));
|
|
66
66
|
const config = new ModalConfig();
|
|
67
67
|
el.showModal({ config });
|
|
@@ -69,8 +69,8 @@ describe('Modal Manager', () => {
|
|
|
69
69
|
expect(el.mode).to.equal(ModalManagerMode.Open);
|
|
70
70
|
}));
|
|
71
71
|
it('sets the --containerHeight CSS property when the window resizes', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
72
|
-
const el = (yield fixture(html `
|
|
73
|
-
<modal-manager></modal-manager>
|
|
72
|
+
const el = (yield fixture(html `
|
|
73
|
+
<modal-manager></modal-manager>
|
|
74
74
|
`));
|
|
75
75
|
const config = new ModalConfig();
|
|
76
76
|
el.showModal({ config });
|
|
@@ -85,8 +85,8 @@ describe('Modal Manager', () => {
|
|
|
85
85
|
}));
|
|
86
86
|
it('calls the userClosedModalCallback when the user taps the backdrop', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
87
87
|
var _b;
|
|
88
|
-
const el = (yield fixture(html `
|
|
89
|
-
<modal-manager></modal-manager>
|
|
88
|
+
const el = (yield fixture(html `
|
|
89
|
+
<modal-manager></modal-manager>
|
|
90
90
|
`));
|
|
91
91
|
const config = new ModalConfig();
|
|
92
92
|
let callbackCalled = false;
|
|
@@ -105,8 +105,8 @@ describe('Modal Manager', () => {
|
|
|
105
105
|
expect(callbackCalled).to.equal(true);
|
|
106
106
|
}));
|
|
107
107
|
it('does not call the userClosedModalCallback when the modal just closes', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
108
|
-
const el = (yield fixture(html `
|
|
109
|
-
<modal-manager></modal-manager>
|
|
108
|
+
const el = (yield fixture(html `
|
|
109
|
+
<modal-manager></modal-manager>
|
|
110
110
|
`));
|
|
111
111
|
const config = new ModalConfig();
|
|
112
112
|
let callbackCalled = false;
|
|
@@ -124,8 +124,8 @@ describe('Modal Manager', () => {
|
|
|
124
124
|
}));
|
|
125
125
|
it('calls the userPressedLeftNavButtonCallback when the user clicks the left nav button', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
126
126
|
var _c;
|
|
127
|
-
const el = (yield fixture(html `
|
|
128
|
-
<modal-manager></modal-manager>
|
|
127
|
+
const el = (yield fixture(html `
|
|
128
|
+
<modal-manager></modal-manager>
|
|
129
129
|
`));
|
|
130
130
|
const config = new ModalConfig();
|
|
131
131
|
config.showLeftNavButton = true;
|
|
@@ -146,8 +146,8 @@ describe('Modal Manager', () => {
|
|
|
146
146
|
}));
|
|
147
147
|
it('mode is set to closed when close button is pressed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
148
148
|
var _d, _e;
|
|
149
|
-
const el = (yield fixture(html `
|
|
150
|
-
<modal-manager></modal-manager>
|
|
149
|
+
const el = (yield fixture(html `
|
|
150
|
+
<modal-manager></modal-manager>
|
|
151
151
|
`));
|
|
152
152
|
const config = new ModalConfig();
|
|
153
153
|
el.showModal({ config });
|
|
@@ -162,8 +162,8 @@ describe('Modal Manager', () => {
|
|
|
162
162
|
}));
|
|
163
163
|
it('mode is set to closed when close button gets spacebar pressed', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
164
164
|
var _f, _g;
|
|
165
|
-
const el = (yield fixture(html `
|
|
166
|
-
<modal-manager></modal-manager>
|
|
165
|
+
const el = (yield fixture(html `
|
|
166
|
+
<modal-manager></modal-manager>
|
|
167
167
|
`));
|
|
168
168
|
const config = new ModalConfig();
|
|
169
169
|
el.showModal({ config });
|
|
@@ -179,8 +179,8 @@ describe('Modal Manager', () => {
|
|
|
179
179
|
}));
|
|
180
180
|
it('mode remains open when close button gets non-button keypress', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
181
181
|
var _h, _j;
|
|
182
|
-
const el = (yield fixture(html `
|
|
183
|
-
<modal-manager></modal-manager>
|
|
182
|
+
const el = (yield fixture(html `
|
|
183
|
+
<modal-manager></modal-manager>
|
|
184
184
|
`));
|
|
185
185
|
const config = new ModalConfig();
|
|
186
186
|
el.showModal({ config });
|
|
@@ -196,8 +196,8 @@ describe('Modal Manager', () => {
|
|
|
196
196
|
}));
|
|
197
197
|
it('allows the user to close by clicking on the backdrop if configured to', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
198
198
|
var _k;
|
|
199
|
-
const el = (yield fixture(html `
|
|
200
|
-
<modal-manager></modal-manager>
|
|
199
|
+
const el = (yield fixture(html `
|
|
200
|
+
<modal-manager></modal-manager>
|
|
201
201
|
`));
|
|
202
202
|
const config = new ModalConfig();
|
|
203
203
|
config.closeOnBackdropClick = true;
|
|
@@ -211,8 +211,8 @@ describe('Modal Manager', () => {
|
|
|
211
211
|
}));
|
|
212
212
|
it("doesn't allow the user to close by clicking on the backdrop if configured to", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
213
213
|
var _l;
|
|
214
|
-
const el = (yield fixture(html `
|
|
215
|
-
<modal-manager></modal-manager>
|
|
214
|
+
const el = (yield fixture(html `
|
|
215
|
+
<modal-manager></modal-manager>
|
|
216
216
|
`));
|
|
217
217
|
const config = new ModalConfig();
|
|
218
218
|
config.closeOnBackdropClick = false;
|
|
@@ -226,8 +226,8 @@ describe('Modal Manager', () => {
|
|
|
226
226
|
}));
|
|
227
227
|
it('ia logo should not visible on modal', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
228
228
|
var _m;
|
|
229
|
-
const el = (yield fixture(html `
|
|
230
|
-
<modal-manager></modal-manager>
|
|
229
|
+
const el = (yield fixture(html `
|
|
230
|
+
<modal-manager></modal-manager>
|
|
231
231
|
`));
|
|
232
232
|
const config = new ModalConfig();
|
|
233
233
|
config.showHeaderLogo = false;
|
|
@@ -237,9 +237,9 @@ describe('Modal Manager', () => {
|
|
|
237
237
|
expect(logoIcon).to.not.exist;
|
|
238
238
|
}));
|
|
239
239
|
it('should trap Tab key', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
240
|
-
var _o, _p, _q;
|
|
241
|
-
const el = (yield fixture(html `
|
|
242
|
-
<modal-manager></modal-manager>
|
|
240
|
+
var _o, _p, _q, _r, _s;
|
|
241
|
+
const el = (yield fixture(html `
|
|
242
|
+
<modal-manager></modal-manager>
|
|
243
243
|
`));
|
|
244
244
|
const config = new ModalConfig();
|
|
245
245
|
el.showModal({ config });
|
|
@@ -254,13 +254,12 @@ describe('Modal Manager', () => {
|
|
|
254
254
|
const tabbableElements = getTabbableElements(modal);
|
|
255
255
|
expect(tabbableElements === null || tabbableElements === void 0 ? void 0 : tabbableElements.length).to.equal(1);
|
|
256
256
|
const closeButton = (_p = modal === null || modal === void 0 ? void 0 : modal.shadowRoot) === null || _p === void 0 ? void 0 : _p.querySelector('.close-button');
|
|
257
|
-
|
|
258
|
-
expect(activeElement).to.equal(closeButton);
|
|
257
|
+
expect((_q = modal === null || modal === void 0 ? void 0 : modal.shadowRoot) === null || _q === void 0 ? void 0 : _q.activeElement).to.equal(closeButton);
|
|
259
258
|
// Tab again
|
|
260
259
|
el.dispatchEvent(tabEvent);
|
|
261
260
|
yield elementUpdated(el);
|
|
262
261
|
// Should be only one tabbable element
|
|
263
|
-
expect(activeElement).to.equal(closeButton);
|
|
262
|
+
expect((_r = modal === null || modal === void 0 ? void 0 : modal.shadowRoot) === null || _r === void 0 ? void 0 : _r.activeElement).to.equal(closeButton);
|
|
264
263
|
// Shift + Tab
|
|
265
264
|
const shiftTabEvent = new KeyboardEvent('keydown', {
|
|
266
265
|
key: 'Tab',
|
|
@@ -269,7 +268,43 @@ describe('Modal Manager', () => {
|
|
|
269
268
|
document.dispatchEvent(shiftTabEvent);
|
|
270
269
|
yield elementUpdated(el);
|
|
271
270
|
// Should be only one tabbable element
|
|
272
|
-
expect(activeElement).to.equal(closeButton);
|
|
271
|
+
expect((_s = modal === null || modal === void 0 ? void 0 : modal.shadowRoot) === null || _s === void 0 ? void 0 : _s.activeElement).to.equal(closeButton);
|
|
272
|
+
}));
|
|
273
|
+
it('returns keyboard focus to the triggering element on close', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
274
|
+
const config = new ModalConfig();
|
|
275
|
+
const el = (yield fixture(html `
|
|
276
|
+
<div>
|
|
277
|
+
<button>Another button</button>
|
|
278
|
+
<button
|
|
279
|
+
id="open-modal-btn"
|
|
280
|
+
@click=${() => {
|
|
281
|
+
const modal = el.querySelector('modal-manager');
|
|
282
|
+
modal.showModal({ config });
|
|
283
|
+
}}
|
|
284
|
+
>
|
|
285
|
+
Open modal
|
|
286
|
+
</button>
|
|
287
|
+
<modal-manager></modal-manager>
|
|
288
|
+
</div>
|
|
289
|
+
`));
|
|
290
|
+
const openBtn = el.querySelector('#open-modal-btn');
|
|
291
|
+
const modal = el.querySelector('modal-manager');
|
|
292
|
+
// Focus is initially on the Open button
|
|
293
|
+
openBtn.focus();
|
|
294
|
+
expect(document.activeElement).to.equal(openBtn);
|
|
295
|
+
// Focus enters the modal when it is opened
|
|
296
|
+
openBtn.click();
|
|
297
|
+
yield nextFrame();
|
|
298
|
+
expect(document.activeElement).to.equal(modal);
|
|
299
|
+
// With the modal already open, simulate showing different content.
|
|
300
|
+
// This step is to ensure that even if showModal is called multiple times, we still
|
|
301
|
+
// maintain the originally-focused element (subsequent calls do not overwrite it).
|
|
302
|
+
modal.showModal({ config: new ModalConfig() });
|
|
303
|
+
yield nextFrame();
|
|
304
|
+
// Focus returns to the Open button when the modal closes
|
|
305
|
+
modal.closeModal();
|
|
306
|
+
yield modal.updateComplete;
|
|
307
|
+
expect(document.activeElement).to.equal(openBtn);
|
|
273
308
|
}));
|
|
274
309
|
});
|
|
275
310
|
//# sourceMappingURL=modal-manager.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modal-manager.test.js","sourceRoot":"","sources":["../../test/modal-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { fixture, expect, oneEvent, elementUpdated } from '@open-wc/testing';\r\nimport { TemplateResult, html } from 'lit';\r\n\r\nimport '../src/modal-manager';\r\nimport { ModalConfig } from '../src/modal-config';\r\nimport { ModalManager } from '../src/modal-manager';\r\nimport { ModalManagerMode } from '../src/modal-manager-mode';\r\nimport { ModalManagerInterface } from '../src/modal-manager-interface';\r\n\r\nimport { getTabbableElements } from '../src/shoelace/tabbable';\r\n\r\ndescribe('Modal Manager', () => {\r\n it('defaults to closed', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n expect(el.mode).to.equal('closed');\r\n });\r\n\r\n it('can be closed by calling closeModal', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager .mode=${ModalManagerMode.Open}></modal-manager>\r\n `)) as ModalManager;\r\n\r\n el.customModalContent = 'foo' as unknown as TemplateResult;\r\n await elementUpdated(el);\r\n\r\n expect(el.customModalContent).to.equal('foo');\r\n el.closeModal();\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('closed');\r\n expect(el.customModalContent).to.equal(undefined);\r\n });\r\n\r\n it('can be closed by clicking on the backdrop', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager .mode=${ModalManagerMode.Open}></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\r\n const clickEvent = new MouseEvent('click');\r\n\r\n backdrop?.dispatchEvent(clickEvent);\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('closed');\r\n });\r\n\r\n it('emits a modeChanged event when opening', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n\r\n setTimeout(() => {\r\n el.showModal({ config });\r\n });\r\n const response = await oneEvent(el, 'modeChanged', false);\r\n expect(response.detail.mode).to.equal(ModalManagerMode.Open);\r\n });\r\n\r\n it('emits a modeChanged event when closing', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n setTimeout(() => {\r\n el.closeModal();\r\n });\r\n const response = await oneEvent(el, 'modeChanged', false);\r\n expect(response.detail.mode).to.equal(ModalManagerMode.Closed);\r\n });\r\n\r\n it('can show a modal', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n expect(el.mode).to.equal(ModalManagerMode.Open);\r\n });\r\n\r\n it('sets the --containerHeight CSS property when the window resizes', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n const event = new Event('resize');\r\n const propBefore = el.style.getPropertyValue('--containerHeight');\r\n expect(propBefore).to.equal('');\r\n window.dispatchEvent(event);\r\n await elementUpdated(el);\r\n const propAfter = el.style.getPropertyValue('--containerHeight');\r\n expect(propAfter).to.not.equal('');\r\n });\r\n\r\n it('calls the userClosedModalCallback when the user taps the backdrop', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n let callbackCalled = false;\r\n const callback = (): void => {\r\n callbackCalled = true;\r\n };\r\n el.showModal({\r\n config,\r\n userClosedModalCallback: callback,\r\n });\r\n await elementUpdated(el);\r\n\r\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\r\n const clickEvent = new MouseEvent('click');\r\n backdrop?.dispatchEvent(clickEvent);\r\n\r\n await elementUpdated(el);\r\n\r\n expect(callbackCalled).to.equal(true);\r\n });\r\n\r\n it('does not call the userClosedModalCallback when the modal just closes', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n let callbackCalled = false;\r\n const callback = (): void => {\r\n callbackCalled = true;\r\n };\r\n el.showModal({\r\n config,\r\n userClosedModalCallback: callback,\r\n });\r\n await elementUpdated(el);\r\n el.closeModal();\r\n await elementUpdated(el);\r\n expect(callbackCalled).to.equal(false);\r\n });\r\n\r\n it('calls the userPressedLeftNavButtonCallback when the user clicks the left nav button', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n config.showLeftNavButton = true;\r\n\r\n let callbackCalled = false;\r\n const callback = (): void => {\r\n callbackCalled = true;\r\n };\r\n el.showModal({\r\n config,\r\n userPressedLeftNavButtonCallback: callback,\r\n });\r\n await elementUpdated(el);\r\n\r\n const modalTemplate = el.shadowRoot?.querySelector('modal-template');\r\n expect(modalTemplate).to.exist;\r\n\r\n modalTemplate?.dispatchEvent(new Event('leftNavButtonPressed'));\r\n\r\n await elementUpdated(el);\r\n\r\n expect(callbackCalled).to.equal(true);\r\n });\r\n\r\n it('mode is set to closed when close button is pressed', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('open');\r\n\r\n const modal = el.shadowRoot?.querySelector('modal-template');\r\n const closeButton = modal?.shadowRoot?.querySelector('.close-button');\r\n const clickEvent = new MouseEvent('click');\r\n closeButton?.dispatchEvent(clickEvent);\r\n\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('closed');\r\n });\r\n\r\n it('mode is set to closed when close button gets spacebar pressed', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('open');\r\n\r\n const modal = el.shadowRoot?.querySelector('modal-template');\r\n const closeButton = modal?.shadowRoot?.querySelector('.close-button');\r\n\r\n // Close with keyboard\r\n const spacebarEvent = new KeyboardEvent('keydown', { key: ' ' });\r\n closeButton?.dispatchEvent(spacebarEvent);\r\n\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('closed');\r\n });\r\n\r\n it('mode remains open when close button gets non-button keypress', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('open');\r\n\r\n const modal = el.shadowRoot?.querySelector('modal-template');\r\n const closeButton = modal?.shadowRoot?.querySelector('.close-button');\r\n\r\n // Close with keyboard\r\n const keyboardEvent = new KeyboardEvent('keydown', { key: '.' });\r\n closeButton?.dispatchEvent(keyboardEvent);\r\n\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('open');\r\n });\r\n\r\n it('allows the user to close by clicking on the backdrop if configured to', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n config.closeOnBackdropClick = true;\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\r\n const clickEvent = new MouseEvent('click');\r\n backdrop?.dispatchEvent(clickEvent);\r\n\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('closed');\r\n });\r\n\r\n it(\"doesn't allow the user to close by clicking on the backdrop if configured to\", async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManagerInterface;\r\n\r\n const config = new ModalConfig();\r\n config.closeOnBackdropClick = false;\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\r\n const clickEvent = new MouseEvent('click');\r\n backdrop?.dispatchEvent(clickEvent);\r\n\r\n await elementUpdated(el);\r\n\r\n expect(el.getMode()).to.equal('open');\r\n });\r\n\r\n it('ia logo should not visible on modal', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManagerInterface;\r\n\r\n const config = new ModalConfig();\r\n config.showHeaderLogo = false;\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n const logoIcon = el.shadowRoot?.querySelector('.logo-icon');\r\n expect(logoIcon).to.not.exist;\r\n });\r\n\r\n it('should trap Tab key', async () => {\r\n const el = (await fixture(html`\r\n <modal-manager></modal-manager>\r\n `)) as ModalManager;\r\n\r\n const config = new ModalConfig();\r\n el.showModal({ config });\r\n await elementUpdated(el);\r\n\r\n expect(el.mode).to.equal('open');\r\n\r\n // Tab once to focus\r\n const tabEvent = new KeyboardEvent('keydown', { key: 'Tab' });\r\n document.dispatchEvent(tabEvent);\r\n await elementUpdated(el);\r\n\r\n // Should be only one tabbable element\r\n const modal = el.shadowRoot?.querySelector('modal-template') as HTMLElement;\r\n const tabbableElements = getTabbableElements(modal);\r\n expect(tabbableElements?.length).to.equal(1);\r\n\r\n const closeButton = modal?.shadowRoot?.querySelector(\r\n '.close-button'\r\n ) as HTMLElement;\r\n const activeElement = modal?.shadowRoot?.activeElement as HTMLElement;\r\n\r\n expect(activeElement).to.equal(closeButton);\r\n\r\n // Tab again\r\n el.dispatchEvent(tabEvent);\r\n await elementUpdated(el);\r\n\r\n // Should be only one tabbable element\r\n expect(activeElement).to.equal(closeButton);\r\n\r\n // Shift + Tab\r\n const shiftTabEvent = new KeyboardEvent('keydown', {\r\n key: 'Tab',\r\n shiftKey: true,\r\n });\r\n document.dispatchEvent(shiftTabEvent);\r\n await elementUpdated(el);\r\n\r\n // Should be only one tabbable element\r\n expect(activeElement).to.equal(closeButton);\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"modal-manager.test.js","sourceRoot":"","sources":["../../test/modal-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n fixture,\n expect,\n oneEvent,\n elementUpdated,\n nextFrame,\n} from '@open-wc/testing';\nimport { TemplateResult, html } from 'lit';\n\nimport '../src/modal-manager';\nimport { ModalConfig } from '../src/modal-config';\nimport { ModalManager } from '../src/modal-manager';\nimport { ModalManagerMode } from '../src/modal-manager-mode';\nimport { ModalManagerInterface } from '../src/modal-manager-interface';\n\nimport { getTabbableElements } from '../src/shoelace/tabbable';\n\ndescribe('Modal Manager', () => {\n it('defaults to closed', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n expect(el.mode).to.equal('closed');\n });\n\n it('can be closed by calling closeModal', async () => {\n const el = (await fixture(html`\n <modal-manager .mode=${ModalManagerMode.Open}></modal-manager>\n `)) as ModalManager;\n\n el.customModalContent = 'foo' as unknown as TemplateResult;\n await elementUpdated(el);\n\n expect(el.customModalContent).to.equal('foo');\n el.closeModal();\n await elementUpdated(el);\n\n expect(el.mode).to.equal('closed');\n expect(el.customModalContent).to.equal(undefined);\n });\n\n it('can be closed by clicking on the backdrop', async () => {\n const el = (await fixture(html`\n <modal-manager .mode=${ModalManagerMode.Open}></modal-manager>\n `)) as ModalManager;\n\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\n const clickEvent = new MouseEvent('click');\n\n backdrop?.dispatchEvent(clickEvent);\n await elementUpdated(el);\n\n expect(el.mode).to.equal('closed');\n });\n\n it('emits a modeChanged event when opening', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n\n setTimeout(() => {\n el.showModal({ config });\n });\n const response = await oneEvent(el, 'modeChanged', false);\n expect(response.detail.mode).to.equal(ModalManagerMode.Open);\n });\n\n it('emits a modeChanged event when closing', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n el.showModal({ config });\n await elementUpdated(el);\n\n setTimeout(() => {\n el.closeModal();\n });\n const response = await oneEvent(el, 'modeChanged', false);\n expect(response.detail.mode).to.equal(ModalManagerMode.Closed);\n });\n\n it('can show a modal', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n el.showModal({ config });\n await elementUpdated(el);\n expect(el.mode).to.equal(ModalManagerMode.Open);\n });\n\n it('sets the --containerHeight CSS property when the window resizes', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n el.showModal({ config });\n await elementUpdated(el);\n const event = new Event('resize');\n const propBefore = el.style.getPropertyValue('--containerHeight');\n expect(propBefore).to.equal('');\n window.dispatchEvent(event);\n await elementUpdated(el);\n const propAfter = el.style.getPropertyValue('--containerHeight');\n expect(propAfter).to.not.equal('');\n });\n\n it('calls the userClosedModalCallback when the user taps the backdrop', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n let callbackCalled = false;\n const callback = (): void => {\n callbackCalled = true;\n };\n el.showModal({\n config,\n userClosedModalCallback: callback,\n });\n await elementUpdated(el);\n\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\n const clickEvent = new MouseEvent('click');\n backdrop?.dispatchEvent(clickEvent);\n\n await elementUpdated(el);\n\n expect(callbackCalled).to.equal(true);\n });\n\n it('does not call the userClosedModalCallback when the modal just closes', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n let callbackCalled = false;\n const callback = (): void => {\n callbackCalled = true;\n };\n el.showModal({\n config,\n userClosedModalCallback: callback,\n });\n await elementUpdated(el);\n el.closeModal();\n await elementUpdated(el);\n expect(callbackCalled).to.equal(false);\n });\n\n it('calls the userPressedLeftNavButtonCallback when the user clicks the left nav button', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n config.showLeftNavButton = true;\n\n let callbackCalled = false;\n const callback = (): void => {\n callbackCalled = true;\n };\n el.showModal({\n config,\n userPressedLeftNavButtonCallback: callback,\n });\n await elementUpdated(el);\n\n const modalTemplate = el.shadowRoot?.querySelector('modal-template');\n expect(modalTemplate).to.exist;\n\n modalTemplate?.dispatchEvent(new Event('leftNavButtonPressed'));\n\n await elementUpdated(el);\n\n expect(callbackCalled).to.equal(true);\n });\n\n it('mode is set to closed when close button is pressed', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n el.showModal({ config });\n await elementUpdated(el);\n\n expect(el.mode).to.equal('open');\n\n const modal = el.shadowRoot?.querySelector('modal-template');\n const closeButton = modal?.shadowRoot?.querySelector('.close-button');\n const clickEvent = new MouseEvent('click');\n closeButton?.dispatchEvent(clickEvent);\n\n await elementUpdated(el);\n\n expect(el.mode).to.equal('closed');\n });\n\n it('mode is set to closed when close button gets spacebar pressed', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n el.showModal({ config });\n await elementUpdated(el);\n\n expect(el.mode).to.equal('open');\n\n const modal = el.shadowRoot?.querySelector('modal-template');\n const closeButton = modal?.shadowRoot?.querySelector('.close-button');\n\n // Close with keyboard\n const spacebarEvent = new KeyboardEvent('keydown', { key: ' ' });\n closeButton?.dispatchEvent(spacebarEvent);\n\n await elementUpdated(el);\n\n expect(el.mode).to.equal('closed');\n });\n\n it('mode remains open when close button gets non-button keypress', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n el.showModal({ config });\n await elementUpdated(el);\n\n expect(el.mode).to.equal('open');\n\n const modal = el.shadowRoot?.querySelector('modal-template');\n const closeButton = modal?.shadowRoot?.querySelector('.close-button');\n\n // Close with keyboard\n const keyboardEvent = new KeyboardEvent('keydown', { key: '.' });\n closeButton?.dispatchEvent(keyboardEvent);\n\n await elementUpdated(el);\n\n expect(el.mode).to.equal('open');\n });\n\n it('allows the user to close by clicking on the backdrop if configured to', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n config.closeOnBackdropClick = true;\n el.showModal({ config });\n await elementUpdated(el);\n\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\n const clickEvent = new MouseEvent('click');\n backdrop?.dispatchEvent(clickEvent);\n\n await elementUpdated(el);\n\n expect(el.mode).to.equal('closed');\n });\n\n it(\"doesn't allow the user to close by clicking on the backdrop if configured to\", async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManagerInterface;\n\n const config = new ModalConfig();\n config.closeOnBackdropClick = false;\n el.showModal({ config });\n await elementUpdated(el);\n\n const backdrop = el.shadowRoot?.querySelector('.backdrop');\n const clickEvent = new MouseEvent('click');\n backdrop?.dispatchEvent(clickEvent);\n\n await elementUpdated(el);\n\n expect(el.getMode()).to.equal('open');\n });\n\n it('ia logo should not visible on modal', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManagerInterface;\n\n const config = new ModalConfig();\n config.showHeaderLogo = false;\n el.showModal({ config });\n await elementUpdated(el);\n\n const logoIcon = el.shadowRoot?.querySelector('.logo-icon');\n expect(logoIcon).to.not.exist;\n });\n\n it('should trap Tab key', async () => {\n const el = (await fixture(html`\n <modal-manager></modal-manager>\n `)) as ModalManager;\n\n const config = new ModalConfig();\n el.showModal({ config });\n await elementUpdated(el);\n\n expect(el.mode).to.equal('open');\n\n // Tab once to focus\n const tabEvent = new KeyboardEvent('keydown', { key: 'Tab' });\n document.dispatchEvent(tabEvent);\n await elementUpdated(el);\n\n // Should be only one tabbable element\n const modal = el.shadowRoot?.querySelector('modal-template') as HTMLElement;\n const tabbableElements = getTabbableElements(modal);\n expect(tabbableElements?.length).to.equal(1);\n\n const closeButton = modal?.shadowRoot?.querySelector(\n '.close-button'\n ) as HTMLElement;\n expect(modal?.shadowRoot?.activeElement).to.equal(closeButton);\n\n // Tab again\n el.dispatchEvent(tabEvent);\n await elementUpdated(el);\n\n // Should be only one tabbable element\n expect(modal?.shadowRoot?.activeElement).to.equal(closeButton);\n\n // Shift + Tab\n const shiftTabEvent = new KeyboardEvent('keydown', {\n key: 'Tab',\n shiftKey: true,\n });\n document.dispatchEvent(shiftTabEvent);\n await elementUpdated(el);\n\n // Should be only one tabbable element\n expect(modal?.shadowRoot?.activeElement).to.equal(closeButton);\n });\n\n it('returns keyboard focus to the triggering element on close', async () => {\n const config = new ModalConfig();\n const el = (await fixture(html`\n <div>\n <button>Another button</button>\n <button\n id=\"open-modal-btn\"\n @click=${() => {\n const modal = el.querySelector('modal-manager') as ModalManager;\n modal.showModal({ config });\n }}\n >\n Open modal\n </button>\n <modal-manager></modal-manager>\n </div>\n `)) as HTMLDivElement;\n\n const openBtn = el.querySelector('#open-modal-btn') as HTMLButtonElement;\n const modal = el.querySelector('modal-manager') as ModalManager;\n\n // Focus is initially on the Open button\n openBtn.focus();\n expect(document.activeElement).to.equal(openBtn);\n\n // Focus enters the modal when it is opened\n openBtn.click();\n await nextFrame();\n expect(document.activeElement).to.equal(modal);\n\n // With the modal already open, simulate showing different content.\n // This step is to ensure that even if showModal is called multiple times, we still\n // maintain the originally-focused element (subsequent calls do not overwrite it).\n modal.showModal({ config: new ModalConfig() });\n await nextFrame();\n\n // Focus returns to the Open button when the modal closes\n modal.closeModal();\n await modal.updateComplete;\n expect(document.activeElement).to.equal(openBtn);\n });\n});\n"]}
|
|
@@ -21,8 +21,8 @@ describe('Modal Template', () => {
|
|
|
21
21
|
var _e;
|
|
22
22
|
const config = new ModalConfig();
|
|
23
23
|
config.title = undefined;
|
|
24
|
-
const el = yield fixture(html `
|
|
25
|
-
<modal-template .config=${config}></modal-template>
|
|
24
|
+
const el = yield fixture(html `
|
|
25
|
+
<modal-template .config=${config}></modal-template>
|
|
26
26
|
`);
|
|
27
27
|
const title = (_e = el.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelector('h1.title');
|
|
28
28
|
expect(title).to.not.exist;
|
|
@@ -53,8 +53,8 @@ describe('Modal Template', () => {
|
|
|
53
53
|
var _h;
|
|
54
54
|
const config = new ModalConfig();
|
|
55
55
|
config.showLeftNavButton = true;
|
|
56
|
-
const el = yield fixture(html `
|
|
57
|
-
<modal-template .config=${config}></modal-template>
|
|
56
|
+
const el = yield fixture(html `
|
|
57
|
+
<modal-template .config=${config}></modal-template>
|
|
58
58
|
`);
|
|
59
59
|
const leftNavButton = (_h = el.shadowRoot) === null || _h === void 0 ? void 0 : _h.querySelector('.back-button');
|
|
60
60
|
const clickEvent = new MouseEvent('click');
|
|
@@ -68,8 +68,8 @@ describe('Modal Template', () => {
|
|
|
68
68
|
var _j;
|
|
69
69
|
const config = new ModalConfig();
|
|
70
70
|
config.showLeftNavButton = true;
|
|
71
|
-
const el = yield fixture(html `
|
|
72
|
-
<modal-template .config=${config}></modal-template>
|
|
71
|
+
const el = yield fixture(html `
|
|
72
|
+
<modal-template .config=${config}></modal-template>
|
|
73
73
|
`);
|
|
74
74
|
const leftNavButton = (_j = el.shadowRoot) === null || _j === void 0 ? void 0 : _j.querySelector('.back-button');
|
|
75
75
|
const clickEvent = new KeyboardEvent('keydown', { key: ' ' });
|
|
@@ -83,8 +83,8 @@ describe('Modal Template', () => {
|
|
|
83
83
|
var _k, _l;
|
|
84
84
|
const config = new ModalConfig();
|
|
85
85
|
config.showProcessingIndicator = true;
|
|
86
|
-
const el = yield fixture(html `
|
|
87
|
-
<modal-template .config=${config}></modal-template>
|
|
86
|
+
const el = yield fixture(html `
|
|
87
|
+
<modal-template .config=${config}></modal-template>
|
|
88
88
|
`);
|
|
89
89
|
const processingLogo = (_k = el.shadowRoot) === null || _k === void 0 ? void 0 : _k.querySelector('.processing-logo');
|
|
90
90
|
const classList = (_l = processingLogo === null || processingLogo === void 0 ? void 0 : processingLogo.classList) !== null && _l !== void 0 ? _l : [];
|
|
@@ -94,8 +94,8 @@ describe('Modal Template', () => {
|
|
|
94
94
|
var _m;
|
|
95
95
|
const config = new ModalConfig();
|
|
96
96
|
config.showLeftNavButton = true;
|
|
97
|
-
const el = yield fixture(html `
|
|
98
|
-
<modal-template .config=${config}></modal-template>
|
|
97
|
+
const el = yield fixture(html `
|
|
98
|
+
<modal-template .config=${config}></modal-template>
|
|
99
99
|
`);
|
|
100
100
|
const leftNavButton = (_m = el.shadowRoot) === null || _m === void 0 ? void 0 : _m.querySelector('.back-button');
|
|
101
101
|
expect(leftNavButton).to.exist;
|
|
@@ -104,8 +104,8 @@ describe('Modal Template', () => {
|
|
|
104
104
|
var _o;
|
|
105
105
|
const config = new ModalConfig();
|
|
106
106
|
config.showCloseButton = false;
|
|
107
|
-
const el = yield fixture(html `
|
|
108
|
-
<modal-template .config=${config}></modal-template>
|
|
107
|
+
const el = yield fixture(html `
|
|
108
|
+
<modal-template .config=${config}></modal-template>
|
|
109
109
|
`);
|
|
110
110
|
const closeButton = (_o = el.shadowRoot) === null || _o === void 0 ? void 0 : _o.querySelector('.close-button');
|
|
111
111
|
expect(closeButton).to.not.exist;
|
|
@@ -115,8 +115,8 @@ describe('Modal Template', () => {
|
|
|
115
115
|
const config = new ModalConfig();
|
|
116
116
|
config.showLeftNavButton = true;
|
|
117
117
|
config.leftNavButtonText = 'Previous';
|
|
118
|
-
const el = yield fixture(html `
|
|
119
|
-
<modal-template .config=${config}></modal-template>
|
|
118
|
+
const el = yield fixture(html `
|
|
119
|
+
<modal-template .config=${config}></modal-template>
|
|
120
120
|
`);
|
|
121
121
|
const leftNavButton = (_p = el.shadowRoot) === null || _p === void 0 ? void 0 : _p.querySelector('.back-button');
|
|
122
122
|
expect(leftNavButton).to.exist;
|
|
@@ -126,8 +126,8 @@ describe('Modal Template', () => {
|
|
|
126
126
|
var _q;
|
|
127
127
|
const config = new ModalConfig();
|
|
128
128
|
config.showLeftNavButton = true;
|
|
129
|
-
const el = yield fixture(html `
|
|
130
|
-
<modal-template .config=${config}></modal-template>
|
|
129
|
+
const el = yield fixture(html `
|
|
130
|
+
<modal-template .config=${config}></modal-template>
|
|
131
131
|
`);
|
|
132
132
|
const leftNavButton = (_q = el.shadowRoot) === null || _q === void 0 ? void 0 : _q.querySelector('.back-button');
|
|
133
133
|
expect(leftNavButton === null || leftNavButton === void 0 ? void 0 : leftNavButton.innerHTML).not.to.contain('Previous');
|
|
@@ -136,8 +136,8 @@ describe('Modal Template', () => {
|
|
|
136
136
|
var _r;
|
|
137
137
|
const config = new ModalConfig();
|
|
138
138
|
config.showCloseButton = true;
|
|
139
|
-
const el = yield fixture(html `
|
|
140
|
-
<modal-template .config=${config}></modal-template>
|
|
139
|
+
const el = yield fixture(html `
|
|
140
|
+
<modal-template .config=${config}></modal-template>
|
|
141
141
|
`);
|
|
142
142
|
const closeButton = (_r = el.shadowRoot) === null || _r === void 0 ? void 0 : _r.querySelector('.close-button');
|
|
143
143
|
expect(closeButton).to.exist;
|
|
@@ -146,8 +146,8 @@ describe('Modal Template', () => {
|
|
|
146
146
|
var _s;
|
|
147
147
|
const config = new ModalConfig();
|
|
148
148
|
config.showCloseButton = false;
|
|
149
|
-
const el = yield fixture(html `
|
|
150
|
-
<modal-template .config=${config}></modal-template>
|
|
149
|
+
const el = yield fixture(html `
|
|
150
|
+
<modal-template .config=${config}></modal-template>
|
|
151
151
|
`);
|
|
152
152
|
const closeButton = (_s = el.shadowRoot) === null || _s === void 0 ? void 0 : _s.querySelector('.close-button');
|
|
153
153
|
expect(closeButton).to.not.exist;
|
|
@@ -159,8 +159,8 @@ describe('Modal Template', () => {
|
|
|
159
159
|
config.subtitle = html `Bop`;
|
|
160
160
|
config.headline = html `Foo`;
|
|
161
161
|
config.message = html `Bar`;
|
|
162
|
-
const el = yield fixture(html `
|
|
163
|
-
<modal-template .config=${config}></modal-template>
|
|
162
|
+
const el = yield fixture(html `
|
|
163
|
+
<modal-template .config=${config}></modal-template>
|
|
164
164
|
`);
|
|
165
165
|
const title = (_t = el.shadowRoot) === null || _t === void 0 ? void 0 : _t.querySelector('h1');
|
|
166
166
|
const subtitle = (_u = el.shadowRoot) === null || _u === void 0 ? void 0 : _u.querySelector('h2');
|