@api-client/ui 0.5.39 → 0.5.41
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/build/src/elements/contextual-menu/{internals/ContextualMenu.d.ts → ContextualMenu.d.ts} +11 -6
- package/build/src/elements/contextual-menu/ContextualMenu.d.ts.map +1 -0
- package/build/src/elements/contextual-menu/{internals/ContextualMenu.js → ContextualMenu.js} +25 -3
- package/build/src/elements/contextual-menu/ContextualMenu.js.map +1 -0
- package/build/src/elements/contextual-menu/internals/types.d.ts +16 -7
- package/build/src/elements/contextual-menu/internals/types.d.ts.map +1 -1
- package/build/src/elements/contextual-menu/internals/types.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/src/elements/contextual-menu/{internals/ContextualMenu.ts → ContextualMenu.ts} +31 -7
- package/src/elements/contextual-menu/internals/types.ts +17 -7
- package/.aiexclude +0 -3
- package/.cursor/rules/html-and-css-best-practices.mdc +0 -63
- package/.cursor/rules/lit-best-practices.mdc +0 -89
- package/.editorconfig +0 -29
- package/.github/CONTRIBUTING.md +0 -24
- package/.github/instructions/html-and-css-best-practices.instructions.md +0 -70
- package/.github/instructions/lit-best-practices.instructions.md +0 -90
- package/.github/release.yml +0 -14
- package/.github/stale.yml +0 -23
- package/.github/workflows/auto-release.yml +0 -182
- package/.github/workflows/release.yml +0 -82
- package/.prettierrc.js +0 -14
- package/.vscode/settings.json +0 -18
- package/RELEASE.md +0 -163
- package/RELEASE_SETUP.md +0 -235
- package/build/src/demo/DemoPage.d.ts +0 -81
- package/build/src/demo/DemoPage.d.ts.map +0 -1
- package/build/src/demo/DemoPage.js +0 -175
- package/build/src/demo/DemoPage.js.map +0 -1
- package/build/src/demo/DemoStyles.d.ts +0 -3
- package/build/src/demo/DemoStyles.d.ts.map +0 -1
- package/build/src/demo/DemoStyles.js +0 -60
- package/build/src/demo/DemoStyles.js.map +0 -1
- package/build/src/elements/contextual-menu/internals/ContextualMenu.d.ts.map +0 -1
- package/build/src/elements/contextual-menu/internals/ContextualMenu.js.map +0 -1
- package/build/test/elements/navigation/Navigation.test.d.ts +0 -3
- package/build/test/elements/navigation/Navigation.test.d.ts.map +0 -1
- package/build/test/elements/navigation/Navigation.test.js +0 -113
- package/build/test/elements/navigation/Navigation.test.js.map +0 -1
- package/commitlint.config.cjs +0 -2
- package/demo/elements/authorization/AuthPlugin.js +0 -57
- package/demo/elements/authorization/AuthProxy.js +0 -215
- package/demo/elements/authorization/api-key.html +0 -27
- package/demo/elements/authorization/api-key.ts +0 -44
- package/demo/elements/authorization/basic.html +0 -27
- package/demo/elements/authorization/basic.ts +0 -43
- package/demo/elements/authorization/bearer.html +0 -27
- package/demo/elements/authorization/bearer.ts +0 -43
- package/demo/elements/authorization/env.js +0 -8
- package/demo/elements/authorization/index.html +0 -44
- package/demo/elements/authorization/ntlm.html +0 -27
- package/demo/elements/authorization/ntlm.ts +0 -43
- package/demo/elements/authorization/oauth-authorize.html +0 -75
- package/demo/elements/authorization/oauth-authorize.ts +0 -40
- package/demo/elements/authorization/oauth-error.html +0 -18
- package/demo/elements/authorization/oauth-error.ts +0 -10
- package/demo/elements/authorization/oauth-popup.html +0 -36
- package/demo/elements/authorization/oauth2.html +0 -27
- package/demo/elements/authorization/oauth2.ts +0 -100
- package/demo/elements/authorization/oidc.html +0 -27
- package/demo/elements/authorization/oidc.ts +0 -139
- package/demo/elements/authorization/private.crt +0 -31
- package/demo/elements/authorization/private.csr +0 -28
- package/demo/elements/authorization/private.key +0 -51
- package/demo/elements/authorization/private.pem +0 -31
- package/demo/elements/authorization/redirect.html +0 -20
- package/demo/elements/authorization/ssl-commands.sh +0 -30
- package/demo/elements/authorization/ssl.conf +0 -24
- package/demo/elements/autocomplete/index.html +0 -64
- package/demo/elements/autocomplete/index.ts +0 -171
- package/demo/elements/code-editor/CodeEditorDemo.ts +0 -173
- package/demo/elements/code-editor/index.html +0 -19
- package/demo/elements/context-menu/DemoIcons.ts +0 -21
- package/demo/elements/context-menu/basic.html +0 -25
- package/demo/elements/context-menu/basic.ts +0 -119
- package/demo/elements/context-menu/custom-data.html +0 -25
- package/demo/elements/context-menu/custom-data.ts +0 -62
- package/demo/elements/context-menu/demo.css +0 -28
- package/demo/elements/context-menu/enabled-state.html +0 -25
- package/demo/elements/context-menu/enabled-state.ts +0 -73
- package/demo/elements/context-menu/icons.html +0 -25
- package/demo/elements/context-menu/icons.ts +0 -64
- package/demo/elements/context-menu/index.html +0 -43
- package/demo/elements/context-menu/nested.html +0 -25
- package/demo/elements/context-menu/nestedt.ts +0 -152
- package/demo/elements/context-menu/no-execute.html +0 -25
- package/demo/elements/context-menu/no-execute.ts +0 -134
- package/demo/elements/context-menu/radio-menu.html +0 -25
- package/demo/elements/context-menu/radio-menu.ts +0 -83
- package/demo/elements/context-menu/separators.html +0 -25
- package/demo/elements/context-menu/separators.ts +0 -172
- package/demo/elements/currency/index.html +0 -91
- package/demo/elements/currency/index.ts +0 -352
- package/demo/elements/environment/environment-editor.html +0 -20
- package/demo/elements/environment/environment-editor.ts +0 -49
- package/demo/elements/environment/index.html +0 -33
- package/demo/elements/environment/server-editor.html +0 -20
- package/demo/elements/environment/server-editor.ts +0 -67
- package/demo/elements/environment/variables-editor.html +0 -20
- package/demo/elements/environment/variables-editor.ts +0 -94
- package/demo/elements/har/har-viewer.html +0 -20
- package/demo/elements/har/har-viewer.ts +0 -76
- package/demo/elements/har/har1.har +0 -3044
- package/demo/elements/har/har2.json +0 -439
- package/demo/elements/har/index.html +0 -26
- package/demo/elements/highlight/example.md +0 -27
- package/demo/elements/highlight/index.html +0 -31
- package/demo/elements/highlight/marked-highlight.html +0 -132
- package/demo/elements/highlight/marked-highlight.ts +0 -22
- package/demo/elements/highlight/prism-highlight.html +0 -62
- package/demo/elements/highlight/prism-highlight.ts +0 -17
- package/demo/elements/http/body-editor.html +0 -17
- package/demo/elements/http/body-editor.ts +0 -115
- package/demo/elements/http/headers.html +0 -17
- package/demo/elements/http/headers.ts +0 -59
- package/demo/elements/http/http-assertions.html +0 -20
- package/demo/elements/http/http-assertions.ts +0 -89
- package/demo/elements/http/http-flows.html +0 -23
- package/demo/elements/http/http-flows.ts +0 -89
- package/demo/elements/http/index.html +0 -45
- package/demo/elements/http/request-editor.html +0 -26
- package/demo/elements/http/request-editor.ts +0 -197
- package/demo/elements/http/request-log.html +0 -16
- package/demo/elements/http/request-log.ts +0 -136
- package/demo/elements/http/url-editing.html +0 -17
- package/demo/elements/http/url-editing.ts +0 -112
- package/demo/elements/icons/index.html +0 -81
- package/demo/elements/icons/index.ts +0 -52
- package/demo/elements/index.html +0 -72
- package/demo/elements/mention-textarea/index.html +0 -19
- package/demo/elements/mention-textarea/index.ts +0 -205
- package/demo/elements/navigation/navigation-item.html +0 -49
- package/demo/elements/navigation/navigation-item.ts +0 -131
- package/demo/elements/navigation/navigation.html +0 -20
- package/demo/elements/navigation/navigation.ts +0 -45
- package/demo/elements/project/index.html +0 -29
- package/demo/elements/project/project-run-report.html +0 -20
- package/demo/elements/project/project-run-report.ts +0 -132
- package/demo/elements/project/request-editor.html +0 -23
- package/demo/elements/project/request-editor.ts +0 -232
- package/demo/elements/user/user-avatar.html +0 -17
- package/demo/elements/user/user-avatar.ts +0 -60
- package/demo/env.js +0 -4
- package/demo/index.html +0 -34
- package/demo/layout/index.html +0 -94
- package/demo/layout/index.ts +0 -190
- package/demo/md/DemoStyles.ts +0 -61
- package/demo/md/UiDemoPage.ts +0 -6
- package/demo/md/buttons/button.html +0 -121
- package/demo/md/buttons/button.ts +0 -246
- package/demo/md/buttons/group.html +0 -36
- package/demo/md/buttons/group.ts +0 -171
- package/demo/md/checkbox/index.html +0 -39
- package/demo/md/checkbox/index.ts +0 -220
- package/demo/md/chip/chip.html +0 -70
- package/demo/md/chip/chip.ts +0 -219
- package/demo/md/chip/pawel6c9a.jpg +0 -0
- package/demo/md/collapse/CustomDetail.ts +0 -89
- package/demo/md/collapse/collapse.html +0 -21
- package/demo/md/collapse/collapse.ts +0 -78
- package/demo/md/date-picker/date-picker.ts +0 -336
- package/demo/md/date-picker/index.html +0 -171
- package/demo/md/dialog/confirm-dialog.html +0 -49
- package/demo/md/dialog/confirm-dialog.ts +0 -121
- package/demo/md/dialog/dialog.html +0 -25
- package/demo/md/dialog/dialog.ts +0 -468
- package/demo/md/dropdown-list/index.html +0 -31
- package/demo/md/dropdown-list/index.ts +0 -158
- package/demo/md/icon-button/index.html +0 -122
- package/demo/md/icon-button/index.ts +0 -132
- package/demo/md/index.html +0 -73
- package/demo/md/inputs/input.html +0 -73
- package/demo/md/inputs/input.ts +0 -278
- package/demo/md/inputs/radio.html +0 -39
- package/demo/md/inputs/radio.ts +0 -156
- package/demo/md/inputs/switch.html +0 -45
- package/demo/md/inputs/switch.ts +0 -144
- package/demo/md/list/list.html +0 -65
- package/demo/md/list/list.ts +0 -204
- package/demo/md/listbox/listbox.html +0 -31
- package/demo/md/listbox/listbox.ts +0 -27
- package/demo/md/menu/index.html +0 -19
- package/demo/md/menu/index.ts +0 -514
- package/demo/md/notification/snack.html +0 -21
- package/demo/md/notification/snack.ts +0 -70
- package/demo/md/progress/progress.html +0 -46
- package/demo/md/progress/progress.ts +0 -161
- package/demo/md/segmented-button/index.html +0 -21
- package/demo/md/segmented-button/index.ts +0 -55
- package/demo/md/select/index.html +0 -16
- package/demo/md/select/index.ts +0 -217
- package/demo/md/tabs/tabs.html +0 -40
- package/demo/md/tabs/tabs.ts +0 -214
- package/demo/oauth-popup.html +0 -36
- package/demo/page.css +0 -8
- package/demo/resources/calendar-month.png +0 -0
- package/demo/resources/favorite.png +0 -0
- package/demo/resources/fingerprint.png +0 -0
- package/demo/resources/home-work.png +0 -0
- package/demo/resources/mood.png +0 -0
- package/demo/resources/print.png +0 -0
- package/demo/resources/stars.png +0 -0
- package/demo/resources/theaters.png +0 -0
- package/demo/tsconfig.json +0 -4
- package/eslint.config.js +0 -97
- package/scripts/copy-assets.js +0 -21
- package/scripts/release.js +0 -66
- package/src/demo/DemoPage.ts +0 -169
- package/src/demo/DemoStyles.ts +0 -60
- package/test/README.md +0 -375
- package/test/contextual-menu/ContextMenu.test.ts +0 -760
- package/test/contextual-menu/ContextMenuElement.test.ts +0 -569
- package/test/core/activity.spec.ts +0 -413
- package/test/core/activity_manager.spec.ts +0 -544
- package/test/core/application.spec.ts +0 -218
- package/test/core/fragment.spec.ts +0 -565
- package/test/core/fragment_manager.spec.ts +0 -404
- package/test/core/live_data.spec.ts +0 -558
- package/test/core/renderer.spec.ts +0 -113
- package/test/dom-assertions.test.ts +0 -182
- package/test/elements/MonacoSetup.ts +0 -65
- package/test/elements/authorization/basic-method.test.ts +0 -177
- package/test/elements/authorization/bearer-method.test.ts +0 -143
- package/test/elements/authorization/ntlm-method.test.ts +0 -219
- package/test/elements/authorization/oauth2-client-credentials-method.test.ts +0 -334
- package/test/elements/authorization/oauth2-code-method.test.ts +0 -320
- package/test/elements/authorization/oauth2-custom-grant-method.test.ts +0 -255
- package/test/elements/authorization/oauth2-device-code-method.test.ts +0 -371
- package/test/elements/authorization/oauth2-implicit-method.test.ts +0 -407
- package/test/elements/authorization/oauth2-jwt-method.test.ts +0 -217
- package/test/elements/authorization/oauth2-password-method.test.ts +0 -275
- package/test/elements/authorization/openid-method.test.ts +0 -591
- package/test/elements/autocomplete/autocomplete-input.spec.ts +0 -646
- package/test/elements/code-editor/code-editor.accessibility.test.ts +0 -298
- package/test/elements/code-editor/code-editor.test.ts +0 -574
- package/test/elements/currency/CurrencyPicker.accessibility.test.ts +0 -328
- package/test/elements/currency/CurrencyPicker.core.test.ts +0 -318
- package/test/elements/currency/CurrencyPicker.integration.test.ts +0 -482
- package/test/elements/currency/CurrencyPicker.test.ts +0 -486
- package/test/elements/data-table/DataTable.browser.test.ts +0 -649
- package/test/elements/har/HarUtils.test.ts +0 -45
- package/test/elements/har/HarViewerElement.test.ts +0 -687
- package/test/elements/har/test-data/har1.har +0 -3044
- package/test/elements/highlight/MarkedHighlightElement.test.ts +0 -452
- package/test/elements/highlight/PrismHighlightElement.test.ts +0 -79
- package/test/elements/highlight/PrismHighlighter.test.ts +0 -94
- package/test/elements/highlight/remoteSanitization.md +0 -1
- package/test/elements/highlight/test.md +0 -3
- package/test/elements/highlight/test1.md +0 -3
- package/test/elements/highlight/test2.md +0 -1
- package/test/elements/http/BodyFormdataEditorElement.test.ts +0 -482
- package/test/elements/http/BodyMultipartEditorElement.test.ts +0 -658
- package/test/elements/http/BodyRawEditorElement.test.ts +0 -90
- package/test/elements/http/CertificateAdd.test.ts +0 -457
- package/test/elements/http/HttpAssertions.test.ts +0 -994
- package/test/elements/http/HttpFlows.test.ts +0 -502
- package/test/elements/http/UrlEncodeUtils.test.ts +0 -202
- package/test/elements/layout/SplitItem.test.ts +0 -440
- package/test/elements/layout/SplitLayoutManager.test.ts +0 -1501
- package/test/elements/layout/SplitPanel.test.ts +0 -1109
- package/test/elements/mention-textarea/MentionTextArea.basic.test.ts +0 -114
- package/test/elements/mention-textarea/MentionTextArea.test.ts +0 -613
- package/test/elements/navigation/Navigation.test.ts +0 -120
- package/test/env.ts +0 -15
- package/test/events/EventTypes.test.ts +0 -363
- package/test/events/EventsTestHelpers.ts +0 -16
- package/test/helpers/TestUtils.ts +0 -243
- package/test/helpers/UiMock.ts +0 -185
- package/test/lib/Dom.test.ts +0 -231
- package/test/md/button/UiButton.test.ts +0 -347
- package/test/md/button/UiIconButton.test.ts +0 -155
- package/test/md/chip/UiChip.test.ts +0 -219
- package/test/md/collapse/UiCollapse.test.ts +0 -250
- package/test/md/collapse/flex-layout.test.ts +0 -105
- package/test/md/date-time/DateTime.test.ts +0 -348
- package/test/md/dialog/UiConfirmDialog.test.ts +0 -131
- package/test/md/dialog/UiDialog.test.ts +0 -759
- package/test/md/menu/Menu.test.ts +0 -855
- package/test/md/menu/MenuIntegration.test.ts +0 -426
- package/test/md/menu/MenuItem.test.ts +0 -652
- package/test/md/menu/SubMenu.test.ts +0 -410
- package/test/md/progress/UiCircularProgressElement.test.ts +0 -481
- package/test/md/progress/UiProgressElement.test.ts +0 -117
- package/test/md/progress/UiRangeElement.test.ts +0 -156
- package/test/md/select/Select.test.ts +0 -925
- package/test/plugins/takeScreenshotPlugin.js +0 -35
- package/test/setup.test.ts +0 -217
- package/test/setup.ts +0 -117
- package/test/tsconfig.json +0 -7
- package/web-dev-server.config.js +0 -21
- package/web-test-runner.config.js +0 -90
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
import { assert, fixture, html, nextFrame, oneEvent } from '@open-wc/testing'
|
|
2
|
-
import sinon from 'sinon'
|
|
3
|
-
import UiSubMenu from '../../../src/md/menu/internal/SubMenu.js'
|
|
4
|
-
import UiMenuItem from '../../../src/md/menu/internal/MenuItem.js'
|
|
5
|
-
import Menu from '../../../src/md/menu/internal/Menu.js'
|
|
6
|
-
|
|
7
|
-
import '../../../src/md/menu/ui-menu.js'
|
|
8
|
-
import '../../../src/md/menu/ui-menu-item.js'
|
|
9
|
-
import '../../../src/md/menu/ui-sub-menu.js'
|
|
10
|
-
import '../../../src/md/icons/ui-icon.js'
|
|
11
|
-
|
|
12
|
-
describe('md', () => {
|
|
13
|
-
describe('SubMenu', () => {
|
|
14
|
-
async function basicFixture(): Promise<UiSubMenu> {
|
|
15
|
-
return fixture(html`
|
|
16
|
-
<ui-sub-menu id="test-submenu">
|
|
17
|
-
<ui-menu-item>Item 1</ui-menu-item>
|
|
18
|
-
<ui-menu-item>Item 2</ui-menu-item>
|
|
19
|
-
<ui-menu-item disabled>Item 3 (Disabled)</ui-menu-item>
|
|
20
|
-
</ui-sub-menu>
|
|
21
|
-
`)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async function withAnchorFixture(): Promise<HTMLElement> {
|
|
25
|
-
return fixture(html`
|
|
26
|
-
<div>
|
|
27
|
-
<ui-menu-item id="anchor-item">Anchor Item</ui-menu-item>
|
|
28
|
-
<ui-sub-menu id="test-submenu" anchor="anchor-item">
|
|
29
|
-
<ui-menu-item>Submenu Item 1</ui-menu-item>
|
|
30
|
-
<ui-menu-item>Submenu Item 2</ui-menu-item>
|
|
31
|
-
</ui-sub-menu>
|
|
32
|
-
</div>
|
|
33
|
-
`)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async function withParentMenuFixture(): Promise<HTMLElement> {
|
|
37
|
-
return fixture(html`
|
|
38
|
-
<ui-menu id="parent-menu">
|
|
39
|
-
<ui-menu-item id="trigger-item" submenu="child-submenu">
|
|
40
|
-
<span>Parent Item</span>
|
|
41
|
-
</ui-menu-item>
|
|
42
|
-
|
|
43
|
-
<ui-sub-menu id="child-submenu" anchor="trigger-item">
|
|
44
|
-
<ui-menu-item>Child Item 1</ui-menu-item>
|
|
45
|
-
<ui-menu-item>Child Item 2</ui-menu-item>
|
|
46
|
-
</ui-sub-menu>
|
|
47
|
-
</ui-menu>
|
|
48
|
-
`)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function nestedSubmenuFixture(): Promise<HTMLElement> {
|
|
52
|
-
return fixture(html`
|
|
53
|
-
<ui-menu id="main-menu">
|
|
54
|
-
<ui-menu-item id="level1-item" submenu="level1-submenu">Level 1</ui-menu-item>
|
|
55
|
-
|
|
56
|
-
<ui-sub-menu id="level1-submenu" anchor="level1-item">
|
|
57
|
-
<ui-menu-item id="level2-item" submenu="level2-submenu">Level 2</ui-menu-item>
|
|
58
|
-
<ui-menu-item>Regular Item</ui-menu-item>
|
|
59
|
-
|
|
60
|
-
<ui-sub-menu id="level2-submenu" anchor="level2-item">
|
|
61
|
-
<ui-menu-item>Level 3 Item 1</ui-menu-item>
|
|
62
|
-
<ui-menu-item>Level 3 Item 2</ui-menu-item>
|
|
63
|
-
</ui-sub-menu>
|
|
64
|
-
</ui-sub-menu>
|
|
65
|
-
</ui-menu>
|
|
66
|
-
`)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
describe('Basic functionality', () => {
|
|
70
|
-
it('should create submenu element', async () => {
|
|
71
|
-
const element = await basicFixture()
|
|
72
|
-
assert.instanceOf(element, UiSubMenu)
|
|
73
|
-
assert.equal(element.tagName.toLowerCase(), 'ui-sub-menu')
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('should inherit from Menu', async () => {
|
|
77
|
-
const element = await basicFixture()
|
|
78
|
-
assert.instanceOf(element, Menu)
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('should have correct default properties', async () => {
|
|
82
|
-
const element = await basicFixture()
|
|
83
|
-
assert.isFalse(element.open)
|
|
84
|
-
assert.isFalse(element.disabled)
|
|
85
|
-
assert.isNull(element.parentMenu)
|
|
86
|
-
assert.isUndefined(element.anchor)
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
it('should set correct ARIA attributes', async () => {
|
|
90
|
-
const element = await basicFixture()
|
|
91
|
-
assert.equal(element.getAttribute('role'), 'menu')
|
|
92
|
-
assert.equal(element.getAttribute('aria-label'), 'Submenu')
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
describe('Anchor functionality', () => {
|
|
97
|
-
it('should get anchor element reference', async () => {
|
|
98
|
-
const container = await withAnchorFixture()
|
|
99
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
100
|
-
const anchorItem = container.querySelector('#anchor-item') as UiMenuItem
|
|
101
|
-
await nextFrame()
|
|
102
|
-
|
|
103
|
-
assert.equal(submenu.anchorElement, anchorItem)
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
it('should return null for invalid anchor', async () => {
|
|
107
|
-
const submenu: UiSubMenu = await fixture(html`<ui-sub-menu anchor="nonexistent"></ui-sub-menu>`)
|
|
108
|
-
await nextFrame()
|
|
109
|
-
|
|
110
|
-
assert.isNull(submenu.anchorElement)
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
it('should update anchor positioning', async () => {
|
|
114
|
-
const container = await withAnchorFixture()
|
|
115
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
116
|
-
const anchorItem = container.querySelector('#anchor-item') as UiMenuItem
|
|
117
|
-
await nextFrame()
|
|
118
|
-
|
|
119
|
-
// This tests that the CSS positioning properties are set
|
|
120
|
-
// The actual values depend on the CSS implementation
|
|
121
|
-
assert.isNotNull(submenu.anchorElement)
|
|
122
|
-
assert.equal(submenu.anchorElement, anchorItem)
|
|
123
|
-
})
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
describe('Show/Hide functionality', () => {
|
|
127
|
-
it('should show submenu', async () => {
|
|
128
|
-
const container = await withAnchorFixture()
|
|
129
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
130
|
-
const showSpy = sinon.spy(submenu, 'showPopover')
|
|
131
|
-
await nextFrame()
|
|
132
|
-
|
|
133
|
-
submenu.show()
|
|
134
|
-
await nextFrame()
|
|
135
|
-
|
|
136
|
-
assert.isTrue(submenu.open)
|
|
137
|
-
assert.isTrue(showSpy.calledOnce)
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
it('should not show submenu without anchor', async () => {
|
|
141
|
-
const element = await basicFixture()
|
|
142
|
-
const showSpy = sinon.spy(element, 'showPopover')
|
|
143
|
-
|
|
144
|
-
element.show()
|
|
145
|
-
await nextFrame()
|
|
146
|
-
|
|
147
|
-
assert.isFalse(element.open)
|
|
148
|
-
assert.isFalse(showSpy.called)
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
it('should hide submenu', async () => {
|
|
152
|
-
const container = await withAnchorFixture()
|
|
153
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
154
|
-
const hideSpy = sinon.spy(submenu, 'hidePopover')
|
|
155
|
-
await nextFrame()
|
|
156
|
-
|
|
157
|
-
submenu.show()
|
|
158
|
-
await nextFrame()
|
|
159
|
-
submenu.hide()
|
|
160
|
-
await nextFrame()
|
|
161
|
-
|
|
162
|
-
assert.isFalse(submenu.open)
|
|
163
|
-
assert.isTrue(hideSpy.calledOnce)
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
it('should dispatch open event when shown', async () => {
|
|
167
|
-
const container = await withAnchorFixture()
|
|
168
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
169
|
-
|
|
170
|
-
setTimeout(() => submenu.show())
|
|
171
|
-
const event = await oneEvent(submenu, 'open')
|
|
172
|
-
|
|
173
|
-
assert.instanceOf(event, CustomEvent)
|
|
174
|
-
assert.isFalse(event.bubbles, 'the event does not bubble')
|
|
175
|
-
assert.isTrue(event.composed, 'the event is composed')
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
it('should dispatch close event when hidden', async () => {
|
|
179
|
-
const container = await withAnchorFixture()
|
|
180
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
181
|
-
await nextFrame()
|
|
182
|
-
|
|
183
|
-
submenu.show()
|
|
184
|
-
await nextFrame()
|
|
185
|
-
|
|
186
|
-
setTimeout(() => submenu.hide())
|
|
187
|
-
const event = await oneEvent(submenu, 'close')
|
|
188
|
-
|
|
189
|
-
assert.instanceOf(event, CustomEvent)
|
|
190
|
-
assert.isFalse(event.bubbles)
|
|
191
|
-
assert.isTrue(event.composed)
|
|
192
|
-
})
|
|
193
|
-
})
|
|
194
|
-
|
|
195
|
-
describe('Parent menu integration', () => {
|
|
196
|
-
it('should set parent menu', async () => {
|
|
197
|
-
const container = await withParentMenuFixture()
|
|
198
|
-
const parentMenu = container.querySelector('#parent-menu') as Menu
|
|
199
|
-
const submenu = container.querySelector('#child-submenu') as UiSubMenu
|
|
200
|
-
await nextFrame()
|
|
201
|
-
|
|
202
|
-
submenu.setParentMenu(parentMenu)
|
|
203
|
-
|
|
204
|
-
assert.equal(submenu.parentMenu, parentMenu)
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
it('should set parent menu reference', async () => {
|
|
208
|
-
const container = await withParentMenuFixture()
|
|
209
|
-
const parentMenu = container.querySelector('#parent-menu') as Menu
|
|
210
|
-
const submenu = container.querySelector('#child-submenu') as UiSubMenu
|
|
211
|
-
await nextFrame()
|
|
212
|
-
|
|
213
|
-
// Test setting parent menu
|
|
214
|
-
submenu.setParentMenu(parentMenu)
|
|
215
|
-
assert.equal(submenu.parentMenu, parentMenu)
|
|
216
|
-
})
|
|
217
|
-
})
|
|
218
|
-
|
|
219
|
-
describe('Nested submenus', () => {
|
|
220
|
-
it('should handle multiple levels of nesting', async () => {
|
|
221
|
-
const container = await nestedSubmenuFixture()
|
|
222
|
-
const level1Submenu = container.querySelector('#level1-submenu') as UiSubMenu
|
|
223
|
-
const level2Submenu = container.querySelector('#level2-submenu') as UiSubMenu
|
|
224
|
-
const level1Item = container.querySelector('#level1-item') as UiMenuItem
|
|
225
|
-
const level2Item = container.querySelector('#level2-item') as UiMenuItem
|
|
226
|
-
await nextFrame()
|
|
227
|
-
|
|
228
|
-
// Verify the structure
|
|
229
|
-
assert.equal(level1Submenu.anchor, 'level1-item')
|
|
230
|
-
assert.equal(level2Submenu.anchor, 'level2-item')
|
|
231
|
-
assert.equal(level1Submenu.anchorElement, level1Item)
|
|
232
|
-
assert.equal(level2Submenu.anchorElement, level2Item)
|
|
233
|
-
})
|
|
234
|
-
|
|
235
|
-
it('should show nested submenus properly', async () => {
|
|
236
|
-
const container = await nestedSubmenuFixture()
|
|
237
|
-
const mainMenu = container.querySelector('#main-menu') as Menu
|
|
238
|
-
const level1Submenu = container.querySelector('#level1-submenu') as UiSubMenu
|
|
239
|
-
const level2Submenu = container.querySelector('#level2-submenu') as UiSubMenu
|
|
240
|
-
await nextFrame()
|
|
241
|
-
|
|
242
|
-
// Set up parent relationships
|
|
243
|
-
level1Submenu.setParentMenu(mainMenu)
|
|
244
|
-
level2Submenu.setParentMenu(level1Submenu)
|
|
245
|
-
|
|
246
|
-
// Show level 1
|
|
247
|
-
level1Submenu.show()
|
|
248
|
-
await nextFrame()
|
|
249
|
-
assert.isTrue(level1Submenu.open)
|
|
250
|
-
|
|
251
|
-
// Show level 2
|
|
252
|
-
level2Submenu.show()
|
|
253
|
-
await nextFrame()
|
|
254
|
-
assert.isTrue(level2Submenu.open)
|
|
255
|
-
})
|
|
256
|
-
})
|
|
257
|
-
|
|
258
|
-
describe('Keyboard navigation inheritance', () => {
|
|
259
|
-
it('should inherit keyboard navigation from Menu', async () => {
|
|
260
|
-
const container = await withAnchorFixture()
|
|
261
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
262
|
-
await nextFrame()
|
|
263
|
-
|
|
264
|
-
submenu.show()
|
|
265
|
-
await nextFrame()
|
|
266
|
-
|
|
267
|
-
// Test that escape key closes submenu
|
|
268
|
-
const hideSpy = sinon.spy(submenu, 'hide')
|
|
269
|
-
const event = new KeyboardEvent('keydown', { key: 'Escape' })
|
|
270
|
-
submenu.dispatchEvent(event)
|
|
271
|
-
|
|
272
|
-
assert.isTrue(hideSpy.calledOnce)
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
it('should handle arrow key navigation', async () => {
|
|
276
|
-
const container = await withAnchorFixture()
|
|
277
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
278
|
-
await nextFrame()
|
|
279
|
-
|
|
280
|
-
submenu.show()
|
|
281
|
-
await nextFrame()
|
|
282
|
-
|
|
283
|
-
// Test arrow down navigation - check that it doesn't throw and menu stays open
|
|
284
|
-
const event = new KeyboardEvent('keydown', { key: 'ArrowDown' })
|
|
285
|
-
submenu.dispatchEvent(event)
|
|
286
|
-
|
|
287
|
-
// The menu should still be open and functioning
|
|
288
|
-
assert.isTrue(submenu.open)
|
|
289
|
-
assert.isNotNull(submenu.querySelector('ui-menu-item'))
|
|
290
|
-
})
|
|
291
|
-
})
|
|
292
|
-
|
|
293
|
-
describe('Selection handling', () => {
|
|
294
|
-
it('should hide submenu when item is selected', async () => {
|
|
295
|
-
const container = await withAnchorFixture()
|
|
296
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
297
|
-
const menuItem = submenu.querySelector('ui-menu-item') as UiMenuItem
|
|
298
|
-
await nextFrame()
|
|
299
|
-
|
|
300
|
-
submenu.show()
|
|
301
|
-
await nextFrame()
|
|
302
|
-
assert.isTrue(submenu.open)
|
|
303
|
-
|
|
304
|
-
// Click menu item - it should close the submenu
|
|
305
|
-
menuItem.click()
|
|
306
|
-
await nextFrame()
|
|
307
|
-
|
|
308
|
-
assert.isFalse(submenu.open)
|
|
309
|
-
})
|
|
310
|
-
|
|
311
|
-
it('should dispatch select event', async () => {
|
|
312
|
-
const container = await withAnchorFixture()
|
|
313
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
314
|
-
const menuItem = submenu.querySelector('ui-menu-item') as UiMenuItem
|
|
315
|
-
await nextFrame()
|
|
316
|
-
|
|
317
|
-
submenu.show()
|
|
318
|
-
await nextFrame()
|
|
319
|
-
|
|
320
|
-
setTimeout(() => menuItem.click())
|
|
321
|
-
const event = (await oneEvent(submenu, 'select')) as CustomEvent<{ item: UiMenuItem; index: number }>
|
|
322
|
-
|
|
323
|
-
assert.instanceOf(event, CustomEvent)
|
|
324
|
-
assert.equal(event.detail.item, menuItem)
|
|
325
|
-
assert.equal(event.detail.index, 0)
|
|
326
|
-
})
|
|
327
|
-
})
|
|
328
|
-
|
|
329
|
-
describe('Edge cases', () => {
|
|
330
|
-
it('should handle anchor property changes', async () => {
|
|
331
|
-
const container = await withAnchorFixture()
|
|
332
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
333
|
-
await nextFrame()
|
|
334
|
-
|
|
335
|
-
// Change anchor
|
|
336
|
-
submenu.anchor = 'new-anchor'
|
|
337
|
-
await nextFrame()
|
|
338
|
-
|
|
339
|
-
// Should not throw
|
|
340
|
-
assert.equal(submenu.anchor, 'new-anchor')
|
|
341
|
-
assert.isNull(submenu.anchorElement) // Since 'new-anchor' doesn't exist
|
|
342
|
-
})
|
|
343
|
-
|
|
344
|
-
it('should handle missing parent menu gracefully', async () => {
|
|
345
|
-
const element = await basicFixture()
|
|
346
|
-
|
|
347
|
-
// Should not throw when no parent menu is set
|
|
348
|
-
element.show()
|
|
349
|
-
element.hide()
|
|
350
|
-
|
|
351
|
-
assert.isNull(element.parentMenu)
|
|
352
|
-
})
|
|
353
|
-
|
|
354
|
-
it('should handle disabled state', async () => {
|
|
355
|
-
const element = await basicFixture()
|
|
356
|
-
|
|
357
|
-
element.disabled = true
|
|
358
|
-
await nextFrame()
|
|
359
|
-
|
|
360
|
-
assert.isTrue(element.disabled)
|
|
361
|
-
assert.isTrue(element.hasAttribute('disabled'))
|
|
362
|
-
})
|
|
363
|
-
})
|
|
364
|
-
|
|
365
|
-
describe('CSS anchor positioning', () => {
|
|
366
|
-
it('should set CSS anchor positioning properties', async () => {
|
|
367
|
-
const container = await withAnchorFixture()
|
|
368
|
-
const submenu = container.querySelector('#test-submenu') as UiSubMenu
|
|
369
|
-
const anchorItem = container.querySelector('#anchor-item') as UiMenuItem
|
|
370
|
-
await nextFrame()
|
|
371
|
-
|
|
372
|
-
submenu.show()
|
|
373
|
-
await nextFrame()
|
|
374
|
-
|
|
375
|
-
// Check that CSS properties are set for anchor positioning
|
|
376
|
-
// The exact values depend on the implementation
|
|
377
|
-
const anchorStyle = anchorItem.style.getPropertyValue('anchor-name')
|
|
378
|
-
const submenuStyle = submenu.style.getPropertyValue('position-anchor')
|
|
379
|
-
|
|
380
|
-
// These should be set when the submenu is shown
|
|
381
|
-
assert.isTrue(anchorStyle.includes('anchor-') || anchorStyle.length > 0)
|
|
382
|
-
assert.isTrue(submenuStyle.includes('anchor-') || submenuStyle.length > 0)
|
|
383
|
-
})
|
|
384
|
-
})
|
|
385
|
-
|
|
386
|
-
describe('Rendering', () => {
|
|
387
|
-
it('should render slot for submenu items', async () => {
|
|
388
|
-
const element = await basicFixture()
|
|
389
|
-
await nextFrame()
|
|
390
|
-
|
|
391
|
-
const slot = element.shadowRoot!.querySelector('slot')
|
|
392
|
-
assert.isNotNull(slot)
|
|
393
|
-
|
|
394
|
-
const menuItems = element.querySelectorAll('ui-menu-item')
|
|
395
|
-
assert.equal(menuItems.length, 3)
|
|
396
|
-
})
|
|
397
|
-
|
|
398
|
-
it('should render slot for submenu items', async () => {
|
|
399
|
-
const element = await basicFixture()
|
|
400
|
-
await nextFrame()
|
|
401
|
-
|
|
402
|
-
const slot = element.shadowRoot!.querySelector('slot')
|
|
403
|
-
assert.isNotNull(slot)
|
|
404
|
-
|
|
405
|
-
const menuItems = element.querySelectorAll('ui-menu-item')
|
|
406
|
-
assert.equal(menuItems.length, 3)
|
|
407
|
-
})
|
|
408
|
-
})
|
|
409
|
-
})
|
|
410
|
-
})
|