@skyux/tabs 15.0.0-alpha.5 → 15.0.0-alpha.6
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.
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { By } from '@angular/platform-browser';
|
|
2
|
-
import { SkyAppTestUtility } from '@skyux
|
|
3
|
-
import { SkyQueryableComponentHarness, SkyComponentHarness } from '@skyux/core/testing';
|
|
2
|
+
import { SkyAppTestUtility, SkyQueryableComponentHarness, SkyComponentHarness } from '@skyux/core/testing';
|
|
4
3
|
import { HarnessPredicate, ComponentHarness } from '@angular/cdk/testing';
|
|
5
4
|
import { SkyDropdownHarness } from '@skyux/popovers/testing';
|
|
6
5
|
|
|
@@ -820,6 +819,7 @@ class SkyVerticalTabsetHarness extends SkyComponentHarness {
|
|
|
820
819
|
*/
|
|
821
820
|
static { this.hostSelector = 'sky-vertical-tabset'; }
|
|
822
821
|
#showTabsButton = this.locatorForOptional('.sky-vertical-tabset-content > button.sky-vertical-tabset-show-tabs-btn');
|
|
822
|
+
#tabsContainer = this.locatorFor('.sky-vertical-tabset-group-container');
|
|
823
823
|
/**
|
|
824
824
|
* Gets a `HarnessPredicate` that can be used to search for a
|
|
825
825
|
* `SkyVerticalTabsetHarness` that meets certain criteria.
|
|
@@ -911,6 +911,16 @@ class SkyVerticalTabsetHarness extends SkyComponentHarness {
|
|
|
911
911
|
}
|
|
912
912
|
return undefined;
|
|
913
913
|
}
|
|
914
|
+
/**
|
|
915
|
+
* Gets the tab width as a CSS `flex-basis` value (for example, `200px`),
|
|
916
|
+
* or `null` when no width is set. The width is only applied in the desktop
|
|
917
|
+
* layout, so this returns `null` in the mobile layout.
|
|
918
|
+
*/
|
|
919
|
+
async getTabWidth() {
|
|
920
|
+
const styleAttribute = await (await this.#tabsContainer()).getAttribute('style');
|
|
921
|
+
const styleMatch = styleAttribute?.match(/flex-basis:\s*([^;]+)/i);
|
|
922
|
+
return styleMatch?.[1]?.trim() ?? null;
|
|
923
|
+
}
|
|
914
924
|
/**
|
|
915
925
|
* Gets a specific vertical tab button based on the filter criteria.
|
|
916
926
|
* @param filters The filter criteria.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skyux-tabs-testing.mjs","sources":["../../../../../libs/components/tabs/testing/src/legacy/tabs/tabset-fixture.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tab-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-section-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tab-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-section-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tab-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tab-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tabset-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tabset-nav-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tabset-group-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tabset-harness.ts","../../../../../libs/components/tabs/testing/src/skyux-tabs-testing.ts"],"sourcesContent":["import { DebugElement } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { By } from '@angular/platform-browser';\nimport { SkyAppTestUtility } from '@skyux-sdk/testing';\n\nimport { SkyTabsetFixtureTab } from './tab-fixture-tab';\n\n/**\n * Allows interaction with a SKY UX tabset component.\n * @deprecated Use `SkyTabsetHarness` instead.\n * @internal\n */\nexport class SkyTabsetFixture {\n /**\n * The tabset component's ARIA label.\n */\n public get ariaLabel(): string | undefined {\n const tabsetEl = this.#getTabsetEl();\n return tabsetEl.getAttribute('aria-label') || undefined;\n }\n\n /**\n * The tabset component's ARIA labelled by attribute.\n */\n public get ariaLabelledBy(): string | undefined {\n const tabsetEl = this.#getTabsetEl();\n return tabsetEl.getAttribute('aria-labelledby') || undefined;\n }\n\n /**\n * The index of the currently selected tab.\n */\n public get activeTabIndex(): number {\n const tabLinkEls = this.#getTabLinkEls();\n\n for (let i = 0, n = tabLinkEls.length; i < n; i++) {\n if (tabLinkEls.item(i).classList.contains('sky-btn-tab-selected')) {\n return i;\n }\n }\n\n /* safety check */\n /* istanbul ignore next */\n return -1;\n }\n\n #debugEl: DebugElement;\n #fixture: ComponentFixture<unknown>;\n\n constructor(fixture: ComponentFixture<unknown>, skyTestId: string) {\n this.#fixture = fixture;\n this.#debugEl = SkyAppTestUtility.getDebugElementByTestId(\n fixture,\n skyTestId,\n 'sky-tabset',\n );\n }\n\n /**\n * Retrieves information about the tab at the specified index.\n * @param tabIndex The index of the tab.\n */\n public getTab(tabIndex: number): SkyTabsetFixtureTab {\n const tabLinkEl = this.#getTabLinkEl(tabIndex);\n\n const active = this.activeTabIndex === tabIndex;\n const disabled = tabLinkEl.classList.contains('sky-btn-tab-disabled');\n const tabHeading = this.#getTextContent(\n tabLinkEl.querySelector('.sky-tab-heading span')?.childNodes[0],\n );\n const tabHeaderCount = this.#getTextContent(\n tabLinkEl.querySelector('.sky-tab-header-count'),\n );\n\n let permalinkValue: string | undefined;\n\n if (tabLinkEl.href) {\n const permalink = tabLinkEl.href.split('?')[1];\n if (permalink) {\n const permalinkParts = permalink.split('=');\n\n permalinkValue = decodeURIComponent(permalinkParts[1]);\n }\n }\n\n return {\n active,\n disabled,\n permalinkValue,\n tabHeaderCount,\n tabHeading,\n };\n }\n\n /**\n * Clicks the tabset's \"new\" button.\n */\n public async clickNewButton(): Promise<void> {\n await this.#clickButton('sky-tabset-btn-new');\n }\n\n /**\n * Clicks the tabset's \"open\" button.\n */\n public async clickOpenButton(): Promise<void> {\n await this.#clickButton('sky-tabset-btn-open');\n }\n\n /**\n * Clicks the tab button at the specified index.\n * @param tabIndex The index of the tab.\n */\n public async clickTab(tabIndex: number): Promise<void> {\n const tabLinkEl = this.#getTabLinkEl(tabIndex);\n\n tabLinkEl.click();\n\n this.#fixture.detectChanges();\n await this.#fixture.whenStable();\n }\n\n /**\n * Click's the tab's close button at the specified index.\n * @param tabIndex The index of the tab.\n */\n public async clickTabClose(tabIndex: number): Promise<void> {\n const tabWrapperEl = this.#getTabsetEl().querySelectorAll(\n `.sky-tabset-tabs .sky-btn-tab-wrapper`,\n )[tabIndex];\n\n const closeBtnEl = tabWrapperEl.querySelector(\n '.sky-btn-tab-close',\n ) as HTMLButtonElement;\n\n if (!closeBtnEl) {\n throw new Error('The specified tab does not have a close button.');\n }\n\n closeBtnEl.click();\n\n this.#fixture.detectChanges();\n await this.#fixture.whenStable();\n }\n\n async #clickButton(buttonCls: string): Promise<void> {\n const tabsetEl = this.#getTabsetEl();\n\n const newButtonEl = tabsetEl.querySelector(\n `.sky-tabset-btns .${buttonCls}`,\n ) as HTMLButtonElement;\n\n newButtonEl.click();\n\n this.#fixture.detectChanges();\n await this.#fixture.whenStable();\n }\n\n #getTabsetEl(): HTMLDivElement {\n const tabsetEl = this.#debugEl.query(By.css('.sky-tabset')).nativeElement;\n\n return tabsetEl;\n }\n\n #getTabLinkEls(): NodeListOf<HTMLAnchorElement> {\n return this.#getTabsetEl().querySelectorAll(\n `.sky-tabset-tabs .sky-btn-tab`,\n );\n }\n\n #getTabLinkEl(tabIndex: number): HTMLAnchorElement {\n const tabLinkEl = this.#getTabLinkEls().item(tabIndex);\n\n if (!tabLinkEl) {\n throw new Error(`There is no tab at index ${tabIndex}.`);\n }\n\n return tabLinkEl;\n }\n\n #getTextContent(el: Element | Node | undefined | null): string | undefined {\n return (el && el.textContent?.trim()) || undefined;\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabContentHarnessFilters } from './vertical-tab-content-harness-filters';\n\n/**\n * Harness for interacting with a vertical tab content in tests.\n */\nexport class SkyVerticalTabContentHarness extends SkyQueryableComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = '.sky-vertical-tab-content-pane';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabContentHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabContentHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabContentHarness> {\n return SkyVerticalTabContentHarness.getDataSkyIdPredicate(\n filters,\n ).addOption('tabId', filters.tabId, async (harness, tabId) => {\n const harnessId = await harness.getTabId();\n return await HarnessPredicate.stringMatches(harnessId, tabId);\n });\n }\n\n /**\n * Gets the tab content's id.\n * @internal\n */\n public async getTabId(): Promise<string | null> {\n return await (await this.host()).getAttribute('id');\n }\n\n /**\n * Whether the tab content is visible.\n */\n public async isVisible(): Promise<boolean> {\n return !(await (await this.host()).hasClass('sky-vertical-tab-hidden'));\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyVerticalTabContentHarness } from '../vertical-tabset/vertical-tab-content-harness';\n\nimport { SkySectionedFormSectionContentHarnessFilters } from './sectioned-form-section-content-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form content in tests.\n */\nexport class SkySectionedFormSectionContentHarness extends SkyVerticalTabContentHarness {\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkySectionedFormSectionContentHarness` that meets certain criteria.\n */\n public static override with(\n filters: SkySectionedFormSectionContentHarnessFilters,\n ): HarnessPredicate<SkySectionedFormSectionContentHarness> {\n return super.with(\n filters,\n ) as HarnessPredicate<SkySectionedFormSectionContentHarness>;\n }\n\n /**\n * Whether the section content is visible.\n */\n public override async isVisible(): Promise<boolean> {\n return await super.isVisible();\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabContentHarness } from './vertical-tab-content-harness';\n\n/**\n * Harness for interacting with a vertical tab button in tests.\n */\nexport class SkyVerticalTabButtonHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-vertical-tab';\n\n #tabButton = this.locatorFor('a.sky-vertical-tab');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabButtonHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabButtonHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabButtonHarness> {\n return new HarnessPredicate(SkyVerticalTabButtonHarness, filters).addOption(\n 'tabHeading',\n filters.tabHeading,\n async (harness, heading) => {\n const tabHeading = await harness.getTabHeading();\n return tabHeading === heading;\n },\n );\n }\n\n /**\n * Clicks the tab button to activate the tab.\n */\n public async click(): Promise<void> {\n return await (await this.#tabButton()).click();\n }\n\n /**\n * Gets the `SkyVerticalTabContentHarness` for this tab.\n */\n public async getTabContent(): Promise<SkyVerticalTabContentHarness> {\n return await this.documentRootLocatorFactory().locatorFor(\n SkyVerticalTabContentHarness.with({ tabId: await this.getTabId() }),\n )();\n }\n\n /**\n * Gets the tab header count.\n */\n public async getTabHeaderCount(): Promise<number> {\n const value = (\n await (await this.locatorFor('.sky-vertical-tab-count')()).text()\n ).trim();\n\n // get value between parentheses\n const rx = /\\(([^)]+)\\)/;\n\n return Number(value.match(rx)?.[1]);\n }\n\n /**\n * Gets the tab heading text.\n */\n public async getTabHeading(): Promise<string> {\n return (\n await (await this.locatorFor('.sky-vertical-tab-heading-value')()).text()\n ).trim();\n }\n\n /**\n * Gets the id of the content controlled by this tab.\n * @internal\n */\n public async getTabId(): Promise<string> {\n return (\n (await (await this.#tabButton()).getAttribute('aria-controls')) ||\n /* istanbul ignore next */\n ''\n );\n }\n\n /**\n * Whether the tab is active.\n */\n public async isActive(): Promise<boolean> {\n return await (await this.#tabButton()).hasClass('sky-vertical-tab-active');\n }\n\n /**\n * Whether the tab is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return await (\n await this.#tabButton()\n ).hasClass('sky-vertical-tabset-button-disabled');\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyVerticalTabButtonHarness } from '../vertical-tabset/vertical-tab-button-harness';\nimport { SkyVerticalTabContentHarness } from '../vertical-tabset/vertical-tab-content-harness';\n\nimport { SkySectionedFormSectionContentHarness } from './sectioned-form-section-content-harness';\nimport { SkySectionedFormSectionHarnessFilters } from './sectioned-form-section-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form section component in tests.\n */\nexport class SkySectionedFormSectionHarness extends SkyVerticalTabButtonHarness {\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkySectionedFormSectionHarness` that meets certain criteria.\n */\n public static override with(\n filters: SkySectionedFormSectionHarnessFilters,\n ): HarnessPredicate<SkySectionedFormSectionHarness> {\n return SkySectionedFormSectionHarness.getDataSkyIdPredicate(\n filters,\n ).addOption(\n 'sectionHeading',\n filters.sectionHeading,\n async (harness, heading) => {\n const sectionHeading = await harness.getSectionHeading();\n return sectionHeading === heading;\n },\n );\n }\n\n /**\n * Clicks the section to activate.\n */\n public override async click(): Promise<void> {\n await super.click();\n }\n\n /**\n * Gets the `SkySectionedFormSectionContentHarness` for this section.\n */\n public async getSectionContent(): Promise<SkySectionedFormSectionContentHarness> {\n return await this.documentRootLocatorFactory().locatorFor(\n SkySectionedFormSectionContentHarness.with({\n tabId: await this.getTabId(),\n }),\n )();\n }\n\n /**\n * Gets the section heading.\n */\n public async getSectionHeading(): Promise<string> {\n return await this.getTabHeading();\n }\n\n /**\n * Gets the section item count.\n */\n public async getSectionItemCount(): Promise<number> {\n return await this.getTabHeaderCount();\n }\n\n /**\n * Gets the harness for this tab.\n * Replacing with getSectionContent.\n * @internal\n */\n /* istanbul ignore next */\n public override async getTabContent(): Promise<SkyVerticalTabContentHarness> {\n return await super.getTabContent();\n }\n\n /**\n * Gets the tab header count.\n * Replacing with getSectionItemCount.\n * @internal\n */\n public override async getTabHeaderCount(): Promise<number> {\n return await super.getTabHeaderCount();\n }\n\n /**\n * Gets the tab heading text.\n * Replacing with getSectionHeading.\n * @internal\n */\n public override async getTabHeading(): Promise<string> {\n return await super.getTabHeading();\n }\n\n /**\n * Whether the section is active.\n */\n public override async isActive(): Promise<boolean> {\n return await super.isActive();\n }\n\n /**\n * Whether the section is disabled.\n * This isn't used on sectioned forms.\n * @internal\n */\n /* istanbul ignore next */\n public override async isDisabled(): Promise<boolean> {\n return await super.isDisabled();\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkySectionedFormHarnessFilters } from './sectioned-form-harness-filters';\nimport { SkySectionedFormSectionContentHarness } from './sectioned-form-section-content-harness';\nimport { SkySectionedFormSectionHarness } from './sectioned-form-section-harness';\nimport { SkySectionedFormSectionHarnessFilters } from './sectioned-form-section-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form component in tests.\n */\nexport class SkySectionedFormHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-sectioned-form';\n\n #getTabs = this.locatorForOptional('div.sky-sectioned-form-tabs');\n #getContent = this.locatorForOptional('div.sky-sectioned-form-content');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkySectionedFormHarness` that meets certain criteria.\n */\n public static with(\n filters: SkySectionedFormHarnessFilters,\n ): HarnessPredicate<SkySectionedFormHarness> {\n return SkySectionedFormHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Gets the `SkySectionedFormSectionHarness` for the currently active section.\n */\n public async getActiveSection(): Promise<\n SkySectionedFormSectionHarness | undefined\n > {\n const sections = await this.getSections();\n\n if (sections) {\n for (const section of sections) {\n if (await section.isActive()) {\n return section;\n }\n }\n }\n\n return undefined;\n }\n\n public async getActiveSectionContent(): Promise<\n SkySectionedFormSectionContentHarness | undefined\n > {\n if (await this.#getContent()) {\n const contents = await this.locatorForAll(\n SkySectionedFormSectionContentHarness,\n )();\n for (const content of contents) {\n if (await content.isVisible()) {\n return content;\n }\n }\n return undefined;\n }\n\n throw new Error('Unable to find active content because it is not visible.');\n }\n\n /**\n * Gets the tab width as a CSS `flex-basis` value (for example, `200px`),\n * or `null` when no width is set. The width is only applied in the desktop\n * layout, so this returns `null` in the mobile layout and when the tabs\n * pane is not rendered at all.\n */\n public async getTabWidth(): Promise<string | null> {\n const tabs = await this.#getTabs();\n if (!tabs) {\n return null;\n }\n\n const styleAttribute = await tabs.getAttribute('style');\n const styleMatch = styleAttribute?.match(/flex-basis:\\s*([^;]+)/i);\n\n return styleMatch?.[1]?.trim() ?? null;\n }\n\n /**\n * Gets a specific section based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getSection(\n filters: SkySectionedFormSectionHarnessFilters,\n ): Promise<SkySectionedFormSectionHarness> {\n return await this.locatorFor(\n SkySectionedFormSectionHarness.with(filters),\n )();\n }\n\n /**\n * Gets an array of sections based on the filter criteria.\n * If no filter is provided, returns all sections.\n * @param filters The optional filter criteria.\n */\n public async getSections(\n filters?: SkySectionedFormSectionHarnessFilters,\n ): Promise<SkySectionedFormSectionHarness[]> {\n if (!(await this.isSectionsVisible())) {\n throw new Error(\n 'Unable to find any sectioned form sections because they are not visible.',\n );\n }\n return await this.locatorForAll(\n SkySectionedFormSectionHarness.with(filters || {}),\n )();\n }\n\n /**\n * Whether the section tabs are visible.\n * In mobile view, sectioned forms collapse to just content pane.\n */\n public async isSectionsVisible(): Promise<boolean> {\n const tabs = await this.#getTabs();\n\n if (tabs) {\n return !(await tabs.hasClass('sky-sectioned-form-tabs-hidden'));\n }\n return false;\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\n\nimport { SkyTabContentHarnessFilters } from './tab-content-harness-filters';\n\n/**\n * Harness for interacting with a tab component in tests.\n */\nexport class SkyTabContentHarness extends SkyQueryableComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tab';\n\n #getTab = this.locatorFor('.sky-tab');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabContentHarness` that meets certain criteria.\n * @internal\n */\n public static with(\n filters: SkyTabContentHarnessFilters,\n ): HarnessPredicate<SkyTabContentHarness> {\n return new HarnessPredicate(SkyTabContentHarness, filters).addOption(\n 'tabId',\n filters.tabId,\n async (harness, tabId) => {\n const harnessId = await harness.getTabId();\n return await HarnessPredicate.stringMatches(harnessId, tabId);\n },\n );\n }\n\n /**\n * Gets the tab's layout.\n */\n public async getLayout(): Promise<string> {\n return (await (await this.host()).getAttribute('layout')) || 'none';\n }\n\n /**\n * @internal\n */\n public async getTabId(): Promise<string | null> {\n return await (await this.#getTab()).getAttribute('id');\n }\n\n /**\n * Whether the tab content is visible.\n */\n public async isVisible(): Promise<boolean> {\n return !(await (await this.#getTab()).getProperty<boolean>('hidden'));\n }\n}\n","import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyTabButtonHarnessFilters } from './tab-button-harness-filters';\nimport { SkyTabContentHarness } from './tab-content-harness';\n\n/**\n * Harness for interacting with a tab button component in tests.\n */\nexport class SkyTabButtonHarness extends ComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tab-button';\n\n #getTabButton = this.locatorFor('a.sky-btn-tab');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabButtonHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyTabButtonHarnessFilters,\n ): HarnessPredicate<SkyTabButtonHarness> {\n return new HarnessPredicate(SkyTabButtonHarness, filters).addOption(\n 'tabHeading',\n filters.tabHeading,\n async (harness, tabHeading) => {\n const harnessTabHeading = await harness.getTabHeading();\n return await HarnessPredicate.stringMatches(\n harnessTabHeading,\n tabHeading,\n );\n },\n );\n }\n\n /**\n * Clicks the tab button.\n */\n public async click(): Promise<void> {\n return await (await this.#getTabButton()).click();\n }\n\n /**\n * Clicks the remove tab button if it is visible.\n */\n public async clickRemoveButton(): Promise<void> {\n if (await this.isInWizardTabset()) {\n throw new Error('Cannot use remove tab button in a wizard tabset.');\n }\n const button = await this.locatorForOptional('.sky-btn-tab-close')();\n if (!button) {\n throw new Error('Unable to find remove tab button.');\n }\n return await button.click();\n }\n\n /**\n * Gets the permalink that the page routes to when the tab is clicked.\n */\n public async getPermalink(): Promise<string | null> {\n if (await this.isInWizardTabset()) {\n throw new Error(\n 'Cannot get permalink for tab button in a wizard tabset.',\n );\n }\n return await (await this.#getTabButton()).getAttribute('href');\n }\n\n /**\n * Gets the `SkyTabContentHarness` controlled by this tab button.\n */\n public async getTabContentHarness(): Promise<SkyTabContentHarness> {\n return await this.documentRootLocatorFactory().locatorFor(\n SkyTabContentHarness.with({ tabId: await this.getTabId() }),\n )();\n }\n\n /**\n * Gets the tab heading.\n */\n public async getTabHeading(): Promise<string> {\n return (\n // eslint-disable-next-line @cspell/spellchecker\n await (await this.locatorFor('.sky-tab-heading > span[skyid]')()).text()\n );\n }\n\n /**\n * Gets whether the tab button is active.\n */\n public async isActive(): Promise<boolean> {\n return await (await this.#getTabButton()).hasClass('sky-btn-tab-selected');\n }\n\n /**\n * Gets whether the tab button is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return await (await this.#getTabButton()).hasClass('sky-btn-tab-disabled');\n }\n\n /**\n * Whether the tab button is in a Wizard tabset.\n */\n public async isInWizardTabset(): Promise<boolean> {\n return await (await this.#getTabButton()).hasClass('sky-btn-tab-wizard');\n }\n\n /**\n * Gets the id of the content controlled by this tab.\n * @internal\n */\n public async getTabId(): Promise<string> {\n return (\n (await (await this.#getTabButton()).getAttribute('aria-controls')) ||\n /* istanbul ignore next */\n ''\n );\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\nimport {\n SkyDropdownHarness,\n SkyDropdownMenuHarness,\n} from '@skyux/popovers/testing';\nimport { SkyTabsetButtonsDisplayMode } from '@skyux/tabs';\n\nimport { SkyTabButtonHarness } from './tab-button-harness';\nimport { SkyTabButtonHarnessFilters } from './tab-button-harness-filters';\nimport { SkyTabContentHarness } from './tab-content-harness';\nimport { SkyTabsetHarnessFilters } from './tabset-harness-filters';\n\n/**\n * Harness for interacting with a tabset component in tests.\n */\nexport class SkyTabsetHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tabset';\n\n #getTabset = this.locatorFor('.sky-tabset');\n #getTabDropdown = this.locatorFor(SkyDropdownHarness);\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabsetHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyTabsetHarnessFilters,\n ): HarnessPredicate<SkyTabsetHarness> {\n return SkyTabsetHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * In `dropdown` mode, clicks the dropdown tab to open the tab dropdown menu.\n */\n public async clickDropdownTab(): Promise<void> {\n if (!((await this.getMode()) === 'dropdown')) {\n throw new Error(\n 'Cannot click dropdown tab button, tab is not in dropdown mode.',\n );\n }\n const button = await this.locatorFor(SkyDropdownHarness)();\n return await button.clickDropdownButton();\n }\n\n /**\n * Clicks the new tab button if visible.\n */\n public async clickNewTabButton(): Promise<void> {\n if (await this.isWizardTabset()) {\n throw new Error('Cannot use new tab button in a wizard tabset.');\n }\n\n const newTabButton = await this.locatorForOptional(\n 'button.sky-tabset-btn-new',\n )();\n\n if (!newTabButton) {\n throw new Error('Unable to find the new tab button.');\n }\n\n return await newTabButton.click();\n }\n\n /**\n * Clicks the open tab button if visible.\n */\n public async clickOpenTabButton(): Promise<void> {\n if (await this.isWizardTabset()) {\n throw new Error('Cannot use open tab button in a wizard tabset.');\n }\n\n const openTabButton = await this.locatorForOptional(\n 'button.sky-tabset-btn-open',\n )();\n\n if (!openTabButton) {\n throw new Error('Unable to find the open tab button.');\n }\n\n return await openTabButton.click();\n }\n\n /**\n * Clicks a tab button with a `tabHeading` matching the input.\n */\n public async clickTabButton(tabHeading: string): Promise<void> {\n const tabButton = await this.getTabButtonHarness({\n tabHeading: tabHeading,\n });\n return await tabButton.click();\n }\n\n /**\n * Gets the active tab button harness.\n */\n public async getActiveTabButton(): Promise<SkyTabButtonHarness | null> {\n const tabButtonHarnesses = await this.getTabButtonHarnesses();\n\n for (const harness of tabButtonHarnesses) {\n if (await harness.isActive()) {\n return harness;\n }\n }\n\n /* istanbul ignore next */\n return null;\n }\n\n /**\n * Gets the tabset aria-label value.\n */\n public async getAriaLabel(): Promise<string | null> {\n return await (await this.#getTabset()).getAttribute('aria-label');\n }\n\n /**\n * Gets the tabset aria-labelledby value.\n */\n public async getAriaLabelledBy(): Promise<string | null> {\n return await (await this.#getTabset()).getAttribute('aria-labelledby');\n }\n\n /**\n * Gets the tabset's display mode.\n */\n public async getMode(): Promise<SkyTabsetButtonsDisplayMode> {\n if (await (await this.#getTabset()).hasClass('sky-tabset-mode-tabs')) {\n return 'tabs';\n }\n return 'dropdown';\n }\n\n /**\n * Gets a specific tab button based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getTabButtonHarness(\n filters: SkyTabButtonHarnessFilters,\n ): Promise<SkyTabButtonHarness> {\n if ((await this.getMode()) === 'dropdown') {\n const menu = await this.#getDropdownMenu();\n return await menu.queryHarness(SkyTabButtonHarness.with(filters));\n }\n return await this.locatorFor(SkyTabButtonHarness.with(filters))();\n }\n\n /**\n * Gets an array of tab button harnesses based on the filter criteria.\n * If no filter is provided, returns all tab button harnesses.\n * @param filters The optional filter criteria.\n */\n public async getTabButtonHarnesses(\n filters?: SkyTabButtonHarnessFilters,\n ): Promise<SkyTabButtonHarness[]> {\n if ((await this.getMode()) === 'dropdown') {\n const menu = await this.#getDropdownMenu();\n return await menu.queryHarnesses(SkyTabButtonHarness.with(filters || {}));\n } else {\n return await this.locatorForAll(\n SkyTabButtonHarness.with(filters || {}),\n )();\n }\n }\n\n /**\n * Gets a tab content harness for the tab with the given `tabHeading`.\n */\n public async getTabContentHarness(\n tabHeading: string,\n ): Promise<SkyTabContentHarness> {\n const tabButton = await this.getTabButtonHarness({\n tabHeading: tabHeading,\n });\n const id = await tabButton.getTabId();\n return await this.locatorFor(SkyTabContentHarness.with({ tabId: id }))();\n }\n\n /**\n * Whether the tabset is a Wizard component.\n */\n public async isWizardTabset(): Promise<boolean> {\n return (\n (await (await this.host()).getAttribute('data-tab-style')) === 'wizard'\n );\n }\n\n async #getDropdownMenu(): Promise<SkyDropdownMenuHarness> {\n const dropdown = await this.#getTabDropdown();\n if (!(await dropdown?.isOpen())) {\n throw new Error(\n 'Cannot get tab button when tabs is in dropdown mode and is closed.',\n );\n }\n return await dropdown.getDropdownMenu();\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\nimport { SkyTabsetNavButtonType } from '@skyux/tabs';\n\nimport { SkyTabsetNavButtonHarnessFilters } from './tabset-nav-button-harness-filters';\n\n/**\n * Harness to interact with tabset nav buttons in wizard style tabset tests.\n */\nexport class SkyTabsetNavButtonHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tabset-nav-button';\n\n #button = this.locatorFor('button');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabsetNavButtonHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyTabsetNavButtonHarnessFilters,\n ): HarnessPredicate<SkyTabsetNavButtonHarness> {\n return SkyTabsetNavButtonHarness.getDataSkyIdPredicate(filters).addOption(\n 'buttonType',\n filters.buttonType,\n async (harness, buttonType) => {\n const harnessButtonType = await harness.getButtonType();\n return await HarnessPredicate.stringMatches(\n harnessButtonType,\n buttonType,\n );\n },\n );\n }\n\n /**\n * Clicks the button.\n */\n public async click(): Promise<void> {\n return await (await this.#button()).click();\n }\n\n /**\n * Gets the button text.\n */\n public async getButtonText(): Promise<string> {\n return await (await this.#button()).text();\n }\n\n /**\n * Gets the button type.\n */\n public async getButtonType(): Promise<SkyTabsetNavButtonType | null> {\n return (await (\n await this.host()\n ).getAttribute('data-button-type')) as SkyTabsetNavButtonType;\n }\n\n /**\n * Whether the button is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return (await (await this.#button()).getAttribute('disabled')) !== null;\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarness } from './vertical-tab-button-harness';\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabsetGroupHarnessFilters } from './vertical-tabset-group-harness-filters';\n\n/**\n * Harness for interacting with a vertical tabset group in tests.\n */\nexport class SkyVerticalTabsetGroupHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-vertical-tabset-group';\n\n #button = this.locatorFor('button.sky-vertical-tabset-button');\n #header = this.locatorFor('.sky-vertical-tabset-group-header');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabsetGroupHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabsetGroupHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabsetGroupHarness> {\n return new HarnessPredicate(\n SkyVerticalTabsetGroupHarness,\n filters,\n ).addOption(\n 'groupHeading',\n filters.groupHeading,\n async (harness, heading) => {\n return (await harness.getGroupHeading()) === heading;\n },\n );\n }\n\n /**\n * Clicks the group button to toggle its expanded state.\n */\n public async click(): Promise<void> {\n return await (await this.#button()).click();\n }\n\n /**\n * Gets the group heading text.\n */\n public async getGroupHeading(): Promise<string> {\n return (await (await this.#button()).text()).trim();\n }\n\n /**\n * Gets a specific vertical tab based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getVerticalTab(\n filters: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness> {\n return await this.locatorFor(SkyVerticalTabButtonHarness.with(filters))();\n }\n\n /**\n * Gets an array of vertical tab buttons based on the filter criteria.\n * If no filter is provided, returns all vertical tab buttons.\n * @param filters The optional filter criteria.\n */\n public async getVerticalTabs(\n filters?: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness[]> {\n return await this.locatorForAll(\n SkyVerticalTabButtonHarness.with(filters || {}),\n )();\n }\n\n /**\n * Whether a tab under this group is active.\n */\n public async isActive(): Promise<boolean> {\n return await (\n await this.#header()\n ).hasClass('sky-vertical-tabset-group-header-active');\n }\n\n /**\n * Whether the group is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return await (\n await this.#button()\n ).hasClass('sky-vertical-tabset-button-disabled');\n }\n\n /**\n * Whether the group is expanded.\n */\n public async isOpen(): Promise<boolean> {\n return (\n (await (await this.#button()).getAttribute('aria-expanded')) === 'true'\n );\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarness } from './vertical-tab-button-harness';\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabContentHarness } from './vertical-tab-content-harness';\nimport { SkyVerticalTabsetGroupHarness } from './vertical-tabset-group-harness';\nimport { SkyVerticalTabsetGroupHarnessFilters } from './vertical-tabset-group-harness-filters';\nimport { SkyVerticalTabsetHarnessFilters } from './vertical-tabset-harness-filters';\n\n/**\n * Harness for interacting with the vertical tabset component in tests.\n */\nexport class SkyVerticalTabsetHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-vertical-tabset';\n\n #showTabsButton = this.locatorForOptional(\n '.sky-vertical-tabset-content > button.sky-vertical-tabset-show-tabs-btn',\n );\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabsetHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabsetHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabsetHarness> {\n return SkyVerticalTabsetHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Click the show tabs button in mobile view.\n */\n public async clickShowTabsButton(): Promise<void> {\n const showTabsButton = await this.#showTabsButton();\n if (showTabsButton) {\n await showTabsButton.click();\n }\n }\n\n /**\n * Gets the `SkyVerticalTabButtonHarness` of the currently active tab.\n */\n public async getActiveTab(): Promise<\n SkyVerticalTabButtonHarness | undefined\n > {\n const tabs = await this.getTabs();\n if (tabs) {\n for (const tab of tabs) {\n if (await tab.isActive()) {\n return tab;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Gets the `SkyVerticalTabContentHarness` for the currently active tab.\n */\n public async getActiveTabContent(): Promise<\n SkyVerticalTabContentHarness | undefined\n > {\n // in mobile view tabs are not rendered.\n if (!(await this.isTabsVisible())) {\n const contents = await this.locatorForAll(SkyVerticalTabContentHarness)();\n for (const content of contents) {\n if (await content.isVisible()) {\n return content;\n }\n }\n }\n\n const activeTab = await this.getActiveTab();\n if (activeTab) {\n return await activeTab.getTabContent();\n }\n return undefined;\n }\n\n /**\n * Gets the aria-label.\n */\n public async getAriaLabel(): Promise<string | null> {\n return await (\n await this.locatorFor('span.sky-vertical-tabset-tablist')()\n ).getAttribute('aria-label');\n }\n\n /**\n * Gets the aria-labelledby.\n */\n public async getAriaLabelledBy(): Promise<string | null> {\n return await (\n await this.locatorFor('span.sky-vertical-tabset-tablist')()\n ).getAttribute('aria-labelledby');\n }\n\n /**\n * Gets a specific vertical tabset group based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getGroup(\n filters: SkyVerticalTabsetGroupHarnessFilters,\n ): Promise<SkyVerticalTabsetGroupHarness | undefined> {\n return await this.locatorFor(SkyVerticalTabsetGroupHarness.with(filters))();\n }\n\n /**\n * Gets an array of vertical tabset groups based on the filter criteria.\n * If no filter is provided, returns all vertical tabset groups.\n * @param filters The optional filter criteria.\n */\n public async getGroups(\n filters?: SkyVerticalTabsetGroupHarnessFilters,\n ): Promise<SkyVerticalTabsetGroupHarness[]> {\n // open tablist if in mobile view\n if (!(await this.isTabsVisible())) {\n await this.clickShowTabsButton();\n }\n\n return await this.locatorForAll(\n SkyVerticalTabsetGroupHarness.with(filters || {}),\n )();\n }\n\n /**\n * Gets the text in the show tabs button in mobile view.\n */\n public async getShowTabsText(): Promise<string | undefined> {\n const showTabsButton = await this.#showTabsButton();\n\n // check if it is in mobile view\n if (showTabsButton) {\n return (await await showTabsButton.text()).trim();\n }\n\n return undefined;\n }\n\n /**\n * Gets a specific vertical tab button based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getTab(\n filters: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness> {\n return await this.locatorFor(SkyVerticalTabButtonHarness.with(filters))();\n }\n\n /**\n * Gets an array of vertical tab buttons based on the filter criteria.\n * If no filter is provided, returns all vertical tab buttons.\n * @param filters The optional filter criteria.\n */\n public async getTabs(\n filters?: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness[]> {\n // open tablist if in mobile view\n if (!(await this.isTabsVisible())) {\n await this.clickShowTabsButton();\n }\n\n return await this.locatorForAll(\n SkyVerticalTabButtonHarness.with(filters || {}),\n )();\n }\n\n /**\n * Whether the tabs are visible.\n * In mobile view, vertical tabsets collapse to just the content pane\n * with a button to show the tabs.\n */\n public async isTabsVisible(): Promise<boolean> {\n const showTabsButton = await this.#showTabsButton();\n if (showTabsButton) {\n return false;\n }\n return true;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skyux-tabs-testing.mjs","sources":["../../../../../libs/components/tabs/testing/src/legacy/tabs/tabset-fixture.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tab-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-section-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tab-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-section-harness.ts","../../../../../libs/components/tabs/testing/src/modules/sectioned-form/sectioned-form-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tab-content-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tab-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tabset-harness.ts","../../../../../libs/components/tabs/testing/src/modules/tabs/tabset-nav-button-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tabset-group-harness.ts","../../../../../libs/components/tabs/testing/src/modules/vertical-tabset/vertical-tabset-harness.ts","../../../../../libs/components/tabs/testing/src/skyux-tabs-testing.ts"],"sourcesContent":["import { DebugElement } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { By } from '@angular/platform-browser';\nimport { SkyAppTestUtility } from '@skyux/core/testing';\n\nimport { SkyTabsetFixtureTab } from './tab-fixture-tab';\n\n/**\n * Allows interaction with a SKY UX tabset component.\n * @deprecated Use `SkyTabsetHarness` instead.\n * @internal\n */\nexport class SkyTabsetFixture {\n /**\n * The tabset component's ARIA label.\n */\n public get ariaLabel(): string | undefined {\n const tabsetEl = this.#getTabsetEl();\n return tabsetEl.getAttribute('aria-label') || undefined;\n }\n\n /**\n * The tabset component's ARIA labelled by attribute.\n */\n public get ariaLabelledBy(): string | undefined {\n const tabsetEl = this.#getTabsetEl();\n return tabsetEl.getAttribute('aria-labelledby') || undefined;\n }\n\n /**\n * The index of the currently selected tab.\n */\n public get activeTabIndex(): number {\n const tabLinkEls = this.#getTabLinkEls();\n\n for (let i = 0, n = tabLinkEls.length; i < n; i++) {\n if (tabLinkEls.item(i).classList.contains('sky-btn-tab-selected')) {\n return i;\n }\n }\n\n /* safety check */\n /* istanbul ignore next */\n return -1;\n }\n\n #debugEl: DebugElement;\n #fixture: ComponentFixture<unknown>;\n\n constructor(fixture: ComponentFixture<unknown>, skyTestId: string) {\n this.#fixture = fixture;\n this.#debugEl = SkyAppTestUtility.getDebugElementByTestId(\n fixture,\n skyTestId,\n 'sky-tabset',\n );\n }\n\n /**\n * Retrieves information about the tab at the specified index.\n * @param tabIndex The index of the tab.\n */\n public getTab(tabIndex: number): SkyTabsetFixtureTab {\n const tabLinkEl = this.#getTabLinkEl(tabIndex);\n\n const active = this.activeTabIndex === tabIndex;\n const disabled = tabLinkEl.classList.contains('sky-btn-tab-disabled');\n const tabHeading = this.#getTextContent(\n tabLinkEl.querySelector('.sky-tab-heading span')?.childNodes[0],\n );\n const tabHeaderCount = this.#getTextContent(\n tabLinkEl.querySelector('.sky-tab-header-count'),\n );\n\n let permalinkValue: string | undefined;\n\n if (tabLinkEl.href) {\n const permalink = tabLinkEl.href.split('?')[1];\n if (permalink) {\n const permalinkParts = permalink.split('=');\n\n permalinkValue = decodeURIComponent(permalinkParts[1]);\n }\n }\n\n return {\n active,\n disabled,\n permalinkValue,\n tabHeaderCount,\n tabHeading,\n };\n }\n\n /**\n * Clicks the tabset's \"new\" button.\n */\n public async clickNewButton(): Promise<void> {\n await this.#clickButton('sky-tabset-btn-new');\n }\n\n /**\n * Clicks the tabset's \"open\" button.\n */\n public async clickOpenButton(): Promise<void> {\n await this.#clickButton('sky-tabset-btn-open');\n }\n\n /**\n * Clicks the tab button at the specified index.\n * @param tabIndex The index of the tab.\n */\n public async clickTab(tabIndex: number): Promise<void> {\n const tabLinkEl = this.#getTabLinkEl(tabIndex);\n\n tabLinkEl.click();\n\n this.#fixture.detectChanges();\n await this.#fixture.whenStable();\n }\n\n /**\n * Click's the tab's close button at the specified index.\n * @param tabIndex The index of the tab.\n */\n public async clickTabClose(tabIndex: number): Promise<void> {\n const tabWrapperEl = this.#getTabsetEl().querySelectorAll(\n `.sky-tabset-tabs .sky-btn-tab-wrapper`,\n )[tabIndex];\n\n const closeBtnEl = tabWrapperEl.querySelector(\n '.sky-btn-tab-close',\n ) as HTMLButtonElement;\n\n if (!closeBtnEl) {\n throw new Error('The specified tab does not have a close button.');\n }\n\n closeBtnEl.click();\n\n this.#fixture.detectChanges();\n await this.#fixture.whenStable();\n }\n\n async #clickButton(buttonCls: string): Promise<void> {\n const tabsetEl = this.#getTabsetEl();\n\n const newButtonEl = tabsetEl.querySelector(\n `.sky-tabset-btns .${buttonCls}`,\n ) as HTMLButtonElement;\n\n newButtonEl.click();\n\n this.#fixture.detectChanges();\n await this.#fixture.whenStable();\n }\n\n #getTabsetEl(): HTMLDivElement {\n const tabsetEl = this.#debugEl.query(By.css('.sky-tabset')).nativeElement;\n\n return tabsetEl;\n }\n\n #getTabLinkEls(): NodeListOf<HTMLAnchorElement> {\n return this.#getTabsetEl().querySelectorAll(\n `.sky-tabset-tabs .sky-btn-tab`,\n );\n }\n\n #getTabLinkEl(tabIndex: number): HTMLAnchorElement {\n const tabLinkEl = this.#getTabLinkEls().item(tabIndex);\n\n if (!tabLinkEl) {\n throw new Error(`There is no tab at index ${tabIndex}.`);\n }\n\n return tabLinkEl;\n }\n\n #getTextContent(el: Element | Node | undefined | null): string | undefined {\n return (el && el.textContent?.trim()) || undefined;\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabContentHarnessFilters } from './vertical-tab-content-harness-filters';\n\n/**\n * Harness for interacting with a vertical tab content in tests.\n */\nexport class SkyVerticalTabContentHarness extends SkyQueryableComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = '.sky-vertical-tab-content-pane';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabContentHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabContentHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabContentHarness> {\n return SkyVerticalTabContentHarness.getDataSkyIdPredicate(\n filters,\n ).addOption('tabId', filters.tabId, async (harness, tabId) => {\n const harnessId = await harness.getTabId();\n return await HarnessPredicate.stringMatches(harnessId, tabId);\n });\n }\n\n /**\n * Gets the tab content's id.\n * @internal\n */\n public async getTabId(): Promise<string | null> {\n return await (await this.host()).getAttribute('id');\n }\n\n /**\n * Whether the tab content is visible.\n */\n public async isVisible(): Promise<boolean> {\n return !(await (await this.host()).hasClass('sky-vertical-tab-hidden'));\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyVerticalTabContentHarness } from '../vertical-tabset/vertical-tab-content-harness';\n\nimport { SkySectionedFormSectionContentHarnessFilters } from './sectioned-form-section-content-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form content in tests.\n */\nexport class SkySectionedFormSectionContentHarness extends SkyVerticalTabContentHarness {\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkySectionedFormSectionContentHarness` that meets certain criteria.\n */\n public static override with(\n filters: SkySectionedFormSectionContentHarnessFilters,\n ): HarnessPredicate<SkySectionedFormSectionContentHarness> {\n return super.with(\n filters,\n ) as HarnessPredicate<SkySectionedFormSectionContentHarness>;\n }\n\n /**\n * Whether the section content is visible.\n */\n public override async isVisible(): Promise<boolean> {\n return await super.isVisible();\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabContentHarness } from './vertical-tab-content-harness';\n\n/**\n * Harness for interacting with a vertical tab button in tests.\n */\nexport class SkyVerticalTabButtonHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-vertical-tab';\n\n #tabButton = this.locatorFor('a.sky-vertical-tab');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabButtonHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabButtonHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabButtonHarness> {\n return new HarnessPredicate(SkyVerticalTabButtonHarness, filters).addOption(\n 'tabHeading',\n filters.tabHeading,\n async (harness, heading) => {\n const tabHeading = await harness.getTabHeading();\n return tabHeading === heading;\n },\n );\n }\n\n /**\n * Clicks the tab button to activate the tab.\n */\n public async click(): Promise<void> {\n return await (await this.#tabButton()).click();\n }\n\n /**\n * Gets the `SkyVerticalTabContentHarness` for this tab.\n */\n public async getTabContent(): Promise<SkyVerticalTabContentHarness> {\n return await this.documentRootLocatorFactory().locatorFor(\n SkyVerticalTabContentHarness.with({ tabId: await this.getTabId() }),\n )();\n }\n\n /**\n * Gets the tab header count.\n */\n public async getTabHeaderCount(): Promise<number> {\n const value = (\n await (await this.locatorFor('.sky-vertical-tab-count')()).text()\n ).trim();\n\n // get value between parentheses\n const rx = /\\(([^)]+)\\)/;\n\n return Number(value.match(rx)?.[1]);\n }\n\n /**\n * Gets the tab heading text.\n */\n public async getTabHeading(): Promise<string> {\n return (\n await (await this.locatorFor('.sky-vertical-tab-heading-value')()).text()\n ).trim();\n }\n\n /**\n * Gets the id of the content controlled by this tab.\n * @internal\n */\n public async getTabId(): Promise<string> {\n return (\n (await (await this.#tabButton()).getAttribute('aria-controls')) ||\n /* istanbul ignore next */\n ''\n );\n }\n\n /**\n * Whether the tab is active.\n */\n public async isActive(): Promise<boolean> {\n return await (await this.#tabButton()).hasClass('sky-vertical-tab-active');\n }\n\n /**\n * Whether the tab is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return await (\n await this.#tabButton()\n ).hasClass('sky-vertical-tabset-button-disabled');\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyVerticalTabButtonHarness } from '../vertical-tabset/vertical-tab-button-harness';\nimport { SkyVerticalTabContentHarness } from '../vertical-tabset/vertical-tab-content-harness';\n\nimport { SkySectionedFormSectionContentHarness } from './sectioned-form-section-content-harness';\nimport { SkySectionedFormSectionHarnessFilters } from './sectioned-form-section-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form section component in tests.\n */\nexport class SkySectionedFormSectionHarness extends SkyVerticalTabButtonHarness {\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkySectionedFormSectionHarness` that meets certain criteria.\n */\n public static override with(\n filters: SkySectionedFormSectionHarnessFilters,\n ): HarnessPredicate<SkySectionedFormSectionHarness> {\n return SkySectionedFormSectionHarness.getDataSkyIdPredicate(\n filters,\n ).addOption(\n 'sectionHeading',\n filters.sectionHeading,\n async (harness, heading) => {\n const sectionHeading = await harness.getSectionHeading();\n return sectionHeading === heading;\n },\n );\n }\n\n /**\n * Clicks the section to activate.\n */\n public override async click(): Promise<void> {\n await super.click();\n }\n\n /**\n * Gets the `SkySectionedFormSectionContentHarness` for this section.\n */\n public async getSectionContent(): Promise<SkySectionedFormSectionContentHarness> {\n return await this.documentRootLocatorFactory().locatorFor(\n SkySectionedFormSectionContentHarness.with({\n tabId: await this.getTabId(),\n }),\n )();\n }\n\n /**\n * Gets the section heading.\n */\n public async getSectionHeading(): Promise<string> {\n return await this.getTabHeading();\n }\n\n /**\n * Gets the section item count.\n */\n public async getSectionItemCount(): Promise<number> {\n return await this.getTabHeaderCount();\n }\n\n /**\n * Gets the harness for this tab.\n * Replacing with getSectionContent.\n * @internal\n */\n /* istanbul ignore next */\n public override async getTabContent(): Promise<SkyVerticalTabContentHarness> {\n return await super.getTabContent();\n }\n\n /**\n * Gets the tab header count.\n * Replacing with getSectionItemCount.\n * @internal\n */\n public override async getTabHeaderCount(): Promise<number> {\n return await super.getTabHeaderCount();\n }\n\n /**\n * Gets the tab heading text.\n * Replacing with getSectionHeading.\n * @internal\n */\n public override async getTabHeading(): Promise<string> {\n return await super.getTabHeading();\n }\n\n /**\n * Whether the section is active.\n */\n public override async isActive(): Promise<boolean> {\n return await super.isActive();\n }\n\n /**\n * Whether the section is disabled.\n * This isn't used on sectioned forms.\n * @internal\n */\n /* istanbul ignore next */\n public override async isDisabled(): Promise<boolean> {\n return await super.isDisabled();\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkySectionedFormHarnessFilters } from './sectioned-form-harness-filters';\nimport { SkySectionedFormSectionContentHarness } from './sectioned-form-section-content-harness';\nimport { SkySectionedFormSectionHarness } from './sectioned-form-section-harness';\nimport { SkySectionedFormSectionHarnessFilters } from './sectioned-form-section-harness-filters';\n\n/**\n * Harness for interacting with a sectioned form component in tests.\n */\nexport class SkySectionedFormHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-sectioned-form';\n\n #getTabs = this.locatorForOptional('div.sky-sectioned-form-tabs');\n #getContent = this.locatorForOptional('div.sky-sectioned-form-content');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkySectionedFormHarness` that meets certain criteria.\n */\n public static with(\n filters: SkySectionedFormHarnessFilters,\n ): HarnessPredicate<SkySectionedFormHarness> {\n return SkySectionedFormHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Gets the `SkySectionedFormSectionHarness` for the currently active section.\n */\n public async getActiveSection(): Promise<\n SkySectionedFormSectionHarness | undefined\n > {\n const sections = await this.getSections();\n\n if (sections) {\n for (const section of sections) {\n if (await section.isActive()) {\n return section;\n }\n }\n }\n\n return undefined;\n }\n\n public async getActiveSectionContent(): Promise<\n SkySectionedFormSectionContentHarness | undefined\n > {\n if (await this.#getContent()) {\n const contents = await this.locatorForAll(\n SkySectionedFormSectionContentHarness,\n )();\n for (const content of contents) {\n if (await content.isVisible()) {\n return content;\n }\n }\n return undefined;\n }\n\n throw new Error('Unable to find active content because it is not visible.');\n }\n\n /**\n * Gets the tab width as a CSS `flex-basis` value (for example, `200px`),\n * or `null` when no width is set. The width is only applied in the desktop\n * layout, so this returns `null` in the mobile layout and when the tabs\n * pane is not rendered at all.\n */\n public async getTabWidth(): Promise<string | null> {\n const tabs = await this.#getTabs();\n if (!tabs) {\n return null;\n }\n\n const styleAttribute = await tabs.getAttribute('style');\n const styleMatch = styleAttribute?.match(/flex-basis:\\s*([^;]+)/i);\n\n return styleMatch?.[1]?.trim() ?? null;\n }\n\n /**\n * Gets a specific section based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getSection(\n filters: SkySectionedFormSectionHarnessFilters,\n ): Promise<SkySectionedFormSectionHarness> {\n return await this.locatorFor(\n SkySectionedFormSectionHarness.with(filters),\n )();\n }\n\n /**\n * Gets an array of sections based on the filter criteria.\n * If no filter is provided, returns all sections.\n * @param filters The optional filter criteria.\n */\n public async getSections(\n filters?: SkySectionedFormSectionHarnessFilters,\n ): Promise<SkySectionedFormSectionHarness[]> {\n if (!(await this.isSectionsVisible())) {\n throw new Error(\n 'Unable to find any sectioned form sections because they are not visible.',\n );\n }\n return await this.locatorForAll(\n SkySectionedFormSectionHarness.with(filters || {}),\n )();\n }\n\n /**\n * Whether the section tabs are visible.\n * In mobile view, sectioned forms collapse to just content pane.\n */\n public async isSectionsVisible(): Promise<boolean> {\n const tabs = await this.#getTabs();\n\n if (tabs) {\n return !(await tabs.hasClass('sky-sectioned-form-tabs-hidden'));\n }\n return false;\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyQueryableComponentHarness } from '@skyux/core/testing';\n\nimport { SkyTabContentHarnessFilters } from './tab-content-harness-filters';\n\n/**\n * Harness for interacting with a tab component in tests.\n */\nexport class SkyTabContentHarness extends SkyQueryableComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tab';\n\n #getTab = this.locatorFor('.sky-tab');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabContentHarness` that meets certain criteria.\n * @internal\n */\n public static with(\n filters: SkyTabContentHarnessFilters,\n ): HarnessPredicate<SkyTabContentHarness> {\n return new HarnessPredicate(SkyTabContentHarness, filters).addOption(\n 'tabId',\n filters.tabId,\n async (harness, tabId) => {\n const harnessId = await harness.getTabId();\n return await HarnessPredicate.stringMatches(harnessId, tabId);\n },\n );\n }\n\n /**\n * Gets the tab's layout.\n */\n public async getLayout(): Promise<string> {\n return (await (await this.host()).getAttribute('layout')) || 'none';\n }\n\n /**\n * @internal\n */\n public async getTabId(): Promise<string | null> {\n return await (await this.#getTab()).getAttribute('id');\n }\n\n /**\n * Whether the tab content is visible.\n */\n public async isVisible(): Promise<boolean> {\n return !(await (await this.#getTab()).getProperty<boolean>('hidden'));\n }\n}\n","import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing';\n\nimport { SkyTabButtonHarnessFilters } from './tab-button-harness-filters';\nimport { SkyTabContentHarness } from './tab-content-harness';\n\n/**\n * Harness for interacting with a tab button component in tests.\n */\nexport class SkyTabButtonHarness extends ComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tab-button';\n\n #getTabButton = this.locatorFor('a.sky-btn-tab');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabButtonHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyTabButtonHarnessFilters,\n ): HarnessPredicate<SkyTabButtonHarness> {\n return new HarnessPredicate(SkyTabButtonHarness, filters).addOption(\n 'tabHeading',\n filters.tabHeading,\n async (harness, tabHeading) => {\n const harnessTabHeading = await harness.getTabHeading();\n return await HarnessPredicate.stringMatches(\n harnessTabHeading,\n tabHeading,\n );\n },\n );\n }\n\n /**\n * Clicks the tab button.\n */\n public async click(): Promise<void> {\n return await (await this.#getTabButton()).click();\n }\n\n /**\n * Clicks the remove tab button if it is visible.\n */\n public async clickRemoveButton(): Promise<void> {\n if (await this.isInWizardTabset()) {\n throw new Error('Cannot use remove tab button in a wizard tabset.');\n }\n const button = await this.locatorForOptional('.sky-btn-tab-close')();\n if (!button) {\n throw new Error('Unable to find remove tab button.');\n }\n return await button.click();\n }\n\n /**\n * Gets the permalink that the page routes to when the tab is clicked.\n */\n public async getPermalink(): Promise<string | null> {\n if (await this.isInWizardTabset()) {\n throw new Error(\n 'Cannot get permalink for tab button in a wizard tabset.',\n );\n }\n return await (await this.#getTabButton()).getAttribute('href');\n }\n\n /**\n * Gets the `SkyTabContentHarness` controlled by this tab button.\n */\n public async getTabContentHarness(): Promise<SkyTabContentHarness> {\n return await this.documentRootLocatorFactory().locatorFor(\n SkyTabContentHarness.with({ tabId: await this.getTabId() }),\n )();\n }\n\n /**\n * Gets the tab heading.\n */\n public async getTabHeading(): Promise<string> {\n return (\n // eslint-disable-next-line @cspell/spellchecker\n await (await this.locatorFor('.sky-tab-heading > span[skyid]')()).text()\n );\n }\n\n /**\n * Gets whether the tab button is active.\n */\n public async isActive(): Promise<boolean> {\n return await (await this.#getTabButton()).hasClass('sky-btn-tab-selected');\n }\n\n /**\n * Gets whether the tab button is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return await (await this.#getTabButton()).hasClass('sky-btn-tab-disabled');\n }\n\n /**\n * Whether the tab button is in a Wizard tabset.\n */\n public async isInWizardTabset(): Promise<boolean> {\n return await (await this.#getTabButton()).hasClass('sky-btn-tab-wizard');\n }\n\n /**\n * Gets the id of the content controlled by this tab.\n * @internal\n */\n public async getTabId(): Promise<string> {\n return (\n (await (await this.#getTabButton()).getAttribute('aria-controls')) ||\n /* istanbul ignore next */\n ''\n );\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\nimport {\n SkyDropdownHarness,\n SkyDropdownMenuHarness,\n} from '@skyux/popovers/testing';\nimport { SkyTabsetButtonsDisplayMode } from '@skyux/tabs';\n\nimport { SkyTabButtonHarness } from './tab-button-harness';\nimport { SkyTabButtonHarnessFilters } from './tab-button-harness-filters';\nimport { SkyTabContentHarness } from './tab-content-harness';\nimport { SkyTabsetHarnessFilters } from './tabset-harness-filters';\n\n/**\n * Harness for interacting with a tabset component in tests.\n */\nexport class SkyTabsetHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tabset';\n\n #getTabset = this.locatorFor('.sky-tabset');\n #getTabDropdown = this.locatorFor(SkyDropdownHarness);\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabsetHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyTabsetHarnessFilters,\n ): HarnessPredicate<SkyTabsetHarness> {\n return SkyTabsetHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * In `dropdown` mode, clicks the dropdown tab to open the tab dropdown menu.\n */\n public async clickDropdownTab(): Promise<void> {\n if (!((await this.getMode()) === 'dropdown')) {\n throw new Error(\n 'Cannot click dropdown tab button, tab is not in dropdown mode.',\n );\n }\n const button = await this.locatorFor(SkyDropdownHarness)();\n return await button.clickDropdownButton();\n }\n\n /**\n * Clicks the new tab button if visible.\n */\n public async clickNewTabButton(): Promise<void> {\n if (await this.isWizardTabset()) {\n throw new Error('Cannot use new tab button in a wizard tabset.');\n }\n\n const newTabButton = await this.locatorForOptional(\n 'button.sky-tabset-btn-new',\n )();\n\n if (!newTabButton) {\n throw new Error('Unable to find the new tab button.');\n }\n\n return await newTabButton.click();\n }\n\n /**\n * Clicks the open tab button if visible.\n */\n public async clickOpenTabButton(): Promise<void> {\n if (await this.isWizardTabset()) {\n throw new Error('Cannot use open tab button in a wizard tabset.');\n }\n\n const openTabButton = await this.locatorForOptional(\n 'button.sky-tabset-btn-open',\n )();\n\n if (!openTabButton) {\n throw new Error('Unable to find the open tab button.');\n }\n\n return await openTabButton.click();\n }\n\n /**\n * Clicks a tab button with a `tabHeading` matching the input.\n */\n public async clickTabButton(tabHeading: string): Promise<void> {\n const tabButton = await this.getTabButtonHarness({\n tabHeading: tabHeading,\n });\n return await tabButton.click();\n }\n\n /**\n * Gets the active tab button harness.\n */\n public async getActiveTabButton(): Promise<SkyTabButtonHarness | null> {\n const tabButtonHarnesses = await this.getTabButtonHarnesses();\n\n for (const harness of tabButtonHarnesses) {\n if (await harness.isActive()) {\n return harness;\n }\n }\n\n /* istanbul ignore next */\n return null;\n }\n\n /**\n * Gets the tabset aria-label value.\n */\n public async getAriaLabel(): Promise<string | null> {\n return await (await this.#getTabset()).getAttribute('aria-label');\n }\n\n /**\n * Gets the tabset aria-labelledby value.\n */\n public async getAriaLabelledBy(): Promise<string | null> {\n return await (await this.#getTabset()).getAttribute('aria-labelledby');\n }\n\n /**\n * Gets the tabset's display mode.\n */\n public async getMode(): Promise<SkyTabsetButtonsDisplayMode> {\n if (await (await this.#getTabset()).hasClass('sky-tabset-mode-tabs')) {\n return 'tabs';\n }\n return 'dropdown';\n }\n\n /**\n * Gets a specific tab button based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getTabButtonHarness(\n filters: SkyTabButtonHarnessFilters,\n ): Promise<SkyTabButtonHarness> {\n if ((await this.getMode()) === 'dropdown') {\n const menu = await this.#getDropdownMenu();\n return await menu.queryHarness(SkyTabButtonHarness.with(filters));\n }\n return await this.locatorFor(SkyTabButtonHarness.with(filters))();\n }\n\n /**\n * Gets an array of tab button harnesses based on the filter criteria.\n * If no filter is provided, returns all tab button harnesses.\n * @param filters The optional filter criteria.\n */\n public async getTabButtonHarnesses(\n filters?: SkyTabButtonHarnessFilters,\n ): Promise<SkyTabButtonHarness[]> {\n if ((await this.getMode()) === 'dropdown') {\n const menu = await this.#getDropdownMenu();\n return await menu.queryHarnesses(SkyTabButtonHarness.with(filters || {}));\n } else {\n return await this.locatorForAll(\n SkyTabButtonHarness.with(filters || {}),\n )();\n }\n }\n\n /**\n * Gets a tab content harness for the tab with the given `tabHeading`.\n */\n public async getTabContentHarness(\n tabHeading: string,\n ): Promise<SkyTabContentHarness> {\n const tabButton = await this.getTabButtonHarness({\n tabHeading: tabHeading,\n });\n const id = await tabButton.getTabId();\n return await this.locatorFor(SkyTabContentHarness.with({ tabId: id }))();\n }\n\n /**\n * Whether the tabset is a Wizard component.\n */\n public async isWizardTabset(): Promise<boolean> {\n return (\n (await (await this.host()).getAttribute('data-tab-style')) === 'wizard'\n );\n }\n\n async #getDropdownMenu(): Promise<SkyDropdownMenuHarness> {\n const dropdown = await this.#getTabDropdown();\n if (!(await dropdown?.isOpen())) {\n throw new Error(\n 'Cannot get tab button when tabs is in dropdown mode and is closed.',\n );\n }\n return await dropdown.getDropdownMenu();\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\nimport { SkyTabsetNavButtonType } from '@skyux/tabs';\n\nimport { SkyTabsetNavButtonHarnessFilters } from './tabset-nav-button-harness-filters';\n\n/**\n * Harness to interact with tabset nav buttons in wizard style tabset tests.\n */\nexport class SkyTabsetNavButtonHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-tabset-nav-button';\n\n #button = this.locatorFor('button');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyTabsetNavButtonHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyTabsetNavButtonHarnessFilters,\n ): HarnessPredicate<SkyTabsetNavButtonHarness> {\n return SkyTabsetNavButtonHarness.getDataSkyIdPredicate(filters).addOption(\n 'buttonType',\n filters.buttonType,\n async (harness, buttonType) => {\n const harnessButtonType = await harness.getButtonType();\n return await HarnessPredicate.stringMatches(\n harnessButtonType,\n buttonType,\n );\n },\n );\n }\n\n /**\n * Clicks the button.\n */\n public async click(): Promise<void> {\n return await (await this.#button()).click();\n }\n\n /**\n * Gets the button text.\n */\n public async getButtonText(): Promise<string> {\n return await (await this.#button()).text();\n }\n\n /**\n * Gets the button type.\n */\n public async getButtonType(): Promise<SkyTabsetNavButtonType | null> {\n return (await (\n await this.host()\n ).getAttribute('data-button-type')) as SkyTabsetNavButtonType;\n }\n\n /**\n * Whether the button is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return (await (await this.#button()).getAttribute('disabled')) !== null;\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarness } from './vertical-tab-button-harness';\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabsetGroupHarnessFilters } from './vertical-tabset-group-harness-filters';\n\n/**\n * Harness for interacting with a vertical tabset group in tests.\n */\nexport class SkyVerticalTabsetGroupHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-vertical-tabset-group';\n\n #button = this.locatorFor('button.sky-vertical-tabset-button');\n #header = this.locatorFor('.sky-vertical-tabset-group-header');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabsetGroupHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabsetGroupHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabsetGroupHarness> {\n return new HarnessPredicate(\n SkyVerticalTabsetGroupHarness,\n filters,\n ).addOption(\n 'groupHeading',\n filters.groupHeading,\n async (harness, heading) => {\n return (await harness.getGroupHeading()) === heading;\n },\n );\n }\n\n /**\n * Clicks the group button to toggle its expanded state.\n */\n public async click(): Promise<void> {\n return await (await this.#button()).click();\n }\n\n /**\n * Gets the group heading text.\n */\n public async getGroupHeading(): Promise<string> {\n return (await (await this.#button()).text()).trim();\n }\n\n /**\n * Gets a specific vertical tab based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getVerticalTab(\n filters: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness> {\n return await this.locatorFor(SkyVerticalTabButtonHarness.with(filters))();\n }\n\n /**\n * Gets an array of vertical tab buttons based on the filter criteria.\n * If no filter is provided, returns all vertical tab buttons.\n * @param filters The optional filter criteria.\n */\n public async getVerticalTabs(\n filters?: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness[]> {\n return await this.locatorForAll(\n SkyVerticalTabButtonHarness.with(filters || {}),\n )();\n }\n\n /**\n * Whether a tab under this group is active.\n */\n public async isActive(): Promise<boolean> {\n return await (\n await this.#header()\n ).hasClass('sky-vertical-tabset-group-header-active');\n }\n\n /**\n * Whether the group is disabled.\n */\n public async isDisabled(): Promise<boolean> {\n return await (\n await this.#button()\n ).hasClass('sky-vertical-tabset-button-disabled');\n }\n\n /**\n * Whether the group is expanded.\n */\n public async isOpen(): Promise<boolean> {\n return (\n (await (await this.#button()).getAttribute('aria-expanded')) === 'true'\n );\n }\n}\n","import { HarnessPredicate } from '@angular/cdk/testing';\nimport { SkyComponentHarness } from '@skyux/core/testing';\n\nimport { SkyVerticalTabButtonHarness } from './vertical-tab-button-harness';\nimport { SkyVerticalTabButtonHarnessFilters } from './vertical-tab-button-harness-filters';\nimport { SkyVerticalTabContentHarness } from './vertical-tab-content-harness';\nimport { SkyVerticalTabsetGroupHarness } from './vertical-tabset-group-harness';\nimport { SkyVerticalTabsetGroupHarnessFilters } from './vertical-tabset-group-harness-filters';\nimport { SkyVerticalTabsetHarnessFilters } from './vertical-tabset-harness-filters';\n\n/**\n * Harness for interacting with the vertical tabset component in tests.\n */\nexport class SkyVerticalTabsetHarness extends SkyComponentHarness {\n /**\n * @internal\n */\n public static hostSelector = 'sky-vertical-tabset';\n\n #showTabsButton = this.locatorForOptional(\n '.sky-vertical-tabset-content > button.sky-vertical-tabset-show-tabs-btn',\n );\n #tabsContainer = this.locatorFor('.sky-vertical-tabset-group-container');\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a\n * `SkyVerticalTabsetHarness` that meets certain criteria.\n */\n public static with(\n filters: SkyVerticalTabsetHarnessFilters,\n ): HarnessPredicate<SkyVerticalTabsetHarness> {\n return SkyVerticalTabsetHarness.getDataSkyIdPredicate(filters);\n }\n\n /**\n * Click the show tabs button in mobile view.\n */\n public async clickShowTabsButton(): Promise<void> {\n const showTabsButton = await this.#showTabsButton();\n if (showTabsButton) {\n await showTabsButton.click();\n }\n }\n\n /**\n * Gets the `SkyVerticalTabButtonHarness` of the currently active tab.\n */\n public async getActiveTab(): Promise<\n SkyVerticalTabButtonHarness | undefined\n > {\n const tabs = await this.getTabs();\n if (tabs) {\n for (const tab of tabs) {\n if (await tab.isActive()) {\n return tab;\n }\n }\n }\n return undefined;\n }\n\n /**\n * Gets the `SkyVerticalTabContentHarness` for the currently active tab.\n */\n public async getActiveTabContent(): Promise<\n SkyVerticalTabContentHarness | undefined\n > {\n // in mobile view tabs are not rendered.\n if (!(await this.isTabsVisible())) {\n const contents = await this.locatorForAll(SkyVerticalTabContentHarness)();\n for (const content of contents) {\n if (await content.isVisible()) {\n return content;\n }\n }\n }\n\n const activeTab = await this.getActiveTab();\n if (activeTab) {\n return await activeTab.getTabContent();\n }\n return undefined;\n }\n\n /**\n * Gets the aria-label.\n */\n public async getAriaLabel(): Promise<string | null> {\n return await (\n await this.locatorFor('span.sky-vertical-tabset-tablist')()\n ).getAttribute('aria-label');\n }\n\n /**\n * Gets the aria-labelledby.\n */\n public async getAriaLabelledBy(): Promise<string | null> {\n return await (\n await this.locatorFor('span.sky-vertical-tabset-tablist')()\n ).getAttribute('aria-labelledby');\n }\n\n /**\n * Gets a specific vertical tabset group based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getGroup(\n filters: SkyVerticalTabsetGroupHarnessFilters,\n ): Promise<SkyVerticalTabsetGroupHarness | undefined> {\n return await this.locatorFor(SkyVerticalTabsetGroupHarness.with(filters))();\n }\n\n /**\n * Gets an array of vertical tabset groups based on the filter criteria.\n * If no filter is provided, returns all vertical tabset groups.\n * @param filters The optional filter criteria.\n */\n public async getGroups(\n filters?: SkyVerticalTabsetGroupHarnessFilters,\n ): Promise<SkyVerticalTabsetGroupHarness[]> {\n // open tablist if in mobile view\n if (!(await this.isTabsVisible())) {\n await this.clickShowTabsButton();\n }\n\n return await this.locatorForAll(\n SkyVerticalTabsetGroupHarness.with(filters || {}),\n )();\n }\n\n /**\n * Gets the text in the show tabs button in mobile view.\n */\n public async getShowTabsText(): Promise<string | undefined> {\n const showTabsButton = await this.#showTabsButton();\n\n // check if it is in mobile view\n if (showTabsButton) {\n return (await await showTabsButton.text()).trim();\n }\n\n return undefined;\n }\n\n /**\n * Gets the tab width as a CSS `flex-basis` value (for example, `200px`),\n * or `null` when no width is set. The width is only applied in the desktop\n * layout, so this returns `null` in the mobile layout.\n */\n public async getTabWidth(): Promise<string | null> {\n const styleAttribute = await (\n await this.#tabsContainer()\n ).getAttribute('style');\n const styleMatch = styleAttribute?.match(/flex-basis:\\s*([^;]+)/i);\n\n return styleMatch?.[1]?.trim() ?? null;\n }\n\n /**\n * Gets a specific vertical tab button based on the filter criteria.\n * @param filters The filter criteria.\n */\n public async getTab(\n filters: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness> {\n return await this.locatorFor(SkyVerticalTabButtonHarness.with(filters))();\n }\n\n /**\n * Gets an array of vertical tab buttons based on the filter criteria.\n * If no filter is provided, returns all vertical tab buttons.\n * @param filters The optional filter criteria.\n */\n public async getTabs(\n filters?: SkyVerticalTabButtonHarnessFilters,\n ): Promise<SkyVerticalTabButtonHarness[]> {\n // open tablist if in mobile view\n if (!(await this.isTabsVisible())) {\n await this.clickShowTabsButton();\n }\n\n return await this.locatorForAll(\n SkyVerticalTabButtonHarness.with(filters || {}),\n )();\n }\n\n /**\n * Whether the tabs are visible.\n * In mobile view, vertical tabsets collapse to just the content pane\n * with a button to show the tabs.\n */\n public async isTabsVisible(): Promise<boolean> {\n const showTabsButton = await this.#showTabsButton();\n if (showTabsButton) {\n return false;\n }\n return true;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/fesm2022/skyux-tabs.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i1 from '@angular/common';
|
|
2
2
|
import { CommonModule, Location } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { NgModule, Injectable, inject, DOCUMENT, ChangeDetectorRef, ViewChild, Input, ChangeDetectionStrategy, Component, ContentChildren,
|
|
4
|
+
import { NgModule, Injectable, inject, DOCUMENT, ChangeDetectorRef, ViewChild, Input, ChangeDetectionStrategy, Component, ContentChildren, input, EventEmitter, signal, computed, Output, afterNextRender, ElementRef, ViewEncapsulation, HostBinding, Pipe } from '@angular/core';
|
|
5
5
|
import { SkyCheckboxModule } from '@skyux/forms';
|
|
6
6
|
import * as i4$1 from '@skyux/theme';
|
|
7
7
|
import { SkyThemeModule } from '@skyux/theme';
|
|
@@ -700,6 +700,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
700
700
|
args: ['groupHeadingButton']
|
|
701
701
|
}] } });
|
|
702
702
|
|
|
703
|
+
/**
|
|
704
|
+
* The default width of the tabs pane. Also serves as the maximum width of the
|
|
705
|
+
* pane for any `tabWidth` value.
|
|
706
|
+
*/
|
|
707
|
+
const DEFAULT_TAB_WIDTH$1 = '25%';
|
|
703
708
|
class SkyVerticalTabsetComponent {
|
|
704
709
|
constructor() {
|
|
705
710
|
/**
|
|
@@ -708,12 +713,20 @@ class SkyVerticalTabsetComponent {
|
|
|
708
713
|
* @default false
|
|
709
714
|
*/
|
|
710
715
|
this.maintainTabContent = false;
|
|
716
|
+
/**
|
|
717
|
+
* The width of the tabs pane as a CSS width value (such as `200px`, `15rem`,
|
|
718
|
+
* or `20%`). Set to `"auto"` to size based on tab label content. Maximum
|
|
719
|
+
* width is 25%.
|
|
720
|
+
* @default "25%"
|
|
721
|
+
*/
|
|
722
|
+
this.tabWidth = input(DEFAULT_TAB_WIDTH$1, { ...(ngDevMode ? { debugName: "tabWidth" } : /* istanbul ignore next */ {}), transform: (value) => value?.trim() || DEFAULT_TAB_WIDTH$1 });
|
|
711
723
|
/**
|
|
712
724
|
* Fires when the active tab changes. Emits the index of the active tab. The
|
|
713
725
|
* index is based on the tab's position when it loads.
|
|
714
726
|
*/
|
|
715
727
|
this.activeChange = new EventEmitter();
|
|
716
|
-
this.isMobile = false
|
|
728
|
+
this.isMobile = signal(false, /* @ts-ignore */
|
|
729
|
+
...(ngDevMode ? [{ debugName: "isMobile" }] : /* istanbul ignore next */ []));
|
|
717
730
|
this.tablistHasFocus = false;
|
|
718
731
|
this.#ngUnsubscribe = new Subject();
|
|
719
732
|
this.#_ariaRole = 'tablist';
|
|
@@ -722,6 +735,10 @@ class SkyVerticalTabsetComponent {
|
|
|
722
735
|
this.adapterService = inject(SkyVerticalTabsetAdapterService);
|
|
723
736
|
this.tabService = inject(SkyVerticalTabsetService);
|
|
724
737
|
this.tabIdSvc = inject(SkyTabIdService);
|
|
738
|
+
this.tabGroupContainerFlexBasis = computed(() => (this.isMobile() ? undefined : this.tabWidth()), /* @ts-ignore */
|
|
739
|
+
...(ngDevMode ? [{ debugName: "tabGroupContainerFlexBasis" }] : /* istanbul ignore next */ []));
|
|
740
|
+
this.tabGroupContainerMaxWidth = computed(() => (this.isMobile() ? undefined : DEFAULT_TAB_WIDTH$1), /* @ts-ignore */
|
|
741
|
+
...(ngDevMode ? [{ debugName: "tabGroupContainerMaxWidth" }] : /* istanbul ignore next */ []));
|
|
725
742
|
}
|
|
726
743
|
/**
|
|
727
744
|
* The ARIA role for the vertical tabset
|
|
@@ -757,12 +774,10 @@ class SkyVerticalTabsetComponent {
|
|
|
757
774
|
this.tabService.switchingMobile
|
|
758
775
|
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
759
776
|
.subscribe((mobile) => {
|
|
760
|
-
this.isMobile
|
|
761
|
-
this.#changeRef.markForCheck();
|
|
777
|
+
this.isMobile.set(mobile);
|
|
762
778
|
});
|
|
763
779
|
if (this.tabService.isMobile()) {
|
|
764
|
-
this.isMobile
|
|
765
|
-
this.#changeRef.markForCheck();
|
|
780
|
+
this.isMobile.set(true);
|
|
766
781
|
}
|
|
767
782
|
if (!this.showTabsText) {
|
|
768
783
|
this.#resources
|
|
@@ -805,11 +820,11 @@ class SkyVerticalTabsetComponent {
|
|
|
805
820
|
this.adapterService.focusPreviousButton(this.tabGroups);
|
|
806
821
|
}
|
|
807
822
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: SkyVerticalTabsetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
808
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: SkyVerticalTabsetComponent, isStandalone: false, selector: "sky-vertical-tabset", inputs: { showTabsText: "showTabsText", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", ariaRole: "ariaRole", maintainTabContent: "maintainTabContent" }, outputs: { activeChange: "activeChange" }, providers: [SkyTabIdService, SkyVerticalTabsetService], viewQueries: [{ propertyName: "tabGroups", first: true, predicate: ["groupContainerWrapper"], descendants: true }, { propertyName: "content", first: true, predicate: ["skySideContent"], descendants: true }, { propertyName: "contentWrapper", first: true, predicate: ["contentContainerWrapper"], descendants: true }], ngImport: i0, template: "<div\n class=\"sky-vertical-tabset\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n (focus)=\"tabsetFocus()\"\n>\n <!--\n ARIA rules do not allow tabpanel elements to be children of a tablist element.\n However, the markup for each sky-vertical-tab component includes both the tab button\n and its panel, making the panel element a child of its tablist. Moreover, our\n sky-vertical-tab components can be grouped within collapsible containers, which also\n violates accessibility rules because only tab buttons can be children of a tablist.\n To address this, we create an empty tablist element with an aria-owns attribute,\n pointing to each tab element individually. That way, we don't have to worry about the\n structure for each sky-vertical-tab component in order to satisfy accessibility\n guidelines.\n -->\n <span\n class=\"sky-vertical-tabset-tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-orientation]=\"isMobile ? undefined : 'vertical'\"\n [attr.aria-owns]=\"\n isMobile ? undefined : (tabIdSvc.ids | async)?.join(' ') || undefined\n \"\n [attr.role]=\"isMobile ? undefined : ariaRole\"\n ></span>\n <div\n #groupContainerWrapper\n class=\"sky-vertical-tabset-group-container\"\n skyTransitionEndHandler\n transitionPropertyToTrack=\"transform\"\n [class.sky-animation-slide-enter-left]=\"tabService.isMobile()\"\n [ngClass]=\"{ 'sky-vertical-tabset-hidden': !tabService.tabsVisible() }\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n [transitionTrigger]=\"tabService.tabsVisible()\"\n (keydown.arrowDown)=\"tabGroupsArrowDown(); $event.preventDefault()\"\n (keydown.arrowUp)=\"tabGroupsArrowUp(); $event.preventDefault()\"\n (focusin)=\"trapFocusInTablist()\"\n (focusout)=\"resetTabIndex()\"\n (transitionEnd)=\"tabsetFocus()\"\n >\n <ng-content />\n </div>\n @if (maintainTabContent || tabService.contentVisible()) {\n <div\n #contentContainerWrapper\n class=\"sky-vertical-tabset-content\"\n [class.sky-animation-slide-enter-right]=\"tabService.isMobile()\"\n [ngClass]=\"{\n 'sky-vertical-tabset-content-hidden': !tabService.contentVisible()\n }\"\n (focusin)=\"resetTabIndex()\"\n >\n <div #skySideContent></div>\n @if (!tabService.tabsVisible()) {\n <button\n class=\"sky-btn sky-btn-primary sky-vertical-tabset-show-tabs-btn\"\n type=\"button\"\n (click)=\"tabService.showTabs()\"\n >\n <sky-icon iconName=\"chevron-left\" />\n {{ showTabsText }}\n </button>\n }\n </div>\n }\n</div>\n", styles: [".sky-vertical-tabset:not(.sky-theme-modern *){--sky-override-vertical-tab-content-pane-margin-bottom: 0;--sky-override-vertical-tabset-content-margin-sm-lg: 10px 0 0 10px;--sky-override-vertical-tabset-content-margin-xs: 10px 0 0 10px;--sky-override-vertical-tabset-group-container-border-right: 1px solid #cdcfd2;--sky-override-vertical-tabset-group-container-padding: 0;--sky-override-vertical-tabset-modal-margin-adjustment: -15px;--sky-override-vertical-tabset-modal-margin-adjustment-with-group: -15px;--sky-override-vertical-tabset-show-tabs-margin-top: 10px}:host .sky-vertical-tabset{display:block;height:auto}:host .sky-vertical-tabset-group-container{border-right:none}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:block;height:auto}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:none}@media(min-width:768px){:host .sky-vertical-tabset{display:flex;height:100%}:host .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider))}}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:flex;height:100%}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider))}.sky-vertical-tabset-hidden{display:none}.sky-vertical-tabset-content{margin:var(--sky-override-vertical-tabset-content-margin-xs, var(--sky-comp-tab-vertical-content-space-inset-xs-top) var(--sky-comp-tab-vertical-content-space-inset-xs-right) var(--sky-comp-tab-vertical-content-space-inset-xs-bottom) var(--sky-comp-tab-vertical-content-space-inset-xs-left));
|
|
823
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: SkyVerticalTabsetComponent, isStandalone: false, selector: "sky-vertical-tabset", inputs: { showTabsText: { classPropertyName: "showTabsText", publicName: "showTabsText", isSignal: false, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: false, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: false, isRequired: false, transformFunction: null }, ariaRole: { classPropertyName: "ariaRole", publicName: "ariaRole", isSignal: false, isRequired: false, transformFunction: null }, maintainTabContent: { classPropertyName: "maintainTabContent", publicName: "maintainTabContent", isSignal: false, isRequired: false, transformFunction: null }, tabWidth: { classPropertyName: "tabWidth", publicName: "tabWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeChange: "activeChange" }, providers: [SkyTabIdService, SkyVerticalTabsetService], viewQueries: [{ propertyName: "tabGroups", first: true, predicate: ["groupContainerWrapper"], descendants: true }, { propertyName: "content", first: true, predicate: ["skySideContent"], descendants: true }, { propertyName: "contentWrapper", first: true, predicate: ["contentContainerWrapper"], descendants: true }], ngImport: i0, template: "<div\n class=\"sky-vertical-tabset\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n (focus)=\"tabsetFocus()\"\n>\n <!--\n ARIA rules do not allow tabpanel elements to be children of a tablist element.\n However, the markup for each sky-vertical-tab component includes both the tab button\n and its panel, making the panel element a child of its tablist. Moreover, our\n sky-vertical-tab components can be grouped within collapsible containers, which also\n violates accessibility rules because only tab buttons can be children of a tablist.\n To address this, we create an empty tablist element with an aria-owns attribute,\n pointing to each tab element individually. That way, we don't have to worry about the\n structure for each sky-vertical-tab component in order to satisfy accessibility\n guidelines.\n -->\n <span\n class=\"sky-vertical-tabset-tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-orientation]=\"isMobile() ? undefined : 'vertical'\"\n [attr.aria-owns]=\"\n isMobile() ? undefined : (tabIdSvc.ids | async)?.join(' ') || undefined\n \"\n [attr.role]=\"isMobile() ? undefined : ariaRole\"\n ></span>\n <div\n #groupContainerWrapper\n class=\"sky-vertical-tabset-group-container\"\n skyTransitionEndHandler\n transitionPropertyToTrack=\"transform\"\n [style.flex-basis]=\"tabGroupContainerFlexBasis()\"\n [style.max-width]=\"tabGroupContainerMaxWidth()\"\n [class.sky-animation-slide-enter-left]=\"tabService.isMobile()\"\n [ngClass]=\"{ 'sky-vertical-tabset-hidden': !tabService.tabsVisible() }\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n [transitionTrigger]=\"tabService.tabsVisible()\"\n (keydown.arrowDown)=\"tabGroupsArrowDown(); $event.preventDefault()\"\n (keydown.arrowUp)=\"tabGroupsArrowUp(); $event.preventDefault()\"\n (focusin)=\"trapFocusInTablist()\"\n (focusout)=\"resetTabIndex()\"\n (transitionEnd)=\"tabsetFocus()\"\n >\n <ng-content />\n </div>\n @if (maintainTabContent || tabService.contentVisible()) {\n <div\n #contentContainerWrapper\n class=\"sky-vertical-tabset-content\"\n [class.sky-animation-slide-enter-right]=\"tabService.isMobile()\"\n [ngClass]=\"{\n 'sky-vertical-tabset-content-hidden': !tabService.contentVisible()\n }\"\n (focusin)=\"resetTabIndex()\"\n >\n <div #skySideContent></div>\n @if (!tabService.tabsVisible()) {\n <button\n class=\"sky-btn sky-btn-primary sky-vertical-tabset-show-tabs-btn\"\n type=\"button\"\n (click)=\"tabService.showTabs()\"\n >\n <sky-icon iconName=\"chevron-left\" />\n {{ showTabsText }}\n </button>\n }\n </div>\n }\n</div>\n", styles: [".sky-vertical-tabset:not(.sky-theme-modern *){--sky-override-vertical-tab-content-pane-margin-bottom: 0;--sky-override-vertical-tabset-content-margin-sm-lg: 10px 0 0 10px;--sky-override-vertical-tabset-content-margin-xs: 10px 0 0 10px;--sky-override-vertical-tabset-group-container-border-right: 1px solid #cdcfd2;--sky-override-vertical-tabset-group-container-padding: 0;--sky-override-vertical-tabset-modal-margin-adjustment: -15px;--sky-override-vertical-tabset-modal-margin-adjustment-with-group: -15px;--sky-override-vertical-tabset-show-tabs-margin-top: 10px}:host .sky-vertical-tabset{display:block;height:auto}:host .sky-vertical-tabset-group-container{border-right:none}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:block;height:auto}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:none}@media(min-width:768px){:host .sky-vertical-tabset{display:flex;height:100%}:host .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider));flex-grow:0;flex-shrink:0}}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:flex;height:100%}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider));flex-grow:0;flex-shrink:0}.sky-vertical-tabset-hidden{display:none}.sky-vertical-tabset-content{margin:var(--sky-override-vertical-tabset-content-margin-xs, var(--sky-comp-tab-vertical-content-space-inset-xs-top) var(--sky-comp-tab-vertical-content-space-inset-xs-right) var(--sky-comp-tab-vertical-content-space-inset-xs-bottom) var(--sky-comp-tab-vertical-content-space-inset-xs-left));overflow-y:auto}.sky-vertical-tabset-content-hidden{display:none}.sky-vertical-tabset-show-tabs-btn{margin-top:var(--sky-override-vertical-tabset-show-tabs-margin-top, 0)}.sky-vertical-tabset-group-container{background-color:var(--sky-color-background-container-dimmed);overflow-y:auto;padding:var(--sky-override-vertical-tabset-group-container-padding, var(--sky-comp-tab-vertical-group-space-inset-top) var(--sky-comp-tab-vertical-group-space-inset-right) var(--sky-comp-tab-vertical-group-space-inset-bottom) var(--sky-comp-tab-vertical-group-space-inset-left))}:host-context(sky-modal-content)>:host .sky-vertical-tabset{margin:var(--sky-override-vertical-tabset-modal-margin-adjustment, calc(var(--sky-comp-modal-content-space-inset-top) * -1) calc(var(--sky-comp-modal-content-space-inset-right) * -1) calc(var(--sky-comp-modal-content-space-inset-bottom) * -1) calc((var(--sky-comp-tab-vertical-space-inset-left) + var(--sky-space-inline-s)) * -1))}:host-context(sky-modal-content)>:host .sky-vertical-tabset:has(sky-vertical-tabset-group){margin-left:var(--sky-override-vertical-tabset-modal-margin-adjustment-with-group, calc(var(--sky-comp-tab-vertical-group-button-space-inset-left) * -1))}@media(min-width:768px){:host .sky-vertical-tabset-content{flex:1 1 auto;margin:var(--sky-override-vertical-tabset-content-margin-sm-lg, var(--sky-comp-tab-vertical-content-space-inset-sm-top) var(--sky-comp-tab-vertical-content-space-inset-sm-right) var(--sky-comp-tab-vertical-content-space-inset-sm-bottom) var(--sky-comp-tab-vertical-content-space-inset-sm-left))}}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-content,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-content,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-content{flex:1 1 auto;margin:var(--sky-override-vertical-tabset-content-margin-sm-lg, var(--sky-comp-tab-vertical-content-space-inset-sm-top) var(--sky-comp-tab-vertical-content-space-inset-sm-right) var(--sky-comp-tab-vertical-content-space-inset-sm-bottom) var(--sky-comp-tab-vertical-content-space-inset-sm-left))}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.λ1, selector: "sky-icon", inputs: ["iconName", "variant", "iconSize"] }, { kind: "directive", type: i3._SkyTransitionEndHandlerDirective, selector: "[skyTransitionEndHandler]", inputs: ["transitionTrigger", "transitionPropertyToTrack"], outputs: ["transitionEnd"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
809
824
|
}
|
|
810
825
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: SkyVerticalTabsetComponent, decorators: [{
|
|
811
826
|
type: Component,
|
|
812
|
-
args: [{ selector: 'sky-vertical-tabset', providers: [SkyTabIdService, SkyVerticalTabsetService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div\n class=\"sky-vertical-tabset\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n (focus)=\"tabsetFocus()\"\n>\n <!--\n ARIA rules do not allow tabpanel elements to be children of a tablist element.\n However, the markup for each sky-vertical-tab component includes both the tab button\n and its panel, making the panel element a child of its tablist. Moreover, our\n sky-vertical-tab components can be grouped within collapsible containers, which also\n violates accessibility rules because only tab buttons can be children of a tablist.\n To address this, we create an empty tablist element with an aria-owns attribute,\n pointing to each tab element individually. That way, we don't have to worry about the\n structure for each sky-vertical-tab component in order to satisfy accessibility\n guidelines.\n -->\n <span\n class=\"sky-vertical-tabset-tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-orientation]=\"isMobile ? undefined : 'vertical'\"\n [attr.aria-owns]=\"\n isMobile ? undefined : (tabIdSvc.ids | async)?.join(' ') || undefined\n \"\n [attr.role]=\"isMobile ? undefined : ariaRole\"\n ></span>\n <div\n #groupContainerWrapper\n class=\"sky-vertical-tabset-group-container\"\n skyTransitionEndHandler\n transitionPropertyToTrack=\"transform\"\n [class.sky-animation-slide-enter-left]=\"tabService.isMobile()\"\n [ngClass]=\"{ 'sky-vertical-tabset-hidden': !tabService.tabsVisible() }\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n [transitionTrigger]=\"tabService.tabsVisible()\"\n (keydown.arrowDown)=\"tabGroupsArrowDown(); $event.preventDefault()\"\n (keydown.arrowUp)=\"tabGroupsArrowUp(); $event.preventDefault()\"\n (focusin)=\"trapFocusInTablist()\"\n (focusout)=\"resetTabIndex()\"\n (transitionEnd)=\"tabsetFocus()\"\n >\n <ng-content />\n </div>\n @if (maintainTabContent || tabService.contentVisible()) {\n <div\n #contentContainerWrapper\n class=\"sky-vertical-tabset-content\"\n [class.sky-animation-slide-enter-right]=\"tabService.isMobile()\"\n [ngClass]=\"{\n 'sky-vertical-tabset-content-hidden': !tabService.contentVisible()\n }\"\n (focusin)=\"resetTabIndex()\"\n >\n <div #skySideContent></div>\n @if (!tabService.tabsVisible()) {\n <button\n class=\"sky-btn sky-btn-primary sky-vertical-tabset-show-tabs-btn\"\n type=\"button\"\n (click)=\"tabService.showTabs()\"\n >\n <sky-icon iconName=\"chevron-left\" />\n {{ showTabsText }}\n </button>\n }\n </div>\n }\n</div>\n", styles: [".sky-vertical-tabset:not(.sky-theme-modern *){--sky-override-vertical-tab-content-pane-margin-bottom: 0;--sky-override-vertical-tabset-content-margin-sm-lg: 10px 0 0 10px;--sky-override-vertical-tabset-content-margin-xs: 10px 0 0 10px;--sky-override-vertical-tabset-group-container-border-right: 1px solid #cdcfd2;--sky-override-vertical-tabset-group-container-padding: 0;--sky-override-vertical-tabset-modal-margin-adjustment: -15px;--sky-override-vertical-tabset-modal-margin-adjustment-with-group: -15px;--sky-override-vertical-tabset-show-tabs-margin-top: 10px}:host .sky-vertical-tabset{display:block;height:auto}:host .sky-vertical-tabset-group-container{border-right:none}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:block;height:auto}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:none}@media(min-width:768px){:host .sky-vertical-tabset{display:flex;height:100%}:host .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider))}}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:flex;height:100%}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider))}.sky-vertical-tabset-hidden{display:none}.sky-vertical-tabset-content{margin:var(--sky-override-vertical-tabset-content-margin-xs, var(--sky-comp-tab-vertical-content-space-inset-xs-top) var(--sky-comp-tab-vertical-content-space-inset-xs-right) var(--sky-comp-tab-vertical-content-space-inset-xs-bottom) var(--sky-comp-tab-vertical-content-space-inset-xs-left));
|
|
827
|
+
args: [{ selector: 'sky-vertical-tabset', providers: [SkyTabIdService, SkyVerticalTabsetService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div\n class=\"sky-vertical-tabset\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n (focus)=\"tabsetFocus()\"\n>\n <!--\n ARIA rules do not allow tabpanel elements to be children of a tablist element.\n However, the markup for each sky-vertical-tab component includes both the tab button\n and its panel, making the panel element a child of its tablist. Moreover, our\n sky-vertical-tab components can be grouped within collapsible containers, which also\n violates accessibility rules because only tab buttons can be children of a tablist.\n To address this, we create an empty tablist element with an aria-owns attribute,\n pointing to each tab element individually. That way, we don't have to worry about the\n structure for each sky-vertical-tab component in order to satisfy accessibility\n guidelines.\n -->\n <span\n class=\"sky-vertical-tabset-tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-orientation]=\"isMobile() ? undefined : 'vertical'\"\n [attr.aria-owns]=\"\n isMobile() ? undefined : (tabIdSvc.ids | async)?.join(' ') || undefined\n \"\n [attr.role]=\"isMobile() ? undefined : ariaRole\"\n ></span>\n <div\n #groupContainerWrapper\n class=\"sky-vertical-tabset-group-container\"\n skyTransitionEndHandler\n transitionPropertyToTrack=\"transform\"\n [style.flex-basis]=\"tabGroupContainerFlexBasis()\"\n [style.max-width]=\"tabGroupContainerMaxWidth()\"\n [class.sky-animation-slide-enter-left]=\"tabService.isMobile()\"\n [ngClass]=\"{ 'sky-vertical-tabset-hidden': !tabService.tabsVisible() }\"\n [tabIndex]=\"tablistHasFocus ? -1 : 0\"\n [transitionTrigger]=\"tabService.tabsVisible()\"\n (keydown.arrowDown)=\"tabGroupsArrowDown(); $event.preventDefault()\"\n (keydown.arrowUp)=\"tabGroupsArrowUp(); $event.preventDefault()\"\n (focusin)=\"trapFocusInTablist()\"\n (focusout)=\"resetTabIndex()\"\n (transitionEnd)=\"tabsetFocus()\"\n >\n <ng-content />\n </div>\n @if (maintainTabContent || tabService.contentVisible()) {\n <div\n #contentContainerWrapper\n class=\"sky-vertical-tabset-content\"\n [class.sky-animation-slide-enter-right]=\"tabService.isMobile()\"\n [ngClass]=\"{\n 'sky-vertical-tabset-content-hidden': !tabService.contentVisible()\n }\"\n (focusin)=\"resetTabIndex()\"\n >\n <div #skySideContent></div>\n @if (!tabService.tabsVisible()) {\n <button\n class=\"sky-btn sky-btn-primary sky-vertical-tabset-show-tabs-btn\"\n type=\"button\"\n (click)=\"tabService.showTabs()\"\n >\n <sky-icon iconName=\"chevron-left\" />\n {{ showTabsText }}\n </button>\n }\n </div>\n }\n</div>\n", styles: [".sky-vertical-tabset:not(.sky-theme-modern *){--sky-override-vertical-tab-content-pane-margin-bottom: 0;--sky-override-vertical-tabset-content-margin-sm-lg: 10px 0 0 10px;--sky-override-vertical-tabset-content-margin-xs: 10px 0 0 10px;--sky-override-vertical-tabset-group-container-border-right: 1px solid #cdcfd2;--sky-override-vertical-tabset-group-container-padding: 0;--sky-override-vertical-tabset-modal-margin-adjustment: -15px;--sky-override-vertical-tabset-modal-margin-adjustment-with-group: -15px;--sky-override-vertical-tabset-show-tabs-margin-top: 10px}:host .sky-vertical-tabset{display:block;height:auto}:host .sky-vertical-tabset-group-container{border-right:none}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:block;height:auto}:host-context(.sky-responsive-container-xs) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:none}@media(min-width:768px){:host .sky-vertical-tabset{display:flex;height:100%}:host .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider));flex-grow:0;flex-shrink:0}}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset,:host-context(.sky-responsive-container-md) .sky-vertical-tabset,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset{display:flex;height:100%}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-group-container,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-group-container{border-right:var(--sky-override-vertical-tabset-group-container-border-right, var(--sky-border-width-divider) var(--sky-border-style-divider) var(--sky-color-border-divider));flex-grow:0;flex-shrink:0}.sky-vertical-tabset-hidden{display:none}.sky-vertical-tabset-content{margin:var(--sky-override-vertical-tabset-content-margin-xs, var(--sky-comp-tab-vertical-content-space-inset-xs-top) var(--sky-comp-tab-vertical-content-space-inset-xs-right) var(--sky-comp-tab-vertical-content-space-inset-xs-bottom) var(--sky-comp-tab-vertical-content-space-inset-xs-left));overflow-y:auto}.sky-vertical-tabset-content-hidden{display:none}.sky-vertical-tabset-show-tabs-btn{margin-top:var(--sky-override-vertical-tabset-show-tabs-margin-top, 0)}.sky-vertical-tabset-group-container{background-color:var(--sky-color-background-container-dimmed);overflow-y:auto;padding:var(--sky-override-vertical-tabset-group-container-padding, var(--sky-comp-tab-vertical-group-space-inset-top) var(--sky-comp-tab-vertical-group-space-inset-right) var(--sky-comp-tab-vertical-group-space-inset-bottom) var(--sky-comp-tab-vertical-group-space-inset-left))}:host-context(sky-modal-content)>:host .sky-vertical-tabset{margin:var(--sky-override-vertical-tabset-modal-margin-adjustment, calc(var(--sky-comp-modal-content-space-inset-top) * -1) calc(var(--sky-comp-modal-content-space-inset-right) * -1) calc(var(--sky-comp-modal-content-space-inset-bottom) * -1) calc((var(--sky-comp-tab-vertical-space-inset-left) + var(--sky-space-inline-s)) * -1))}:host-context(sky-modal-content)>:host .sky-vertical-tabset:has(sky-vertical-tabset-group){margin-left:var(--sky-override-vertical-tabset-modal-margin-adjustment-with-group, calc(var(--sky-comp-tab-vertical-group-button-space-inset-left) * -1))}@media(min-width:768px){:host .sky-vertical-tabset-content{flex:1 1 auto;margin:var(--sky-override-vertical-tabset-content-margin-sm-lg, var(--sky-comp-tab-vertical-content-space-inset-sm-top) var(--sky-comp-tab-vertical-content-space-inset-sm-right) var(--sky-comp-tab-vertical-content-space-inset-sm-bottom) var(--sky-comp-tab-vertical-content-space-inset-sm-left))}}:host-context(.sky-responsive-container-sm) .sky-vertical-tabset-content,:host-context(.sky-responsive-container-md) .sky-vertical-tabset-content,:host-context(.sky-responsive-container-lg) .sky-vertical-tabset-content{flex:1 1 auto;margin:var(--sky-override-vertical-tabset-content-margin-sm-lg, var(--sky-comp-tab-vertical-content-space-inset-sm-top) var(--sky-comp-tab-vertical-content-space-inset-sm-right) var(--sky-comp-tab-vertical-content-space-inset-sm-bottom) var(--sky-comp-tab-vertical-content-space-inset-sm-left))}\n"] }]
|
|
813
828
|
}], propDecorators: { showTabsText: [{
|
|
814
829
|
type: Input
|
|
815
830
|
}], ariaLabel: [{
|
|
@@ -820,7 +835,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
820
835
|
type: Input
|
|
821
836
|
}], maintainTabContent: [{
|
|
822
837
|
type: Input
|
|
823
|
-
}], activeChange: [{
|
|
838
|
+
}], tabWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabWidth", required: false }] }], activeChange: [{
|
|
824
839
|
type: Output
|
|
825
840
|
}], tabGroups: [{
|
|
826
841
|
type: ViewChild,
|