diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-12-06 11:59:38 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-12-06 11:59:38 +0100 |
| commit | f96a797fe6238306ec70d3db013b8a4d348ef181 (patch) | |
| tree | 40990f6ca69840a52421c4a52f68e439ba1a5b42 /addons/web | |
| parent | dc5755698cc41e0c5f51ab5dccee1356a0f23a3f (diff) | |
| parent | b8540eefe3b82fc4a54c8a808ce3bfa0bea8a29a (diff) | |
[MERGE] forward port branch saas-16 up to b8540eefe3b
Diffstat (limited to 'addons/web')
7 files changed, 70 insertions, 7 deletions
diff --git a/addons/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js b/addons/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js index 8f0724bbb00..19f261ff4fc 100644 --- a/addons/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js +++ b/addons/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js @@ -479,8 +479,12 @@ }, notifyEvent = function (e) { - if (e.type === 'dp.change' && ((e.date && e.date.isSame(e.oldDate)) || (!e.date && !e.oldDate))) { - return; + if (e.type === 'dp.change') { + // check _isUTC flag to ensure that we are not comparing apples and oranges + var bothUTC = e.date && e.oldDate && e.date._isUTC === e.oldDate._isUTC; + if ((bothUTC && e.date.isSame(e.oldDate)) || (!e.date && !e.oldDate)) { + return; + } } element.trigger(e); }, diff --git a/addons/web/static/src/js/chrome/search_filters.js b/addons/web/static/src/js/chrome/search_filters.js index e2eff03546d..582af7e70ef 100644 --- a/addons/web/static/src/js/chrome/search_filters.js +++ b/addons/web/static/src/js/chrome/search_filters.js @@ -248,6 +248,10 @@ var Date = DateTime.extend({ attributes: { type: 'date' }, + get_value: function (index) { + // retrieve the datepicker value + return this["datewidget_" + (index || 0)].getValue(); + }, _get_widget_class: function () { return datepicker.DateWidget; }, diff --git a/addons/web/static/src/js/chrome/search_inputs.js b/addons/web/static/src/js/chrome/search_inputs.js index d567551873f..a2923d1a607 100644 --- a/addons/web/static/src/js/chrome/search_inputs.js +++ b/addons/web/static/src/js/chrome/search_inputs.js @@ -153,7 +153,7 @@ var Field = Input.extend( /** @lends instance.web.search.Field# */ { value_to_domain = function (facetValue) { return Domain.prototype.stringToArray( domain, - {self: self.value_from(facetValue)} + {self: self.value_from(facetValue), raw_value: facetValue.attributes.value} ); }; } else { diff --git a/addons/web/static/src/js/chrome/search_view.js b/addons/web/static/src/js/chrome/search_view.js index ecd7db41a7d..7b7b3afcd70 100644 --- a/addons/web/static/src/js/chrome/search_view.js +++ b/addons/web/static/src/js/chrome/search_view.js @@ -339,7 +339,7 @@ var SearchView = Widget.extend({ }, set_default_filters: function () { var self = this, - default_custom_filter = this.$buttons && this.favorite_menu.get_default_filter(); + default_custom_filter = this.$buttons && this.favorite_menu && this.favorite_menu.get_default_filter(); if (!self.options.disable_custom_filters && default_custom_filter) { return this.favorite_menu.toggle_filter(default_custom_filter, true); } diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 7ebe94f7b30..6f4bf1630f8 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -1219,7 +1219,7 @@ var FieldBinaryFile = AbstractFieldBinary.extend({ template: 'FieldBinaryFile', events: _.extend({}, AbstractFieldBinary.prototype.events, { 'click': function (event) { - if (this.mode === 'readonly' && this.value) { + if (this.mode === 'readonly' && this.value && this.recordData.id) { this.on_save_as(event); } }, @@ -1236,10 +1236,20 @@ var FieldBinaryFile = AbstractFieldBinary.extend({ this.do_toggle(!!this.value); if (this.value) { this.$el.empty().append($("<span/>").addClass('fa fa-download')); + if (this.recordData.id) { + this.$el.css('cursor', 'pointer'); + } else { + this.$el.css('cursor', 'not-allowed'); + } if (this.filename_value) { this.$el.append(" " + this.filename_value); } } + if (!this.res_id) { + this.$el.css('cursor', 'not-allowed'); + } else { + this.$el.css('cursor', 'pointer'); + } }, _renderEdit: function () { if (this.value) { @@ -1264,7 +1274,7 @@ var FieldBinaryFile = AbstractFieldBinary.extend({ if (!this.value) { this.do_warn(_t("Save As..."), _t("The field is empty, there's nothing to save !")); ev.stopPropagation(); - } else { + } else if (this.res_id) { framework.blockUI(); var c = crash_manager; var filename_fieldname = this.attrs.filename; diff --git a/addons/web/static/src/js/views/graph/graph_renderer.js b/addons/web/static/src/js/views/graph/graph_renderer.js index 2c3a7a7db19..74443843405 100644 --- a/addons/web/static/src/js/views/graph/graph_renderer.js +++ b/addons/web/static/src/js/views/graph/graph_renderer.js @@ -81,7 +81,7 @@ return AbstractRenderer.extend({ setTimeout(function () { self.$el.empty(); var chart = self['_render' + _.str.capitalize(self.state.mode) + 'Chart'](); - if (chart) { + if (chart && chart.tooltip.chartContainer) { self.to_remove = chart.update; nv.utils.onWindowResize(chart.update); chart.tooltip.chartContainer(self.el); diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index 5064dd81af1..4a418c05b72 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -1389,6 +1389,51 @@ QUnit.module('basic_fields', { session.get_file = oldGetFile; }); + QUnit.test('binary fields that are readonly in create mode do not download', function (assert) { + assert.expect(2); + + // save the session function + var oldGetFile = session.get_file; + session.get_file = function (option) { + assert.step('We shouldn\'t be getting the file.'); + return oldGetFile.bind(session)(option); + }; + + this.data.partner.onchanges = { + product_id: function (obj) { + obj.document = "onchange==\n"; + }, + }; + + this.data.partner.fields.document.readonly = true; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<field name="product_id"/>' + + '<field name="document" filename="\'yooo\'"/>' + + '</form>', + res_id: 1, + }); + + form.$buttons.find('.o_form_button_create').click(); + var $dropdown = form.$('.o_field_many2one input').autocomplete('widget'); + + form.$('.o_field_many2one input').click(); + $dropdown.find('li:not(.o_m2o_dropdown_option):contains(xphone)').click(); + + assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 1, + 'The link to download the binary should be present'); + + form.$('a.o_field_widget[name="document"]').click(); + + assert.verifySteps([]); // We shoudln't have passed through steps + + form.destroy(); + session.get_file = oldGetFile; + }); QUnit.test('text field rendering in list view', function (assert) { assert.expect(1); |
