summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-02-04 13:27:22 +0100
committerChristophe Simonis <chs@odoo.com>2019-02-04 13:27:22 +0100
commit4400cce8201579fc9769b5e2d33829b43bce82d9 (patch)
treec507c7dca21bfb0c3bdca8ba57e63a6ab16f230c /addons/web/static/src
parentceb05489303dee728c3960a87bf23795efc374c4 (diff)
parent4524ad06a8af82ab337fc5aa1d5aa8d8d3024923 (diff)
[MERGE] forward port branch saas-12.1 up to 4524ad06a8a
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js6
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js1
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_renderer.js6
-rw-r--r--addons/web/static/src/js/views/control_panel/control_panel_controller.js9
-rw-r--r--addons/web/static/src/js/views/control_panel/control_panel_model.js21
-rw-r--r--addons/web/static/src/js/views/control_panel/search/search_bar.js5
-rw-r--r--addons/web/static/src/js/views/control_panel/search/search_filters.js6
-rw-r--r--addons/web/static/src/js/views/form/form_controller.js9
-rw-r--r--addons/web/static/src/js/views/form/form_renderer.js46
-rw-r--r--addons/web/static/src/js/views/graph/graph_renderer.js10
-rw-r--r--addons/web/static/src/js/widgets/auto_complete.js5
-rw-r--r--addons/web/static/src/js/widgets/data_export.js2
-rw-r--r--addons/web/static/src/js/widgets/date_picker.js1
-rw-r--r--addons/web/static/src/scss/base_settings.scss2
-rw-r--r--addons/web/static/src/scss/form_view.scss1
-rw-r--r--addons/web/static/src/scss/kanban_view.scss4
-rw-r--r--addons/web/static/src/scss/navbar_mobile.scss5
-rw-r--r--addons/web/static/src/xml/base.xml2
18 files changed, 102 insertions, 39 deletions
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index 6d53d283f8a..14eb10c663c 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -240,6 +240,12 @@ var FieldMany2One = AbstractField.extend({
*/
_bindAutoComplete: function () {
var self = this;
+ // avoid ignoring autocomplete="off" by obfuscating placeholder, see #30439
+ if (this.$input.attr('placeholder')) {
+ this.$input.attr('placeholder', function (index, val) {
+ return val.split('').join('\ufeff');
+ });
+ }
this.$input.autocomplete({
source: function (req, resp) {
_.each(self._autocompleteSources, function (source) {
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js
index 9706251ed07..646e883fb7e 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -432,6 +432,7 @@ var BasicModel = AbstractModel.extend({
var isNew = this.isNew(id);
var rollback = 'rollback' in options ? options.rollback : isNew;
var initialOffset = element.offset;
+ element._domains = {};
this._visitChildren(element, function (elem) {
if (rollback && elem._savePoint) {
if (elem._savePoint instanceof Array) {
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 2720224fe39..0ea7d60b1ce 100644
--- a/addons/web/static/src/js/views/calendar/calendar_renderer.js
+++ b/addons/web/static/src/js/views/calendar/calendar_renderer.js
@@ -364,6 +364,11 @@ return AbstractRenderer.extend({
this.$calendar = this.$(".o_calendar_widget");
+ // This seems like a workaround but apparently passing the locale
+ // in the options is not enough. We should initialize it beforehand
+ var locale = moment.locale();
+ $.fullCalendar.locale(locale);
+
//Documentation here : http://arshaw.com/fullcalendar/docs/
var fc_options = $.extend({}, this.state.fc_options, {
eventDrop: function (event) {
@@ -416,6 +421,7 @@ return AbstractRenderer.extend({
height: 'parent',
unselectAuto: false,
isRTL: _t.database.parameters.direction === "rtl",
+ locale: locale, // reset locale when fullcalendar has already been instanciated before now
});
this.$calendar.fullCalendar(fc_options);
diff --git a/addons/web/static/src/js/views/control_panel/control_panel_controller.js b/addons/web/static/src/js/views/control_panel/control_panel_controller.js
index 3d6e62f4bf9..10413e725ab 100644
--- a/addons/web/static/src/js/views/control_panel/control_panel_controller.js
+++ b/addons/web/static/src/js/views/control_panel/control_panel_controller.js
@@ -16,6 +16,7 @@ var ControlPanelController = mvc.Controller.extend({
new_groupBy: '_onNewGroupBy',
activate_time_range: '_onActivateTimeRange',
autocompletion_filter: '_onAutoCompletionFilter',
+ reload: '_onReload',
},
/**
@@ -229,6 +230,14 @@ var ControlPanelController = mvc.Controller.extend({
this.model.createNewGroupBy(ev.data);
this._reportNewQueryAndRender();
},
+ /**
+ * @private
+ * @param {OdooEvent} ev
+ */
+ _onReload: function (ev) {
+ ev.stopPropagation();
+ this.trigger_up('search', this.model.getQuery());
+ },
});
return ControlPanelController;
diff --git a/addons/web/static/src/js/views/control_panel/control_panel_model.js b/addons/web/static/src/js/views/control_panel/control_panel_model.js
index 809fb0608b8..f58fbc93c4f 100644
--- a/addons/web/static/src/js/views/control_panel/control_panel_model.js
+++ b/addons/web/static/src/js/views/control_panel/control_panel_model.js
@@ -483,15 +483,13 @@ var ControlPanelModel = mvc.Model.extend({
* @param {'previous_period'|'previous_year'} [defaultTimeRanges.comparisonRange]
*/
_activateDefaultTimeRanges: function (defaultTimeRanges) {
- var self = this;
if (defaultTimeRanges) {
- var filterId = Object.keys(this.filters).find(function (filterId) {
- var filter = self.filters[filterId];
+ var filter = _.find(this.filters, function (filter) {
return filter.type === 'timeRange' && filter.fieldName === defaultTimeRanges.field;
});
- if (filterId) {
+ if (filter) {
this.activateTimeRange(
- filterId,
+ filter.id,
defaultTimeRanges.range,
defaultTimeRanges.comparisonRange
);
@@ -805,7 +803,7 @@ var ControlPanelModel = mvc.Model.extend({
*/
_getGroupIdOfType: function (type) {
var self = this;
- return Object.keys(this.groups).find(function (groupId) {
+ return _.find(Object.keys(this.groups), function (groupId) {
var group = self.groups[groupId];
return group.type === type;
});
@@ -874,7 +872,7 @@ var ControlPanelModel = mvc.Model.extend({
filter.timeRangeId,
filter.fieldType
);
- var timeRangeDescription = filter.timeRangeOptions.find(function (option) {
+ var timeRangeDescription = _.find(filter.timeRangeOptions, function (option) {
return option.optionId === filter.timeRangeId;
}).description.toString();
if (filter.comparisonTimeRangeId) {
@@ -885,7 +883,7 @@ var ControlPanelModel = mvc.Model.extend({
null,
filter.comparisonTimeRangeId
);
- comparisonTimeRangeDescription = filter.comparisonTimeRangeOptions.find(function (comparisonOption) {
+ comparisonTimeRangeDescription = _.find(filter.comparisonTimeRangeOptions, function (comparisonOption) {
return comparisonOption.optionId === filter.comparisonTimeRangeId;
}).description.toString();
}
@@ -952,12 +950,11 @@ var ControlPanelModel = mvc.Model.extend({
});
self._createGroupOfFilters(favorites);
if (self.activateDefaultFavorite) {
- var defaultFavoriteId = Object.keys(self.filters).find(function (filterId) {
- var filter = self.filters[filterId];
+ var defaultFavorite = _.find(self.filters, function (filter) {
return filter.type === 'favorite' && filter.isDefault;
});
- if (defaultFavoriteId) {
- self.toggleFilter(defaultFavoriteId);
+ if (defaultFavorite) {
+ self.toggleFilter(defaultFavorite.id);
}
}
} else {
diff --git a/addons/web/static/src/js/views/control_panel/search/search_bar.js b/addons/web/static/src/js/views/control_panel/search/search_bar.js
index f9fa15fe67d..7f0feda4516 100644
--- a/addons/web/static/src/js/views/control_panel/search/search_bar.js
+++ b/addons/web/static/src/js/views/control_panel/search/search_bar.js
@@ -216,6 +216,11 @@ var SearchBar = Widget.extend({
this.trigger_up('facet_removed');
}
break;
+ case $.ui.keyCode.ENTER:
+ if (this.$input.val() === '') {
+ this.trigger_up('reload');
+ }
+ break;
}
},
});
diff --git a/addons/web/static/src/js/views/control_panel/search/search_filters.js b/addons/web/static/src/js/views/control_panel/search/search_filters.js
index 6ff84dce9c7..4703995ac7c 100644
--- a/addons/web/static/src/js/views/control_panel/search/search_filters.js
+++ b/addons/web/static/src/js/views/control_panel/search/search_filters.js
@@ -193,8 +193,10 @@ var DateTime = Field.extend({
operators: [
{value: "=", text: _lt("is equal to")},
{value: "!=", text: _lt("is not equal to")},
- {value: ">=", text: _lt("is after")},
- {value: "<=", text: _lt("is before")},
+ {value: ">", text: _lt("is after")},
+ {value: "<", text: _lt("is before")},
+ {value: ">=", text: _lt("is after or equal to")},
+ {value: "<=", text: _lt("is before or equal to")},
{value: "between", text: _lt("is between")},
{value: "∃", text: _lt("is set")},
{value: "∄", text: _lt("is not set")}
diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js
index 5feefce716f..d85a538d5ec 100644
--- a/addons/web/static/src/js/views/form/form_controller.js
+++ b/addons/web/static/src/js/views/form/form_controller.js
@@ -227,17 +227,16 @@ var FormController = BasicController.extend({
// are displayed with an alert
var fields = self.renderer.state.fields;
var data = self.renderer.state.data;
- var alertFields = [];
+ var alertFields = {};
for (var k = 0; k < changedFields.length; k++) {
var field = fields[changedFields[k]];
var fieldData = data[changedFields[k]];
if (field.translate && fieldData) {
- alertFields.push(field);
+ alertFields[changedFields[k]] = field;
}
}
- if (alertFields.length) {
- self.renderer.alertFields = alertFields;
- self.renderer.displayTranslationAlert();
+ if (!_.isEmpty(alertFields)) {
+ self.renderer.updateAlertFields(alertFields);
}
}
return changedFields;
diff --git a/addons/web/static/src/js/views/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js
index 08c4a6d1923..ca26d7e90ad 100644
--- a/addons/web/static/src/js/views/form/form_renderer.js
+++ b/addons/web/static/src/js/views/form/form_renderer.js
@@ -14,6 +14,7 @@ var FormRenderer = BasicRenderer.extend({
className: "o_form_view",
events: _.extend({}, BasicRenderer.prototype.events, {
'click .o_notification_box .oe_field_translate': '_onTranslate',
+ 'click .o_notification_box .close': '_onTranslateNotificationClose',
'click .oe_title, .o_inner_group': '_onClick',
}),
custom_events: _.extend({}, BasicRenderer.prototype.custom_events, {
@@ -31,6 +32,7 @@ var FormRenderer = BasicRenderer.extend({
this._super.apply(this, arguments);
this.idsForLabels = {};
this.lastActivatedFieldIndex = -1;
+ this.alertFields = {};
},
/**
* @override
@@ -104,23 +106,32 @@ var FormRenderer = BasicRenderer.extend({
});
return fieldNames;
},
+ /*
+ * Updates translation alert fields for the current state and display updated fields
+ *
+ * @param {Object} alertFields
+ */
+ updateAlertFields: function (alertFields) {
+ this.alertFields[this.state.res_id] = _.extend(this.alertFields[this.state.res_id] || {}, alertFields);
+ this.displayTranslationAlert();
+ },
/**
* Show a warning message if the user modified a translated field. For each
* field, the notification provides a link to edit the field's translations.
- *
- * @param {Object[]} alertFields field list
*/
displayTranslationAlert: function () {
this.$('.o_notification_box').remove();
- var $notification = $(qweb.render('notification-box', {type: 'info'}))
- .append(qweb.render('translation-alert', {
- fields: this.alertFields,
- lang: _t.database.parameters.name
- }));
- if (this.$('.o_form_statusbar').length) {
- this.$('.o_form_statusbar').after($notification);
- } else {
- this.$el.prepend($notification);
+ if (this.alertFields[this.state.res_id]) {
+ var $notification = $(qweb.render('notification-box', {type: 'info'}))
+ .append(qweb.render('translation-alert', {
+ fields: this.alertFields[this.state.res_id],
+ lang: _t.database.parameters.name
+ }));
+ if (this.$('.o_form_statusbar').length) {
+ this.$('.o_form_statusbar').after($notification);
+ } else {
+ this.$el.prepend($notification);
+ }
}
},
/**
@@ -313,6 +324,7 @@ var FormRenderer = BasicRenderer.extend({
});
},
/**
+ excludedElements: ".o_notebook .nav.nav-tabs",
* @private
* @param {string} name
* @returns {string}
@@ -891,6 +903,9 @@ var FormRenderer = BasicRenderer.extend({
return $.when.apply($, defs).then(function () {
self._updateView($form.contents());
+ if (self.state.res_id in self.alertFields) {
+ self.displayTranslationAlert();
+ }
}, function () {
$form.remove();
}).then(function(){
@@ -1001,6 +1016,15 @@ var FormRenderer = BasicRenderer.extend({
ev.preventDefault();
this.trigger_up('translate', {fieldName: ev.target.name, id: this.state.id});
},
+ /**
+ * remove alert fields of record from alertFields object
+ *
+ * @private
+ * @param {MouseEvent} ev
+ */
+ _onTranslateNotificationClose: function(ev) {
+ delete this.alertFields[this.state.res_id];
+ },
});
return FormRenderer;
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 856882a303b..09706695bbc 100644
--- a/addons/web/static/src/js/views/graph/graph_renderer.js
+++ b/addons/web/static/src/js/views/graph/graph_renderer.js
@@ -198,10 +198,12 @@ return AbstractRenderer.extend({
}
}
- // For Bar chart View, we keep only groups where count > 0
- data[0].values = _.filter(data[0].values, function (elem, index) {
- return self.state.data[index].count > 0;
- });
+ // For one level Bar chart View, we keep only groups where count > 0
+ if (this.state.groupedBy.length <= 1) {
+ data[0].values = _.filter(data[0].values, function (elem, index) {
+ return self.state.data[index].count > 0;
+ });
+ }
var $svgContainer = $('<div/>', {class: 'o_graph_svg_container'});
this.$el.append($svgContainer);
diff --git a/addons/web/static/src/js/widgets/auto_complete.js b/addons/web/static/src/js/widgets/auto_complete.js
index a25dc0150f5..33405aa4196 100644
--- a/addons/web/static/src/js/widgets/auto_complete.js
+++ b/addons/web/static/src/js/widgets/auto_complete.js
@@ -55,7 +55,10 @@ return Widget.extend({
}
});
this.$input.on('keypress', function (ev) {
- self.search_string = self.search_string + String.fromCharCode(ev.which);
+ if (ev.which > 31 && ev.which !== 127) {
+ // we filter control character out of the search string
+ self.search_string = self.search_string + String.fromCharCode(ev.which);
+ }
if (self.search_string.length) {
self.searching = true;
var search_string = self.search_string;
diff --git a/addons/web/static/src/js/widgets/data_export.js b/addons/web/static/src/js/widgets/data_export.js
index d05bf2d33fc..347769b4042 100644
--- a/addons/web/static/src/js/widgets/data_export.js
+++ b/addons/web/static/src/js/widgets/data_export.js
@@ -311,7 +311,7 @@ var DataExport = Dialog.extend({
});
self.$export_format_inputs = $fmts.find('input');
- self.$export_format_inputs.first().prop('checked', true);
+ self.$export_format_inputs.filter(':enabled').first().prop('checked', true);
}
},
show_exports_list: function() {
diff --git a/addons/web/static/src/js/widgets/date_picker.js b/addons/web/static/src/js/widgets/date_picker.js
index b677abe377a..367ab23178d 100644
--- a/addons/web/static/src/js/widgets/date_picker.js
+++ b/addons/web/static/src/js/widgets/date_picker.js
@@ -25,6 +25,7 @@ var DateWidget = Widget.extend({
this.name = parent.name;
this.options = _.extend({
+ locale: moment.locale(),
format : this.type_of_date === 'datetime' ? time.getLangDatetimeFormat() : time.getLangDateFormat(),
minDate: moment({ y: 1900 }),
maxDate: moment().add(200, "y"),
diff --git a/addons/web/static/src/scss/base_settings.scss b/addons/web/static/src/scss/base_settings.scss
index 82137b00948..a7ff1d848a7 100644
--- a/addons/web/static/src/scss/base_settings.scss
+++ b/addons/web/static/src/scss/base_settings.scss
@@ -114,9 +114,11 @@
font-size: 13px;
line-height: 40px;
cursor: pointer;
+ white-space: nowrap;
.icon {
width: 23px;
+ min-width: 23px;
margin-right: 10px;
}
diff --git a/addons/web/static/src/scss/form_view.scss b/addons/web/static/src/scss/form_view.scss
index 31032a75cc2..697ec4dcd12 100644
--- a/addons/web/static/src/scss/form_view.scss
+++ b/addons/web/static/src/scss/form_view.scss
@@ -743,6 +743,7 @@
}
.o_field_widget {
width: 50%;
+ flex: 0 0 auto;
}
button.btn-link:first-child {
padding-left: 0;
diff --git a/addons/web/static/src/scss/kanban_view.scss b/addons/web/static/src/scss/kanban_view.scss
index c771d6a37ab..c4c0e9d011d 100644
--- a/addons/web/static/src/scss/kanban_view.scss
+++ b/addons/web/static/src/scss/kanban_view.scss
@@ -564,6 +564,8 @@
@include o-kanban-record-color;
.oe_kanban_color_help {
- @include o-position-absolute(0, 5px, 0, -1px);
+ @include o-position-absolute(0, auto, 0, -1px);
+ width: $o-kanban-color-border-width;
+ z-index: 1; // show the title over kanban color
}
}
diff --git a/addons/web/static/src/scss/navbar_mobile.scss b/addons/web/static/src/scss/navbar_mobile.scss
index 6ef917b8517..f4593436163 100644
--- a/addons/web/static/src/scss/navbar_mobile.scss
+++ b/addons/web/static/src/scss/navbar_mobile.scss
@@ -23,7 +23,6 @@
position: relative;
height: $o-navbar-height;
- overflow: hidden;
> ul {
> li {
@@ -39,6 +38,7 @@
&.o_menu_sections {
width: 100%;
+ display: none;
.dropdown-menu.show {
position: static;
@@ -82,6 +82,9 @@
body.o_mobile_menu_opened > .o_main_navbar {
height: 100%;
overflow: auto;
+ .o_menu_sections {
+ display: block;
+ }
}
}
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 55d744d3a60..5e2f27ccc66 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -1488,7 +1488,7 @@
<div role="alertdialog">
Please update translations of :
<t t-foreach="fields" t-as="field">
- <strong><a class="oe_field_translate" t-att-name="field.name" href="#"><t t-esc="field.string"/><t t-if="!field_last">, </t></a></strong>
+ <strong><a class="oe_field_translate" t-att-name="field" href="#"><t t-esc="field_value.string"/><t t-if="field_index &lt; _.size(fields)-1">, </t></a></strong>
</t>
</div>
</t>