From 01173f374581845651495e28ecb2ea04dd83b5f3 Mon Sep 17 00:00:00 2001 From: qmo-odoo Date: Fri, 19 Oct 2018 10:24:45 +0000 Subject: [PATCH] [IMP] base: Improve search and ordering in settings Allows users to not only search on settings name but on their description too. Improves search results relevance : Instead of the actual fixed order, top results should be about the module selected in the left panel Task : #1893252 closes : #28094 --- .../base/static/src/js/res_config_settings.js | 21 ++++- .../base/static/tests/base_settings_tests.js | 92 +++++++++++++++++++ 2 files changed, 111 insertions(+), 2 deletions(-) diff --git a/odoo/addons/base/static/src/js/res_config_settings.js b/odoo/addons/base/static/src/js/res_config_settings.js index 9514d431141..609a3695178 100644 --- a/odoo/addons/base/static/src/js/res_config_settings.js +++ b/odoo/addons/base/static/src/js/res_config_settings.js @@ -21,6 +21,7 @@ var BaseSettingRenderer = FormRenderer.extend({ this._super.apply(this, arguments); this.activeView = false; this.activeTab = false; + this.initialTabElements = undefined; }, start: function () { @@ -199,6 +200,17 @@ var BaseSettingRenderer = FormRenderer.extend({ * @param {int} index */ _moveToTab: function (index) { + //Used to reorder the settings after a search and a tab switch + //Thought it would be better for the UX if the order stayed the same as the one on the left panel + var settingsNode = this.$('.settings')[0]; + if(!this.initialTabElements && settingsNode){ + //Converts an HtmlCollection into an array + this.initialTabElements = Array.prototype.slice.call(settingsNode.children); + } else { + this.$('.settings') + .empty() + .append(this.initialTabElements) + } this.currentIndex = !index || index === -1 ? 0 : (index === this.modules.length ? index - 1 : index); if (this.currentIndex !== -1) { if (this.activeView) { @@ -236,7 +248,6 @@ var BaseSettingRenderer = FormRenderer.extend({ _onKeyUpSearch: function (event) { this.searchText = this.searchInput.val(); - this.activeTab.removeClass('selected'); if (config.device.isMobile) { this.$('.settings_tab').addClass('o_hidden'); this.$('.settings').addClass('d-block'); @@ -299,13 +310,19 @@ var BaseSettingRenderer = FormRenderer.extend({ _searchSetting: function () { var self = this; this.count = 0; + var settings = $(this.$el.find('.settings')[0].children); + //Results for active module should be at the top + var active_key = self.$el.find('.selected')[0].attributes['data-key'].value; + var selectedModule = self.$el.find('.app_settings_block[data-key="' + active_key + '"]'); + var toInsertBefore = $(settings[1]); + selectedModule.insertBefore(toInsertBefore); _.each(this.modules, function (module) { self.inVisibleCount = 0; module.settingView.find('.o_setting_box').addClass('o_hidden'); module.settingView.find('h2').addClass('o_hidden'); module.settingView.find('.settingSearchHeader').addClass('o_hidden'); module.settingView.find('.o_settings_container').removeClass('mt16'); - var resultSetting = module.settingView.find("label:containsTextLike('" + self.searchText + "')"); + var resultSetting = module.settingView.find(".o_form_label:containsTextLike('" + self.searchText + "'), .text-muted:containsTextLike('"+ self.searchText +"')"); if (resultSetting.length > 0) { resultSetting.each(function () { var settingBox = $(this).closest('.o_setting_box'); diff --git a/odoo/addons/base/static/tests/base_settings_tests.js b/odoo/addons/base/static/tests/base_settings_tests.js index 000ff54d009..4b15d4417f7 100644 --- a/odoo/addons/base/static/tests/base_settings_tests.js +++ b/odoo/addons/base/static/tests/base_settings_tests.js @@ -178,5 +178,97 @@ QUnit.module('base_settings_tests', { form.destroy(); }); + QUnit.test('Settings from the selected module are at the top results of a search', function (assert) { + assert.expect(3); + + var form = createView({ + View: BaseSettingsView, + model: 'project', + data: this.data, + arch: '
' + + '
' + + ' ' + + '
' + + '
' + + '
' + + '
' + + '
'+ + '
'+ + 'CRM'+ + '
'+ + '
'+ + 'Sales'+ + '
'+ + '
'+ + '
' + + '
No Record Found
' + + '
' + + '
'+ + '
'+ + '
' + + ''+ + '
'+ + '
'+ + '
' + + '
'+ + '
'+ + '
' + + ''+ + '
'+ + '
'+ + '
' + + '
'+ + '
' + + '
' + + '
' + + '
'+ + '
'+ + '
' + + ''+ + '
'+ + '
'+ + '
' + + '
'+ + '
'+ + '
' + + ''+ + '
'+ + '
'+ + '
' + + '
'+ + '
' + + '
' + + '
' + + '
' + + '
', + }); + form.$('.tab,[data-key="sale"]').click() + assert.strictEqual(form.$('.tab.selected').attr('data-key'),"sale","sale setting selected"); + form.$('.searchInput').val('t').trigger('keyup'); + assert.strictEqual($('.highlighter').html(),"t","t word highlighted"); + assert.strictEqual($(form.$('.settings')[0].children[1]).attr('data-key'),"sale","Results from Sales are at the top"); + form.destroy(); + }); + }); });