diff options
| author | Michael Mattiello (mcm) <mcm@odoo.com> | 2020-07-31 14:29:46 +0000 |
|---|---|---|
| committer | Michael Mattiello (mcm) <mcm@odoo.com> | 2020-08-11 12:32:54 +0000 |
| commit | 1e11249c93a7cc6fc133c05103259177789c4d7e (patch) | |
| tree | 771368dd21a9e6b943925dcf6f062a71ad5bcab6 | |
| parent | 1fc33a63beb20d134081c93852e62f5fe0ff67d4 (diff) | |
[IMP] base,web: add scales param to calendar
This commit adds the parameter `scales` in the calendar view's template.
This parameter can be used to choose which mode(s) is/are allowed.
This commit also refactors the way we manage calendar scales.
Before scales were defined in model and renderer, now it's defined
in the view and given to model, controller and renderer by params.
Task: 2193921
| -rw-r--r-- | addons/web/static/src/js/views/calendar/calendar_controller.js | 5 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/calendar/calendar_model.js | 17 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/calendar/calendar_renderer.js | 25 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/calendar/calendar_view.js | 20 | ||||
| -rw-r--r-- | addons/web/static/src/xml/web_calendar.xml | 8 | ||||
| -rw-r--r-- | addons/web/static/tests/views/calendar_tests.js | 49 | ||||
| -rw-r--r-- | doc/reference/views.rst | 3 | ||||
| -rw-r--r-- | odoo/addons/base/rng/calendar_view.rng | 1 |
8 files changed, 91 insertions, 37 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 2483199fcf0..af07df6312c 100644 --- a/addons/web/static/src/js/views/calendar/calendar_controller.js +++ b/addons/web/static/src/js/views/calendar/calendar_controller.js @@ -68,6 +68,7 @@ var CalendarController = AbstractController.extend({ this.previousOpen = null; // The quickCreating attribute ensures that we don't do several create this.quickCreating = false; + this.scales = params.scales; }, //-------------------------------------------------------------------------- @@ -133,7 +134,9 @@ var CalendarController = AbstractController.extend({ * @return {{}} */ _renderButtonsParameters() { - return {}; + return { + scales: this.scales, + }; }, /** * @override 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 3cca3f3452d..b9950426af1 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -9,13 +9,6 @@ var session = require('web.session'); var _t = core._t; -var scales = [ - 'day', - 'week', - 'month', - 'year', -]; - function dateToServer (date) { return date.clone().utc().locale('en').format('YYYY-MM-DD HH:mm:ss'); } @@ -193,6 +186,7 @@ return AbstractModel.extend({ this.mapping = params.mapping; this.mode = params.mode; // one of month, week or day this.scales = params.scales; // one of month, week or day + this.scalesInfo = params.scalesInfo; // Check whether the date field is editable (i.e. if the events can be // dragged and dropped) @@ -336,7 +330,7 @@ return AbstractModel.extend({ * @param {string} scale the scale to set */ setScale: function (scale) { - if (!_.contains(scales, scale)) { + if (!_.contains(this.scales, scale)) { scale = "week"; } this.data.scale = scale; @@ -440,12 +434,7 @@ return AbstractModel.extend({ hour12: false, }; return { - defaultView: { - 'year': 'dayGridYear', - 'month': 'dayGridMonth', - 'week': 'timeGridWeek', - 'day': 'timeGridDay', - }[this.mode || 'week'], + defaultView: this.scalesInfo[this.mode || 'week'], header: false, selectable: this.creatable && this.create_right, selectMirror: true, 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 06a7ab7d84a..f01721a42bf 100644 --- a/addons/web/static/src/js/views/calendar/calendar_renderer.js +++ b/addons/web/static/src/js/views/calendar/calendar_renderer.js @@ -15,13 +15,6 @@ const { createYearCalendarView } = require('/web/static/src/js/libs/fullcalendar var _t = core._t; var qweb = core.qweb; -var scales = { - day: 'timeGridDay', - week: 'timeGridWeek', - month: 'dayGridMonth', - year: 'dayGridYear', -}; - var SidebarFilterM2O = relational_fields.FieldMany2One.extend({ _getSearchBlacklist: function () { return this._super.apply(this, arguments).concat(this.filter_ids || []); @@ -194,6 +187,7 @@ return AbstractRenderer.extend({ this.hideTime = params.hideTime; this.canDelete = params.canDelete; this.canCreate = params.canCreate; + this.scalesInfo = params.scalesInfo; this._isInDOM = false; }, /** @@ -493,16 +487,11 @@ return AbstractRenderer.extend({ } }, datesRender: function (info) { - // compute mode from view.type which is either - // 'dayGridYear', 'dayGridMonth', 'timeGridWeek' or 'timeGridDay' - const mode = { - dayGridYear: 'year', - dayGridMonth: 'month', - timeGridWeek: 'week', - timeGridDay: 'day', - }[info.view.type]; + const viewToMode = Object.fromEntries( + Object.entries(self.scalesInfo).map(([k, v]) => [v, k]) + ); self.trigger_up('viewUpdated', { - mode: mode, + mode: viewToMode[info.view.type], title: info.view.title, }); }, @@ -646,8 +635,8 @@ return AbstractRenderer.extend({ _renderCalendar() { this.calendar.unselect(); - if (scales[this.state.scale] !== this.calendar.view.type) { - this.calendar.changeView(scales[this.state.scale]); + if (this.scalesInfo[this.state.scale] !== this.calendar.view.type) { + this.calendar.changeView(this.scalesInfo[this.state.scale]); } if (this.target_date !== this.state.target_date.toString()) { 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 7a9073adf6e..b83b807290d 100644 --- a/addons/web/static/src/js/views/calendar/calendar_view.js +++ b/addons/web/static/src/js/views/calendar/calendar_view.js @@ -20,6 +20,13 @@ var fieldsToGather = [ "recurrence_update" ]; +const scalesInfo = { + day: 'timeGridDay', + week: 'timeGridWeek', + month: 'dayGridMonth', + year: 'dayGridYear', +}; + var CalendarView = AbstractView.extend({ display_name: _lt('Calendar'), icon: 'fa-calendar', @@ -151,11 +158,21 @@ var CalendarView = AbstractView.extend({ } } + let scales; + const allowedScales = Object.keys(scalesInfo); + if (arch.attrs.scales) { + scales = arch.attrs.scales.split(',') + .filter(x => allowedScales.includes(x)); + } else { + scales = allowedScales; + } + this.controllerParams.eventOpenPopup = utils.toBoolElse(attrs.event_open_popup || '', false); this.controllerParams.showUnusualDays = utils.toBoolElse(attrs.show_unusual_days || '', false); this.controllerParams.mapping = mapping; this.controllerParams.context = params.context || {}; this.controllerParams.displayName = params.action && params.action.name; + this.controllerParams.scales = scales; this.rendererParams.displayFields = displayFields; this.rendererParams.model = viewInfo.model; @@ -163,6 +180,7 @@ var CalendarView = AbstractView.extend({ this.rendererParams.hideTime = utils.toBoolElse(attrs.hide_time || '', false); this.rendererParams.canDelete = this.controllerParams.activeActions.delete; this.rendererParams.canCreate = this.controllerParams.activeActions.create; + this.rendererParams.scalesInfo = scalesInfo; this.loadParams.fieldNames = _.uniq(fieldNames); this.loadParams.mapping = mapping; @@ -175,7 +193,9 @@ var CalendarView = AbstractView.extend({ this.loadParams.filters = filters; this.loadParams.mode = (params.context && params.context.default_mode) || attrs.mode; + this.loadParams.scales = scales; this.loadParams.initialDate = moment(params.initialDate || new Date()); + this.loadParams.scalesInfo = scalesInfo; }, }); diff --git a/addons/web/static/src/xml/web_calendar.xml b/addons/web/static/src/xml/web_calendar.xml index 95ea6927a91..c54329e663b 100644 --- a/addons/web/static/src/xml/web_calendar.xml +++ b/addons/web/static/src/xml/web_calendar.xml @@ -110,10 +110,10 @@ <t t-name="CalendarView.scale_buttons"> <div class="btn-group"> - <button type="button" class="o_calendar_button_day btn btn-secondary">Day</button> - <button type="button" class="o_calendar_button_week btn btn-secondary">Week</button> - <button type="button" class="o_calendar_button_month btn btn-secondary">Month</button> - <button type="button" class="o_calendar_button_year btn btn-secondary">Year</button> + <button type="button" t-if="scales.includes('day')" class="o_calendar_button_day btn btn-secondary">Day</button> + <button type="button" t-if="scales.includes('week')" class="o_calendar_button_week btn btn-secondary">Week</button> + <button type="button" t-if="scales.includes('month')" class="o_calendar_button_month btn btn-secondary">Month</button> + <button type="button" t-if="scales.includes('year')" class="o_calendar_button_year btn btn-secondary">Year</button> </div> </t> diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js index a5db6a3f799..b9bd968b0fd 100644 --- a/addons/web/static/tests/views/calendar_tests.js +++ b/addons/web/static/tests/views/calendar_tests.js @@ -3688,6 +3688,55 @@ QUnit.module('Views', { calendar.destroy(); }); + + QUnit.test('allowed scales', async function (assert) { + assert.expect(8); + + let calendar = await createCalendarView({ + View: CalendarView, + model: 'event', + data: this.data, + arch: + `<calendar + date_start="start" + date_stop="stop" + all_day="allday"/>`, + archs: archs, + viewOptions: { + initialDate: initialDate, + }, + }); + + assert.containsOnce(calendar, '.o_calendar_scale_buttons .o_calendar_button_day'); + assert.containsOnce(calendar, '.o_calendar_scale_buttons .o_calendar_button_week'); + assert.containsOnce(calendar, '.o_calendar_scale_buttons .o_calendar_button_month'); + assert.containsOnce(calendar, '.o_calendar_scale_buttons .o_calendar_button_year'); + + calendar.destroy(); + + calendar = await createCalendarView({ + View: CalendarView, + model: 'event', + data: this.data, + arch: + `<calendar + date_start="start" + date_stop="stop" + all_day="allday" + scales="day,week"/>`, + archs: archs, + viewOptions: { + initialDate: initialDate, + }, + }); + + assert.containsOnce(calendar, '.o_calendar_scale_buttons .o_calendar_button_day'); + assert.containsOnce(calendar, '.o_calendar_scale_buttons .o_calendar_button_week'); + assert.containsNone(calendar, '.o_calendar_scale_buttons .o_calendar_button_month'); + assert.containsNone(calendar, '.o_calendar_scale_buttons .o_calendar_button_year'); + + calendar.destroy(); + }); }); }); diff --git a/doc/reference/views.rst b/doc/reference/views.rst index 405c5705e5a..ba23941bbe9 100644 --- a/doc/reference/views.rst +++ b/doc/reference/views.rst @@ -411,6 +411,9 @@ calendar view are: ``mode`` Default display mode when loading the calendar. Possible attributes are: ``day``, ``week``, ``month``, ``year`` +``scales`` + Comma-separated list of scales to provide. By default, all scales are + available. See mode for possible scale values. ``<field>`` declares fields to aggregate or to use in kanban *logic*. If the field is diff --git a/odoo/addons/base/rng/calendar_view.rng b/odoo/addons/base/rng/calendar_view.rng index f51fb116170..ee51acbde2e 100644 --- a/odoo/addons/base/rng/calendar_view.rng +++ b/odoo/addons/base/rng/calendar_view.rng @@ -24,6 +24,7 @@ <rng:optional><rng:attribute name="hide_date"/></rng:optional> <rng:optional><rng:attribute name="create"/></rng:optional> <rng:optional><rng:attribute name="delete"/></rng:optional> + <rng:optional><rng:attribute name="scales"/></rng:optional> <rng:optional> <rng:attribute name="mode"> <rng:choice> |
