Skip to content

Commit 64c8a76

Browse files
Scheduler: timezone utils refactoring (#30654)
1 parent c426630 commit 64c8a76

File tree

30 files changed

+92
-3516
lines changed

30 files changed

+92
-3516
lines changed
Binary file not shown.

e2e/testcafe-devextreme/tests/scheduler/timezones/globalConfigTimezoneDB.ts

Lines changed: 0 additions & 57 deletions
This file was deleted.

packages/devextreme/js/__internal/core/utils/date.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ describe('Date utils', () => {
2323
.it('should add ms offsets to date correctly', ({
2424
offsets,
2525
expectedResult,
26-
}) => {
26+
}: { offsets: number[]; expectedResult: Date }) => {
2727
const date = new Date('2023-09-05T00:00:00Z');
2828

29-
const result = dateUtilsTs.addOffsets(date, offsets);
29+
const result = dateUtilsTs.addOffsets(date, ...offsets);
3030

3131
expect(result).toEqual(expectedResult);
3232
});

packages/devextreme/js/__internal/core/utils/date.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
// TODO Vinogradov: Refactor offsets: number[] -> ...offsets: number[]
2-
const addOffsets = (date: Date, offsets: number[]): Date => {
1+
const addOffsets = (date: Date, ...offsets: number[]): Date => {
32
const newDateMs = offsets.reduce(
43
(result, offset) => result + offset,
54
date.getTime(),
65
);
76

87
return new Date(newDateMs);
98
};
10-
// eslint-disable-next-line @stylistic/max-len
11-
const isValidDate = (date: unknown): date is Date | string | number => Boolean(date && !isNaN(new Date(date as Date).valueOf()));
9+
10+
const isValidDate = (
11+
date: unknown,
12+
): date is Date | string | number => Boolean(
13+
date && !isNaN(new Date(date as Date).valueOf()),
14+
);
1215

1316
export const dateUtilsTs = {
1417
addOffsets,

packages/devextreme/js/__internal/scheduler/appointments/m_appointment_collection.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -759,12 +759,12 @@ class SchedulerAppointments extends CollectionWidget {
759759
} else {
760760
const startDate = this._getEndResizeAppointmentStartDate(e, sourceAppointment, info.appointment);
761761
const { endDate } = info.appointment;
762-
const shiftedStartDate = dateUtilsTs.addOffsets(startDate, [-viewOffset]);
763-
const shiftedEndDate = dateUtilsTs.addOffsets(endDate, [-viewOffset]);
762+
const shiftedStartDate = dateUtilsTs.addOffsets(startDate, -viewOffset);
763+
const shiftedEndDate = dateUtilsTs.addOffsets(endDate, -viewOffset);
764764

765765
dateRange = this._getDateRange(e, shiftedStartDate, shiftedEndDate);
766-
dateRange.startDate = dateUtilsTs.addOffsets(dateRange.startDate, [viewOffset]);
767-
dateRange.endDate = dateUtilsTs.addOffsets(dateRange.endDate, [viewOffset]);
766+
dateRange.startDate = dateUtilsTs.addOffsets(dateRange.startDate, viewOffset);
767+
dateRange.endDate = dateUtilsTs.addOffsets(dateRange.endDate, viewOffset);
768768
}
769769

770770
this.updateResizedAppointment(
@@ -825,8 +825,8 @@ class SchedulerAppointments extends CollectionWidget {
825825
const startDateDelta = gridAdapter.startDate.getTime() - convertedBackAdapter.startDate.getTime();
826826
const endDateDelta = gridAdapter.endDate.getTime() - convertedBackAdapter.endDate.getTime();
827827

828-
gridAdapter.startDate = dateUtilsTs.addOffsets(gridAdapter.startDate, [startDateDelta]);
829-
gridAdapter.endDate = dateUtilsTs.addOffsets(gridAdapter.endDate, [endDateDelta]);
828+
gridAdapter.startDate = dateUtilsTs.addOffsets(gridAdapter.startDate, startDateDelta);
829+
gridAdapter.endDate = dateUtilsTs.addOffsets(gridAdapter.endDate, endDateDelta);
830830

831831
const data = gridAdapter
832832
.calculateDates(timeZoneCalculator, 'fromGrid')

packages/devextreme/js/__internal/scheduler/appointments/resizing/m_core.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const getCellData = (
3232
// but long appointments are not. So for all day appointments endDate === startDate,
3333
// for long appointments endDate = startDate + 1 day.
3434
if (!isAllDay) {
35-
cellData.endDate = dateUtilsTs.addOffsets(cellData.startDate, [toMs('day')]);
35+
cellData.endDate = dateUtilsTs.addOffsets(cellData.startDate, toMs('day'));
3636
}
3737

3838
return cellData;

packages/devextreme/js/__internal/scheduler/m_recurrence.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
import errors from '@js/core/errors';
33
import dateUtils from '@js/core/utils/date';
44
import { each } from '@js/core/utils/iterator';
5+
import { dateUtilsTs } from '@ts/core/utils/date';
56
import { RRule, RRuleSet } from 'rrule';
67

78
import timeZoneUtils from './m_utils_time_zone';
89

910
const toMs = dateUtils.dateToMilliseconds;
11+
const { addOffsets } = dateUtilsTs;
1012

1113
const ruleNames = ['freq', 'interval', 'byday', 'byweekno', 'byyearday', 'bymonth', 'bymonthday', 'count', 'until', 'byhour', 'byminute', 'bysecond', 'bysetpos', 'wkst'];
1214
const freqNames = ['DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY', 'SECONDLY', 'MINUTELY', 'HOURLY'];
@@ -81,11 +83,11 @@ class RecurrenceProcessor {
8183
const duration = options.end ? options.end.getTime() - options.start.getTime() : 0;
8284

8385
// NOTE: Remove local timezone offsets from Rrule date params.
84-
const startIntervalDate = timeZoneUtils.setOffsetsToDate(options.start, [-clientOffsets.startDate, appointmentTimezoneOffset]);
86+
const startIntervalDate = addOffsets(options.start, -clientOffsets.startDate, appointmentTimezoneOffset);
8587
const minViewTime = options.min.getTime() - clientOffsets.minViewDate + appointmentTimezoneOffset;
8688
// NOTE: Shift minViewDate, because recurrent appointment may start before start view date.
8789
const minViewDate = new Date(minViewTime - duration);
88-
const maxViewDate = timeZoneUtils.setOffsetsToDate(options.max, [-clientOffsets.maxViewDate, appointmentTimezoneOffset]);
90+
const maxViewDate = addOffsets(options.max, -clientOffsets.maxViewDate, appointmentTimezoneOffset);
8991

9092
// NOTE: Check DST after start date without local timezone offset conversion.
9193
const startDateDSTDifferenceMs = timeZoneUtils.getDiffBetweenClientTimezoneOffsets(options.start, startIntervalDate);
@@ -102,14 +104,15 @@ class RecurrenceProcessor {
102104
}
103105

104106
_convertRruleResult(rruleIntervalParams, options, rruleDate) {
105-
const convertedBackDate = timeZoneUtils.setOffsetsToDate(rruleDate, [
107+
const convertedBackDate = addOffsets(
108+
rruleDate,
106109
...this._getLocalMachineOffset(rruleDate),
107110
-options.appointmentTimezoneOffset,
108111
rruleIntervalParams.startIntervalDateDSTShift,
109-
]);
112+
);
110113
const convertedDateDSTShift = timeZoneUtils.getDiffBetweenClientTimezoneOffsets(convertedBackDate, rruleDate);
111114
const switchToSummerTime = convertedDateDSTShift < 0;
112-
const resultDate = timeZoneUtils.setOffsetsToDate(convertedBackDate, [convertedDateDSTShift]);
115+
const resultDate = addOffsets(convertedBackDate, convertedDateDSTShift);
113116
const resultDateDSTShift = timeZoneUtils.getDiffBetweenClientTimezoneOffsets(resultDate, convertedBackDate);
114117

115118
if (resultDateDSTShift && switchToSummerTime) {
@@ -281,9 +284,10 @@ class RecurrenceProcessor {
281284
}
282285

283286
if (until) {
284-
ruleOptions.until = timeZoneUtils.setOffsetsToDate(
287+
ruleOptions.until = addOffsets(
285288
until,
286-
[-timeZoneUtils.getClientTimezoneOffset(until), options.appointmentTimezoneOffset],
289+
-timeZoneUtils.getClientTimezoneOffset(until),
290+
options.appointmentTimezoneOffset,
287291
);
288292
}
289293

@@ -299,9 +303,9 @@ class RecurrenceProcessor {
299303
const rruleTimezoneOffsets = typeof options.getExceptionDateTimezoneOffsets === 'function'
300304
? options.getExceptionDateTimezoneOffsets(date)
301305
: [-timeZoneUtils.getClientTimezoneOffset(date), options.appointmentTimezoneOffset];
302-
const exceptionDateInPseudoUtc = timeZoneUtils.setOffsetsToDate(
306+
const exceptionDateInPseudoUtc = addOffsets(
303307
date,
304-
rruleTimezoneOffsets,
308+
...rruleTimezoneOffsets,
305309
);
306310

307311
this.rRuleSet!.exdate(exceptionDateInPseudoUtc);

packages/devextreme/js/__internal/scheduler/m_scheduler.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,7 +1599,7 @@ class Scheduler extends SchedulerOptionsBaseWidget {
15991599
}
16001600

16011601
const result = this.timeZoneCalculator.createDate(date, 'fromGrid');
1602-
return dateUtilsTs.addOffsets(result, [-viewOffset]);
1602+
return dateUtilsTs.addOffsets(result, -viewOffset);
16031603
};
16041604

16051605
const targetCell = this.getTargetCellData();
@@ -1612,9 +1612,9 @@ class Scheduler extends SchedulerOptionsBaseWidget {
16121612
const cellEndDate = getConvertedFromGrid(targetCell.endDate);
16131613

16141614
let appointmentStartDate = new Date(appointment.startDate);
1615-
appointmentStartDate = dateUtilsTs.addOffsets(appointmentStartDate, [-viewOffset]);
1615+
appointmentStartDate = dateUtilsTs.addOffsets(appointmentStartDate, -viewOffset);
16161616
let appointmentEndDate = new Date(appointment.endDate);
1617-
appointmentEndDate = dateUtilsTs.addOffsets(appointmentEndDate, [-viewOffset]);
1617+
appointmentEndDate = dateUtilsTs.addOffsets(appointmentEndDate, -viewOffset);
16181618
let resultedStartDate = cellStartDate ?? appointmentStartDate;
16191619

16201620
if (!dateUtilsTs.isValidDate(appointmentStartDate)) {
@@ -1635,7 +1635,7 @@ class Scheduler extends SchedulerOptionsBaseWidget {
16351635
const startDate = this.timeZoneCalculator.createDate(appointmentStartDate, 'toGrid');
16361636
const timeInMs = startDate.getTime() - dateUtils.trimTime(startDate).getTime();
16371637

1638-
const targetCellStartDate = dateUtilsTs.addOffsets(targetCell.startDate, [-viewOffset]);
1638+
const targetCellStartDate = dateUtilsTs.addOffsets(targetCell.startDate, -viewOffset);
16391639
resultedStartDate = new Date(dateUtils.trimTime(targetCellStartDate).getTime() + timeInMs);
16401640
resultedStartDate = this.timeZoneCalculator.createDate(resultedStartDate, 'fromGrid');
16411641
}
@@ -1667,8 +1667,8 @@ class Scheduler extends SchedulerOptionsBaseWidget {
16671667
}
16681668
}
16691669

1670-
result.startDate = dateUtilsTs.addOffsets(result.startDate, [viewOffset]);
1671-
result.endDate = dateUtilsTs.addOffsets(resultedEndDate, [viewOffset]);
1670+
result.startDate = dateUtilsTs.addOffsets(result.startDate, viewOffset);
1671+
result.endDate = dateUtilsTs.addOffsets(resultedEndDate, viewOffset);
16721672
const rawResult = result.source;
16731673

16741674
setAppointmentGroupValues(rawResult, this.resourceManager.resourceById, targetCell.groups);

0 commit comments

Comments
 (0)