diff --git a/packages/calcite-components/src/components/stepper/stepper.e2e.ts b/packages/calcite-components/src/components/stepper/stepper.e2e.ts index 49a4dc35b1d..eb98a603571 100644 --- a/packages/calcite-components/src/components/stepper/stepper.e2e.ts +++ b/packages/calcite-components/src/components/stepper/stepper.e2e.ts @@ -858,5 +858,34 @@ describe("calcite-stepper", () => { await page.waitForChanges(); expect(eventSpy).toHaveReceivedEventTimes(2); }); + + it(`switching to layout="horizontal-single" dynamically from another option should display a single item (#8931)`, async () => { + const page = await newE2EPage(); + await page.setContent( + html` + + +
Step 1 content
+
+ +
Step 2 content
+
+ +
Step 3 content
+
+ +
Step 4 content
+
+
+ `, + ); + + const stepper = await page.find("calcite-stepper"); + await stepper.setProperty("layout", "horizontal-single"); + await page.waitForChanges(); + + const displayedItems = await page.findAll("calcite-stepper-item:not([hidden])"); + expect(displayedItems.length).toBe(1); + }); }); }); diff --git a/packages/calcite-components/src/components/stepper/stepper.tsx b/packages/calcite-components/src/components/stepper/stepper.tsx index a4f64bac65d..9f37f8b7f1b 100644 --- a/packages/calcite-components/src/components/stepper/stepper.tsx +++ b/packages/calcite-components/src/components/stepper/stepper.tsx @@ -74,6 +74,7 @@ export class Stepper implements LocalizedComponent, T9nComponent { @Watch("scale") handleItemPropChange(): void { this.updateItems(); + this.determineActiveStepper(); } /** @@ -150,7 +151,6 @@ export class Stepper implements LocalizedComponent, T9nComponent { } componentDidLoad(): void { - this.resizeObserver?.observe(this.containerEl); // if no stepper items are set as active, default to the first one if (typeof this.currentActivePosition !== "number") { const enabledStepIndex = this.getFirstEnabledStepperPosition(); @@ -166,7 +166,6 @@ export class Stepper implements LocalizedComponent, T9nComponent { } disconnectedCallback(): void { - this.resizeObserver?.disconnect(); disconnectMessages(this); disconnectLocalized(this); this.mutationObserver?.disconnect(); @@ -356,15 +355,6 @@ export class Stepper implements LocalizedComponent, T9nComponent { }); } - @State() elWidth: number; - - @Watch("elWidth") - handleElWidthChange(): void { - readTask((): void => { - this.determineActiveStepper(); - }); - } - private enabledItems: HTMLCalciteStepperItemElement[] = []; private itemMap = new Map(); @@ -386,11 +376,6 @@ export class Stepper implements LocalizedComponent, T9nComponent { // //-------------------------------------------------------------------------- - private resizeObserver = createObserver( - "resize", - (entries) => (this.elWidth = entries[0].contentRect.width), - ); - private updateItems(): void { this.el.querySelectorAll("calcite-stepper-item").forEach((item) => { item.icon = this.icon; @@ -401,18 +386,18 @@ export class Stepper implements LocalizedComponent, T9nComponent { } private determineActiveStepper(): void { - const totalItems = this.items.length; - if (!this.elWidth || !totalItems || this.layout !== "horizontal-single" || totalItems === 1) { + const { items } = this; + + if (items.length < 2) { return; } - const activePosition = this.currentActivePosition || 0; - if (this.layout === "horizontal-single") { - this.multipleViewMode = false; - this.items.forEach((item: HTMLCalciteStepperItemElement, index) => { - item.hidden = index !== activePosition; - }); - } + const { currentActivePosition, layout } = this; + + this.multipleViewMode = layout !== "horizontal-single"; + items.forEach((item, index) => { + item.hidden = layout === "horizontal-single" && index !== (currentActivePosition || 0); + }); } private getEnabledStepIndex(