diff --git a/addons/web/static/src/js/views/calendar/calendar_controller.js b/addons/web/static/src/js/views/calendar/calendar_controller.js index 5f432e37bfc..7327ff34108 100644 --- a/addons/web/static/src/js/views/calendar/calendar_controller.js +++ b/addons/web/static/src/js/views/calendar/calendar_controller.js @@ -102,7 +102,7 @@ var CalendarController = AbstractController.extend({ * @param {integer} record.id */ _updateRecord: function (record) { - this.model.updateRecord(record).reload.bind(this); + this.model.updateRecord(record).then(this.reload.bind(this)); }, //-------------------------------------------------------------------------- @@ -156,7 +156,7 @@ var CalendarController = AbstractController.extend({ }, function () { // This will occurs if there are some more fields required event.data.options.disable_quick_create = true; - event.data.options.on_save = this.destroy.bind(this); + event.data.data.on_save = self.quick.destroy.bind(self.quick); self._onOpenCreate(event.data); }); }, @@ -170,17 +170,17 @@ var CalendarController = AbstractController.extend({ } var data = this.model.calendarEventToRecord(event.data); - var context = _.extend({}, this.context); - context.default_name = data.name; - context['default_' + this.mapping.date_start] = data.start; + var context = _.extend({}, this.context, event.options && event.options.context); + context.default_name = data.name || null; + context['default_' + this.mapping.date_start] = data.start || null; if (this.mapping.date_stop) { - context['default_' + this.mapping.date_stop] = data.stop; + context['default_' + this.mapping.date_stop] = data.stop || null; } if (this.mapping.date_delay) { - context['default_' + this.mapping.date_delay] = data.duration; + context['default_' + this.mapping.date_delay] = data.duration || null; } if (this.mapping.all_day) { - context['default_' + this.mapping.all_day] = data[this.mapping.all_day]; + context['default_' + this.mapping.all_day] = data[this.mapping.all_day] || null; } for (var k in context) { @@ -189,9 +189,9 @@ var CalendarController = AbstractController.extend({ } } - var options = _.extend({}, this.options, {context: context}); + var options = _.extend({}, this.options, event.options, {context: context}); - if(!options.disable_quick_create && !event.data.disable_quick_create) { + if(!options.disable_quick_create && !event.data.disable_quick_create && this.quick_add_pop) { if (this.quick != null) { this.quick.destroy(); this.quick = null; diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js index c2f405e1b40..5f068e77847 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -42,7 +42,7 @@ return AbstractModel.extend({ end = start.clone().add(1, 'h'); } - if (event.allDay || end.diff(start) === 86400000) { + if (event.allDay || end.diff(start) % 86400000 === 0) { event.allDay = true; if (this.scale === 'month') { @@ -62,7 +62,7 @@ return AbstractModel.extend({ } } else if (this.mapping.all_day) { start.startOf('day'); - end.startOf('day'); + end.startOf('day').add(-1, 'days'); } else { // default hours in the user's timezone start.hours(7).add(-this.getSession().tzOffset, 'minutes'); @@ -235,6 +235,9 @@ return AbstractModel.extend({ * @returns {Deferred} */ reload: function (_handle, params) { + if (params.domain) { + this.data.domain = params.domain; + } return this._loadCalendar(); }, /** @@ -290,7 +293,6 @@ return AbstractModel.extend({ model: this.modelName, method: 'write', args: [record.id, data], - context: _.pick(event.data.options, 'context'), }); }, @@ -590,6 +592,10 @@ return AbstractModel.extend({ date_start.add(this.getSession().tzOffset, 'minutes'); date_stop.add(this.getSession().tzOffset, 'minutes'); + if (this.mapping.all_day && evt[this.mapping.all_day]) { + date_stop.add(1, 'days'); + } + var r = { 'record': evt, 'start': date_start, @@ -610,7 +616,7 @@ return AbstractModel.extend({ r.reset_allday = r.allDay; r.allDay = true; r.start = date_start.format('YYYY-MM-DD'); - r.end = date_stop.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD'); + r.end = date_stop.startOf('day').format('YYYY-MM-DD'); } return r; diff --git a/addons/web/static/src/js/views/calendar/calendar_renderer.js b/addons/web/static/src/js/views/calendar/calendar_renderer.js index fc76d42544f..9ffdb6d0524 100644 --- a/addons/web/static/src/js/views/calendar/calendar_renderer.js +++ b/addons/web/static/src/js/views/calendar/calendar_renderer.js @@ -314,10 +314,13 @@ return AbstractRenderer.extend({ event.title = $render.find('.o_field_type_char:first').text(); element.find('.fc-content').html($render.html()); element.addClass($render.attr('class')); - var display_hour = (event.start.format('HH:mm') === '00:00' ? event.r_start.format('HH:mm') : event.start.format('HH:mm')) + ' - ' + - (event.end && event.end.format('HH:mm') !== '00:00' ? event.end.format('HH:mm') : event.r_end.format('HH:mm')); - if (display_hour === '00:00 - 00:00') { - display_hour = _t('All the day'); + var display_hour = ''; + if (!event.allDay) { + display_hour = (event.start.format('HH:mm') === '00:00' ? event.r_start.format('HH:mm') : event.start.format('HH:mm')) + ' - ' + + (event.end && event.end.format('HH:mm') !== '00:00' ? event.end.format('HH:mm') : event.r_end.format('HH:mm')); + if (display_hour === '00:00 - 00:00') { + display_hour = _t('All the day'); + } } element.find('.fc-content .fc-time').text(display_hour); }, @@ -336,7 +339,7 @@ return AbstractRenderer.extend({ this.$small_calendar.datepicker({ 'onSelect': function (datum, obj) { self.trigger_up('changeDate', { - date: new Date(+obj.currentYear , +obj.currentMonth, +obj.currentDay).toString() + date: moment(new Date(+obj.currentYear , +obj.currentMonth, +obj.currentDay)) }); }, 'dayNamesMin' : this.state.fc_options.dayNamesShort, diff --git a/addons/web/static/src/js/views/calendar/calendar_view.js b/addons/web/static/src/js/views/calendar/calendar_view.js index c7876c2e119..04fb032f8cd 100644 --- a/addons/web/static/src/js/views/calendar/calendar_view.js +++ b/addons/web/static/src/js/views/calendar/calendar_view.js @@ -108,7 +108,7 @@ var CalendarView = AbstractView.extend({ //if quick_add = False, we don't allow quick_add //if quick_add = not specified in view, we use the default widgets.QuickCreate //if quick_add = is NOT False and IS specified in view, we this one for widgets.QuickCreate' - this.controllerParams.quick_add_pop = (attrs.quick_add || utils.toBoolElse(attrs.quick_add+'', true)); + this.controllerParams.quick_add_pop = (!('quick_add' in attrs) || utils.toBoolElse(attrs.quick_add+'', true)); this.controllerParams.disable_quick_create = params.disable_quick_create || !this.controllerParams.quick_add_pop; this.controllerParams.confirm_on_delete = true; // If this field is set ot true, we don't open the event in form view, but in a popup with the view_id passed by this parameter diff --git a/addons/web/static/tests/helpers/test_utils.js b/addons/web/static/tests/helpers/test_utils.js index c4b30c3dbb7..1c04548a218 100644 --- a/addons/web/static/tests/helpers/test_utils.js +++ b/addons/web/static/tests/helpers/test_utils.js @@ -396,8 +396,8 @@ function dragAndDrop($el, $to) { function triggerMouseEvent($el, type) { var pos = $el.offset(); var e = new $.Event(type); - e.pageX = pos.left; - e.pageY = pos.top; + e.pageX = e.layerX = e.screenX = pos.left; + e.pageY = e.layerY = e.screenY =pos.top; e.which = 1; $el.trigger(e); } diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js index 43b046e53d2..7813320af1d 100644 --- a/addons/web/static/tests/views/calendar_tests.js +++ b/addons/web/static/tests/views/calendar_tests.js @@ -337,7 +337,7 @@ QUnit.module('Views', { }); QUnit.test('create event with timezone in week mode', function (assert) { - assert.expect(7); + assert.expect(8); this.data.event.records = []; @@ -362,6 +362,17 @@ QUnit.module('Views', { session: { tzOffset: 120 }, + mockRPC: function (route, args) { + if (args.method === "write") { + assert.deepEqual(args.args[1], { + "allday": false, + "start": "2016-12-12 06:00:00", + "stop": "2016-12-12 10:00:00" + }, + "should move the event"); + } + return this._super(route, args); + }, }); @@ -433,10 +444,108 @@ QUnit.module('Views', { }, "the new record should have the utc datetime (formViewDialog)"); + testUtils.triggerPositionalMouseEvent(left, top, "mousedown"); + left = calendar.$('.fc-day:eq(1)').offset().left + 5; + testUtils.triggerPositionalMouseEvent(left, top, "mousemove"); + testUtils.triggerPositionalMouseEvent(left, top, "mouseup"); + calendar.destroy(); $view.remove(); }); + QUnit.test('create all day event', function (assert) { + assert.expect(2); + + this.data.event.records = []; + + var calendar = createView({ + View: CalendarView, + model: 'event', + data: this.data, + arch: + ''+ + ''+ + '', + archs: archs, + viewOptions: { + initialDate: initialDate, + }, + session: { + tzOffset: 120 + }, + }); + + var $view = $('#qunit-fixture').contents(); + $view.prependTo('body'); // => select with click position + + + var pos = calendar.$('.fc-bg td:eq(4)').offset(); + testUtils.triggerPositionalMouseEvent(pos.left+15, pos.top+15, "mousedown"); + 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"); + + $('.modal input:first').val('new event').trigger('input'); + $('.modal button.btn:contains(Create)').trigger('click'); + var $newevent = calendar.$('.fc-event:contains(new event)'); + + assert.strictEqual($newevent.text().replace(/[\s\n\r]+/g, ''), "newevent", + "should display the new event with time and title"); + + assert.deepEqual($newevent.data('fcSeg').event.record, + { + display_name: "new event", + start: "2016-12-14 00:00:00", + stop: "2016-12-15 00:00:00", + allday: true, + name: "new event", + id: 1 + }, + "the new record should have the utc datetime (quickCreate)"); + + calendar.destroy(); + $view.remove(); + }); + + QUnit.test('use mini calendar', function (assert) { + assert.expect(2); + + var calendar = createView({ + View: CalendarView, + model: 'event', + data: this.data, + arch: + ''+ + ''+ + '', + archs: archs, + viewOptions: { + initialDate: initialDate, + }, + session: { + tzOffset: 120 + }, + }); + + assert.strictEqual(calendar.$('.fc-event').length, 9, "should display 9 events on the week (4 event + 5 days event)"); + $('.o_calendar_mini a:contains(19)').click(); + assert.strictEqual(calendar.$('.fc-event').length, 4, "should display 4 events on the week (1 event + 3 days event)"); + + calendar.destroy(); + }); + QUnit.test('rendering, with many2many', function (assert) { assert.expect(1);