diff --git a/addons/web/static/src/js/fields/field_utils.js b/addons/web/static/src/js/fields/field_utils.js index 61e31aeb66f..daebfdb37f4 100644 --- a/addons/web/static/src/js/fields/field_utils.js +++ b/addons/web/static/src/js/fields/field_utils.js @@ -36,20 +36,26 @@ function format_char(value) { } /** - * @params {Moment} + * @params {Moment|false} * @returns {string} */ function format_date(value) { + if (!value) { + return ""; + } var l10n = core._t.database.parameters; var date_format = time.strftime_to_moment_format(l10n.date_format); return value.format(date_format); } /** - * @params {Moment} + * @params {Moment|false} * @returns {string} */ function format_datetime(value) { + if (!value) { + return ""; + } var l10n = core._t.database.parameters; var date_format = time.strftime_to_moment_format(l10n.date_format); var time_format = time.strftime_to_moment_format(l10n.time_format); @@ -160,9 +166,12 @@ function format_selection(value, field) { * The method toJSON return the formated value to send value server side * * @params {string} - * @returns {Moment} Moment date object + * @returns {Moment|false} Moment date object */ function parse_date(value) { + if (!value) { + return false; + } var date_pattern = time.strftime_to_moment_format(core._t.database.parameters.date_format); var date_pattern_wo_zero = date_pattern.replace('MM','M').replace('DD','D'); var date = moment(value, [date_pattern, date_pattern_wo_zero, moment.ISO_8601], true); @@ -188,9 +197,12 @@ function parse_date(value) { * The method toJSON return the formated value to send value server side * * @params {string} - * @returns {Moment} Moment date object + * @returns {Moment|false} Moment date object */ function parse_datetime(value) { + if (!value) { + return false; + } var date_pattern = time.strftime_to_moment_format(core._t.database.parameters.date_format), time_pattern = time.strftime_to_moment_format(core._t.database.parameters.time_format); var date_pattern_wo_zero = date_pattern.replace('MM','M').replace('DD','D'), diff --git a/addons/web/static/test/fields/basic_fields_tests.js b/addons/web/static/test/fields/basic_fields_tests.js index cdba48ceff3..62d8e0f8a86 100644 --- a/addons/web/static/test/fields/basic_fields_tests.js +++ b/addons/web/static/test/fields/basic_fields_tests.js @@ -479,6 +479,22 @@ QUnit.module('basic_fields', { QUnit.module('FieldDate'); + QUnit.test('date field is empty if no date is set', function (assert) { + assert.expect(2); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
', + res_id: 4, + }); + var $span = form.$('span.o_form_field'); + assert.strictEqual($span.length, 1, "should have one span in the form view"); + assert.strictEqual($span.text(), "", "and it should be empty"); + + }); + QUnit.test('date field in edit mode', function (assert) { assert.expect(7); diff --git a/addons/web/static/test/views/basic_model_tests.js b/addons/web/static/test/views/basic_model_tests.js index 2624fb77c8c..83bdfa752c2 100644 --- a/addons/web/static/test/views/basic_model_tests.js +++ b/addons/web/static/test/views/basic_model_tests.js @@ -23,7 +23,7 @@ QUnit.module('Views', { }, records: [ {id: 1, foo: 'blip', bar: 1, product_id: 37, category: [12], display_name: "first partner", date: "2017-01-25"}, - {id: 2, foo: 'gnap', bar: 2, product_id: 41, display_name: "second partner", date: "2017-01-26"}, + {id: 2, foo: 'gnap', bar: 2, product_id: 41, display_name: "second partner"}, ], onchanges: {}, }, @@ -718,9 +718,38 @@ QUnit.module('Views', { }); - QUnit.test('dates are properly loaded and parsed', function (assert) { - assert.expect(1); + QUnit.test('dates are properly loaded and parsed (record)', function (assert) { + assert.expect(2); + var model = createModel({ + Model: BasicModel, + data: this.data, + }); + + var params = { + fieldNames: ['date'], + fields: this.data.partner.fields, + modelName: 'partner', + res_id: 1, + }; + + model.load(params).then(function (resultID) { + var record = model.get(resultID); + assert.ok(record.data.date instanceof moment, + "fetched date field should have been formatted"); + }); + + params.res_id = 2; + + model.load(params).then(function (resultID) { + var record = model.get(resultID); + assert.strictEqual(record.data.date, false, + "unset date field should be false"); + }); + }); + + QUnit.test('dates are properly loaded and parsed (list)', function (assert) { + assert.expect(2); var model = createModel({ Model: BasicModel, @@ -737,8 +766,31 @@ QUnit.module('Views', { model.load(params).then(function (resultID) { var record = model.get(resultID); var firstRecord = record.data[0]; + var secondRecord = record.data[1]; assert.ok(firstRecord.data.date instanceof moment, "fetched date field should have been formatted"); + assert.strictEqual(secondRecord.data.date, false, + "if date is not set, it should be false"); + }); + }); + + QUnit.test('dates are properly loaded and parsed (default_get)', function (assert) { + assert.expect(1); + + var model = createModel({ + Model: BasicModel, + data: this.data, + }); + + var params = { + fieldNames: ['date'], + fields: this.data.partner.fields, + modelName: 'partner', + }; + + model.makeDefaultRecord('partner', params).then(function (resultID) { + var record = model.get(resultID); + assert.strictEqual(record.data.date, false, "date default value should be false"); }); });