From 0f7f3fc2f1c78cfaaaef435c1189ac79fe330b15 Mon Sep 17 00:00:00 2001
From: David Monjoie <dmo@odoo.com>
Date: Tue, 27 Jun 2017 10:25:49 +0200
Subject: [PATCH] [FIX] web: prevent traceback on quickCreate in calendar

---
 .../js/views/calendar/calendar_controller.js  |  4 +-
 .../web/static/tests/views/calendar_tests.js  | 57 +++++++++++++++++++
 2 files changed, 60 insertions(+), 1 deletion(-)

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 6d827adf9906..db2394ddd1db 100644
--- a/addons/web/static/src/js/views/calendar/calendar_controller.js
+++ b/addons/web/static/src/js/views/calendar/calendar_controller.js
@@ -156,8 +156,10 @@ var CalendarController = AbstractController.extend({
                 self.quick.destroy();
                 self.quick = null;
                 self.reload(id);
-            }, function () {
+            }, function (error, errorEvent) {
                 // This will occurs if there are some more fields required
+                // Preventdefaulting the error event will prevent the traceback window
+                errorEvent.preventDefault();
                 event.data.options.disableQuickCreate = true;
                 event.data.data.on_save = self.quick.destroy.bind(self.quick);
                 self._onOpenCreate(event.data);
diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js
index def68d54e162..25676e6547d2 100644
--- a/addons/web/static/tests/views/calendar_tests.js
+++ b/addons/web/static/tests/views/calendar_tests.js
@@ -349,6 +349,63 @@ QUnit.module('Views', {
         calendar.destroy();
     });
 
+    QUnit.test('quickcreate switching to actual create for required fields', function (assert) {
+        assert.expect(4);
+
+        var event = $.Event();
+        var calendar = createView({
+            View: CalendarView,
+            model: 'event',
+            data: this.data,
+            arch:
+            '<calendar class="o_calendar_test" '+
+                'string="Events" ' +
+                'event_open_popup="true" '+
+                'date_start="start" '+
+                'date_stop="stop" '+
+                'all_day="allday" '+
+                'mode="month" '+
+                'readonly_form_view_id="1">'+
+                    '<field name="name"/>'+
+            '</calendar>',
+            archs: archs,
+            viewOptions: {
+                initialDate: initialDate,
+            },
+            mockRPC: function (route, args) {
+                if (args.method === "create") {
+                    return $.Deferred().reject({
+                        code: 200,
+                        data: {},
+                        message: "Odoo server error",
+                    }, event);
+                }
+                return this._super(route, args);
+            },
+        });
+
+        // create a new event
+        var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)');
+        testUtils.triggerMouseEvent($cell, "mousedown");
+        testUtils.triggerMouseEvent($cell, "mouseup");
+
+        assert.strictEqual($('.modal-dialog.modal-sm .modal-title').text(), 'Create',
+            "should open the quick create dialog");
+
+        $('.modal-body input:first').val('new event in quick create').trigger('input');
+        $('.modal button.btn:contains(Create)').trigger('click').trigger('click');
+
+        // If the event is not default-prevented, a traceback will be raised, which we do not want
+        assert.ok(event.isDefaultPrevented(), "fail deferred event should have been default-prevented");
+
+        assert.strictEqual($('.modal-dialog.modal-lg .modal-title').text(), 'Create: Events',
+            "should have switched to a bigger modal for an actual create rather than quickcreate");
+        assert.strictEqual($('.modal-dialog.modal-lg .modal-body .o_form_view.o_form_editable').length, 1,
+            "should open the full event form view in a dialog");
+
+        calendar.destroy();
+    });
+
     QUnit.test('create event with timezone in week mode', function (assert) {
         assert.expect(5);
 
-- 
GitLab