Skip to content

Commit f25d80e

Browse files
authored
fix(ui5-view-settings-dialog): initially focus first item in filter options
Fixes: #10555
1 parent 178f869 commit f25d80e

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

packages/fiori/cypress/specs/ViewSettingsDialog.cy.tsx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,4 +370,41 @@ describe("ViewSettingsDialog Tests", () => {
370370
cy.get("@vsd")
371371
.invoke("prop", "open", false);
372372
});
373+
374+
it("should focus first item in filter options", () => {
375+
cy.mount(
376+
<ViewSettingsDialog id="vsdFilter">
377+
<FilterItem slot="filterItems" text="Filter 1">
378+
<FilterItemOption id="focusedItem" slot="values" text="Some filter 1"></FilterItemOption>
379+
<FilterItemOption slot="values" text="Some filter 2"></FilterItemOption>
380+
<FilterItemOption slot="values" text="Some filter 3"></FilterItemOption>
381+
</FilterItem>
382+
<FilterItem slot="filterItems" text="Filter 2">
383+
<FilterItemOption slot="values" text="Some filter 4"></FilterItemOption>
384+
<FilterItemOption slot="values" text="Some filter 5"></FilterItemOption>
385+
<FilterItemOption slot="values" text="Some filter 6"></FilterItemOption>
386+
</FilterItem>
387+
</ViewSettingsDialog>
388+
);
389+
390+
cy.get("#vsdFilter")
391+
.as("vsd");
392+
393+
cy.get("@vsd")
394+
.invoke("prop", "open", true);
395+
396+
cy.get("@vsd")
397+
.shadow()
398+
.find("[ui5-li]")
399+
.first()
400+
.shadow()
401+
.find("span[part=title]")
402+
.realClick();
403+
404+
cy.get("@vsd")
405+
.shadow()
406+
.find("[ui5-li]")
407+
.first()
408+
.should("be.focused");
409+
});
373410
});

packages/fiori/src/ViewSettingsDialog.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
33
import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
44
import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
55
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
6+
import query from "@ui5/webcomponents-base/dist/decorators/query.js";
67
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
78
import { isPhone } from "@ui5/webcomponents-base/dist/Device.js";
89
import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
@@ -13,6 +14,7 @@ import type List from "@ui5/webcomponents/dist/List.js";
1314
import type { ListItemClickEventDetail, ListSelectionChangeEventDetail } from "@ui5/webcomponents/dist/List.js";
1415
import announce from "@ui5/webcomponents-base/dist/util/InvisibleMessage.js";
1516
import InvisibleMessageMode from "@ui5/webcomponents-base/dist/types/InvisibleMessageMode.js";
17+
import { renderFinished } from "@ui5/webcomponents-base/dist/Render.js";
1618

1719
import ViewSettingsDialogMode from "./types/ViewSettingsDialogMode.js";
1820
import "@ui5/webcomponents-icons/dist/sort.js";
@@ -248,6 +250,9 @@ class ViewSettingsDialog extends UI5Element {
248250
@slot()
249251
filterItems!: Array<FilterItem>;
250252

253+
@query("[ui5-list]")
254+
_list!: List;
255+
251256
_dialog?: Dialog;
252257
_sortOrder?: List;
253258
_sortBy?: List;
@@ -265,6 +270,14 @@ class ViewSettingsDialog extends UI5Element {
265270
}
266271
}
267272

273+
onAfterRendering() {
274+
if (this.isModeFilter) {
275+
renderFinished().then(() => {
276+
this._list?.focusFirstItem();
277+
});
278+
}
279+
}
280+
268281
onInvalidation(changeInfo: ChangeInfo) {
269282
if (changeInfo.type === "slot") {
270283
this._confirmedSettings = this._settings;
@@ -506,7 +519,7 @@ class ViewSettingsDialog extends UI5Element {
506519
}
507520

508521
afterDialogOpen(): void {
509-
this._dialog?.querySelector<List>("[ui5-list]")?.focusFirstItem();
522+
this._list?.focusFirstItem();
510523

511524
this._focusRecentlyUsedControl();
512525

0 commit comments

Comments
 (0)