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 {