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