diff options
| author | Christophe Matthieu <chm@odoo.com> | 2017-04-06 12:56:41 +0200 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2017-04-11 19:44:38 +0200 |
| commit | 3dfa2caa3d455415d09a7e3051a0f5c1294ca5c1 (patch) | |
| tree | 1d261105084a5ecad2f2a6ebbf8412590d99436a /addons/web/static/src/js | |
| parent | e7dfa4af775a93b291ccd570c05970f2ac2b9187 (diff) | |
[FIX] web: various bugs in calendar and move _rpc call into model
Diffstat (limited to 'addons/web/static/src/js')
5 files changed, 89 insertions, 85 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 c36dbfab941..5f432e37bfc 100644 --- a/addons/web/static/src/js/views/calendar/calendar_controller.js +++ b/addons/web/static/src/js/views/calendar/calendar_controller.js @@ -102,14 +102,7 @@ var CalendarController = AbstractController.extend({ * @param {integer} record.id */ _updateRecord: function (record) { - // Cannot modify actual name yet - var data = _.omit(this.model.calendarEventToRecord(record), 'name'); - this._rpc({ - model: this.model.modelName, - method: 'write', - args: [record.id, data], - }) - .then(this.reload.bind(this)); + this.model.updateRecord(record).reload.bind(this); }, //-------------------------------------------------------------------------- @@ -155,23 +148,16 @@ var CalendarController = AbstractController.extend({ */ _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'), - }) + this.model.createRecord(event) .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}); + event.data.options.disable_quick_create = true; + event.data.options.on_save = this.destroy.bind(this); + self._onOpenCreate(event.data); }); }, /** @@ -194,7 +180,13 @@ var CalendarController = AbstractController.extend({ context['default_' + this.mapping.date_delay] = data.duration; } if (this.mapping.all_day) { - context['default_' + this.mapping.all_day] = true; + context['default_' + this.mapping.all_day] = data[this.mapping.all_day]; + } + + for (var k in context) { + if (context[k] && context[k]._isAMomentObject) { + context[k] = context[k].clone().utc().format('YYYY-MM-DD HH:mm:ss'); + } } var options = _.extend({}, this.options, {context: context}); @@ -203,7 +195,6 @@ var CalendarController = AbstractController.extend({ if (this.quick != null) { this.quick.destroy(); this.quick = null; - return; } this.quick = new QuickCreate(this, true, options, data, event.data); this.quick.on('added', this, this.reload.bind(this)); @@ -262,11 +253,7 @@ var CalendarController = AbstractController.extend({ click: function () { Dialog.confirm(this, _t("Are you sure you want to delete this record ?"), { confirm_callback: function () { - self._rpc({ - model: self.modelName, - method: 'unlink', - args: [id], - }) + self.model.deleteRecords([id], self.modelName) .then(function () { self.dialog.destroy(); self.reload(); 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 63d58db3ca9..e7320aed5ee 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -2,11 +2,10 @@ odoo.define('web.CalendarModel', function (require) { "use strict"; var AbstractModel = require('web.AbstractModel'); +var core = require('web.core'); var field_utils = require('web.field_utils'); var session = require('web.session'); var time = require('web.time'); -var core = require('web.core'); -var data = require('web.data'); var _t = core._t; @@ -16,6 +15,10 @@ var scales = [ 'month' ]; +function dateToServer (date) { + return date.clone().utc().format('YYYY-MM-DD HH:mm:ss'); +} + return AbstractModel.extend({ init: function () { this._super.apply(this, arguments); @@ -32,8 +35,8 @@ return AbstractModel.extend({ calendarEventToRecord: function (event) { // Normalize event_end without changing fullcalendars event. var data = {'name': event.title}; - var start = moment(new Date(event.start)); - var end = moment(new Date(event.end)); + var start = event.start; + var end = event.end; //Bug when we move an all_day event from week or day view, we don't have // a date.end or duration... @@ -64,10 +67,6 @@ return AbstractModel.extend({ start.utc().hours(7); end.utc().hours(19); } - } else { - var offset = start.utcOffset(); - start.utc().add(-offset, 'minutes'); - end.utc().add(-offset, 'minutes'); } if (this.mapping.all_day) { @@ -82,13 +81,13 @@ return AbstractModel.extend({ } } - data[this.mapping.date_start] = time.datetime_to_str(start.toDate()); - if (this.mapping.date_delay) { - data[this.mapping.date_delay] = (end.diff(start) <= 0 ? end.endOf('day').diff(start) : end.diff(start)) / 1000 / 3600; + data[this.mapping.date_start] = start; + if (this.mapping.date_stop) { + data[this.mapping.date_stop] = end; } - if (this.mapping.date_stop) { - data[this.mapping.date_stop] = time.datetime_to_str(end.toDate()); + if (this.mapping.date_delay) { + data[this.mapping.date_delay] = (end.diff(start) <= 0 ? end.endOf('day').diff(start) : end.diff(start)) / 1000 / 3600; } return data; @@ -120,6 +119,23 @@ return AbstractModel.extend({ return true; }, /** + * @param {OdooEvent} event + */ + createRecord: function (event) { + var data = this.calendarEventToRecord(event.data.data); + for (var k in data) { + if (data[k] && data[k]._isAMomentObject) { + data[k] = dateToServer(data[k]); + } + } + return this._rpc({ + model: this.modelName, + method: 'create', + args: [data], + context: _.pick(event.data.options, 'context'), + }); + }, + /** * @todo I think this is dead code * * @param {any} ids @@ -201,10 +217,10 @@ return AbstractModel.extend({ return this.preload_def.then(this._loadCalendar.bind(this)); }, next: function () { - this.setDate(moment(this.data.target_date).add(1, this.data.scale)); + this.setDate(this.data.target_date.clone().add(1, this.data.scale)); }, prev: function () { - this.setDate(moment(this.data.target_date).add(-1, this.data.scale)); + this.setDate(this.data.target_date.clone().add(-1, this.data.scale)); }, /** * @todo: this should not work. it ignores the domain/context @@ -218,37 +234,23 @@ return AbstractModel.extend({ return this._loadCalendar(); }, /** - * @param {any} start - * @param {any} highlight + * @param {Moment} start + * @param {boolean} highlight */ setDate: function (start, highlight) { - this.data.start_date = this.data.end_date = this.data.target_date = this.data.highlight_date = new Date(start); + this.data.start_date = this.data.end_date = this.data.target_date = this.data.highlight_date = start; switch (this.data.scale) { case 'month': - this.data.start_date = moment(this.data.start_date) - .startOf('month') - .startOf('week') - .toDate(); - this.data.end_date = moment(this.data.start_date) - .add(5, 'week') - .endOf('week') - .toDate(); + this.data.start_date = this.data.start_date.clone().startOf('month').startOf('week'); + this.data.end_date = this.data.start_date.clone().add(5, 'week').endOf('week'); break; case 'week': - this.data.start_date = moment(this.data.start_date) - .startOf('week') - .toDate(); - this.data.end_date = moment(this.data.end_date) - .endOf('week') - .toDate(); + this.data.start_date = this.data.start_date.clone().startOf('week'); + this.data.end_date = this.data.end_date.clone().endOf('week'); break; default: - this.data.start_date = moment(this.data.start_date) - .startOf('day') - .toDate(); - this.data.end_date = moment(this.data.end_date) - .endOf('day') - .toDate(); + this.data.start_date = this.data.start_date.clone().startOf('day'); + this.data.end_date = this.data.end_date.clone().endOf('day'); } if (highlight) { this.data.highlight_date = this.data.target_date; @@ -262,12 +264,31 @@ return AbstractModel.extend({ this.setDate(this.data.target_date); }, today: function () { - this.setDate(new Date()); + this.setDate(moment(new Date())); }, toggleFullWidth: function () { var fullWidth = this.call('local_storage', 'getItem', 'calendar_fullWidth') !== 'true'; this.call('local_storage', 'setItem', 'calendar_fullWidth', fullWidth); }, + /** + * @param {Object} record + * @param {integer} record.id + */ + updateRecord: function (record) { + // Cannot modify actual name yet + var data = _.omit(this.calendarEventToRecord(record), 'name'); + for (var k in data) { + if (data[k] && data[k]._isAMomentObject) { + data[k] = dateToServer(data[k]); + } + } + return this._rpc({ + model: this.modelName, + method: 'write', + args: [record.id, data], + context: _.pick(event.data.options, 'context'), + }); + }, //-------------------------------------------------------------------------- // Private @@ -347,12 +368,11 @@ return AbstractModel.extend({ _getRangeDomain: function () { // Build OpenERP Domain to filter object by this.mapping.date_start field // between given start, end dates. - var format = time.datetime_to_str; - var domain = [[this.mapping.date_start, '<=', format(this.data.end_date)]]; + var domain = [[this.mapping.date_start, '<=', dateToServer(this.data.end_date)]]; if (this.mapping.date_stop) { - domain.push([this.mapping.date_stop, '>=', format(this.data.start_date)]); + domain.push([this.mapping.date_stop, '>=', dateToServer(this.data.start_date)]); } else if (!this.mapping.date_delay) { - domain.push([this.mapping.date_start, '>=', format(this.data.start_date)]); + domain.push([this.mapping.date_start, '>=', dateToServer(this.data.start_date)]); } return domain; }, @@ -552,25 +572,21 @@ return AbstractModel.extend({ attendees = []; if (!all_day) { - date_start = time.auto_str_to_date(evt[this.mapping.date_start]); - date_stop = this.mapping.date_stop ? time.auto_str_to_date(evt[this.mapping.date_stop]) : null; + date_start = field_utils.parse.datetime(evt[this.mapping.date_start]); + date_stop = this.mapping.date_stop ? field_utils.parse.datetime(evt[this.mapping.date_stop]) : null; } else { - date_start = time.auto_str_to_date(evt[this.mapping.date_start].split(' ')[0],'start'); - date_stop = this.mapping.date_stop ? time.auto_str_to_date(evt[this.mapping.date_stop].split(' ')[0],'start') : null; + date_start = field_utils.parse.datetime(evt[this.mapping.date_start].split(' ')[0],'start'); + date_stop = this.mapping.date_stop ? field_utils.parse.datetime(evt[this.mapping.date_stop].split(' ')[0],'start') : null; } if (!date_stop && date_delay) { - var m_start = moment(date_start).add(date_delay,'hours'); - date_stop = m_start.toDate(); + date_stop = date_start.clone().add(date_delay,'hours'); } - date_start = moment(date_start); - date_stop = moment(date_stop); - var r = { 'record': evt, - 'start': date_start.format('YYYY-MM-DD HH:mm:ss'), - 'end': date_stop.format('YYYY-MM-DD HH:mm:ss'), + 'start': dateToServer(date_start), + 'end': dateToServer(date_stop), 'r_start':date_start.clone(), 'r_end':date_stop.clone(), 'title': the_title, 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 497d3c1c05b..b900b24667a 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 @@ -22,15 +22,15 @@ var QuickCreate = Dialog.extend({ * @param {Widget} parent * @param {Object} buttons * @param {Object} options - * @param {Object} data_template + * @param {Object} dataTemplate * @param {Object} dataCalendar */ - init: function (parent, buttons, options, data_template, dataCalendar) { + init: function (parent, buttons, options, dataTemplate, dataCalendar) { this._buttons = buttons || false; this.options = options; // Can hold data pre-set from where you clicked on agenda - this.data_template = data_template || {}; + this.dataTemplate = dataTemplate || {}; this.$input = $(); var self = this; @@ -108,6 +108,7 @@ var QuickCreate = Dialog.extend({ * Gathers data from the quick create dialog a launch quick_create(data) method */ _quickAdd: function (dataCalendar) { + dataCalendar = $.extend({}, this.dataTemplate, dataCalendar); var val = this.$input.val().trim(); 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_renderer.js b/addons/web/static/src/js/views/calendar/calendar_renderer.js index 70dc4fb70d1..84f11b687be 100644 --- a/addons/web/static/src/js/views/calendar/calendar_renderer.js +++ b/addons/web/static/src/js/views/calendar/calendar_renderer.js @@ -370,7 +370,7 @@ return AbstractRenderer.extend({ $calendar.find('.fc-bg .fc-day[data-date="'+highlightDate+'"]') .addClass('o_target_date'); - this.$small_calendar.datepicker("setDate", this.state.highlight_date) + this.$small_calendar.datepicker("setDate", this.state.highlight_date.toDate()) .find('.o_selected_range') .removeClass('o_color o_selected_range'); var $a; 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 a8e1a3f992d..c7876c2e119 100644 --- a/addons/web/static/src/js/views/calendar/calendar_view.js +++ b/addons/web/static/src/js/views/calendar/calendar_view.js @@ -132,7 +132,7 @@ var CalendarView = AbstractView.extend({ this.loadParams.filters = filters; this.loadParams.mode = attrs.mode; this.loadParams.scale_zoom = attrs.scale_zoom; - this.loadParams.initialDate = params.initialDate || new Date(); + this.loadParams.initialDate = moment(params.initialDate || new Date()); }, }); |
