summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorVo Minh Thu <vmt@openerp.com>2012-01-18 11:12:52 +0100
committerVo Minh Thu <vmt@openerp.com>2012-01-18 11:12:52 +0100
commit75b3fc0907ee873c6e16d1fa8e8bfe58d4f520c1 (patch)
tree3e7f7bbe9110eeae766b46bb9c16a867579b6452 /addons/web/static/src
parent3203d264aecd751a8c261cea4f72fa323a3098be (diff)
parent152f92916bc36d00c0e59fbc49fb655a4fd85908 (diff)
[MERGE] merged trunk.
bzr revid: vmt@openerp.com-20120118101252-e81nlyzym2nkebf4
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/css/base.css28
-rw-r--r--addons/web/static/src/js/chrome.js17
-rw-r--r--addons/web/static/src/js/core.js6
-rw-r--r--addons/web/static/src/js/data.js4
-rw-r--r--addons/web/static/src/js/data_export.js3
-rw-r--r--addons/web/static/src/js/view_editor.js12
-rw-r--r--addons/web/static/src/js/view_form.js36
-rw-r--r--addons/web/static/src/js/view_list.js31
-rw-r--r--addons/web/static/src/js/view_page.js1
-rw-r--r--addons/web/static/src/xml/base.xml38
10 files changed, 95 insertions, 81 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index d4bd7a6ff1b..32c7f14b345 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -1,4 +1,5 @@
-body.openerp {
+body { padding: 0; margin: 0; }
+.openerp {
padding: 0;
margin: 0;
height: 100%;
@@ -7,7 +8,8 @@ body.openerp {
font-family: Ubuntu, Helvetica, sans-serif;
}
-body.openerp, .openerp textarea, .openerp input, .openerp select, .openerp option, .openerp button, .openerp .ui-widget {
+.openerp, .openerp textarea, .openerp input, .openerp select, .openerp option,
+.openerp button, .openerp .ui-widget {
font-family: Ubuntu, Helvetica, sans-serif;
font-size:85%;
}
@@ -1416,7 +1418,7 @@ label.error {
}
@-moz-document url-prefix() {
/* Strange firefox behaviour on width: 100% + white-space: nowrap */
- .openerp .oe_forms .oe_button {
+ .openerp .oe_forms .oe_form_button .oe_button {
width: auto;
}
}
@@ -1851,15 +1853,28 @@ label.error {
}
.openerp .oe-treeview-table {
width: 100%;
+ background-color : #FFFFFF;
+ border-spacing: 0;
+}
+.openerp .oe-treeview-table tr:hover{
+ color: blue;
+ background-color : #D8D8D8;
}
.treeview-tr, .treeview-td {
cursor: pointer;
vertical-align: top;
text-align: left;
+ border-bottom: 1px solid #CFCCCC;
+}
+.oe-number{
+ text-align: right !important;
}
.treeview-tr span, .treeview-td span {
+ font-size: 90%;
+ font-weight: normal;
+ white-space: nowrap;
display: block;
-}
+ }
.treeview-tr:first-of-type {
background: transparent url(/web/static/src/img/expand.gif) 0 50% no-repeat;
}
@@ -1872,8 +1887,11 @@ label.error {
}
.treeview-header {
- text-align: left;
vertical-align: top;
+ background-color : #D8D8D8;
+ white-space: nowrap;
+ text-align: left;
+ padding: 4px 5px;
}
/* Shortcuts*/
.oe-shortcut-toggle {
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index 39bc0181e16..8b9a0d4efc6 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -205,7 +205,7 @@ openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({
buttons: buttons
}).open();
dialog.$element.html(QWeb.render('CrashManagerError', {session: openerp.connection, error: error}));
- },
+ }
});
openerp.web.Loading = openerp.web.Widget.extend(/** @lends openerp.web.Loading# */{
@@ -280,6 +280,9 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database
init: function(parent, element_id, option_id) {
this._super(parent, element_id);
this.unblockUIFunction = $.unblockUI;
+ $.validator.addMethod('matches', function (s, _, re) {
+ return new RegExp(re).test(s);
+ }, _t("Invalid database name"));
},
start: function() {
this.$option_id = $("#oe_db_options");
@@ -646,7 +649,7 @@ openerp.web.Login = openerp.web.Widget.extend(/** @lends openerp.web.Login# */{
}
}
});
- },
+ }
});
openerp.web.Header = openerp.web.Widget.extend(/** @lends openerp.web.Header# */{
@@ -1059,13 +1062,9 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
this._current_state = null;
},
- render_element: function() {
- this.$element = $('<body/>');
- this.$element.attr("id", "oe");
- this.$element.addClass("openerp");
- },
start: function() {
var self = this;
+ this.$element = $(document.body);
if (jQuery.param != undefined && jQuery.deparam(jQuery.param.querystring()).kitten != undefined) {
this.$element.addClass("kitten-mode-activated");
this.$element.delegate('img.oe-record-edit-link-img', 'hover', function(e) {
@@ -1089,7 +1088,7 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie
self.bind_hashchange();
if (!self.session.openerp_entreprise) {
self.$element.find('.oe_footer_powered').append('<span> - <a href="http://www.openerp.com/support-or-publisher-warranty-contract" target="_blank">Unsupported/Community Version</a></span>');
- $('title').html('OpenERP - Unsupported/Community Version');
+ document.title = _t("OpenERP - Unsupported/Community Version");
}
});
},
@@ -1212,7 +1211,7 @@ openerp.web.EmbeddedClient = openerp.web.Widget.extend({
self.am.do_action(action);
});
- },
+ }
});
diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js
index b36e576ae47..3005fc80d13 100644
--- a/addons/web/static/src/js/core.js
+++ b/addons/web/static/src/js/core.js
@@ -491,7 +491,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(payload),
- processData: false,
+ processData: false
}, url);
if (this.synch)
ajax.async = false;
@@ -502,7 +502,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
// extracted from payload to set on the url
var data = {
session_id: this.session_id,
- id: payload.id,
+ id: payload.id
};
url.url = this.get_url(url.url);
var ajax = _.extend({
@@ -864,7 +864,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
} finally {
this.synch = synch;
}
- },
+ }
});
/**
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index 447b95d17cf..bb53fb2175a 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -829,9 +829,9 @@ openerp.web.Model = openerp.web.CallbackEnabled.extend({
model: this.model_name,
method: method,
args: args,
- kwargs: kwargs,
+ kwargs: kwargs
});
- },
+ }
});
openerp.web.CompoundContext = openerp.web.Class.extend({
diff --git a/addons/web/static/src/js/data_export.js b/addons/web/static/src/js/data_export.js
index 78be735edc7..3d15a4e3607 100644
--- a/addons/web/static/src/js/data_export.js
+++ b/addons/web/static/src/js/data_export.js
@@ -364,9 +364,8 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
on_click_export_data: function() {
var self = this;
var exported_fields = this.$element.find('#fields_list option').map(function () {
- var name = self.records[this.value] || this.value
// DOM property is textContent, but IE8 only knows innerText
- return {name: this.value,
+ return {name: self.records[this.value] || this.value,
label: this.textContent || this.innerText};
}).get();
diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js
index bf920380ff9..6e58886fadd 100644
--- a/addons/web/static/src/js/view_editor.js
+++ b/addons/web/static/src/js/view_editor.js
@@ -806,7 +806,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
'widget' : {'name':'widget', 'string': 'widget', 'type': 'selection'},
'colors' : {'name':'colors', 'string': 'Colors', 'type': 'char'},
'editable' : {'name':'editable', 'string': 'Editable', 'type': 'selection', 'selection': [["",""],["top","Top"],["bottom", "Bottom"]]},
- 'groups' : {'name':'groups', 'string': 'Groups', 'type': 'seleciton_multi'},
+ 'groups' : {'name':'groups', 'string': 'Groups', 'type': 'seleciton_multi'}
};
var arch_val = self.get_object_by_id(this.one_object.clicked_tr_id,this.one_object['main_object'], []);
this.edit_node_dialog.$element.append('<table id="rec_table" style="width:400px" class="oe_forms"></table>');
@@ -928,7 +928,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
type: 'ir.actions.act_window',
target: "new",
flags: {
- action_buttons: true,
+ action_buttons: true
}
}
var action_manager = new openerp.web.ActionManager(self);
@@ -982,7 +982,7 @@ openerp.web.ViewEditor.Field = openerp.web.Class.extend({
},
render: function() {
return _.str.sprintf("<td id = %s>%s</td>", this.name, QWeb.render(this.template, {widget: this}))
- },
+ }
});
openerp.web.ViewEditor.FieldBoolean = openerp.web.ViewEditor.Field.extend({
template : "vieweditor_boolean",
@@ -1084,7 +1084,7 @@ var _PROPERTIES = {
'action' : ['name', 'string', 'colspan', 'groups'],
'tree' : ['string', 'colors', 'editable', 'link', 'limit', 'min_rows'],
'graph' : ['string', 'type'],
- 'calendar' : ['string', 'date_start', 'date_stop', 'date_delay', 'day_length', 'color', 'mode'],
+ 'calendar' : ['string', 'date_start', 'date_stop', 'date_delay', 'day_length', 'color', 'mode']
};
var _CHILDREN = {
'form': ['notebook', 'group', 'field', 'label', 'button','board', 'newline', 'separator'],
@@ -1100,7 +1100,7 @@ var _CHILDREN = {
'label': [],
'button' : [],
'newline': [],
- 'separator': [],
+ 'separator': []
};
var _ICONS = ['','STOCK_ABOUT', 'STOCK_ADD', 'STOCK_APPLY', 'STOCK_BOLD',
'STOCK_CANCEL', 'STOCK_CDROM', 'STOCK_CLEAR', 'STOCK_CLOSE', 'STOCK_COLOR_PICKER',
@@ -1134,6 +1134,6 @@ openerp.web.ViewEditor.property_widget = new openerp.web.Registry({
'seleciton_multi' : 'openerp.web.ViewEditor.FieldSelectMulti',
'selection' : 'openerp.web.ViewEditor.FieldSelect',
'char' : 'openerp.web.ViewEditor.FieldChar',
- 'float' : 'openerp.web.ViewEditor.FieldFloat',
+ 'float' : 'openerp.web.ViewEditor.FieldFloat'
});
};
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index ebe1ca26785..ebcbfc18100 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -40,7 +40,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
this.fields = {};
this.fields_order = [];
this.datarecord = {};
- this.show_invalid = true;
this.default_focus_field = null;
this.default_focus_button = null;
this.registry = openerp.web.form.widgets;
@@ -179,7 +178,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
});
return $.when.apply(null, set_values).pipe(function() {
if (!record.id) {
- self.show_invalid = false;
// New record: Second pass in order to trigger the onchanges
// respecting the fields order defined in the view
_.each(self.fields_order, function(field_name) {
@@ -192,7 +190,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
}
self.on_form_changed();
self.is_initialized.resolve();
- self.show_invalid = true;
self.do_update_pager(record.id == null);
if (self.sidebar) {
self.sidebar.attachments.do_update();
@@ -429,7 +426,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
f = self.fields[f];
if (!f.is_valid()) {
form_invalid = true;
- f.update_dom();
+ f.update_dom(true);
if (!first_invalid_field) {
first_invalid_field = f;
}
@@ -716,9 +713,11 @@ openerp.web.form.compute_domain = function(expr, fields) {
stack.push(field_value >= val);
break;
case 'in':
+ if (!_.isArray(val)) val = [val];
stack.push(_(val).contains(field_value));
break;
case 'not in':
+ if (!_.isArray(val)) val = [val];
stack.push(!_(val).contains(field_value));
break;
default:
@@ -791,6 +790,11 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form.
return QWeb.render(template, { "widget": this });
},
do_attach_tooltip: function(widget, trigger, options) {
+ if ($.browser.mozilla && parseInt($.browser.version.split('.')[0], 10) < 2) {
+ // Unknown bug in old version of firefox :
+ // input type=text onchange event not fired when tootip is shown
+ return;
+ }
widget = widget || this;
trigger = trigger || this.$element;
options = _.extend({
@@ -1063,7 +1067,6 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
this.execute_action().always(function() {
self.force_disabled = false;
self.check_disable();
- $.tipTipClear();
});
},
execute_action: function() {
@@ -1075,17 +1078,17 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
title: _t('Confirm'),
modal: true,
buttons: [
+ {text: _t("Cancel"), click: function() {
+ def.resolve();
+ $(this).dialog("close");
+ }
+ },
{text: _t("Ok"), click: function() {
self.on_confirmed().then(function() {
def.resolve();
});
$(this).dialog("close");
}
- },
- {text: _t("Cancel"), click: function() {
- def.resolve();
- $(this).dialog("close");
- }
}
]
});
@@ -1116,7 +1119,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
});
},
update_dom: function() {
- this._super();
+ this._super.apply(this, arguments);
this.check_disable();
},
check_disable: function() {
@@ -1238,7 +1241,7 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
get_on_change_value: function() {
return this.get_value();
},
- update_dom: function() {
+ update_dom: function(show_invalid) {
this._super.apply(this, arguments);
if (this.field.translate) {
this.$element.find('.oe_field_translate').toggle(!!this.view.datarecord.id);
@@ -1246,7 +1249,7 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
if (!this.disable_utility_classes) {
this.$element.toggleClass('disabled', this.readonly);
this.$element.toggleClass('required', this.required);
- if (this.view.show_invalid) {
+ if (show_invalid) {
this.$element.toggleClass('invalid', !this.is_valid());
}
}
@@ -1259,7 +1262,7 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
this.view.do_onchange(this);
this.view.on_form_changed();
} else {
- this.update_dom();
+ this.update_dom(true);
}
},
validate: function() {
@@ -1281,7 +1284,7 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
this.definition_options = JSON.parse(str);
}
return this.definition_options;
- },
+ }
});
openerp.web.form.FieldChar = openerp.web.form.Field.extend({
@@ -2424,7 +2427,7 @@ openerp.web.form.One2ManyListView = openerp.web.ListView.extend({
var self = this;
var def = $.Deferred().then(callback).then(function() {self.o2m.view.reload();});
return this._super(name, id, _.bind(def.resolve, def));
- },
+ }
});
openerp.web.form.One2ManyFormView = openerp.web.FormView.extend({
@@ -3214,7 +3217,6 @@ openerp.web.form.widgets = new openerp.web.Registry({
'email' : 'openerp.web.form.FieldEmail',
'url' : 'openerp.web.form.FieldUrl',
'text' : 'openerp.web.form.FieldText',
- 'text_wiki' : 'openerp.web.form.FieldText',
'date' : 'openerp.web.form.FieldDate',
'datetime' : 'openerp.web.form.FieldDatetime',
'selection' : 'openerp.web.form.FieldSelection',
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index aa970c31649..1f8a6020f46 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -1316,19 +1316,24 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
if (!self.datagroup.openable) {
view.configure_pager(dataset);
} else {
- var pages = Math.ceil(dataset.ids.length / limit);
- self.$row
- .find('.oe-pager-state')
- .text(_.str.sprintf(_t("%(page)d/%(page_count)d"), {
- page: page + 1,
- page_count: pages
- }))
- .end()
- .find('button[data-pager-action=previous]')
- .attr('disabled', page === 0)
- .end()
- .find('button[data-pager-action=next]')
- .attr('disabled', page === pages - 1);
+ if (dataset.ids.length == records.length) {
+ // only one page
+ self.$row.find('td.oe-group-pagination').empty();
+ } else {
+ var pages = Math.ceil(dataset.ids.length / limit);
+ self.$row
+ .find('.oe-pager-state')
+ .text(_.str.sprintf(_t("%(page)d/%(page_count)d"), {
+ page: page + 1,
+ page_count: pages
+ }))
+ .end()
+ .find('button[data-pager-action=previous]')
+ .attr('disabled', page === 0)
+ .end()
+ .find('button[data-pager-action=next]')
+ .attr('disabled', page === pages - 1);
+ }
}
self.records.add(records, {silent: true});
diff --git a/addons/web/static/src/js/view_page.js b/addons/web/static/src/js/view_page.js
index d3ee79effca..31190d70f85 100644
--- a/addons/web/static/src/js/view_page.js
+++ b/addons/web/static/src/js/view_page.js
@@ -241,7 +241,6 @@ openerp.web.page = function (openerp) {
'email': 'openerp.web.page.FieldEmailReadonly',
'url': 'openerp.web.page.FieldUrlReadonly',
'text': 'openerp.web.page.FieldCharReadonly',
- 'text_wiki' : 'openerp.web.page.FieldCharReadonly',
'date': 'openerp.web.page.FieldCharReadonly',
'datetime': 'openerp.web.page.FieldCharReadonly',
'selection' : 'openerp.web.page.FieldSelectionReadonly',
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 5158fda62c2..b119e5aae3c 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -70,7 +70,8 @@
</tr>
<tr>
<td><label for="db_name">New database name:</label></td>
- <td><input type="text" name="db_name" class="required"/></td>
+ <td><input type="text" name="db_name"
+ class="required" matches="^[a-zA-Z][a-zA-Z0-9_]+$"/></td>
</tr>
<tr>
<td><label for="demo_data">Load Demonstration data:</label></td>
@@ -553,16 +554,21 @@
t-att-data-id="record.id" t-att-data-level="level + 1">
<t t-set="children" t-value="record[children_field]"/>
<t t-set="class" t-value="children and children.length ? 'treeview-tr' : 'treeview-td'"/>
+ <t t-set="style" t-value="'background-position: ' + 19*level + 'px; padding-left: ' + 19*level + 'px;'"/>
<td t-foreach="fields_view" t-as="field"
t-if="!field.attrs.modifiers.tree_invisible"
t-att-data-id="record.id"
- t-att-style="color_for(record) + (!field_index ? 'background-position: ' + 19*level + 'px; padding-left: ' + 19*level + 'px;' : '')"
- t-att-class="class">
- <span t-if="!field.attrs.modifiers.invisible">
+ t-att-style="color_for(record) + style "
+ t-att-class="(fields[field.attrs.name].type === 'float') or (fields[field.attrs.name].type === 'integer')
+ ? (class +' ' +'oe-number') : class">
+
+ <span t-if="!field.attrs.modifiers.invisible" >
<t t-esc="render(record[field.attrs.name], fields[field.attrs.name])" />
</span>
+
<t t-set="class" t-value="'treeview-td'"/>
+ <t t-set="style" t-value="''"/>
</td>
</tr>
@@ -1717,32 +1723,18 @@
<t t-name="About-Page">
<div>
- <a class="oe_activate_debug_mode" href="?debug">Debug mode</a>
- <h1>OpenERP Web</h1>
- <h3 style="padding:0 5px 5px">Version <t t-esc="version_info.version"/></h3>
+ <a class="oe_activate_debug_mode" href="?debug" style="float:right; font-size: 80%;">Activate the developper mode</a>
+ <h1 style="margin:0;">OpenERP</h1>
+ <h3 style="margin:15px 0;padding:0;">Version <t t-esc="version_info.version"/></h3>
<p>
- Copyright © 2011-TODAY OpenERP SA. All Rights Reserved.<br />
+ Copyright © 2004-TODAY OpenERP SA. All Rights Reserved.<br />
OpenERP is a trademark of the <a target="_blank" href="http://openerp.com/" style="text-decoration: underline;">OpenERP SA Company</a>.
</p>
<p>
Licenced under the terms of <a target="_blank" href="http://www.gnu.org/licenses/agpl.html" style="text-decoration: underline;">GNU Affero General Public License</a>
</p>
- <br />
- <h1>About OpenERP</h1>
- <p>
- <a target="_blank" href="http://openerp.com/" style="text-decoration: underline;">OpenERP</a> is a free enterprise-scale software system that is designed to boost
- productivity and profit through data integration. It connects, improves and
- manages business processes in areas such as sales, finance, supply chain,
- project management, production, services, CRM, etc...
- </p>
- <p>
- The system is platform-independent, and can be installed on Windows, Mac OS X,
- and various Linux and other Unix-based distributions. Its architecture enables
- new functionality to be rapidly created, modifications to be made to a
- production system and migration to a new version to be straightforward.
- </p>
<p>
- Depending on your needs, OpenERP is available through a web or application client.
+ For more information visit <a target="_blank" href="http://openerp.com/" style="text-decoration: underline;">OpenERP.com</a>
</p>
</div>
</t>