diff --git a/addons/web_analytics/static/src/js/web_analytics.js b/addons/web_analytics/static/src/js/web_analytics.js index c8212f4d213..a81275d1b74 100644 --- a/addons/web_analytics/static/src/js/web_analytics.js +++ b/addons/web_analytics/static/src/js/web_analytics.js @@ -1,290 +1,296 @@ var _gaq = _gaq || []; // asynchronous stack used by google analytics -openerp.web_analytics = function(instance) { +odoo.define('web_analytics.web_analytics', ['web.ActionManager', 'web.core', 'web.CrashManager', 'web.FormView', 'web.Session', 'web.session', 'web.View', 'web.web_client', 'web.WebClient'], function (require) { +"use strict"; + +var ActionManager = require('web.ActionManager'); +var CrashManager = require('web.CrashManager'); +var core = require('web.core'); +var FormView = require('web.FormView'); +var Session = require('web.Session'); +var session = require('web.session'); +var View = require('web.View'); +var web_client = require('web.web_client'); +var WebClient = require('web.WebClient'); + +/* +* The Web Analytics Module inserts the Google Analytics JS Snippet +* at the top of the page, and sends to google an url each time the +* openerp url is changed. +* The pushes of the urls is made by triggering the 'state_pushed' event in the +* web_client.do_push_state() method which is responsible of changing the openerp current url +*/ + +// Google Analytics Code snippet +(function() { + var ga = document.createElement('script'); + ga.type = 'text/javascript'; + ga.async = true; + ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(ga,s); +})(); + +var Tracker = core.Class.extend({ + /* + * This method initializes the tracker + */ + init: function(webclient) { + var self = this; + self.initialized = $.Deferred(); + _gaq.push(['_setAccount', 'UA-7333765-1']); + _gaq.push(['_setDomainName', '.openerp.com']); // Allow multi-domain + self.initialize_custom(webclient).then(function() { + webclient.on('state_pushed', self, self.on_state_pushed); + self.include_tracker(); + }); + }, + /* + * This method MUST be overriden by saas_demo and saas_trial in order to + * set the correct user type. By default, the user connected is local to + * the DB (like in accounts). + */ + _get_user_type: function() { + return 'Local User'; + }, + /* + * This method gets the user access level, to be used as CV in GA + */ + _get_user_access_level: function() { + if (!session.session_is_valid()) { + return "Unauthenticated User"; + } + if (session.uid === 1) { + return 'Admin User'; + } + // Make the difference between portal users and anonymous users + if (session.username.indexOf('@') !== -1) { + return 'Portal User'; + } + if (session.username === 'anonymous') { + return 'Anonymous User'; + } + return 'Normal User'; + }, + + /* + * This method contains the initialization of all user-related custom variables + * stored in GA. Also other modules can override it to add new custom variables + * Must be followed by a call to _push_*() in order to actually send the data + * to GA. + */ + initialize_custom: function() { + var self = this; + session.rpc("/web/webclient/version_info", {}) + .done(function(res) { + _gaq.push(['_setCustomVar', 5, 'Version', res.server_version, 3]); + self._push_customvars(); + self.initialized.resolve(self); + }); + return self.initialized; + }, /* - * The Web Analytics Module inserts the Google Analytics JS Snippet - * at the top of the page, and sends to google an url each time the - * openerp url is changed. - * The pushes of the urls is made by triggering the 'state_pushed' event in the - * web_client.do_push_state() method which is responsible of changing the openerp current url + * Method called in order to send _setCustomVar to GA + */ + _push_customvars: function() { + var self = this; + // Track User Access Level, Custom Variable 4 in GA with visitor level scope + // Values: 'Admin User', 'Normal User', 'Portal User', 'Anonymous User' + _gaq.push(['_setCustomVar', 4, 'User Access Level', self._get_user_access_level(), 1]); + + // Track User Type Conversion, Custom Variable 3 in GA with session level scope + // Values: 'Visitor', 'Demo', 'Online Trial', 'Online Paying', 'Local User' + _gaq.push(['_setCustomVar', 1, 'User Type Conversion', self._get_user_type(), 2]); + }, + + /* + * Method called in order to send _trackPageview to GA */ - - // Google Analytics Code snippet - (function() { - var ga = document.createElement('script'); - ga.type = 'text/javascript'; - ga.async = true; - ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; - s.parentNode.insertBefore(ga,s); - })(); - - instance.web_analytics.Tracker = instance.web.Class.extend({ - /* - * This method initializes the tracker - */ - init: function(webclient) { - var self = this; - self.initialized = $.Deferred(); - _gaq.push(['_setAccount', 'UA-7333765-1']); - _gaq.push(['_setDomainName', '.openerp.com']); // Allow multi-domain - self.initialize_custom(webclient).then(function() { - webclient.on('state_pushed', self, self.on_state_pushed); - self.include_tracker(); + _push_pageview: function(url) { + _gaq.push(['_trackPageview', url]); + }, + /* + * Method called in order to send _trackEvent to GA + */ + _push_event: function(options) { + _gaq.push(['_trackEvent', + options.category, + options.action, + options.label, + options.value, + options.noninteraction + ]); + }, + /* + * Method called in order to send ecommerce transactions to GA + */ + _push_ecommerce: function(trans_data, item_list) { + _gaq.push(['_addTrans', + trans_data.order_id, + trans_data.store_name, + trans_data.total, + trans_data.tax, + trans_data.shipping, + trans_data.city, + trans_data.state, + trans_data.country, + ]); + _.each(item_list, function(item) { + _gaq.push(['_addItem', + item.order_id, + item.sku, + item.name, + item.category, + item.price, + item.quantity, + ]); + }); + _gaq.push(['_trackTrans']); + }, + /* + * This method contains the initialization of the object and view type + * as an event in GA. + */ + on_state_pushed: function(state) { + // Track only pages corresponding to a 'normal' view of OpenERP, views + // related to client actions are tracked by the action manager + if (state.model && state.view_type) { + // Track the page + var url = generateUrl({'model': state.model, 'view_type': state.view_type}); + this._push_event({ + 'category': state.model, + 'action': state.view_type, + 'label': url, }); - }, - /* - * This method MUST be overriden by saas_demo and saas_trial in order to - * set the correct user type. By default, the user connected is local to - * the DB (like in accounts). - */ - _get_user_type: function() { - return 'Local User'; - }, - /* - * This method gets the user access level, to be used as CV in GA - */ - _get_user_access_level: function() { - if (!instance.session.session_is_valid()) { - return "Unauthenticated User"; - } - if (instance.session.uid === 1) { - return 'Admin User'; - } - // Make the difference between portal users and anonymous users - if (instance.session.username.indexOf('@') !== -1) { - return 'Portal User'; - } - if (instance.session.username === 'anonymous') { - return 'Anonymous User'; - } - return 'Normal User'; - }, - - /* - * This method contains the initialization of all user-related custom variables - * stored in GA. Also other modules can override it to add new custom variables - * Must be followed by a call to _push_*() in order to actually send the data - * to GA. - */ - initialize_custom: function() { - var self = this; - instance.session.rpc("/web/webclient/version_info", {}) - .done(function(res) { - _gaq.push(['_setCustomVar', 5, 'Version', res.server_version, 3]); - self._push_customvars(); - self.initialized.resolve(self); + this._push_pageview(url); + } + }, + /* + * This method includes the tracker into views and managers. It can be overriden + * by other modules in order to extend tracking functionalities + */ + include_tracker: function() { + var t = this; + // Track the events related with the creation and the modification of records, + // the view type is always form + FormView.include({ + init: function(parent, dataset, view_id, options) { + this._super.apply(this, arguments); + var self = this; + this.on('record_created', self, function(r) { + var url = generateUrl({'model': self.model, 'view_type': 'form'}); + t._push_event({ + 'category': self.model, + 'action': 'create', + 'label': url, + 'noninteraction': true, + }); }); - return self.initialized; - }, + this.on('record_saved', self, function(r) { + var url = generateUrl({'model': self.model, 'view_type': 'form'}); + t._push_event({ + 'category': self.model, + 'action': 'save', + 'label': url, + 'noninteraction': true, + }); + }); + } + }); - /* - * Method called in order to send _setCustomVar to GA - */ - _push_customvars: function() { - var self = this; - // Track User Access Level, Custom Variable 4 in GA with visitor level scope - // Values: 'Admin User', 'Normal User', 'Portal User', 'Anonymous User' - _gaq.push(['_setCustomVar', 4, 'User Access Level', self._get_user_access_level(), 1]); - - // Track User Type Conversion, Custom Variable 3 in GA with session level scope - // Values: 'Visitor', 'Demo', 'Online Trial', 'Online Paying', 'Local User' - _gaq.push(['_setCustomVar', 1, 'User Type Conversion', self._get_user_type(), 2]); - }, - - /* - * Method called in order to send _trackPageview to GA - */ - _push_pageview: function(url) { - _gaq.push(['_trackPageview', url]); - }, - /* - * Method called in order to send _trackEvent to GA - */ - _push_event: function(options) { - _gaq.push(['_trackEvent', - options.category, - options.action, - options.label, - options.value, - options.noninteraction - ]); - }, - /* - * Method called in order to send ecommerce transactions to GA - */ - _push_ecommerce: function(trans_data, item_list) { - _gaq.push(['_addTrans', - trans_data.order_id, - trans_data.store_name, - trans_data.total, - trans_data.tax, - trans_data.shipping, - trans_data.city, - trans_data.state, - trans_data.country, - ]); - _.each(item_list, function(item) { - _gaq.push(['_addItem', - item.order_id, - item.sku, - item.name, - item.category, - item.price, - item.quantity, - ]); - }); - _gaq.push(['_trackTrans']); - }, - /* - * This method contains the initialization of the object and view type - * as an event in GA. - */ - on_state_pushed: function(state) { - // Track only pages corresponding to a 'normal' view of OpenERP, views - // related to client actions are tracked by the action manager - if (state.model && state.view_type) { - // Track the page - var url = instance.web_analytics.generateUrl({'model': state.model, 'view_type': state.view_type}); - this._push_event({ - 'category': state.model, - 'action': state.view_type, + // Track client actions + ActionManager.include({ + ir_actions_client: function (action, options) { + var url = generateUrl({'action': action.tag}); + t._push_event({ + 'category': action.type, + 'action': action.tag, 'label': url, }); - this._push_pageview(url); - } - }, - /* - * This method includes the tracker into views and managers. It can be overriden - * by other modules in order to extend tracking functionalities - */ - include_tracker: function() { - var t = this; - // Track the events related with the creation and the modification of records, - // the view type is always form - instance.web.FormView.include({ - init: function(parent, dataset, view_id, options) { - this._super.apply(this, arguments); - var self = this; - this.on('record_created', self, function(r) { - var url = instance.web_analytics.generateUrl({'model': self.model, 'view_type': 'form'}); - t._push_event({ - 'category': self.model, - 'action': 'create', - 'label': url, - 'noninteraction': true, - }); - }); - this.on('record_saved', self, function(r) { - var url = instance.web_analytics.generateUrl({'model': self.model, 'view_type': 'form'}); - t._push_event({ - 'category': self.model, - 'action': 'save', - 'label': url, - 'noninteraction': true, - }); - }); - } - }); - - // Track client actions - instance.web.ActionManager.include({ - ir_actions_client: function (action, options) { - var url = instance.web_analytics.generateUrl({'action': action.tag}); - t._push_event({ - 'category': action.type, - 'action': action.tag, - 'label': url, - }); - t._push_pageview(url); - return this._super.apply(this, arguments); - }, - }); - - // Track button events - instance.web.View.include({ - do_execute_action: function(action_data, dataset, record_id, on_closed) { - var category = this.model || dataset.model || ''; - var action; - if (action_data.name && _.isNaN(action_data.name-0)) { - action = action_data.name; - } else { - action = action_data.string || action_data.special || ''; - } - var url = instance.web_analytics.generateUrl({'model': category, 'view_type': this.view_type}); - t._push_event({ - 'category': category, - 'action': action, - 'label': url, - 'noninteraction': true, - }); - return this._super.apply(this, arguments); - }, - }); - - // Track error events - instance.web.CrashManager.include({ - show_error: function(error) { - var hash = window.location.hash; - var params = $.deparam(hash.substr(hash.indexOf('#')+1)); - var options = {}; - if (params.model && params.view_type) { - options = {'model': params.model, 'view_type': params.view_type}; - } else { - options = {'action': params.action}; - } - var url = instance.web_analytics.generateUrl(options); - t._push_event({ - 'category': options.model || "ir.actions.client", - 'action': "error " + (error.code ? error.message + error.data.message : error.type + error.data.debug), - 'label': url, - 'noninteraction': true, - }); - this._super.apply(this, arguments); - }, - }); - }, - }); - - // ---------------------------------------------------------------- - // utility functions - // ---------------------------------------------------------------- - - instance.web_analytics.generateUrl = function(options) { - var url = ''; - var keys = _.keys(options); - keys = _.sortBy(keys, function(i) { return i;}); - _.each(keys, function(key) { - url += '/' + key + '/' + options[key]; + t._push_pageview(url); + return this._super.apply(this, arguments); + }, }); - return url; - }; - // kept for API compatibility - instance.web_analytics.setupTracker = function(wc) { - return wc.tracker.initialized; - }; - - instance.web.Client.include({ - bind_events: function() { - this._super.apply(this, arguments); - this.tracker = new instance.web_analytics.Tracker(this); - }, - }); - - instance.web.Session.include({ - session_authenticate: function() { - return $.when(this._super.apply(this, arguments)).then(function() { - // the call to bind_events() may have been delayed in some embed - // cases, and when that happens we can skip the push, as the - // proper one will be done when bind_event is eventually called. - if (instance.client && instance.client.tracker) { - instance.client.tracker._push_customvars(); + // Track button events + View.include({ + do_execute_action: function(action_data, dataset, record_id, on_closed) { + var category = this.model || dataset.model || ''; + var action; + if (action_data.name && _.isNaN(action_data.name-0)) { + action = action_data.name; + } else { + action = action_data.string || action_data.special || ''; } - }); - }, + var url = generateUrl({'model': category, 'view_type': this.view_type}); + t._push_event({ + 'category': category, + 'action': action, + 'label': url, + 'noninteraction': true, + }); + return this._super.apply(this, arguments); + }, + }); + + // Track error events + CrashManager.include({ + show_error: function(error) { + var hash = window.location.hash; + var params = $.deparam(hash.substr(hash.indexOf('#')+1)); + var options = {}; + if (params.model && params.view_type) { + options = {'model': params.model, 'view_type': params.view_type}; + } else { + options = {'action': params.action}; + } + var url = generateUrl(options); + t._push_event({ + 'category': options.model || "ir.actions.client", + 'action': "error " + (error.code ? error.message + error.data.message : error.type + error.data.debug), + 'label': url, + 'noninteraction': true, + }); + this._super.apply(this, arguments); + }, + }); + }, +}); + +// ---------------------------------------------------------------- +// utility functions +// ---------------------------------------------------------------- + +var generateUrl = function(options) { + var url = ''; + var keys = _.keys(options); + keys = _.sortBy(keys, function(i) { return i;}); + _.each(keys, function(key) { + url += '/' + key + '/' + options[key]; }); - + return url; }; + +// kept for API compatibility +var setupTracker = function(wc) { + return wc.tracker.initialized; +}; + +WebClient.include({ + bind_events: function() { + this._super.apply(this, arguments); + this.tracker = new Tracker(this); + }, +}); + +Session.include({ + session_authenticate: function() { + return $.when(this._super.apply(this, arguments)).then(function() { + web_client.tracker._push_customvars(); + }); + }, +}); + +}); diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index 3ed3b450a57..4e543a2a0b2 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -1,13 +1,19 @@ +odoo.define('web_diagram.DiagramView', ['web.core', 'web.data', 'web.form_common', 'web.View'], function (require) { /*--------------------------------------------------------- * OpenERP diagram library *---------------------------------------------------------*/ +"use strict"; -openerp.web_diagram = function (instance) { -var QWeb = instance.web.qweb, - _t = instance.web._t, - _lt = instance.web._lt; -instance.web.views.add('diagram', 'instance.web.DiagramView'); -instance.web.DiagramView = instance.web.View.extend({ +var core = require('web.core'); +var data = require('web.data'); +var form_common = require('web.form_common'); +var View = require('web.View'); + +var _t = core._t; +var _lt = core._lt; +var QWeb = core.qweb; + +var DiagramView = View.extend({ display_name: _lt('Diagram'), view_type: 'diagram', searchable: false, @@ -54,9 +60,9 @@ instance.web.DiagramView = instance.web.View.extend({ this.$el.addClass(this.fields_view.arch.attrs['class']); _.each(self.labels,function(label){ - html_label = '

' + label.attrs.string + "

"; + var html_label = '

' + label.attrs.string + "

"; self.$el.find('.oe_diagram_header').append(html_label); - }) + }); this.init_pager(); @@ -90,16 +96,16 @@ instance.web.DiagramView = instance.web.View.extend({ _.each(this.nodes.children, function(child) { if(child.attrs.invisible == '1') - params['invisible_nodes'].push(child.attrs.name); + params.invisible_nodes.push(child.attrs.name); else { - params['visible_nodes'].push(child.attrs.name); - params['node_fields'].push(self.fields[child.attrs.name]['string']|| this.toTitleCase(child.attrs.name)); + params.visible_nodes.push(child.attrs.name); + params.node_fields.push(self.fields[child.attrs.name]['string']|| this.toTitleCase(child.attrs.name)); } }); _.each(this.connectors.children, function(conn) { - params['connectors_fields'].push(self.fields[conn.attrs.name]['string']|| this.toTitleCase(conn.attrs.name)); - params['connectors'].push(conn.attrs.name); + params.connectors_fields.push(self.fields[conn.attrs.name]['string']|| this.toTitleCase(conn.attrs.name)); + params.connectors.push(conn.attrs.name); }); this.rpc( '/web_diagram/diagram/get_diagram_info',params).done(function(result) { @@ -209,7 +215,7 @@ instance.web.DiagramView = instance.web.View.extend({ if(!confirm(_t("Deleting this node cannot be undone.\nIt will also delete all connected transitions.\n\nAre you sure ?"))){ return $.Deferred().reject().promise(); } - return new instance.web.DataSet(self,self.node).unlink([cutenode.id]); + return new data.DataSet(self,self.node).unlink([cutenode.id]); }; CuteEdge.double_click_callback = function(cuteedge){ self.edit_connector(cuteedge.id); @@ -227,7 +233,7 @@ instance.web.DiagramView = instance.web.View.extend({ if(!confirm(_t("Deleting this transition cannot be undone.\n\nAre you sure ?"))){ return $.Deferred().reject().promise(); } - return new instance.web.DataSet(self,self.connector).unlink([cuteedge.id]); + return new data.DataSet(self,self.connector).unlink([cuteedge.id]); }; }, @@ -236,7 +242,7 @@ instance.web.DiagramView = instance.web.View.extend({ edit_node: function(node_id){ var self = this; var title = _t('Activity'); - var pop = new instance.web.form.FormOpenPopup(self); + var pop = new form_common.FormOpenPopup(self); pop.show_element( self.node, @@ -270,7 +276,7 @@ instance.web.DiagramView = instance.web.View.extend({ add_node: function(){ var self = this; var title = _t('Activity'); - var pop = new instance.web.form.SelectCreatePopup(self); + var pop = new form_common.SelectCreatePopup(self); pop.select_element( self.node, { @@ -302,7 +308,7 @@ instance.web.DiagramView = instance.web.View.extend({ edit_connector: function(connector_id){ var self = this; var title = _t('Transition'); - var pop = new instance.web.form.FormOpenPopup(self); + var pop = new form_common.FormOpenPopup(self); pop.show_element( self.connector, parseInt(connector_id,10), //FIXME Isn't connector_id supposed to be an int ? @@ -321,7 +327,7 @@ instance.web.DiagramView = instance.web.View.extend({ add_connector: function(node_source_id, node_dest_id, dummy_cuteedge){ var self = this; var title = _t('Transition'); - var pop = new instance.web.form.SelectCreatePopup(self); + var pop = new form_common.SelectCreatePopup(self); pop.select_element( self.connector, @@ -420,4 +426,9 @@ instance.web.DiagramView = instance.web.View.extend({ return $.when(this._super(), this.execute_pager_action('reload')); } }); -}; + +core.view_registry.add('diagram', DiagramView); + +return DiagramView; + +}); diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 47692571f4c..ce9bce91258 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -1,18 +1,25 @@ +odoo.define('web_gantt.GanttView', ['web.core', 'web.form_common', 'web.formats', 'web.Model', 'web.time', 'web.View'], function (require) { +"use strict"; /*--------------------------------------------------------- - * OpenERP web_gantt + * Odoo web_gantt *---------------------------------------------------------*/ -openerp.web_gantt = function (instance) { -var _t = instance.web._t, - _lt = instance.web._lt; -var QWeb = instance.web.qweb; -instance.web.views.add('gantt', 'instance.web_gantt.GanttView'); -instance.web_gantt.GanttView = instance.web.View.extend({ +var core = require('web.core'); +var form_common = require('web.form_common'); +var formats = require('web.formats'); +var Model = require('web.Model'); +var time = require('web.time'); +var View = require('web.View'); + +var _lt = core._lt; +var QWeb = core.qweb; + + +var GanttView = View.extend({ display_name: _lt('Gantt'), template: "GanttView", view_type: "gantt", init: function() { - var self = this; this._super.apply(this, arguments); this.has_been_loaded = $.Deferred(); this.chart_id = _.uniqueId(); @@ -24,7 +31,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ var self = this; this.fields_view = fields_view_get; this.$el.addClass(this.fields_view.arch.attrs['class']); - return self.alive(new instance.web.Model(this.dataset.model) + return self.alive(new Model(this.dataset.model) .call('fields_get')).then(function (fields) { self.fields = fields; self.has_been_loaded.resolve(); @@ -81,7 +88,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ group_bys = [group_bys[0]]; } // if there is no group by, simulate it - if (group_bys.length == 0) { + if (group_bys.length === 0) { group_bys = ["_pseudo_group_by"]; _.each(tasks, function(el) { el._pseudo_group_by = "Gantt View"; @@ -107,7 +114,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ group.tasks = split_groups(group.tasks, _.rest(group_bys)); }); return groups; - } + }; var groups = split_groups(tasks, group_bys); // track ids of task items for context menu @@ -124,7 +131,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ var task_infos = _.compact(_.map(task.tasks, function(sub_task) { return generate_task_info(sub_task, level + 1); })); - if (task_infos.length == 0) + if (task_infos.length === 0) return; var task_start = _.reduce(_.pluck(task_infos, "task_start"), function(date, memo) { return memo === undefined || date < memo ? date : memo; @@ -133,8 +140,8 @@ instance.web_gantt.GanttView = instance.web.View.extend({ return memo === undefined || date > memo ? date : memo; }, undefined); var duration = (task_stop.getTime() - task_start.getTime()) / (1000 * 60 * 60); - var group_name = task.name ? instance.web.format_value(task.name, self.fields[group_bys[level]]) : "-"; - if (level == 0) { + var group_name = task.name ? formats.format_value(task.name, self.fields[group_bys[level]]) : "-"; + if (level === 0) { var group = new GanttProjectInfo(_.uniqueId("gantt_project_"), group_name, task_start); _.each(task_infos, function(el) { group.addTask(el.task_info); @@ -150,20 +157,20 @@ instance.web_gantt.GanttView = instance.web.View.extend({ } else { var task_name = task.__name; var duration_in_business_hours = false; - var task_start = instance.web.auto_str_to_date(task[self.fields_view.arch.attrs.date_start]); + var task_start = time.auto_str_to_date(task[self.fields_view.arch.attrs.date_start]); if (!task_start) return; var task_stop; if (self.fields_view.arch.attrs.date_stop) { - task_stop = instance.web.auto_str_to_date(task[self.fields_view.arch.attrs.date_stop]); + task_stop = time.auto_str_to_date(task[self.fields_view.arch.attrs.date_stop]); if (!task_stop) task_stop = task_start; } else { // we assume date_duration is defined - var tmp = instance.web.format_value(task[self.fields_view.arch.attrs.date_delay], + var tmp = formats.format_value(task[self.fields_view.arch.attrs.date_delay], self.fields[self.fields_view.arch.attrs.date_delay]); if (!tmp) return; - var m_task_start = moment(task_start).add(instance.web.parse_value(tmp, {type:"float"}), 'hours'); + var m_task_start = moment(task_start).add(formats.parse_value(tmp, {type:"float"}), 'hours'); task_stop = m_task_start.toDate(); } var duration = (task_stop.getTime() - task_start.getTime()) / (1000 * 60 * 60); @@ -176,7 +183,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ task_ids[id] = task_info; return {task_info: task_info, task_start: task_start, task_stop: task_stop}; } - } + }; var gantt = new GanttChart(); _.each(_.compact(_.map(groups, function(e) {return generate_task_info(e, 0);})), function(project) { gantt.addProject(project); @@ -220,10 +227,10 @@ instance.web_gantt.GanttView = instance.web.View.extend({ var end = moment(start).add(duration, 'hours').toDate(); var data = {}; data[self.fields_view.arch.attrs.date_start] = - instance.web.auto_date_to_str(start, self.fields[self.fields_view.arch.attrs.date_start].type); + time.auto_date_to_str(start, self.fields[self.fields_view.arch.attrs.date_start].type); if (self.fields_view.arch.attrs.date_stop) { data[self.fields_view.arch.attrs.date_stop] = - instance.web.auto_date_to_str(end, self.fields[self.fields_view.arch.attrs.date_stop].type); + time.auto_date_to_str(end, self.fields[self.fields_view.arch.attrs.date_stop].type); } else { // we assume date_duration is defined data[self.fields_view.arch.attrs.date_delay] = duration; } @@ -231,7 +238,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ }, on_task_display: function(task) { var self = this; - var pop = new instance.web.form.FormOpenPopup(self); + var pop = new form_common.FormOpenPopup(self); pop.on('write_completed',self,self.reload); pop.show_element( self.dataset.model, @@ -242,7 +249,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ }, on_task_create: function() { var self = this; - var pop = new instance.web.form.SelectCreatePopup(this); + var pop = new form_common.SelectCreatePopup(this); pop.on("elements_selected", self, function() { self.reload(); }); @@ -255,4 +262,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ }, }); -}; +core.view_registry.add('gantt', GanttView); + +return GanttView; +}); diff --git a/addons/web_kanban_gauge/static/src/js/kanban_gauge.js b/addons/web_kanban_gauge/static/src/js/kanban_gauge.js index 27c83f285e2..5af9f4adf08 100644 --- a/addons/web_kanban_gauge/static/src/js/kanban_gauge.js +++ b/addons/web_kanban_gauge/static/src/js/kanban_gauge.js @@ -1,4 +1,12 @@ -openerp.web_kanban_gauge = function (instance) { +odoo.define('web_kanban_gauge.widget', ['web.core', 'web_kanban.common'], function (require) { +"use strict"; + +var core = require('web.core'); +var kanban_common = require('web_kanban.common'); + +var AbstractField = kanban_common.AbstractField; +var fields_registry = kanban_common.registry; +var _t = core._t; /** * Kanban widgets: GaugeWidget @@ -17,10 +25,8 @@ openerp.web_kanban_gauge = function (instance) { * - on_click_label: optional label of the input displayed when clicking * */ -var _t = instance.web._t, - _lt = instance.web._lt; -instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ +var GaugeWidget = AbstractField.extend({ className: "oe_gauge", start: function() { @@ -131,7 +137,7 @@ instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ event.stopPropagation(); flag_open = false; }) - .blur(function (event) { + .blur(function () { if(!flag_open) { self.$el.find(".oe_justgage_edit").remove(); $svg.fadeTo(0, 1); @@ -156,6 +162,6 @@ instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ }, }); -instance.web_kanban.fields_registry.add("gauge", "instance.web_kanban.GaugeWidget"); +fields_registry.add("gauge", GaugeWidget); -} +}); diff --git a/addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js b/addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js index b8c7761d103..1c48fa3bb32 100644 --- a/addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js +++ b/addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js @@ -1,11 +1,17 @@ -openerp.web_kanban_sparkline = function (instance) { +odoo.define(['web_kanban.common'], function (require) { +"use strict"; + +var kanban_common = require('web_kanban.common'); + +var AbstractField = kanban_common.AbstractField; +var fields_registry = kanban_common.registry; /** * Kanban widgets: Sparkline * */ -instance.web_kanban.SparklineBarWidget = instance.web_kanban.AbstractField.extend({ +var SparklineBarWidget = AbstractField.extend({ className: "oe_sparkline_bar", start: function() { var self = this; @@ -15,10 +21,9 @@ instance.web_kanban.SparklineBarWidget = instance.web_kanban.AbstractField.exten var value = _.pluck(field_value, 'value'); var tooltips = _.pluck(field_value, 'tooltip'); var suffix = self.options.tooltip_suffix || ""; - var tooltipFormat = self.options.type == 'tristate' && '{{offset:offset}}' + suffix || '{{offset:offset}} {{value:value}}' + suffix + var tooltipFormat = self.options.type == 'tristate' && '{{offset:offset}}' + suffix || '{{offset:offset}} {{value:value}}' + suffix; var sparkline_options = _.extend({ type: 'bar', - barWidth: 5, height: '20px', barWidth: 4, barSpacing: 1, @@ -30,12 +35,12 @@ instance.web_kanban.SparklineBarWidget = instance.web_kanban.AbstractField.exten } }, self.options); self.$el.sparkline(value, sparkline_options); - self.$el.tooltip({delay: {show: self.options.delayIn || 0, hide: 0}, title: function(){return title}}); + self.$el.tooltip({delay: {show: self.options.delayIn || 0, hide: 0}, title: function(){return title;}}); }, 0); }, }); -instance.web_kanban.fields_registry.add("sparkline_bar", "instance.web_kanban.SparklineBarWidget"); +fields_registry.add("sparkline_bar", SparklineBarWidget); -} +}); diff --git a/addons/web_linkedin/static/src/js/linkedin.js b/addons/web_linkedin/static/src/js/linkedin.js index 5253d731635..80425afff29 100644 --- a/addons/web_linkedin/static/src/js/linkedin.js +++ b/addons/web_linkedin/static/src/js/linkedin.js @@ -1,527 +1,537 @@ +odoo.define('web_linkedin.web_linkedin', ['web.core', 'web.data', 'web.Dialog', 'web.form_widgets', 'web.Model', 'web.utils', 'web.Widget'], function (require) { +"use strict"; + +var core = require('web.core'); +var data = require('web.data'); +var Dialog = require('web.Dialog'); +var form_widgets = require('web.form_widgets'); +var Model = require('web.Model'); +var utils = require('web.utils'); +var Widget = require('web.Widget'); + /*--------------------------------------------------------- * OpenERP web_linkedin (module) *---------------------------------------------------------*/ -openerp.web_linkedin = function(instance) { - var QWeb = instance.web.qweb; - var _t = instance.web._t; - - /* - * instance.web_linkedin.tester.test_authentication() - * Call check if the Linkedin session is open or open a connection popup - * return a deferrer : - * - resolve if the authentication is true - * - reject if the authentication is wrong or when the user logout - */ - instance.web_linkedin.LinkedinTester = instance.web.Class.extend({ - init: function() { - this.linkedin_added = false; - this.linkedin_def = $.Deferred(); - this.auth_def = $.Deferred(); - }, - error_catcher: function (callback) { - var self = this; - if (!this.realError) { - this.realError = Error; - this.window_onerror = window.onerror; - } - if (!callback) { - Error = self.realError; - return false; - } - this.callback = callback; - window.onerror = function(message, fileName, lineNumber) { - if (!window.onerror.prototype.catched) { - self.window_onerror(message, fileName, lineNumber); - } - if (self.realError != Error) { - window.onerror.prototype.catched = false; - } else { - window.onerror = self.window_onerror; - } - }; - window.onerror.prototype.catched = false; - Error = function (message, fileName, lineNumber) { - this.name = message; - this.message = message; - this.fileName = fileName; - this.lineNumber = lineNumber; - this.caller = Error.caller.toString(); - window.onerror.prototype.catched = self.callback.apply(self, [this]); - return this; - }; - Error.prototype.toString = function () {return this.name;}; - }, - linkedin_disabled: function(error) { - this.linkedin_def.reject(); - this.auth_def.reject(); - IN = false; - var dialog = new instance.web.Dialog(this, { - title: _t("LinkedIn is not enabled"), - buttons: [ - {text: _t("Ok"), click: function() { this.parents('.modal').modal('hide'); }} - ], - }, QWeb.render('LinkedIn.DisabledWarning', {error: error})).open(); - }, - test_linkedin: function() { - var self = this; - return this.test_api_key().then(function() { - if (self.linkedin_added) { - return self.linkedin_def; - } - self.$linkedin = $(''); +var QWeb = core.qweb; +var _t = core._t; - self.error_catcher(function (error) { - if (!!error.caller.match(/API Key is invalid/)) { - self.linkedin_disabled(error); - self.$linkedin.remove(); - console.debug("LinkedIn JavaScript removed."); - self.linkedin_added = false; - self.error_catcher(false); - return true; - } else { - return false; - } - }); - window.setTimeout(function () {self.error_catcher(false);}, 5000); - - $("body").append(self.$linkedin); - var tag = document.createElement('script'); - tag.type = 'text/javascript'; - tag.src = "https://platform.linkedin.com/in.js"; - tag.innerHTML = 'api_key : ' + self.api_key + '\nauthorize : true\nscope: r_network r_basicprofile'; // r_contactinfo r_fullprofile r_emailaddress'; - - document.getElementsByTagName('head')[0].appendChild(tag); - self.linkedin_added = true; - $(tag).load(function(event) { - console.debug("LinkedIn JavaScript inserted."); - IN.Event.on(IN, "frameworkLoaded", function() { - self.error_catcher(false); - console.debug("LinkedIn DOM node inserted and frameworkLoaded."); - }); - IN.Event.on(IN, "systemReady", function() { - self.linkedin_def.resolve(); - console.debug("LinkedIn systemReady."); - }); - IN.Event.on(IN, "auth", function() { - self.auth_def.resolve(); - }); - IN.Event.on(IN, "logout", function() { - self.auth_def.reject(); - self.auth_def = $.Deferred(); - }); - }); - return self.linkedin_def.promise(); - }); - }, - test_api_key: function() { - var self = this; - if (this.api_key) { - return $.when(); +/* +* instance.web_linkedin.tester.test_authentication() +* Call check if the Linkedin session is open or open a connection popup +* return a deferrer : +* - resolve if the authentication is true +* - reject if the authentication is wrong or when the user logout +*/ +var LinkedinTester = core.Class.extend({ + init: function() { + this.linkedin_added = false; + this.linkedin_def = $.Deferred(); + this.auth_def = $.Deferred(); + }, + error_catcher: function (callback) { + var self = this; + if (!this.realError) { + this.realError = Error; + this.window_onerror = window.onerror; + } + if (!callback) { + Error = self.realError; + return false; + } + this.callback = callback; + window.onerror = function(message, fileName, lineNumber) { + if (!window.onerror.prototype.catched) { + self.window_onerror(message, fileName, lineNumber); } - return new instance.web.Model("ir.config_parameter").call("get_param", ["web.linkedin.apikey"]).then(function(a) { - if (!!a) { - self.api_key = a; + if (self.realError != Error) { + window.onerror.prototype.catched = false; + } else { + window.onerror = self.window_onerror; + } + }; + window.onerror.prototype.catched = false; + Error = function (message, fileName, lineNumber) { + this.name = message; + this.message = message; + this.fileName = fileName; + this.lineNumber = lineNumber; + this.caller = Error.caller.toString(); + window.onerror.prototype.catched = self.callback.apply(self, [this]); + return this; + }; + Error.prototype.toString = function () {return this.name;}; + }, + linkedin_disabled: function(error) { + this.linkedin_def.reject(); + this.auth_def.reject(); + IN = false; + new Dialog(this, { + title: _t("LinkedIn is not enabled"), + buttons: [ + {text: _t("Ok"), click: function() { this.parents('.modal').modal('hide'); }} + ], + }, QWeb.render('LinkedIn.DisabledWarning', {error: error})).open(); + }, + test_linkedin: function() { + var self = this; + return this.test_api_key().then(function() { + if (self.linkedin_added) { + return self.linkedin_def; + } + self.$linkedin = $(''); + + self.error_catcher(function (error) { + if (!!error.caller.match(/API Key is invalid/)) { + self.linkedin_disabled(error); + self.$linkedin.remove(); + console.debug("LinkedIn JavaScript removed."); + self.linkedin_added = false; + self.error_catcher(false); return true; } else { - return $.Deferred().reject(); + return false; } }); - }, - test_authentication: function() { - var self = this; - this.linkedin_def.done(function () { - if (IN.User.isAuthorized()) { + window.setTimeout(function () {self.error_catcher(false);}, 5000); + + $("body").append(self.$linkedin); + var tag = document.createElement('script'); + tag.type = 'text/javascript'; + tag.src = "https://platform.linkedin.com/in.js"; + tag.innerHTML = 'api_key : ' + self.api_key + '\nauthorize : true\nscope: r_network r_basicprofile'; // r_contactinfo r_fullprofile r_emailaddress'; + + document.getElementsByTagName('head')[0].appendChild(tag); + self.linkedin_added = true; + $(tag).load(function(event) { + console.debug("LinkedIn JavaScript inserted."); + IN.Event.on(IN, "frameworkLoaded", function() { + self.error_catcher(false); + console.debug("LinkedIn DOM node inserted and frameworkLoaded."); + }); + IN.Event.on(IN, "systemReady", function() { + self.linkedin_def.resolve(); + console.debug("LinkedIn systemReady."); + }); + IN.Event.on(IN, "auth", function() { self.auth_def.resolve(); - } else { - IN.User.authorize(); - } + }); + IN.Event.on(IN, "logout", function() { + self.auth_def.reject(); + self.auth_def = $.Deferred(); + }); }); - return this.auth_def.promise(); - }, - }); - - instance.web_linkedin.tester = new instance.web_linkedin.LinkedinTester(); - - instance.web_linkedin.Linkedin = instance.web.form.FieldChar.extend({ - init: function() { - this._super.apply(this, arguments); - this.display_dm = new instance.web.DropMisordered(true); - }, - initialize_content: function() { - var $ht = $(QWeb.render("FieldChar.linkedin")); - var $in = this.$("input"); - $in.replaceWith($ht); - this.$(".oe_linkedin_input").append($in); - this.$(".oe_linkedin_img").click(_.bind(this.search_linkedin, this)); - this._super(); - }, - search_linkedin: function() { - var self = this; - if (!this.open_in_process) { - this.open_in_process = true; - this.display_dm.add(instance.web_linkedin.tester.test_linkedin()).done(function() { - self.open_in_process = false; - var text = (self.get("value") || "").replace(/^\s+|\s+$/g, "").replace(/\s+/g, " "); - instance.web_linkedin.tester.test_authentication().done(function() { - var pop = new instance.web_linkedin.LinkedinSearchPopup(self, text); - pop.open(); - pop.on("selected", this, function(entity) { - self.selected_entity(entity); - }); + return self.linkedin_def.promise(); + }); + }, + test_api_key: function() { + var self = this; + if (this.api_key) { + return $.when(); + } + return new Model("ir.config_parameter").call("get_param", ["web.linkedin.apikey"]).then(function(a) { + if (!!a) { + self.api_key = a; + return true; + } else { + return $.Deferred().reject(); + } + }); + }, + test_authentication: function() { + var self = this; + this.linkedin_def.done(function () { + if (IN.User.isAuthorized()) { + self.auth_def.resolve(); + } else { + IN.User.authorize(); + } + }); + return this.auth_def.promise(); + }, +}); + +var tester = new LinkedinTester(); + +var Linkedin = form_widgets.FieldChar.extend({ + init: function() { + this._super.apply(this, arguments); + this.display_dm = new utils.DropMisordered(true); + }, + initialize_content: function() { + var $ht = $(QWeb.render("FieldChar.linkedin")); + var $in = this.$("input"); + $in.replaceWith($ht); + this.$(".oe_linkedin_input").append($in); + this.$(".oe_linkedin_img").click(_.bind(this.search_linkedin, this)); + this._super(); + }, + search_linkedin: function() { + var self = this; + if (!this.open_in_process) { + this.open_in_process = true; + this.display_dm.add(tester.test_linkedin()).done(function() { + self.open_in_process = false; + var text = (self.get("value") || "").replace(/^\s+|\s+$/g, "").replace(/\s+/g, " "); + tester.test_authentication().done(function() { + var pop = new LinkedinSearchPopup(self, text); + pop.open(); + pop.on("selected", this, function(entity) { + self.selected_entity(entity); }); }); - } - }, - selected_entity: function(entity) { - var self = this; - this.create_on_change(entity).done(function(to_change) { - var values = self.view.get_fields_values(); - _.each(to_change, function (value, key) { - if (!/linkedin/.test(key) && !!values[key]) { - if(!_.isArray(values[key])) { - delete to_change[key]; - } + }); + } + }, + selected_entity: function(entity) { + var self = this; + this.create_on_change(entity).done(function(to_change) { + var values = self.view.get_fields_values(); + _.each(to_change, function (value, key) { + if (!/linkedin/.test(key) && !!values[key]) { + if(!_.isArray(values[key])) { + delete to_change[key]; } - }) - self.view.set_values(to_change); + } }); - }, - create_on_change: function(entity) { - return entity.__type === "company" ? this.create_or_modify_company(entity) : this.create_or_modify_partner(entity); - }, - create_or_modify_company: function (entity) { - var self = this; - var to_change = {}; - var image_def = null; - to_change.is_company = true; - to_change.name = entity.name; - to_change.image = false; - if (entity.logoUrl) { - image_def = self.rpc('/web_linkedin/binary/url2binary', - {'url': entity.logoUrl}).then(function(data){ - to_change.image = data; - }); - } - to_change.website = entity.websiteUrl; - to_change.phone = false; - _.each((entity.locations || {}).values || [], function(el) { - to_change.phone = el.contactInfo.phone1; + self.view.set_values(to_change); + }); + }, + create_on_change: function(entity) { + return entity.__type === "company" ? this.create_or_modify_company(entity) : this.create_or_modify_partner(entity); + }, + create_or_modify_company: function (entity) { + var self = this; + var to_change = {}; + var image_def = null; + to_change.is_company = true; + to_change.name = entity.name; + to_change.image = false; + if (entity.logoUrl) { + image_def = self.rpc('/web_linkedin/binary/url2binary', + {'url': entity.logoUrl}).then(function(data){ + to_change.image = data; }); - to_change.linkedin_url = _.str.sprintf("http://www.linkedin.com/company/%d", entity.id); + } + to_change.website = entity.websiteUrl; + to_change.phone = false; + _.each((entity.locations || {}).values || [], function(el) { + to_change.phone = el.contactInfo.phone1; + }); + to_change.linkedin_url = _.str.sprintf("http://www.linkedin.com/company/%d", entity.id); + _.each(to_change, function (val, key) { + if (self.field_manager.datarecord[key]) { + to_change[key] = self.field_manager.datarecord[key]; + } + }); + + to_change.child_ids = []; + var children_def = $.Deferred(); + IN.API.PeopleSearch().fields(commonPeopleFields).params({ + "company-name" : entity.universalName, + "current-company": true, + "count": 50, + }).result(function (result) { + console.debug("Linkedin pepople in this company found :", result.numResults, "=>", result.people._count, result.people.values); + var result = _.reject(result.people.values || [], function(el) { + return ! el.formattedName; + }); + self.create_or_modify_company_partner(result).then(function (childs_to_change) { + _.each(childs_to_change, function (data) { + // [0,0,data] if it's a new partner + to_change.child_ids.push( data.id ? [1, data.id, data] : [0, 0, data] ); + }); + children_def.resolve(); + }); + }).error(function () { + children_def.reject(); + }); + + return $.when(image_def, children_def).then(function () { + return to_change; + }); + }, + create_or_modify_partner: function (entity, rpc_search_similar_partner) { + var self = this; + return this.create_or_modify_partner_change(entity).then(function (to_change) { + // find similar partners _.each(to_change, function (val, key) { if (self.field_manager.datarecord[key]) { to_change[key] = self.field_manager.datarecord[key]; } }); - - to_change.child_ids = []; - var children_def = $.Deferred(); - IN.API.PeopleSearch().fields(commonPeopleFields).params({ - "company-name" : entity.universalName, - "current-company": true, - "count": 50, - }).result(function (result) { - console.debug("Linkedin pepople in this company found :", result.numResults, "=>", result.people._count, result.people.values); - var result = _.reject(result.people.values || [], function(el) { - return ! el.formattedName; - }); - self.create_or_modify_company_partner(result).then(function (childs_to_change) { - _.each(childs_to_change, function (data) { - // [0,0,data] if it's a new partner - to_change.child_ids.push( data.id ? [1, data.id, data] : [0, 0, data] ); - }); - children_def.resolve(); - }); - }).error(function () { - children_def.reject(); - }); - - return $.when(image_def, children_def).then(function () { - return to_change; - }); - }, - create_or_modify_partner: function (entity, rpc_search_similar_partner) { - var self = this; - return this.create_or_modify_partner_change(entity).then(function (to_change) { - // find similar partners - _.each(to_change, function (val, key) { - if (self.field_manager.datarecord[key]) { - to_change[key] = self.field_manager.datarecord[key]; - } - }); - }); - }, - create_or_modify_partner_change: function (entity) { - var to_change = {}; - var defs = []; - to_change.is_company = false; - to_change.name = entity.formattedName; - if (entity.pictureUrl) { - defs.push(this.rpc('/web_linkedin/binary/url2binary', - {'url': entity.pictureUrl}).then(function(data){ - to_change.image = data; - })); - } - _.each((entity.phoneNumbers || {}).values || [], function(el) { - if (el.phoneType === "mobile") { - to_change.mobile = el.phoneNumber; - } else { - to_change.phone = el.phoneNumber; - } - }); - var positions = (entity.positions || {}).values || []; - for (key in positions) { - var position = positions[key]; - if (position.isCurrent) { - var company_name = position.company ? position.company.name : false; - if (!entity.parent_id && entity.parent_id !== 0 && company_name) { - defs.push(new instance.web.DataSetSearch(this, 'res.partner').call("search", [[["name", "=", company_name]]]).then(function (data) { - if(data[0]) to_change.parent_id = data[0]; - else position.title = position.title + ' (' + company_name + ') '; - to_change.function = position.title; - })); - } else if (!entity.__company || !company_name || company_name == entity.__company) { - to_change.function = position.title + (company_name ? ' (' + company_name + ') ':''); - } - break; - } - }; - - if (entity.parent_id) { - to_change.parent_id = entity.parent_id; - } - to_change.linkedin_url = to_change.linkedin_public_url = entity.publicProfileUrl || false; - to_change.linkedin_id = entity.id || false; - - return $.when.apply($, defs).then(function () { - return to_change; - }); - }, - create_or_modify_company_partner: function (entities) { - var self = this; - var deferrer = $.Deferred(); - var defs = []; - var childs_to_change = []; - - _.each(entities, function (entity, key) { - var entity = _.extend(entity, { - '__type': "people", - '__company': entity.universalName, - 'parent_id': self.field_manager.datarecord.id || 0 - }); - defs.push(self.create_or_modify_partner_change(entity).then(function (to_change) { - childs_to_change[key] = to_change; - })); - }); - $.when.apply($, defs).then(function () { - new instance.web.DataSetSearch(this, 'res.partner').call("linkedin_check_similar_partner", [entities]).then(function (partners) { - _.each(partners, function (partner, i) { - _.each(partner, function (val, key) { - if (val) { - childs_to_change[i][key] = val; - } - }); - }); - deferrer.resolve(childs_to_change); - }); - }); - return deferrer; + }); + }, + create_or_modify_partner_change: function (entity) { + var to_change = {}; + var defs = []; + to_change.is_company = false; + to_change.name = entity.formattedName; + if (entity.pictureUrl) { + defs.push(this.rpc('/web_linkedin/binary/url2binary', + {'url': entity.pictureUrl}).then(function(data){ + to_change.image = data; + })); } - }); - instance.web.form.widgets.add('linkedin', 'instance.web_linkedin.Linkedin'); - - instance.web_linkedin.Linkedin_url = instance.web.form.FieldChar.extend({ - initialize_content: function() { - this.$("input,span").replaceWith($(QWeb.render("FieldChar.linkedin_url"))); - this._super(); - }, - render_value: function() { - this._super(); - this.$(".oe_linkedin_url").attr("href", this.field_manager.datarecord.linkedin_url || "#").toggle(!!this.field_manager.datarecord.linkedin_url); - }, - }); - instance.web.form.widgets.add('linkedin_url', 'instance.web_linkedin.Linkedin_url'); - - - var commonPeopleFields = ["id", "picture-url", "public-profile-url", "first-name", "last-name", - "formatted-name", "location", "phone-numbers", "im-accounts", - "main-address", "headline", "positions", "summary", "specialties"]; - - instance.web_linkedin.LinkedinSearchPopup = instance.web.Dialog.extend({ - template: "Linkedin.popup", - init: function(parent, search) { - var self = this; - if (!IN.User.isAuthorized()) { - this.$buttons = $("
"); - this.destroy(); + _.each((entity.phoneNumbers || {}).values || [], function(el) { + if (el.phoneType === "mobile") { + to_change.mobile = el.phoneNumber; + } else { + to_change.phone = el.phoneNumber; } - this._super(parent, { 'title': QWeb.render('LinkedIn.AdvancedSearch', {'title': _t("LinkedIn search")}) }); - this.search = search; - this.limit = 5; - }, - start: function() { - this._super(); - this.bind_event(); - this.display_account(); - this.do_search(); - }, - bind_event: function() { - var self = this; - this.$el.parents('.modal').on("click", ".oe_linkedin_logout", function () { - IN.User.logout(); + }); + var positions = (entity.positions || {}).values || []; + for (var key in positions) { + var position = positions[key]; + if (position.isCurrent) { + var company_name = position.company ? position.company.name : false; + if (!entity.parent_id && entity.parent_id !== 0 && company_name) { + defs.push(new data.DataSetSearch(this, 'res.partner').call("search", [[["name", "=", company_name]]]).then(function (data) { + if(data[0]) to_change.parent_id = data[0]; + else position.title = position.title + ' (' + company_name + ') '; + to_change.function = position.title; + })); + } else if (!entity.__company || !company_name || company_name == entity.__company) { + to_change.function = position.title + (company_name ? ' (' + company_name + ') ':''); + } + break; + } + } + + if (entity.parent_id) { + to_change.parent_id = entity.parent_id; + } + to_change.linkedin_url = to_change.linkedin_public_url = entity.publicProfileUrl || false; + to_change.linkedin_id = entity.id || false; + + return $.when.apply($, defs).then(function () { + return to_change; + }); + }, + create_or_modify_company_partner: function (entities) { + var self = this; + var deferrer = $.Deferred(); + var defs = []; + var childs_to_change = []; + + _.each(entities, function (entity, key) { + var entity = _.extend(entity, { + '__type': "people", + '__company': entity.universalName, + 'parent_id': self.field_manager.datarecord.id || 0 + }); + defs.push(self.create_or_modify_partner_change(entity).then(function (to_change) { + childs_to_change[key] = to_change; + })); + }); + $.when.apply($, defs).then(function () { + new data.DataSetSearch(this, 'res.partner').call("linkedin_check_similar_partner", [entities]).then(function (partners) { + _.each(partners, function (partner, i) { + _.each(partner, function (val, key) { + if (val) { + childs_to_change[i][key] = val; + } + }); + }); + deferrer.resolve(childs_to_change); + }); + }); + return deferrer; + } +}); +core.form_widget_registry.add('linkedin', Linkedin); + +var Linkedin_url = form_widgets.FieldChar.extend({ + initialize_content: function() { + this.$("input,span").replaceWith($(QWeb.render("FieldChar.linkedin_url"))); + this._super(); + }, + render_value: function() { + this._super(); + this.$(".oe_linkedin_url").attr("href", this.field_manager.datarecord.linkedin_url || "#").toggle(!!this.field_manager.datarecord.linkedin_url); + }, +}); +core.form_widget_registry.add('linkedin_url', Linkedin_url); + + +var commonPeopleFields = ["id", "picture-url", "public-profile-url", "first-name", "last-name", + "formatted-name", "location", "phone-numbers", "im-accounts", + "main-address", "headline", "positions", "summary", "specialties"]; + +var LinkedinSearchPopup = Dialog.extend({ + template: "Linkedin.popup", + init: function(parent, search) { + if (!IN.User.isAuthorized()) { + this.$buttons = $("
"); + this.destroy(); + } + this._super(parent, { 'title': QWeb.render('LinkedIn.AdvancedSearch', {'title': _t("LinkedIn search")}) }); + this.search = search; + this.limit = 5; + }, + start: function() { + this._super(); + this.bind_event(); + this.display_account(); + this.do_search(); + }, + bind_event: function() { + var self = this; + this.$el.parents('.modal').on("click", ".oe_linkedin_logout", function () { + IN.User.logout(); + self.destroy(); + }); + this.$search = this.$el.parents('.modal').find(".oe_linkedin_advanced_search" ); + this.$url = this.$search.find("input[name='search']" ); + this.$button = this.$search.find("button"); + + this.$button.on("click", function (e) { + e.stopPropagation(); + self.do_search(self.$url.val() || ''); + }); + this.$url + .on("click mousedown mouseup", function (e) { + e.stopPropagation(); + }).on("keydown", function (e) { + if(e.keyCode == 13) { + $(e.target).blur(); + self.$button.click(); + } + }); + }, + display_account: function() { + var self = this; + IN.API.Profile("me") + .fields(["firstName", "lastName"]) + .result(function (result) { + $(QWeb.render('LinkedIn.loginInformation', result.values[0])).appendTo(self.$el.parents('.modal').find(".oe_dialog_custom_buttons")); + }); + }, + do_search: function(url) { + if (!IN.User || !IN.User.isAuthorized()) { + this.destroy(); + } + var self = this; + var deferrers = []; + this.$(".oe_linkedin_pop_c, .oe_linkedin_pop_p").empty(); + + if (url && url.length) { + var deferrer_c = $.Deferred(); + var deferrer_p = $.Deferred(); + deferrers.push(deferrer_c, deferrer_p); + + var url = url.replace(/\/+$/, ''); + var uid = url.replace(/(.*linkedin\.com\/[a-z]+\/)|(^.*\/company\/)|(\&.*$)/gi, ''); + + IN.API.Raw(_.str.sprintf( + "companies/universal-name=%s:(id,name,logo-url,description,industry,website-url,locations,universal-name)", + encodeURIComponent(uid.toLowerCase()))).result(function (result) { + self.do_result_companies({'companies': {'values': [result]}}); + deferrer_c.resolve(); + }).error(function () { + self.do_result_companies({}); + deferrer_c.resolve(); + }); + + var url_public = "http://www.linkedin.com/pub/"+uid; + IN.API.Profile("url="+ encodeURI(url_public).replace(/%2F/g, '/')) + .fields(commonPeopleFields) + .result(function(result) { + self.do_result_people({'people': result}); + deferrer_p.resolve(); + }).error(function (error) { + self.do_warn( _t("LinkedIn error"), _t("LinkedIn is temporary down for the searches by url.")); + self.do_result_people({}); + deferrer_p.resolve(); + }); + + this.search = url; + } + + var deferrer_c_k = $.Deferred(); + var deferrer_p_k = $.Deferred(); + deferrers.push(deferrer_c_k, deferrer_p_k); + IN.API.Raw(_.str.sprintf( + "company-search:(companies:" + + "(id,name,logo-url,description,industry,website-url,locations,universal-name))?keywords=%s&count=%d", + encodeURI(this.search), this.limit)).result(function (result) { + self.do_result_companies(result); + deferrer_c_k.resolve(); + }); + IN.API.PeopleSearch().fields(commonPeopleFields).params({"keywords": this.search, "count": this.limit}).result(function(result) { + self.do_result_people(result); + deferrer_p_k.resolve(); + }); + + return $.when.apply($, deferrers); + }, + do_result_companies: function(companies) { + var lst = (companies.companies || {}).values || []; + lst = _.first(lst, this.limit); + lst = _.map(lst, function(el) { + el.__type = "company"; + return el; + }); + console.debug("Linkedin companies found:", (companies.companies || {})._total, '=>', lst.length, lst); + return this.display_result(lst, this.$(".oe_linkedin_pop_c")); + }, + do_result_people: function(people) { + var plst = (people.people || {}).values || []; + plst = _.first(plst, this.limit); + plst = _.map(plst, function(el) { + el.__type = "people"; + return el; + }); + console.debug("Linkedin people found:", people.numResults, '=>', plst.length, plst); + return this.display_result(plst, this.$(".oe_linkedin_pop_p")); + }, + display_result: function(result, $elem) { + var self = this; + var $row; + $elem.find(".oe_no_result").remove(); + _.each(result, function(el) { + var pc = new EntityWidget(self, el); + if (!$elem.find("div").size() || $elem.find(" > div:last > div").size() >= 5) { + $row = $("
"); + $row.appendTo($elem); + } + pc.appendTo($row); + pc.$el.css("display", "table-cell"); + pc.$el.css("width", "20%"); + pc.on("selected", self, function(data) { + self.trigger("selected", data); self.destroy(); }); - this.$search = this.$el.parents('.modal').find(".oe_linkedin_advanced_search" ); - this.$url = this.$search.find("input[name='search']" ); - this.$button = this.$search.find("button"); - - this.$button.on("click", function (e) { - e.stopPropagation(); - self.do_search(self.$url.val() || ''); - }); - this.$url - .on("click mousedown mouseup", function (e) { - e.stopPropagation(); - }).on("keydown", function (e) { - if(e.keyCode == 13) { - $(e.target).blur(); - self.$button.click(); - } - }); - }, - display_account: function() { - var self = this; - IN.API.Profile("me") - .fields(["firstName", "lastName"]) - .result(function (result) { - $(QWeb.render('LinkedIn.loginInformation', result.values[0])).appendTo(self.$el.parents('.modal').find(".oe_dialog_custom_buttons")); - }) - }, - do_search: function(url) { - if (!IN.User || !IN.User.isAuthorized()) { - this.destroy(); - } - var self = this; - var deferrers = []; - this.$(".oe_linkedin_pop_c, .oe_linkedin_pop_p").empty(); - - if (url && url.length) { - var deferrer_c = $.Deferred(); - var deferrer_p = $.Deferred(); - deferrers.push(deferrer_c, deferrer_p); - - var url = url.replace(/\/+$/, ''); - var uid = url.replace(/(.*linkedin\.com\/[a-z]+\/)|(^.*\/company\/)|(\&.*$)/gi, ''); - - IN.API.Raw(_.str.sprintf( - "companies/universal-name=%s:(id,name,logo-url,description,industry,website-url,locations,universal-name)", - encodeURIComponent(uid.toLowerCase()))).result(function (result) { - self.do_result_companies({'companies': {'values': [result]}}); - deferrer_c.resolve(); - }).error(function (error) { - self.do_result_companies({}); - deferrer_c.resolve(); - }); - - var url_public = "http://www.linkedin.com/pub/"+uid; - IN.API.Profile("url="+ encodeURI(url_public).replace(/%2F/g, '/')) - .fields(commonPeopleFields) - .result(function(result) { - self.do_result_people({'people': result}); - deferrer_p.resolve(); - }).error(function (error) { - self.do_warn( _t("LinkedIn error"), _t("LinkedIn is temporary down for the searches by url.")); - self.do_result_people({}); - deferrer_p.resolve(); - }); - - this.search = url; - } - - var deferrer_c_k = $.Deferred(); - var deferrer_p_k = $.Deferred(); - deferrers.push(deferrer_c_k, deferrer_p_k); - IN.API.Raw(_.str.sprintf( - "company-search:(companies:" + - "(id,name,logo-url,description,industry,website-url,locations,universal-name))?keywords=%s&count=%d", - encodeURI(this.search), this.limit)).result(function (result) { - self.do_result_companies(result); - deferrer_c_k.resolve(); - }); - IN.API.PeopleSearch().fields(commonPeopleFields).params({"keywords": this.search, "count": this.limit}).result(function(result) { - self.do_result_people(result); - deferrer_p_k.resolve(); - }); - - return $.when.apply($, deferrers); - }, - do_result_companies: function(companies) { - var lst = (companies.companies || {}).values || []; - lst = _.first(lst, this.limit); - lst = _.map(lst, function(el) { - el.__type = "company"; - return el; - }); - console.debug("Linkedin companies found:", (companies.companies || {})._total, '=>', lst.length, lst); - return this.display_result(lst, this.$(".oe_linkedin_pop_c")); - }, - do_result_people: function(people) { - var plst = (people.people || {}).values || []; - plst = _.first(plst, this.limit); - plst = _.map(plst, function(el) { - el.__type = "people"; - return el; - }); - console.debug("Linkedin people found:", people.numResults, '=>', plst.length, plst); - return this.display_result(plst, this.$(".oe_linkedin_pop_p")); - }, - display_result: function(result, $elem) { - var self = this; - var $row; - $elem.find(".oe_no_result").remove(); - _.each(result, function(el) { - var pc = new instance.web_linkedin.EntityWidget(self, el); - if (!$elem.find("div").size() || $elem.find(" > div:last > div").size() >= 5) { - $row = $("
"); - $row.appendTo($elem); - } - pc.appendTo($row); - pc.$el.css("display", "table-cell"); - pc.$el.css("width", "20%"); - pc.on("selected", self, function(data) { - self.trigger("selected", data); - self.destroy(); - }); - }); - if (!$elem.find("div").size()) { - $elem.append($('
').text(_t("No results found"))); - } - }, - - }); + }); + if (!$elem.find("div").size()) { + $elem.append($('
').text(_t("No results found"))); + } + }, - instance.web_linkedin.EntityWidget = instance.web.Widget.extend({ - template: "Linkedin.EntityWidget", - init: function(parent, data) { - this._super(parent); - this.data = data; - }, - start: function() { - var self = this; - this.$el.click(function() { - self.trigger("selected", self.data); - }); - if (this.data.__type === "company") { - this.$("h3").text(this.data.name); - self.$("img").attr("src", this.data.logoUrl); - self.$(".oe_linkedin_entity_headline").text(this.data.industry); - } else { // people - this.$("h3").text(this.data.formattedName); - self.$("img").attr("src", this.data.pictureUrl); - self.$(".oe_linkedin_entity_headline").text(this.data.headline); - } - }, - }); -}; +}); + +var EntityWidget = Widget.extend({ + template: "Linkedin.EntityWidget", + init: function(parent, data) { + this._super(parent); + this.data = data; + }, + start: function() { + var self = this; + this.$el.click(function() { + self.trigger("selected", self.data); + }); + if (this.data.__type === "company") { + this.$("h3").text(this.data.name); + self.$("img").attr("src", this.data.logoUrl); + self.$(".oe_linkedin_entity_headline").text(this.data.industry); + } else { // people + this.$("h3").text(this.data.formattedName); + self.$("img").attr("src", this.data.pictureUrl); + self.$(".oe_linkedin_entity_headline").text(this.data.headline); + } + }, +}); + +}); diff --git a/addons/web_tests/static/src/js/web_tests.js b/addons/web_tests/static/src/js/web_tests.js index 281e360c872..9540b717d83 100644 --- a/addons/web_tests/static/src/js/web_tests.js +++ b/addons/web_tests/static/src/js/web_tests.js @@ -1,37 +1,43 @@ -openerp.web_tests = function (instance) { - instance.web.client_actions.add( - 'buncha-forms', 'instance.web_tests.BunchaForms'); - instance.web_tests = {}; - instance.web_tests.BunchaForms = instance.web.Widget.extend({ - init: function (parent) { - this._super(parent); - this.dataset = new instance.web.DataSetSearch(this, 'test.listview.relations'); - this.form = new instance.web.FormView(this, this.dataset, false, { - action_buttons: false, - pager: false - }); - this.form.registry = instance.web.form.readonly; - }, - render: function () { - return '
'; - }, - start: function () { - $.when( - this.dataset.read_slice(), - this.form.appendTo(this.$el)).done(this.on_everything_loaded); - }, - on_everything_loaded: function (slice) { - var records = slice[0].records; - if (!records.length) { - this.form.trigger("load_record", {}); - return; - } - this.form.trigger("load_record", records[0]); - _(records.slice(1)).each(function (record, index) { - this.dataset.index = index+1; - this.form.reposition($('
').appendTo(this.$el)); - this.form.trigger("load_record", record); - }, this); +odoo.define(['web.core', 'web.data', 'web.FormView', 'web.Widget'], function (require) { +"use strict"; + +var core = require('web.core'); +var data = require('web.data'); +var FormView = require('web.FormView'); +var Widget = require('web.Widget'); + +var BunchaForms = Widget.extend({ + init: function (parent) { + this._super(parent); + this.dataset = new data.DataSetSearch(this, 'test.listview.relations'); + this.form = new FormView(this, this.dataset, false, { + action_buttons: false, + pager: false + }); + }, + render: function () { + return '
'; + }, + start: function () { + $.when( + this.dataset.read_slice(), + this.form.appendTo(this.$el)).done(this.on_everything_loaded); + }, + on_everything_loaded: function (slice) { + var records = slice[0].records; + if (!records.length) { + this.form.trigger("load_record", {}); + return; } - }); -}; + this.form.trigger("load_record", records[0]); + _(records.slice(1)).each(function (record, index) { + this.dataset.index = index+1; + this.form.reposition($('
').appendTo(this.$el)); + this.form.trigger("load_record", record); + }, this); + } +}); + +core.action_registry.add('buncha-forms', BunchaForms); + +}); diff --git a/addons/web_tests_demo/static/src/js/demo.js b/addons/web_tests_demo/static/src/js/demo.js index 9ac8d395784..ccfb6d21c70 100644 --- a/addons/web_tests_demo/static/src/js/demo.js +++ b/addons/web_tests_demo/static/src/js/demo.js @@ -1,12 +1,17 @@ -// static/src/js/demo.js -(function () { - openerp.web_tests_demo = { - value_true: true, - SomeType: openerp.web.Class.extend({ - init: function (value) { - this.value = value; - } - }) - }; +odoo.define('web_tests_demo.demo', ['web.core'], function (require) { +"use strict"; -}()); +var core = require('web.core'); + +var SomeType = core.Class.extend({ + init: function (value) { + this.value = value; + }, +}); + +return { + value_true: true, + SomeType: SomeType, +}; + +}); 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() { +odoo.define(['web.core', 'web.form_widgets', 'web.Model', 'web.utils', 'web.WebClient'], function (require) { +"use strict"; - var instance = openerp; +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'); - 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 bus = core.bus; +var Class = core.Class; - 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; - }) - ; +var Tip = Class.extend({ + init: function() { + var self = this; + self.tips = []; + self.tip_mutex = new utils.Mutex(); + self.$overlay = null; + self.$element = null; - instance.web.bus.on('action', this, function(action) { - self.on_action(action); - }); + 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; + }) + ; - 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 { + 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() { - }); - }); - - instance.web.bus.on('view_switch_mode', this, function(viewManager, mode) { - self.on_switch(viewManager, mode); - }); - - instance.web.bus.on('form_view_shown', this, function(formView) { - self.on_form_view(formView); - }); - - instance.web.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); - }); - 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(); }); + } else { + self.on_view(view); } - }, - 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() { + view.on('switch_mode', this, function() { + }); + }); + + 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); + }); + 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() { + 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); - } - }, + } 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; - }, + // 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); - } + 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; }); - }, + } - 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; + valid_tips = _.uniq(valid_tips.concat(tips)); + _.each(valid_tips, function(tip) { + if (!tip.is_consumed) { + self.add_tip(tip); + } + }); + }, - if(!$(highlight_selector).length > 0 || !$(highlight_selector).is(":visible")) { + + add_tip: function(tip) { + var self = this; + self.tip_mutex.exec(function() { + if (!tip.is_consumed) { + return $.when(self.do_tip(tip)); + } + }); + }, + + 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(); } - for (var i = 0; i < triggers.length; i++) { - if(!$(triggers[i]).length > 0) { - trigger_tip = false; + + self.scroll_to_tip(); + self.$helper = $("
", { class: 'oe_tip_helper' }); + self.$element.after(self.$helper); + self._set_helper_position(); + + self.$overlay = $("
", { class: 'oe_tip_overlay' }); + $('body').append(self.$overlay); + self.$element.addClass('oe_tip_show_element'); + + // fix the stacking context problem + _.each(self.$element.parentsUntil('body'), function(el) { + var zIndex = $(el).css('z-index'); + var opacity = parseFloat($(el).css('opacity')); + + if (/[0-9]+/.test(zIndex) || opacity < 1) { + $(el).addClass('oe_tip_fix_parent'); } - } + }); - 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.$element.popover({ + placement: tip.placement, + title: tip.title, + content: tip.description, + html: true, + container: 'body', + }).popover("show"); - self.scroll_to_tip(); - self.$helper = $("
", { class: 'oe_tip_helper' }); - self.$element.after(self.$helper); - self._set_helper_position(); + var $cross = $(''); + $cross.addClass('oe_tip_close'); - self.$overlay = $("
", { class: 'oe_tip_overlay' }); - $('body').append(self.$overlay); - self.$element.addClass('oe_tip_show_element'); - - // fix the stacking context problem - _.each(self.$element.parentsUntil('body'), function(el) { - var zIndex = $(el).css('z-index'); - var opacity = parseFloat($(el).css('opacity')); - - if (/[0-9]+/.test(zIndex) || opacity < 1) { - $(el).addClass('oe_tip_fix_parent'); - } - }); - - self.$element.popover({ - placement: tip.placement, - title: tip.title, - content: tip.description, - html: true, - container: 'body', - }).popover("show"); - - var $cross = $(''); - $cross.addClass('oe_tip_close'); - - if (tip.title) { - $('.popover-title').prepend($cross); - } else { - $('.popover-content').prepend($cross); - } - - // 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(); - }); - - // 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(); - } - }); - - // 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'); - } - }, + // resize + bus.on('resize', this, function() { + self.reposition(); + }); - _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); + bus.on('please_reposition_tip', this, function () { + self.reposition(); + }); + } else { + def.reject(); } - }); + return def; + }, - instance.web.WebClient = instance.web.WebClient.extend({ - show_application: function() { - this._super(); - this.tip_handler = new instance.web.Tip(); + 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); } - }); + }, - instance.web.form.FieldStatus = instance.web.form.FieldStatus.extend({ - render_value: function() { - this._super(); - instance.webclient.tip_handler.reposition(); + 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'); + } +}); + +}); diff --git a/addons/web_view_editor/static/src/js/view_editor.js b/addons/web_view_editor/static/src/js/view_editor.js index 6471e090f85..f4a50b5b580 100644 --- a/addons/web_view_editor/static/src/js/view_editor.js +++ b/addons/web_view_editor/static/src/js/view_editor.js @@ -1,13 +1,27 @@ -openerp.web_view_editor = function(instance) { -var _t = instance.web._t; -var QWeb = instance.web.qweb; -instance.web.ViewManager.include({ +odoo.define(['web.ActionManager', 'web.core', 'web.data', 'web.Dialog', 'web.formats', 'web.Registry', 'web.session', 'web.utils', 'web.ViewManager', 'web.Widget'], function (require) { +"use strict"; + +var ActionManager = require('web.ActionManager'); +var core = require('web.core'); +var data = require('web.data'); +var Dialog = require('web.Dialog'); +var formats = require('web.formats'); +var Registry = require('web.Registry'); +var session = require('web.session'); +var utils = require('web.utils'); +var ViewManager = require('web.ViewManager'); +var Widget = require('web.Widget'); + +var QWeb = core.qweb; +var _t = core._t; + +ViewManager.include({ on_debug_changed:function(evt){ var val = $(evt.target).data('action'), current_view = this.active_view.controller; if(val === "manage_views"){ if (current_view.fields_view && current_view.fields_view.arch) { - var view_editor = new instance.web_view_editor.ViewEditor(current_view, current_view.$el, this.dataset, current_view.fields_view.arch); + var view_editor = new ViewEditor(current_view, current_view.$el, this.dataset, current_view.fields_view.arch); view_editor.start(); } else { this.do_warn(_t("Manage Views"), @@ -18,14 +32,15 @@ instance.web.ViewManager.include({ } } }); -instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ - init: function(parent, element_id, dataset, view, options) { + +var ViewEditor = Widget.extend({ + init: function(parent, element_id, dataset) { this._super(parent); this.parent = parent; - this.dataset = new instance.web.DataSetSearch(this, 'ir.ui.view', null, null), + this.dataset = new data.DataSetSearch(this, 'ir.ui.view', null, null); this.model = dataset.model; this.xml_element_id = 0; - this.property = instance.web_view_editor.ViewEditor.property_widget; + this.property = ViewEditor.property_widget; this.one_object = false; }, start: function() { @@ -36,7 +51,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ action_title = _.str.sprintf(_t("Manage Views (%s)"), this.model); var action = { name: action_title, - context: this.session.user_context, + context: session.user_context, domain: [["model", "=", this.model]], res_model: 'ir.ui.view', views: [[false, 'list']], @@ -56,7 +71,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ select_view_id: self.parent.fields_view.view_id } }; - this.view_edit_dialog = new instance.web.Dialog(this, { + this.view_edit_dialog = new Dialog(this, { title: action_title, buttons: [ {text: _t("Create"), click: function() { self.on_create_view(); }}, @@ -67,13 +82,13 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }).open(); this.view_edit_dialog.on("closing", this, function(){window.location.reload();}); this.main_view_id = this.parent.fields_view.view_id; - this.action_manager = new instance.web.ActionManager(this); + this.action_manager = new ActionManager(this); this.action_manager.appendTo(this.view_edit_dialog.$el); $.when(this.action_manager.do_action(action)).done(function() { var viewmanager = self.action_manager.inner_widget; var controller = viewmanager.active_view.controller; $(controller.groups).bind({ - 'selected': function (e, ids, records, deselected) { + 'selected': function (e, ids) { self.main_view_id = ids[0]; } }); @@ -81,7 +96,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }, on_create_view: function() { var self = this; - this.create_view_dialog = new instance.web.Dialog(this, { + this.create_view_dialog = new Dialog(this, { title: _.str.sprintf(_t("Create a view (%s)"), self.model), buttons: [ {text: _t("Save"), click: function () { @@ -128,9 +143,9 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }); }, do_save_view: function(values) { - def = $.Deferred(); - var field_dataset = new instance.web.DataSetSearch(this, this.model, null, null); - var model_dataset = new instance.web.DataSetSearch(this, 'ir.model', null, null); + var def = $.Deferred(); + var field_dataset = new data.DataSetSearch(this, this.model, null, null); + var model_dataset = new data.DataSetSearch(this, 'ir.model', null, null); var view_string = "", field_name = false, self = this; field_dataset.call( 'fields_get', []).done(function(fields) { _.each(['name', 'x_name'], function(value) { @@ -186,7 +201,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } }, create_View_Node: function(node){ - ViewNode = { + var ViewNode = { 'level': ($(node).parents()).length + 1, 'id': this.xml_element_id += 1, 'att_list': [], @@ -230,7 +245,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }, parse_xml: function(arch, view_id) { //First element of att_list must be element tagname. - main_object = { + var main_object = { 'level': 0, 'id': this.xml_element_id +=1, 'att_list': ["view"], @@ -265,7 +280,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ parent_child_list : function(one_object, parent_list) { var self = this; _.each(one_object , function(element) { - if (element.child_id.length != 0) { + if (element.child_id.length !== 0) { parent_list.push({"key": element.id, "value": _.pluck(element.child_id, 'id')}); self.parent_child_list(element.child_id, parent_list); } @@ -299,13 +314,15 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }, inherit_apply: function(expr_list ,arch_object ,xpath_arch_object) { var self = this; + var temp_list; + if (xpath_arch_object.length) { var check = expr_list[0], obj = false; switch (check.length) { case 2: if (parseInt(check[1])) { //for field[3] - var temp_list = _.select(arch_object, function(element) { + temp_list = _.select(arch_object, function(element) { return _.include(_.flatten(element.att_list), check[0]); }); obj = arch_object[_.indexOf(arch_object, temp_list[parseInt(check[1]) - 1])]; @@ -326,11 +343,11 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ break; case 1: //for /form/notebook - var temp_list = _.select(arch_object, function(element) { + temp_list = _.select(arch_object, function(element) { return _.include(_.flatten(element.att_list), check[0]); }); - if (temp_list.length != 0) { - expr_list.length == 1 ? obj = temp_list[0] : expr_list.shift(); + if (temp_list.length !== 0) { + expr_list.length === 1 ? obj = temp_list[0] : expr_list.shift(); } break; } @@ -353,7 +370,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ increase_level: function(val, level) { var self = this; val.level = level; - _.each(val.child_id, function(val, key) { + _.each(val.child_id, function(val) { self.increase_level(val, level + 1); }); }, @@ -373,7 +390,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ edit_view: function(one_object) { var self = this; this.one_object = one_object; - this.edit_xml_dialog = new instance.web.Dialog(this, { + this.edit_xml_dialog = new Dialog(this, { title: _.str.sprintf(_t("View Editor %d - %s"), self.main_view_id, self.model), buttons: [ {text: _t("Inherited View"), click: function(){ @@ -404,7 +421,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ action_buttons: false } }; - var action_manager = new instance.web.ActionManager(self); + var action_manager = new ActionManager(self); action_manager.do_action(action); }}, {text: _t("Close"), click: function(){ @@ -417,7 +434,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ _.each(_PROPERTIES, function(val, key) { if (! val.length) no_property_att.push(key); }); - this.edit_xml_dialog.$el.html(QWeb.render('view_editor', {'data': one_object['main_object'], 'no_properties': no_property_att})); + this.edit_xml_dialog.$el.html(QWeb.render('view_editor', {'data': one_object.main_object, 'no_properties': no_property_att})); this.edit_xml_dialog.$el.find("tr[id^='viewedit-']").click(function() { self.do_select_row(this.id.split('-')[1]); }); @@ -431,14 +448,14 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ inherited_view: function(selected_row){ var self = this; var row_id = parseInt((selected_row.attr('id')).split('-')[1]); - var obj = self.get_object_by_id(row_id,self.one_object['main_object'], [])[0]; + var obj = self.get_object_by_id(row_id,self.one_object.main_object, [])[0]; var view_name = this.model + '.inherit_' + Math.round(Math.random() * 1000); var view_find = selected_row; var view_id; var min_level = parseInt(selected_row.attr('level')); while (1) { view_find = view_find.prev(); - if (view_find.length == 0 || + if (view_find.length === 0 || self.edit_xml_dialog.$el.find(view_find).find('a').text().search("view_id") != -1 && parseInt(view_find.attr('level')) < min_level ) { view_id = parseInt($(view_find).find('a').text().replace(/[^0-9]+/g, '')); @@ -449,14 +466,14 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } } var val = _.detect(obj.att_list, function(val) {return val[0] == "name";}); - var priority = _.detect(self.one_object['arch'], function(val) {return val.view_id == view_id;}); + var priority = _.detect(self.one_object.arch, function(val) {return val.view_id === view_id;}); var arch = _.str.sprintf("\n\t ", val[1]); var vals = {'model': self.model, 'name': view_name, 'priority': priority.priority + 1, 'type': "form", 'arch': arch,'inherit_id':self.main_view_id}; this.dataset.create(vals).done(function(id) { var arch_to_obj = self.parse_xml(arch,id); obj.child_id.push(arch_to_obj[0]); - self.one_object['parent_child_id'] = self.parent_child_list(self.one_object['main_object'],[]); - self.one_object['arch'].push({'view_id':id,"arch":arch,'priority': priority.priority + 1}); + self.one_object.parent_child_id = self.parent_child_list(self.one_object.main_object,[]); + self.one_object.arch.push({'view_id':id,"arch":arch,'priority': priority.priority + 1}); self.increase_level(arch_to_obj[0],obj.level+1); self.render_inherited_view(selected_row,arch_to_obj[0]); }); @@ -464,7 +481,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ render_inherited_view: function(selected_row,obj){ var self = this,row_id = parseInt((selected_row.attr('id')).split('-')[1]); var clone = this.create_clone(selected_row.clone(),obj); - if (selected_row.find("img[id^='parentimg-']").length == 0) { + if (selected_row.find("img[id^='parentimg-']").length === 0) { ($(selected_row.find('a').parent()).siblings('td')) .append($('').attr('src', '/web/static/src/img/collapse.gif'). attr('id','parentimg-'+ row_id).click(function(){ @@ -492,8 +509,8 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }else{ while (1) { view_find = view_find.prev(); - if (view_find.length == 0 || - (self.edit_xml_dialog.$el.find(view_find).find('a').text()).search("view_id") != -1 + if (view_find.length === 0 || + (self.edit_xml_dialog.$el.find(view_find).find('a').text()).search("view_id") !== -1 && parseInt(view_find.attr('level')) < min_level ) { view_id = parseInt(($(view_find).find('a').text()).replace(/[^0-9]+/g, '')); view_xml_id = parseInt((view_find.attr('id')).split('-')[1]); @@ -526,18 +543,20 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } }, do_node_add: function(side){ - var self = this,property_to_check = []; - var tr = self.get_object_by_id(this.one_object.clicked_tr_id, this.one_object['main_object'], [])[0].att_list[0]; + var self = this; + var property_to_check = []; + var tr = self.get_object_by_id(this.one_object.clicked_tr_id, this.one_object.main_object, [])[0].att_list[0]; var parent_tr = ($(side).prevAll("tr[level=" + String(this.one_object.clicked_tr_level - 1) + "]"))[0]; - var field_dataset = new instance.web.DataSetSearch(this, this.model, null, null); - parent_tr = self.get_object_by_id(parseInt($(parent_tr).attr('id').replace(/[^0-9]+/g, '')), this.one_object['main_object'], [])[0].att_list[0]; + var field_dataset = new data.DataSetSearch(this, this.model, null, null); + parent_tr = self.get_object_by_id(parseInt($(parent_tr).attr('id').replace(/[^0-9]+/g, '')), this.one_object.main_object, [])[0].att_list[0]; _.each([tr, parent_tr],function(element) { var value = _.has(_CHILDREN, element) ? element : _.str.include(html_tag, element)?"html_tag":false; property_to_check.push(value); }); field_dataset.call( 'fields_get', []).done(function(result) { var fields = _.keys(result); - fields.push(" "),fields.sort(); + fields.push(" "); + fields.sort(); self.on_add_node(property_to_check, fields, self.inject_position(parent_tr,tr)); }); }, @@ -548,21 +567,22 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ return ['After','Before']; return ['After','Before','Inside']; }, - do_node_edit: function(side) { + do_node_edit: function() { var self = this; - var result = self.get_object_by_id(this.one_object.clicked_tr_id, this.one_object['main_object'], []); + var result = self.get_object_by_id(this.one_object.clicked_tr_id, this.one_object.main_object, []); if (result.length && result[0] && result[0].att_list) { var properties = _PROPERTIES[result[0].att_list[0]]; self.on_edit_node(properties); } }, do_node_down: function(cur_tr, img) { - var self = this, next_tr, last_tr, tr_to_move = []; + var self = this; + var next_tr, last_tr, tr_to_move = []; tr_to_move.push(cur_tr); if (img) { while (1) { next_tr = cur_tr.next(); - if ( parseInt(next_tr.attr('level')) <= this.one_object.clicked_tr_level || next_tr.length == 0) { + if ( parseInt(next_tr.attr('level')) <= this.one_object.clicked_tr_level || next_tr.length === 0) { last_tr = next_tr; break; } else { @@ -576,15 +596,15 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ if ((self.edit_xml_dialog.$el.find(last_tr).find('a').text()).search("view_id") != -1) { return false; } - if (last_tr.length != 0 && parseInt(last_tr.attr('level')) == this.one_object.clicked_tr_level) { + if (last_tr.length !== 0 && parseInt(last_tr.attr('level')) == this.one_object.clicked_tr_level) { var last_tr_id = (last_tr.attr('id')).split('-')[1]; img = last_tr.find("img[id='parentimg-" + last_tr_id + "']").attr('src'); if (img) { self.edit_xml_dialog.$el.find("img[id='parentimg-" + last_tr_id + "']"). attr('src', '/web/static/src/img/expand.gif'); while (1) { - var next_tr = last_tr.next(); - if (next_tr.attr('level') <= this.one_object.clicked_tr_level || next_tr.length == 0) break; + next_tr = last_tr.next(); + if (next_tr.attr('level') <= this.one_object.clicked_tr_level || next_tr.length === 0) break; next_tr.hide(); last_tr = next_tr; } @@ -597,11 +617,16 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } }, do_node_up: function(cur_tr, img) { - var self = this, side = cur_tr, tr_to_move = []; + var self = this; + var side = cur_tr; + var tr_to_move = []; + var last_tr; + var next_tr; + tr_to_move.push(side); while (1) { var prev_tr = cur_tr.prev(); - if (this.one_object.clicked_tr_level >= parseInt(prev_tr.attr('level')) || prev_tr.length == 0) { + if (this.one_object.clicked_tr_level >= parseInt(prev_tr.attr('level')) || prev_tr.length === 0) { last_tr = prev_tr; break; } @@ -612,7 +637,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ attr('src', '/web/static/src/img/expand.gif'); while (1) { next_tr = side.next(); - if (parseInt(next_tr.attr('level')) <= this.one_object.clicked_tr_level || next_tr.length == 0) { + if (parseInt(next_tr.attr('level')) <= this.one_object.clicked_tr_level || next_tr.length === 0) { break; } else { next_tr.hide(); @@ -621,8 +646,8 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } } } - if (last_tr.length != 0 && parseInt(last_tr.attr('level')) == this.one_object.clicked_tr_level && - (self.edit_xml_dialog.$el.find(last_tr).find('a').text()).search("view_id") == -1) { + if (last_tr.length !== 0 && parseInt(last_tr.attr('level')) == this.one_object.clicked_tr_level && + (self.edit_xml_dialog.$el.find(last_tr).find('a').text()).search("view_id") === -1) { _.each(tr_to_move, function(rec) { $(last_tr).before(rec); }); @@ -631,9 +656,9 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }, do_save_update_arch: function(move_direct, update_values) { var self = this; - var arch = _.detect(self.one_object['arch'], function(element) - {return element.view_id == self.one_object.clicked_tr_view[0]}); - var obj = self.get_object_by_id(this.one_object.clicked_tr_view[1],this.one_object['main_object'], []); + var arch = _.detect(self.one_object.arch, function(element) + {return element.view_id === self.one_object.clicked_tr_view[0];}); + var obj = self.get_object_by_id(this.one_object.clicked_tr_view[1],this.one_object.main_object, []); //for finding xpath tag from inherit view var xml_arch = QWeb.load_xml(arch.arch); if (xml_arch.childNodes[0].tagName == "data") { @@ -646,15 +671,15 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ insert = _.intersection(_.flatten(temp_obj.att_list),_.uniq(check_list)); if (insert.length == _.uniq(check_list).length ) {return xml_child;} }); - xml_arch = QWeb.load_xml(instance.web.xml_to_str(inherited_view)); + xml_arch = QWeb.load_xml(utils.xml_to_str(inherited_view)); } return self.do_save_xml(xml_arch.documentElement, obj[0].child_id[0],obj[0].child_id, move_direct, update_values,arch); }, get_object_by_id: function(id, one_object, result) { var self = this; - if (result.length == 0 ) { + if (result.length === 0 ) { var check = _.detect(one_object , function(obj) { - return id == obj.id; + return id === obj.id; }); if (check) {result.push(check);} _.each(one_object, function(obj) { @@ -679,21 +704,26 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ return clone; }, do_save_xml: function(arch1, obj, child_list, move_direct, update_values, arch){ - var self = this, children_list = $(arch1).children(),list_obj_xml; + var self = this; // blame this line if something terribly wrong happens + var children_list = $(arch1).children(); + var list_obj_xml; + var re_insert_obj; + try{list_obj_xml = _.zip(children_list, obj.child_id);}catch(err){return;} if (this.one_object.clicked_tr_id) { if (obj.id == this.one_object.clicked_tr_id) { - var parent = false, index = _.indexOf(child_list, obj); + var parent = false, + index = _.indexOf(child_list, obj); if (move_direct == "down") { var next = $(arch1).next(); $(next).after(arch1); - var re_insert_obj = child_list.splice(index, 1); + re_insert_obj = child_list.splice(index, 1); child_list.splice(index+1, 0, re_insert_obj[0]); parent = $(arch1).parents(); } else if (move_direct == "up") { var prev = $(arch1).prev(); $(prev).before(arch1); - var re_insert_obj = child_list.splice(index, 1); + re_insert_obj = child_list.splice(index, 1); child_list.splice(index-1, 0, re_insert_obj[0]); parent = $(arch1).parents(); } else if (move_direct == "update_node") { @@ -714,7 +744,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ object_xml = self.create_View_Node(temp_xml.childNodes[0]); (update_values[1] == "Inside")? object_xml.level = obj.level + 1:object_xml.level = obj.level; var clone = self.create_clone(tr_click.clone(),object_xml), - after_append = _.detect(self.one_object['parent_child_id'],function(ele){ + after_append = _.detect(self.one_object.parent_child_id,function(ele){ return self.one_object.clicked_tr_id == ele.key; }); after_append = (after_append)?_.last(after_append.value):self.one_object.clicked_tr_id; @@ -731,7 +761,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ child_list.splice(index - 1, 0, object_xml); break; case "Inside": - if (tr_click.find("img[id^='parentimg-']").length == 0) { + if (tr_click.find("img[id^='parentimg-']").length === 0) { ($(tr_click.find('a').parent()).siblings('td')) .append($('').attr('src', '/web/static/src/img/collapse.gif'). attr('id','parentimg-'+ self.one_object.clicked_tr_id).click(function(){ @@ -749,10 +779,10 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ parent = $(arch1).parents(); } else if (move_direct == "remove_node") { parent = $(arch1).parents(); - if (parent.length == 0 || (parent[0].tagName.toLowerCase() == "data")) { + if (parent.length === 0 || (parent[0].tagName.toLowerCase() == "data")) { self.one_object.clicked_tr_id = self.one_object.clicked_tr_id -1; self.one_object.clicked_tr_level = self.one_object.clicked_tr_level - 1; - (parent.length == 0)?parent.push("remove_view"):false; + (parent.length === 0)?parent.push("remove_view"):false; } $(arch1).remove(); child_list.splice(index,1); @@ -762,7 +792,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ tr_element.remove(); }); cur_tr.remove(); - var parent_img = _.detect(self.one_object['parent_child_id'],function(element){ + var parent_img = _.detect(self.one_object.parent_child_id,function(element){ return _.include(element.value, self.one_object.clicked_tr_id); }); if(parent_img.value.length == 1){ @@ -770,9 +800,9 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ find("tr[id='viewedit-"+parent_img.key+"']"). find("img[id^='parentimg-']").remove(); } - self.one_object['parent_child_id'] = self.parent_child_list(self.one_object['main_object'],[]); + self.one_object.parent_child_id = self.parent_child_list(self.one_object.main_object,[]); } - var convert_to_utf = (parent.length != 0)? parent[parent.length-1]: arch1; + var convert_to_utf = (parent.length !== 0)? parent[parent.length-1]: arch1; if (convert_to_utf != "remove_view") { convert_to_utf = QWeb.tools.xml_node_to_string(convert_to_utf); convert_to_utf = convert_to_utf.replace('xmlns="http://www.w3.org/1999/xhtml"', ""); @@ -782,10 +812,10 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } else { this.dataset.unlink([this.one_object.clicked_tr_view[0]]); } - if(move_direct == "add_node"){ + if(move_direct === "add_node"){ self.add_node_dialog.close(); self.on_select_img(clone.find("img[id='side-edit']")[0]); - self.one_object['parent_child_id'] = self.parent_child_list(self.one_object['main_object'],[]); + self.one_object.parent_child_id = self.parent_child_list(self.one_object.main_object,[]); } } if (obj.level <= this.one_object.clicked_tr_level) { @@ -803,7 +833,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }); }, get_list_tr: function(cur_tr,level){ - tr_list = []; + var tr_list = []; while (1) { var nxt_tr = cur_tr.next(); if (parseInt(nxt_tr.attr('level')) > level) { @@ -814,7 +844,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }, on_collapse: function(collapse_img) { var self = this, id = collapse_img.id.split('-')[1]; - var datas = _.detect(self.one_object['parent_child_id'] , function(res) { + var datas = _.detect(self.one_object.parent_child_id , function(res) { return res.key == id; }); _.each(datas.value, function (rec) { @@ -825,7 +855,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }, on_edit_node: function(properties){ var self = this; - this.edit_node_dialog = new instance.web.Dialog(this,{ + this.edit_node_dialog = new Dialog(this,{ title: _t("Properties"), size: 'medium', buttons: [ @@ -891,19 +921,19 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ 'groups' : {'name':'groups', 'string': 'Groups', 'type': 'selection_multi'}, 'fonts' : {'name':'fonts', 'string': 'fonts', 'type': 'char'}, }; - var arch_val = self.get_object_by_id(this.one_object.clicked_tr_id,this.one_object['main_object'], []); + var arch_val = self.get_object_by_id(this.one_object.clicked_tr_id,this.one_object.main_object, []); this.edit_node_dialog.$el.append('
'); this.edit_widget = []; self.ready = $.when(self.on_groups(properties)).done(function () { - _PROPERTIES_ATTRIBUTES['groups']['selection'] = self.groups; - var values = _.keys( instance.web.form.widgets.map); + _PROPERTIES_ATTRIBUTES.groups.selection = self.groups; + var values = _.keys(core.form_widget_registry.map); values.push(''); values.sort(); - _PROPERTIES_ATTRIBUTES['widget']['selection'] = values; - var widgets = _.filter(_PROPERTIES_ATTRIBUTES, function (property) { return _.include(properties, property.name)}); + _PROPERTIES_ATTRIBUTES.widget.selection = values; + var widgets = _.filter(_PROPERTIES_ATTRIBUTES, function (property) { return _.include(properties, property.name);}); _.each(widgets, function(widget) { var type_widget = new (self.property.get_any([widget.type])) (self.edit_node_dialog, widget); - var value = _.detect(arch_val[0]['att_list'],function(res) { + var value = _.detect(arch_val[0].att_list,function(res) { return res instanceof Array? _.include(res, widget.name): false; }); @@ -924,8 +954,8 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ def.resolve(); } var group_ids = [], group_names = {}, groups = []; - var res_groups = new instance.web.DataSetSearch(this,'res.groups', null, null), - model_data = new instance.web.DataSetSearch(self,'ir.model.data', null, null); + var res_groups = new data.DataSetSearch(this,'res.groups', null, null), + model_data = new data.DataSetSearch(self,'ir.model.data', null, null); res_groups.read_slice([], {}).done(function (res_grp) { _.each(res_grp, function (res) { var key = res.id; @@ -951,7 +981,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ {'name': 'field_value','selection': fields, 'value': false, 'string': '','type': 'selection'}, {'name': 'position','selection': position, 'value': false, 'string': 'Position','type': 'selection'}]; this.add_widget = []; - this.add_node_dialog = new instance.web.Dialog(this,{ + this.add_node_dialog = new Dialog(this,{ title: _t("Properties"), size: 'medium', buttons: [ @@ -981,7 +1011,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ this.add_node_dialog.$el.append('
'); var table_selector = self.add_node_dialog.$el.find('table[id=rec_table] tbody'); _.each(render_list, function(node) { - type_widget = new (self.property.get_any([node.type])) (self.add_node_dialog, node); + var type_widget = new (self.property.get_any([node.type])) (self.add_node_dialog, node); if (node.name == "position") { table_selector.append('' + node.string + '' + type_widget.render() + ''); } else { @@ -996,7 +1026,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ }); table_selector.find("td[id^=]").attr("width","100px"); self.add_node_dialog.$el.find('#new_field').click(function() { - model_data = new instance.web.DataSetSearch(self,'ir.model', null, null); + var model_data = new data.DataSetSearch(self,'ir.model', null, null); model_data.read_slice([], {domain: [['model','=', self.model]]}).done(function(result) { self.render_new_field(result[0]); }); @@ -1014,9 +1044,9 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ action_buttons: true } }; - var action_manager = new instance.web.ActionManager(self); + var action_manager = new ActionManager(self); $.when(action_manager.do_action(action)).done(function() { - var controller = action_manager.dialog_widget.views['form'].controller; + var controller = action_manager.dialog_widget.views.form.controller; controller.on("on_button_cancel", self, function(){ action_manager.destroy(); }); @@ -1024,14 +1054,15 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ action_manager.destroy(); var value =controller.fields.name.get('value'); self.add_node_dialog.$el.find('select[id=field_value]').append($("").attr("value",value).text(value)); - _.detect(self.add_widget,function(widget){ - widget.name == "field_value"? widget.selection.push(value): false; + _.detect(self.add_widget, function(widget){ + widget.name === "field_value" ? widget.selection.push(value): false; }); }); }); } }); -instance.web_view_editor.ViewEditor.Field = instance.web.Class.extend({ + +ViewEditor.Field = core.Class.extend({ init: function(view, widget) { this.$el = view.$el; this.dirty = false; @@ -1057,17 +1088,18 @@ instance.web_view_editor.ViewEditor.Field = instance.web.Class.extend({ validate: function() { this.is_invalid = false; try { - var value = instance.web.parse_value(this.get_value(), this, ''); + var value = formats.parse_value(this.get_value(), this, ''); this.is_invalid = this.required && value === ''; } catch(e) { this.is_invalid = true; } }, render: function() { - return _.str.sprintf("%s", this.name, QWeb.render(this.template, {widget: this})) + return _.str.sprintf("%s", this.name, QWeb.render(this.template, {widget: this})); } }); -instance.web_view_editor.ViewEditor.FieldBoolean = instance.web_view_editor.ViewEditor.Field.extend({ + +ViewEditor.FieldBoolean = ViewEditor.Field.extend({ template : "vieweditor_boolean", start: function() { var self = this; @@ -1085,7 +1117,8 @@ instance.web_view_editor.ViewEditor.FieldBoolean = instance.web_view_editor.View return this.$el.find("input[id=" + this.name + "]").is(':checked')? "1" : null; } }); -instance.web_view_editor.ViewEditor.FieldChar = instance.web_view_editor.ViewEditor.Field.extend({ + +ViewEditor.FieldChar = ViewEditor.Field.extend({ template : "vieweditor_char", start: function () { var self = this; @@ -1101,7 +1134,8 @@ instance.web_view_editor.ViewEditor.FieldChar = instance.web_view_editor.ViewEdi return this.$el.find("input[id=" + this.name + "]").val(); } }); -instance.web_view_editor.ViewEditor.FieldSelect = instance.web_view_editor.ViewEditor.Field.extend({ + +ViewEditor.FieldSelect = ViewEditor.Field.extend({ template : "vieweditor_selection", start: function () { var self = this; @@ -1131,7 +1165,8 @@ instance.web_view_editor.ViewEditor.FieldSelect = instance.web_view_editor.ViewE return this.$el.find("select[id=" + this.name + "]").val(); } }); -instance.web_view_editor.ViewEditor.FieldSelectMulti = instance.web_view_editor.ViewEditor.FieldSelect.extend({ + +ViewEditor.FieldSelectMulti = ViewEditor.FieldSelect.extend({ start: function () { this._super(); this.$el.find("select[id=" + this.name + "]").css('height', '100px').attr("multiple", true); @@ -1142,12 +1177,13 @@ instance.web_view_editor.ViewEditor.FieldSelectMulti = instance.web_view_editor. if (!value) return false; _.each(this.selection, function(item) { if (_.include(value.split(','), item[0])) { - self.$el.find("select[id="+self.name+"] option[value='" + item[0] +"']").attr("selected",1) + self.$el.find("select[id="+self.name+"] option[value='" + item[0] +"']").attr("selected",1); } }); } }); -instance.web_view_editor.ViewEditor.FieldFloat = instance.web_view_editor.ViewEditor.FieldChar.extend({ + +ViewEditor.FieldFloat = ViewEditor.FieldChar.extend({ }); var _PROPERTIES = { @@ -1169,6 +1205,7 @@ var _PROPERTIES = { 'graph' : ['string', 'type'], 'calendar' : ['string', 'date_start', 'date_stop', 'date_delay', 'day_length', 'color', 'mode'] }; + var _CHILDREN = { 'form': ['notebook', 'group', 'field', 'label', 'button','board', 'newline', 'separator'], 'tree': ['field'], @@ -1189,6 +1226,7 @@ var _CHILDREN = { 'html_tag':['notebook', 'group', 'field', 'label', 'button','board', 'newline', 'separator'] //e.g.:xyz 'td' : ['field'] }; + // Generic html_tag list and can be added html tag in future. It's support above _CHILDREN dict's *html_tag* by default. // For specific child node one has to define tag above and specify children tag in list. Like above xyz example. var html_tag = ['div','h1','h2','h3','h4','h5','h6','td','tr']; @@ -1220,11 +1258,13 @@ var _ICONS = ['','STOCK_ABOUT', 'STOCK_ADD', 'STOCK_APPLY', 'STOCK_BOLD', 'terp-sale', 'terp-tools', 'terp-administration', 'terp-hr', 'terp-partner', 'terp-project', 'terp-report', 'terp-stock', 'terp-calendar', 'terp-graph' ]; -instance.web_view_editor.ViewEditor.property_widget = new instance.web.Registry({ - 'boolean' : 'instance.web_view_editor.ViewEditor.FieldBoolean', - 'selection_multi' : 'instance.web_view_editor.ViewEditor.FieldSelectMulti', - 'selection' : 'instance.web_view_editor.ViewEditor.FieldSelect', - 'char' : 'instance.web_view_editor.ViewEditor.FieldChar', - 'float' : 'instance.web_view_editor.ViewEditor.FieldFloat' + +ViewEditor.property_widget = new Registry({ + 'boolean' : ViewEditor.FieldBoolean, + 'selection_multi' : ViewEditor.FieldSelectMulti, + 'selection' : ViewEditor.FieldSelect, + 'char' : ViewEditor.FieldChar, + 'float' : ViewEditor.FieldFloat +}); + }); -};