summaryrefslogtreecommitdiff
path: root/addons/web
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-12-06 11:59:38 +0100
committerChristophe Simonis <chs@odoo.com>2017-12-06 11:59:38 +0100
commitf96a797fe6238306ec70d3db013b8a4d348ef181 (patch)
tree40990f6ca69840a52421c4a52f68e439ba1a5b42 /addons/web
parentdc5755698cc41e0c5f51ab5dccee1356a0f23a3f (diff)
parentb8540eefe3b82fc4a54c8a808ce3bfa0bea8a29a (diff)
[MERGE] forward port branch saas-16 up to b8540eefe3b
Diffstat (limited to 'addons/web')
-rw-r--r--addons/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js8
-rw-r--r--addons/web/static/src/js/chrome/search_filters.js4
-rw-r--r--addons/web/static/src/js/chrome/search_inputs.js2
-rw-r--r--addons/web/static/src/js/chrome/search_view.js2
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js14
-rw-r--r--addons/web/static/src/js/views/graph/graph_renderer.js2
-rw-r--r--addons/web/static/tests/fields/basic_fields_tests.js45
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);