xmlui 0.10.12 → 0.10.14
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/lib/{index-CDOoBf2R.mjs → index-779mp2Bm.mjs} +1508 -1287
- package/dist/lib/index.css +1 -1
- package/dist/lib/{initMock-BAV9RKui.mjs → initMock-CAXdczCj.mjs} +1 -1
- package/dist/lib/scss/components-core/theming/_themes.scss +1 -1
- package/dist/lib/xmlui.d.ts +17 -2
- package/dist/lib/xmlui.mjs +33 -32
- package/dist/metadata/{collectedComponentMetadata-Dp8BqWQO.mjs → collectedComponentMetadata-7DFXlw-J.mjs} +14957 -14751
- package/dist/metadata/{initMock-BvEO8W8r.mjs → initMock-AFWEftc6.mjs} +1 -1
- package/dist/metadata/style.css +1 -1
- package/dist/metadata/xmlui-metadata.mjs +1 -1
- package/dist/metadata/xmlui-metadata.umd.js +3 -3
- package/dist/scripts/bin/build-lib.js +21 -13
- package/dist/scripts/bin/viteConfig.js +3 -1
- package/dist/scripts/package.json +1 -1
- package/dist/scripts/src/abstractions/scripting/Token.js +2 -0
- package/dist/scripts/src/abstractions/scripting/TryScope.js +2 -0
- package/dist/scripts/src/abstractions/scripting/modules.js +2 -0
- package/dist/scripts/src/components/APICall/APICall.spec.js +910 -0
- package/dist/scripts/src/components/Accordion/Accordion.spec.js +969 -0
- package/dist/scripts/src/components/Animation/Animation.js +50 -0
- package/dist/scripts/src/components/App/App.spec.js +219 -0
- package/dist/scripts/src/components/AppHeader/AppHeader.spec.js +169 -0
- package/dist/scripts/src/components/AppState/AppState.spec.js +268 -0
- package/dist/scripts/src/components/AutoComplete/AutoComplete.spec.js +383 -0
- package/dist/scripts/src/components/Avatar/Avatar.spec.js +1543 -0
- package/dist/scripts/src/components/Backdrop/Backdrop.spec.js +131 -0
- package/dist/scripts/src/components/Badge/Badge.spec.js +2214 -0
- package/dist/scripts/src/components/Bookmark/Bookmark.spec.js +230 -0
- package/dist/scripts/src/components/Breakout/Breakout.spec.js +56 -0
- package/dist/scripts/src/components/Button/Button-style.spec.js +274 -0
- package/dist/scripts/src/components/Button/Button.spec.js +454 -0
- package/dist/scripts/src/components/Card/Card.spec.js +150 -0
- package/dist/scripts/src/components/Carousel/Carousel.spec.js +343 -0
- package/dist/scripts/src/components/Carousel/CarouselNative.js +2 -2
- package/dist/scripts/src/components/ChangeListener/ChangeListener.spec.js +169 -0
- package/dist/scripts/src/components/Charts/AreaChart/AreaChart.spec.js +999 -0
- package/dist/scripts/src/components/Charts/BarChart/BarChart.spec.js +597 -0
- package/dist/scripts/src/components/Charts/DonutChart/DonutChart.spec.js +608 -0
- package/dist/scripts/src/components/Charts/LabelList/LabelList.spec.js +539 -0
- package/dist/scripts/src/components/Charts/Legend/Legend.spec.js +558 -0
- package/dist/scripts/src/components/Charts/LineChart/LineChart.spec.js +450 -0
- package/dist/scripts/src/components/Charts/PieChart/PieChart.spec.js +584 -0
- package/dist/scripts/src/components/Charts/RadarChart/RadarChart.spec.js +571 -0
- package/dist/scripts/src/components/Charts/Tooltip/TooltipContent.spec.js +449 -0
- package/dist/scripts/src/components/Checkbox/Checkbox.spec.js +964 -0
- package/dist/scripts/src/components/CodeBlock/CodeBlock.spec.js +196 -0
- package/dist/scripts/src/components/ColorPicker/ColorPicker.js +3 -3
- package/dist/scripts/src/components/ColorPicker/ColorPicker.spec.js +283 -0
- package/dist/scripts/src/components/ColorPicker/ColorPickerNative.js +16 -5
- package/dist/scripts/src/components/Column/doc-resources/list-component-data.js +53 -0
- package/dist/scripts/src/components/ComponentProvider.js +6 -6
- package/dist/scripts/src/components/ContentSeparator/ContentSeparator.spec.js +338 -0
- package/dist/scripts/src/components/DateInput/DateInput.spec.js +918 -0
- package/dist/scripts/src/components/DatePicker/DatePicker.spec.js +362 -0
- package/dist/scripts/src/components/DatePicker/DatePickerNative.js +3 -3
- package/dist/scripts/src/components/DropdownMenu/DropdownMenu.spec.js +331 -0
- package/dist/scripts/src/components/DropdownMenu/DropdownMenuNative.js +1 -1
- package/dist/scripts/src/components/EmojiSelector/EmojiSelector.spec.js +29 -0
- package/dist/scripts/src/components/ExpandableItem/ExpandableItem.spec.js +435 -0
- package/dist/scripts/src/components/FileInput/FileInput.spec.js +249 -0
- package/dist/scripts/src/components/FileInput/FileInputNative.js +14 -10
- package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZone.spec.js +296 -0
- package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZoneNative.js +1 -1
- package/dist/scripts/src/components/FlowLayout/FlowLayout.spec.js +518 -0
- package/dist/scripts/src/components/Footer/Footer.spec.js +991 -0
- package/dist/scripts/src/components/Form/Form.js +6 -0
- package/dist/scripts/src/components/Form/Form.spec.js +1257 -0
- package/dist/scripts/src/components/Form/FormNative.js +13 -3
- package/dist/scripts/src/components/FormItem/FormItem.spec.js +723 -0
- package/dist/scripts/src/components/FormItem/ItemWithLabel.js +2 -2
- package/dist/scripts/src/components/FormSection/FormSection.js +6 -31
- package/dist/scripts/src/components/Fragment/Fragment.js +5 -1
- package/dist/scripts/src/components/Fragment/Fragment.spec.js +50 -0
- package/dist/scripts/src/components/Heading/H1.spec.js +66 -0
- package/dist/scripts/src/components/Heading/H2.spec.js +66 -0
- package/dist/scripts/src/components/Heading/H3.spec.js +66 -0
- package/dist/scripts/src/components/Heading/H4.spec.js +66 -0
- package/dist/scripts/src/components/Heading/H5.spec.js +66 -0
- package/dist/scripts/src/components/Heading/H6.spec.js +66 -0
- package/dist/scripts/src/components/Heading/Heading.js +0 -12
- package/dist/scripts/src/components/Heading/Heading.spec.js +897 -0
- package/dist/scripts/src/components/HtmlTags/HtmlTags.spec.js +69 -0
- package/dist/scripts/src/components/IFrame/IFrame.spec.js +527 -0
- package/dist/scripts/src/components/Icon/ArrowDropDown.js +11 -0
- package/dist/scripts/src/components/Icon/ArrowDropUp.js +11 -0
- package/dist/scripts/src/components/Icon/ArrowLeft.js +11 -0
- package/dist/scripts/src/components/Icon/ArrowRight.js +11 -0
- package/dist/scripts/src/components/Icon/ChevronDownIcon.js +7 -0
- package/dist/scripts/src/components/Icon/ChevronUpIcon.js +7 -0
- package/dist/scripts/src/components/Icon/Icon.spec.js +527 -0
- package/dist/scripts/src/components/Icon/SunIcon.js +10 -0
- package/dist/scripts/src/components/Image/Image.js +2 -1
- package/dist/scripts/src/components/Image/Image.spec.js +198 -0
- package/dist/scripts/src/components/Image/ImageNative.js +30 -2
- package/dist/scripts/src/components/Input/InputLabel.js +25 -0
- package/dist/scripts/src/components/Input/index.js +5 -0
- package/dist/scripts/src/components/Items/Items.spec.js +397 -0
- package/dist/scripts/src/components/Link/Link.spec.js +894 -0
- package/dist/scripts/src/components/List/List.spec.js +927 -0
- package/dist/scripts/src/components/List/doc-resources/list-component-data.js +53 -0
- package/dist/scripts/src/components/Markdown/Markdown.spec.js +188 -0
- package/dist/scripts/src/components/ModalDialog/ModalDialog.js +1 -1
- package/dist/scripts/src/components/ModalDialog/ModalDialog.spec.js +162 -0
- package/dist/scripts/src/components/ModalDialog/ModalDialogNative.js +1 -1
- package/dist/scripts/src/components/NavGroup/NavGroup.spec.js +153 -0
- package/dist/scripts/src/components/NavGroup/NavGroupNative.js +2 -2
- package/dist/scripts/src/components/NavLink/NavLink.spec.js +864 -0
- package/dist/scripts/src/components/NavPanel/NavPanel.spec.js +864 -0
- package/dist/scripts/src/components/NoResult/NoResult.spec.js +863 -0
- package/dist/scripts/src/components/NumberBox/NumberBox.spec.js +1231 -0
- package/dist/scripts/src/components/Option/Option.spec.js +472 -0
- package/dist/scripts/src/components/PageMetaTitle/PageMetaTitle.spec.js +80 -0
- package/dist/scripts/src/components/Pagination/Pagination.spec.js +1003 -0
- package/dist/scripts/src/components/ProfileMenu/ProfileMenu.js +20 -0
- package/dist/scripts/src/components/ProgressBar/ProgressBar.spec.js +166 -0
- package/dist/scripts/src/components/Queue/Queue.spec.js +626 -0
- package/dist/scripts/src/components/RadioGroup/RadioGroup.spec.js +479 -0
- package/dist/scripts/src/components/RadioGroup/RadioGroupNative.js +17 -1
- package/dist/scripts/src/components/Redirect/Redirect.spec.js +527 -0
- package/dist/scripts/src/components/ResponsiveBar/ResponsiveBar.spec.js +76 -0
- package/dist/scripts/src/components/Select/Select.spec.js +527 -0
- package/dist/scripts/src/components/Slider/Slider.js +2 -0
- package/dist/scripts/src/components/Slider/Slider.spec.js +574 -0
- package/dist/scripts/src/components/Slider/SliderNative.js +62 -25
- package/dist/scripts/src/components/Slot/Slot.spec.js +368 -0
- package/dist/scripts/src/components/SpaceFiller/SpaceFiller.spec.js +184 -0
- package/dist/scripts/src/components/Spinner/Spinner.spec.js +161 -0
- package/dist/scripts/src/components/Splitter/HSplitter.spec.js +104 -0
- package/dist/scripts/src/components/Splitter/Splitter.spec.js +543 -0
- package/dist/scripts/src/components/Splitter/VSplitter.spec.js +104 -0
- package/dist/scripts/src/components/Stack/CHStack.spec.js +86 -0
- package/dist/scripts/src/components/Stack/CVStack.spec.js +86 -0
- package/dist/scripts/src/components/Stack/HStack.spec.js +67 -0
- package/dist/scripts/src/components/Stack/Stack.spec.js +654 -0
- package/dist/scripts/src/components/Stack/VStack.spec.js +67 -0
- package/dist/scripts/src/components/Switch/Switch.spec.js +829 -0
- package/dist/scripts/src/components/Table/Table.js +8 -5
- package/dist/scripts/src/components/Table/Table.spec.js +555 -0
- package/dist/scripts/src/components/Table/TableNative.js +1 -1
- package/dist/scripts/src/components/Table/doc-resources/list-component-data.js +53 -0
- package/dist/scripts/src/components/TableOfContents/TableOfContents.spec.js +838 -0
- package/dist/scripts/src/components/Tabs/Tabs.spec.js +875 -0
- package/dist/scripts/src/components/Text/Text.js +0 -13
- package/dist/scripts/src/components/Text/Text.spec.js +1075 -0
- package/dist/scripts/src/components/TextArea/TextArea.spec.js +714 -0
- package/dist/scripts/src/components/TextArea/TextAreaNative.js +8 -1
- package/dist/scripts/src/components/TextBox/TextBox.spec.js +643 -0
- package/dist/scripts/src/components/Theme/NotificationToast.js +4 -1
- package/dist/scripts/src/components/Theme/Theme.spec.js +124 -0
- package/dist/scripts/src/components/TimeInput/TimeInput.spec.js +1122 -0
- package/dist/scripts/src/components/Timer/Timer.spec.js +358 -0
- package/dist/scripts/src/components/ToneChangerButton/ToneChangerButton.spec.js +414 -0
- package/dist/scripts/src/components/ToneSwitch/ToneSwitch.spec.js +89 -0
- package/dist/scripts/src/components/Tooltip/Tooltip.spec.js +418 -0
- package/dist/scripts/src/components/chart-color-schemes.js +43 -0
- package/dist/scripts/src/components-core/CompoundComponent.js +5 -5
- package/dist/scripts/src/components-core/RestApiProxy.js +89 -11
- package/dist/scripts/src/components-core/devtools/InspectorDialogVisibilityContext.js +8 -0
- package/dist/scripts/src/components-core/renderers.js +31 -0
- package/dist/scripts/src/components-core/rendering/ComponentAdapter.js +1 -1
- package/dist/scripts/src/components-core/rendering/Container.js +19 -8
- package/dist/scripts/src/components-core/rendering/reducer.js +1 -1
- package/dist/scripts/src/components-core/script-runner/simplify-expression.js +386 -0
- package/dist/scripts/src/components-core/theming/component-layout-resolver.js +153 -0
- package/dist/scripts/src/components-core/theming/parse-layout-props.js +98 -0
- package/dist/scripts/src/components-core/theming/themes/root.js +13 -20
- package/dist/scripts/src/components-core/theming/themes/solid.js +16 -0
- package/dist/scripts/src/components-core/utils/audio-utils.js +83 -0
- package/dist/scripts/src/index-standalone.js +61 -0
- package/dist/scripts/src/index.js +2 -1
- package/dist/scripts/src/language-server/server-common.js +151 -0
- package/dist/scripts/src/language-server/server-web-worker.js +47 -0
- package/dist/scripts/src/language-server/server.js +42 -0
- package/dist/scripts/src/language-server/services/common/docs-generation.js +73 -0
- package/dist/scripts/src/language-server/services/common/lsp-utils.js +9 -0
- package/dist/scripts/src/language-server/services/common/syntax-node-utilities.js +135 -0
- package/dist/scripts/src/language-server/services/completion.js +270 -0
- package/dist/scripts/src/language-server/services/diagnostic.js +19 -0
- package/dist/scripts/src/language-server/services/format.js +430 -0
- package/dist/scripts/src/language-server/services/hover.js +164 -0
- package/dist/scripts/src/language-server/xmlui-metadata-generated.mjs +16266 -0
- package/dist/scripts/src/logging/xmlui.js +21 -0
- package/dist/scripts/src/parsers/common/utils.js +19 -0
- package/dist/scripts/src/syntax/monaco/grammar.monacoLanguage.js +286 -0
- package/dist/scripts/src/syntax/monaco/index.js +14 -0
- package/dist/scripts/src/syntax/monaco/xmlui-dark.js +25 -0
- package/dist/scripts/src/syntax/monaco/xmlui-light.js +25 -0
- package/dist/scripts/src/syntax/monaco/xmluiscript.monacoLanguage.js +310 -0
- package/dist/scripts/src/syntax/textMate/index.js +14 -0
- package/dist/scripts/src/syntax/textMate/xmlui-dark.json +631 -0
- package/dist/scripts/src/syntax/textMate/xmlui-light.json +565 -0
- package/dist/scripts/src/syntax/textMate/xmlui.json +564 -0
- package/dist/scripts/src/syntax/textMate/xmlui.tmLanguage.json +341 -0
- package/dist/scripts/src/testing/ComponentDrivers.js +1355 -0
- package/dist/scripts/src/testing/assertions.js +444 -0
- package/dist/scripts/src/testing/component-test-helpers.js +389 -0
- package/dist/scripts/src/testing/drivers/DateInputDriver.js +19 -0
- package/dist/scripts/src/testing/drivers/ModalDialogDriver.js +10 -0
- package/dist/scripts/src/testing/drivers/TimeInputDriver.js +22 -0
- package/dist/scripts/src/testing/drivers/TimerDriver.js +64 -0
- package/dist/scripts/src/testing/fixtures.js +487 -0
- package/dist/scripts/src/testing/infrastructure/TestBed.js +17 -0
- package/dist/scripts/src/testing/infrastructure/main.js +9 -0
- package/dist/scripts/src/testing/infrastructure/public/mockServiceWorker.js +266 -0
- package/dist/scripts/src/testing/themed-app-test-helpers.js +139 -0
- package/dist/standalone/xmlui-standalone.es.d.ts +19 -2
- package/dist/standalone/xmlui-standalone.umd.js +36 -36
- package/package.json +1 -1
- package/dist/scripts/src/components/RadioGroup/RadioItem.js +0 -28
|
@@ -0,0 +1,875 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const fixtures_1 = require("../../testing/fixtures");
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// SMOKE TESTS
|
|
15
|
+
// =============================================================================
|
|
16
|
+
fixtures_1.test.describe("smoke tests", { tag: "@smoke" }, () => {
|
|
17
|
+
(0, fixtures_1.test)("component renders", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
18
|
+
yield initTestBed(`
|
|
19
|
+
<Tabs>
|
|
20
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
21
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
22
|
+
</Tabs>
|
|
23
|
+
`);
|
|
24
|
+
// Check that tabs component is rendered
|
|
25
|
+
yield (0, fixtures_1.expect)(page.getByRole('tablist')).toBeAttached();
|
|
26
|
+
}));
|
|
27
|
+
(0, fixtures_1.test)("renders tab labels correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
28
|
+
yield initTestBed(`
|
|
29
|
+
<Tabs>
|
|
30
|
+
<TabItem label="First Tab">Content 1</TabItem>
|
|
31
|
+
<TabItem label="Second Tab">Content 2</TabItem>
|
|
32
|
+
<TabItem label="Third Tab">Content 3</TabItem>
|
|
33
|
+
</Tabs>
|
|
34
|
+
`);
|
|
35
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "First Tab" })).toBeVisible();
|
|
36
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Second Tab" })).toBeVisible();
|
|
37
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Third Tab" })).toBeVisible();
|
|
38
|
+
}));
|
|
39
|
+
(0, fixtures_1.test)("shows first tab content by default", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
40
|
+
yield initTestBed(`
|
|
41
|
+
<Tabs>
|
|
42
|
+
<TabItem label="Tab 1">First content</TabItem>
|
|
43
|
+
<TabItem label="Tab 2">Second content</TabItem>
|
|
44
|
+
</Tabs>
|
|
45
|
+
`);
|
|
46
|
+
yield (0, fixtures_1.expect)(page.getByText("First content")).toBeVisible();
|
|
47
|
+
yield (0, fixtures_1.expect)(page.getByText("Second content")).not.toBeVisible();
|
|
48
|
+
}));
|
|
49
|
+
});
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// BASIC FUNCTIONALITY TESTS
|
|
52
|
+
// =============================================================================
|
|
53
|
+
fixtures_1.test.describe("basic functionality", () => {
|
|
54
|
+
(0, fixtures_1.test)("switches tabs when clicked", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
55
|
+
yield initTestBed(`
|
|
56
|
+
<Tabs>
|
|
57
|
+
<TabItem label="Tab 1">First content</TabItem>
|
|
58
|
+
<TabItem label="Tab 2">Second content</TabItem>
|
|
59
|
+
<TabItem label="Tab 3">Third content</TabItem>
|
|
60
|
+
</Tabs>
|
|
61
|
+
`);
|
|
62
|
+
// Wait for tabs to be fully rendered
|
|
63
|
+
yield (0, fixtures_1.expect)(page.getByRole('tablist')).toBeAttached();
|
|
64
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toBeVisible();
|
|
65
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeVisible();
|
|
66
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 3" })).toBeVisible();
|
|
67
|
+
// Initially first tab is active
|
|
68
|
+
yield (0, fixtures_1.expect)(page.getByText("First content")).toBeVisible();
|
|
69
|
+
yield (0, fixtures_1.expect)(page.getByText("Second content")).not.toBeVisible();
|
|
70
|
+
yield (0, fixtures_1.expect)(page.getByText("Third content")).not.toBeVisible();
|
|
71
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toHaveAttribute("aria-selected", "true");
|
|
72
|
+
// Click second tab and wait for transition
|
|
73
|
+
yield page.getByRole("tab", { name: "Tab 2" }).click();
|
|
74
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toHaveAttribute("aria-selected", "true");
|
|
75
|
+
yield (0, fixtures_1.expect)(page.getByText("First content")).not.toBeVisible();
|
|
76
|
+
yield (0, fixtures_1.expect)(page.getByText("Second content")).toBeVisible();
|
|
77
|
+
yield (0, fixtures_1.expect)(page.getByText("Third content")).not.toBeVisible();
|
|
78
|
+
// Click third tab and wait for transition
|
|
79
|
+
yield page.getByRole("tab", { name: "Tab 3" }).click();
|
|
80
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 3" })).toHaveAttribute("aria-selected", "true");
|
|
81
|
+
yield (0, fixtures_1.expect)(page.getByText("First content")).not.toBeVisible();
|
|
82
|
+
yield (0, fixtures_1.expect)(page.getByText("Second content")).not.toBeVisible();
|
|
83
|
+
yield (0, fixtures_1.expect)(page.getByText("Third content")).toBeVisible();
|
|
84
|
+
}));
|
|
85
|
+
(0, fixtures_1.test)("activeTab prop sets initial active tab", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
86
|
+
yield initTestBed(`
|
|
87
|
+
<Tabs activeTab="{1}">
|
|
88
|
+
<TabItem label="Tab 1">First content</TabItem>
|
|
89
|
+
<TabItem label="Tab 2">Second content</TabItem>
|
|
90
|
+
<TabItem label="Tab 3">Third content</TabItem>
|
|
91
|
+
</Tabs>
|
|
92
|
+
`);
|
|
93
|
+
yield (0, fixtures_1.expect)(page.getByText("First content")).not.toBeVisible();
|
|
94
|
+
yield (0, fixtures_1.expect)(page.getByText("Second content")).toBeVisible();
|
|
95
|
+
yield (0, fixtures_1.expect)(page.getByText("Third content")).not.toBeVisible();
|
|
96
|
+
}));
|
|
97
|
+
(0, fixtures_1.test)("orientation prop changes tab layout", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
98
|
+
yield initTestBed(`
|
|
99
|
+
<Tabs orientation="vertical" testId="vertical-tabs">
|
|
100
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
101
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
102
|
+
</Tabs>
|
|
103
|
+
`);
|
|
104
|
+
// Check that tabs component has vertical orientation
|
|
105
|
+
const tabsRoot = page.getByTestId("vertical-tabs");
|
|
106
|
+
yield (0, fixtures_1.expect)(tabsRoot).toHaveAttribute("data-orientation", "vertical");
|
|
107
|
+
}));
|
|
108
|
+
});
|
|
109
|
+
// =============================================================================
|
|
110
|
+
// HEADER TEMPLATE TESTS
|
|
111
|
+
// =============================================================================
|
|
112
|
+
fixtures_1.test.describe("headerTemplate functionality", () => {
|
|
113
|
+
(0, fixtures_1.test)("renders custom headerTemplate instead of label", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
114
|
+
yield initTestBed(`
|
|
115
|
+
<Tabs>
|
|
116
|
+
<TabItem label="Simple Label">
|
|
117
|
+
<property name="headerTemplate">
|
|
118
|
+
<VStack gap="$space-1">
|
|
119
|
+
<Text>Custom</Text>
|
|
120
|
+
<Text>Header</Text>
|
|
121
|
+
</VStack>
|
|
122
|
+
</property>
|
|
123
|
+
Content 1
|
|
124
|
+
</TabItem>
|
|
125
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
126
|
+
</Tabs>
|
|
127
|
+
`);
|
|
128
|
+
// Custom header content should be visible
|
|
129
|
+
yield (0, fixtures_1.expect)(page.getByText("Custom")).toBeVisible();
|
|
130
|
+
yield (0, fixtures_1.expect)(page.getByText("Header")).toBeVisible();
|
|
131
|
+
// Simple label should be visible for second tab
|
|
132
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeVisible();
|
|
133
|
+
}));
|
|
134
|
+
(0, fixtures_1.test)("headerTemplate takes priority over global headerTemplate", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
135
|
+
yield initTestBed(`
|
|
136
|
+
<Tabs>
|
|
137
|
+
<property name="headerTemplate">
|
|
138
|
+
<Text>Global: {$header.label}</Text>
|
|
139
|
+
</property>
|
|
140
|
+
<TabItem label="Tab 1">
|
|
141
|
+
<property name="headerTemplate">
|
|
142
|
+
<Text>Custom Content</Text>
|
|
143
|
+
</property>
|
|
144
|
+
Content 1
|
|
145
|
+
</TabItem>
|
|
146
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
147
|
+
</Tabs>
|
|
148
|
+
`);
|
|
149
|
+
// First tab should use individual headerTemplate
|
|
150
|
+
yield (0, fixtures_1.expect)(page.getByText("Custom Content")).toBeVisible();
|
|
151
|
+
// Second tab should use global headerTemplate
|
|
152
|
+
yield (0, fixtures_1.expect)(page.getByText("Global: Tab 2")).toBeVisible();
|
|
153
|
+
}));
|
|
154
|
+
(0, fixtures_1.test)("complex headerTemplate with icons and badges", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
155
|
+
yield initTestBed(`
|
|
156
|
+
<Tabs>
|
|
157
|
+
<TabItem label="Tab 1">
|
|
158
|
+
<property name="headerTemplate">
|
|
159
|
+
<HStack gap="$space-2" alignItems="center">
|
|
160
|
+
<Text>Custom: {$header.label}</Text>
|
|
161
|
+
<Badge>{$header.isActive ? 'Active' : ''}</Badge>
|
|
162
|
+
</HStack>
|
|
163
|
+
</property>
|
|
164
|
+
Content 1
|
|
165
|
+
</TabItem>
|
|
166
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
167
|
+
</Tabs>
|
|
168
|
+
`);
|
|
169
|
+
yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 1")).toBeVisible();
|
|
170
|
+
yield (0, fixtures_1.expect)(page.getByText("Active")).toBeVisible();
|
|
171
|
+
}));
|
|
172
|
+
(0, fixtures_1.test)("headerTemplate receives correct context props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
173
|
+
yield initTestBed(`
|
|
174
|
+
<Tabs>
|
|
175
|
+
<TabItem label="First Tab">
|
|
176
|
+
<property name="headerTemplate">
|
|
177
|
+
<VStack gap="$space-1">
|
|
178
|
+
<Text>Index: {$header.index}</Text>
|
|
179
|
+
<Text>Label: {$header.label}</Text>
|
|
180
|
+
<Text>Active: {$header.isActive ? 'Yes' : 'No'}</Text>
|
|
181
|
+
</VStack>
|
|
182
|
+
</property>
|
|
183
|
+
Content 1
|
|
184
|
+
</TabItem>
|
|
185
|
+
<TabItem label="Second Tab">Content 2</TabItem>
|
|
186
|
+
</Tabs>
|
|
187
|
+
`);
|
|
188
|
+
yield (0, fixtures_1.expect)(page.getByText("Index: 0")).toBeVisible();
|
|
189
|
+
yield (0, fixtures_1.expect)(page.getByText("Label: First Tab")).toBeVisible();
|
|
190
|
+
yield (0, fixtures_1.expect)(page.getByText("Active: Yes")).toBeVisible();
|
|
191
|
+
}));
|
|
192
|
+
(0, fixtures_1.test)("headerTemplate receives external id when provided", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
193
|
+
yield initTestBed(`
|
|
194
|
+
<Tabs>
|
|
195
|
+
<TabItem label="First Tab" id="custom-tab-1">
|
|
196
|
+
<property name="headerTemplate">
|
|
197
|
+
<VStack gap="$space-1">
|
|
198
|
+
<Text>ID: {$header.id}</Text>
|
|
199
|
+
<Text>Label: {$header.label}</Text>
|
|
200
|
+
<Text>Has ID: {$header.id ? 'Yes' : 'No'}</Text>
|
|
201
|
+
</VStack>
|
|
202
|
+
</property>
|
|
203
|
+
Content 1
|
|
204
|
+
</TabItem>
|
|
205
|
+
<TabItem label="Second Tab">
|
|
206
|
+
<property name="headerTemplate">
|
|
207
|
+
<VStack gap="$space-1">
|
|
208
|
+
<Text>Label: {$header.label}</Text>
|
|
209
|
+
<Text>Has ID: {$header.id ? 'Yes' : 'No'}</Text>
|
|
210
|
+
</VStack>
|
|
211
|
+
</property>
|
|
212
|
+
Content 2
|
|
213
|
+
</TabItem>
|
|
214
|
+
</Tabs>
|
|
215
|
+
`);
|
|
216
|
+
// First tab should show the external id
|
|
217
|
+
yield (0, fixtures_1.expect)(page.getByText("ID: custom-tab-1")).toBeVisible();
|
|
218
|
+
yield (0, fixtures_1.expect)(page.getByText("Label: First Tab")).toBeVisible();
|
|
219
|
+
yield (0, fixtures_1.expect)(page.getByText("Has ID: Yes")).toBeVisible();
|
|
220
|
+
// Click second tab
|
|
221
|
+
yield page.getByRole("tab", { name: "Second Tab" }).click();
|
|
222
|
+
// Second tab should not have id in context
|
|
223
|
+
yield (0, fixtures_1.expect)(page.getByText("Label: Second Tab")).toBeVisible();
|
|
224
|
+
yield (0, fixtures_1.expect)(page.getByText("Has ID: No")).toBeVisible();
|
|
225
|
+
}));
|
|
226
|
+
});
|
|
227
|
+
// =============================================================================
|
|
228
|
+
// GLOBAL HEADER TEMPLATE TESTS
|
|
229
|
+
// =============================================================================
|
|
230
|
+
fixtures_1.test.describe("global headerTemplate functionality", () => {
|
|
231
|
+
(0, fixtures_1.test)("global headerTemplate customizes all tab headers", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
232
|
+
yield initTestBed(`
|
|
233
|
+
<Tabs>
|
|
234
|
+
<property name="headerTemplate">
|
|
235
|
+
<Text>Custom: {$header.label}</Text>
|
|
236
|
+
</property>
|
|
237
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
238
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
239
|
+
<TabItem label="Tab 3">Content 3</TabItem>
|
|
240
|
+
</Tabs>
|
|
241
|
+
`);
|
|
242
|
+
yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 1")).toBeVisible();
|
|
243
|
+
yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 2")).toBeVisible();
|
|
244
|
+
yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 3")).toBeVisible();
|
|
245
|
+
}));
|
|
246
|
+
(0, fixtures_1.test)("global headerTemplate receives isActive state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
247
|
+
yield initTestBed(`
|
|
248
|
+
<Tabs>
|
|
249
|
+
<property name="headerTemplate">
|
|
250
|
+
<Text>{$header.isActive ? 'Active: ' : ''}{$header.label}</Text>
|
|
251
|
+
</property>
|
|
252
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
253
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
254
|
+
</Tabs>
|
|
255
|
+
`);
|
|
256
|
+
// First tab should be active initially
|
|
257
|
+
yield (0, fixtures_1.expect)(page.getByText("Active: Tab 1")).toBeVisible();
|
|
258
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 2")).toBeVisible();
|
|
259
|
+
// Click second tab
|
|
260
|
+
yield page.getByText("Tab 2").click();
|
|
261
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 1")).toBeVisible();
|
|
262
|
+
yield (0, fixtures_1.expect)(page.getByText("Active: Tab 2")).toBeVisible();
|
|
263
|
+
}));
|
|
264
|
+
(0, fixtures_1.test)("global headerTemplate with complex content", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
265
|
+
yield initTestBed(`
|
|
266
|
+
<Tabs>
|
|
267
|
+
<property name="headerTemplate">
|
|
268
|
+
<HStack>
|
|
269
|
+
<Text>{$header.label} {$header.isActive ? 'active' : ''}</Text>
|
|
270
|
+
</HStack>
|
|
271
|
+
</property>
|
|
272
|
+
<TabItem label="Home">Home content</TabItem>
|
|
273
|
+
<TabItem label="Settings">Settings content</TabItem>
|
|
274
|
+
</Tabs>
|
|
275
|
+
`);
|
|
276
|
+
yield (0, fixtures_1.expect)(page.getByText("Home active")).toBeVisible();
|
|
277
|
+
yield page.getByText("Settings").click();
|
|
278
|
+
yield (0, fixtures_1.expect)(page.getByText("Settings active")).toBeVisible();
|
|
279
|
+
}));
|
|
280
|
+
});
|
|
281
|
+
// =============================================================================
|
|
282
|
+
// FILLER ELEMENT TESTS
|
|
283
|
+
// =============================================================================
|
|
284
|
+
fixtures_1.test.describe("filler element", () => {
|
|
285
|
+
(0, fixtures_1.test)("filler is hidden when distributeEvenly is true", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
286
|
+
yield initTestBed(`
|
|
287
|
+
<Tabs distributeEvenly>
|
|
288
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
289
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
290
|
+
</Tabs>
|
|
291
|
+
`);
|
|
292
|
+
const filler = page.locator('.filler');
|
|
293
|
+
yield (0, fixtures_1.expect)(filler).not.toBeVisible();
|
|
294
|
+
}));
|
|
295
|
+
(0, fixtures_1.test)("filler is hidden when headerRenderer is used", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
296
|
+
yield initTestBed(`
|
|
297
|
+
<Tabs headerRenderer="{(item) => item.label}">
|
|
298
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
299
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
300
|
+
</Tabs>
|
|
301
|
+
`);
|
|
302
|
+
const filler = page.locator('.filler');
|
|
303
|
+
yield (0, fixtures_1.expect)(filler).not.toBeVisible();
|
|
304
|
+
}));
|
|
305
|
+
});
|
|
306
|
+
// =============================================================================
|
|
307
|
+
// EDGE CASES AND ERROR HANDLING
|
|
308
|
+
// =============================================================================
|
|
309
|
+
fixtures_1.test.describe("edge cases", () => {
|
|
310
|
+
(0, fixtures_1.test)("handles empty tabs", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
311
|
+
yield initTestBed(`<Tabs></Tabs>`);
|
|
312
|
+
// Check that empty tabs component is rendered
|
|
313
|
+
yield (0, fixtures_1.expect)(page.getByRole('tablist')).toBeAttached();
|
|
314
|
+
}));
|
|
315
|
+
(0, fixtures_1.test)("handles single tab", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
316
|
+
yield initTestBed(`
|
|
317
|
+
<Tabs>
|
|
318
|
+
<TabItem label="Only Tab">Only content</TabItem>
|
|
319
|
+
</Tabs>
|
|
320
|
+
`);
|
|
321
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Only Tab" })).toBeVisible();
|
|
322
|
+
yield (0, fixtures_1.expect)(page.getByText("Only content")).toBeVisible();
|
|
323
|
+
}));
|
|
324
|
+
(0, fixtures_1.test)("handles tabs with empty content", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
325
|
+
yield initTestBed(`
|
|
326
|
+
<Tabs>
|
|
327
|
+
<TabItem label="Empty Tab"></TabItem>
|
|
328
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
329
|
+
</Tabs>
|
|
330
|
+
`);
|
|
331
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Empty Tab" })).toBeVisible();
|
|
332
|
+
yield page.getByRole("tab", { name: "Tab 2" }).click();
|
|
333
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).toBeVisible();
|
|
334
|
+
}));
|
|
335
|
+
(0, fixtures_1.test)("handles very long tab labels", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
336
|
+
const longLabel = "This is a very long tab label that might cause layout issues";
|
|
337
|
+
yield initTestBed(`
|
|
338
|
+
<Tabs>
|
|
339
|
+
<TabItem label="${longLabel}">Content 1</TabItem>
|
|
340
|
+
<TabItem label="Short">Content 2</TabItem>
|
|
341
|
+
</Tabs>
|
|
342
|
+
`);
|
|
343
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: longLabel })).toBeVisible();
|
|
344
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Short" })).toBeVisible();
|
|
345
|
+
}));
|
|
346
|
+
(0, fixtures_1.test)("handles activeTab out of bounds", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
347
|
+
yield initTestBed(`
|
|
348
|
+
<Tabs activeTab="{5}">
|
|
349
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
350
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
351
|
+
</Tabs>
|
|
352
|
+
`);
|
|
353
|
+
// Should default to first tab when activeTab is out of bounds
|
|
354
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
|
|
355
|
+
}));
|
|
356
|
+
});
|
|
357
|
+
// =============================================================================
|
|
358
|
+
// ACCESSIBILITY TESTS
|
|
359
|
+
// =============================================================================
|
|
360
|
+
fixtures_1.test.describe("accessibility", () => {
|
|
361
|
+
(0, fixtures_1.test)("tabs have correct ARIA roles", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
362
|
+
yield initTestBed(`
|
|
363
|
+
<Tabs>
|
|
364
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
365
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
366
|
+
</Tabs>
|
|
367
|
+
`);
|
|
368
|
+
yield (0, fixtures_1.expect)(page.getByRole("tablist")).toBeVisible();
|
|
369
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toBeVisible();
|
|
370
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeVisible();
|
|
371
|
+
yield (0, fixtures_1.expect)(page.getByRole("tabpanel")).toBeVisible();
|
|
372
|
+
}));
|
|
373
|
+
(0, fixtures_1.test)("active tab has correct aria-selected", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
374
|
+
yield initTestBed(`
|
|
375
|
+
<Tabs>
|
|
376
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
377
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
378
|
+
</Tabs>
|
|
379
|
+
`);
|
|
380
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toHaveAttribute("aria-selected", "true");
|
|
381
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toHaveAttribute("aria-selected", "false");
|
|
382
|
+
yield page.getByRole("tab", { name: "Tab 2" }).click();
|
|
383
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toHaveAttribute("aria-selected", "false");
|
|
384
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toHaveAttribute("aria-selected", "true");
|
|
385
|
+
}));
|
|
386
|
+
(0, fixtures_1.test)("keyboard navigation works", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
387
|
+
yield initTestBed(`
|
|
388
|
+
<Tabs>
|
|
389
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
390
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
391
|
+
<TabItem label="Tab 3">Content 3</TabItem>
|
|
392
|
+
</Tabs>
|
|
393
|
+
`);
|
|
394
|
+
// Focus first tab
|
|
395
|
+
yield page.getByRole("tab", { name: "Tab 1" }).focus();
|
|
396
|
+
// Arrow right to second tab
|
|
397
|
+
yield page.keyboard.press("ArrowRight");
|
|
398
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeFocused();
|
|
399
|
+
// Arrow right to third tab
|
|
400
|
+
yield page.keyboard.press("ArrowRight");
|
|
401
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 3" })).toBeFocused();
|
|
402
|
+
// Arrow left back to second tab
|
|
403
|
+
yield page.keyboard.press("ArrowLeft");
|
|
404
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeFocused();
|
|
405
|
+
}));
|
|
406
|
+
// =============================================================================
|
|
407
|
+
fixtures_1.test.describe("API functionality verification", () => {
|
|
408
|
+
(0, fixtures_1.test)("next() method cycles through all tabs correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
409
|
+
yield initTestBed(`
|
|
410
|
+
<Fragment>
|
|
411
|
+
<Tabs id="tabs">
|
|
412
|
+
<TabItem label="Account">
|
|
413
|
+
<Text>Account Content</Text>
|
|
414
|
+
</TabItem>
|
|
415
|
+
<TabItem label="Stream">
|
|
416
|
+
<Text>Stream Content</Text>
|
|
417
|
+
</TabItem>
|
|
418
|
+
<TabItem label="Support">
|
|
419
|
+
<Text>Support Content</Text>
|
|
420
|
+
</TabItem>
|
|
421
|
+
</Tabs>
|
|
422
|
+
<Button onClick="tabs.next()" testId="next-btn">
|
|
423
|
+
Next Tab
|
|
424
|
+
</Button>
|
|
425
|
+
</Fragment>
|
|
426
|
+
`);
|
|
427
|
+
// Initially Account tab should be active (first tab)
|
|
428
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
429
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
430
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
431
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
432
|
+
// Call next() - should move to Stream tab
|
|
433
|
+
yield page.getByTestId("next-btn").click();
|
|
434
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
435
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
436
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
437
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
438
|
+
// Call next() again - should move to Support tab
|
|
439
|
+
yield page.getByTestId("next-btn").click();
|
|
440
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
441
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
442
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
443
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
444
|
+
// Call next() from last tab - should cycle back to Account tab
|
|
445
|
+
yield page.getByTestId("next-btn").click();
|
|
446
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
447
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
448
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
449
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
450
|
+
}));
|
|
451
|
+
(0, fixtures_1.test)("prev() method cycles through all tabs correctly in reverse", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
452
|
+
yield initTestBed(`
|
|
453
|
+
<Fragment>
|
|
454
|
+
<Tabs id="tabs">
|
|
455
|
+
<TabItem label="Account">
|
|
456
|
+
<Text>Account Content</Text>
|
|
457
|
+
</TabItem>
|
|
458
|
+
<TabItem label="Stream">
|
|
459
|
+
<Text>Stream Content</Text>
|
|
460
|
+
</TabItem>
|
|
461
|
+
<TabItem label="Support">
|
|
462
|
+
<Text>Support Content</Text>
|
|
463
|
+
</TabItem>
|
|
464
|
+
</Tabs>
|
|
465
|
+
<Button onClick="tabs.prev()" testId="prev-btn">
|
|
466
|
+
Previous Tab
|
|
467
|
+
</Button>
|
|
468
|
+
</Fragment>
|
|
469
|
+
`);
|
|
470
|
+
// Initially Account tab should be active (first tab)
|
|
471
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
472
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
473
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
474
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
475
|
+
// Call prev() from first tab - should cycle to Support tab (last tab)
|
|
476
|
+
yield page.getByTestId("prev-btn").click();
|
|
477
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
478
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
479
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
480
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
481
|
+
// Call prev() again - should move to Stream tab
|
|
482
|
+
yield page.getByTestId("prev-btn").click();
|
|
483
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
484
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
485
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
486
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
487
|
+
// Call prev() again - should move to Account tab
|
|
488
|
+
yield page.getByTestId("prev-btn").click();
|
|
489
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
490
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
491
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
492
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
493
|
+
}));
|
|
494
|
+
(0, fixtures_1.test)("next() and prev() methods work together for full navigation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
495
|
+
yield initTestBed(`
|
|
496
|
+
<Fragment>
|
|
497
|
+
<Tabs id="tabs">
|
|
498
|
+
<TabItem label="Account">
|
|
499
|
+
<Text>Account Content</Text>
|
|
500
|
+
</TabItem>
|
|
501
|
+
<TabItem label="Stream">
|
|
502
|
+
<Text>Stream Content</Text>
|
|
503
|
+
</TabItem>
|
|
504
|
+
<TabItem label="Support">
|
|
505
|
+
<Text>Support Content</Text>
|
|
506
|
+
</TabItem>
|
|
507
|
+
</Tabs>
|
|
508
|
+
<Button onClick="tabs.next()" testId="next-btn">
|
|
509
|
+
Next Tab
|
|
510
|
+
</Button>
|
|
511
|
+
<Button onClick="tabs.prev()" testId="prev-btn">
|
|
512
|
+
Previous Tab
|
|
513
|
+
</Button>
|
|
514
|
+
</Fragment>
|
|
515
|
+
`);
|
|
516
|
+
// Start at Account tab
|
|
517
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
518
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
519
|
+
// Go forward twice: Account -> Stream -> Support
|
|
520
|
+
yield page.getByTestId("next-btn").click();
|
|
521
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
522
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
523
|
+
yield page.getByTestId("next-btn").click();
|
|
524
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
525
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
526
|
+
// Go back once: Support -> Stream
|
|
527
|
+
yield page.getByTestId("prev-btn").click();
|
|
528
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
529
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
530
|
+
// Go forward to cycle: Stream -> Support -> Account
|
|
531
|
+
yield page.getByTestId("next-btn").click();
|
|
532
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
533
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
534
|
+
yield page.getByTestId("next-btn").click();
|
|
535
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
536
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
537
|
+
}));
|
|
538
|
+
(0, fixtures_1.test)("tabs can be navigated programmatically (simulating next() behavior)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
539
|
+
yield initTestBed(`
|
|
540
|
+
<Tabs>
|
|
541
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
542
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
543
|
+
<TabItem label="Tab 3">Content 3</TabItem>
|
|
544
|
+
</Tabs>
|
|
545
|
+
`);
|
|
546
|
+
// Initially first tab is active
|
|
547
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
|
|
548
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
|
|
549
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
|
|
550
|
+
// Simulate next() - move to second tab
|
|
551
|
+
yield page.getByRole("tab", { name: "Tab 2" }).click();
|
|
552
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
|
|
553
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).toBeVisible();
|
|
554
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
|
|
555
|
+
// Simulate next() - move to third tab
|
|
556
|
+
yield page.getByRole("tab", { name: "Tab 3" }).click();
|
|
557
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
|
|
558
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
|
|
559
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).toBeVisible();
|
|
560
|
+
// Simulate next() - should cycle back to first tab
|
|
561
|
+
yield page.getByRole("tab", { name: "Tab 1" }).click();
|
|
562
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
|
|
563
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
|
|
564
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
|
|
565
|
+
}));
|
|
566
|
+
(0, fixtures_1.test)("tabs can be navigated backwards programmatically (simulating prev() behavior)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
567
|
+
yield initTestBed(`
|
|
568
|
+
<Tabs>
|
|
569
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
570
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
571
|
+
<TabItem label="Tab 3">Content 3</TabItem>
|
|
572
|
+
</Tabs>
|
|
573
|
+
`);
|
|
574
|
+
// Initially first tab is active
|
|
575
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
|
|
576
|
+
// Simulate prev() from first tab - should cycle to last tab
|
|
577
|
+
yield page.getByRole("tab", { name: "Tab 3" }).click();
|
|
578
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
|
|
579
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
|
|
580
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).toBeVisible();
|
|
581
|
+
// Simulate prev() - move to second tab
|
|
582
|
+
yield page.getByRole("tab", { name: "Tab 2" }).click();
|
|
583
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
|
|
584
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).toBeVisible();
|
|
585
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
|
|
586
|
+
// Simulate prev() - move to first tab
|
|
587
|
+
yield page.getByRole("tab", { name: "Tab 1" }).click();
|
|
588
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
|
|
589
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
|
|
590
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
|
|
591
|
+
}));
|
|
592
|
+
(0, fixtures_1.test)("activeTab prop sets initial tab correctly (simulating setActiveTabIndex())", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
593
|
+
yield initTestBed(`
|
|
594
|
+
<Tabs activeTab="{2}">
|
|
595
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
596
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
597
|
+
<TabItem label="Tab 3">Content 3</TabItem>
|
|
598
|
+
</Tabs>
|
|
599
|
+
`);
|
|
600
|
+
// Third tab should be active initially (index 2)
|
|
601
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 3")).toBeVisible();
|
|
602
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
|
|
603
|
+
yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
|
|
604
|
+
}));
|
|
605
|
+
(0, fixtures_1.test)("ArrowRight key cycles through all tabs correctly (keyboard navigation)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
606
|
+
yield initTestBed(`
|
|
607
|
+
<Tabs>
|
|
608
|
+
<TabItem label="Account">
|
|
609
|
+
<Text>Account Content</Text>
|
|
610
|
+
</TabItem>
|
|
611
|
+
<TabItem label="Stream">
|
|
612
|
+
<Text>Stream Content</Text>
|
|
613
|
+
</TabItem>
|
|
614
|
+
<TabItem label="Support">
|
|
615
|
+
<Text>Support Content</Text>
|
|
616
|
+
</TabItem>
|
|
617
|
+
</Tabs>
|
|
618
|
+
`);
|
|
619
|
+
// Initially Account tab should be active and focused
|
|
620
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
621
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
622
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
623
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
624
|
+
// Focus the first tab
|
|
625
|
+
yield page.getByRole("tab", { name: "Account" }).focus();
|
|
626
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
|
|
627
|
+
// Press ArrowRight - should move to Stream tab
|
|
628
|
+
yield page.keyboard.press("ArrowRight");
|
|
629
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
630
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
631
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
632
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
633
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
|
|
634
|
+
// Press ArrowRight again - should move to Support tab
|
|
635
|
+
yield page.keyboard.press("ArrowRight");
|
|
636
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
637
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
638
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
639
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
640
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
|
|
641
|
+
// Press ArrowRight from last tab - should cycle back to Account tab
|
|
642
|
+
yield page.keyboard.press("ArrowRight");
|
|
643
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
644
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
645
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
646
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
647
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
|
|
648
|
+
}));
|
|
649
|
+
(0, fixtures_1.test)("ArrowLeft key cycles through all tabs correctly in reverse (keyboard navigation)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
650
|
+
yield initTestBed(`
|
|
651
|
+
<Tabs>
|
|
652
|
+
<TabItem label="Account">
|
|
653
|
+
<Text>Account Content</Text>
|
|
654
|
+
</TabItem>
|
|
655
|
+
<TabItem label="Stream">
|
|
656
|
+
<Text>Stream Content</Text>
|
|
657
|
+
</TabItem>
|
|
658
|
+
<TabItem label="Support">
|
|
659
|
+
<Text>Support Content</Text>
|
|
660
|
+
</TabItem>
|
|
661
|
+
</Tabs>
|
|
662
|
+
`);
|
|
663
|
+
// Initially Account tab should be active
|
|
664
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
665
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
666
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
667
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
668
|
+
// Focus the first tab
|
|
669
|
+
yield page.getByRole("tab", { name: "Account" }).focus();
|
|
670
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
|
|
671
|
+
// Press ArrowLeft from first tab - should cycle to Support tab (last tab)
|
|
672
|
+
yield page.keyboard.press("ArrowLeft");
|
|
673
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
674
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
675
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
676
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
677
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
|
|
678
|
+
// Press ArrowLeft again - should move to Stream tab
|
|
679
|
+
yield page.keyboard.press("ArrowLeft");
|
|
680
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
|
|
681
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
682
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
683
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
684
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
|
|
685
|
+
// Press ArrowLeft again - should move to Account tab
|
|
686
|
+
yield page.keyboard.press("ArrowLeft");
|
|
687
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
688
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
|
|
689
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
|
|
690
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
691
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
|
|
692
|
+
}));
|
|
693
|
+
(0, fixtures_1.test)("ArrowRight and ArrowLeft keys work together for full keyboard navigation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
694
|
+
yield initTestBed(`
|
|
695
|
+
<Tabs>
|
|
696
|
+
<TabItem label="Account">
|
|
697
|
+
<Text>Account Content</Text>
|
|
698
|
+
</TabItem>
|
|
699
|
+
<TabItem label="Stream">
|
|
700
|
+
<Text>Stream Content</Text>
|
|
701
|
+
</TabItem>
|
|
702
|
+
<TabItem label="Support">
|
|
703
|
+
<Text>Support Content</Text>
|
|
704
|
+
</TabItem>
|
|
705
|
+
</Tabs>
|
|
706
|
+
`);
|
|
707
|
+
// Start at Account tab and focus it
|
|
708
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
709
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
710
|
+
yield page.getByRole("tab", { name: "Account" }).focus();
|
|
711
|
+
// Go forward twice: Account -> Stream -> Support
|
|
712
|
+
yield page.keyboard.press("ArrowRight");
|
|
713
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
714
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
715
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
|
|
716
|
+
yield page.keyboard.press("ArrowRight");
|
|
717
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
718
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
719
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
|
|
720
|
+
// Go back once: Support -> Stream
|
|
721
|
+
yield page.keyboard.press("ArrowLeft");
|
|
722
|
+
yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
|
|
723
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
|
|
724
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
|
|
725
|
+
// Go forward to cycle: Stream -> Support -> Account
|
|
726
|
+
yield page.keyboard.press("ArrowRight");
|
|
727
|
+
yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
|
|
728
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
|
|
729
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
|
|
730
|
+
yield page.keyboard.press("ArrowRight");
|
|
731
|
+
yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
|
|
732
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
|
|
733
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
|
|
734
|
+
}));
|
|
735
|
+
(0, fixtures_1.test)("API methods work with headerTemplate (visual verification)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
736
|
+
yield initTestBed(`
|
|
737
|
+
<Fragment>
|
|
738
|
+
<Tabs id="tabs">
|
|
739
|
+
<property name="headerTemplate">
|
|
740
|
+
<Text>{$header.isActive ? 'Active: ' : ''}{$header.label}</Text>
|
|
741
|
+
</property>
|
|
742
|
+
<TabItem label="Tab 1">Content 1</TabItem>
|
|
743
|
+
<TabItem label="Tab 2">Content 2</TabItem>
|
|
744
|
+
<TabItem label="Tab 3">Content 3</TabItem>
|
|
745
|
+
</Tabs>
|
|
746
|
+
<Button onClick="tabs.prev()">Prev</Button>
|
|
747
|
+
<Button onClick="tabs.next()">Next</Button>
|
|
748
|
+
</Fragment>
|
|
749
|
+
`);
|
|
750
|
+
// Initially first tab is active
|
|
751
|
+
yield (0, fixtures_1.expect)(page.getByText("Active: Tab 1")).toBeVisible();
|
|
752
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 2")).toBeVisible();
|
|
753
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 3")).toBeVisible();
|
|
754
|
+
// Simulate next() behavior by clicking second tab
|
|
755
|
+
yield page.getByRole("button", { name: "Next" }).click();
|
|
756
|
+
yield (0, fixtures_1.expect)(page.getByText("Active: Tab 2")).toBeVisible();
|
|
757
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 1")).toBeVisible();
|
|
758
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 3")).toBeVisible();
|
|
759
|
+
// Simulate prev() behavior by clicking first tab
|
|
760
|
+
yield page.getByRole("button", { name: "Prev" }).click();
|
|
761
|
+
yield (0, fixtures_1.expect)(page.getByText("Active: Tab 1")).toBeVisible();
|
|
762
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 2")).toBeVisible();
|
|
763
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab 3")).toBeVisible();
|
|
764
|
+
}));
|
|
765
|
+
});
|
|
766
|
+
});
|
|
767
|
+
// =============================================================================
|
|
768
|
+
// DYNAMIC CONTENT TESTS
|
|
769
|
+
// =============================================================================
|
|
770
|
+
fixtures_1.test.describe("dynamic content", () => {
|
|
771
|
+
(0, fixtures_1.test)("works with Items component for dynamic tabs", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
772
|
+
yield initTestBed(`
|
|
773
|
+
<Tabs>
|
|
774
|
+
<Items data="{['First', 'Second', 'Third']}">
|
|
775
|
+
<TabItem label="{$item}">Content for {$item}</TabItem>
|
|
776
|
+
</Items>
|
|
777
|
+
</Tabs>
|
|
778
|
+
`);
|
|
779
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "First" })).toBeVisible();
|
|
780
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Second" })).toBeVisible();
|
|
781
|
+
yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Third" })).toBeVisible();
|
|
782
|
+
yield page.getByRole("tab", { name: "Second" }).click();
|
|
783
|
+
yield (0, fixtures_1.expect)(page.getByText("Content for Second")).toBeVisible();
|
|
784
|
+
}));
|
|
785
|
+
(0, fixtures_1.test)("headerTemplate works with dynamic content from Items", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
786
|
+
yield initTestBed(`
|
|
787
|
+
<Tabs>
|
|
788
|
+
<property name="headerTemplate">
|
|
789
|
+
<Text color="red">Account {$header.label}</Text>
|
|
790
|
+
</property>
|
|
791
|
+
<Items data="{[1, 2, 3, 4, 5]}">
|
|
792
|
+
<TabItem label="Account {$item}">
|
|
793
|
+
<property name="headerTemplate">
|
|
794
|
+
<Text when="true" color="blue">{$header.label} | {$item}</Text>
|
|
795
|
+
</property>
|
|
796
|
+
Content for account {$item}
|
|
797
|
+
</TabItem>
|
|
798
|
+
</Items>
|
|
799
|
+
</Tabs>
|
|
800
|
+
`);
|
|
801
|
+
// Check that individual headerTemplate takes priority and has access to both $header and $item
|
|
802
|
+
yield (0, fixtures_1.expect)(page.getByText("Account 1 | 1")).toBeVisible();
|
|
803
|
+
yield (0, fixtures_1.expect)(page.getByText("Account 2 | 2")).toBeVisible();
|
|
804
|
+
yield (0, fixtures_1.expect)(page.getByText("Account 3 | 3")).toBeVisible();
|
|
805
|
+
yield (0, fixtures_1.expect)(page.getByText("Account 4 | 4")).toBeVisible();
|
|
806
|
+
yield (0, fixtures_1.expect)(page.getByText("Account 5 | 5")).toBeVisible();
|
|
807
|
+
// Test clicking on different tabs
|
|
808
|
+
yield page.getByText("Account 3 | 3").click();
|
|
809
|
+
yield (0, fixtures_1.expect)(page.getByText("Content for account 3")).toBeVisible();
|
|
810
|
+
}));
|
|
811
|
+
});
|
|
812
|
+
fixtures_1.test.describe("onDidChange callback functionality", () => {
|
|
813
|
+
(0, fixtures_1.test)("onDidChange callback is called when tab changes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
814
|
+
yield initTestBed(`
|
|
815
|
+
<Fragment var.tabChangeInfo="No change yet">
|
|
816
|
+
<Tabs onDidChange="(index, id, label) => {
|
|
817
|
+
tabChangeInfo = 'Tab: ' + index + ' - ' + label;
|
|
818
|
+
}">
|
|
819
|
+
<TabItem label="First Tab">
|
|
820
|
+
<Text>First tab content</Text>
|
|
821
|
+
</TabItem>
|
|
822
|
+
<TabItem label="Second Tab">
|
|
823
|
+
<Text>Second tab content</Text>
|
|
824
|
+
</TabItem>
|
|
825
|
+
<TabItem label="Third Tab">
|
|
826
|
+
<Text>Third tab content</Text>
|
|
827
|
+
</TabItem>
|
|
828
|
+
</Tabs>
|
|
829
|
+
<Text>{tabChangeInfo}</Text>
|
|
830
|
+
</Fragment>
|
|
831
|
+
`);
|
|
832
|
+
// Initially should show no change
|
|
833
|
+
yield (0, fixtures_1.expect)(page.getByText("No change yet")).toBeVisible();
|
|
834
|
+
yield (0, fixtures_1.expect)(page.getByText("First tab content")).toBeVisible();
|
|
835
|
+
// Click on second tab
|
|
836
|
+
yield page.getByRole("tab", { name: "Second Tab" }).click();
|
|
837
|
+
yield (0, fixtures_1.expect)(page.getByText("Second tab content")).toBeVisible();
|
|
838
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab: 1 - Second Tab")).toBeVisible();
|
|
839
|
+
// Click on third tab
|
|
840
|
+
yield page.getByRole("tab", { name: "Third Tab" }).click();
|
|
841
|
+
yield (0, fixtures_1.expect)(page.getByText("Third tab content")).toBeVisible();
|
|
842
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab: 2 - Third Tab")).toBeVisible();
|
|
843
|
+
// Click back to first tab
|
|
844
|
+
yield page.getByRole("tab", { name: "First Tab" }).click();
|
|
845
|
+
yield (0, fixtures_1.expect)(page.getByText("First tab content")).toBeVisible();
|
|
846
|
+
yield (0, fixtures_1.expect)(page.getByText("Tab: 0 - First Tab")).toBeVisible();
|
|
847
|
+
}));
|
|
848
|
+
(0, fixtures_1.test)("onDidChange callback is not called when same tab is clicked", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
|
|
849
|
+
yield initTestBed(`
|
|
850
|
+
<Fragment var.changeCount="{0}">
|
|
851
|
+
<Tabs onDidChange="(index, id, label) => {
|
|
852
|
+
changeCount = changeCount + 1;
|
|
853
|
+
}">
|
|
854
|
+
<TabItem label="Tab One">
|
|
855
|
+
<Text>Content one</Text>
|
|
856
|
+
</TabItem>
|
|
857
|
+
<TabItem label="Tab Two">
|
|
858
|
+
<Text>Content two</Text>
|
|
859
|
+
</TabItem>
|
|
860
|
+
</Tabs>
|
|
861
|
+
<Text>Changes: {changeCount}</Text>
|
|
862
|
+
</Fragment>
|
|
863
|
+
`);
|
|
864
|
+
// Initially should show 0 changes
|
|
865
|
+
yield (0, fixtures_1.expect)(page.getByText("Changes: 0")).toBeVisible();
|
|
866
|
+
yield (0, fixtures_1.expect)(page.getByText("Content one")).toBeVisible();
|
|
867
|
+
// Click on second tab - should trigger onDidChange
|
|
868
|
+
yield page.getByRole("tab", { name: "Tab Two" }).click();
|
|
869
|
+
yield (0, fixtures_1.expect)(page.getByText("Content two")).toBeVisible();
|
|
870
|
+
yield (0, fixtures_1.expect)(page.getByText("Changes: 1")).toBeVisible();
|
|
871
|
+
// Click on second tab again - should NOT trigger onDidChange
|
|
872
|
+
yield page.getByRole("tab", { name: "Tab Two" }).click();
|
|
873
|
+
yield (0, fixtures_1.expect)(page.getByText("Changes: 1")).toBeVisible(); // Should still be 1
|
|
874
|
+
}));
|
|
875
|
+
});
|