diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 69fd7c5b791..d2649195111 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -268,7 +268,7 @@ var FieldDate = InputField.extend({ this.datewidget = this._makeDatePicker(); this.datewidget.on('datetime_changed', this, function () { var value = this._getDateWidgetValue(); - if (!value.isSame(this.value)) { + if ((!value && this.value) || (value && !value.isSame(this.value))) { this._setValue(value); } }); @@ -330,7 +330,8 @@ var FieldDateTime = FieldDate.extend({ * @private */ _getDateWidgetValue: function () { - return this.datewidget.get_value().add(-this.getSession().tzOffset, 'minutes'); + var value = this.datewidget.get_value(); + return value && value.add(-this.getSession().tzOffset, 'minutes'); }, /** diff --git a/addons/web/static/src/js/widgets/date_picker.js b/addons/web/static/src/js/widgets/date_picker.js index 4abab997666..1641f13f634 100644 --- a/addons/web/static/src/js/widgets/date_picker.js +++ b/addons/web/static/src/js/widgets/date_picker.js @@ -60,7 +60,7 @@ var DateWidget = Widget.extend({ } }, get_value: function() { - return this.get('value').clone(); + return this.get('value') && this.get('value').clone(); }, set_value_from_ui: function() { var value = this.$input.val() || false; diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index cb61e21e376..f32f0b6ac61 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -1082,6 +1082,41 @@ QUnit.module('basic_fields', { list.destroy(); }); + QUnit.test('date field remove value', function (assert) { + assert.expect(4); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
', + res_id: 1, + mockRPC: function (route, args) { + if (route === '/web/dataset/call_kw/partner/write') { + assert.strictEqual(args.args[1].date, false, 'the correct value should be saved'); + } + return this._super.apply(this, arguments); + }, + translateParameters: { // Avoid issues due to localization formats + date_format: '%m/%d/%Y', + }, + }); + + // switch to edit mode + form.$buttons.find('.o_form_button_edit').click(); + assert.strictEqual(form.$('.o_datepicker_input').val(), '02/03/2017', + 'the date should be correct in edit mode'); + + $('.o_datepicker_input').val('').trigger('input').trigger('change'); + assert.ok(!form.$('.o_datepicker_input').val()); + + // save + form.$buttons.find('.o_form_button_save').click(); + assert.strictEqual(form.$('.o_form_field_date').text(), '', + 'the selected date should be displayed after saving'); + form.destroy(); + }); + QUnit.module('FieldDatetime'); @@ -1206,6 +1241,45 @@ QUnit.module('basic_fields', { list.destroy(); }); + QUnit.test('datetime field remove value', function (assert) { + assert.expect(4); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'', + res_id: 1, + mockRPC: function (route, args) { + if (route === '/web/dataset/call_kw/partner/write') { + assert.strictEqual(args.args[1].datetime, false, 'the correct value should be saved'); + } + return this._super.apply(this, arguments); + }, + translateParameters: { // Avoid issues due to localization formats + date_format: '%m/%d/%Y', + time_format: '%H:%M:%S', + }, + session: { + tzOffset: 120 + }, + }); + + // switch to edit mode + form.$buttons.find('.o_form_button_edit').click(); + assert.strictEqual(form.$('.o_datepicker_input').val(), '02/08/2017 12:00:00', + 'the date time should be correct in edit mode'); + + $('.o_datepicker_input').val('').trigger('input').trigger('change'); + assert.ok(!form.$('.o_datepicker_input').val()); + + // save + form.$buttons.find('.o_form_button_save').click(); + assert.strictEqual(form.$('.o_form_field_date').text(), '', + 'the selected date should be displayed after saving'); + form.destroy(); + }); + QUnit.module('FieldMonetary');