[FIX] web: calendar: various fixes
- When you move an all day event to a scheduled event, the default duration should be 2 hours instead of 1 hour. - Before this fix, it was not possible to drop an event to an all day event - In week mode, an all day event was displayed over two days.
This commit is contained in:
@@ -38,17 +38,29 @@ return AbstractModel.extend({
|
||||
var start = event.start.clone();
|
||||
var end = event.end && event.end.clone();
|
||||
|
||||
if (!end || end.diff(start) < 0) {
|
||||
end = start.clone().add(1, 'h');
|
||||
// Detects allDay events (86400000 = 1 day in ms)
|
||||
if (event.allDay || (end && end.diff(start) % 86400000 === 0)) {
|
||||
event.allDay = true;
|
||||
}
|
||||
|
||||
if (event.allDay || end.diff(start) % 86400000 === 0) {
|
||||
event.allDay = true;
|
||||
// Set end date if not existing
|
||||
if (!end || end.diff(start) < 0) { // undefined or invalid end date
|
||||
if (event.allDay) {
|
||||
end = start.clone();
|
||||
} else {
|
||||
// in week mode or day mode, convert allday event to event
|
||||
end = start.clone().add(2, 'h');
|
||||
}
|
||||
} else if (event.allDay) {
|
||||
// For an "allDay", FullCalendar gives the end day as the
|
||||
// next day at midnight (instead of 23h59).
|
||||
end.add(-1, 'days');
|
||||
}
|
||||
|
||||
if (this.data.scale === 'month') {
|
||||
// In month, FullCalendar gives the end day as the
|
||||
// next day at midnight (instead of 23h59).
|
||||
end.add(-1, 'days');
|
||||
// An "allDay" event without the "all_day" option is not considered
|
||||
// as a 24h day. It's just a part of the day (by default: 7h-19h).
|
||||
if (event.allDay) {
|
||||
if (!this.mapping.all_day) {
|
||||
if (event.r_start) {
|
||||
start.hours(event.r_start.hours())
|
||||
.minutes(event.r_start.minutes())
|
||||
@@ -58,21 +70,11 @@ return AbstractModel.extend({
|
||||
.minutes(event.r_end.minutes())
|
||||
.seconds(event.r_end.seconds())
|
||||
.utc();
|
||||
} else if (this.mapping.all_day) {
|
||||
start.utc();
|
||||
end.utc();
|
||||
} else {
|
||||
// default hours in the user's timezone
|
||||
start.hours(7).add(-this.getSession().getTZOffset(start), 'minutes');
|
||||
end.hours(19).add(-this.getSession().getTZOffset(end), 'minutes');
|
||||
}
|
||||
} else if (this.mapping.all_day) {
|
||||
start.startOf('day');
|
||||
end.startOf('day').add(-1, 'days');
|
||||
} else {
|
||||
// default hours in the user's timezone
|
||||
start.hours(7).add(-this.getSession().getTZOffset(start), 'minutes');
|
||||
end.hours(19).add(-this.getSession().getTZOffset(end), 'minutes');
|
||||
}
|
||||
} else {
|
||||
start.add(-this.getSession().getTZOffset(start), 'minutes');
|
||||
|
||||
@@ -509,7 +509,7 @@ QUnit.module('Views', {
|
||||
});
|
||||
|
||||
QUnit.test('create event with timezone in week mode with formViewDialog', function (assert) {
|
||||
assert.expect(7);
|
||||
assert.expect(8);
|
||||
|
||||
this.data.event.records = [];
|
||||
this.data.event.onchanges = {
|
||||
@@ -558,12 +558,8 @@ QUnit.module('Views', {
|
||||
"should send the context to create events");
|
||||
}
|
||||
if (args.method === "write") {
|
||||
assert.deepEqual(args.args[1], {
|
||||
"allday": false,
|
||||
"start": "2016-12-12 06:00:00",
|
||||
"stop": "2016-12-12 08:00:00"
|
||||
},
|
||||
"should move the event");
|
||||
assert.deepEqual(args.args[1], expectedEvent,
|
||||
"should move the event");
|
||||
}
|
||||
return this._super(route, args);
|
||||
},
|
||||
@@ -635,11 +631,28 @@ QUnit.module('Views', {
|
||||
left = pos.left + 5;
|
||||
top = pos.top + 5;
|
||||
|
||||
// Mode this event to another day
|
||||
var expectedEvent = {
|
||||
"allday": false,
|
||||
"start": "2016-12-12 06:00:00",
|
||||
"stop": "2016-12-12 08:00:00"
|
||||
};
|
||||
testUtils.triggerPositionalMouseEvent(left, top, "mousedown");
|
||||
left = calendar.$('.fc-day:eq(1)').offset().left + 5;
|
||||
testUtils.triggerPositionalMouseEvent(left, top, "mousemove");
|
||||
testUtils.triggerPositionalMouseEvent(left, top, "mouseup");
|
||||
|
||||
// Move to "All day"
|
||||
expectedEvent = {
|
||||
"allday": true,
|
||||
"start": "2016-12-12 00:00:00",
|
||||
"stop": "2016-12-12 00:00:00"
|
||||
};
|
||||
testUtils.triggerPositionalMouseEvent(left, top, "mousedown");
|
||||
top = calendar.$('.fc-day:eq(1)').offset().top + 5;
|
||||
testUtils.triggerPositionalMouseEvent(left, top, "mousemove");
|
||||
testUtils.triggerPositionalMouseEvent(left, top, "mouseup");
|
||||
|
||||
calendar.destroy();
|
||||
$view.remove();
|
||||
});
|
||||
@@ -714,6 +727,65 @@ QUnit.module('Views', {
|
||||
$view.remove();
|
||||
});
|
||||
|
||||
QUnit.test('create all day event in week mode (no quickCreate)', function (assert) {
|
||||
assert.expect(1);
|
||||
|
||||
this.data.event.records = [];
|
||||
|
||||
var calendar = createView({
|
||||
View: CalendarView,
|
||||
model: 'event',
|
||||
data: this.data,
|
||||
arch:
|
||||
'<calendar class="o_calendar_test" '+
|
||||
'date_start="start" '+
|
||||
'date_stop="stop" '+
|
||||
'mode="week" '+
|
||||
'quick_add="False" '+
|
||||
'readonly_form_view_id="1">'+
|
||||
'<field name="name"/>'+
|
||||
'</calendar>',
|
||||
archs: archs,
|
||||
viewOptions: {
|
||||
initialDate: initialDate,
|
||||
},
|
||||
session: {
|
||||
getTZOffset: function () {
|
||||
return 120;
|
||||
},
|
||||
},
|
||||
intercepts: {
|
||||
do_action: function (event) {
|
||||
assert.deepEqual(event.data.action.context, {
|
||||
"default_name": null,
|
||||
"default_start": "2016-12-14 05:00:00",
|
||||
"default_stop": "2016-12-15 17:00:00",
|
||||
},
|
||||
"should send the correct data to create events");
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
var $view = $('#qunit-fixture').contents();
|
||||
$view.prependTo('body'); // => select with click position
|
||||
|
||||
|
||||
var pos = calendar.$('.fc-bg td:eq(4)').offset();
|
||||
try {
|
||||
testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousedown");
|
||||
} catch (e) {
|
||||
calendar.destroy();
|
||||
$view.remove();
|
||||
throw new Error('The test fails to simulate a click in the screen. Your screen is probably too small or your dev tools is open.');
|
||||
}
|
||||
pos = calendar.$('.fc-bg td:eq(5)').offset();
|
||||
testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousemove");
|
||||
testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mouseup");
|
||||
|
||||
calendar.destroy();
|
||||
$view.remove();
|
||||
});
|
||||
|
||||
QUnit.test('create event in month mode', function (assert) {
|
||||
assert.expect(4);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user