From 5c41522fe00f73cb966086f2f0e67fc860bb658a Mon Sep 17 00:00:00 2001 From: "sma (Tiny)" Date: Thu, 19 May 2011 18:36:02 +0530 Subject: [PATCH 1/5] [ADD] Add button for many2one context menu. bzr revid: sma@tinyerp.com-20110519130602-1dcni7vqr03fbr1o --- addons/base/static/src/img/iconset-d-drop.gif | Bin 0 -> 238 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/base/static/src/img/iconset-d-drop.gif diff --git a/addons/base/static/src/img/iconset-d-drop.gif b/addons/base/static/src/img/iconset-d-drop.gif new file mode 100644 index 0000000000000000000000000000000000000000..4907a92761907410695834dc1f2747dfc83c30de GIT binary patch literal 238 zcmVFLeQ&En$X)z#IZprGdF=IiV0*4EbW@bJ&g z&GPc{oh50$^D{b~YD|^iiooq#RRbi&0b*m~G~=Npw0HL&cCeCpH<%X0CB) o<{L`p!x&gB9T6RW0}Lt@2muoo69EVmDk2920u2HL2Pz=|JLtlK2mk;8 literal 0 HcmV?d00001 From b7c4c3284ae947e182895085a658f26c47d7ac2f Mon Sep 17 00:00:00 2001 From: "sma (Tiny)" Date: Thu, 19 May 2011 18:36:23 +0530 Subject: [PATCH 2/5] [IMP] Improve button for contextual menu to set in the form view. bzr revid: sma@tinyerp.com-20110519130623-uqztduzpzl53909n --- addons/base/static/src/css/base.css | 7 ++++++- addons/base/static/src/xml/base.xml | 17 ++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 5a950a2cc6c..77938ff0da1 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -838,5 +838,10 @@ body.openerp { position: relative; margin-left: -26px; } -/*------------- End autocomplete ------- */ +.openerp img.m2o_open { + vertical-align: middle; + cursor: pointer; +} + +/*----- End autocomplete ------- */ diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index f6fec76f32e..26418a7d7cc 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -356,13 +356,16 @@ - -
+
+ + + +
From 3ba4b7765c60500699274375aa9a85befcd3a966 Mon Sep 17 00:00:00 2001 From: "sma (Tiny)" Date: Thu, 19 May 2011 18:36:31 +0530 Subject: [PATCH 3/5] [IMP] Improve the code. bzr revid: sma@tinyerp.com-20110519130631-x0af1imdtbeqh1a4 --- addons/base/static/src/js/m2o.js | 178 +++++++++++++++++-------------- 1 file changed, 96 insertions(+), 82 deletions(-) diff --git a/addons/base/static/src/js/m2o.js b/addons/base/static/src/js/m2o.js index af0a7496005..c1c21ce5242 100644 --- a/addons/base/static/src/js/m2o.js +++ b/addons/base/static/src/js/m2o.js @@ -4,111 +4,125 @@ openerp.base.m2o = function(openerp){ init: function(view_manager, element_id, model, dataset, session){ this._super(element_id, model, dataset, session); - this.view_manager = view_manager + this.view_manager = view_manager; this.session = session; this.element = element_id.find('input'); - this.button = element_id.find('div'); + this.button = element_id.find('span'); this.dataset = dataset; - var cache = {}; + this.cache = {}; var lastXhr; + this.$input; this.relation = model; this.result_ids = []; + this.create_option = jQuery('#'+this.element.attr('name')+ '_open'); var self = this; - var $input = this.element.autocomplete({ - + this.$input = this.element.autocomplete ({ source: function(request, response){ - var search_val = request.term; - if (search_val in cache) { - response(cache[search_val]); - return; - } - //pass request to server - lastXhr = self.dataset.name_search(search_val, function(obj, status, xhr){ - var result = obj.result; - var values = []; - if (!result.length) { - values.push({'value': 'Create...', id: 'create', orig_val: ''}); - } - - $.each(result, function(i, val){ - values.push({ - value: val[1], - id: val[0], - orig_val: val[1] - }); - self.result_ids.push(result[i][0]); - }); - - if (values.length > 7) { - values = values.slice(0, 7); - } - values.push({'value': 'More...', id: 'more', orig_val:''}); - cache[search_val] = values; - response(values); - }); + self.getSearch_Result(request, response); return; }, - select: function(event, ui){ - ui.item.value = ui.item.orig_val? ui.item.orig_val : self.element.data( "autocomplete" ).term; - if (ui.item.id == 'more') { - self.dataset.ids = self.result_ids; - self.dataset.count = self.dataset.ids.length; - self.dataset.domain = self.result_ids.length ? [["id", "in", self.dataset.ids]] : [] - self.element.val(''); - var pop = new openerp.base.form.Many2XSelectPopup(null, self.session); - pop.select_element(self.relation, self.dataset); - return; - } - - if (ui.item.id == 'create') { - var val = self.element.val(); - self.dataset.create({'name': ui.item.value}, - function(r){}, function(r){ - var element_id = _.uniqueId("act_window_dialog"); - var dialog = jQuery('
', - {'id': element_id - }).dialog({ - modal: true, - minWidth: 800 - }); - self.element.val(''); - var event_form = new openerp.base.FormView(self.view_manager, self.session, element_id, self.dataset, false); - event_form.start(); - }); - $input.val(self.element.data( "autocomplete" ).term); - return true; - } - self.element.attr('m2o_id', ui.item.id); + self.getSelected_Result(event, ui); }, - minLength: 0, - focus: function(event, ui) { - if (ui.item.id == ('create')) { - return true; - } - ui.item.value = self.element.data("autocomplete").term.length ? self.element.val() + '[' + ui.item.orig_val.substring(self.element.data("autocomplete").term.length) + ']' : this.lastSearch; + self.gotFocus(event, ui); } - }); this.button.button({ icons: { primary: "ui-icon-triangle-1-s"}, text: false - }) - .click(function() { - // close if already visible - if ($input.autocomplete("widget").is(":visible")) { - $input.autocomplete( "close" ); - return; - } - $(this).blur(); - $input.autocomplete("search", "" ); - $input.focus(); + }) + .click(function() { + // close if already visible + if (self.$input.autocomplete("widget").is(":visible")) { + self.$input.autocomplete( "close" ); + return; + } + $(this).blur(); + self.$input.autocomplete("search", "" ); + self.$input.focus(); + }); + }, + + getSearch_Result: function(request, response) { + var search_val = request.term; + if (search_val in this.cache) { + response(this.cache[search_val]); + return; + } + var self = this; + //pass request to server + lastXhr = this.dataset.name_search(search_val, function(obj, status, xhr){ + var result = obj.result; + var values = []; + + $.each(result, function(i, val){ + values.push({ + value: val[1], + id: val[0], + orig_val: val[1] + }); + self.result_ids.push(result[i][0]); }); + + if (values.length > 7) { + values = values.slice(0, 7); + } + values.push({'value': 'More...', id: 'more', orig_val:''}, + {'value': 'Create..'+search_val, id: 'create', orig_val: ''}); + self.cache[search_val] = values; + response(values); + }); + }, + + getSelected_Result: function(event, ui) { + ui.item.value = ui.item.orig_val? ui.item.orig_val : this.element.data( "autocomplete" ).term; + if (ui.item.id == 'more') { + this.dataset.ids = this.result_ids; + this.dataset.count = this.dataset.ids.length; + this.dataset.domain = this.result_ids.length ? [["id", "in", this.dataset.ids]] : [] + this.element.val(''); + var pop = new openerp.base.form.Many2XSelectPopup(null, this.session); + pop.select_element(this.relation, this.dataset); + return; + } + + if (ui.item.id == 'create') { + this.openRecords(event, ui) + } + this.element.attr('m2o_id', ui.item.id); + }, + + gotFocus: function(event, ui) { + if (ui.item.id == ('create')) { + return true; + } + ui.item.value = this.element.data("autocomplete").term.length ? + this.element.val() + '[' + ui.item.orig_val.substring(this.element.data("autocomplete").term.length) + ']' : this.lastSearch; + }, + + openRecords: function(event, ui) { + var val = this.element.val(); + var self = this + this.dataset.create({'name': ui.item.value}, + function(r){}, function(r){ + var element_id = _.uniqueId("act_window_dialog"); + var dialog = jQuery('
', + {'id': element_id + }).dialog({ + modal: true, + minWidth: 800 + }); + self.element.val(''); + var event_form = new openerp.base.FormView(self.view_manager, self.session, element_id, self.dataset, false); + event_form.start(); + }); + self.$input.val(self.element.data( "autocomplete" ).term); + return true; } }); } From 54fb05b1fd89f799b3a42dd1eb156414084d9f28 Mon Sep 17 00:00:00 2001 From: "sma (Tiny)" Date: Thu, 19 May 2011 18:51:44 +0530 Subject: [PATCH 4/5] [ADD] Add context menu css. bzr revid: sma@tinyerp.com-20110519132144-h1tf60au9ozr123u --- addons/base/static/src/css/base.css | 44 ++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 77938ff0da1..b1301bf0873 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -843,5 +843,47 @@ body.openerp { vertical-align: middle; cursor: pointer; } +/*----- End Many2one Autosearch ------- */ -/*----- End autocomplete ------- */ +/* Many2one Contextmenu */ +div.contextmenu { + background-color: #444; + border: 1px solid #000; + white-space: nowrap; + position: absolute; + padding: 2px; + z-index: 100; +} + +div.contextmenu a, +div.contextmenu span { + display: block; + text-align: left; + text-decoration: none; + white-space: nowrap; + padding: 2px; + color: #FFF; + cursor: pointer; +} + +div.contextmenu hr { + margin: 1px 0 !important; +} + +div.contextmenu td { + padding: 1px; +} + +div.contextmenu a:hover, +div.contextmenu span:hover { + color: #FFF; + background-color: #505050; + text-decoration: none; +} + +div.contextmenu a.disabled, +div.contextmenu span.disabled { + color: #C0C0C0; +} + +/*----- End Many2one Contextmenu ------- */ From e4f66912b87fd449d8c09dd1376be99f202e7236 Mon Sep 17 00:00:00 2001 From: "sma (Tiny)" Date: Thu, 19 May 2011 18:52:13 +0530 Subject: [PATCH 5/5] [IMP] Initially just open context menu with static items. bzr revid: sma@tinyerp.com-20110519132213-leppy05us2o5y1gi --- addons/base/static/src/js/m2o.js | 118 ++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/m2o.js b/addons/base/static/src/js/m2o.js index c1c21ce5242..00da2f76c29 100644 --- a/addons/base/static/src/js/m2o.js +++ b/addons/base/static/src/js/m2o.js @@ -15,6 +15,15 @@ openerp.base.m2o = function(openerp){ this.relation = model; this.result_ids = []; this.create_option = jQuery('#'+this.element.attr('name')+ '_open'); + if (this.create_option) { + var defaults = [ + {'text': 'Go to..', 'action': "call_Actions()"}, + {'text': 'Choose..', 'action': "call_Actions()"} + ] + jQuery(this.create_option).click(jQuery.proxy(function(evt){ + on_context_menu(evt, this.element, defaults); + }, this)); + } var self = this; this.$input = this.element.autocomplete ({ @@ -84,7 +93,7 @@ openerp.base.m2o = function(openerp){ if (ui.item.id == 'more') { this.dataset.ids = this.result_ids; this.dataset.count = this.dataset.ids.length; - this.dataset.domain = this.result_ids.length ? [["id", "in", this.dataset.ids]] : [] + this.dataset.domain = this.result_ids.length ? [["id", "in", this.dataset.ids]] : []; this.element.val(''); var pop = new openerp.base.form.Many2XSelectPopup(null, this.session); pop.select_element(this.relation, this.dataset); @@ -92,7 +101,7 @@ openerp.base.m2o = function(openerp){ } if (ui.item.id == 'create') { - this.openRecords(event, ui) + this.openRecords(event, ui); } this.element.attr('m2o_id', ui.item.id); }, @@ -107,7 +116,7 @@ openerp.base.m2o = function(openerp){ openRecords: function(event, ui) { var val = this.element.val(); - var self = this + var self = this; this.dataset.create({'name': ui.item.value}, function(r){}, function(r){ var element_id = _.uniqueId("act_window_dialog"); @@ -126,3 +135,106 @@ openerp.base.m2o = function(openerp){ } }); } + +function call_Actions() { + +} + +function on_context_menu(evt, target, defaults){ + + var $target = jQuery(target || evt.target); + var kind = $target.attr('type'); + if (!(kind && $target.is(':input, :enabled'))) { + return; + } + var $menu = jQuery('#contextmenu').show(); + if (!$menu.length) { + $menu = jQuery('
') + .css({position: 'absolute'}) + .hover(showContextMenu, hideContextMenu) + .appendTo(document.body).show(); + + if (jQuery(document.documentElement).hasClass('ie')) { + jQuery('