From 3e37ec8844ee66b3898f8799be1765d080e0bfb4 Mon Sep 17 00:00:00 2001 From: "Tiffany Chang (tic)" Date: Tue, 31 Dec 2019 10:37:16 +0000 Subject: [PATCH] [IMP] web: add 'create' attribute to calendar view Previously it was always possible to create within the calendar view. For some modules this did not make sense and lead to confusing behavior, for example: a new model instance created in the calendar view that was not viewable in the calendar view, but was viewable in other views. By adding a 'create' attribute (to be used in view xml), we allow users to choose whether or not they want a calendar view to be able to create. Note that this change does not affect the edit ability of calendar views for existing instances. Part of Task: 2126530 --- .../src/js/views/calendar/calendar_view.js | 2 +- .../web/static/tests/views/calendar_tests.js | 96 +++++++++++++++++++ doc/reference/views.rst | 4 +- odoo/addons/base/rng/calendar_view.rng | 1 + 4 files changed, 101 insertions(+), 2 deletions(-) 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 b1a6ea7be13..9c9355145ee 100644 --- a/addons/web/static/src/js/views/calendar/calendar_view.js +++ b/addons/web/static/src/js/views/calendar/calendar_view.js @@ -146,7 +146,7 @@ var CalendarView = AbstractView.extend({ this.loadParams.fields = fields; this.loadParams.fieldsInfo = viewInfo.fieldsInfo; this.loadParams.editable = !fields[mapping.date_start].readonly; - this.loadParams.creatable = true; + this.loadParams.creatable = this.controllerParams.activeActions.create; this.loadParams.eventLimit = eventLimit; this.loadParams.fieldColor = attrs.color; diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js index fb0a64b7705..0a3c31474e1 100644 --- a/addons/web/static/tests/views/calendar_tests.js +++ b/addons/web/static/tests/views/calendar_tests.js @@ -3078,6 +3078,102 @@ QUnit.module('Views', { calendar.destroy(); }); + + QUnit.test('edit record and attempt to create a record with "create" attribute set to false', async function (assert) { + assert.expect(8); + + var calendar = await createCalendarView({ + View: CalendarView, + model: 'event', + data: this.data, + arch: + '', + archs: archs, + mockRPC: function (route, args) { + if (args.method === 'write') { + assert.deepEqual(args.args[1], {name: 'event 4 modified'}, "should update the record"); + } + return this._super.apply(this, arguments); + }, + viewOptions: { + initialDate: initialDate, + }, + }); + + // editing existing events should still be possible + // click on an existing event to open the formViewDialog + + await testUtils.dom.click(calendar.$('.fc-event:contains(event 4) .fc-content')); + + assert.ok(calendar.$('.o_cw_popover').length, "should open a popover clicking on event"); + assert.ok(calendar.$('.o_cw_popover .o_cw_popover_edit').length, "popover should have an edit button"); + assert.ok(calendar.$('.o_cw_popover .o_cw_popover_delete').length, "popover should have a delete button"); + assert.ok(calendar.$('.o_cw_popover .o_cw_popover_close').length, "popover should have a close button"); + + await testUtils.dom.click(calendar.$('.o_cw_popover .o_cw_popover_edit')); + + assert.ok($('.modal-body').length, "should open the form view in dialog when click on edit"); + + await testUtils.fields.editInput($('.modal-body input:first'), 'event 4 modified'); + await testUtils.dom.click($('.modal-footer button.btn:contains(Save)')); + + assert.notOk($('.modal-body').length, "save button should close the modal"); + + // creating an event should not be possible + // attempt to create a new event with create set to false + + var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)'); + + testUtils.dom.triggerMouseEvent($cell, "mousedown"); + testUtils.dom.triggerMouseEvent($cell, "mouseup"); + await testUtils.nextTick(); + + assert.notOk($('.modal-sm').length, "shouldn't open a quick create dialog for creating a new event with create attribute set to false"); + + calendar.destroy(); + }); + + + QUnit.test('attempt to create record with "create" and "quick_add" attributes set to false', async function (assert) { + assert.expect(1); + + var calendar = await createCalendarView({ + View: CalendarView, + model: 'event', + data: this.data, + arch: + '', + archs: archs, + viewOptions: { + initialDate: initialDate, + }, + }); + + // attempt to create a new event with create set to false + + var $cell = calendar.$('.fc-day-grid .fc-row:eq(5) .fc-day:eq(2)'); + + testUtils.dom.triggerMouseEvent($cell, "mousedown"); + testUtils.dom.triggerMouseEvent($cell, "mouseup"); + await testUtils.nextTick(); + + assert.strictEqual($('.modal').length, 0, "shouldn't open a form view for creating a new event with create attribute set to false"); + + calendar.destroy(); + }); }); }); diff --git a/doc/reference/views.rst b/doc/reference/views.rst index 1925ad3f07b..2a22bc6b13a 100644 --- a/doc/reference/views.rst +++ b/doc/reference/views.rst @@ -907,7 +907,9 @@ calendar view are: ``mode`` Default display mode when loading the calendar. Possible attributes are: ``day``, ``week``, ``month`` - +``create`` + allows *dis*\ abling the corresponding action in the view by setting the + corresponding attribute to ``false`` ```` declares fields to aggregate or to use in kanban *logic*. If the field is simply displayed in the calendar cards. diff --git a/odoo/addons/base/rng/calendar_view.rng b/odoo/addons/base/rng/calendar_view.rng index f073bab4bf1..3e122fd018d 100644 --- a/odoo/addons/base/rng/calendar_view.rng +++ b/odoo/addons/base/rng/calendar_view.rng @@ -22,6 +22,7 @@ +