summaryrefslogtreecommitdiff
path: root/addons/web_tip/static/src
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web_tip/static/src')
-rw-r--r--addons/web_tip/static/src/js/tip.js581
1 files changed, 298 insertions, 283 deletions
diff --git a/addons/web_tip/static/src/js/tip.js b/addons/web_tip/static/src/js/tip.js
index f9e9d66b10a..450bbe9803b 100644
--- a/addons/web_tip/static/src/js/tip.js
+++ b/addons/web_tip/static/src/js/tip.js
@@ -1,316 +1,331 @@
-(function() {
-
- var instance = openerp;
-
- instance.web.Tip = instance.web.Class.extend({
- init: function() {
- var self = this;
- self.tips = [];
- self.tip_mutex = new $.Mutex();
- self.$overlay = null;
- self.$element = null;
-
- var Tips = new instance.web.Model('web.tip');
- Tips.query(['title', 'description', 'action_id', 'model', 'type', 'mode', 'trigger_selector',
- 'highlight_selector', 'end_selector', 'end_event', 'placement', 'is_consumed'])
- .all().then(function(tips) {
- self.tips = tips;
- })
- ;
-
- instance.web.bus.on('action', this, function(action) {
- self.on_action(action);
- });
-
- instance.web.bus.on('view_shown', this, function(view) {
- if (_.keys(view.fields_view).length === 0) {
- view.on('view_loaded', this, function(fields_view) {
- self.on_view(view);
- });
- } else {
+odoo.define(['web.core', 'web.form_widgets', 'web.Model', 'web.utils', 'web.WebClient'], function (require) {
+"use strict";
+
+var core = require('web.core');
+var form_widgets = require('web.form_widgets');
+var Model = require('web.Model');
+var utils = require('web.utils');
+var WebClient = require('web.WebClient');
+
+var bus = core.bus;
+var Class = core.Class;
+
+var Tip = Class.extend({
+ init: function() {
+ var self = this;
+ self.tips = [];
+ self.tip_mutex = new utils.Mutex();
+ self.$overlay = null;
+ self.$element = null;
+
+ var Tips = new Model('web.tip');
+ Tips.query(['title', 'description', 'action_id', 'model', 'type', 'mode', 'trigger_selector',
+ 'highlight_selector', 'end_selector', 'end_event', 'placement', 'is_consumed'])
+ .all().then(function(tips) {
+ self.tips = tips;
+ })
+ ;
+
+ core.bus.on('action', this, function(action) {
+ self.on_action(action);
+ });
+
+ bus.on('view_shown', this, function(view) {
+ if (_.keys(view.fields_view).length === 0) {
+ view.on('view_loaded', this, function(fields_view) {
self.on_view(view);
- }
-
- view.on('switch_mode', this, function() {
});
- });
+ } else {
+ self.on_view(view);
+ }
- instance.web.bus.on('view_switch_mode', this, function(viewManager, mode) {
- self.on_switch(viewManager, mode);
+ view.on('switch_mode', this, function() {
});
-
- instance.web.bus.on('form_view_shown', this, function(formView) {
- self.on_form_view(formView);
+ });
+
+ bus.on('view_switch_mode', this, function(viewManager, mode) {
+ self.on_switch(viewManager, mode);
+ });
+
+ bus.on('form_view_shown', this, function(formView) {
+ self.on_form_view(formView);
+ });
+
+ bus.on('form_view_saved', this, function(formView) {
+ self.on_form_view(formView);
+ });
+ },
+
+ // stub
+ on_action: function(action) {
+ var self = this;
+ var action_id = action.id;
+ var model = action.res_model;
+ },
+
+ on_view: function(view) {
+ var self = this;
+ var fields_view = view.fields_view;
+ var action_id = view.ViewManager.action ? view.ViewManager.action.id : null;
+ var model = fields_view.model;
+
+ // kanban
+ if(fields_view.type === 'kanban') {
+ var dataset_def = $.Deferred();
+ var groups_def = $.Deferred();
+ view.on("kanban_dataset_processed", self, function() {
+ var length = view.dataset.ids.length;
+ dataset_def.resolve(length);
});
-
- instance.web.bus.on('form_view_saved', this, function(formView) {
- self.on_form_view(formView);
+ view.on('kanban_groups_processed', self, function() {
+ groups_def.resolve();
});
- },
-
- // stub
- on_action: function(action) {
- var self = this;
- var action_id = action.id;
- var model = action.res_model;
- },
-
- on_view: function(view) {
- var self = this;
- var fields_view = view.fields_view;
- var action_id = view.ViewManager.action ? view.ViewManager.action.id : null;
- var model = fields_view.model;
-
- // kanban
- if(fields_view.type === 'kanban') {
- var dataset_def = $.Deferred();
- var groups_def = $.Deferred();
- view.on("kanban_dataset_processed", self, function() {
- var length = view.dataset.ids.length;
- dataset_def.resolve(length);
- });
- view.on('kanban_groups_processed', self, function() {
- groups_def.resolve();
- });
- dataset_def.done(function(length) {
- self.eval_tip(action_id, model, fields_view.type);
- });
- groups_def.done(function() {
- self.eval_tip(action_id, model, fields_view.type);
- });
- } else if (fields_view.type === 'tree') {
- view.on('view_list_rendered', self, function() {
- self.eval_tip(action_id, model, fields_view.type);
- });
- } else if (view.hasOwnProperty('editor')) {
- view.on('view_list_rendered', self, function() {
- self.reposition();
- });
- }
- },
-
- on_form_view: function(formView) {
- var self = this;
- var model = formView.model;
- var type = formView.datarecord.type ? formView.datarecord.type : null;
- var mode = 'form';
- formView.on('view_content_has_changed', self, _.once(function() {
+ dataset_def.done(function(length) {
+ self.eval_tip(action_id, model, fields_view.type);
+ });
+ groups_def.done(function() {
+ self.eval_tip(action_id, model, fields_view.type);
+ });
+ } else if (fields_view.type === 'tree') {
+ view.on('view_list_rendered', self, function() {
+ self.eval_tip(action_id, model, fields_view.type);
+ });
+ } else if (view.hasOwnProperty('editor')) {
+ view.on('view_list_rendered', self, function() {
+ self.reposition();
+ });
+ }
+ },
+
+ on_form_view: function(formView) {
+ var self = this;
+ var model = formView.model;
+ var type = formView.datarecord.type ? formView.datarecord.type : null;
+ var mode = 'form';
+ formView.on('view_content_has_changed', self, _.once(function() {
+ self.eval_tip(null, model, mode, type);
+ }));
+ if ($('.oe_chatter').length > 0) {
+ core.bus.on('chatter_messages_fetched', this, _.once(function () {
self.eval_tip(null, model, mode, type);
}));
- if ($('.oe_chatter').length > 0) {
- instance.web.bus.on('chatter_messages_fetched', this, _.once(function () {
- self.eval_tip(null, model, mode, type);
- }));
- } else {
- self.eval_tip(null, model, mode, type);
- }
- },
-
- // stub
- on_switch: function (viewManager, mode) {
- var self = this;
- var action = viewManager.action;
- var action_id = action.id;
- var model = action.res_model;
- },
-
- eval_tip: function(action_id, model, mode, type) {
- var self = this;
- var filter = {};
- var valid_tips = [];
- var tips = [];
- if (action_id) {
- valid_tips = _.filter(self.tips, function (tip) {
- return tip.action_id[0] === action_id;
- });
- }
-
- filter.model = model;
- filter.mode = mode;
- tips = _.where(self.tips, filter);
- if (type) {
- tips = _.filter(tips, function(tip) {
- if (!tip.type) {
- return true;
- }
- return tip.type === type;
- });
- }
-
- valid_tips = _.uniq(valid_tips.concat(tips));
- _.each(valid_tips, function(tip) {
- if (!tip.is_consumed) {
- self.add_tip(tip);
- }
+ } else {
+ self.eval_tip(null, model, mode, type);
+ }
+ },
+
+ // stub
+ on_switch: function (viewManager, mode) {
+ var self = this;
+ var action = viewManager.action;
+ var action_id = action.id;
+ var model = action.res_model;
+ },
+
+ eval_tip: function(action_id, model, mode, type) {
+ var self = this;
+ var filter = {};
+ var valid_tips = [];
+ var tips = [];
+ if (action_id) {
+ valid_tips = _.filter(self.tips, function (tip) {
+ return tip.action_id[0] === action_id;
});
- },
-
+ }
- add_tip: function(tip) {
- var self = this;
- self.tip_mutex.exec(function() {
- if (!tip.is_consumed) {
- return $.when(self.do_tip(tip));
+ filter.model = model;
+ filter.mode = mode;
+ tips = _.where(self.tips, filter);
+ if (type) {
+ tips = _.filter(tips, function(tip) {
+ if (!tip.type) {
+ return true;
}
+ return tip.type === type;
});
- },
+ }
+
+ valid_tips = _.uniq(valid_tips.concat(tips));
+ _.each(valid_tips, function(tip) {
+ if (!tip.is_consumed) {
+ self.add_tip(tip);
+ }
+ });
+ },
- do_tip: function (tip) {
- var self = this;
- var def = $.Deferred();
- var Tips = new instance.web.Model('web.tip');
- var highlight_selector = tip.highlight_selector;
- var triggers = tip.trigger_selector ? tip.trigger_selector.split(',') : [];
- var trigger_tip = true;
- if(!$(highlight_selector).length > 0 || !$(highlight_selector).is(":visible")) {
- return def.reject();
+ add_tip: function(tip) {
+ var self = this;
+ self.tip_mutex.exec(function() {
+ if (!tip.is_consumed) {
+ return $.when(self.do_tip(tip));
}
- for (var i = 0; i < triggers.length; i++) {
- if(!$(triggers[i]).length > 0) {
- trigger_tip = false;
- }
+ });
+ },
+
+ do_tip: function (tip) {
+ var self = this;
+ var def = $.Deferred();
+ var Tips = new Model('web.tip');
+ var highlight_selector = tip.highlight_selector;
+ var triggers = tip.trigger_selector ? tip.trigger_selector.split(',') : [];
+ var trigger_tip = true;
+
+ if(!$(highlight_selector).length > 0 || !$(highlight_selector).is(":visible")) {
+ return def.reject();
+ }
+ for (var i = 0; i < triggers.length; i++) {
+ if(!$(triggers[i]).length > 0) {
+ trigger_tip = false;
}
+ }
- if (trigger_tip) {
- self.$element = $(highlight_selector).first();
- if (self.$element.height() === 0 || self.$element.width() === 0) {
- var $images = self.$element.find('img');
- if ($images.length > 0) {
- $images.first().load(function() {
- self.add_tip(tip);
- });
- }
- return def.reject();
+ if (trigger_tip) {
+ self.$element = $(highlight_selector).first();
+ if (self.$element.height() === 0 || self.$element.width() === 0) {
+ var $images = self.$element.find('img');
+ if ($images.length > 0) {
+ $images.first().load(function() {
+ self.add_tip(tip);
+ });
}
+ return def.reject();
+ }
- self.scroll_to_tip();
- self.$helper = $("<div>", { class: 'oe_tip_helper' });
- self.$element.after(self.$helper);
- self._set_helper_position();
-
- self.$overlay = $("<div>", { class: 'oe_tip_overlay' });
- $('body').append(self.$overlay);
- self.$element.addClass('oe_tip_show_element');
+ self.scroll_to_tip();
+ self.$helper = $("<div>", { class: 'oe_tip_helper' });
+ self.$element.after(self.$helper);
+ self._set_helper_position();
- // fix the stacking context problem
- _.each(self.$element.parentsUntil('body'), function(el) {
- var zIndex = $(el).css('z-index');
- var opacity = parseFloat($(el).css('opacity'));
+ self.$overlay = $("<div>", { class: 'oe_tip_overlay' });
+ $('body').append(self.$overlay);
+ self.$element.addClass('oe_tip_show_element');
- if (/[0-9]+/.test(zIndex) || opacity < 1) {
- $(el).addClass('oe_tip_fix_parent');
- }
- });
+ // fix the stacking context problem
+ _.each(self.$element.parentsUntil('body'), function(el) {
+ var zIndex = $(el).css('z-index');
+ var opacity = parseFloat($(el).css('opacity'));
- self.$element.popover({
- placement: tip.placement,
- title: tip.title,
- content: tip.description,
- html: true,
- container: 'body',
- }).popover("show");
-
- var $cross = $('<button type="button" class="close">&times;</button>');
- $cross.addClass('oe_tip_close');
-
- if (tip.title) {
- $('.popover-title').prepend($cross);
- } else {
- $('.popover-content').prepend($cross);
+ if (/[0-9]+/.test(zIndex) || opacity < 1) {
+ $(el).addClass('oe_tip_fix_parent');
}
+ });
- // consume tip
- tip.end_selector = tip.end_selector ? tip.end_selector : tip.highlight_selector;
- $(tip.end_selector).one(tip.end_event, function($ev) {
- self.end_tip(tip);
- def.resolve();
- });
+ self.$element.popover({
+ placement: tip.placement,
+ title: tip.title,
+ content: tip.description,
+ html: true,
+ container: 'body',
+ }).popover("show");
- // dismiss tip
- $cross.on('click', function($ev) {
- self.end_tip(tip);
- def.resolve();
- });
- self.$overlay.on('click', function($ev) {
- self.end_tip(tip);
- def.resolve();
- });
- $(document).on('keyup.web_tip', function($ev) {
- if ($ev.which === 27) { // esc
- self.end_tip(tip);
- def.resolve();
- }
- });
+ var $cross = $('<button type="button" class="close">&times;</button>');
+ $cross.addClass('oe_tip_close');
- // resize
- instance.web.bus.on('resize', this, function() {
- self.reposition();
- });
+ if (tip.title) {
+ $('.popover-title').prepend($cross);
} else {
- def.reject();
+ $('.popover-content').prepend($cross);
}
- return def;
- },
-
- scroll_to_tip: function(){
- var self = this;
- var scroll = _.find(self.$element.parentsUntil('body'), function(el) {
- var overflow = $(el).css('overflow-y');
- return (overflow === 'auto' || overflow === 'scroll');
+
+ // consume tip
+ tip.end_selector = tip.end_selector ? tip.end_selector : tip.highlight_selector;
+ $(tip.end_selector).one(tip.end_event, function($ev) {
+ self.end_tip(tip);
+ def.resolve();
});
- if (scroll) {
- $(scroll).scrollTo(self.$element);
- }
- },
-
- end_tip: function(tip) {
- var self = this;
- var Tips = new instance.web.Model('web.tip');
- self.$element.popover('destroy');
- self.$overlay.remove();
- self.$helper.remove();
- self.$element.removeClass('oe_tip_show_element');
- _.each($('.oe_tip_fix_parent'), function(el) {
- $(el).removeClass('oe_tip_fix_parent');
+
+ // dismiss tip
+ $cross.on('click', function($ev) {
+ self.end_tip(tip);
+ def.resolve();
+ });
+ self.$overlay.on('click', function($ev) {
+ self.end_tip(tip);
+ def.resolve();
+ });
+ $(document).on('keyup.web_tip', function($ev) {
+ if ($ev.which === 27) { // esc
+ self.end_tip(tip);
+ def.resolve();
+ }
});
- $(document).off('keyup.web_tip');
- Tips.call('consume', [tip.id], {});
- tip.is_consumed = true;
- },
-
- reposition: function() {
- var self = this;
- if (self.tip_mutex.def.state() === 'pending') {
- self.scroll_to_tip();
- self._set_helper_position();
- self.$element.popover('show');
- }
- },
-
- _set_helper_position : function() {
- var offset = this.$element.offset();
- var _top = offset.top - 5;
- var _left = offset.left - 5;
- var _width = this.$element.outerWidth() + 10;
- var _height = this.$element.outerHeight() + 10;
- this.$helper.offset({top: _top , left: _left});
- this.$helper.width(_width);
- this.$helper.height(_height);
- }
- });
- instance.web.WebClient = instance.web.WebClient.extend({
- show_application: function() {
- this._super();
- this.tip_handler = new instance.web.Tip();
- }
- });
+ // resize
+ bus.on('resize', this, function() {
+ self.reposition();
+ });
- instance.web.form.FieldStatus = instance.web.form.FieldStatus.extend({
- render_value: function() {
- this._super();
- instance.webclient.tip_handler.reposition();
+ bus.on('please_reposition_tip', this, function () {
+ self.reposition();
+ });
+ } else {
+ def.reject();
+ }
+ return def;
+ },
+
+ scroll_to_tip: function(){
+ var self = this;
+ var scroll = _.find(self.$element.parentsUntil('body'), function(el) {
+ var overflow = $(el).css('overflow-y');
+ return (overflow === 'auto' || overflow === 'scroll');
+ });
+ if (scroll) {
+ $(scroll).scrollTo(self.$element);
+ }
+ },
+
+ end_tip: function(tip) {
+ var self = this;
+ var Tips = new Model('web.tip');
+ self.$element.popover('destroy');
+ self.$overlay.remove();
+ self.$helper.remove();
+ self.$element.removeClass('oe_tip_show_element');
+ _.each($('.oe_tip_fix_parent'), function(el) {
+ $(el).removeClass('oe_tip_fix_parent');
+ });
+ $(document).off('keyup.web_tip');
+ Tips.call('consume', [tip.id], {});
+ tip.is_consumed = true;
+ },
+
+ reposition: function() {
+ var self = this;
+ if (self.tip_mutex.def.state() === 'pending') {
+ self.scroll_to_tip();
+ self._set_helper_position();
+ self.$element.popover('show');
}
- });
-})();
+ },
+
+ _set_helper_position : function() {
+ var offset = this.$element.offset();
+ var _top = offset.top - 5;
+ var _left = offset.left - 5;
+ var _width = this.$element.outerWidth() + 10;
+ var _height = this.$element.outerHeight() + 10;
+ this.$helper.offset({top: _top , left: _left});
+ this.$helper.width(_width);
+ this.$helper.height(_height);
+ }
+});
+
+WebClient.include({
+ show_application: function() {
+ this._super();
+ this.tip_handler = new Tip();
+ }
+});
+
+var FieldStatus = core.form_widget_registry.get('statusbar');
+
+FieldStatus.include({
+ render_value: function() {
+ this._super();
+ this.trigger('please_reposition_tip');
+ }
+});
+
+});