Skip to content

Commit 340cce8

Browse files
authored
refactor data accessor (#29518)
Co-authored-by: Vladimir Bushmanov <[email protected]>
1 parent 39d174a commit 340cce8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+742
-1070
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { AppointmentDataAccessor, type IFieldExpr } from '../utils';
2+
3+
export const mockFieldExpressions: IFieldExpr = {
4+
startDateExpr: 'startDate',
5+
endDateExpr: 'endDate',
6+
startDateTimeZoneExpr: 'startDateTimeZone',
7+
endDateTimeZoneExpr: 'endDateTimeZone',
8+
allDayExpr: 'allDay',
9+
textExpr: 'text',
10+
descriptionExpr: 'description',
11+
recurrenceRuleExpr: 'recurrenceRule',
12+
recurrenceExceptionExpr: 'recurrenceException',
13+
disabledExpr: 'disabled',
14+
visibleExpr: 'visible',
15+
};
16+
17+
export const mockAppointmentDataAccessor = new AppointmentDataAccessor(mockFieldExpressions, true);

packages/devextreme/js/__internal/scheduler/appointment_popup/m_form.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import DataSource from '@js/data/data_source';
1414
import messageLocalization from '@js/localization/message';
1515
import Form from '@js/ui/form';
1616
import { current, isFluent } from '@js/ui/themes';
17-
import { ExpressionUtils } from '@ts/scheduler/m_expression_utils';
1817

1918
import { createAppointmentAdapter } from '../m_appointment_adapter';
2019
import type { TimezoneLabel } from '../m_utils_time_zone';
@@ -102,7 +101,7 @@ export class AppointmentForm {
102101
const dataAccessors = this.scheduler.getDataAccessors();
103102
const { expr } = dataAccessors;
104103

105-
const isRecurrence = !!ExpressionUtils.getField(dataAccessors, 'recurrenceRule', formData);
104+
const isRecurrence = Boolean(dataAccessors.get('recurrenceRule', formData));
106105
const colSpan = isRecurrence ? 1 : 2;
107106

108107
const mainItems = [
@@ -490,12 +489,12 @@ export class AppointmentForm {
490489
const dataAccessors = this.scheduler.getDataAccessors();
491490
const { expr } = dataAccessors;
492491

493-
const rawStartDate = ExpressionUtils.getField(dataAccessors, 'startDate', formData);
494-
const rawEndDate = ExpressionUtils.getField(dataAccessors, 'endDate', formData);
495-
const startDateTimezone = ExpressionUtils.getField(dataAccessors, 'startDateTimeZone', formData) ?? null;
496-
const endDateTimezone = ExpressionUtils.getField(dataAccessors, 'endDateTimeZone', formData) ?? null;
492+
const rawStartDate = dataAccessors.get('startDate', formData);
493+
const rawEndDate = dataAccessors.get('endDate', formData);
494+
const startDateTimezone = dataAccessors.get('startDateTimeZone', formData) ?? null;
495+
const endDateTimezone = dataAccessors.get('endDateTimeZone', formData) ?? null;
497496

498-
const allDay = ExpressionUtils.getField(dataAccessors, 'allDay', formData);
497+
const allDay = dataAccessors.get('allDay', formData);
499498
const startDate = new Date(rawStartDate);
500499
const endDate = new Date(rawEndDate);
501500

packages/devextreme/js/__internal/scheduler/appointment_popup/m_popup.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import dateUtils from '@js/core/utils/date';
44
import { Deferred, when } from '@js/core/utils/deferred';
55
import { triggerResizeEvent } from '@js/events/visibility_change';
66
import Popup from '@js/ui/popup/ui.popup';
7-
import { ExpressionUtils } from '@ts/scheduler/m_expression_utils';
87
import {
98
getMaxWidth,
109
getPopupToolbarItems,
@@ -226,7 +225,7 @@ export class AppointmentPopup {
226225
if (this.form.dxForm && this.visible) { // TODO
227226
const { formData } = this.form;
228227
const dataAccessors = this.scheduler.getDataAccessors();
229-
const isRecurrence = ExpressionUtils.getField(dataAccessors, 'recurrenceRule', formData);
228+
const isRecurrence = dataAccessors.get('recurrenceRule', formData);
230229

231230
this.changeSize(isRecurrence);
232231
}
@@ -239,7 +238,7 @@ export class AppointmentPopup {
239238

240239
isShowLoadPanel && this._showLoadPanel();
241240

242-
when(validation && validation.complete || validation).done((validation) => {
241+
when(validation?.complete || validation).done((validation) => {
243242
if (validation && !validation.isValid) {
244243
hideLoading();
245244
deferred.resolve(false);

packages/devextreme/js/__internal/scheduler/appointments/data_provider/m_appointment_data_provider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import config from '@js/core/config';
22
import { combineRemoteFilter } from '@ts/scheduler/r1/filterting/index';
3+
import type { AppointmentDataAccessor } from '@ts/scheduler/utils';
34

45
import { AppointmentDataSource } from './m_appointment_data_source';
56
import { AppointmentFilterBaseStrategy, AppointmentFilterVirtualStrategy } from './m_appointment_filter';
@@ -14,7 +15,7 @@ export class AppointmentDataProvider {
1415

1516
dataSource: any;
1617

17-
dataAccessors: any;
18+
dataAccessors: AppointmentDataAccessor;
1819

1920
timeZoneCalculator: any;
2021

packages/devextreme/js/__internal/scheduler/appointments/data_provider/m_appointment_filter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
getAppointmentTakesAllDay, getDatesWithoutTime, hasResourceValue, isDateAndTimeView,
1010
isTimelineView,
1111
} from '@ts/scheduler/r1/utils/index';
12+
import type { AppointmentDataAccessor } from '@ts/scheduler/utils';
1213

1314
import { createAppointmentAdapter } from '../../m_appointment_adapter';
1415
import { getRecurrenceProcessor } from '../../m_recurrence';
@@ -35,7 +36,7 @@ const FilterStrategies = {
3536
export class AppointmentFilterBaseStrategy {
3637
options: any;
3738

38-
dataAccessors: any;
39+
dataAccessors: AppointmentDataAccessor;
3940

4041
constructor(options) {
4142
this.options = options;
@@ -160,7 +161,7 @@ export class AppointmentFilterBaseStrategy {
160161
} = filterOptions;
161162

162163
const [trimMin, trimMax] = getDatesWithoutTime(min, max);
163-
const useRecurrence = isDefined(this.dataAccessors.getter.recurrenceRule);
164+
const useRecurrence = this.dataAccessors.has('recurrenceRule');
164165

165166
return [[(appointment) => {
166167
const appointmentVisible = appointment.visible ?? true;
@@ -452,7 +453,6 @@ export class AppointmentFilterVirtualStrategy extends AppointmentFilterBaseStrat
452453
.toArray();
453454
}
454455

455-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
456456
hasAllDayAppointments(filteredItems, preparedItems) {
457457
return this.filterAllDayAppointments(preparedItems).length > 0;
458458
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { mockAppointmentDataAccessor } from '@ts/scheduler/__mock__/appointment_data_accessor.mock';
2+
3+
import { replaceWrongEndDate } from './m_utils';
4+
5+
describe('replaceWrongEndDate', () => {
6+
it('should process endDate correctly', () => {
7+
[
8+
{
9+
data: {
10+
startDate: new Date(2019, 4, 3, 12),
11+
allDay: false,
12+
},
13+
expectedEndDate: new Date(2019, 4, 3, 12, 30),
14+
},
15+
{
16+
data: {
17+
startDate: new Date(2019, 4, 3, 12),
18+
allDay: false,
19+
endDate: new Date('string'),
20+
},
21+
expectedEndDate: new Date(2019, 4, 3, 12, 30),
22+
},
23+
{
24+
data: {
25+
startDate: new Date(2019, 4, 3, 12),
26+
allDay: true,
27+
},
28+
expectedEndDate: new Date(2019, 4, 3, 23, 59),
29+
},
30+
].forEach((item) => {
31+
replaceWrongEndDate(
32+
item.data,
33+
new Date(2019, 4, 3, 12),
34+
item.data.endDate,
35+
30,
36+
mockAppointmentDataAccessor,
37+
);
38+
39+
expect((item.data.endDate as Date).getHours()).toBe(item.expectedEndDate.getHours());
40+
expect((item.data.endDate as Date).getMinutes()).toBe(item.expectedEndDate.getMinutes());
41+
});
42+
});
43+
});

packages/devextreme/js/__internal/scheduler/appointments/data_provider/m_utils.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import dateUtils from '@js/core/utils/date';
22
import dateSerialization from '@js/core/utils/date_serialization';
3+
import type { AppointmentDataAccessor } from '@ts/scheduler/utils';
34

4-
import { ExpressionUtils } from '../../m_expression_utils';
55
import timeZoneUtils from '../../m_utils_time_zone';
66

77
const toMs = dateUtils.dateToMilliseconds;
@@ -124,7 +124,13 @@ export const _convertRecurrenceException = (exceptionString, startDate, timeZone
124124
return exceptionString;
125125
};
126126

127-
export const replaceWrongEndDate = (rawAppointment, startDate, endDate, appointmentDuration, dataAccessors) => {
127+
export const replaceWrongEndDate = (
128+
rawAppointment,
129+
startDate,
130+
endDate,
131+
appointmentDuration,
132+
dataAccessors: AppointmentDataAccessor,
133+
) => {
128134
const calculateAppointmentEndDate = (isAllDay, startDate) => {
129135
if (isAllDay) {
130136
return dateUtils.setToDayEnd(new Date(startDate));
@@ -134,17 +140,20 @@ export const replaceWrongEndDate = (rawAppointment, startDate, endDate, appointm
134140
};
135141

136142
if (_isEndDateWrong(startDate, endDate)) {
137-
const isAllDay = ExpressionUtils.getField(dataAccessors, 'allDay', rawAppointment);
143+
const isAllDay = Boolean(dataAccessors.get('allDay', rawAppointment));
138144

139145
const calculatedEndDate = calculateAppointmentEndDate(isAllDay, startDate);
140-
dataAccessors.setter.endDate(rawAppointment, calculatedEndDate);
146+
dataAccessors.set('endDate', rawAppointment, calculatedEndDate);
141147
}
142148
};
143149

144-
export const sortAppointmentsByStartDate = (appointments, dataAccessors) => {
150+
export const sortAppointmentsByStartDate = (
151+
appointments,
152+
dataAccessors: AppointmentDataAccessor,
153+
) => {
145154
appointments.sort((a, b) => {
146-
const firstDate = new Date(ExpressionUtils.getField(dataAccessors, 'startDate', a.settings || a));
147-
const secondDate = new Date(ExpressionUtils.getField(dataAccessors, 'startDate', b.settings || b));
155+
const firstDate = new Date(dataAccessors.get('startDate', a.settings || a));
156+
const secondDate = new Date(dataAccessors.get('startDate', b.settings || b));
148157

149158
return Math.sign(firstDate.getTime() - secondDate.getTime());
150159
});

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import {
2525
REDUCED_APPOINTMENT_ICON,
2626
REDUCED_APPOINTMENT_PARTS_CLASSES,
2727
} from '../m_classes';
28-
import { ExpressionUtils } from '../m_expression_utils';
2928
import { getRecurrenceProcessor } from '../m_recurrence';
29+
import type { AppointmentDataAccessor } from '../utils';
3030

3131
const DEFAULT_HORIZONTAL_HANDLES = 'left right';
3232
const DEFAULT_VERTICAL_HANDLES = 'top bottom';
@@ -39,10 +39,14 @@ export class Appointment extends DOMComponent {
3939
return this.$element();
4040
}
4141

42-
get rawAppointment() {
42+
get rawAppointment(): any {
4343
return this.option('data');
4444
}
4545

46+
get dataAccessors(): AppointmentDataAccessor {
47+
return this.option('dataAccessors') as AppointmentDataAccessor;
48+
}
49+
4650
_getDefaultOptions() {
4751
// @ts-expect-error
4852
return extend(super._getDefaultOptions(), {
@@ -148,7 +152,7 @@ export class Appointment extends DOMComponent {
148152

149153
(this.$element() as any).data('dxAppointmentStartDate', this.option('startDate'));
150154

151-
const text = ExpressionUtils.getField(this.option('dataAccessors'), 'text', this.rawAppointment);
155+
const text = this.dataAccessors.get('text', this.rawAppointment);
152156
(this.$element() as any).attr('title', text);
153157
(this.$element() as any).attr('role', 'button');
154158

@@ -234,7 +238,7 @@ export class Appointment extends DOMComponent {
234238
}
235239

236240
_getEndDate() {
237-
const result = ExpressionUtils.getField(this.option('dataAccessors'), 'endDate', this.rawAppointment);
241+
const result = this.dataAccessors.get('endDate', this.rawAppointment);
238242
if (result) {
239243
return new Date(result);
240244
}
@@ -250,7 +254,7 @@ export class Appointment extends DOMComponent {
250254
}
251255

252256
_renderRecurrenceClass() {
253-
const rule = ExpressionUtils.getField(this.option('dataAccessors'), 'recurrenceRule', this.rawAppointment);
257+
const rule = this.dataAccessors.get('recurrenceRule', this.rawAppointment);
254258

255259
if (getRecurrenceProcessor().isValidRecurrenceRule(rule)) {
256260
(this.$element() as any).addClass(RECURRENCE_APPOINTMENT_CLASS);

0 commit comments

Comments
 (0)