diff --git a/src/sao.js b/src/sao.js index be939cde5b..a3542182a5 100644 --- a/src/sao.js +++ b/src/sao.js @@ -267,6 +267,9 @@ var Sao = {}; var view = form.screen.current_view; view.table.find('thead').hide(); jQuery('#menu').children().remove(); + + var gs = new Sao.GlobalSearch(); + jQuery('#menu').append(gs.el); jQuery('#menu').append( form.screen.screen_container.content_box.detach()); }); @@ -305,6 +308,94 @@ var Sao = {}; } }); + Sao.GlobalSearch = Sao.class_(Object, { + init: function() { + this.el = jQuery('
', { + 'class': 'global-search-container' + }); + this.search_entry = jQuery('', { + 'class': 'form-control', + 'placeholder': 'Search…' + }); + this.el.append(this.search_entry); + this.search_entry.typeahead({ + 'highlight': false + }, { + 'source': this.update.bind(this), + 'displayKey': 'record_name', + 'templates': { + 'suggestion': function(context) { + var html = jQuery('
'); + var img = jQuery('', { + 'class': 'global-search-icon' + }); + var img_prm = Sao.common.ICONFACTORY.register_icon( + context.icon); + img_prm.then(function(icon_url) { + img.attr('src', icon_url); + }.bind(this)); + html.append(img); + html.append(jQuery('

', { + 'class': 'global-search-text' + }).text(context.record_name)); + return html; + } + } + }); + this.search_entry.on('typeahead:selected', + this.match_selected.bind(this)); + }, + query: function(value) { + if (!arguments.length) { + return this.search_entry.typeahead('val'); + } else { + return this.search_entry.typeahead('val', value); + } + }, + update: function(query, process) { + if (query != this.query()) { + return; + } + var ir_model = new Sao.Model('ir.model'); + var search_prm = ir_model.execute('global_search', + [query, Sao.config.limit, Sao.main_menu_screen.model_name], + Sao.main_menu_screen.context); + search_prm.then(function(s_results) { + if (query != this.query()) { + return; + } + var results = []; + for (var i=0, len=s_results.length; i < len; i++) { + results.push({ + 'model': s_results[i][1], + 'model_name': s_results[i][2], + 'record_id': s_results[i][3], + 'record_name': s_results[i][4], + 'icon': s_results[i][5], + }); + } + process(results); + }.bind(this)); + }, + match_selected: function(event_, item, name) { + if (item.model == Sao.main_menu_screen.model_name) { + Sao.Action.exec_keyword('tree_open', { + 'model': item.model, + 'id': item.record_id, + 'ids': [item.record_id] + }, Sao.main_menu_screen.context); + } else { + var params = { + 'model': item.model, + 'res_id': item.record_id, + 'mode': ['form', 'tree'] + }; + Sao.Tab.create(params); + } + this.query(''); + } + }); + // Fix stacked modal jQuery(document) .on('show.bs.modal', '.modal', function(event) { diff --git a/src/sao.less b/src/sao.less index 5b339196b1..8c03c4fb45 100644 --- a/src/sao.less +++ b/src/sao.less @@ -195,8 +195,22 @@ z-index: 1000; } -.tt-hint { - background-color: transparent !important; +.twitter-typeahead { + & .tt-hint { + background-color: transparent !important; + } + + & img.global-search-icon { + width: 2em; + height: 2em; + float: left; + } + + & p.global-search-text { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } } .tt-dataset-actions {