summaryrefslogtreecommitdiff
path: root/addons/web/static
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static')
-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.js7
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_column_progressbar.js2
-rw-r--r--addons/web/static/src/js/views/view_dialogs.js18
-rw-r--r--addons/web/static/src/xml/kanban.xml2
-rw-r--r--addons/web/static/src/xml/menu.xml2
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js12
-rw-r--r--addons/web/static/tests/views/form_tests.js59
8 files changed, 93 insertions, 18 deletions
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 965a15276a8..34a583fbecb 100644
--- a/addons/web/static/src/js/views/form/form_controller.js
+++ b/addons/web/static/src/js/views/form/form_controller.js
@@ -599,9 +599,12 @@ var FormController = BasicController.extend({
* @private
* @param {OdooEvent} event
*/
- _onFormDialogDiscarded: function(e) {
- e.stopPropagation();
- this.renderer.focusLastActivatedWidget();
+ _onFormDialogDiscarded: function(ev) {
+ ev.stopPropagation();
+ var isFocused = this.renderer.focusLastActivatedWidget();
+ if (ev.data.callback) {
+ ev.data.callback(_.str.toBool(isFocused));
+ }
},
/**
* Opens a one2many record (potentially new) in a dialog. This handler is
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 a10e75f1944..0c4d64afb13 100644
--- a/addons/web/static/src/js/views/form/form_renderer.js
+++ b/addons/web/static/src/js/views/form/form_renderer.js
@@ -177,8 +177,11 @@ var FormRenderer = BasicRenderer.extend({
* field.
*/
focusLastActivatedWidget: function () {
- this._activateNextFieldWidget(this.state, this.lastActivatedFieldIndex - 1,
- { noAutomaticCreate: true });
+ if (this.lastActivatedFieldIndex !== -1) {
+ return this._activateNextFieldWidget(this.state, this.lastActivatedFieldIndex - 1,
+ { noAutomaticCreate: true });
+ }
+ return false;
},
/**
* returns the active tab pages for each notebook
diff --git a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
index 0c484931aae..6a9caa99a39 100644
--- a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
+++ b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
@@ -150,7 +150,7 @@ var KanbanColumnProgressBar = Widget.extend({
});
// Adapt active state
- $bar.toggleClass('active progress-bar-striped', key === self.activeFilter);
+ $bar.toggleClass('progress-bar-animated progress-bar-striped', key === self.activeFilter);
// Adapt width
$bar.removeClass('o_bar_has_records transition-off');
diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js
index befe4247c00..4987f7cc9bc 100644
--- a/addons/web/static/src/js/views/view_dialogs.js
+++ b/addons/web/static/src/js/views/view_dialogs.js
@@ -241,8 +241,13 @@ var FormViewDialog = ViewDialog.extend({
* @override
*/
_focusOnClose: function() {
- this.trigger_up('form_dialog_discarded');
- return true;
+ var isFocusSet = false;
+ this.trigger_up('form_dialog_discarded', {
+ callback: function (isFocused) {
+ isFocusSet = isFocused;
+ },
+ });
+ return isFocusSet;
},
/**
@@ -425,8 +430,13 @@ var SelectCreateDialog = ViewDialog.extend({
* @override
*/
_focusOnClose: function() {
- this.trigger_up('form_dialog_discarded');
- return true;
+ var isFocusSet = false;
+ this.trigger_up('form_dialog_discarded', {
+ callback: function (isFocused) {
+ isFocusSet = isFocused;
+ },
+ });
+ return isFocusSet;
},
});
diff --git a/addons/web/static/src/xml/kanban.xml b/addons/web/static/src/xml/kanban.xml
index 0908d052980..9077df2e0ad 100644
--- a/addons/web/static/src/xml/kanban.xml
+++ b/addons/web/static/src/xml/kanban.xml
@@ -110,7 +110,7 @@
<div class="o_kanban_counter_progress progress">
<t t-foreach="widget.colors" t-as="color">
<t t-set="count" t-value="widget.subgroupCounts and widget.subgroupCounts[color] or 0"/>
- <div t-attf-class="progress-bar transition-off bg-#{color_value}-full#{count ? ' o_bar_has_records' : ''}#{widget.activeFilter ? ' active progress-bar-striped' : ''}"
+ <div t-attf-class="progress-bar transition-off bg-#{color_value}-full#{count ? ' o_bar_has_records' : ''}#{widget.activeFilter ? ' progress-bar-animated progress-bar-striped' : ''}"
t-att-data-filter="color"
t-attf-data-original-title="#{count} #{color}"
aria-valuemin="0" aria-valuemax="100" t-att-aria-valuenow="count*100" role="progressbar"
diff --git a/addons/web/static/src/xml/menu.xml b/addons/web/static/src/xml/menu.xml
index 6a4749d1c25..086d676e02a 100644
--- a/addons/web/static/src/xml/menu.xml
+++ b/addons/web/static/src/xml/menu.xml
@@ -20,7 +20,7 @@
</a>
<div class="dropdown-menu" role="menu">
<t t-foreach="widget.getApps()" t-as="app">
- <a role="menuitem"
+ <a role="menuitem" t-attf-href="#menu_id=#{app.menuID}"
class="dropdown-item o_app"
t-att-data-menu-id="app.menuID"
t-att-data-menu-xmlid="app.xmlID"
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index c82d031d7d5..d2765a17a53 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -309,8 +309,8 @@ QUnit.module('relational_fields', {
// Open many2one modal
form.$buttons.find('.btn.o_form_button_edit').click();
form.$('.o_external_button').click();
- var $originalModal = $('.modal-dialog');
- var $focusedModal = $(document.activeElement).closest('.modal-dialog');
+ var $originalModal = $('.modal');
+ var $focusedModal = $(document.activeElement).closest('.modal');
assert.equal($originalModal.length, 1, 'There should be one modal');
assert.equal($originalModal[0], $focusedModal[0], 'Modal is focused');
@@ -318,8 +318,8 @@ QUnit.module('relational_fields', {
// Open many2one modal of field in many2one modal
$originalModal.find('.o_external_button').click();
- var $modals = $('.modal-dialog');
- $focusedModal = $(document.activeElement).closest('.modal-dialog');
+ var $modals = $('.modal');
+ $focusedModal = $(document.activeElement).closest('.modal');
assert.equal($modals.length, 2, 'There should be two modals');
assert.equal($modals[1], $focusedModal[0], 'Last modal is focused');
@@ -327,8 +327,8 @@ QUnit.module('relational_fields', {
// Close second modal
$modals.last().find('button[class="close"]').click();
- var $modal = $('.modal-dialog');
- $focusedModal = $(document.activeElement).closest('.modal-dialog');
+ var $modal = $('.modal');
+ $focusedModal = $(document.activeElement).closest('.modal');
assert.equal($modal.length, 1, 'There should be one modal');
assert.equal($modal[0], $originalModal[0], 'First modal is still opened');
diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js
index c7e622eb331..a3a17a42de4 100644
--- a/addons/web/static/tests/views/form_tests.js
+++ b/addons/web/static/tests/views/form_tests.js
@@ -4706,6 +4706,65 @@ QUnit.module('Views', {
form.destroy();
});
+ QUnit.module('focus and scroll test', function () {
+ QUnit.test('no focus set on form when closing many2one modal if lastActivatedFieldIndex is not set', function (assert) {
+ assert.expect(8);
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<field name="display_name"/>' +
+ '<field name="foo"/>' +
+ '<field name="bar"/>' +
+ '<field name="p"/>' +
+ '<field name="timmy"/>' +
+ '<field name="product_ids"/>' +
+ '<field name="trululu"/>' +
+ '</form>',
+ res_id: 2,
+ archs: {
+ 'partner,false,list': '<tree><field name="display_name"/></tree>',
+ 'partner_type,false,list': '<tree><field name="name"/></tree>',
+ 'partner,false,form': '<form><field name="trululu"/></form>',
+ 'product,false,list': '<tree><field name="name"/></tree>',
+ },
+ mockRPC: function (route, args) {
+ if (args.method === 'get_formview_id') {
+ return $.when(false);
+ }
+ return this._super(route, args);
+ },
+ });
+
+ // set max-height to have scroll forcefully so that we can test scroll position after modal close
+ $('.o_content').css({'overflow': 'auto', 'max-height': '300px'});
+ // Open many2one modal, lastActivatedFieldIndex will not set as we directly click on external button
+ testUtils.form.clickEdit(form);
+ assert.strictEqual($(".o_content").scrollTop(), 0, "scroll position should be 0");
+
+ form.$(".o_field_many2one[name='trululu'] .o_input").focus();
+ assert.notStrictEqual($(".o_content").scrollTop(), 0, "scroll position should not be 0");
+
+ testUtils.dom.click(form.$('.o_external_button'));
+ // Close modal
+ testUtils.dom.click($('.modal').last().find('button[class="close"]'));
+ assert.notStrictEqual($(".o_content").scrollTop(), 0,
+ "scroll position should not be 0 after closing modal");
+ assert.containsNone(document.body, '.modal', 'There should be no modal');
+ assert.doesNotHaveClass($('body'), 'modal-open', 'Modal is not said opened');
+ assert.strictEqual(form.renderer.lastActivatedFieldIndex, -1,
+ "lastActivatedFieldIndex is -1");
+ assert.equal(document.activeElement, $('body')[0],
+ 'body is focused, should not set focus on form widget');
+ assert.notStrictEqual(document.activeElement, form.$('.o_field_many2one[name="trululu"] .o_input'),
+ 'field widget should not be focused when lastActivatedFieldIndex is -1');
+
+ form.destroy();
+ });
+ });
+
QUnit.test('in create mode, autofocus fields are focused', function (assert) {
assert.expect(1);