From 55491602ab32feb0db66c413a409bb82b8824b6d Mon Sep 17 00:00:00 2001 From: Sergei Burkatskii <5622446+sjbur@users.noreply.github.com> Date: Thu, 20 Aug 2026 15:49:28 +0200 Subject: [PATCH 1/2] fix: fix bug --- .../resizing/get_delta_time.test.ts | 2 +- .../scheduler/appointments/resizing/m_core.ts | 2 +- .../js/__internal/scheduler/m_subscribes.ts | 9 +++--- .../steps/expand_all_day.test.ts | 30 ++++++++++++------- .../steps/expand_all_day.ts | 4 +++ 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/appointments/resizing/get_delta_time.test.ts b/packages/devextreme/js/__internal/scheduler/appointments/resizing/get_delta_time.test.ts index e07a51c9abf0..105231ccc356 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/resizing/get_delta_time.test.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/resizing/get_delta_time.test.ts @@ -70,7 +70,7 @@ describe('getDeltaTime', () => { }); ['timelineDay', 'timelineWeek', 'timelineWorkWeek'].forEach((view) => { - it(`should return zero for not resized appointment in horizontal ${view} view`, () => { + it(`should return cell duration delta for resized appointment in horizontal ${view} view`, () => { expect(getDeltaTime( { width: 50, height: 100 }, { width: 100, height: 100 }, diff --git a/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts b/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts index a235bc0515b4..973229e1601c 100644 --- a/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts +++ b/packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts @@ -31,7 +31,7 @@ const getCellData = ( // NOTE: All day appointments occupy day if they start at the beginning of the day, // but long appointments are not. So for all day appointments endDate === startDate, // for long appointments endDate = startDate + 1 day. - if (!isAllDay) { + if (!isAllDay && isOccupiedAllDay) { cellData.endDate = dateUtilsTs.addOffsets(cellData.startDate, toMs('day')); } diff --git a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts index 93f5f76ba0ea..1b56b6bd196f 100644 --- a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts +++ b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts @@ -25,11 +25,10 @@ const isAllDay = ( ): boolean => { const adapter = new AppointmentAdapter(appointmentData, scheduler._dataAccessors); - if (VERTICAL_VIEW_TYPES.includes(scheduler.currentView.type)) { - return isAppointmentTakesAllDay(adapter, scheduler.option('allDayPanelMode')); - } - - return adapter.allDay; + return isAppointmentTakesAllDay( + adapter, + scheduler.getViewOption('allDayPanelMode'), + ); }; const subscribes = { diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts index 789c5eec5e6a..dea7e4fd9b89 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts @@ -98,13 +98,9 @@ describe('expandAllDay', () => { ]); }); - it('should set +1 day from end date to all day appointment', () => { + it('should keep dates of all day appointment with duration', () => { expect(expandAllDayRegularPanel([ { - allDay: true, - startDateUTC: Date.UTC(2020, 0, 10), - endDateUTC: Date.UTC(2020, 0, 10), - }, { allDay: true, startDateUTC: Date.UTC(2020, 0, 10, 4), endDateUTC: Date.UTC(2020, 0, 11, 5), @@ -115,17 +111,29 @@ describe('expandAllDay', () => { }, ])).toEqual([ { - allDay: true, - startDateUTC: Date.UTC(2020, 0, 10), - endDateUTC: Date.UTC(2020, 0, 11), - }, { allDay: true, startDateUTC: Date.UTC(2020, 0, 10, 4), - endDateUTC: Date.UTC(2020, 0, 12, 4), + endDateUTC: Date.UTC(2020, 0, 11, 5), }, { allDay: true, startDateUTC: Date.UTC(2020, 0, 11, 23), - endDateUTC: Date.UTC(2020, 0, 13, 23), + endDateUTC: Date.UTC(2020, 0, 12), + }, + ]); + }); + + it('should set +1 day from end date to zero-duration all day appointment', () => { + expect(expandAllDayRegularPanel([ + { + allDay: true, + startDateUTC: Date.UTC(2020, 0, 10), + endDateUTC: Date.UTC(2020, 0, 10), + }, + ])).toEqual([ + { + allDay: true, + startDateUTC: Date.UTC(2020, 0, 10), + endDateUTC: Date.UTC(2020, 0, 11), }, ]); }); diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts index 99c414167557..1729607cf32d 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts @@ -79,6 +79,10 @@ export const expandAllDayRegularPanel = entity.startDateUTC) { + return entity; + } + const startDate = new Date(entity.startDateUTC); const endDate = new Date(entity.endDateUTC); endDate.setDate(endDate.getDate() + 1); From 98ace8572db081be3f8841bcee9e8afba7c32978 Mon Sep 17 00:00:00 2001 From: Sergei Burkatskii <5622446+sjbur@users.noreply.github.com> Date: Thu, 20 Aug 2026 16:21:43 +0200 Subject: [PATCH 2/2] fix: return old behavior for alLDay in timeline --- .../js/__internal/scheduler/m_subscribes.ts | 4 ++++ .../generate_grid_view_model.ts | 3 ++- .../steps/expand_all_day.test.ts | 24 +++++++++++++++++++ .../steps/expand_all_day.ts | 3 ++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts index 1b56b6bd196f..408a9b717549 100644 --- a/packages/devextreme/js/__internal/scheduler/m_subscribes.ts +++ b/packages/devextreme/js/__internal/scheduler/m_subscribes.ts @@ -25,6 +25,10 @@ const isAllDay = ( ): boolean => { const adapter = new AppointmentAdapter(appointmentData, scheduler._dataAccessors); + if (!VERTICAL_VIEW_TYPES.includes(scheduler.currentView.type)) { + return adapter.allDay; + } + return isAppointmentTakesAllDay( adapter, scheduler.getViewOption('allDayPanelMode'), diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/generate_grid_view_model.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/generate_grid_view_model.ts index b3d23b419944..eebe41bb1b93 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/generate_grid_view_model.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/generate_grid_view_model.ts @@ -22,6 +22,7 @@ export const sortAppointments = ( ): SortedEntity[] => { const { isMonthView, + isTimelineView, hasAllDayPanel, snapToCellsMode, viewOffset, @@ -35,7 +36,7 @@ export const sortAppointments = ( sortByStartDate(group); const innerStep0 = isMonthView || panelName === 'allDayPanel' ? expandAllDayAllDayPanel(group, endDayHour, viewOffset) - : expandAllDayRegularPanel(group); + : expandAllDayRegularPanel(group, isTimelineView); const innerStep1 = splitByParts(innerStep0, optionManager.getSplitIntervals(panelName)); sortByDuration(innerStep1); sortByStartDate(innerStep1); diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts index dea7e4fd9b89..9efa53d55964 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.test.ts @@ -122,6 +122,30 @@ describe('expandAllDay', () => { ]); }); + it('should expand all day appointment with duration on timeline view', () => { + expect(expandAllDayRegularPanel([ + { + allDay: true, + startDateUTC: Date.UTC(2020, 0, 10, 4), + endDateUTC: Date.UTC(2020, 0, 11, 5), + }, { + allDay: true, + startDateUTC: Date.UTC(2020, 0, 11, 23), + endDateUTC: Date.UTC(2020, 0, 12), + }, + ], true)).toEqual([ + { + allDay: true, + startDateUTC: Date.UTC(2020, 0, 10, 4), + endDateUTC: Date.UTC(2020, 0, 12, 4), + }, { + allDay: true, + startDateUTC: Date.UTC(2020, 0, 11, 23), + endDateUTC: Date.UTC(2020, 0, 13, 23), + }, + ]); + }); + it('should set +1 day from end date to zero-duration all day appointment', () => { expect(expandAllDayRegularPanel([ { diff --git a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts index 1729607cf32d..e8b1b39bfda9 100644 --- a/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts +++ b/packages/devextreme/js/__internal/scheduler/view_model/generate_view_model/steps/expand_all_day.ts @@ -74,12 +74,13 @@ export const expandAllDayAllDayPanel = >( entities: T[], + isTimelineView = false, ): T[] => entities.map((entity) => { if (!entity.allDay) { return entity; } - if (entity.endDateUTC > entity.startDateUTC) { + if (!isTimelineView && entity.endDateUTC > entity.startDateUTC) { return entity; }