Skip to content

Commit 8f03909

Browse files
aleksei-semikozovsjburarman-boyakhchyan
authored
Scheduler — Add hiddenDays option to hide arbitrary days of the week (#33188)
Signed-off-by: Sergei Burkatskii <sergei.burkatskii@devexpress.com> Co-authored-by: Sergio Bur <sjbur.dev@gmail.com> Co-authored-by: Sergei Burkatskii <sergei.burkatskii@devexpress.com> Co-authored-by: Arman Boyakhchyan <arman.boyakhchyan@devexpress.com>
1 parent 4df9dd6 commit 8f03909

51 files changed

Lines changed: 1261 additions & 225 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import type { Meta, StoryObj } from "@storybook/react-webpack5";
2+
import dxScheduler from "devextreme/ui/scheduler";
3+
import { wrapDxWithReact } from "../utils";
4+
import { data, resources } from "./data";
5+
6+
const Scheduler = wrapDxWithReact(dxScheduler);
7+
8+
const viewNames = ['day', 'week', 'workWeek', 'month', 'agenda', 'timelineDay', 'timelineWeek', 'timelineWorkWeek', 'timelineMonth'];
9+
10+
const meta: Meta<typeof Scheduler> = {
11+
title: 'Components/Scheduler/HiddenWeekDays',
12+
component: Scheduler,
13+
parameters: { layout: 'padded' },
14+
};
15+
16+
export default meta;
17+
18+
type Story = StoryObj<typeof Scheduler>;
19+
20+
export const Overview: Story = {
21+
args: {
22+
height: 600,
23+
views: viewNames,
24+
currentView: 'week',
25+
currentDate: new Date(2021, 3, 26),
26+
firstDayOfWeek: 0,
27+
startDayHour: 9,
28+
endDayHour: 22,
29+
dataSource: data,
30+
resources,
31+
hiddenWeekDays: [],
32+
},
33+
argTypes: {
34+
height: { control: 'number' },
35+
views: { control: 'object' },
36+
hiddenWeekDays: { control: 'object' },
37+
currentView: { control: 'select', options: viewNames },
38+
},
39+
};

packages/devextreme-angular/src/ui/scheduler/index.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424

2525
import type dxSortable from 'devextreme/ui/sortable';
2626
import type dxDraggable from 'devextreme/ui/draggable';
27-
import type { default as dxScheduler, AllDayPanelMode, ViewType, dxSchedulerAppointment, AppointmentFormProperties, CellAppointmentsLimit, AppointmentAddedEvent, AppointmentAddingEvent, AppointmentClickEvent, AppointmentContextMenuEvent, AppointmentDblClickEvent, AppointmentDeletedEvent, AppointmentDeletingEvent, AppointmentFormOpeningEvent, AppointmentRenderedEvent, AppointmentTooltipShowingEvent, AppointmentUpdatedEvent, AppointmentUpdatingEvent, CellClickEvent, CellContextMenuEvent, ContentReadyEvent, DisposingEvent, InitializedEvent, OptionChangedEvent, RecurrenceEditMode, dxSchedulerScrolling, SnapToCellsMode, dxSchedulerToolbar } from 'devextreme/ui/scheduler';
27+
import type { default as dxScheduler, AllDayPanelMode, ViewType, dxSchedulerAppointment, AppointmentFormProperties, DayOfWeek, CellAppointmentsLimit, AppointmentAddedEvent, AppointmentAddingEvent, AppointmentClickEvent, AppointmentContextMenuEvent, AppointmentDblClickEvent, AppointmentDeletedEvent, AppointmentDeletingEvent, AppointmentFormOpeningEvent, AppointmentRenderedEvent, AppointmentTooltipShowingEvent, AppointmentUpdatedEvent, AppointmentUpdatingEvent, CellClickEvent, CellContextMenuEvent, ContentReadyEvent, DisposingEvent, InitializedEvent, OptionChangedEvent, RecurrenceEditMode, dxSchedulerScrolling, SnapToCellsMode, dxSchedulerToolbar } from 'devextreme/ui/scheduler';
2828
import type { event } from 'devextreme/events/events.types';
2929
import type { default as DataSource, DataSourceOptions } from 'devextreme/data/data_source';
3030
import type { Store } from 'devextreme/data/store';
@@ -514,6 +514,16 @@ export class DxSchedulerComponent extends DxComponent implements OnDestroy, OnCh
514514
}
515515

516516

517+
518+
@Input()
519+
get hiddenWeekDays(): Array<DayOfWeek> {
520+
return this._getOption('hiddenWeekDays');
521+
}
522+
set hiddenWeekDays(value: Array<DayOfWeek>) {
523+
this._setOption('hiddenWeekDays', value);
524+
}
525+
526+
517527
/**
518528
* [descr:WidgetOptions.hint]
519529
@@ -893,10 +903,10 @@ export class DxSchedulerComponent extends DxComponent implements OnDestroy, OnCh
893903
894904
*/
895905
@Input()
896-
get views(): Array<Record<string, any> | string> | { agendaDuration?: number, allDayPanelMode?: AllDayPanelMode, appointmentCollectorTemplate?: any, appointmentTemplate?: any, appointmentTooltipTemplate?: any, cellDuration?: number, dataCellTemplate?: any, dateCellTemplate?: any, endDayHour?: number, firstDayOfWeek?: FirstDayOfWeek | undefined, groupByDate?: boolean, groupOrientation?: Orientation, groups?: Array<string>, intervalCount?: number, maxAppointmentsPerCell?: CellAppointmentsLimit | number, name?: string | undefined, offset?: number, resourceCellTemplate?: any, scrolling?: dxSchedulerScrolling, snapToCellsMode?: SnapToCellsMode, startDate?: Date | number | string | undefined, startDayHour?: number, timeCellTemplate?: any, type?: undefined | ViewType }[] {
906+
get views(): Array<Record<string, any> | string> | { agendaDuration?: number, allDayPanelMode?: AllDayPanelMode, appointmentCollectorTemplate?: any, appointmentTemplate?: any, appointmentTooltipTemplate?: any, cellDuration?: number, dataCellTemplate?: any, dateCellTemplate?: any, endDayHour?: number, firstDayOfWeek?: FirstDayOfWeek | undefined, groupByDate?: boolean, groupOrientation?: Orientation, groups?: Array<string>, hiddenWeekDays?: Array<DayOfWeek>, intervalCount?: number, maxAppointmentsPerCell?: CellAppointmentsLimit | number, name?: string | undefined, offset?: number, resourceCellTemplate?: any, scrolling?: dxSchedulerScrolling, snapToCellsMode?: SnapToCellsMode, startDate?: Date | number | string | undefined, startDayHour?: number, timeCellTemplate?: any, type?: undefined | ViewType }[] {
897907
return this._getOption('views');
898908
}
899-
set views(value: Array<Record<string, any> | string> | { agendaDuration?: number, allDayPanelMode?: AllDayPanelMode, appointmentCollectorTemplate?: any, appointmentTemplate?: any, appointmentTooltipTemplate?: any, cellDuration?: number, dataCellTemplate?: any, dateCellTemplate?: any, endDayHour?: number, firstDayOfWeek?: FirstDayOfWeek | undefined, groupByDate?: boolean, groupOrientation?: Orientation, groups?: Array<string>, intervalCount?: number, maxAppointmentsPerCell?: CellAppointmentsLimit | number, name?: string | undefined, offset?: number, resourceCellTemplate?: any, scrolling?: dxSchedulerScrolling, snapToCellsMode?: SnapToCellsMode, startDate?: Date | number | string | undefined, startDayHour?: number, timeCellTemplate?: any, type?: undefined | ViewType }[]) {
909+
set views(value: Array<Record<string, any> | string> | { agendaDuration?: number, allDayPanelMode?: AllDayPanelMode, appointmentCollectorTemplate?: any, appointmentTemplate?: any, appointmentTooltipTemplate?: any, cellDuration?: number, dataCellTemplate?: any, dateCellTemplate?: any, endDayHour?: number, firstDayOfWeek?: FirstDayOfWeek | undefined, groupByDate?: boolean, groupOrientation?: Orientation, groups?: Array<string>, hiddenWeekDays?: Array<DayOfWeek>, intervalCount?: number, maxAppointmentsPerCell?: CellAppointmentsLimit | number, name?: string | undefined, offset?: number, resourceCellTemplate?: any, scrolling?: dxSchedulerScrolling, snapToCellsMode?: SnapToCellsMode, startDate?: Date | number | string | undefined, startDayHour?: number, timeCellTemplate?: any, type?: undefined | ViewType }[]) {
900910
this._setOption('views', value);
901911
}
902912

@@ -1273,6 +1283,13 @@ export class DxSchedulerComponent extends DxComponent implements OnDestroy, OnCh
12731283
*/
12741284
@Output() heightChange: EventEmitter<number | string | undefined>;
12751285

1286+
/**
1287+
1288+
* This member supports the internal infrastructure and is not intended to be used directly from your code.
1289+
1290+
*/
1291+
@Output() hiddenWeekDaysChange: EventEmitter<Array<DayOfWeek>>;
1292+
12761293
/**
12771294
12781295
* This member supports the internal infrastructure and is not intended to be used directly from your code.
@@ -1481,7 +1498,7 @@ export class DxSchedulerComponent extends DxComponent implements OnDestroy, OnCh
14811498
* This member supports the internal infrastructure and is not intended to be used directly from your code.
14821499
14831500
*/
1484-
@Output() viewsChange: EventEmitter<Array<Record<string, any> | string> | { agendaDuration?: number, allDayPanelMode?: AllDayPanelMode, appointmentCollectorTemplate?: any, appointmentTemplate?: any, appointmentTooltipTemplate?: any, cellDuration?: number, dataCellTemplate?: any, dateCellTemplate?: any, endDayHour?: number, firstDayOfWeek?: FirstDayOfWeek | undefined, groupByDate?: boolean, groupOrientation?: Orientation, groups?: Array<string>, intervalCount?: number, maxAppointmentsPerCell?: CellAppointmentsLimit | number, name?: string | undefined, offset?: number, resourceCellTemplate?: any, scrolling?: dxSchedulerScrolling, snapToCellsMode?: SnapToCellsMode, startDate?: Date | number | string | undefined, startDayHour?: number, timeCellTemplate?: any, type?: undefined | ViewType }[]>;
1501+
@Output() viewsChange: EventEmitter<Array<Record<string, any> | string> | { agendaDuration?: number, allDayPanelMode?: AllDayPanelMode, appointmentCollectorTemplate?: any, appointmentTemplate?: any, appointmentTooltipTemplate?: any, cellDuration?: number, dataCellTemplate?: any, dateCellTemplate?: any, endDayHour?: number, firstDayOfWeek?: FirstDayOfWeek | undefined, groupByDate?: boolean, groupOrientation?: Orientation, groups?: Array<string>, hiddenWeekDays?: Array<DayOfWeek>, intervalCount?: number, maxAppointmentsPerCell?: CellAppointmentsLimit | number, name?: string | undefined, offset?: number, resourceCellTemplate?: any, scrolling?: dxSchedulerScrolling, snapToCellsMode?: SnapToCellsMode, startDate?: Date | number | string | undefined, startDayHour?: number, timeCellTemplate?: any, type?: undefined | ViewType }[]>;
14851502

14861503
/**
14871504
@@ -1557,6 +1574,7 @@ export class DxSchedulerComponent extends DxComponent implements OnDestroy, OnCh
15571574
{ emit: 'groupByDateChange' },
15581575
{ emit: 'groupsChange' },
15591576
{ emit: 'heightChange' },
1577+
{ emit: 'hiddenWeekDaysChange' },
15601578
{ emit: 'hintChange' },
15611579
{ emit: 'indicatorUpdateIntervalChange' },
15621580
{ emit: 'maxChange' },
@@ -1609,6 +1627,7 @@ export class DxSchedulerComponent extends DxComponent implements OnDestroy, OnCh
16091627
super.ngOnChanges(changes);
16101628
this.setupChanges('dataSource', changes);
16111629
this.setupChanges('groups', changes);
1630+
this.setupChanges('hiddenWeekDays', changes);
16121631
this.setupChanges('resources', changes);
16131632
this.setupChanges('selectedCellData', changes);
16141633
this.setupChanges('views', changes);
@@ -1623,6 +1642,7 @@ export class DxSchedulerComponent extends DxComponent implements OnDestroy, OnCh
16231642
ngDoCheck() {
16241643
this._idh.doCheck('dataSource');
16251644
this._idh.doCheck('groups');
1645+
this._idh.doCheck('hiddenWeekDays');
16261646
this._idh.doCheck('resources');
16271647
this._idh.doCheck('selectedCellData');
16281648
this._idh.doCheck('views');

packages/devextreme-angular/src/ui/scheduler/nested/view-dxi.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212

1313

1414

15-
import type { AllDayPanelMode, CellAppointmentsLimit, dxSchedulerScrolling, SnapToCellsMode, ViewType } from 'devextreme/ui/scheduler';
15+
import type { AllDayPanelMode, DayOfWeek, CellAppointmentsLimit, dxSchedulerScrolling, SnapToCellsMode, ViewType } from 'devextreme/ui/scheduler';
1616
import type { FirstDayOfWeek, Orientation } from 'devextreme/common';
1717

1818
import {
@@ -141,6 +141,14 @@ export class DxiSchedulerViewComponent extends CollectionNestedOption {
141141
this._setOption('groups', value);
142142
}
143143

144+
@Input()
145+
get hiddenWeekDays(): Array<DayOfWeek> {
146+
return this._getOption('hiddenWeekDays');
147+
}
148+
set hiddenWeekDays(value: Array<DayOfWeek>) {
149+
this._setOption('hiddenWeekDays', value);
150+
}
151+
144152
@Input()
145153
get intervalCount(): number {
146154
return this._getOption('intervalCount');

packages/devextreme-metadata/make-angular-metadata.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ Ng.makeMetadata({
6565
removeMembers(/\/scheduler:dxSchedulerOptions\.editing\.popup/),
6666
removeMembers(/\/scheduler:dxSchedulerOptions\.resources\.icon/),
6767
removeMembers(/\/scheduler:.*\.snapToCellsMode/),
68+
removeMembers(/\/scheduler:.*\.hiddenWeekDays/),
6869
removeMembers(/\/stepper:/),
6970
removeMembers(/\/speech_to_text:/),
7071
removeMembers(/\/tree_list:dxTreeListColumnButton.onClick/),

packages/devextreme-react/src/scheduler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import dxScheduler, {
88
import { Component as BaseComponent, IHtmlOptions, ComponentRef, NestedComponentMeta } from "./core/component";
99
import NestedOption from "./core/nested-option";
1010

11-
import type { ViewType, AppointmentAddedEvent, AppointmentAddingEvent, AppointmentClickEvent, AppointmentContextMenuEvent, AppointmentDblClickEvent, AppointmentDeletedEvent, AppointmentDeletingEvent, AppointmentFormOpeningEvent, AppointmentRenderedEvent, AppointmentTooltipShowingEvent, AppointmentUpdatedEvent, AppointmentUpdatingEvent, CellClickEvent, CellContextMenuEvent, ContentReadyEvent, DisposingEvent, InitializedEvent, AppointmentFormProperties, AppointmentFormIconsShowMode, SchedulerPredefinedToolbarItem, DateNavigatorItemProperties, SchedulerPredefinedDateNavigatorItem, dxSchedulerToolbarItem, AllDayPanelMode, AppointmentCollectorTemplateData, AppointmentTemplateData, AppointmentTooltipTemplateData, CellAppointmentsLimit, dxSchedulerScrolling, SnapToCellsMode } from "devextreme/ui/scheduler";
11+
import type { ViewType, AppointmentAddedEvent, AppointmentAddingEvent, AppointmentClickEvent, AppointmentContextMenuEvent, AppointmentDblClickEvent, AppointmentDeletedEvent, AppointmentDeletingEvent, AppointmentFormOpeningEvent, AppointmentRenderedEvent, AppointmentTooltipShowingEvent, AppointmentUpdatedEvent, AppointmentUpdatingEvent, CellClickEvent, CellContextMenuEvent, ContentReadyEvent, DisposingEvent, InitializedEvent, AppointmentFormProperties, AppointmentFormIconsShowMode, SchedulerPredefinedToolbarItem, DateNavigatorItemProperties, SchedulerPredefinedDateNavigatorItem, dxSchedulerToolbarItem, AllDayPanelMode, AppointmentCollectorTemplateData, AppointmentTemplateData, AppointmentTooltipTemplateData, DayOfWeek, CellAppointmentsLimit, dxSchedulerScrolling, SnapToCellsMode } from "devextreme/ui/scheduler";
1212
import type { ContentReadyEvent as ButtonContentReadyEvent, DisposingEvent as ButtonDisposingEvent, InitializedEvent as ButtonInitializedEvent, dxButtonOptions, ClickEvent, OptionChangedEvent } from "devextreme/ui/button";
1313
import type { ContentReadyEvent as FormContentReadyEvent, DisposingEvent as FormDisposingEvent, InitializedEvent as FormInitializedEvent, FormItemType, FormPredefinedButtonItem, OptionChangedEvent as FormOptionChangedEvent, dxFormSimpleItem, dxFormGroupItem, dxFormTabbedItem, dxFormEmptyItem, dxFormButtonItem, LabelLocation, FormLabelMode, EditorEnterKeyEvent, FieldDataChangedEvent, SmartPastedEvent, SmartPastingEvent, FormItemComponent } from "devextreme/ui/form";
1414
import type { ContentReadyEvent as ButtonGroupContentReadyEvent, DisposingEvent as ButtonGroupDisposingEvent, InitializedEvent as ButtonGroupInitializedEvent, OptionChangedEvent as ButtonGroupOptionChangedEvent, dxButtonGroupItem, ItemClickEvent, SelectionChangedEvent } from "devextreme/ui/button_group";
@@ -1454,6 +1454,7 @@ type IViewProps = React.PropsWithChildren<{
14541454
groupByDate?: boolean;
14551455
groupOrientation?: Orientation;
14561456
groups?: Array<string>;
1457+
hiddenWeekDays?: Array<DayOfWeek>;
14571458
intervalCount?: number;
14581459
maxAppointmentsPerCell?: CellAppointmentsLimit | number;
14591460
name?: string | undefined;

packages/devextreme-vue/src/scheduler.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
AllDayPanelMode,
1111
ViewType,
1212
dxSchedulerAppointment,
13+
DayOfWeek,
1314
CellAppointmentsLimit,
1415
AppointmentAddedEvent,
1516
AppointmentAddingEvent,
@@ -161,6 +162,7 @@ type AccessibleOptions = Pick<Properties,
161162
"groupByDate" |
162163
"groups" |
163164
"height" |
165+
"hiddenWeekDays" |
164166
"hint" |
165167
"indicatorUpdateInterval" |
166168
"max" |
@@ -248,6 +250,7 @@ const componentConfig = {
248250
groupByDate: Boolean,
249251
groups: Array as PropType<Array<string>>,
250252
height: [Number, String],
253+
hiddenWeekDays: Array as PropType<Array<DayOfWeek>>,
251254
hint: String,
252255
indicatorUpdateInterval: Number,
253256
max: [Date, Number, String],
@@ -331,6 +334,7 @@ const componentConfig = {
331334
"update:groupByDate": null,
332335
"update:groups": null,
333336
"update:height": null,
337+
"update:hiddenWeekDays": null,
334338
"update:hint": null,
335339
"update:indicatorUpdateInterval": null,
336340
"update:max": null,
@@ -1774,6 +1778,7 @@ const DxViewConfig = {
17741778
"update:groupByDate": null,
17751779
"update:groupOrientation": null,
17761780
"update:groups": null,
1781+
"update:hiddenWeekDays": null,
17771782
"update:intervalCount": null,
17781783
"update:maxAppointmentsPerCell": null,
17791784
"update:name": null,
@@ -1800,6 +1805,7 @@ const DxViewConfig = {
18001805
groupByDate: Boolean,
18011806
groupOrientation: String as PropType<Orientation>,
18021807
groups: Array as PropType<Array<string>>,
1808+
hiddenWeekDays: Array as PropType<Array<DayOfWeek>>,
18031809
intervalCount: Number,
18041810
maxAppointmentsPerCell: [String, Number] as PropType<CellAppointmentsLimit | number>,
18051811
name: String,

packages/devextreme/js/__internal/scheduler/__tests__/__snapshots__/santiago_timezone.test.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Jest Snapshot v1, https://goo.gl/fbAQLP
1+
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
22

33
exports[`scheduler should render correct workspace in Santiago DST for view: Day DST 1`] = `
44
[
@@ -307,7 +307,7 @@ exports[`scheduler should render correct workspace in Santiago DST for view: Tim
307307
"Wed 4",
308308
"Thu 5",
309309
"Fri 6",
310-
"Sat 7",
310+
"Mon 9",
311311
"12:00 AM",
312312
"6:00 AM",
313313
"12:00 PM",

packages/devextreme/js/__internal/scheduler/__tests__/workspace.base.test.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type WorkspaceConstructor<T> = new (container: Element, options?: any) => T;
4444
const createWorkspace = <T extends SchedulerWorkSpace>(
4545
WorkSpace: WorkspaceConstructor<T>,
4646
currentView: string,
47+
options?: any,
4748
): { workspace: T; container: Element } => {
4849
const container = document.createElement('div');
4950
const workspace = new WorkSpace(container, {
@@ -52,6 +53,7 @@ const createWorkspace = <T extends SchedulerWorkSpace>(
5253
currentDate: new Date(2017, 4, 25),
5354
firstDayOfWeek: 0,
5455
getResourceManager: () => getResourceManagerMock([]),
56+
...options,
5557
});
5658
(workspace as any)._isVisible = () => true;
5759
expect(container.classList).toContain('dx-scheduler-work-space');
@@ -193,3 +195,61 @@ describe('scheduler workspace scrollTo', () => {
193195
expect(scrollableContainer.scrollLeft).toBeCloseTo(-11125);
194196
});
195197
});
198+
199+
describe('scheduler workspace skipped days support', () => {
200+
beforeEach(() => {
201+
setupSchedulerTestEnvironment();
202+
});
203+
204+
it('should count configured skipped days in week workspace interval math', () => {
205+
const { workspace } = createWorkspace(SchedulerWorkSpaceWeek, 'week', {
206+
skippedDays: [1, 3],
207+
});
208+
209+
expect((workspace as any).getSkippedDaysCount(new Date(2026, 3, 5), 7)).toBe(2);
210+
});
211+
212+
it('should use full week layout for work week when skippedDays override is empty', () => {
213+
const { workspace } = createWorkspace(SchedulerWorkSpaceWorkWeek, 'workWeek', {
214+
currentDate: new Date(2026, 3, 1), // Wednesday
215+
firstDayOfWeek: 0, // Sunday
216+
skippedDays: [],
217+
});
218+
219+
expect(workspace.getStartViewDate()).toEqual(new Date(2026, 2, 29));
220+
expect((workspace as any)._getCellCount()).toBe(7);
221+
});
222+
223+
it('should use custom skippedDays in work week runtime layout', () => {
224+
const { workspace } = createWorkspace(SchedulerWorkSpaceWorkWeek, 'workWeek', {
225+
currentDate: new Date(2026, 3, 1), // Wednesday
226+
firstDayOfWeek: 0, // Sunday
227+
skippedDays: [3], // Wednesday
228+
});
229+
230+
expect(workspace.getStartViewDate()).toEqual(new Date(2026, 2, 29));
231+
expect((workspace as any)._getCellCount()).toBe(6);
232+
});
233+
234+
it('should skip configured hidden days when incrementing timeline header dates', () => {
235+
const { workspace } = createWorkspace(SchedulerTimelineWeek, 'timelineWeek', {
236+
skippedDays: [3],
237+
});
238+
const date = new Date(2026, 3, 7); // Tuesday
239+
240+
(workspace as any).incrementDate(date);
241+
242+
expect(date).toEqual(new Date(2026, 3, 9)); // Thursday
243+
});
244+
245+
it('should skip hidden days when incrementing timeline day dates', () => {
246+
const { workspace } = createWorkspace(SchedulerTimelineDay, 'timelineDay', {
247+
skippedDays: [0, 6],
248+
});
249+
const date = new Date(2026, 3, 10); // Friday
250+
251+
(workspace as any).incrementDate(date);
252+
253+
expect(date).toEqual(new Date(2026, 3, 13)); // Monday
254+
});
255+
});

packages/devextreme/js/__internal/scheduler/header/m_header.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class SchedulerHeader extends Widget<HeaderOptions> {
5757
}
5858

5959
public getIntervalOptions(date: Date): IntervalOptions {
60-
const { currentView, firstDayOfWeek } = this.option();
60+
const { currentView, firstDayOfWeek, skippedDays } = this.option();
6161
const step = getStep(currentView.type);
6262

6363
return {
@@ -66,6 +66,7 @@ export class SchedulerHeader extends Widget<HeaderOptions> {
6666
firstDayOfWeek,
6767
intervalCount: currentView.intervalCount,
6868
agendaDuration: currentView.agendaDuration,
69+
skippedDays,
6970
};
7071
}
7172

0 commit comments

Comments
 (0)