summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorThibault Delavallée <tde@openerp.com>2013-03-13 11:17:56 +0100
committerThibault Delavallée <tde@openerp.com>2013-03-13 11:17:56 +0100
commit408144864b8a01246729657aa6b096f83dae7c88 (patch)
tree1bac2da0fcbe382600a3d42fce39f7284c62b504 /addons/web/static/src
parent459fce0150981269e668fda52001463269f58659 (diff)
parentf79f6a5a25a0708e662f2deed4a54c704c6872b5 (diff)
[MERGE] Sync with 7.0
bzr revid: tde@openerp.com-20130313101756-r0b41kr2c4sxzfm8
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/css/base.css12
-rw-r--r--addons/web/static/src/css/base.sass5
-rw-r--r--addons/web/static/src/js/chrome.js97
-rw-r--r--addons/web/static/src/js/coresetup.js4
-rw-r--r--addons/web/static/src/js/search.js2
-rw-r--r--addons/web/static/src/js/view_form.js22
-rw-r--r--addons/web/static/src/xml/base.xml44
7 files changed, 133 insertions, 53 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index b0b0db61be3..971a68f0108 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -1263,7 +1263,7 @@
color: white;
padding: 2px 4px;
margin: 1px 6px 0 0;
- border: 1px solid lightGray;
+ border: 1px solid lightgrey;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
@@ -1295,7 +1295,7 @@
transform: scale(1.1);
}
.openerp .oe_secondary_submenu .oe_active {
- border-top: 1px solid lightGray;
+ border-top: 1px solid lightgrey;
border-bottom: 1px solid #dedede;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
@@ -1806,7 +1806,7 @@
}
.openerp .oe_searchview .oe_searchview_drawer {
position: absolute;
- z-index: 3;
+ z-index: 2;
margin-top: 4px;
top: 100%;
right: -1px;
@@ -2257,7 +2257,7 @@
}
.openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span {
font-size: 80%;
- color: darkGreen;
+ color: darkgreen;
vertical-align: top;
position: relative;
top: -4px;
@@ -3154,6 +3154,10 @@ div.ui-widget-overlay {
border-radius: 3px;
}
+.openerp .db_option_table td {
+ padding-bottom: 10px !important;
+}
+
.openerp_ie .placeholder {
color: #afafb6 !important;
font-style: italic !important;
diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass
index 9b8837a511d..f769c26dc34 100644
--- a/addons/web/static/src/css/base.sass
+++ b/addons/web/static/src/css/base.sass
@@ -2487,6 +2487,11 @@ div.ui-widget-overlay
@include radius(3px)
// }}}
+.openerp
+ .db_option_table
+ td
+ padding-bottom: 10px !important
+
// Internet Explorer 9+ specifics {{{
.openerp_ie
.placeholder
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index 6b16204932b..09ac02e326f 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -478,7 +478,16 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
'login': 'admin',
'password': form_obj['create_admin_pwd'],
'login_successful': function() {
- self.do_action("reload");
+ var action = {
+ type: "ir.actions.client",
+ tag: 'reload',
+ params: {
+ url_search : {
+ db: form_obj['db_name'],
+ },
+ }
+ };
+ self.do_action(action);
},
},
_push_me: false,
@@ -589,6 +598,11 @@ instance.web.client_actions.add("database_manager", "instance.web.DatabaseManage
instance.web.Login = instance.web.Widget.extend({
template: "Login",
remember_credentials: true,
+ events: {
+ 'change input[name=db],select[name=db]': function(ev) {
+ this.set('database_selector', $(ev.currentTarget).val());
+ },
+ },
init: function(parent, action) {
this._super(parent);
@@ -600,18 +614,18 @@ instance.web.Login = instance.web.Widget.extend({
if (_.isEmpty(this.params)) {
this.params = $.bbq.getState(true);
}
+ if (action && action.params && action.params.db) {
+ this.params.db = action.params.db;
+ } else if ($.deparam.querystring().db) {
+ this.params.db = $.deparam.querystring().db;
+ }
+ if (this.params.db) {
+ this.selected_db = this.params.db;
+ }
if (this.params.login_successful) {
this.on('login_successful', this, this.params.login_successful);
}
-
- if (this.has_local_storage && this.remember_credentials) {
- this.selected_db = localStorage.getItem('last_db_login_success');
- this.selected_login = localStorage.getItem('last_login_login_success');
- if (jQuery.deparam(jQuery.param.querystring()).debug !== undefined) {
- this.selected_password = localStorage.getItem('last_password_login_success');
- }
- }
},
start: function() {
var self = this;
@@ -619,10 +633,10 @@ instance.web.Login = instance.web.Widget.extend({
self.$el.find('.oe_login_manage_db').click(function() {
self.do_action("database_manager");
});
+ self.on('change:database_selector', this, function() {
+ this.database_selected(this.get('database_selector'));
+ });
var d = $.when();
- if ($.deparam.querystring().db) {
- self.params.db = $.deparam.querystring().db;
- }
if ($.param.fragment().token) {
self.params.token = $.param.fragment().token;
}
@@ -630,16 +644,44 @@ instance.web.Login = instance.web.Widget.extend({
if (self.params.db && self.params.login && self.params.password) {
d = self.do_login(self.params.db, self.params.login, self.params.password);
} else {
- if (self.params.db) {
- self.on_db_loaded([self.params.db])
- } else {
- d = self.rpc("/web/database/get_list", {}).done(self.on_db_loaded).fail(self.on_db_failed);
- }
+ d = self.rpc("/web/database/get_list", {})
+ .done(self.on_db_loaded)
+ .fail(self.on_db_failed)
+ .always(function() {
+ if (self.selected_db && self.has_local_storage && self.remember_credentials) {
+ self.$("[name=login]").val(localStorage.getItem(self.selected_db + '|last_login') || '');
+ if (self.session.debug) {
+ self.$("[name=password]").val(localStorage.getItem(self.selected_db + '|last_password') || '');
+ }
+ }
+ });
}
return d;
},
+ remember_last_used_database: function(db) {
+ // This cookie will be used server side in order to avoid db reloading on first visit
+ var ttl = 24 * 60 * 60 * 365;
+ document.cookie = [
+ 'last_used_database=' + db,
+ 'path=/',
+ 'max-age=' + ttl,
+ 'expires=' + new Date(new Date().getTime() + ttl * 1000).toGMTString()
+ ].join(';');
+ },
+ database_selected: function(db) {
+ var params = $.deparam.querystring();
+ params.db = db;
+ this.remember_last_used_database(db);
+ this.$('.oe_login_dbpane').empty().text(_t('Loading...'));
+ this.$('[name=login], [name=password]').prop('readonly', true);
+ instance.web.redirect('/?' + $.param(params));
+ },
on_db_loaded: function (result) {
+ var self = this;
this.db_list = result;
+ if (!this.selected_db) {
+ this.selected_db = result[0];
+ }
this.$("[name=db]").replaceWith(QWeb.render('Login.dblist', { db_list: this.db_list, selected_db: this.selected_db}));
if(this.db_list.length === 0) {
this.do_action("database_manager");
@@ -680,17 +722,11 @@ instance.web.Login = instance.web.Widget.extend({
self.hide_error();
self.$(".oe_login_pane").fadeOut("slow");
return this.session.session_authenticate(db, login, password).then(function() {
- if (self.has_local_storage) {
- if(self.remember_credentials) {
- localStorage.setItem('last_db_login_success', db);
- localStorage.setItem('last_login_login_success', login);
- if (jQuery.deparam(jQuery.param.querystring()).debug !== undefined) {
- localStorage.setItem('last_password_login_success', password);
- }
- } else {
- localStorage.setItem('last_db_login_success', '');
- localStorage.setItem('last_login_login_success', '');
- localStorage.setItem('last_password_login_success', '');
+ self.remember_last_used_database(db);
+ if (self.has_local_storage && self.remember_credentials) {
+ localStorage.setItem(db + '|last_login', login);
+ if (self.session.debug) {
+ localStorage.setItem(db + '|last_password', password);
}
}
self.trigger('login_successful');
@@ -748,6 +784,9 @@ instance.web.Reload = function(parent, action) {
var sobj = $.deparam(l.search.substr(1));
sobj.ts = new Date().getTime();
+ if (params.url_search) {
+ sobj = _.extend(sobj, params.url_search);
+ }
var search = '?' + $.param(sobj);
var hash = l.hash;
@@ -1226,7 +1265,7 @@ instance.web.WebClient = instance.web.Client.extend({
},
logo_edit: function(ev) {
var self = this;
- new self.alive(instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"])).then(function(res) {
+ self.alive(new instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"])).then(function(res) {
self.rpc("/web/action/load", { action_id: "base.action_res_company_form" }).done(function(result) {
result.res_id = res['company_id'][0];
result.target = "new";
diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js
index 43d292b66db..dedb4a49710 100644
--- a/addons/web/static/src/js/coresetup.js
+++ b/addons/web/static/src/js/coresetup.js
@@ -89,6 +89,10 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
});
},
session_is_valid: function() {
+ var db = $.deparam.querystring().db;
+ if (db && this.db !== db) {
+ return false;
+ }
return !!this.uid;
},
/**
diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js
index c57f8c43f60..d0dfa9b4bfd 100644
--- a/addons/web/static/src/js/search.js
+++ b/addons/web/static/src/js/search.js
@@ -1197,7 +1197,7 @@ instance.web.search.GroupbyGroup = instance.web.search.FilterGroup.extend({
category: _t("GroupBy"),
icon: this.icon,
values: values,
- field: this.getParent()._s_groupby
+ field: this.view._s_groupby
};
}
});
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 952a1c9d15f..a0eb3968944 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -1892,10 +1892,11 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({
if (this.node.attrs.icon && (! /\//.test(this.node.attrs.icon))) {
this.node.attrs.icon = '/web/static/src/img/icons/' + this.node.attrs.icon + '.png';
}
- this.view.on('view_content_has_changed', this, this.check_disable);
},
start: function() {
this._super.apply(this, arguments);
+ this.view.on('view_content_has_changed', this, this.check_disable);
+ this.check_disable();
this.$el.click(this.on_click);
if (this.node.attrs.help || instance.session.debug) {
this.do_attach_tooltip();
@@ -1930,7 +1931,7 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({
$(self2).dialog("close");
});
}
- },
+ }
],
beforeClose: function() {
def.resolve();
@@ -3306,7 +3307,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
},
focus: function () {
if (!this.get('effective_readonly')) {
- this.$input[0].focus();
+ this.$input && this.$input[0].focus();
}
},
_quick_create: function() {
@@ -3785,8 +3786,12 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
this.o2m.trigger_on_change();
},
is_valid: function () {
- var form = this.editor.form;
-
+ var editor = this.editor;
+ var form = editor.form;
+ // If no edition is pending, the listview can not be invalid (?)
+ if (!editor.record) {
+ return true
+ }
// If the form has not been modified, the view can only be valid
// NB: is_dirty will also be set on defaults/onchanges/whatever?
// oe_form_dirty seems to only be set on actual user actions
@@ -4033,6 +4038,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
if (this.get("effective_readonly"))
return;
var self = this;
+ var ignore_blur = false;
self.$text = this.$("textarea");
self.$text.textext({
plugins : 'tags arrow autocomplete',
@@ -4051,6 +4057,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
if (data.id) {
self.add_id(data.id);
} else {
+ ignore_blur = true;
data.action();
}
},
@@ -4101,10 +4108,13 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
self.$text
.focusin(function () {
self.trigger('focused');
+ ignore_blur = false;
})
.focusout(function() {
self.$text.trigger("setInputData", "");
- self.trigger('blurred');
+ if (!ignore_blur) {
+ self.trigger('blurred');
+ }
}).keydown(function(e) {
if (e.which === $.ui.keyCode.TAB && self._drop_shown) {
self.$text.textext()[0].autocomplete().selectFromDropdown();
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 529b7809d46..970659dfa43 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -71,9 +71,9 @@
</div>
<ul>
<li>Username</li>
- <li><input name="login" type="text" t-att-value="widget.selected_login || ''" autofocus="autofocus"/></li>
+ <li><input name="login" type="text" value="" autofocus="autofocus"/></li>
<li>Password</li>
- <li><input name="password" type="password" t-att-value="widget.selected_password || ''"/></li>
+ <li><input name="password" type="password" value=""/></li>
<li><button name="submit">Log in</button></li>
</ul>
</form>
@@ -106,33 +106,47 @@
<div class="oe_view_manager_header" style="padding: 8px;">
<div class="oe_header_row">
<h2 class="oe_view_title">
- <span class="oe_view_title_text oe_breadcrumb_title">Create Database</span>
+ <span class="oe_view_title_text oe_breadcrumb_title">Create a New Database</span>
</h2>
- <button type="submit" class="oe_button oe_highlight db_create">Create</button>
</div>
</div>
</div>
- <table align="center" class="db_option_table">
+ <p class="oe_grey" style="margin: 10px">
+ Fill in this form to create an OpenERP database. You can
+ create databases for different companies or for different
+ goals (testing, production). Once the database is created,
+ you will be able to install your first application.
+ </p>
+ <p class="oe_grey" style="margin: 10px">
+ By default, the master password is 'admin'. This password
+ is required to created, delete dump or restore databases.
+ </p>
+ <table class="db_option_table" style="margin: 10px">
<tr>
<td><label for="super_admin_pwd">Master password:</label></td>
- <td><input type="password" name="super_admin_pwd" class="required" value="admin" /></td>
+ <td>
+ <input type="text" name="super_admin_pwd" class="required" value="admin"/>
+ </td>
</tr>
<tr>
- <td><label for="db_name">New database name:</label></td>
- <td><input type="text" name="db_name" class="required" matches="^[a-zA-Z0-9][a-zA-Z0-9_-]+$" autofocus="true"/></td>
+ <td><label for="db_name">Select a database name:</label></td>
+ <td>
+ <input type="text" name="db_name" class="required" matches="^[a-zA-Z0-9][a-zA-Z0-9_-]+$" autofocus="true" placeholder="e.g. mycompany"/>
+ </td>
</tr>
<tr>
- <td><label for="demo_data">Load Demonstration data:</label></td>
+ <td><label for="demo_data">Load demonstration data:</label></td>
<td class="oe_form_group_cell">
- <span class="oe_form_field oe_form_field_boolean">
+ <span class="oe_form_field oe_form_field_boolean oe_grey" >
<input type="checkbox" name="demo_data" />
+ Check this box to evaluate OpenERP.
</span>
</td>
</tr>
<tr>
<td><label for="db_lang">Default language:</label></td>
- <td class="oe_form_field oe_form_field_selection ">
- <select name="db_lang" t-if="widget.lang_list">
+ <td class="oe_form_field oe_form_field_selection">
+ <select name="db_lang" t-if="widget.lang_list" class="oe_inline">
<t t-foreach="widget.lang_list" t-as="lang">
<option t-att-value="lang[0]" t-att-selected="lang[0] === 'en_US' ? 'selected' : undefined">
<t t-esc="lang[1]" />
@@ -142,13 +156,17 @@
</td>
</tr>
<tr>
- <td><label for="create_admin_pwd">Admin password:</label></td>
+ <td><label for="create_admin_pwd">Choose a password:</label></td>
<td><input type="password" name="create_admin_pwd" class="required" /></td>
</tr>
<tr>
<td><label for="create_confirm_pwd">Confirm password:</label></td>
<td><input type="password" name="create_confirm_pwd" class="required" equalTo="input[name=create_admin_pwd]"/></td>
</tr>
+ <tr>
+ <td></td>
+ <td><button type="submit" class="oe_button oe_highlight db_create">Create Database</button></td>
+ </tr>
</table>
</form>
<form id="db_duplicate" name="duplicate_db_form" style="display: none;">