diff --git a/packages/pluggableWidgets/datagrid-number-filter-web/CHANGELOG.md b/packages/pluggableWidgets/datagrid-number-filter-web/CHANGELOG.md index 28c4810ba2..7eba1b081e 100644 --- a/packages/pluggableWidgets/datagrid-number-filter-web/CHANGELOG.md +++ b/packages/pluggableWidgets/datagrid-number-filter-web/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed - We fixed an issue with filter selector dropdown not choosing the best placement on small viewports. +- We fixed an issue where selecting Empty or Not empty could cause keyboard focus to jump away from the filter controls. ## [3.9.0] - 2026-03-23 diff --git a/packages/pluggableWidgets/datagrid-number-filter-web/src/components/__tests__/DatagridNumberFilter.spec.tsx b/packages/pluggableWidgets/datagrid-number-filter-web/src/components/__tests__/DatagridNumberFilter.spec.tsx index a8d8259b93..49162749d0 100644 --- a/packages/pluggableWidgets/datagrid-number-filter-web/src/components/__tests__/DatagridNumberFilter.spec.tsx +++ b/packages/pluggableWidgets/datagrid-number-filter-web/src/components/__tests__/DatagridNumberFilter.spec.tsx @@ -1,9 +1,14 @@ +import "@testing-library/jest-dom"; +import { act, render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Big } from "big.js"; +import { resetIdCounter } from "downshift"; +import { AttributeMetaData } from "mendix"; +import { createContext } from "react"; import { requirePlugin } from "@mendix/widget-plugin-external-events/plugin"; import { FilterAPI } from "@mendix/widget-plugin-filtering/context"; +import { NumberInputFilterStore } from "@mendix/widget-plugin-filtering/stores/input/NumberInputFilterStore"; import { ObservableFilterHost } from "@mendix/widget-plugin-filtering/typings/ObservableFilterHost"; -import "@testing-library/jest-dom"; -import { AttributeMetaData } from "mendix"; - import { actionValue, dynamic, @@ -11,13 +16,6 @@ import { EditableValueBuilder, ListAttributeValueBuilder } from "@mendix/widget-plugin-test-utils"; -import { act, render, screen, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { createContext } from "react"; - -import { NumberInputFilterStore } from "@mendix/widget-plugin-filtering/stores/input/NumberInputFilterStore"; -import { Big } from "big.js"; -import { resetIdCounter } from "downshift"; import { DatagridNumberFilterContainerProps } from "../../../typings/DatagridNumberFilterProps"; import DatagridNumberFilter from "../../DatagridNumberFilter"; diff --git a/packages/pluggableWidgets/datagrid-text-filter-web/CHANGELOG.md b/packages/pluggableWidgets/datagrid-text-filter-web/CHANGELOG.md index 3855586f78..e591e04c14 100644 --- a/packages/pluggableWidgets/datagrid-text-filter-web/CHANGELOG.md +++ b/packages/pluggableWidgets/datagrid-text-filter-web/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed - We fixed an issue with filter selector dropdown not choosing the best placement on small viewports. +- We fixed an issue where selecting Empty or Not empty could cause keyboard focus to jump away from the filter controls. ## [3.8.1] - 2026-02-19 diff --git a/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/DatagridTextFilter.spec.tsx b/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/DatagridTextFilter.spec.tsx index 07e9eda2eb..a35183e18d 100644 --- a/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/DatagridTextFilter.spec.tsx +++ b/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/DatagridTextFilter.spec.tsx @@ -1,5 +1,3 @@ -import { FilterAPI } from "@mendix/widget-plugin-filtering/context"; -import { ObservableFilterHost } from "@mendix/widget-plugin-filtering/typings/ObservableFilterHost"; import "@testing-library/jest-dom"; import { act, render, screen } from "@testing-library/react"; @@ -8,7 +6,9 @@ import { resetIdCounter } from "downshift"; import { AttributeMetaData } from "mendix"; import { createContext } from "react"; import { requirePlugin } from "@mendix/widget-plugin-external-events/plugin"; +import { FilterAPI } from "@mendix/widget-plugin-filtering/context"; import { StringInputFilterStore } from "@mendix/widget-plugin-filtering/stores/input/StringInputFilterStore"; +import { ObservableFilterHost } from "@mendix/widget-plugin-filtering/typings/ObservableFilterHost"; import { actionValue, dynamicValue, @@ -237,6 +237,19 @@ describe("Text Filter", () => { expect(attribute.setValue).toHaveBeenLastCalledWith(undefined); }); + it("keeps focus in filter controls when empty operator is selected", async () => { + render(); + + const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); + const triggerButton = screen.getByRole("combobox", { name: "Equal" }); + + await user.click(triggerButton); + await user.click(screen.getByRole("option", { name: "Empty" })); + + expect(screen.getByRole("textbox")).toBeDisabled(); + expect(document.body).not.toHaveFocus(); + }); + afterAll(() => { (window as any)["com.mendix.widgets.web.filterable.filterContext.v2"] = undefined; }); diff --git a/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/__snapshots__/DatagridTextFilter.spec.tsx.snap b/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/__snapshots__/DatagridTextFilter.spec.tsx.snap index 50588890cb..30aaec487e 100644 --- a/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/__snapshots__/DatagridTextFilter.spec.tsx.snap +++ b/packages/pluggableWidgets/datagrid-text-filter-web/src/components/__tests__/__snapshots__/DatagridTextFilter.spec.tsx.snap @@ -14,12 +14,12 @@ exports[`Text Filter with single instance with multiple attributes renders corre >