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
>