diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index 8925c3a0964..e4b8885b1a1 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -25,7 +25,6 @@
display: none !important;
}
}
-
.openerp.openerp_webclient_container {
height: 100%;
position: relative;
@@ -2562,6 +2561,12 @@
.openerp .oe_list.oe_list_editable td.oe_list_record_delete {
position: absolute;
}
+.openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) {
+ color: transparent;
+}
+.openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) * {
+ visibility: hidden;
+}
.openerp .oe_list.oe_list_editable.oe_editing .oe_m2o_drop_down_button {
top: 5px;
}
@@ -2580,10 +2585,10 @@
}
.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_float input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_view_integer input {
text-align: right;
- width: 100%;
+ width: 100% !important;
}
.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime > span, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date > span {
- width: 100%;
+ width: 100% !important;
}
.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime input.oe_datepicker_master, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date input.oe_datepicker_master {
width: 100% !important;
@@ -2592,6 +2597,9 @@
min-width: 0 !important;
max-width: none !important;
}
+.openerp .oe_list_group_name {
+ white-space: nowrap;
+}
.openerp .oe_form .oe_form_field_many2many > .oe_list .oe_list_pager_single_page {
display: none;
}
@@ -2651,14 +2659,17 @@
background: #eeeeee;
vertical-align: top;
}
-.openerp .oe_list_content > thead th {
- position: relative;
-}
.openerp .oe_list_content td, .openerp .oe_list_content th {
padding: 3px 6px;
line-height: 18px;
}
-.openerp .oe_list_content th:after {
+.openerp .oe_list_content th.oe_sortable, .openerp .oe_list_content th.oe_sortable div {
+ cursor: pointer;
+}
+.openerp .oe_list_content th.oe_sortable div {
+ position: relative;
+}
+.openerp .oe_list_content th.oe_sortable div:after {
position: absolute;
right: 6px;
content: "";
@@ -2668,12 +2679,12 @@
border-color: black transparent;
visibility: hidden;
}
-.openerp .oe_list_content th.sortup:after {
+.openerp .oe_list_content th.sortup div:after {
visibility: visible;
filter: alpha(opacity=60);
opacity: 0.6;
}
-.openerp .oe_list_content th.sortdown:after {
+.openerp .oe_list_content th.sortdown div:after {
border-bottom: none;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass
index a1adfe67e75..a128fcec24b 100644
--- a/addons/web/static/src/css/base.sass
+++ b/addons/web/static/src/css/base.sass
@@ -2026,6 +2026,10 @@ $sheet-max-width: 860px
td.oe_list_record_delete
position: absolute
.oe_list.oe_list_editable.oe_editing
+ .oe_edition .oe_list_field_cell:not(.oe_readonly)
+ *
+ visibility: hidden
+ color: transparent
.oe_m2o_drop_down_button
top: 5px
.oe_m2o_cm_button
@@ -2040,15 +2044,17 @@ $sheet-max-width: 860px
&.oe_form_field_float,&.oe_form_view_integer
input
text-align: right
- width: 100%
+ width: 100% !important
&.oe_form_field_datetime,&.oe_form_field_date
> span
- width: 100%
+ width: 100% !important
input.oe_datepicker_master
width: 100% !important
.oe_form_field_float,.oe_form_view_integer,&.oe_form_field_datetime,&.oe_form_field_date
min-width: 0 !important
max-width: none !important
+ .oe_list_group_name
+ white-space: nowrap
// }}}
// FormView.many2many {{{
.oe_form .oe_form_field_many2many > .oe_list
@@ -2098,12 +2104,14 @@ $sheet-max-width: 860px
border-bottom: 2px solid #cacaca
background: #eee
vertical-align: top
- th
- position: relative
td, th
padding: 3px 6px
line-height: 18px
- th:after
+ th.oe_sortable, th.oe_sortable div
+ cursor: pointer
+ th.oe_sortable div
+ position: relative
+ th.oe_sortable div:after
position: absolute
right: 6px
content: ""
@@ -2112,10 +2120,10 @@ $sheet-max-width: 860px
border-style: solid
border-color: #000 transparent
visibility: hidden
- th.sortup:after
+ th.sortup div:after
visibility: visible
@include opacity(0.6)
- th.sortdown:after
+ th.sortdown div:after
border-bottom: none
border-left: 4px solid transparent
border-right: 4px solid transparent
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index 77583899bf1..30a8b9862fc 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -120,6 +120,10 @@ instance.web.Query = instance.web.Class.extend({
if (_.isEmpty(grouping)) { return null; }
var self = this;
+
+ // FIXME: when pyeval is merged
+ var ctx = instance.session.test_eval_contexts(
+ [this._model.context(this._context)]);
return this._model.call('read_group', {
groupby: grouping,
fields: _.uniq(grouping.concat(this._fields || [])),
@@ -130,6 +134,8 @@ instance.web.Query = instance.web.Class.extend({
orderby: instance.web.serialize_sort(this._order_by) || false
}).pipe(function (results) {
return _(results).map(function (result) {
+ // FIX: querygroup initialization
+ _.defaults(result.__context, ctx);
return new instance.web.QueryGroup(
self._model.name, grouping[0], result);
});
diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index c16b65c9831..33d20980732 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -61,7 +61,7 @@ my.SearchQuery = B.Collection.extend({
this.on('change', function (facet) {
if(!facet.values.isEmpty()) { return; }
- this.remove(facet);
+ this.remove(facet, {silent: true});
}, this);
},
add: function (values, options) {
@@ -678,45 +678,6 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
self.ready.resolve();
});
},
- /**
- * Handle event when the user make a selection in the filters management select box.
- */
- on_filters_management: function(e) {
- var self = this;
- var select = this.$el.find(".oe_search-view-filters-management");
- var val = select.val();
- switch(val) {
- case 'advanced_filter':
- this.extended_search.on_activate();
- break;
- case '':
- this.do_clear();
- }
- if (val.slice(0, 4) == "get:") {
- val = val.slice(4);
- val = parseInt(val, 10);
- var filter = this.managed_filters[val];
- this.do_clear(false).then(_.bind(function() {
- select.val('get:' + val);
-
- var groupbys = [];
- var group_by = filter.context.group_by;
- if (group_by) {
- groupbys = _.map(
- group_by instanceof Array ? group_by : group_by.split(','),
- function (el) { return { group_by: el }; });
- }
- this.filter_data = {
- domains: [filter.domain],
- contexts: [filter.context],
- groupbys: groupbys
- };
- this.do_search();
- }, this));
- } else {
- select.val('');
- }
- },
/**
* Extract search data from the view's facets.
*
@@ -775,8 +736,6 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
*
* If at least one field failed its validation, triggers
* :js:func:`instance.web.SearchView.on_invalid` instead.
- *
- * @param e jQuery event object coming from the "Search" button
*/
do_search: function (_query, options) {
if (options && options.preventSearch) {
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 60bdec3b9f9..c2262c0d69d 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -2153,6 +2153,20 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
self.do_action(r);
});
},
+
+ set_dimensions: function (height, width) {
+ // remove width css property
+ this.$el.css('width', '');
+ // extract style (without width)
+ var old_style = this.$el.attr('style');
+ // jQuery doesn't understand/use !important
+ var style = 'width:' + width + 'px !important;';
+ if (old_style) {
+ style += old_style
+ }
+ this.$el.attr('style', style);
+ this.$el.css('minHeight', height);
+ }
});
/**
@@ -2531,6 +2545,13 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we
focus: function($el) {
this.$textarea.focus();
},
+ set_dimensions: function (height, width) {
+ this._super();
+ this.$textarea.css({
+ width: width,
+ minHeight: height
+ });
+ },
});
/**
@@ -4058,13 +4079,17 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in
);
var self = this;
pop.on("elements_selected", self, function(element_ids) {
- _.each(element_ids, function(one_id) {
- if(! _.detect(self.dataset.ids, function(x) {return x == one_id;})) {
- self.dataset.set_ids([].concat(self.dataset.ids, [one_id]));
+ var reload = false;
+ _(element_ids).each(function (id) {
+ if(! _.detect(self.dataset.ids, function(x) {return x == id;})) {
+ self.dataset.set_ids(self.dataset.ids.concat([id]));
self.m2m_field.dataset_changed();
- self.reload_content();
+ reload = true;
}
});
+ if (reload) {
+ self.reload_content();
+ }
});
},
do_activate_record: function(index, id) {
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index 99293b2bb0c..29bc81ea9ec 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -1232,6 +1232,7 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we
.replaceWith(self.render());
});
this.$row.children().last()
+ .addClass('oe_list_group_pagination')
.append($prev)
.append('')
.append($next);
@@ -1416,10 +1417,12 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we
}))
.end()
.find('button[data-pager-action=previous]')
- .attr('disabled', page === 0)
+ .css('visibility',
+ page === 0 ? 'hidden' : '')
.end()
.find('button[data-pager-action=next]')
- .attr('disabled', page === pages - 1);
+ .css('visibility',
+ page === pages - 1 ? 'hidden' : '');
}
}
diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js
index 4803a856f31..9bc0e96032f 100644
--- a/addons/web/static/src/js/view_list_editable.js
+++ b/addons/web/static/src/js/view_list_editable.js
@@ -190,10 +190,10 @@ openerp.web.list_editable = function (instance) {
this.records.add(record, {
at: this.prepends_on_create() ? 0 : null});
}
- var $recordRow = this.groups.get_row_for(record);
- var cells = this.get_cells_for($recordRow);
return this.ensure_saved().pipe(function () {
+ var $recordRow = self.groups.get_row_for(record);
+ var cells = self.get_cells_for($recordRow);
self.fields_for_resize.splice(0, self.fields_for_resize.length);
return self.with_event('edit', {
record: record.attributes,
@@ -251,12 +251,10 @@ openerp.web.list_editable = function (instance) {
var $cell = $(cell);
var position = $cell.position();
- // jquery does not understand !important
- field.$el.attr('style', 'width: '+$cell.outerWidth()+'px !important');
+ field.set_dimensions($cell.outerHeight(), $cell.outerWidth());
field.$el.css({
top: position.top,
left: position.left,
- minHeight: $cell.outerHeight()
});
},
/**
@@ -398,7 +396,6 @@ openerp.web.list_editable = function (instance) {
setup_events: function () {
var self = this;
_.each(this.editor.form.fields, function(field, field_name) {
- var field;
var setting = false;
var set_invisible = function() {
if (!setting && field.get("effective_readonly")) {
@@ -774,7 +771,7 @@ openerp.web.list_editable = function (instance) {
return this._super.apply(this, arguments);
}
var record_id = $(event.currentTarget).data('id');
- this.view.start_edition(
+ return this.view.start_edition(
record_id ? this.records.get(record_id) : null, {
focus_field: $(event.target).data('field')
});
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index b031ee172e2..06603ad17a5 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -631,9 +631,9 @@
+ t-attf-class="oe_list_header_#{column.widget or column.type} #{((options.sortable and column.tag !== 'button') ? 'oe_sortable' : null)}">
+