Skip to content

Commit

Permalink
fix: recalculate detail popup time
Browse files Browse the repository at this point in the history
  • Loading branch information
jungeun-cho committed Nov 24, 2020
1 parent e4483ef commit 38452e1
Showing 1 changed file with 75 additions and 1 deletion.
76 changes: 75 additions & 1 deletion src/js/view/popup/scheduleDetailPopup.js
@@ -1,3 +1,4 @@
/* eslint-disable vars-on-top */
/**
* @fileoverview Floating layer for showing detail schedule
* @author NHN FE Development Lab <dl_javascript@nhn.com>
Expand All @@ -11,6 +12,9 @@ var config = require('../../config'),
domevent = require('../../common/domevent'),
domutil = require('../../common/domutil');
var tmpl = require('../template/popup/scheduleDetailPopup.hbs');
var tz = require('../../common/timezone');
var TZDate = tz.Date;
var datetime = require('../../common/datetime');

/**
* @constructor
Expand Down Expand Up @@ -120,7 +124,7 @@ ScheduleDetailPopup.prototype.render = function(viewModel) {
var self = this;

layer.setContent(tmpl({
schedule: viewModel.schedule,
schedule: this._getScheduleModel(viewModel.schedule),
calendar: viewModel.calendar
}));
layer.show();
Expand All @@ -134,6 +138,76 @@ ScheduleDetailPopup.prototype.render = function(viewModel) {
})();
};

// eslint-disable-next-line complexity
ScheduleDetailPopup.prototype._getScheduleModel = function(scheduleViewModel) {
var schedule = util.extend({}, scheduleViewModel);
var dayStart = datetime.start(scheduleViewModel.start);
var startDayOffset = dayStart.toDate().getTimezoneOffset();
var nativeOffsetMs = tz.getNativeOffsetMs();
var hasPrimaryTimezoneCustomSetting = tz.hasPrimaryTimezoneCustomSetting();
var startOffset = schedule.start.toDate().getTimezoneOffset();
var endOffset = schedule.end.toDate().getTimezoneOffset();
var primaryTimezoneCode = tz.getPrimaryTimezoneCode();
var primaryOffset = tz.getPrimaryOffset();
var startTimezoneOffset = tz.getOffsetByTimezoneCode(
primaryTimezoneCode,
schedule.start.getTime()
);
var endTimezoneOffset = tz.getOffsetByTimezoneCode(
primaryTimezoneCode,
schedule.end.getTime()
);
var MIN_TO_MS = 60 * 1000;
var offsetDiffMs = 0;
var start, end;

if (
hasPrimaryTimezoneCustomSetting &&
tz.isNativeOsUsingDSTTimezone() &&
nativeOffsetMs !== startDayOffset
) {
// 커스텀 타임존을 사용할때는 네이티브 타임존 오프셋을 고정해서 렌더링한다.
// 네이티브 타임존 오프셋으로 고정되서 계산된 시간을 원래 타임존 오프셋으로 재계산해주어야한다.
// 접속 시간이 하계시/표준시에 영향을 받지 않고 항상 동일한 위치에 일정이 표시되어야 한다.
offsetDiffMs = (startOffset * MIN_TO_MS) - nativeOffsetMs;
start = new TZDate(schedule.start);
start.addMilliseconds(offsetDiffMs);

schedule.start = start;

offsetDiffMs = (endOffset * MIN_TO_MS) - nativeOffsetMs;
end = new TZDate(schedule.end);
end.addMilliseconds(offsetDiffMs);

schedule.end = end;
}

if (
hasPrimaryTimezoneCustomSetting &&
tz.isPrimaryUsingDSTTimezone() &&
(primaryOffset !== startTimezoneOffset || primaryOffset !== endTimezoneOffset)
) {
// 커스텀 타임존영역이 DST가 포함된 두개의 오프셋이 적용되는 타임존인데,
// 처음 렌더링되는 일정은 접속 시간에 계산된 오프셋으로 계산되어 그려진다.
// 원래 시간대의 오프셋으로 재계산해주어야한다.
offsetDiffMs = (primaryOffset - startTimezoneOffset) * MIN_TO_MS;

start = new TZDate(schedule.start);
start.addMilliseconds(offsetDiffMs);

schedule.start = start;

offsetDiffMs = (primaryOffset - endTimezoneOffset) * MIN_TO_MS;

end = new TZDate(schedule.end);
end.addMilliseconds(offsetDiffMs);

schedule.end = end;
}

return schedule;
};

/**
* Set popup position and arrow direction to apear near guide element
* @param {Event} event - creation guide element
Expand Down

0 comments on commit 38452e1

Please sign in to comment.