summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2017-04-06 12:56:41 +0200
committerAaron Bohy <aab@odoo.com>2017-04-11 19:44:38 +0200
commit3dfa2caa3d455415d09a7e3051a0f5c1294ca5c1 (patch)
tree1d261105084a5ecad2f2a6ebbf8412590d99436a /addons/web/static/src
parente7dfa4af775a93b291ccd570c05970f2ac2b9187 (diff)
[FIX] web: various bugs in calendar and move _rpc call into model
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_controller.js39
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_model.js124
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_quick_create.js7
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_renderer.js2
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_view.js2
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());
},
});