[REF] web_X: update to the new module system

This commit is contained in:
Géry Debongnie
2015-03-18 09:01:49 +01:00
parent 4b77bbf51c
commit c8a8fec622
10 changed files with 1376 additions and 1262 deletions
@@ -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();
});
},
});
});
+31 -20
View File
@@ -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 = '<p style="padding: 4px;">' + label.attrs.string + "</p>";
var html_label = '<p style="padding: 4px;">' + label.attrs.string + "</p>";
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;
});
+34 -24
View File
@@ -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;
});
@@ -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);
}
});
@@ -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);
}
});
File diff suppressed because it is too large Load Diff
+42 -36
View File
@@ -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 '<div class="oe_bunchaforms"></div>';
},
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($('<div>').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 '<div class="oe_bunchaforms"></div>';
},
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($('<div>').appendTo(this.$el));
this.form.trigger("load_record", record);
}, this);
}
});
core.action_registry.add('buncha-forms', BunchaForms);
});
+16 -11
View File
@@ -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,
};
});
+293 -278
View File
@@ -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 = $("<div>", { class: 'oe_tip_helper' });
self.$element.after(self.$helper);
self._set_helper_position();
self.$overlay = $("<div>", { class: 'oe_tip_overlay' });
$('body').append(self.$overlay);
self.$element.addClass('oe_tip_show_element');
// 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 = $("<div>", { class: 'oe_tip_helper' });
self.$element.after(self.$helper);
self._set_helper_position();
var $cross = $('<button type="button" class="close">&times;</button>');
$cross.addClass('oe_tip_close');
self.$overlay = $("<div>", { 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 = $('<button type="button" class="close">&times;</button>');
$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');
}
});
});
@@ -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("<?xml version='1.0'?>\n\t <field name='%s' position='after'> </field>", 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($('<img width="16" height="16"></img>').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($('<img width="16" height="16"></img>').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('<table id="rec_table" style="width:400px" class="oe_form"></table>');
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('<table id="rec_table" style="width:420px" class="oe_form"><tbody><tr></tbody></table>');
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('</tr><tr><td align="right" width="100px">' + node.string + '</td>' + type_widget.render() + '</tr>');
} 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($("<option selected></option>").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("<td id = %s>%s</td>", this.name, QWeb.render(this.template, {widget: this}))
return _.str.sprintf("<td id = %s>%s</td>", 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
});
});
};