This is an automated email from the ASF dual-hosted git repository.

bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new cd1f0e66277 Keep date-only range ends inclusive (#72860)
cd1f0e66277 is described below

commit cd1f0e66277fddca9003ba1c615a6c4ba69f30c9
Author: Lin Junrong <[email protected]>
AuthorDate: Sat Sep 19 02:37:15 2026 +0800

    Keep date-only range ends inclusive (#72860)
---
 .../FilterBar/filters/DateRangeFilter.test.tsx     | 27 ++++++++++++++++++++++
 .../src/airflow/ui/src/hooks/useDateRangeFilter.ts | 10 ++++++--
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git 
a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeFilter.test.tsx
 
b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeFilter.test.tsx
index 6e2de0f8763..6ee49836dd4 100644
--- 
a/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeFilter.test.tsx
+++ 
b/airflow-core/src/airflow/ui/src/components/FilterBar/filters/DateRangeFilter.test.tsx
@@ -148,6 +148,33 @@ describe("DateRangeFilter", () => {
     cleanup();
   });
 
+  it("includes the whole end date when its time is empty", async () => {
+    const onChange = vi.fn();
+
+    renderFilter({ ...defaultProps, onChange });
+    const { endDateInput } = getInputs();
+
+    changeDateInput(endDateInput, "2024/01/15");
+
+    await waitFor(() => {
+      expect(onChange).toHaveBeenLastCalledWith({
+        endDate: "2024-01-15T23:59:59.999Z",
+        startDate: undefined,
+      });
+    });
+  });
+
+  it("accepts a start time on the end date when the end time is empty", async 
() => {
+    renderFilter();
+    const { endDateInput, startDateInput, startTimeInput } = getInputs();
+
+    changeDateInput(startDateInput, "2024/01/15");
+    changeTimeInput(startTimeInput, "10:00");
+    changeDateInput(endDateInput, "2024/01/15");
+
+    await waitForNoError("Start date/time must be before end date/time");
+  });
+
   describe("Input Validation", () => {
     it("validates date and time formats", async () => {
       renderFilter();
diff --git a/airflow-core/src/airflow/ui/src/hooks/useDateRangeFilter.ts 
b/airflow-core/src/airflow/ui/src/hooks/useDateRangeFilter.ts
index ed707c2663c..b061fc1b41a 100644
--- a/airflow-core/src/airflow/ui/src/hooks/useDateRangeFilter.ts
+++ b/airflow-core/src/airflow/ui/src/hooks/useDateRangeFilter.ts
@@ -189,7 +189,10 @@ export const useDateRangeFilter = ({ onChange, translate, 
value }: UseDateRangeF
       const startDateTime = combineDateAndTime(inputs.start, inputs.startTime, 
{
         timezone: selectedTimezone,
       });
-      const endDateTime = combineDateAndTime(inputs.end, inputs.endTime, { 
timezone: selectedTimezone });
+      const endDateTime = combineDateAndTime(inputs.end, inputs.endTime, {
+        endOfDay: true,
+        timezone: selectedTimezone,
+      });
 
       if (Boolean(startDateTime) && Boolean(endDateTime) && 
!validateDateRange(startDateTime, endDateTime)) {
         errors.push({
@@ -276,7 +279,10 @@ export const useDateRangeFilter = ({ onChange, translate, 
value }: UseDateRangeF
         const timeStr = field === "start" ? newInputs.startTime : 
newInputs.endTime;
 
         if (dayjs(dateStr, DATE_INPUT_FORMAT, true).isValid()) {
-          const combinedDateTime = combineDateAndTime(dateStr, timeStr, { 
timezone: selectedTimezone });
+          const combinedDateTime = combineDateAndTime(dateStr, timeStr, {
+            endOfDay: field === "end",
+            timezone: selectedTimezone,
+          });
 
           if (Boolean(combinedDateTime)) {
             onChange({

Reply via email to