From cd78695126596ad66adc087e4ed09e9cacebd7d5 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 28 Mar 2017 15:49:35 +0200 Subject: [PATCH] [FIX] web: with begin date is readonly event can be created but not modified --- .../js/views/calendar/calendar_controller.js | 41 ++++++++++++--- .../src/js/views/calendar/calendar_model.js | 3 +- .../views/calendar/calendar_quick_create.js | 51 +++++-------------- .../src/js/views/calendar/calendar_view.js | 2 +- addons/web/static/test/helpers/mock_server.js | 4 ++ .../web/static/test/views/calendar_tests.js | 2 +- 6 files changed, 56 insertions(+), 47 deletions(-) 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 0efb196ebcf..c36dbfab941 100644 --- a/addons/web/static/src/js/views/calendar/calendar_controller.js +++ b/addons/web/static/src/js/views/calendar/calendar_controller.js @@ -23,6 +23,7 @@ var CalendarController = AbstractController.extend({ confirm_on_delete: true, }), custom_events: _.extend({}, AbstractController.prototype.custom_events, { + quickCreate: '_onQuickCreate', openCreate: '_onOpenCreate', openEvent: '_onOpenEvent', dropRecord: '_onDropRecord', @@ -146,6 +147,33 @@ var CalendarController = AbstractController.extend({ _onDropRecord: function (event) { this._updateRecord(event.data); }, + /** + * Handles saving data coming from quick create box + * + * @private + * @param {OdooEvent} event + */ + _onQuickCreate: function (event) { + var self = this; + var data = this.model.calendarEventToRecord(event.data.data); + var options = event.data.options; + return this._rpc({ + model: this.model.modelName, + method: 'create', + args: [$.extend({}, this.quick.data_template, data)], + context: _.pick(options, 'context'), + }) + .then(function (id) { + self.quick.destroy(); + self.quick = null; + self.reload(id); + }, function () { + // This will occurs if there are some more fields required + data.disable_quick_create = true; + data.on_save = this.destroy.bind(this); + self._onOpenCreate({data: data}); + }); + }, /** * @param {OdooEvent} event */ @@ -173,13 +201,14 @@ var CalendarController = AbstractController.extend({ if(!options.disable_quick_create && !event.data.disable_quick_create) { if (this.quick != null) { - return this.quick.close(); + this.quick.destroy(); + this.quick = null; + return; } - var model = this.modelName; - var quick = new QuickCreate(this, model, true, options, data, event.data); - quick.on('added', this, this.reload.bind(this)); - quick.open(); - quick.focus(); + this.quick = new QuickCreate(this, true, options, data, event.data); + this.quick.on('added', this, this.reload.bind(this)); + this.quick.open(); + this.quick.focus(); return; } 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 34723e63995..63d58db3ca9 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -161,6 +161,7 @@ return AbstractModel.extend({ // Check whether the date field is editable (i.e. if the events can be // dragged and dropped) this.editable = params.editable; + this.creatable = params.creatable; // display more button when there are too much event on one day this.eventLimit = params.eventLimit; @@ -319,7 +320,7 @@ return AbstractModel.extend({ return { defaultView: (this.mode === "month")? "month" : ((this.mode === "week")? "agendaWeek" : ((this.mode === "day")? "agendaDay" : "agendaWeek")), header: false, - selectable: this.editable && this.create_right, + selectable: this.creatable && this.create_right, selectHelper: true, editable: this.editable, droppable: true, diff --git a/addons/web/static/src/js/views/calendar/calendar_quick_create.js b/addons/web/static/src/js/views/calendar/calendar_quick_create.js index 8bf2bc8235a..497d3c1c05b 100644 --- a/addons/web/static/src/js/views/calendar/calendar_quick_create.js +++ b/addons/web/static/src/js/views/calendar/calendar_quick_create.js @@ -20,14 +20,12 @@ var QuickCreate = Dialog.extend({ /** * @constructor * @param {Widget} parent - * @param {string} modelName - * @param {any} buttons - * @param {any} options - * @param {any} data_template - * @param {any} data_calendar + * @param {Object} buttons + * @param {Object} options + * @param {Object} data_template + * @param {Object} dataCalendar */ - init: function (parent, modelName, buttons, options, data_template, data_calendar) { - this.modelName = modelName; + init: function (parent, buttons, options, data_template, dataCalendar) { this._buttons = buttons || false; this.options = options; @@ -41,15 +39,15 @@ var QuickCreate = Dialog.extend({ size: 'small', buttons: this._buttons ? [ {text: _t("Create"), classes: 'btn-primary', click: function () { - if (!self._quickAdd()) { + if (!self._quickAdd(dataCalendar)) { self.focus(); } }}, {text: _t("Edit"), click: function () { - data_calendar.disable_quick_create = true; - data_calendar.title = self.$input.val().trim(); - data_calendar.on_save = self.destroy.bind(self); - self.trigger_up('openCreate', data_calendar); + dataCalendar.disable_quick_create = true; + dataCalendar.title = self.$input.val().trim(); + dataCalendar.on_save = self.destroy.bind(self); + self.trigger_up('openCreate', dataCalendar); }}, {text: _t("Cancel"), close: true}, ] : [], @@ -67,10 +65,6 @@ var QuickCreate = Dialog.extend({ this.slow_create(); return; } - this.on('added', this, function () { - self.close(); - }); - this.$input = this.$('input').keyup(function enterHandler (e) { if(e.keyCode === $.ui.keyCode.ENTER) { self.$input.off('keyup', enterHandler); @@ -113,29 +107,10 @@ var QuickCreate = Dialog.extend({ /** * Gathers data from the quick create dialog a launch quick_create(data) method */ - _quickAdd: function () { + _quickAdd: function (dataCalendar) { var val = this.$input.val().trim(); - return (val)? this._quickCreate({'name': val}, this.options) : false; - }, - /** - * Handles saving data coming from quick create box - */ - _quickCreate: function (data, options) { - var self = this; - return this._rpc({ - model: this.modelName, - method: 'create', - args: [$.extend({}, this.data_template, data)], - context: _.pick(options, 'context'), - }) - .then(function (id) { - self.trigger('added', id); - self.$input.val(""); - }, function (r, event) { - event.preventDefault(); - // This will occurs if there are some more fields required - self.slow_create(data); - }); + dataCalendar.title = val; + return (val)? this.trigger_up('quickCreate', {data: dataCalendar, options: this.options}) : false; }, }); 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 c5df8b7f8f7..a8e1a3f992d 100644 --- a/addons/web/static/src/js/views/calendar/calendar_view.js +++ b/addons/web/static/src/js/views/calendar/calendar_view.js @@ -125,6 +125,7 @@ var CalendarView = AbstractView.extend({ this.loadParams.fields = fields; this.loadParams.fieldsInfo = viewInfo.fieldsInfo; this.loadParams.editable = !this.controllerParams.read_only_mode && !fields[mapping.date_start].readonly; + this.loadParams.creatable = !this.controllerParams.read_only_mode; this.loadParams.eventLimit = eventLimit; this.loadParams.field_color = attrs.color; @@ -132,7 +133,6 @@ var CalendarView = AbstractView.extend({ this.loadParams.mode = attrs.mode; this.loadParams.scale_zoom = attrs.scale_zoom; this.loadParams.initialDate = params.initialDate || new Date(); - }, }); diff --git a/addons/web/static/test/helpers/mock_server.js b/addons/web/static/test/helpers/mock_server.js index cf03c8269e3..1b7aeecd4f0 100644 --- a/addons/web/static/test/helpers/mock_server.js +++ b/addons/web/static/test/helpers/mock_server.js @@ -885,6 +885,10 @@ var MockServer = Class.extend({ for (var field_changed in values) { var field = this.data[model].fields[field_changed]; var value = values[field_changed]; + if (!field) { + console.warn("Mock: Can't write on field '" + field_changed + "' on model '" + model + "' (field is undefined)"); + continue; + } if (_.contains(['one2many', 'many2many'], field.type)) { // convert commands _.each(value, function (command) { diff --git a/addons/web/static/test/views/calendar_tests.js b/addons/web/static/test/views/calendar_tests.js index b5abb4d2b5f..fdd7892e42a 100644 --- a/addons/web/static/test/views/calendar_tests.js +++ b/addons/web/static/test/views/calendar_tests.js @@ -276,7 +276,7 @@ QUnit.module('Views', { $('.modal-body input:first').val('new event in quick create').trigger('input'); $('.modal button.btn:contains(Create)').trigger('click'); - assert.ok(calendar.$('.fc-event:contains(new event in quick create)').length, "should display the new record"); + assert.strictEqual(calendar.$('.fc-event:contains(new event in quick create)').length, 1, "should display the new record"); assert.strictEqual(calendar.$('td.fc-event-container[colspan]').length, 2, "should the new record have only one day"); // create a new event with 2 days