diff --git a/packages/calcite-components/src/components/dialog/dialog.e2e.ts b/packages/calcite-components/src/components/dialog/dialog.e2e.ts index e6ce8c725e0..4d669f54110 100644 --- a/packages/calcite-components/src/components/dialog/dialog.e2e.ts +++ b/packages/calcite-components/src/components/dialog/dialog.e2e.ts @@ -12,6 +12,7 @@ import { } from "../../tests/commonTests"; import { html } from "../../../support/formatting"; import { GlobalTestProps, isElementFocused, skipAnimations } from "../../tests/utils"; +import { IDS as PanelIDS } from "../panel/resources"; import { DialogMessages } from "./assets/dialog/t9n"; import { CSS, SLOTS } from "./resources"; @@ -367,7 +368,7 @@ describe("calcite-dialog", () => { await page.waitForChanges(); expect(await page.find(`calcite-dialog >>> .${CSS.containerOpen}`)).toBeDefined(); - const closeButton = await page.find(`calcite-dialog >>> calcite-panel >>> [data-test="close"]`); + const closeButton = await page.find(`calcite-dialog >>> calcite-panel >>> #${PanelIDS.close}`); await closeButton.click(); await page.waitForChanges(); expect(mockCallBack).toHaveBeenCalledTimes(2); @@ -686,7 +687,7 @@ describe("calcite-dialog", () => { await page.waitForChanges(); expect(await container.isVisible()).toBe(true); - const closeButton = await page.find(`calcite-dialog >>> calcite-panel >>> [data-test="close"]`); + const closeButton = await page.find(`calcite-dialog >>> calcite-panel >>> #${PanelIDS.close}`); await closeButton.click(); await page.waitForChanges(); expect(await container.isVisible()).toBe(false); @@ -865,4 +866,21 @@ describe("calcite-dialog", () => { expect(await alert.getProperty("embedded")).toBe(true); }); + + it("should not close when slotted panels are closed", async () => { + const page = await newE2EPage({ + html: html` + + `, + }); + await page.waitForChanges(); + + const closeButton = await page.find(`calcite-panel >>> #${PanelIDS.close}`); + + await closeButton.click(); + await page.waitForChanges(); + + const dialog = await page.find("calcite-dialog"); + expect(await dialog.getProperty("open")).toBe(true); + }); }); diff --git a/packages/calcite-components/src/components/dialog/dialog.tsx b/packages/calcite-components/src/components/dialog/dialog.tsx index 94760d6b5ba..d425e5a1bce 100644 --- a/packages/calcite-components/src/components/dialog/dialog.tsx +++ b/packages/calcite-components/src/components/dialog/dialog.tsx @@ -256,8 +256,8 @@ export class Dialog loading={this.loading} menuOpen={this.menuOpen} messageOverrides={this.messageOverrides} - onCalcitePanelClose={this.handleCloseClick} - onCalcitePanelScroll={this.handleScroll} + onCalcitePanelClose={this.handleInternalPanelCloseClick} + onCalcitePanelScroll={this.handleInternalPanelScroll} onKeyDown={this.handlePanelKeyDown} overlayPositioning={this.overlayPositioning} ref={(el) => (this.panelEl = el)} @@ -458,11 +458,21 @@ export class Dialog this.el.removeEventListener("calciteDialogOpen", this.openEnd); }; - private handleScroll = (): void => { + private handleInternalPanelScroll = (event: CustomEvent): void => { + if (event.target !== this.panelEl) { + return; + } + + event.stopPropagation(); this.calciteDialogScroll.emit(); }; - private handleCloseClick = (): void => { + private handleInternalPanelCloseClick = (event: CustomEvent): void => { + if (event.target !== this.panelEl) { + return; + } + + event.stopPropagation(); this.open = false; }; diff --git a/packages/calcite-components/src/components/flow-item/flow-item.e2e.ts b/packages/calcite-components/src/components/flow-item/flow-item.e2e.ts index de7141a3d79..78b53f29860 100644 --- a/packages/calcite-components/src/components/flow-item/flow-item.e2e.ts +++ b/packages/calcite-components/src/components/flow-item/flow-item.e2e.ts @@ -13,6 +13,7 @@ import { } from "../../tests/commonTests"; import { html } from "../../../support/formatting"; import { GlobalTestProps } from "../../tests/utils"; +import { IDS as PanelIDS } from "../panel/resources"; import { CSS, SLOTS } from "./resources"; type TestWindow = GlobalTestProps<{ @@ -237,11 +238,9 @@ describe("calcite-flow-item", () => { expect(await panel.getProperty("collapsed")).toBe(true); expect(await panel.getProperty("collapsible")).toBe(true); - await page.$eval("calcite-flow-item", (flowItem: HTMLCalciteFlowItemElement) => { - const panel = flowItem.shadowRoot.querySelector("calcite-panel"); - const toggleButton = panel.shadowRoot.querySelector("[data-test=collapse]") as HTMLCalciteActionElement; - toggleButton.click(); - }); + const collapseButton = await page.find(`calcite-flow-item >>> calcite-panel >>> #${PanelIDS.collapse}`); + await collapseButton.click(); + await page.waitForChanges(); await page.waitForChanges(); @@ -348,4 +347,21 @@ describe("calcite-flow-item", () => { expect(await alert.getProperty("embedded")).toBe(true); }); + + it("should not close when slotted panels are closed", async () => { + const page = await newE2EPage({ + html: html` + + `, + }); + await page.waitForChanges(); + + const closeButton = await page.find(`calcite-panel >>> #${PanelIDS.close}`); + + await closeButton.click(); + await page.waitForChanges(); + + const flowItem = await page.find("calcite-flow-item"); + expect(await flowItem.getProperty("closed")).toBe(false); + }); }); diff --git a/packages/calcite-components/src/components/flow-item/flow-item.tsx b/packages/calcite-components/src/components/flow-item/flow-item.tsx index 7e2db6151ce..efc8acc6ad8 100644 --- a/packages/calcite-components/src/components/flow-item/flow-item.tsx +++ b/packages/calcite-components/src/components/flow-item/flow-item.tsx @@ -295,18 +295,30 @@ export class FlowItem // // -------------------------------------------------------------------------- - handlePanelScroll = (event: CustomEvent): void => { + handleInternalPanelScroll = (event: CustomEvent): void => { + if (event.target !== this.containerEl) { + return; + } + event.stopPropagation(); this.calciteFlowItemScroll.emit(); }; - handlePanelClose = (event: CustomEvent): void => { + handleInternalPanelClose = (event: CustomEvent): void => { + if (event.target !== this.containerEl) { + return; + } + event.stopPropagation(); this.closed = true; this.calciteFlowItemClose.emit(); }; - handlePanelToggle = (event: CustomEvent): void => { + handleInternalPanelToggle = (event: CustomEvent): void => { + if (event.target !== this.containerEl) { + return; + } + event.stopPropagation(); this.collapsed = (event.target as HTMLCalcitePanelElement).collapsed; this.calciteFlowItemToggle.emit(); @@ -388,9 +400,9 @@ export class FlowItem loading={loading} menuOpen={menuOpen} messageOverrides={messages} - onCalcitePanelClose={this.handlePanelClose} - onCalcitePanelScroll={this.handlePanelScroll} - onCalcitePanelToggle={this.handlePanelToggle} + onCalcitePanelClose={this.handleInternalPanelClose} + onCalcitePanelScroll={this.handleInternalPanelScroll} + onCalcitePanelToggle={this.handleInternalPanelToggle} overlayPositioning={overlayPositioning} ref={this.setContainerRef} scale={this.scale} diff --git a/packages/calcite-components/src/components/panel/panel.e2e.ts b/packages/calcite-components/src/components/panel/panel.e2e.ts index 03896e1bad0..ae55ddf4774 100644 --- a/packages/calcite-components/src/components/panel/panel.e2e.ts +++ b/packages/calcite-components/src/components/panel/panel.e2e.ts @@ -13,7 +13,7 @@ import { t9n, } from "../../tests/commonTests"; import { GlobalTestProps } from "../../tests/utils"; -import { CSS, SLOTS } from "./resources"; +import { CSS, IDS, SLOTS } from "./resources"; type TestWindow = GlobalTestProps<{ beforeClose: () => Promise; @@ -186,7 +186,7 @@ describe("calcite-panel", () => { const element = await page.find("calcite-panel"); const container = await page.find(`calcite-panel >>> .${CSS.contentWrapper}`); - const collapseButtonSelector = `calcite-panel >>> [data-test="collapse"]`; + const collapseButtonSelector = `calcite-panel >>> #${IDS.collapse}`; expect(await page.find(collapseButtonSelector)).toBeNull(); await page.waitForChanges(); @@ -207,7 +207,7 @@ describe("calcite-panel", () => { const calcitePanelClose = await page.spyOnEvent("calcitePanelClose", "window"); - const closeButton = await page.find("calcite-panel >>> calcite-action[data-test=close]"); + const closeButton = await page.find(`calcite-panel >>> #${IDS.close}`); await closeButton.click(); @@ -221,7 +221,7 @@ describe("calcite-panel", () => { const calcitePanelToggle = await page.spyOnEvent("calcitePanelToggle", "window"); - const toggleButton = await page.find("calcite-panel >>> [data-test=collapse]"); + const toggleButton = await page.find(`calcite-panel >>> #${IDS.collapse}`); await toggleButton.click(); diff --git a/packages/calcite-components/src/components/panel/panel.tsx b/packages/calcite-components/src/components/panel/panel.tsx index 4459f80cf41..a376aea9b6a 100644 --- a/packages/calcite-components/src/components/panel/panel.tsx +++ b/packages/calcite-components/src/components/panel/panel.tsx @@ -45,7 +45,7 @@ import { OverlayPositioning } from "../../utils/floating-ui"; import { CollapseDirection } from "../interfaces"; import { Scale } from "../interfaces"; import { PanelMessages } from "./assets/panel/t9n"; -import { CSS, ICONS, SLOTS } from "./resources"; +import { CSS, ICONS, IDS, SLOTS } from "./resources"; /** * @slot - A slot for adding custom content. @@ -503,8 +503,8 @@ export class Panel