diff --git a/packages/calcite-components/src/components/input-time-zone/input-time-zone.e2e.ts b/packages/calcite-components/src/components/input-time-zone/input-time-zone.e2e.ts
index 38831b0757d..b037ae95233 100644
--- a/packages/calcite-components/src/components/input-time-zone/input-time-zone.e2e.ts
+++ b/packages/calcite-components/src/components/input-time-zone/input-time-zone.e2e.ts
@@ -18,6 +18,7 @@ import { TagAndPage } from "../../tests/commonTests/interfaces";
import { DEBOUNCE } from "../../utils/resources";
import { findAll } from "../../tests/utils/puppeteer";
import { mockConsole } from "../../tests/utils/logging";
+import { CSS as ComboboxCSS } from "../combobox/resources";
import { getCity, toUserFriendlyName } from "./utils";
/*
@@ -406,6 +407,34 @@ describe("calcite-input-time-zone", () => {
expect(await timeZoneItem.getProperty("textLabel")).toBe("New York, United States");
});
+ it("updates the label and shows selection immediately on user interaction", async () => {
+ const page = await newE2EPage();
+ await page.emulateTimezone(testTimeZoneItems[0].name);
+ await page.setContent(
+ // animation needed to reproduce update label delay
+ html``,
+ );
+ const input = await page.find("calcite-input-time-zone");
+ const openSpy = await input.spyOnEvent("calciteInputTimeZoneOpen");
+
+ const timeZoneScrollerSelector = `calcite-input-time-zone >>> calcite-combobox >>> .${ComboboxCSS.listContainer}`;
+
+ // we use page click to avoid the internal call to waitForChanges that E2EElement interaction APIs have
+ await page.click("calcite-input-time-zone");
+ const scrollTop = await page.$eval(timeZoneScrollerSelector, (el) => el.scrollTop);
+
+ await openSpy.next();
+
+ expect(scrollTop).toEqual(await page.$eval(timeZoneScrollerSelector, (el) => el.scrollTop));
+
+ const testTimeZoneItemSelector = "calcite-input-time-zone >>> calcite-combobox-item[data-label='New York']";
+
+ // we use page click to avoid the internal call to waitForChanges that E2EElement interaction APIs have
+ await page.click(testTimeZoneItemSelector);
+
+ expect(await page.$eval(testTimeZoneItemSelector, async (el) => el.textLabel)).toBe("New York, United States");
+ });
+
it("maps deprecated time zones to aliases", async () => {
const deprecatedTimeZone1 = "Asia/Calcutta";
const aliasTimeZone1 = "Asia/Kolkata";
diff --git a/packages/calcite-components/src/components/input-time-zone/input-time-zone.tsx b/packages/calcite-components/src/components/input-time-zone/input-time-zone.tsx
index f8ecec0b30f..6bca2860e31 100644
--- a/packages/calcite-components/src/components/input-time-zone/input-time-zone.tsx
+++ b/packages/calcite-components/src/components/input-time-zone/input-time-zone.tsx
@@ -372,23 +372,23 @@ export class InputTimeZone
* @param open
* @private
*/
- private overrideSelectedLabelForRegion(): void {
+ private overrideSelectedLabelForRegion(open: boolean): void {
if (this.mode !== "region" || !this.selectedTimeZoneItem) {
return;
}
- this.comboboxEl.selectedItems[0].textLabel = this.getItemLabel(this.selectedTimeZoneItem);
+ this.comboboxEl.selectedItems[0].textLabel = this.getItemLabel(this.selectedTimeZoneItem, open);
}
private onComboboxBeforeClose(event: CustomEvent): void {
event.stopPropagation();
- this.overrideSelectedLabelForRegion();
+ this.overrideSelectedLabelForRegion(false);
this.calciteInputTimeZoneBeforeClose.emit();
}
private onComboboxBeforeOpen(event: CustomEvent): void {
event.stopPropagation();
- this.overrideSelectedLabelForRegion();
+ this.overrideSelectedLabelForRegion(true);
this.calciteInputTimeZoneBeforeOpen.emit();
}
@@ -475,12 +475,12 @@ export class InputTimeZone
return value ? this.normalizer(value) : value;
}
- private getItemLabel(item: TimeZoneItem): string {
+ private getItemLabel(item: TimeZoneItem, open: boolean = this.open): string {
const selected = this.selectedTimeZoneItem === item;
const { label, metadata } = item;
- return !this.open && item.metadata.country && selected
- ? getSelectedRegionTimeZoneLabel(label, metadata.country, this.messages)
- : label;
+ return !metadata.country || open || !selected
+ ? label
+ : getSelectedRegionTimeZoneLabel(label, metadata.country, this.messages);
}
//#endregion
diff --git a/packages/calcite-components/src/utils/openCloseComponent.ts b/packages/calcite-components/src/utils/openCloseComponent.ts
index f83c26ac2a3..2448fe41963 100644
--- a/packages/calcite-components/src/utils/openCloseComponent.ts
+++ b/packages/calcite-components/src/utils/openCloseComponent.ts
@@ -55,6 +55,8 @@ function isOpen(component: OpenCloseComponent): boolean {
* @param component - OpenCloseComponent uses `open` prop to emit (before)open/close.
*/
export async function toggleOpenClose(component: OpenCloseComponent): Promise {
+ await component.updateComplete;
+
if (isOpen(component)) {
component.onBeforeOpen();
} else {