From 8e639058f52768a3296e562acdf25d077a6cfe40 Mon Sep 17 00:00:00 2001 From: Smirnova Yuliya Date: Thu, 23 Jan 2020 11:34:44 +0300 Subject: [PATCH 1/6] dxScheduler - fix recurrent appointment rendering with workWeek view --- .../ui.scheduler.timeline_work_week.js | 23 +++++++------------ .../workspaces/ui.scheduler.work_space.js | 6 +++++ .../ui.scheduler.work_space_work_week.js | 15 +++++------- js/ui/scheduler/workspaces/utils.work_week.js | 21 +++++++++++++++++ .../timeline.tests.js | 12 ++++++++++ .../workSpace.tests.js | 11 +++++++++ 6 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 js/ui/scheduler/workspaces/utils.work_week.js diff --git a/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js b/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js index 46c1a6e2e09a..179a04cd93bc 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js @@ -1,10 +1,10 @@ const registerComponent = require('../../../core/component_registrator'); const SchedulerTimelineWeek = require('./ui.scheduler.timeline_week'); const dateUtils = require('../../../core/utils/date'); +const workWeekUtils = require('./utils.work_week'); const toMs = dateUtils.dateToMilliseconds; const TIMELINE_CLASS = 'dx-scheduler-timeline-work-week'; -const MONDAY_INDEX = 1; const SchedulerTimelineWorkWeek = SchedulerTimelineWeek.inherit({ _getElementClass: function() { @@ -16,9 +16,11 @@ const SchedulerTimelineWorkWeek = SchedulerTimelineWeek.inherit({ }, _firstDayOfWeek: function() { - return this.option('firstDayOfWeek') || MONDAY_INDEX; + return workWeekUtils.getFirstDayOfWeek(this.option('firstDayOfWeek')); }, + _isSkipData: workWeekUtils.isDataOnWeekend, + _incrementDate: function(date) { const day = date.getDay(); if(day === 5) { @@ -27,24 +29,15 @@ const SchedulerTimelineWorkWeek = SchedulerTimelineWeek.inherit({ this.callBase(date); }, - _getOffsetByCount: function(cellIndex, rowIndex) { + _getOffsetByCount: function(cellIndex) { const weekendCount = Math.floor(cellIndex / (5 * this._getCellCountInDay())); - if(weekendCount > 0) { - return toMs('day') * weekendCount * 2; - } else { - return 0; - } + return toMs('day') * weekendCount * 2; }, - _getWeekendsCount: function(days) { - return 2 * Math.floor(days / 7); - }, + _getWeekendsCount: workWeekUtils.getWeekendsCount, _setFirstViewDate: function() { - this._firstViewDate = dateUtils.getFirstWeekDate(this.option('currentDate'), this._firstDayOfWeek()); - - this._firstViewDate = dateUtils.normalizeDateByWeek(this._firstViewDate, this.option('currentDate')); - + this._firstViewDate = workWeekUtils.getFirstViewDate(this.option('currentDate'), this._firstDayOfWeek()); this._setStartDayHour(this._firstViewDate); } }); diff --git a/js/ui/scheduler/workspaces/ui.scheduler.work_space.js b/js/ui/scheduler/workspaces/ui.scheduler.work_space.js index 31498a6a7bca..13ec33f6c39d 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.work_space.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.work_space.js @@ -2166,10 +2166,16 @@ const SchedulerWorkSpace = Widget.inherit({ : 0; }, + _isSkipData: noop, + getCoordinatesByDateInGroup: function(date, appointmentResources, inAllDayRow) { const indexes = this._getGroupIndexes(appointmentResources); const result = []; + if(this._isSkipData(date)) { + return result; + } + if(indexes.length) { for(let i = 0; i < indexes.length; i++) { result.push(this.getCoordinatesByDate(date, indexes[i], inAllDayRow)); diff --git a/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js b/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js index 0eb250d0ffde..0eb4ec0704b4 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js @@ -1,8 +1,8 @@ const registerComponent = require('../../../core/component_registrator'); const dateUtils = require('../../../core/utils/date'); +const workWeekUtils = require('./utils.work_week'); const toMs = dateUtils.dateToMilliseconds; const SchedulerWorkSpaceWeek = require('./ui.scheduler.work_space_week'); -const dateLocalization = require('../../../localization/date'); const WORK_WEEK_CLASS = 'dx-scheduler-work-space-work-week'; @@ -21,9 +21,11 @@ const SchedulerWorkSpaceWorkWeek = SchedulerWorkSpaceWeek.inherit({ }, _firstDayOfWeek: function() { - return this.option('firstDayOfWeek') || 1; + return workWeekUtils.getFirstDayOfWeek(this.option('firstDayOfWeek')); }, + _isSkipData: workWeekUtils.isDataOnWeekend, + _getDateByIndex: function(headerIndex) { const resultDate = new Date(this._firstViewDate); @@ -48,15 +50,10 @@ const SchedulerWorkSpaceWorkWeek = SchedulerWorkSpaceWeek.inherit({ this.callBase(); }, - _getWeekendsCount: function(days) { - return 2 * Math.floor(days / 7); - }, + _getWeekendsCount: workWeekUtils.getWeekendsCount, _setFirstViewDate: function() { - this._firstViewDate = dateUtils.getFirstWeekDate(this._getViewStartByOptions(), this._firstDayOfWeek() || dateLocalization.firstDayOfWeekIndex()); - - this._firstViewDate = dateUtils.normalizeDateByWeek(this._firstViewDate, this._getViewStartByOptions()); - + this._firstViewDate = workWeekUtils.getFirstViewDate(this._getViewStartByOptions(), this._firstDayOfWeek()); this._setStartDayHour(this._firstViewDate); }, diff --git a/js/ui/scheduler/workspaces/utils.work_week.js b/js/ui/scheduler/workspaces/utils.work_week.js new file mode 100644 index 000000000000..ceea893ae0c3 --- /dev/null +++ b/js/ui/scheduler/workspaces/utils.work_week.js @@ -0,0 +1,21 @@ +const dateUtils = require('../../../core/utils/date'); +const MONDAY_INDEX = 1; + +export const isDataOnWeekend = (date) => { + const day = date.getDay(); + return day === 6 || day === 0; +}; + +export const getFirstDayOfWeek = (firstDayOfWeekOption) => { + return firstDayOfWeekOption || MONDAY_INDEX; +}; + +export const getWeekendsCount = (days) => { + return 2 * Math.floor(days / 7); +}; + +export const getFirstViewDate = (viewStart, firstDayOfWeek) => { + const firstViewDate = dateUtils.getFirstWeekDate(viewStart, firstDayOfWeek); + return dateUtils.normalizeDateByWeek(firstViewDate, viewStart); +}; + diff --git a/testing/tests/DevExpress.ui.widgets.scheduler/timeline.tests.js b/testing/tests/DevExpress.ui.widgets.scheduler/timeline.tests.js index 6236efe0dafd..5cc285c89bed 100644 --- a/testing/tests/DevExpress.ui.widgets.scheduler/timeline.tests.js +++ b/testing/tests/DevExpress.ui.widgets.scheduler/timeline.tests.js @@ -788,6 +788,18 @@ QUnit.test('\'getCoordinatesByDate\' should return right coordinates with view o assert.equal(coords.left, targetCellPosition.left, 'Cell coordinates are right'); }); +QUnit.test('\'getCoordinatesByDateInGroup\' method should return only work week days (t853629)', function(assert) { + this.instance.option({ + intervalCount: 2, + currentDate: new Date(2018, 4, 21), + }); + + assert.ok(!this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 26))[0]); + assert.ok(!this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 27))[0]); + assert.ok(this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 23))[0]); + assert.ok(this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 28))[0]); +}); + QUnit.module('TimelineWeek with grouping by date', { beforeEach: function() { this.instance = $('#scheduler-timeline').dxSchedulerTimelineWeek({ diff --git a/testing/tests/DevExpress.ui.widgets.scheduler/workSpace.tests.js b/testing/tests/DevExpress.ui.widgets.scheduler/workSpace.tests.js index 3d03a79db3b1..197ed5d2ddf8 100644 --- a/testing/tests/DevExpress.ui.widgets.scheduler/workSpace.tests.js +++ b/testing/tests/DevExpress.ui.widgets.scheduler/workSpace.tests.js @@ -3180,6 +3180,17 @@ QUnit.testStart(function() { assert.deepEqual(lastCellData.endDate, new Date(2017, 6, 10, 1), 'cell has right endtDate'); }); + QUnit.test('\'getCoordinatesByDateInGroup\' method should return only work week days (t853629)', function(assert) { + this.createInstance({ + intervalCount: 2, + currentDate: new Date(2018, 4, 21), + }); + + assert.ok(!this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 26))[0]); + assert.ok(!this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 27))[0]); + assert.ok(this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 23))[0]); + assert.ok(this.instance.getCoordinatesByDateInGroup(new Date(2018, 4, 28))[0]); + }); })('Work Space Work Week with intervalCount'); (function() { From 9e3429e629f84ad35c592c2c440a8ff0f72ac741 Mon Sep 17 00:00:00 2001 From: Smirnova Yuliya Date: Thu, 23 Jan 2020 12:45:45 +0300 Subject: [PATCH 2/6] isSkipData -> isSkippedData --- js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js | 2 +- js/ui/scheduler/workspaces/ui.scheduler.work_space.js | 4 ++-- .../scheduler/workspaces/ui.scheduler.work_space_work_week.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js b/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js index 179a04cd93bc..540e7f60e79a 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js @@ -19,7 +19,7 @@ const SchedulerTimelineWorkWeek = SchedulerTimelineWeek.inherit({ return workWeekUtils.getFirstDayOfWeek(this.option('firstDayOfWeek')); }, - _isSkipData: workWeekUtils.isDataOnWeekend, + _isSkippedData: workWeekUtils.isDataOnWeekend, _incrementDate: function(date) { const day = date.getDay(); diff --git a/js/ui/scheduler/workspaces/ui.scheduler.work_space.js b/js/ui/scheduler/workspaces/ui.scheduler.work_space.js index 13ec33f6c39d..bdad9f4bf2e9 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.work_space.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.work_space.js @@ -2166,13 +2166,13 @@ const SchedulerWorkSpace = Widget.inherit({ : 0; }, - _isSkipData: noop, + _isSkippedData: noop, getCoordinatesByDateInGroup: function(date, appointmentResources, inAllDayRow) { const indexes = this._getGroupIndexes(appointmentResources); const result = []; - if(this._isSkipData(date)) { + if(this._isSkippedData(date)) { return result; } diff --git a/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js b/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js index 0eb4ec0704b4..bcc381172813 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.work_space_work_week.js @@ -24,7 +24,7 @@ const SchedulerWorkSpaceWorkWeek = SchedulerWorkSpaceWeek.inherit({ return workWeekUtils.getFirstDayOfWeek(this.option('firstDayOfWeek')); }, - _isSkipData: workWeekUtils.isDataOnWeekend, + _isSkippedData: workWeekUtils.isDataOnWeekend, _getDateByIndex: function(headerIndex) { const resultDate = new Date(this._firstViewDate); From 3a2a302ceda329ff134b49afc1328d76cb4e1125 Mon Sep 17 00:00:00 2001 From: Smirnova Yuliya Date: Fri, 24 Jan 2020 13:22:44 +0300 Subject: [PATCH 3/6] extract constant --- js/ui/scheduler/workspaces/utils.work_week.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/ui/scheduler/workspaces/utils.work_week.js b/js/ui/scheduler/workspaces/utils.work_week.js index ceea893ae0c3..340c06473dc2 100644 --- a/js/ui/scheduler/workspaces/utils.work_week.js +++ b/js/ui/scheduler/workspaces/utils.work_week.js @@ -1,9 +1,11 @@ const dateUtils = require('../../../core/utils/date'); const MONDAY_INDEX = 1; +const SATURDAY_iNDEX = 6; +const SUNDAY_iNDEX = 0; export const isDataOnWeekend = (date) => { const day = date.getDay(); - return day === 6 || day === 0; + return day === SATURDAY_iNDEX || day === SUNDAY_iNDEX; }; export const getFirstDayOfWeek = (firstDayOfWeekOption) => { From 1ed98e5b8c6da122925b55443c2e649f0e71e412 Mon Sep 17 00:00:00 2001 From: Smirnova Yuliya Date: Fri, 24 Jan 2020 15:41:58 +0300 Subject: [PATCH 4/6] fix typo --- js/ui/scheduler/workspaces/utils.work_week.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/ui/scheduler/workspaces/utils.work_week.js b/js/ui/scheduler/workspaces/utils.work_week.js index 340c06473dc2..d10d373c3cab 100644 --- a/js/ui/scheduler/workspaces/utils.work_week.js +++ b/js/ui/scheduler/workspaces/utils.work_week.js @@ -1,11 +1,11 @@ const dateUtils = require('../../../core/utils/date'); const MONDAY_INDEX = 1; -const SATURDAY_iNDEX = 6; -const SUNDAY_iNDEX = 0; +const SATURDAY_INDEX = 6; +const SUNDAY_INDEX = 0; export const isDataOnWeekend = (date) => { const day = date.getDay(); - return day === SATURDAY_iNDEX || day === SUNDAY_iNDEX; + return day === SATURDAY_INDEX || day === SUNDAY_INDEX; }; export const getFirstDayOfWeek = (firstDayOfWeekOption) => { From 2d2b65d1b6ad2930ea16dc15b9b20bacfac964a7 Mon Sep 17 00:00:00 2001 From: Smirnova Yuliya Date: Fri, 24 Jan 2020 15:43:36 +0300 Subject: [PATCH 5/6] noop -> boolean function --- js/ui/scheduler/workspaces/ui.scheduler.work_space.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/ui/scheduler/workspaces/ui.scheduler.work_space.js b/js/ui/scheduler/workspaces/ui.scheduler.work_space.js index bdad9f4bf2e9..4407fc78ce99 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.work_space.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.work_space.js @@ -2166,7 +2166,7 @@ const SchedulerWorkSpace = Widget.inherit({ : 0; }, - _isSkippedData: noop, + _isSkippedData: function() { return false; }, getCoordinatesByDateInGroup: function(date, appointmentResources, inAllDayRow) { const indexes = this._getGroupIndexes(appointmentResources); From d9fc001e1a44a84c533f6a4944383cc40b483229 Mon Sep 17 00:00:00 2001 From: Smirnova Yuliya Date: Fri, 24 Jan 2020 15:47:48 +0300 Subject: [PATCH 6/6] constant last day of week --- js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js b/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js index 540e7f60e79a..abfcf652c4ba 100644 --- a/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js +++ b/js/ui/scheduler/workspaces/ui.scheduler.timeline_work_week.js @@ -5,6 +5,7 @@ const workWeekUtils = require('./utils.work_week'); const toMs = dateUtils.dateToMilliseconds; const TIMELINE_CLASS = 'dx-scheduler-timeline-work-week'; +const LAST_DAY_WEEK_INDEX = 5; const SchedulerTimelineWorkWeek = SchedulerTimelineWeek.inherit({ _getElementClass: function() { @@ -23,7 +24,7 @@ const SchedulerTimelineWorkWeek = SchedulerTimelineWeek.inherit({ _incrementDate: function(date) { const day = date.getDay(); - if(day === 5) { + if(day === LAST_DAY_WEEK_INDEX) { date.setDate(date.getDate() + 2); } this.callBase(date);