diff --git a/addons/calendar/static/src/views/attendee_calendar/attendee_calendar_controller.js b/addons/calendar/static/src/views/attendee_calendar/attendee_calendar_controller.js index a1f6b28ee86..83cc27b5970 100644 --- a/addons/calendar/static/src/views/attendee_calendar/attendee_calendar_controller.js +++ b/addons/calendar/static/src/views/attendee_calendar/attendee_calendar_controller.js @@ -36,34 +36,29 @@ export class AttendeeCalendarController extends CalendarController { }); } + getQuickCreateFormViewProps(record) { + const props = super.getQuickCreateFormViewProps(record); + const onDialogClosed = () => { + this.model.load(); + }; + return { + ...props, + size: "md", + goToFullEvent: (contextData) => { + const fullContext = { + ...props.context, + ...contextData + }; + this.goToFullEvent(false, fullContext) + }, + onRecordSaved: () => onDialogClosed(), + }; + } + async editRecord(record, context = {}) { if (record.id) { return this.goToFullEvent(record.id, context); } - const onDialogClosed = () => { - this.model.load(); - }; - return new Promise((resolve) => { - this.displayDialog( - CalendarQuickCreate, { - viewId: this.model.quickCreateFormViewId, - resModel: "calendar.event", - size: "md", - context, - goToFullEvent: (contextData) => { - const fullContext = { - ...context, - ...contextData - }; - this.goToFullEvent(false, fullContext) - }, - onRecordSaved: () => resolve(onDialogClosed()), - onRecordDiscarded: () => resolve(onDialogClosed()) - }, { - onClose: () => resolve() - } - ); - }); } /** @@ -120,3 +115,7 @@ export class AttendeeCalendarController extends CalendarController { } } AttendeeCalendarController.template = "calendar.AttendeeCalendarController"; +AttendeeCalendarController.components = { + ...AttendeeCalendarController.components, + QuickCreateFormView: CalendarQuickCreate, +} diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml index 54e49ef3dde..61ef4b5bfb0 100644 --- a/addons/calendar/views/calendar_views.xml +++ b/addons/calendar/views/calendar_views.xml @@ -352,8 +352,7 @@ diff --git a/addons/web/static/src/views/calendar/calendar_arch_parser.js b/addons/web/static/src/views/calendar/calendar_arch_parser.js index 7dabe2e2a19..161751994aa 100644 --- a/addons/web/static/src/views/calendar/calendar_arch_parser.js +++ b/addons/web/static/src/views/calendar/calendar_arch_parser.js @@ -29,13 +29,12 @@ export class CalendarArchParser extends XMLParser { let scale = "week"; let canCreate = true; let canDelete = true; - let hasQuickCreate = true; + let quickCreate = true; let hasEditDialog = false; let showUnusualDays = false; let isDateHidden = false; let isTimeHidden = false; let formViewId = false; - let quickCreateFormViewId = false; const popoverFields = {}; const filtersInfo = {}; @@ -85,7 +84,14 @@ export class CalendarArchParser extends XMLParser { canDelete = archParseBoolean(node.getAttribute("delete"), true); } if (node.hasAttribute("quick_add")) { - hasQuickCreate = archParseBoolean(node.getAttribute("quick_add"), true); + quickCreate = archParseBoolean(node.getAttribute("quick_add"), true); + // quick_add could contain either false, true or an id for a form view + if (quickCreate) { + const viewId = parseInt(node.getAttribute("quick_add"), 10); + if (viewId > 1) { + quickCreate = viewId; + } + } } if (node.hasAttribute("event_open_popup")) { hasEditDialog = archParseBoolean(node.getAttribute("event_open_popup")); @@ -102,12 +108,6 @@ export class CalendarArchParser extends XMLParser { if (node.hasAttribute("form_view_id")) { formViewId = parseInt(node.getAttribute("form_view_id"), 10); } - if (node.hasAttribute("quick_create_form_view_id")) { - quickCreateFormViewId = parseInt( - node.getAttribute("quick_create_form_view_id"), - 10 - ); - } break; } @@ -189,9 +189,8 @@ export class CalendarArchParser extends XMLParser { fieldNames: [...fieldNames], filtersInfo, formViewId, - quickCreateFormViewId, hasEditDialog, - hasQuickCreate, + quickCreate, isDateHidden, isTimeHidden, popoverFields, diff --git a/addons/web/static/src/views/calendar/calendar_controller.js b/addons/web/static/src/views/calendar/calendar_controller.js index 51cf775f0bd..9f070d14d66 100644 --- a/addons/web/static/src/views/calendar/calendar_controller.js +++ b/addons/web/static/src/views/calendar/calendar_controller.js @@ -116,11 +116,33 @@ export class CalendarController extends Component { }; } + getQuickCreateFormViewProps(record) { + const rawRecord = this.model.buildRawRecord(record); + const context = this.model.makeContextDefaults(rawRecord); + return { + resModel: this.model.resModel, + viewId: this.model.quickCreateFormViewId, + context, + }; + } + createRecord(record) { if (!this.model.canCreate) { return; } if (this.model.hasQuickCreate) { + if (this.model.quickCreateFormViewId) { + return new Promise((resolve) => { + this.displayDialog( + this.constructor.components.QuickCreateFormView, + this.getQuickCreateFormViewProps(record), + { + onClose: () => resolve(), + } + ); + }); + } + return new Promise((resolve) => { this.displayDialog( this.constructor.components.QuickCreate, @@ -223,6 +245,7 @@ CalendarController.components = { FilterPanel: CalendarFilterPanel, MobileFilterPanel: CalendarMobileFilterPanel, QuickCreate: CalendarQuickCreate, + QuickCreateFormView: FormViewDialog, Layout, SearchBar, ViewScaleSelector, diff --git a/addons/web/static/src/views/calendar/calendar_model.js b/addons/web/static/src/views/calendar/calendar_model.js index 1a17ac74841..4db550bf8ac 100644 --- a/addons/web/static/src/views/calendar/calendar_model.js +++ b/addons/web/static/src/views/calendar/calendar_model.js @@ -102,7 +102,7 @@ export class CalendarModel extends Model { return this.meta.hasEditDialog; } get hasQuickCreate() { - return this.meta.hasQuickCreate; + return Boolean(this.meta.quickCreate); } get isDateHidden() { return this.meta.isDateHidden; @@ -136,7 +136,8 @@ export class CalendarModel extends Model { } get quickCreateFormViewId() { - return this.meta.quickCreateFormViewId; + const quickCreate = parseInt(this.meta.quickCreate); + return quickCreate ? quickCreate : false; } get defaultFilterLabel() { diff --git a/addons/web/static/src/views/calendar/quick_create/calendar_quick_create.xml b/addons/web/static/src/views/calendar/quick_create/calendar_quick_create.xml index 2839dd6757e..ce6b3920a82 100644 --- a/addons/web/static/src/views/calendar/quick_create/calendar_quick_create.xml +++ b/addons/web/static/src/views/calendar/quick_create/calendar_quick_create.xml @@ -5,7 +5,7 @@
{ filtersInfo: {}, formViewId: false, hasEditDialog: false, - hasQuickCreate: true, - quickCreateFormViewId: false, + quickCreate: true, isDateHidden: false, isTimeHidden: false, popoverFields: {}, @@ -88,14 +87,15 @@ QUnit.test("hasEditDialog", (assert) => { check(assert, "event_open_popup", "0", "hasEditDialog", false); }); -QUnit.test("hasQuickCreate", (assert) => { - check(assert, "quick_add", "", "hasQuickCreate", true); - check(assert, "quick_add", "true", "hasQuickCreate", true); - check(assert, "quick_add", "True", "hasQuickCreate", true); - check(assert, "quick_add", "1", "hasQuickCreate", true); - check(assert, "quick_add", "false", "hasQuickCreate", false); - check(assert, "quick_add", "False", "hasQuickCreate", false); - check(assert, "quick_add", "0", "hasQuickCreate", false); +QUnit.test("quickCreate", (assert) => { + check(assert, "quick_add", "", "quickCreate", true); + check(assert, "quick_add", "true", "quickCreate", true); + check(assert, "quick_add", "True", "quickCreate", true); + check(assert, "quick_add", "1", "quickCreate", true); + check(assert, "quick_add", "false", "quickCreate", false); + check(assert, "quick_add", "False", "quickCreate", false); + check(assert, "quick_add", "0", "quickCreate", false); + check(assert, "quick_add", "12", "quickCreate", 12); }); QUnit.test("isDateHidden", (assert) => { diff --git a/addons/web/static/tests/views/calendar/calendar_view_tests.js b/addons/web/static/tests/views/calendar/calendar_view_tests.js index 000ff36ac27..067505d5c87 100644 --- a/addons/web/static/tests/views/calendar/calendar_view_tests.js +++ b/addons/web/static/tests/views/calendar/calendar_view_tests.js @@ -1,7 +1,7 @@ /** @odoo-module **/ import { registerCleanup } from "../../helpers/cleanup"; -import { defaultLocalization } from "../../helpers/mock_services"; +import { defaultLocalization, makeFakeDialogService } from "../../helpers/mock_services"; import { click, editInput, @@ -34,6 +34,7 @@ import { selectTimeRange, toggleFilter, toggleSectionFilter, + clickAllDaySlot, } from "../../views/calendar/helpers"; import { makeView, setupViewRegistries } from "../../views/helpers"; import { createWebClient, doAction } from "../../webclient/helpers"; @@ -4738,4 +4739,31 @@ QUnit.module("Views", ({ beforeEach }) => { // test would fail here if we went to week mode assert.containsOnce(target, ".fc-dayGridMonth-view"); }); + + QUnit.test("calendar rendering with form view id being passed in quick_add", async (assert) => { + serviceRegistry.add( + "dialog", + makeFakeDialogService((className, props) => { + assert.equal(props.viewId, 2); + return () => {}; + }), + { force: true } + ); + await makeView({ + type: "calendar", + resModel: "event", + serverData, + arch: ` + + + + `, + }); + const date = target.querySelector(".fc-day-grid td"); + await clickAllDaySlot(target, date.dataset.date); + const datepicker = document.querySelector("#ui-datepicker-div"); + if (datepicker) { + datepicker.remove(); + } + }); }); diff --git a/addons/web/static/tests/views/calendar/helpers.js b/addons/web/static/tests/views/calendar/helpers.js index c98f923216d..e14c0725e1b 100644 --- a/addons/web/static/tests/views/calendar/helpers.js +++ b/addons/web/static/tests/views/calendar/helpers.js @@ -230,7 +230,7 @@ function makeFakeModelState() { isTimeHidden: false, hasAllDaySlot: true, hasEditDialog: false, - hasQuickCreate: false, + quickCreate: false, popoverFields: { name: Field.parseFieldNode(fakeFieldNode, fakeModels, "event", "calendar"), },