summaryrefslogtreecommitdiff
path: root/addons/web_mobile/static/src
diff options
context:
space:
mode:
authorniv-openerp <nicolas.vanhoren@openerp.com>2011-08-30 14:21:37 +0200
committerniv-openerp <nicolas.vanhoren@openerp.com>2011-08-30 14:21:37 +0200
commit558a038420cd6c49fbf5feaf1c656d2be27beef6 (patch)
treeedb01144cfa6d0d6fc02dec2170a8e00d58a3d28 /addons/web_mobile/static/src
parentbdd0c7cf3f6d3e065c55bd0292e29bd554a0e8b1 (diff)
parent458dacea36f1696f6a23cd713b96aa994cef9595 (diff)
[merge] many improvements to the mobile client
bzr revid: nicolas.vanhoren@openerp.com-20110830122137-xd0y347nr1ewaxve
Diffstat (limited to 'addons/web_mobile/static/src')
-rw-r--r--addons/web_mobile/static/src/css/web_mobile.css20
-rw-r--r--addons/web_mobile/static/src/js/chrome_mobile.js302
-rw-r--r--addons/web_mobile/static/src/js/form_mobile.js105
-rw-r--r--addons/web_mobile/static/src/js/list_mobile.js12
-rw-r--r--addons/web_mobile/static/src/js/web_mobile.js4
-rwxr-xr-xaddons/web_mobile/static/src/web_mobile.html21
-rw-r--r--addons/web_mobile/static/src/xml/web_mobile.xml344
7 files changed, 452 insertions, 356 deletions
diff --git a/addons/web_mobile/static/src/css/web_mobile.css b/addons/web_mobile/static/src/css/web_mobile.css
index 18cf93f4d66..4017d5ae7e3 100644
--- a/addons/web_mobile/static/src/css/web_mobile.css
+++ b/addons/web_mobile/static/src/css/web_mobile.css
@@ -2,3 +2,23 @@
.ui-collapsible-content-expanded {
display: block;
}
+
+.login_error_message {
+ display: none;
+ background-color: #9A0404;
+ border-radius: 12px;
+ -moz-border-radius: 12px;
+ -webkit-border-radius: 12px;
+ color: white;
+ font-family: Ubuntu, Helvetica, sans-serif;
+ font-size: 16px;
+ padding: 5px;
+ margin-top: 5px;
+ text-align: center;
+}
+.login_invalid .login_error_message {
+ display: block;
+}
+.login_valid .login_error_message {
+ display: none;
+}
diff --git a/addons/web_mobile/static/src/js/chrome_mobile.js b/addons/web_mobile/static/src/js/chrome_mobile.js
index 622649bb5f8..551856e01fb 100644
--- a/addons/web_mobile/static/src/js/chrome_mobile.js
+++ b/addons/web_mobile/static/src/js/chrome_mobile.js
@@ -1,4 +1,130 @@
+/*---------------------------------------------------------
+ * OpenERP Web Mobile chrome
+ *---------------------------------------------------------*/
+
openerp.web_mobile.chrome_mobile = function(openerp) {
+
+openerp.web_mobile.mobilewebclient = function(element_id) {
+ // TODO Helper to start mobile webclient rename it openerp.base.webclient
+ var client = new openerp.web_mobile.MobileWebClient(element_id);
+ client.start();
+ return client;
+};
+
+openerp.web_mobile.MobileWebClient = openerp.base.Widget.extend({
+ init: function(element_id) {
+ var self = this;
+ this._super(null, element_id);
+ QWeb.add_template("xml/web_mobile.xml");
+ var params = {};
+ this.$element.html(QWeb.render("WebClient", {}));
+ this.session = new openerp.base.Session("oe_errors");
+ this.crashmanager = new openerp.base.CrashManager(this);
+ this.login = new openerp.web_mobile.Login(this, "oe_app");
+// this.session.on_session_invalid.add(this.login.do_ask_login);
+ },
+ start: function() {
+ this.session.start();
+ this.login.start();
+ }
+});
+
+openerp.web_mobile.Login = openerp.base.Widget.extend({
+ init: function(session, element_id) {
+ this._super(session, element_id);
+ },
+ start: function() {
+ var self = this;
+ jQuery("#oe_header").children().remove();
+ this.rpc("/base/database/get_list", {}, function(result) {
+ var selection = new openerp.web_mobile.Selection();
+ self.db_list = result.db_list;
+ self.$element.html(QWeb.render("Login", self));
+ self.$element.find("#login_btn").click(self.on_login);
+ $.mobile.initializePage();
+ });
+ this.$element
+ .removeClass("login_invalid");
+ },
+ on_login: function(ev) {
+ ev.preventDefault();
+ var self = this;
+ var $e = this.$element;
+ var db = $e.find("div select[name=database]").val();
+ var login = $e.find("div input[name=login]").val();
+ var password = $e.find("div input[name=password]").val();
+ //$e.hide();
+ // Should hide then call callback
+ this.session.session_login(db, login, password, function() {
+ if(self.session.session_is_valid()) {
+ self.on_login_valid();
+ } else {
+ self.on_login_invalid();
+ }
+ });
+ },
+ on_login_invalid: function() {
+ this.$element
+ .removeClass("login_valid")
+ .addClass("login_invalid")
+ .show();
+ },
+ on_login_valid: function() {
+ this.$element
+ .removeClass("login_invalid")
+ .addClass("login_valid");
+ //.hide();
+ this.homepage = new openerp.web_mobile.HomePage(this, "oe_app");
+ this.homepage.start();
+ },
+ do_ask_login: function(continuation) {
+ this.on_login_invalid();
+ this.on_login_valid.add({
+ position: "last",
+ unique: true,
+ callback: continuation
+ });
+ }
+});
+
+openerp.web_mobile.HomePage = openerp.base.Widget.extend({
+ init: function(session, element_id) {
+ this._super(session, element_id);
+ },
+ start: function() {
+ this.$element.html(QWeb.render("HomePage", {}));
+ this.header = new openerp.web_mobile.Header(this, "oe_header");
+ this.shortcuts = new openerp.web_mobile.Shortcuts(this, "oe_shortcuts");
+ this.menu = new openerp.web_mobile.Menu(this, "oe_menu", "oe_secondary_menu");
+ this.options = new openerp.web_mobile.Options(this, "oe_options");
+ this.header.start();
+ this.shortcuts.start();
+ this.menu.start();
+ this.options.start();
+ jQuery("#oe_header").find("h1").html('Home');
+ this.$element.find("a").click(this.on_clicked);
+ }
+});
+
+openerp.web_mobile.Header = openerp.base.Widget.extend({
+ init: function(session, element_id) {
+ this._super(session, element_id);
+ },
+ start: function() {
+ var self = this;
+ self.$element.html(QWeb.render("Header", this));
+ self.$element.find("a").click(this.on_clicked);
+ },
+ on_clicked: function(ev) {
+ $opt = $(ev.currentTarget);
+ current_id = $opt.attr('id');
+ if (current_id == 'home') {
+ this.homepage = new openerp.web_mobile.HomePage(this, "oe_app");
+ this.homepage.start();
+ }
+ }
+});
+
openerp.web_mobile.Shortcuts = openerp.base.Widget.extend({
init: function(session, element_id) {
this._super(session, element_id);
@@ -15,27 +141,44 @@ openerp.web_mobile.Shortcuts = openerp.base.Widget.extend({
id = $shortcut.data('menu');
res_id = $shortcut.data('res');
jQuery("#oe_header").find("h1").html($shortcut.data('name'));
- this.listview = new openerp.web_mobile.ListView(this.session, "oe_app", res_id);
+ this.listview = new openerp.web_mobile.ListView(this, "oe_app", res_id);
this.listview.start();
}
});
-openerp.web_mobile.Header = openerp.base.Widget.extend({
- init: function(session, element_id) {
+
+openerp.web_mobile.Menu = openerp.base.Widget.extend({
+ init: function(session, element_id, secondary_menu_id) {
this._super(session, element_id);
+ this.secondary_menu_id = secondary_menu_id;
+ this.$secondary_menu = $("#" + secondary_menu_id);
+ this.menu = false;
},
start: function() {
- this.$element.html(QWeb.render("Header", this));
- this.$element.find("a").click(this.on_clicked);
+ this.rpc("/base/menu/load", {}, this.on_loaded);
},
- on_clicked: function(ev) {
- $opt = $(ev.currentTarget);
- current_id = $opt.attr('id');
- if (current_id == 'home') {
- this.homepage = new openerp.web_mobile.Login(this.session, "oe_app");
- this.homepage.on_login_valid();
+ on_loaded: function(data) {
+ this.data = data;
+ this.$element.html(QWeb.render("Menu", this.data));
+ this.$element.add(this.$secondary_menu).find("a").click(this.on_menu_click);
+ },
+ on_menu_click: function(ev, id) {
+ $menu = $(ev.currentTarget);
+ id = $menu.data('menu');
+ for (var i = 0; i < this.data.data.children.length; i++) {
+ if (this.data.data.children[i].id == id) {
+ this.children = this.data.data.children[i];
+ }
}
+ jQuery("#oe_header").find("h1").html($menu.data('name'));
+ this.$element
+ .removeClass("login_valid")
+ .addClass("secondary_menu");
+ //.hide();
+ this.secondary = new openerp.web_mobile.Secondary(this, "oe_app", this.children);
+ this.secondary.start();
}
});
+
openerp.web_mobile.Secondary = openerp.base.Widget.extend({
init: function(session, element_id, secondary_menu_id) {
this._super(session, element_id);
@@ -55,57 +198,24 @@ openerp.web_mobile.Secondary = openerp.base.Widget.extend({
}
}
jQuery("#oe_header").find("h1").html($menu.data('name'));
-
var child_len = this.children.children.length;
if (child_len > 0) {
this.$element
.removeClass("secondary_menu")
.addClass("content_menu");
//.hide();
- this.secondary = new openerp.web_mobile.Secondary(this.session, "oe_app", this.children);
+ this.secondary = new openerp.web_mobile.Secondary(this, "oe_app", this.children);
this.secondary.start();
}
else {
if (id) {
- this.listview = new openerp.web_mobile.ListView(this.session, "oe_app", id);
+ this.listview = new openerp.web_mobile.ListView(this, "oe_app", id);
this.listview.start();
}
}
}
});
-openerp.web_mobile.Menu = openerp.base.Widget.extend({
- init: function(session, element_id, secondary_menu_id) {
- this._super(session, element_id);
- this.secondary_menu_id = secondary_menu_id;
- this.$secondary_menu = $("#" + secondary_menu_id);
- this.menu = false;
- },
- start: function() {
- this.rpc("/base/menu/load", {}, this.on_loaded);
- },
- on_loaded: function(data) {
- this.data = data;
- this.$element.html(QWeb.render("Menu", this.data));
- this.$element.add(this.$secondary_menu).find("a").click(this.on_menu_click);
- },
- on_menu_click: function(ev, id) {
- $menu = $(ev.currentTarget);
- id = $menu.data('menu');
- for (var i = 0; i < this.data.data.children.length; i++) {
- if (this.data.data.children[i].id == id) {
- this.children = this.data.data.children[i];
- }
- }
- jQuery("#oe_header").find("h1").html($menu.data('name'));
- this.$element
- .removeClass("login_valid")
- .addClass("secondary_menu");
- //.hide();
- this.secondary = new openerp.web_mobile.Secondary(this.session, "oe_app", this.children);
- this.secondary.start();
- }
-});
openerp.web_mobile.Options = openerp.base.Widget.extend({
init: function(session, element_id) {
this._super(session, element_id);
@@ -117,101 +227,23 @@ openerp.web_mobile.Options = openerp.base.Widget.extend({
},
on_logout: function(ev) {
this.session.logout();
- this.login = new openerp.web_mobile.Login(this.session, "oe_app");
- this.login.start();
+// this.login = new openerp.web_mobile.Login(this, "oe_app");
+// this.login.start();
}
});
-openerp.web_mobile.Login = openerp.base.Widget.extend({
- init: function(session, element_id) {
- this._super(session, element_id);
- },
- start: function() {
- var self = this;
-
- jQuery("#oe_header").children().remove();
- this.rpc("/base/database/get_list", {}, function(result) {
- self.db_list = result.db_list;
- self.$element.html(QWeb.render("Login", self));
- self.$element.find('#database').click(self.on_db_select);
- self.$element.find("#login").click(self.on_login);
- $.mobile.initializePage();
- })
- },
- on_db_select: function(ev) {
- var db = this.$element.find("#database option:selected").val();
- jQuery("#db_text").html(db);
- },
- on_login: function(ev) {
- ev.preventDefault();
- var self = this;
- var $e = this.$element;
- var db = $e.find("div select[name=database]").val();
- var login = $e.find("div input[name=login]").val();
- var password = $e.find("div input[name=password]").val();
- //$e.hide();
- // Should hide then call callback
- this.session.session_login(db, login, password, function() {
- if(self.session.session_is_valid()) {
- self.on_login_valid();
- } else {
- self.on_login_invalid();
- }
- });
- },
- on_login_invalid: function() {
- this.$element
- .removeClass("login_valid")
- .addClass("login_invalid")
- .show();
- },
- on_login_valid: function() {
- this.$element
- .removeClass("login_invalid")
- .addClass("login_valid");
- //.hide();
- this.$element.html(QWeb.render("HomePage", {}));
- this.header = new openerp.web_mobile.Header(this.session, "oe_header");
- this.shortcuts = new openerp.web_mobile.Shortcuts(this.session, "oe_shortcuts");
- this.menu = new openerp.web_mobile.Menu(this.session, "oe_menu", "oe_secondary_menu");
- this.options = new openerp.web_mobile.Options(this.session, "oe_options");
- this.header.start();
- this.shortcuts.start();
- this.menu.start();
- this.options.start();
- jQuery("#oe_header").find("h1").html('Home');
+openerp.web_mobile.Selection = openerp.base.Widget.extend({
+ init: function (){
+ this._super();
},
- do_ask_login: function(continuation) {
- this.on_login_invalid();
- this.on_login_valid.add({
- position: "last",
- unique: true,
- callback: continuation
- });
- }
-});
-openerp.web_mobile.MobileWebClient = openerp.base.Widget.extend({
- init: function(element_id) {
+ start: function(){
+ this._super();
var self = this;
- this._super(null, element_id);
- QWeb.add_template("xml/web_mobile.xml");
- var params = {};
-
- this.$element.html(QWeb.render("WebClient", {}));
- this.session = new openerp.base.Session("oe_errors");
- this.crashmanager = new openerp.base.CrashManager(this.session);
- this.login = new openerp.web_mobile.Login(this.session, "oe_app");
- this.session.on_session_invalid.add(this.login.do_ask_login);
},
- start: function() {
- this.session.start();
- this.login.start();
+ on_select_option: function(ev){
+ ev.preventDefault();
+ var $this = ev.currentTarget;
+ $($this).prev().find(".ui-btn-text").html($($this).find("option:selected").text());
}
});
-openerp.web_mobile.mobilewebclient = function(element_id) {
- // TODO Helper to start mobile webclient rename it openerp.base.webclient
- var client = new openerp.web_mobile.MobileWebClient(element_id);
- client.start();
- return client;
-};
}
diff --git a/addons/web_mobile/static/src/js/form_mobile.js b/addons/web_mobile/static/src/js/form_mobile.js
index 793d944ddcd..4a3e2167c02 100644
--- a/addons/web_mobile/static/src/js/form_mobile.js
+++ b/addons/web_mobile/static/src/js/form_mobile.js
@@ -1,85 +1,104 @@
+/*---------------------------------------------------------
+ * OpenERP Web Mobile Form View
+ *---------------------------------------------------------*/
+
openerp.web_mobile.form_mobile = function (openerp) {
+
openerp.web_mobile.FormView = openerp.base.Widget.extend({
init: function(session, element_id, list_id, action) {
this._super(session, element_id);
this.list_id = list_id;
this.action = action;
+ this.content_expanded_class = "ui-collapsible-content ui-collapsible-content-expanded";
+ this.content_collapsed_class = "ui-collapsible-content ui-collapsible-content-collapsed";
+ this.expanded_class = "ui-collapsible-content-expanded";
+ this.collapsed_class = "ui-collapsible-content-collapsed";
+ this.plus_class = "ui-icon-plus";
+ this.minus_class = "ui-icon-minus";
},
start: function() {
var self = this;
id = this.list_id;
model = this.action.res_model;
view_id = this.action.views[1][0];
-
- this.dataset = new openerp.base.DataSetSearch(this.session, this.action.res_model, null, null);
+ this.dataset = new openerp.base.DataSetSearch(this, this.action.res_model, null, null);
this.dataset.read_slice([],{}, function (result) {
-
for (var i = 0; i < result.length; i++) {
if (result[i].id == id) {
var data = result[i];
}
}
self.rpc("/base/formview/load", {"model": model, "view_id": view_id }, function (result) {
+ var fields = result.fields_view.fields;
var view_fields = result.fields_view.arch.children;
var get_fields = self.get_fields(view_fields);
-
+ var selection = new openerp.web_mobile.Selection();
for (var j = 0; j < view_fields.length; j++) {
if (view_fields[j].tag == 'notebook') {
var notebooks = view_fields[j];
}
}
$("#oe_header").find("h1").html(result.fields_view.arch.attrs.string);
- self.$element.html(QWeb.render("FormView", {'get_fields': get_fields, 'notebooks': notebooks || false, 'fields' : result.fields_view.fields, 'values' : data }));
-
+ self.$element.html(QWeb.render("FormView", {'get_fields': get_fields, 'notebooks': notebooks || false, 'fields' : fields, 'values' : data }));
+ self.$element.find('select').change(function(ev){
+ selection.on_select_option(ev);
+ });
self.$element.find('a').click(function(){
-
for (var k = 0; k < notebooks.children.length; k++) {
-
var text = $(this).find('.ui-btn-text').text();
var next = $(this).next();
var span = $(this).find('span .ui-icon');
- var content_expanded_class = "ui-collapsible-content ui-collapsible-content-expanded";
- var content_collapsed_class = "ui-collapsible-content ui-collapsible-content-collapsed";
- var expanded_class = "ui-collapsible-content-expanded";
- var collapsed_class = "ui-collapsible-content-collapsed";
- var plus_class = "ui-icon-plus";
- var minus_class = "ui-icon-minus";
-
if (notebooks.children[k].attrs.string == $.trim(text)) {
get_fields = self.get_fields(notebooks.children[k].children);
-
$(this).parents().find('form').find('div').each( function() {
var prev = $(this).prev();
var trim_class = $.trim($(this).attr('class'));
- if (trim_class == content_expanded_class || trim_class == content_collapsed_class) {
+ if (trim_class == self.content_expanded_class || trim_class == self.content_collapsed_class) {
prev.removeClass('ui-btn-active');
-
if ($.trim(prev.find('.ui-btn-text').text()) != notebooks.children[k].attrs.string) {
- prev.find('span .ui-icon').removeClass(minus_class);
- prev.find('span .ui-icon').addClass(plus_class);
- $(this).removeClass(expanded_class);
- $(this).addClass(collapsed_class);
+ self.expanded($(this),prev.find('span .ui-icon'));
}
}
});
-
- if (next.hasClass(content_collapsed_class)) {
- span.removeClass(plus_class);
- span.addClass(minus_class);
- next.removeClass(collapsed_class);
- next.addClass(expanded_class);
+ if (next.hasClass(self.content_collapsed_class)) {
+ self.collapsed(next,span);
}
- else if (next.hasClass(content_expanded_class)) {
- span.removeClass(minus_class);
- span.addClass(plus_class);
- next.removeClass(expanded_class);
- next.addClass(collapsed_class);
+ else if (next.hasClass(self.content_expanded_class)) {
+ self.expanded(next,span);
}
if (!next.find('.detail').html().length) {
- next.find('.detail').append(QWeb.render("FormView", {'get_fields': get_fields,'fields' : result.fields_view.fields, 'values' : data }));
+ for (var i = 0; i < get_fields.length; i++) {
+ if (fields[get_fields[i].attrs.name].type == 'one2many'){
+ var get_fields_test = self.get_fields(fields[get_fields[i].attrs.name].views.form.arch.children);
+ var fields_test = fields[get_fields[i].attrs.name]['views'].form.fields;
+ var notebook=fields[get_fields[i].attrs.name].views.form.arch;
+ }
+ }
+ if(notebook){
+ next.find('.detail').append(QWeb.render("FormView", {'get_fields': get_fields,'fields' : result.fields_view.fields, 'values' : data,'til': notebook.attrs.string }));
+ }else{
+ next.find('.detail').append(QWeb.render("FormView", {'get_fields': get_fields,'fields' : result.fields_view.fields, 'values' : data }));
+ }
}
+ next.find('.detail').find('a').click(function(){
+ if(next.find('.detail').find('a').next().find('.detail').html().length){
+ if (next.find('.detail').find('a').next().hasClass(self.content_collapsed_class)) {
+ self.collapsed(next.find('.detail').find('a').next(),next.find('.detail').find('a').find('span .ui-icon'));
+ }
+ else if (next.find('.detail').find('a').next().hasClass(self.content_expanded_class)) {
+ self.expanded(next.find('.detail').find('a').next(),next.find('.detail').find('a').find('span .ui-icon'));
+ }
+ }
+ if(!next.find('.detail').find('a').next().find('.detail').html().length){
+ next.find('.detail').find('a').next().find('.detail').append(QWeb.render("FormView", {'get_fields': get_fields_test,'fields' : fields_test, 'values' : data }));
+ self.collapsed(next.find('.detail').find('a').next(),next.find('.detail').find('a').find('span .ui-icon'));
+ }
+ });
}
}
+ self.$element.find('select').change(function(ev){
+ selection.on_select_option(ev);
+ });
});
});
});
@@ -93,12 +112,20 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({
if (view_fields[i].tag == 'group') {
this.get_fields(view_fields[i].children, this.fields);
}
- if (view_fields[i].tag == 'separator') {
- this.get_fields(view_fields[i].children, this.fields);
- }
}
return this.fields;
},
+ collapsed: function(next,span) {
+ span.removeClass(this.plus_class);
+ span.addClass(this.minus_class);
+ next.removeClass(this.collapsed_class);
+ next.addClass(this.expanded_class);
+ },
+ expanded: function(next,span) {
+ span.removeClass(this.minus_class);
+ span.addClass(this.plus_class);
+ next.removeClass(this.expanded_class);
+ next.addClass(this.collapsed_class);
+ }
});
-
-}
+} \ No newline at end of file
diff --git a/addons/web_mobile/static/src/js/list_mobile.js b/addons/web_mobile/static/src/js/list_mobile.js
index 809797bfe0f..b4ba5e08cc3 100644
--- a/addons/web_mobile/static/src/js/list_mobile.js
+++ b/addons/web_mobile/static/src/js/list_mobile.js
@@ -1,4 +1,9 @@
+/*---------------------------------------------------------
+ * OpenERP Web Mobile List View
+ *---------------------------------------------------------*/
+
openerp.web_mobile.list_mobile = function (openerp) {
+
openerp.web_mobile.ListView = openerp.base.Widget.extend({
init: function(session, element_id, list_id) {
this._super(session, element_id);
@@ -35,10 +40,11 @@ openerp.web_mobile.ListView = openerp.base.Widget.extend({
var search_val = '';
}
var self = this;
- var dataset = new openerp.base.DataSetStatic(this.session, this.action.res_model, this.action.context);
+
+ var dataset = new openerp.base.DataSetStatic(this, this.action.res_model, this.action.context);
dataset.domain=[['name','ilike',search_val]];
dataset.name_search(search_val, dataset.domain, 'ilike',false ,function(result){
- self.$element.html(QWeb.render("ListView", {'records' : result.result}));
+ self.$element.html(QWeb.render("ListView", {'records' : result}));
self.$element.find("#searchid").focus();
if(request.term){
self.$element.find("#searchid").val(request.term);
@@ -60,7 +66,7 @@ openerp.web_mobile.ListView = openerp.base.Widget.extend({
$record = $(ev.currentTarget);
var self = this;
id = $record.data('id');
- this.formview = new openerp.web_mobile.FormView(this.session, "oe_app", id, this.action);
+ this.formview = new openerp.web_mobile.FormView(this, "oe_app", id, this.action);
this.formview.start();
}
});
diff --git a/addons/web_mobile/static/src/js/web_mobile.js b/addons/web_mobile/static/src/js/web_mobile.js
index cdf25b22b38..119ffe1916f 100644
--- a/addons/web_mobile/static/src/js/web_mobile.js
+++ b/addons/web_mobile/static/src/js/web_mobile.js
@@ -1,3 +1,7 @@
+/*---------------------------------------------------------
+ * OpenERP Web Mobile
+ *---------------------------------------------------------*/
+
openerp.web_mobile = function(instance) {
openerp.web_mobile.chrome_mobile(instance);
openerp.web_mobile.list_mobile(instance);
diff --git a/addons/web_mobile/static/src/web_mobile.html b/addons/web_mobile/static/src/web_mobile.html
index bd74e5f4f66..6efc28b6532 100755
--- a/addons/web_mobile/static/src/web_mobile.html
+++ b/addons/web_mobile/static/src/web_mobile.html
@@ -3,20 +3,20 @@
<head>
<meta charset="utf-8" />
<title>OpenERP Web Mobile</title>
- <link rel="stylesheet" href="/web_mobile/static/lib/jquery_mobile/css/jquery.mobile-1.0a4.1.css" />
- <script type="text/javascript" src="/base/static/lib/LABjs/LAB.js"></script>
+ <link rel="stylesheet" href="/web_mobile/static/lib/jquery_mobile/css/jquery.mobile-1.0a4.1.css"/>
+ <link rel="stylesheet" href="/web_mobile/static/src/css/web_mobile.css"/>
+
<script type="text/javascript" src="/base/static/lib/jquery/jquery-1.6.2.js"></script>
<script type="text/javascript" src="/base/static/lib/jquery.ui/js/jquery-ui-1.8.9.custom.min.js"></script>
-
- <script type="text/javascript" src="/web_mobile/static/lib/jquery_mobile/js/jquery.mobile-1.0a4.1.js"></script>
<script type="text/javascript" src="/base/static/lib/jquery.ba-bbq/jquery.ba-bbq.js"></script>
<script type="text/javascript" src="/base/static/lib/underscore/underscore.js"></script>
<script type="text/javascript" src="/base/static/lib/underscore/underscore.string.js"></script>
+ <script type="text/javascript" src="/web_mobile/static/lib/jquery_mobile/js/jquery.mobile-1.0a4.1.js"></script>
<script type="text/javascript" src="/base/static/lib/qweb/qweb2.js"></script>
-
- <script type="text/javascript" src="/base/static/src/js/base.js"></script>
+ <script type="text/javascript" src="/base/static/src/js/boot.js"></script>
+ <script type="text/javascript" src="/base/static/src/js/core.js"></script>
<script type="text/javascript" src="/base/static/src/js/chrome.js"></script>
<script type="text/javascript" src="/base/static/src/js/data.js"></script>
<script type="text/javascript" src="/base/static/src/js/formats.js"></script>
@@ -26,19 +26,16 @@
<script type="text/javascript" src="/web_mobile/static/src/js/list_mobile.js"></script>
<script type="text/javascript" src="/web_mobile/static/src/js/form_mobile.js"></script>
- <link rel="stylesheet" href="/web_mobile/static/src/css/web_mobile.css"/>
<script type="text/javascript">
$(function() {
QWeb = window.QWeb || new QWeb2.Engine();
var oe = openerp.init();
+ openerp.web_mobile(oe);
oe.web_mobile.mobilewebclient("moe");
});
</script>
-
</head>
-
<body>
- <div id="moe" class="openerp" data-role="page"></div>
+ <div id="moe" class="openerp"></div>
</body>
-
-</html>
+</html> \ No newline at end of file
diff --git a/addons/web_mobile/static/src/xml/web_mobile.xml b/addons/web_mobile/static/src/xml/web_mobile.xml
index fa5fe0c6b27..a3af2e39b90 100644
--- a/addons/web_mobile/static/src/xml/web_mobile.xml
+++ b/addons/web_mobile/static/src/xml/web_mobile.xml
@@ -4,54 +4,35 @@
<templates id="template" xml:space="preserve">
<t t-name="WebClient">
- <div class="ui-page ui-body-c ui-page-active" data-role="page">
+ <div data-role="page">
<div id="oe_header"></div>
<div id="oe_app"></div>
</div>
</t>
-<t t-name="Header">
- <div role="banner" class="ui-bar-b ui-header" data-role="header" data-theme="b">
- <h1 aria-level="1" role="heading" tabindex="0" class="ui-title">OpenERP</h1>
- <a id="home" class="ui-btn-right jqm-home ui-btn ui-btn-icon-notext ui-btn-corner-all ui-shadow ui-btn-up-b" data-direction="reverse" data-iconpos="notext" data-icon="home" href="#" title="Home" data-theme="b">
- <span class="ui-btn-inner ui-btn-corner-all">
- <span class="ui-btn-text">Home</span>
- <span class="ui-icon ui-icon-home ui-icon-shadow"></span>
- </span>
- </a>
- </div>
-</t>
-
<t t-name="Login">
- <div role="banner" class="ui-bar-b ui-header" data-role="header" data-theme="b">
- <h1 aria-level="1" role="heading" tabindex="0" class="ui-title">OpenERP</h1>
+ <div data-role="header" data-theme="b">
+ <h1>OpenERP</h1>
</div>
- <div role="main" class="ui-content" data-role="content">
+ <div data-role="content">
<fieldset>
- <div class="ui-field-contain ui-body ui-br" data-role="fieldcontain">
- <label for="database" class="select ui-select">Database:</label>
- <div class="ui-select">
- <div data-theme="c" class="ui-btn ui-btn-icon-right ui-btn-corner-all ui-shadow ui-btn-up-c">
- <span class="ui-btn-inner ui-btn-corner-all">
- <span id="db_text" class="ui-btn-text">Choose Database...</span>
- <span class="ui-icon ui-icon-arrow-d ui-icon-shadow"></span>
- </span>
- <select id="database" name="database">
+ <div data-role="fieldcontain">
+ <label for="database" class="select">Database:</label>
+ <select id="database" name="database" data-native-menu="false">
+ <t t-if="db_list">
<t t-foreach="db_list" t-as="opt">
<option t-att-value="opt"><t t-esc="opt"/></option>
</t>
- </select>
- </div>
+ </t>
+ </select>
+ <label for="login">Login:</label>
+ <input type="text" id="login" name="login" value=""/><br/>
+ <label for="password">Password:</label>
+ <input type="password" id="password" name="password" value=""/><br/>
+ <a id="login_btn" data-theme="c" href="#" data-role="button">Login</a>
+ <div class="login_error_message ui-btn-inner ui-btn-corner-all">
+ <span class="ui-btn-text">Bad username or password</span>
</div>
- <label class="ui-input-text" for="name">Login:</label>
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" name="login" value=""/><br/>
- <label class="ui-input-text" for="name">Password:</label>
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="password" name="password" value=""/><br/>
- <a id="login" class="ui-btn ui-btn-corner-all ui-shadow ui-btn-up-c" data-theme="c" href="#" data-role="button">
- <span class="ui-btn-inner ui-btn-corner-all">
- <span class="ui-btn-text">Login</span>
- </span>
- </a>
</div>
</fieldset>
</div>
@@ -65,12 +46,105 @@
</div>
</t>
+<t t-name="Header">
+ <div role="banner" class="ui-bar-b ui-header" data-role="header" data-theme="b">
+ <h1 aria-level="1" role="heading" tabindex="0" class="ui-title">OpenERP</h1>
+ <a id="home" class="ui-btn-right jqm-home ui-btn ui-btn-icon-notext ui-btn-corner-all ui-shadow ui-btn-up-b" data-direction="reverse" data-iconpos="notext" data-icon="home" href="#" title="Home" data-theme="b">
+ <span class="ui-btn-inner ui-btn-corner-all">
+ <span class="ui-btn-text">Home</span>
+ <span class="ui-icon ui-icon-home ui-icon-shadow"></span>
+ </span>
+ </a>
+ </div>
+</t>
+
+<t t-name="Shortcuts">
+ <ul data-dividertheme="b" data-theme="c" data-inset="true" data-role="listview" class="ui-listview ui-listview-inset ui-corner-all ui-shadow">
+ <li data-role="list-divider" role="heading" class="ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top ui-btn-up-undefined">
+ Shortcuts
+ </li>
+ <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c" t-foreach="sc" t-as="opt">
+ <div class="ui-btn-inner ui-li">
+ <div class="ui-btn-text">
+ <a href="#" class="ui-link-inherit" t-att-data-menu="opt.id" t-att-data-name="opt.name" t-att-data-res="opt.res_id">
+ <span><t t-esc="opt.name"/></span>
+ </a>
+ </div>
+ <span class="ui-icon ui-icon-arrow-r"></span>
+ </div>
+ </li>
+ </ul>
+</t>
+
+<t t-name="Menu">
+ <ul data-dividertheme="b" data-theme="c" data-inset="true" data-role="listview" class="ui-listview ui-listview-inset ui-corner-all ui-shadow">
+ <li data-role="list-divider" role="heading" class="ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top ui-btn-up-undefined">
+ Menu
+ </li>
+ <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c" t-foreach="data.children" t-as="menu">
+ <div class="ui-btn-inner ui-li">
+ <div class="ui-btn-text">
+ <a href="#" class="ui-link-inherit" t-att-data-menu="menu.id" t-att-data-name="menu.name">
+ <span><t t-esc="menu.name"/></span>
+ </a>
+ </div>
+ <span class="ui-icon ui-icon-arrow-r"></span>
+ </div>
+ </li>
+ </ul>
+</t>
+
+<t t-name="Menu.secondary">
+ <div role="main" class="ui-content" data-role="content">
+ <ul data-role="listview" class="ui-listview">
+ <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c" t-foreach="menu.children" t-as="menu">
+ <div class="ui-btn-inner ui-li">
+ <div class="ui-btn-text">
+ <a href="#" class="ui-link-inherit" t-attf-id="menu_#{menu.id}" t-att-data-menu="menu.id" t-att-data-name="menu.name">
+ <span><t t-esc="menu.name"/></span>
+ </a>
+ </div>
+ <span class="ui-icon ui-icon-arrow-r"></span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</t>
+
+<t t-name="Options">
+ <ul data-dividertheme="b" data-theme="c" data-inset="true" data-role="listview" class="ui-listview ui-listview-inset ui-corner-all ui-shadow">
+ <li data-role="list-divider" role="heading" class="ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top ui-btn-up-undefined">
+ Options
+ </li>
+ <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c">
+ <div class="ui-btn-inner ui-li">
+ <div class="ui-btn-text">
+ <a id="logout" href="#" class="ui-link-inherit">
+ Logout
+ </a>
+ </div>
+ <span class="ui-icon ui-icon-arrow-r"></span>
+ </div>
+ </li>
+ <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c">
+ <div class="ui-btn-inner ui-li">
+ <div class="ui-btn-text">
+ <a id="pref" href="#" class="ui-link-inherit">
+ Preferences
+ </a>
+ </div>
+ <span class="ui-icon ui-icon-arrow-r"></span>
+ </div>
+ </li>
+ </ul>
+</t>
+
<t t-name="ListView">
<div role="main" class="ui-content" data-role="content">
<form class="ui-listview-filter ui-bar-c" role="search">
- <div id="search-data" class="ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield ui-body-c">
- <input id="searchid" placeholder="Filter items..." data-type="search" class="ui-input-text ui-body-null" autosearch="true" setTimeDefault="700"/>
- </div>
+ <div id="search-data" class="ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield ui-body-c">
+ <input id="searchid" placeholder="Filter items..." data-type="search" class="ui-input-text ui-body-null" autosearch="true" setTimeDefault="700"/>
+ </div>
</form>
<ul role="listbox" data-role="listview" class="ui-listview">
<li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c" t-foreach="records" t-as="record">
@@ -92,13 +166,14 @@
<form>
<t t-foreach="get_fields" t-as="field">
<div data-role="fieldcontain">
-
+ <t t-if="fields[field.attrs.name].type!='one2many' and fields[field.attrs.name].type!='many2many'" >
<label class="ui-input-text">
<span>
<t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t>
<t t-if="field.attrs.string" t-esc="field.attrs.string"></t>
</span>:
</label>
+ </t>
<t t-if="fields[field.attrs.name].type == 'char'">
<t t-if="values[field.attrs.name]">
<input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
@@ -116,7 +191,31 @@
</t>
</t>
<t t-if="fields[field.attrs.name].type == 'text'">
- <input type="text" style="width: 100%"/><br/>
+ <textarea style="width:100%;" rows="8" name="textarea" id="textarea"></textarea><br/>
+ </t>
+ <t t-if="fields[field.attrs.name].type == 'float'">
+ <t t-if="values[field.attrs.name]">
+ <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
+ </t>
+ <t t-if="!(values[field.attrs.name])">
+ <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
+ </t>
+ </t>
+ <t t-if="fields[field.attrs.name].type == 'date'">
+ <t t-if="values[field.attrs.name]">
+ <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
+ </t>
+ <t t-if="!(values[field.attrs.name])">
+ <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
+ </t>
+ </t>
+ <t t-if="fields[field.attrs.name].type == 'datetime'">
+ <t t-if="values[field.attrs.name]">
+ <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
+ </t>
+ <t t-if="!(values[field.attrs.name])">
+ <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
+ </t>
</t>
<t t-if="fields[field.attrs.name].type == 'selection'">
<div class="ui-select">
@@ -133,7 +232,8 @@
</span>
<span class="ui-icon ui-icon-arrow-d ui-icon-shadow"></span>
</span>
- <select>
+
+ <select t-att-id="'selection_'+fields[field.attrs.name].string">
<t t-foreach="fields[field.attrs.name].selection" t-as="opt">
<option t-att-value="opt[0]"><t t-esc="opt[1]"/></option>
</t>
@@ -141,19 +241,28 @@
</div>
</div>
</t>
- <t t-if="fields[field.attrs.name].type == 'many2one'">
+ <t t-if="fields[field.attrs.name].type == 'many2one'">
+
<div class="ui-select">
<div data-theme="c" class="ui-btn ui-btn-icon-right ui-btn-corner-all ui-shadow ui-btn-up-c">
<span class="ui-btn-inner ui-btn-corner-all">
<span class="ui-btn-text">
- <t t-esc="values[field.attrs.name][1]"/>
- </span>
+ <t t-if="values[field.attrs.name]">
+ <t t-esc="values[field.attrs.name][1]"/>
+ </t>
+ </span>
<span class="ui-icon ui-icon-arrow-d ui-icon-shadow"></span>
</span>
- <select>
+
+ <select t-att-id="'selection_'+fields[field.attrs.name].string">
<t t-if="fields[field.attrs.name].selection">
<t t-foreach="fields[field.attrs.name].selection" t-as="opt">
- <option t-att-value="opt[0]"><t t-esc="opt[1]"/></option>
+ <t t-if="values[field.attrs.name]==opt[0]">
+ <option t-att-value="opt[0]" selected="true" ><t t-esc="opt[1]"/></option>
+ </t>
+ <t t-if="values[field.attrs.name]!=opt[0]">
+ <option t-att-value="opt[0]" ><t t-esc="opt[1]"/></option>
+ </t>
</t>
</t>
</select>
@@ -161,44 +270,27 @@
</div>
</t>
<t t-if="fields[field.attrs.name].type == 'one2many'">
- <t t-if="values[field.attrs.name]">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'many2many'">
- <t t-if="values[field.attrs.name]">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'float'">
- <t t-if="values[field.attrs.name]">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'date'">
- <t t-if="values[field.attrs.name]">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'datetime'">
- <t t-if="values[field.attrs.name]">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" t-att-value="values[field.attrs.name]"/><br/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input class="ui-input-text ui-body-null ui-corner-all ui-shadow-inset ui-body-c" type="text" value=""/><br/>
- </t>
+ <div class="info ui-collapsible-contain" data-collapsed="true" data-role="collapsible">
+ <h1 class="ui-collapsible-heading">
+ <a class="ui-collapsible-heading-toggle ui-btn ui-btn-icon-left ui-shadow ui-corner-all ui-btn-up-c" href="#" data-theme="c" t-id="page.attrs.string">
+ <span class="ui-btn-inner ui-corner-all">
+ <span class="ui-btn-text">
+ <t t-esc="til"></t>
+ <!-- <span class="ui-collapsible-heading-status"></span> -->
+ </span>
+ <span data-theme="d" class="ui-btn ui-btn-icon-left ui-btn-corner-all ui-shadow ui-btn-up-d">
+ <span class="ui-btn-inner ui-btn-corner-all ui-corner-all">
+ <span class="ui-btn-text"></span>
+ <span class="ui-icon ui-icon-shadow ui-icon-plus"></span>
+ </span>
+ </span>
+ </span>
+ </a>
+ <div class="ui-collapsible-content ui-collapsible-content-collapsed" aria-hidden="true">
+ <div class="detail"></div>
+ </div>
+ </h1>
+ </div>
</t>
</div>
</t>
@@ -231,86 +323,4 @@
</div>
</t>
-
-<t t-name="Shortcuts">
- <ul data-dividertheme="b" data-theme="c" data-inset="true" data-role="listview" class="ui-listview ui-listview-inset ui-corner-all ui-shadow">
- <li data-role="list-divider" role="heading" class="ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top ui-btn-up-undefined">
- Shortcuts
- </li>
- <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c" t-foreach="sc" t-as="opt">
- <div class="ui-btn-inner ui-li">
- <div class="ui-btn-text">
- <a href="#" class="ui-link-inherit" t-att-data-menu="opt.id" t-att-data-name="opt.name" t-att-data-res="opt.res_id">
- <span><t t-esc="opt.name"/></span>
- </a>
- </div>
- <span class="ui-icon ui-icon-arrow-r"></span>
- </div>
- </li>
- </ul>
-</t>
-
-<t t-name="Menu">
- <ul data-dividertheme="b" data-theme="c" data-inset="true" data-role="listview" class="ui-listview ui-listview-inset ui-corner-all ui-shadow">
- <li data-role="list-divider" role="heading" class="ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top ui-btn-up-undefined">
- Menu
- </li>
- <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c" t-foreach="data.children" t-as="menu">
- <div class="ui-btn-inner ui-li">
- <div class="ui-btn-text">
- <a href="#" class="ui-link-inherit" t-att-data-menu="menu.id" t-att-data-name="menu.name">
- <span><t t-esc="menu.name"/></span>
- </a>
- </div>
- <span class="ui-icon ui-icon-arrow-r"></span>
- </div>
- </li>
- </ul>
-</t>
-
-<t t-name="Menu.secondary">
- <div role="main" class="ui-content" data-role="content">
- <ul data-role="listview" class="ui-listview">
- <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c" t-foreach="menu.children" t-as="menu">
- <div class="ui-btn-inner ui-li">
- <div class="ui-btn-text">
- <a href="#" class="ui-link-inherit" t-attf-id="menu_#{menu.id}" t-att-data-menu="menu.id" t-att-data-name="menu.name">
- <span><t t-esc="menu.name"/></span>
- </a>
- </div>
- <span class="ui-icon ui-icon-arrow-r"></span>
- </div>
- </li>
- </ul>
- </div>
-</t>
-
-<t t-name="Options">
- <ul data-dividertheme="b" data-theme="c" data-inset="true" data-role="listview" class="ui-listview ui-listview-inset ui-corner-all ui-shadow">
- <li data-role="list-divider" role="heading" class="ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top ui-btn-up-undefined">
- Options
- </li>
- <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c">
- <div class="ui-btn-inner ui-li">
- <div class="ui-btn-text">
- <a id="logout" href="#" class="ui-link-inherit">
- Logout
- </a>
- </div>
- <span class="ui-icon ui-icon-arrow-r"></span>
- </div>
- </li>
- <li data-theme="c" class="ui-btn ui-btn-icon-right ui-li ui-btn-up-c">
- <div class="ui-btn-inner ui-li">
- <div class="ui-btn-text">
- <a id="pref" href="#" class="ui-link-inherit">
- Preferences
- </a>
- </div>
- <span class="ui-icon ui-icon-arrow-r"></span>
- </div>
- </li>
- </ul>
-</t>
-
</templates>