[FIX] blur/focus handling in most (if not all) form widgets
bzr revid: xmo@openerp.com-20120620111527-2j23k13zc6td2deo
This commit is contained in:
parent
f5e53a1e09
commit
6a4adf2a3b
|
@ -1346,7 +1346,8 @@ label.error {
|
||||||
display: inline;
|
display: inline;
|
||||||
margin: 0 0.5em 0 0;
|
margin: 0 0.5em 0 0;
|
||||||
}
|
}
|
||||||
.openerp .oe_form_field_one2many .oe-listview .oe-edit-row-save {
|
.openerp .oe_form_field_one2many .oe-listview .oe-edit-row-save,
|
||||||
|
.openerp .oe_form_field_one2many_list .oe-listview .oe-edit-row-save {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
||||||
this.mutating_mutex = new $.Mutex();
|
this.mutating_mutex = new $.Mutex();
|
||||||
this.on_change_mutex = new $.Mutex();
|
this.on_change_mutex = new $.Mutex();
|
||||||
this.reload_mutex = new $.Mutex();
|
this.reload_mutex = new $.Mutex();
|
||||||
|
|
||||||
|
this.__clicked_inside = false;
|
||||||
|
this.__blur_timeout = null;
|
||||||
},
|
},
|
||||||
start: function() {
|
start: function() {
|
||||||
this._super();
|
this._super();
|
||||||
|
@ -83,6 +86,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
||||||
$(w).unbind('.formBlur');
|
$(w).unbind('.formBlur');
|
||||||
w.stop();
|
w.stop();
|
||||||
});
|
});
|
||||||
|
this.$element.unbind('.formBlur');
|
||||||
this._super();
|
this._super();
|
||||||
},
|
},
|
||||||
reposition: function ($e) {
|
reposition: function ($e) {
|
||||||
|
@ -99,6 +103,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
||||||
this.rendered = QWeb.render(this.form_template, { 'frame': frame, 'widget': this });
|
this.rendered = QWeb.render(this.form_template, { 'frame': frame, 'widget': this });
|
||||||
}
|
}
|
||||||
this.$element.html(this.rendered);
|
this.$element.html(this.rendered);
|
||||||
|
this.$element.bind('mousedown.formBlur', function () {
|
||||||
|
self.__clicked_inside = true;
|
||||||
|
});
|
||||||
_.each(this.widgets, function(w) {
|
_.each(this.widgets, function(w) {
|
||||||
w.start();
|
w.start();
|
||||||
$(w).bind('widget-focus.formBlur', self.proxy('widgetFocused'))
|
$(w).bind('widget-focus.formBlur', self.proxy('widgetFocused'))
|
||||||
|
@ -134,12 +141,20 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
|
||||||
},
|
},
|
||||||
|
|
||||||
widgetFocused: function() {
|
widgetFocused: function() {
|
||||||
|
// Clear click flag if used to focus a widget
|
||||||
|
this.__clicked_inside = false;
|
||||||
if (this.__blur_timeout) {
|
if (this.__blur_timeout) {
|
||||||
clearTimeout(this.__blur_timeout);
|
clearTimeout(this.__blur_timeout);
|
||||||
delete this.__blur_timeout;
|
this.__blur_timeout = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
widgetBlurred: function() {
|
widgetBlurred: function() {
|
||||||
|
if (this.__clicked_inside) {
|
||||||
|
// clicked in an other section of the form (than the currently
|
||||||
|
// focused widget) => just ignore the blurring entirely?
|
||||||
|
this.__clicked_inside = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
var self = this;
|
var self = this;
|
||||||
// clear timeout, if any
|
// clear timeout, if any
|
||||||
this.widgetFocused();
|
this.widgetFocused();
|
||||||
|
@ -944,6 +959,11 @@ openerp.web.form.Widget = openerp.web.OldWidget.extend(/** @lends openerp.web.fo
|
||||||
|
|
||||||
this.width = this.node.attrs.width;
|
this.width = this.node.attrs.width;
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* Sets up blur/focus forwarding from DOM elements to a widget (`this`)
|
||||||
|
*
|
||||||
|
* @param {jQuery} $e jQuery object of elements to bind focus/blur on
|
||||||
|
*/
|
||||||
setupFocus: function ($e) {
|
setupFocus: function ($e) {
|
||||||
var self = this;
|
var self = this;
|
||||||
$e.bind({
|
$e.bind({
|
||||||
|
@ -1676,7 +1696,7 @@ openerp.web.form.FieldDatetime = openerp.web.form.Field.extend({
|
||||||
this.datewidget = this.build_widget();
|
this.datewidget = this.build_widget();
|
||||||
this.datewidget.on_change.add_last(this.on_ui_change);
|
this.datewidget.on_change.add_last(this.on_ui_change);
|
||||||
this.datewidget.appendTo(this.$element);
|
this.datewidget.appendTo(this.$element);
|
||||||
// FIXME: handle focus on datetime field
|
this.setupFocus(this.datewidget.$input);
|
||||||
},
|
},
|
||||||
set_value: function(value) {
|
set_value: function(value) {
|
||||||
this._super(value);
|
this._super(value);
|
||||||
|
@ -2021,6 +2041,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
|
||||||
return;
|
return;
|
||||||
if (self.$input.autocomplete("widget").is(":visible")) {
|
if (self.$input.autocomplete("widget").is(":visible")) {
|
||||||
self.$input.autocomplete("close");
|
self.$input.autocomplete("close");
|
||||||
|
self.$input.focus();
|
||||||
} else {
|
} else {
|
||||||
if (self.value) {
|
if (self.value) {
|
||||||
self.$input.autocomplete("search", "");
|
self.$input.autocomplete("search", "");
|
||||||
|
@ -2028,7 +2049,6 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
|
||||||
self.$input.autocomplete("search");
|
self.$input.autocomplete("search");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.$input.focus();
|
|
||||||
});
|
});
|
||||||
var anyoneLoosesFocus = function() {
|
var anyoneLoosesFocus = function() {
|
||||||
if (!self.$input.is(":focus") &&
|
if (!self.$input.is(":focus") &&
|
||||||
|
@ -2076,26 +2096,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
|
||||||
isSelecting = false;
|
isSelecting = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
// avoid triggering blur on the widget when it comes from clicking on
|
this.setupFocus(this.$input.add(this.$menu_btn));
|
||||||
// a completion of the list, on the dropdown or on the m2o menu thing
|
|
||||||
var picking_completion = false;
|
|
||||||
this.$input.autocomplete('widget')
|
|
||||||
.add(this.$drop_down)
|
|
||||||
.add(this.$menu_btn)
|
|
||||||
.mousedown(function () {
|
|
||||||
picking_completion = true;
|
|
||||||
});
|
|
||||||
this.$input.add(this.$menu_btn).bind({
|
|
||||||
blur: function () {
|
|
||||||
if (!picking_completion) {
|
|
||||||
$(self).trigger('widget-blur');
|
|
||||||
}
|
|
||||||
picking_completion = false;
|
|
||||||
},
|
|
||||||
focus: function () {
|
|
||||||
$(self).trigger('widget-focus');
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
// autocomplete component content handling
|
// autocomplete component content handling
|
||||||
get_search_result: function(request, response) {
|
get_search_result: function(request, response) {
|
||||||
|
|
Loading…
Reference in New Issue