[MERGE]merge with main branch.

bzr revid: vme@tinyerp.com-20111111053703-r8gx2w67t0w38jp7
This commit is contained in:
Vidhin Mehta (OpenERP) 2011-11-11 11:07:03 +05:30
commit 6bf24d1890
15 changed files with 273 additions and 179 deletions

View File

@ -1417,6 +1417,7 @@ class ExcelExport(Export):
for cell_index, cell_value in enumerate(row): for cell_index, cell_value in enumerate(row):
if isinstance(cell_value, basestring): if isinstance(cell_value, basestring):
cell_value = re.sub("\r", " ", cell_value) cell_value = re.sub("\r", " ", cell_value)
if cell_value is False: cell_value = None
worksheet.write(row_index + 1, cell_index, cell_value, style) worksheet.write(row_index + 1, cell_index, cell_value, style)
fp = StringIO() fp = StringIO()

View File

@ -887,8 +887,11 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W
*/ */
render_element: function() { render_element: function() {
var rendered = this.render(); var rendered = this.render();
if (rendered || rendered === "") if (rendered) {
this.$element = $(rendered); var elem = $(rendered);
this.$element.replaceWith(elem);
this.$element = elem;
}
return this; return this;
}, },
/** /**
@ -900,7 +903,7 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W
render: function (additional) { render: function (additional) {
if (this.template) if (this.template)
return openerp.web.qweb.render(this.template, _.extend({widget: this}, additional || {})); return openerp.web.qweb.render(this.template, _.extend({widget: this}, additional || {}));
return false; return null;
}, },
/** /**
* Method called after rendering. Mostly used to bind actions, perform asynchronous * Method called after rendering. Mostly used to bind actions, perform asynchronous
@ -912,12 +915,6 @@ openerp.web.Widget = openerp.web.CallbackEnabled.extend(/** @lends openerp.web.W
* @returns {jQuery.Deferred} * @returns {jQuery.Deferred}
*/ */
start: function() { start: function() {
/* The default implementation is only useful for retro-compatibility, it is
not necessary to call it using _super() when using Widget for new components. */
if (!this.$element) {
var tmp = document.getElementById(this.element_id);
this.$element = tmp ? $(tmp) : undefined;
}
return $.Deferred().done().promise(); return $.Deferred().done().promise();
}, },
/** /**

View File

@ -18,11 +18,11 @@ openerp.web.str_to_datetime = function(str) {
var regex = /^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)(?:\.\d+)?$/; var regex = /^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)(?:\.\d+)?$/;
var res = regex.exec(str); var res = regex.exec(str);
if ( !res ) { if ( !res ) {
throw "'" + str + "' is not a valid datetime"; throw new Error("'" + str + "' is not a valid datetime");
} }
var obj = Date.parse(res[1] + " GMT"); var obj = Date.parse(res[1] + " GMT");
if (! obj) { if (! obj) {
throw "'" + str + "' is not a valid datetime"; throw new Error("'" + str + "' is not a valid datetime");
} }
return obj; return obj;
}; };
@ -41,11 +41,11 @@ openerp.web.str_to_date = function(str) {
var regex = /^\d\d\d\d-\d\d-\d\d$/; var regex = /^\d\d\d\d-\d\d-\d\d$/;
var res = regex.exec(str); var res = regex.exec(str);
if ( !res ) { if ( !res ) {
throw "'" + str + "' is not a valid date"; throw new Error("'" + str + "' is not a valid date");
} }
var obj = Date.parse(str); var obj = Date.parse(str);
if (! obj) { if (! obj) {
throw "'" + str + "' is not a valid date"; throw new Error("'" + str + "' is not a valid date");
} }
return obj; return obj;
}; };
@ -64,11 +64,11 @@ openerp.web.str_to_time = function(str) {
var regex = /^(\d\d:\d\d:\d\d)(?:\.\d+)?$/; var regex = /^(\d\d:\d\d:\d\d)(?:\.\d+)?$/;
var res = regex.exec(str); var res = regex.exec(str);
if ( !res ) { if ( !res ) {
throw "'" + str + "' is not a valid time"; throw new Error("'" + str + "' is not a valid time");
} }
var obj = Date.parse(res[1]); var obj = Date.parse(res[1]);
if (! obj) { if (! obj) {
throw "'" + str + "' is not a valid time"; throw new Error("'" + str + "' is not a valid time");
} }
return obj; return obj;
}; };

View File

@ -93,7 +93,7 @@ openerp.web.parse_value = function (value, descriptor, value_if_empty) {
} while(tmp !== value); } while(tmp !== value);
tmp = Number(value); tmp = Number(value);
if (isNaN(tmp)) if (isNaN(tmp))
throw value + " is not a correct integer"; throw new Error(value + " is not a correct integer");
return tmp; return tmp;
case 'float': case 'float':
var tmp = Number(value); var tmp = Number(value);
@ -107,42 +107,42 @@ openerp.web.parse_value = function (value, descriptor, value_if_empty) {
} while(tmp !== tmp2); } while(tmp !== tmp2);
tmp = Number(tmp); tmp = Number(tmp);
if (isNaN(tmp)) if (isNaN(tmp))
throw value + " is not a correct float"; throw new Error(value + " is not a correct float");
return tmp; return tmp;
case 'float_time': case 'float_time':
var tmp = value.split(":"); var float_time_pair = value.split(":");
if (tmp.length != 2) if (float_time_pair.length != 2)
throw value + " is not a correct float_time"; return openerp.web.parse_value(value, {type: "float"});
var tmp1 = openerp.web.parse_value(tmp[0], {type: "integer"}); var hours = openerp.web.parse_value(float_time_pair[0], {type: "integer"});
var tmp2 = openerp.web.parse_value(tmp[1], {type: "integer"}); var minutes = openerp.web.parse_value(float_time_pair[1], {type: "integer"});
return tmp1 + (tmp2 / 60); return hours + (minutes / 60);
case 'progressbar': case 'progressbar':
return openerp.web.parse_value(value, {type: "float"}); return openerp.web.parse_value(value, {type: "float"});
case 'datetime': case 'datetime':
var tmp = Date.parseExact(value, _.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate, var datetime = Date.parseExact(value, _.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate,
Date.CultureInfo.formatPatterns.longTime)); Date.CultureInfo.formatPatterns.longTime));
if (tmp !== null) if (datetime !== null)
return openerp.web.datetime_to_str(tmp); return openerp.web.datetime_to_str(datetime);
tmp = Date.parse(value); datetime = Date.parse(value);
if (tmp !== null) if (datetime !== null)
return openerp.web.datetime_to_str(tmp); return openerp.web.datetime_to_str(datetime);
throw value + " is not a valid datetime"; throw new Error(value + " is not a valid datetime");
case 'date': case 'date':
var tmp = Date.parseExact(value, Date.CultureInfo.formatPatterns.shortDate); var date = Date.parseExact(value, Date.CultureInfo.formatPatterns.shortDate);
if (tmp !== null) if (date !== null)
return openerp.web.date_to_str(tmp); return openerp.web.date_to_str(date);
tmp = Date.parse(value); date = Date.parse(value);
if (tmp !== null) if (date !== null)
return openerp.web.date_to_str(tmp); return openerp.web.date_to_str(date);
throw value + " is not a valid date"; throw new Error(value + " is not a valid date");
case 'time': case 'time':
var tmp = Date.parseExact(value, Date.CultureInfo.formatPatterns.longTime); var time = Date.parseExact(value, Date.CultureInfo.formatPatterns.longTime);
if (tmp !== null) if (time !== null)
return openerp.web.time_to_str(tmp); return openerp.web.time_to_str(time);
tmp = Date.parse(value); time = Date.parse(value);
if (tmp !== null) if (time !== null)
return openerp.web.time_to_str(tmp); return openerp.web.time_to_str(time);
throw value + " is not a valid time"; throw new Error(value + " is not a valid time");
} }
return value; return value;
}; };
@ -157,7 +157,7 @@ openerp.web.auto_str_to_date = function(value, type) {
try { try {
return openerp.web.str_to_time(value); return openerp.web.str_to_time(value);
} catch(e) {} } catch(e) {}
throw "'" + value + "' is not a valid date, datetime nor time" throw new Error("'" + value + "' is not a valid date, datetime nor time");
}; };
openerp.web.auto_date_to_str = function(value, type) { openerp.web.auto_date_to_str = function(value, type) {
@ -169,7 +169,7 @@ openerp.web.auto_date_to_str = function(value, type) {
case 'time': case 'time':
return openerp.web.time_to_str(value); return openerp.web.time_to_str(value);
default: default:
throw type + " is not convertible to date, datetime nor time" throw new Error(type + " is not convertible to date, datetime nor time");
} }
}; };

View File

@ -963,10 +963,7 @@ openerp.web.search.ExtendedSearch = openerp.web.OldWidget.extend({
this.check_last_element(); this.check_last_element();
}, },
start: function () { start: function () {
this._super(); this.$element = $("#" + this.element_id);
if (!this.$element) {
return; // not a logical state but sometimes it happens
}
this.$element.closest("table.oe-searchview-render-line").css("display", "none"); this.$element.closest("table.oe-searchview-render-line").css("display", "none");
var self = this; var self = this;
this.rpc("/web/searchview/fields_get", this.rpc("/web/searchview/fields_get",
@ -1028,7 +1025,7 @@ openerp.web.search.ExtendedSearchGroup = openerp.web.OldWidget.extend({
prop.start(); prop.start();
}, },
start: function () { start: function () {
this._super(); this.$element = $("#" + this.element_id);
var _this = this; var _this = this;
this.add_prop(); this.add_prop();
this.$element.find('.searchview_extended_add_proposition').click(function () { this.$element.find('.searchview_extended_add_proposition').click(function () {
@ -1080,7 +1077,7 @@ openerp.web.search.ExtendedSearchProposition = openerp.web.OldWidget.extend(/**
this.value = null; this.value = null;
}, },
start: function () { start: function () {
this._super(); this.$element = $("#" + this.element_id);
this.select_field(this.fields.length > 0 ? this.fields[0] : null); this.select_field(this.fields.length > 0 ? this.fields[0] : null);
var _this = this; var _this = this;
this.$element.find(".searchview_extended_prop_field").change(function() { this.$element.find(".searchview_extended_prop_field").change(function() {
@ -1188,7 +1185,7 @@ openerp.web.search.ExtendedSearchProposition.DateTime = openerp.web.OldWidget.ex
return this.datewidget.get_value(); return this.datewidget.get_value();
}, },
start: function() { start: function() {
this._super(); this.$element = $("#" + this.element_id);
this.datewidget = new openerp.web.DateTimeWidget(this); this.datewidget = new openerp.web.DateTimeWidget(this);
this.datewidget.prependTo(this.$element); this.datewidget.prependTo(this.$element);
} }
@ -1208,7 +1205,7 @@ openerp.web.search.ExtendedSearchProposition.Date = openerp.web.OldWidget.extend
return this.datewidget.get_value(); return this.datewidget.get_value();
}, },
start: function() { start: function() {
this._super(); this.$element = $("#" + this.element_id);
this.datewidget = new openerp.web.DateWidget(this); this.datewidget = new openerp.web.DateWidget(this);
this.datewidget.prependTo(this.$element); this.datewidget.prependTo(this.$element);
} }

View File

@ -32,7 +32,8 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
action_buttons: false, action_buttons: false,
search_view: false, search_view: false,
pager: false, pager: false,
radio: true radio: true,
select_view_id: self.parent.fields_view.view_id
}, },
}; };
this.view_edit_dialog = new openerp.web.Dialog(this, { this.view_edit_dialog = new openerp.web.Dialog(this, {
@ -53,6 +54,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
} }
}, },
}).start().open(); }).start().open();
this.main_view_id = this.parent.fields_view.view_id;
var action_manager = new openerp.web.ActionManager(this); var action_manager = new openerp.web.ActionManager(this);
action_manager.appendTo(this.view_edit_dialog); action_manager.appendTo(this.view_edit_dialog);
$.when(action_manager.do_action(action)).then(function() { $.when(action_manager.do_action(action)).then(function() {
@ -572,7 +574,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
var value = _.detect(arch_val[0]['att_list'],function(res) { var value = _.detect(arch_val[0]['att_list'],function(res) {
return _.include(res, id); return _.include(res, id);
}); });
if (id == 'groups') type_widget.value = self.groups; if (id == 'groups') type_widget.selection = self.groups;
self.edit_node_dialog.$element.find('table[id=rec_table]').append('<tr><td align="right">'+id+':</td><td>'+type_widget.render()+'</td></tr>'); self.edit_node_dialog.$element.find('table[id=rec_table]').append('<tr><td align="right">'+id+':</td><td>'+type_widget.render()+'</td></tr>');
type_widget.start(); type_widget.start();
type_widget.set_value(value); type_widget.set_value(value);
@ -630,9 +632,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
"Update": function(){ "Update": function(){
var update_values = []; var update_values = [];
_.each(self.edit_widget, function(widget) { _.each(self.edit_widget, function(widget) {
if (widget.dirty) { update_values.push(widget.get_value());
update_values.push(widget.get_value());
}
}); });
}, },
"Cancel": function(){ "Cancel": function(){
@ -645,7 +645,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
var table_selector = self.add_node_dialog.$element.find('table[id=rec_table]'); var table_selector = self.add_node_dialog.$element.find('table[id=rec_table]');
_.each(render_list,function(node){ _.each(render_list,function(node){
type_widget = new openerp.web.ViewEditor.FieldSelect (self.add_node_dialog, node[0]); type_widget = new openerp.web.ViewEditor.FieldSelect (self.add_node_dialog, node[0]);
type_widget.value = node[1]; type_widget.selection = node[1];
if(node[0]=="Fields"){ node[0] = "";} if(node[0]=="Fields"){ node[0] = "";}
table_selector.append('<tr><td align="right">'+node[0]+'</td><td>'+type_widget.render()+'</td></tr>'); table_selector.append('<tr><td align="right">'+node[0]+'</td><td>'+type_widget.render()+'</td></tr>');
type_widget.start(); type_widget.start();
@ -664,7 +664,6 @@ openerp.web.ViewEditor.Field = openerp.web.Class.extend({
this.$element = view.$element; this.$element = view.$element;
this.dirty = false; this.dirty = false;
this.name = id; this.name = id;
this.value = undefined;
}, },
on_ui_change: function() { on_ui_change: function() {
this.dirty = true; this.dirty = true;
@ -714,17 +713,18 @@ openerp.web.ViewEditor.FieldSelect = openerp.web.ViewEditor.Field.extend({
this.$element.find("select[id=" + this.name + "]").css('width', '100%').change(function() { this.$element.find("select[id=" + this.name + "]").css('width', '100%').change(function() {
self.on_ui_change(); self.on_ui_change();
add_node = self.get_value(); add_node = self.get_value();
if(add_node[0] == "node_type" && add_node[1] == "field" ){ if(add_node[0] == "node_type"){
self.$element.find("select[id=Fields]").show(); if(add_node[1] == "field"){self.$element.find("select[id=Fields]").show();}
}else{self.$element.find("select[id=Fields]").hide();} else{self.$element.find("select[id=Fields]").hide();}
}
}); });
}, },
set_value: function(value) { set_value: function(value) {
value = value === null ? false : value; value = value === null ? false : value;
value = value instanceof Array ? value[1] : value; value = value instanceof Array ? value[1] : value;
var index = 0; var index = 0;
for (var i = 0, ii = this.value.length; i < ii; i++) { for (var i = 0, ii = this.selection.length; i < ii; i++) {
if ((this.value[i] instanceof Array && this.value[i][1] === value) || this.value[i] === value) index = i; if ((this.selection[i] instanceof Array && this.selection[i][1] === value) || this.selection[i] === value) index = i;
} }
this.$element.find("select[id=" + this.name + "]")[0].selectedIndex = index; this.$element.find("select[id=" + this.name + "]")[0].selectedIndex = index;
}, },
@ -740,43 +740,43 @@ openerp.web.ViewEditor.WidgetProperty = openerp.web.ViewEditor.FieldSelect.exten
var values = _.keys(this.registry.map); var values = _.keys(this.registry.map);
values.push(''); values.push('');
values.sort(); values.sort();
this.value = values; this.selection = values;
}, },
}); });
openerp.web.ViewEditor.IconProperty = openerp.web.ViewEditor.FieldSelect.extend({ openerp.web.ViewEditor.IconProperty = openerp.web.ViewEditor.FieldSelect.extend({
init: function(view, id) { init: function(view, id) {
this._super(view, id); this._super(view, id);
this.value = icons; this.selection = icons;
}, },
}); });
openerp.web.ViewEditor.ButtonTargetProperty = openerp.web.ViewEditor.FieldSelect.extend({ openerp.web.ViewEditor.ButtonTargetProperty = openerp.web.ViewEditor.FieldSelect.extend({
init: function(view, id) { init: function(view, id) {
this._super(view, id); this._super(view, id);
this.value = [['', ''], ['new', 'New Window']]; this.selection = [['', ''], ['new', 'New Window']];
}, },
}); });
openerp.web.ViewEditor.ButtonTypeProperty = openerp.web.ViewEditor.FieldSelect.extend({ openerp.web.ViewEditor.ButtonTypeProperty = openerp.web.ViewEditor.FieldSelect.extend({
init: function(view, id) { init: function(view, id) {
this._super(view, id); this._super(view, id);
this.value = [['', ''], ['action', 'Action'], ['object', 'Object'], ['workflow', 'Workflow'], ['server_action', 'Server Action']]; this.selection = [['', ''], ['action', 'Action'], ['object', 'Object'], ['workflow', 'Workflow'], ['server_action', 'Server Action']];
}, },
}); });
openerp.web.ViewEditor.AlignProperty = openerp.web.ViewEditor.FieldSelect.extend({ openerp.web.ViewEditor.AlignProperty = openerp.web.ViewEditor.FieldSelect.extend({
init: function(view, id) { init: function(view, id) {
this._super(view, id); this._super(view, id);
this.value = [['', ''], ['0.0', 'Left'], ['0.5', 'Center'], ['1.0', 'Right']]; this.selection = [['', ''], ['0.0', 'Left'], ['0.5', 'Center'], ['1.0', 'Right']];
}, },
}); });
openerp.web.ViewEditor.ButtonSpecialProperty = openerp.web.ViewEditor.FieldSelect.extend({ openerp.web.ViewEditor.ButtonSpecialProperty = openerp.web.ViewEditor.FieldSelect.extend({
init: function(view, id) { init: function(view, id) {
this._super(view, id); this._super(view, id);
this.value = [['',''],['save', 'Save Button'], ['cancel', 'Cancel Button'], ['open', 'Open Button']]; this.selection = [['',''],['save', 'Save Button'], ['cancel', 'Cancel Button'], ['open', 'Open Button']];
}, },
}); });
openerp.web.ViewEditor.PositionProperty = openerp.web.ViewEditor.FieldSelect.extend({ openerp.web.ViewEditor.PositionProperty = openerp.web.ViewEditor.FieldSelect.extend({
init: function(view, id) { init: function(view, id) {
this._super(view, id); this._super(view, id);
this.value = [['',''],['after', 'After'],['before', 'Before'],['inside', 'Inside'],['replace', 'Replace']]; this.selection = [['',''],['after', 'After'],['before', 'Before'],['inside', 'Inside'],['replace', 'Replace']];
}, },
}); });
openerp.web.ViewEditor.GroupsProperty = openerp.web.ViewEditor.FieldSelect.extend({ openerp.web.ViewEditor.GroupsProperty = openerp.web.ViewEditor.FieldSelect.extend({
@ -792,7 +792,7 @@ openerp.web.ViewEditor.GroupsProperty = openerp.web.ViewEditor.FieldSelect.exten
var self = this; var self = this;
self.$element.find("#groups option").attr("selected",false); self.$element.find("#groups option").attr("selected",false);
if (!value) return false; if (!value) return false;
_.each(this.value, function(item) { _.each(this.selection, function(item) {
if (_.include(value[1].split(','), item[0])) { if (_.include(value[1].split(','), item[0])) {
self.$element.find("select[id="+self.name+"] option[value='" + item[0] +"']").attr("selected",1) self.$element.find("select[id="+self.name+"] option[value='" + item[0] +"']").attr("selected",1)
} }

View File

@ -387,10 +387,16 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
var def = $.Deferred(); var def = $.Deferred();
$.when(this.has_been_loaded).then(function() { $.when(this.has_been_loaded).then(function() {
if (self.can_be_discarded() && self.datarecord.id) { if (self.can_be_discarded() && self.datarecord.id) {
self.dataset.unlink([self.datarecord.id]).then(function() { if (confirm(_t("Do you really want to delete this record?"))) {
self.on_pager_action('next'); self.dataset.unlink([self.datarecord.id]).then(function() {
def.resolve(); self.on_pager_action('next');
}); def.resolve();
});
} else {
setTimeout(function () {
def.reject();
}, 0)
}
} }
}); });
return def.promise(); return def.promise();
@ -2035,7 +2041,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
once.resolve(); once.resolve();
}); });
controller.on_pager_action.add_first(function() { controller.on_pager_action.add_first(function() {
self.save_form_view(); self.save_any_view();
}); });
controller.$element.find(".oe_form_button_save").hide(); controller.$element.find(".oe_form_button_save").hide();
} else if (view_type == "graph") { } else if (view_type == "graph") {
@ -2044,7 +2050,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
def.resolve(); def.resolve();
}); });
this.viewmanager.on_mode_switch.add_first(function(n_mode, b, c, d, e) { this.viewmanager.on_mode_switch.add_first(function(n_mode, b, c, d, e) {
$.when(self.save_form_view()).then(function() { $.when(self.save_any_view()).then(function() {
if(n_mode === "list") if(n_mode === "list")
setTimeout(function() {self.reload_current_view();}, 0); setTimeout(function() {self.reload_current_view();}, 0);
}); });
@ -2154,7 +2160,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
this.dataset.to_delete, function(x) { this.dataset.to_delete, function(x) {
return commands['delete'](x.id);})); return commands['delete'](x.id);}));
}, },
save_form_view: function() { save_any_view: function() {
if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view && if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view &&
this.viewmanager.views[this.viewmanager.active_view] && this.viewmanager.views[this.viewmanager.active_view] &&
this.viewmanager.views[this.viewmanager.active_view].controller) { this.viewmanager.views[this.viewmanager.active_view].controller) {
@ -2166,6 +2172,13 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
console.warn("Asynchronous get_value() is not supported in form view."); console.warn("Asynchronous get_value() is not supported in form view.");
}*/ }*/
return res; return res;
} else if (this.viewmanager.active_view === "list") {
var res = $.when(view.ensure_saved());
// it seems line there are some cases when this happens
/*if (!res.isResolved() && !res.isRejected()) {
console.warn("Asynchronous get_value() is not supported in list view.");
}*/
return res;
} }
} }
return false; return false;
@ -2190,7 +2203,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
} }
}, },
is_dirty: function() { is_dirty: function() {
this.save_form_view(); this.save_any_view();
return this._super(); return this._super();
}, },
update_dom: function() { update_dom: function() {
@ -2318,6 +2331,10 @@ openerp.web.form.FieldMany2Many = openerp.web.form.Field.extend({
'deletable': self.is_readonly() ? false : true, 'deletable': self.is_readonly() ? false : true,
'selectable': self.multi_selection 'selectable': self.multi_selection
}); });
var embedded = (this.field.views || {}).tree;
if (embedded) {
this.list_view.set_embedded_view(embedded);
}
this.list_view.m2m_field = this; this.list_view.m2m_field = this;
var loaded = $.Deferred(); var loaded = $.Deferred();
this.list_view.on_loaded.add_last(function() { this.list_view.on_loaded.add_last(function() {
@ -2419,7 +2436,8 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
}, read_function: null}); }, read_function: null});
this.initial_ids = this.options.initial_ids; this.initial_ids = this.options.initial_ids;
this.created_elements = []; this.created_elements = [];
openerp.web.form.dialog(this.render(), {close:function() { this.render_element();
openerp.web.form.dialog(this.$element, {close:function() {
self.check_exit(); self.check_exit();
}}); }});
this.start(); this.start();
@ -2607,7 +2625,8 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp
this.row_id = row_id; this.row_id = row_id;
this.context = context || {}; this.context = context || {};
this.options = _.defaults(options || {}, {"auto_write": true}); this.options = _.defaults(options || {}, {"auto_write": true});
jQuery(this.render()).dialog({title: '', this.render_element();
this.$element.dialog({title: '',
modal: true, modal: true,
width: 960, width: 960,
height: 600}); height: 600});
@ -3013,7 +3032,7 @@ openerp.web.form.FieldSelectionReadonly = openerp.web.form.FieldReadonly.extend(
this.$element.find('div').text(option ? option[1] : this.values[0][1]); this.$element.find('div').text(option ? option[1] : this.values[0][1]);
} }
}); });
openerp.web.form.FieldMany2OneReadonly = openerp.web.form.FieldCharReadonly.extend({ openerp.web.form.FieldMany2OneReadonly = openerp.web.form.FieldURIReadonly.extend({
set_value: function (value) { set_value: function (value) {
value = value || null; value = value || null;
this.invalid = false; this.invalid = false;
@ -3023,24 +3042,39 @@ openerp.web.form.FieldMany2OneReadonly = openerp.web.form.FieldCharReadonly.exte
self.on_value_changed(); self.on_value_changed();
var real_set_value = function(rval) { var real_set_value = function(rval) {
self.value = rval; self.value = rval;
var div = $(self.$element.find('div')); self.$element.find('a')
div.html('<a href="javascript:void(0)"></a>'); .unbind('click')
var a = $(div.find("a")); .text(rval ? rval[1] : '')
a.text(rval ? rval[1] : ''); .click(function () {
a.click(function() { self.do_action({
var pop = new openerp.web.form.FormOpenPopup(self.view); type: 'ir.actions.act_window',
pop.show_element(self.field.relation, self.value[0],self.build_context(), {readonly:true}); res_model: self.field.relation,
}); res_id: self.value[0],
context: self.build_context(),
views: [[false, 'form']],
target: 'current'
});
return false;
});
}; };
if (value && !(value instanceof Array)) { if (value && !(value instanceof Array)) {
var dataset = new openerp.web.DataSetStatic( new openerp.web.DataSetStatic(
this, this.field.relation, self.build_context()); this, this.field.relation, self.build_context())
dataset.name_get([value], function(data) { .name_get([value], function(data) {
real_set_value(data[0]); real_set_value(data[0]);
}).fail(function() {self.tmp_value = undefined;}); });
} else { } else {
setTimeout(function() {real_set_value(value);}, 0); setTimeout(function() {real_set_value(value);}, 0);
} }
},
get_value: function() {
if (!this.value) {
return false;
} else if (this.value instanceof Array) {
return this.value[0];
} else {
return this.value;
}
} }
}); });

View File

@ -476,7 +476,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
* @param {Array} ids the ids of the records to delete * @param {Array} ids the ids of the records to delete
*/ */
do_delete: function (ids) { do_delete: function (ids) {
if (!(ids.length && confirm(_t("Are you sure to remove those records ?")))) { if (!(ids.length && confirm(_t("Do you really want to remove these records?")))) {
return; return;
} }
var self = this; var self = this;
@ -1145,9 +1145,12 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
row_data[group.grouped_on] = group; row_data[group.grouped_on] = group;
var group_column = _(self.columns).detect(function (column) { var group_column = _(self.columns).detect(function (column) {
return column.id === group.grouped_on; }); return column.id === group.grouped_on; });
$group_column.html(openerp.web.format_cell( try {
row_data, group_column, _t("Undefined") $group_column.html(openerp.web.format_cell(
)); row_data, group_column, _t("Undefined")));
} catch (e) {
$group_column.html(row_data[group_column.id].value);
}
if (group.openable) { if (group.openable) {
// Make openable if not terminal group & group_by_no_leaf // Make openable if not terminal group & group_by_no_leaf
$group_column $group_column

View File

@ -471,7 +471,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
$search_prefix = $title.find('span'); $search_prefix = $title.find('span');
if (controller.searchable !== false) { if (controller.searchable !== false) {
if (!$search_prefix.length) { if (!$search_prefix.length) {
$title.prepend('<span>' + _t("Search:") + '</span>'); $title.prepend('<span>' + _t("Search: ") + '</span>');
} }
} else { } else {
$search_prefix.remove(); $search_prefix.remove();

View File

@ -623,18 +623,9 @@
</td> </td>
</t> </t>
<t t-if="options.radio"> <th t-if="options.selectable" class="oe-record-selector" width="1">
<th t-if="options.selectable" class="oe-record-selector" width="1"> <input t-att-type="options.radio? 'radio': 'checkbox'" name ="radiogroup" t-att-checked="options.select_view_id == record.get('id')? true: null"/>
<input type="radio" name ="radiogroup"/> </th>
</th>
</t>
<t t-if="!options.radio">
<th t-if="options.selectable" class="oe-record-selector" width="1">
<input type="checkbox"/>
</th>
</t>
<t t-foreach="columns" t-as="column"> <t t-foreach="columns" t-as="column">
<t t-set="align" t-value="column.type === 'integer' or column.type == 'float'"/> <t t-set="align" t-value="column.type === 'integer' or column.type == 'float'"/>
<td t-if="!column.meta and column.invisible !== '1'" t-att-title="column.help" <td t-if="!column.meta and column.invisible !== '1'" t-att-title="column.help"
@ -1326,7 +1317,7 @@
</t> </t>
<t t-name="vieweditor_selection"> <t t-name="vieweditor_selection">
<select t-att-id="widget.name" > <select t-att-id="widget.name" >
<t t-foreach="widget.value" t-as="option"> <t t-if="widget.selection" t-foreach="widget.selection" t-as="option">
<option <option
t-att-value="typeof option === 'object' ? option[0] : option"> t-att-value="typeof option === 'object' ? option[0] : option">
<t t-esc="typeof option === 'object' ? option[1] : option"/> <t t-esc="typeof option === 'object' ? option[1] : option"/>

View File

@ -373,9 +373,8 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
}, },
open_list_view : function (id){ open_list_view : function (id){
var self = this; var self = this;
if($(".dhx_tooltip").is(":visible")) { // unconditionally nuke tooltips before switching view
$(".dhx_tooltip").remove('div'); $(".dhx_tooltip").remove('div');
}
id = id[this.abscissa]; id = id[this.abscissa];
if (typeof id == 'object'){ if (typeof id == 'object'){
id = id[0]; id = id[0];

View File

@ -20,13 +20,10 @@ openerp.web_mobile.MobileWebClient = openerp.web.Widget.extend({
openerp.web.qweb.add_template("xml/web_mobile.xml"); openerp.web.qweb.add_template("xml/web_mobile.xml");
var params = {}; var params = {};
this.$element.html(this.render()); this.$element.html(this.render());
this.session = new openerp.web.Session("oe_errors");
this.crashmanager = new openerp.web.CrashManager(this); this.crashmanager = new openerp.web.CrashManager(this);
this.login = new openerp.web_mobile.Login(this, "oe_login"); this.login = new openerp.web_mobile.Login(this, "oe_login");
// this.session.on_session_invalid.add(this.login.do_ask_login);
}, },
start: function() { start: function() {
this.session.start();
this.login.start(); this.login.start();
} }
}); });

View File

@ -96,10 +96,6 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
} }
} }
} }
}
if(notebook){
$(this).find('div#page_content').html(self.render({'get_fields': get_fields,'fields' : result.fields, 'values' : self.datarecord,'til': notebook.attrs.string }));
}else{
$(this).find('div#page_content').html(self.render({'get_fields': get_fields,'fields' : result.fields, 'values' : self.datarecord})); $(this).find('div#page_content').html(self.render({'get_fields': get_fields,'fields' : result.fields, 'values' : self.datarecord}));
} }
self.formatdata(get_fields, fields, result, self.datarecord,'page_content','element'); self.formatdata(get_fields, fields, result, self.datarecord,'page_content','element');
@ -135,16 +131,19 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
var relational = $(this).attr('for'); var relational = $(this).attr('for');
if(result.fields[relational]){ if(result.fields[relational]){
var head = $.trim($(this).text()); var head = $.trim($(this).text());
var dataset = new openerp.web.DataSetStatic(self, result.fields[relational].relation, result.fields[relational].context); var dataset = new openerp.web.DataSetSearch(self, result.fields[relational].relation, result.fields[relational].context);
dataset.domain=[['id', 'in', self.datarecord[relational]]]; dataset.domain=[['id', 'in', self.datarecord[relational]]];
dataset.name_search('', dataset.domain, 'in',false ,function(res){ dataset.read_slice([], {}, function(result1,ids){
for(var i=0;i<res.length;i++){ _.extend(self.action.context,{"html_name_get" : true});
var splited_data = res[i][1].split(','); var dataset1 = new openerp.web.DataSet(self, result.fields[relational].relation,result.fields[relational].context);
res[i][1] = splited_data[0]; dataset1.name_get(dataset.ids,function(res){
var additional = "";
if(res['html_name_get']){
additional = res['display'];
} }
if(!$('[id^="oe_list_'+relational+'_'+self.element_id+'"]').html()){ if(!$('[id^="oe_list_'+relational+'_'+self.element_id+'"]').html()){
$('<div id="oe_list_'+relational+'_'+self.element_id+'" data-role="page" data-url="oe_list_'+relational+'_'+self.element_id+'"> </div>').appendTo('#moe'); $('<div id="oe_list_'+relational+'_'+self.element_id+'" data-role="page" data-url="oe_list_'+relational+'_'+self.element_id+'"> </div>').appendTo('#moe');
$('[id^="oe_list_'+relational+'_'+self.element_id+'"]').html(openerp.web.qweb.render("ListView", {'records' : res})); $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').html(openerp.web.qweb.render("ListView", {'records' : res,'data': additional}));
$('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=header]").find('h1').html(head); $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=header]").find('h1').html(head);
$('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=header]").find('#home').click(function(){ $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("[data-role=header]").find('#home').click(function(){
$.mobile.changePage("#oe_menu", "slide", false, true); $.mobile.changePage("#oe_menu", "slide", false, true);
@ -179,6 +178,7 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
} }
if(!$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').html()){ if(!$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').html()){
$('<div id="oe_form_'+listid+result.fields[relational].relation+'" data-role="page" data-url="oe_form_'+listid+result.fields[relational].relation+'"> </div>').appendTo('#moe'); $('<div id="oe_form_'+listid+result.fields[relational].relation+'" data-role="page" data-url="oe_form_'+listid+result.fields[relational].relation+'"> </div>').appendTo('#moe');
for (var k = 0; k < notebooks.children.length; k++) { for (var k = 0; k < notebooks.children.length; k++) {
if (notebooks.children[k].attrs.string == lastid) { if (notebooks.children[k].attrs.string == lastid) {
get_fields = self.get_fields(notebooks.children[k].children); get_fields = self.get_fields(notebooks.children[k].children);
@ -194,7 +194,11 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
} }
} }
} }
$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').html(self.render({'get_fields': get_fields_test, 'notebooks': false, 'fields' : fields_test, 'values' : data_relational, 'temp_flag':'1' })); if(notebook){
$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').html(self.render({'get_fields': get_fields_test, 'notebooks': false, 'fields' : fields_test, 'values' : data_relational, 'temp_flag':'1' }));
}else{
$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').html(self.render({'get_fields': get_fields_test, 'notebooks': false, 'fields' : fields, 'values' : data_relational, 'temp_flag':'1' }));
}
$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=header]").find('h1').html(head_title); $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=header]").find('h1').html(head_title);
$('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=header]").find('#home').click(function(){ $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find("[data-role=header]").find('#home').click(function(){
$.mobile.changePage("#oe_menu", "slide", false, true); $.mobile.changePage("#oe_menu", "slide", false, true);
@ -229,7 +233,11 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
} }
} }
}); });
self.formatdata(get_fields_test, fields_test, result, data_relational,'oe_form_'+listid+result.fields[relational].relation,'element'); if(notebook){
self.formatdata(get_fields_test, fields_test, result, data_relational,'oe_form_'+listid+result.fields[relational].relation,'element');
}else{
self.formatdata(get_fields_test, fields, result, data_relational,'oe_form_'+listid+result.fields[relational].relation,'element');
}
$.mobile.changePage('#oe_form_'+listid+result.fields[relational].relation, "slide", false, true); $.mobile.changePage('#oe_form_'+listid+result.fields[relational].relation, "slide", false, true);
self.formatdata('', '', '', '','oe_form_'+listid+result.fields[relational].relation,'slider'); self.formatdata('', '', '', '','oe_form_'+listid+result.fields[relational].relation,'slider');
}else{ }else{
@ -241,7 +249,8 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
}else{ }else{
$.mobile.changePage("#oe_list_"+relational+"_"+self.element_id, "slide", false, true); $.mobile.changePage("#oe_list_"+relational+"_"+self.element_id, "slide", false, true);
} }
}); });
});
} }
}); });
$.mobile.changePage("#"+self.element_id, "slide", false, true); $.mobile.changePage("#"+self.element_id, "slide", false, true);
@ -256,6 +265,12 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
if (view_fields[i].tag == 'group') { if (view_fields[i].tag == 'group') {
this.get_fields(view_fields[i].children, this.fields); this.get_fields(view_fields[i].children, this.fields);
} }
if (view_fields[i].tag == 'level') {
this.get_fields(view_fields[i].children, this.fields);
}
if (view_fields[i].tag == 'page') {
this.get_fields(view_fields[i].children, this.fields);
}
} }
return this.fields; return this.fields;
}, },
@ -280,6 +295,18 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
$(this).val(dateresult); $(this).val(dateresult);
} }
} }
$('[id^="'+id+'"]').find('#website').each(function(){
$(this).css('display','inline-block');
$(this).css('width','60%');
});
$('[id^="'+id+'"]').find('#email').each(function(){
$(this).css('display','inline-block');
$(this).css('width','60%');
});
$('[id^="'+id+'"]').find('#email_from').each(function(){
$(this).css('display','inline-block');
$(this).css('width','60%');
});
}); });
// Temp: Selection set as disabled // Temp: Selection set as disabled
$('[id^="'+id+'"]').find('select').each(function() { $('[id^="'+id+'"]').find('select').each(function() {
@ -297,6 +324,16 @@ openerp.web_mobile.FormView = openerp.web.Widget.extend({
$(this).css('left', '-9999px'); $(this).css('left', '-9999px');
}); });
}); });
// image displayed with m2o field
$('[id^="'+id+'"]').find('div[class=ui-select]').each(function(){
$(this).next().each(function(){
if($(this).attr('id')=="formbutton"){
$(this).prev().css('display','inline-table');
$(this).prev().find('a').find('.ui-btn-inner').removeClass('ui-btn-inner');
$(this).prev().find('a').find('span:first').css('padding-right','150px');
}
});
});
} }
} }
}); });

View File

@ -19,36 +19,52 @@ openerp.web_mobile.ListView = openerp.web.Widget.extend({
var self = this; var self = this;
if (data.action.length) { if (data.action.length) {
this.action = data.action[0][2]; this.action = data.action[0][2];
this.on_search_data(); return this.rpc('/web/listview/load', {
model: this.action.res_model,
view_id: this.action.views[0][0],
view_type: "tree",
context: this.action.context,
toolbar: false
}, this.on_search_data);
} }
}, },
on_search_data: function(ev){ on_search_data: function(ev){
var self = this; var self = this;
var dataset = new openerp.web.DataSetStatic(this, this.action.res_model, this.action.context); var dataset = new openerp.web.DataSetSearch(this, this.action.res_model,this.action.context);
dataset.name_search('', this.action.domain, 'ilike', false, function(result){ dataset.domain = self.action.domain;
self.$element.html(self.render({'records' : result})); dataset.read_slice([], {}, function(result,ids){
self.$element.find("[data-role=header]").find('h1').html(self.action.name); _.extend(self.action.context,{"html_name_get" : true});
self.$element.find("[data-role=header]").find('#home').click(function(){
$.mobile.changePage("#oe_menu", "slide", false, true); var dataset1 = new openerp.web.DataSet(self, self.action.res_model,self.action.context);
}); dataset1.name_get(dataset.ids,function(res){
self.$element.find("[data-role=footer]").find('#shrotcuts').click(function(){ var additional = "";
if (!$('#oe_shortcuts').html().length) { if(res['html_name_get']){
this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); additional = res['display'];
this.shortcuts.start();
}else{
$.mobile.changePage("#oe_shortcuts", "slide", false, true);
} }
self.$element.html(self.render({'records': res, 'data': additional }));
self.$element.find("[data-role=header]").find('h1').html(self.action.name);
self.$element.find("[data-role=header]").find('#home').click(function(){
$.mobile.changePage("#oe_menu", "slide", false, true);
});
self.$element.find("[data-role=footer]").find('#shrotcuts').click(function(){
if (!$('#oe_shortcuts').html().length) {
this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts");
this.shortcuts.start();
}else{
$.mobile.changePage("#oe_shortcuts", "slide", false, true);
}
});
self.$element.find("[data-role=footer]").find('#preference').click(function(){
if(!$('#oe_options').html().length){
this.options = new openerp.web_mobile.Options(self, "oe_options");
this.options.start();
}else{
$.mobile.changePage("#oe_options", "slide", false, true);
}
});
self.$element.find("a#list-id").click(self.on_list_click);
$.mobile.changePage("#"+self.element_id, "slide", false, true);
}); });
self.$element.find("[data-role=footer]").find('#preference').click(function(){
if(!$('#oe_options').html().length){
this.options = new openerp.web_mobile.Options(self, "oe_options");
this.options.start();
}else{
$.mobile.changePage("#oe_options", "slide", false, true);
}
});
self.$element.find("a#list-id").click(self.on_list_click);
$.mobile.changePage("#"+self.element_id, "slide", false, true);
}); });
}, },
on_list_click: function(ev) { on_list_click: function(ev) {

View File

@ -132,13 +132,32 @@
<t t-name="ListView"> <t t-name="ListView">
<t t-call="Header" /> <t t-call="Header" />
<div id="content" data-role="content"> <div id="content" data-role="content">
<ul data-role="listview" data-inset="true" data-theme="d" data-filter="true"> <t t-if="!(records.length>0)">
<li data-theme="c" t-foreach="records" t-as="record"> No one record is created
<a id="list-id" t-att-data-id="record[0]" href="#"> </t>
<t t-esc="record[1]"/> <t t-if="records.length>0">
</a> <ul data-role="listview" data-inset="true" data-theme="d" data-filter="true">
</li> <li data-theme="c" t-foreach="records" t-as="record">
</ul> <t t-foreach="record[1].split(',')" t-as="data1">
<t t-if="record[1].split(',')[0]==data1">
<a id="list-id" t-att-data-id="record[0]" href="#">
<t t-esc="data1" />
</a>
</t>
</t>
<p>
<t t-foreach="record[1].split(',')" t-as="data1">
<t t-if="record[1].split(',')[0]!=data1">
<t t-esc="data1" />
</t>
</t>
</p>
<t t-foreach="data" t-as="data1">
<t t-esc="data1[0]" />
</t>
</li>
</ul>
</t>
</div> </div>
<t t-call="Footer" /> <t t-call="Footer" />
</t> </t>
@ -148,12 +167,11 @@
<t t-call="Header" /> <t t-call="Header" />
</t> </t>
<div data-role="content"> <div data-role="content">
<form> <form>
<t t-foreach="get_fields" t-as="field"> <t t-foreach="get_fields" t-as="field">
<div data-role="fieldcontain"> <div data-role="fieldcontain">
<t t-if="fields[field.attrs.name].type == 'char'"> <t t-if="fields[field.attrs.name].type == 'char'">
<label for=""> <label t-att-for="field.attrs.name">
<t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t> <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>: <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
</label> </label>
@ -178,7 +196,7 @@
<textarea name="" id="" readonly="true"></textarea> <textarea name="" id="" readonly="true"></textarea>
</t> </t>
<t t-if="fields[field.attrs.name].type == 'integer'"> <t t-if="fields[field.attrs.name].type == 'integer'">
<label for=""> <label t-att-for="field.attrs.name">
<t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t> <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>: <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
</label> </label>
@ -190,7 +208,7 @@
</t> </t>
</t> </t>
<t t-if="fields[field.attrs.name].type == 'float_time'"> <t t-if="fields[field.attrs.name].type == 'float_time'">
<label for=""> <label t-att-for="field.attrs.name">
<t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t> <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>: <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
</label> </label>
@ -202,7 +220,7 @@
</t> </t>
</t> </t>
<t t-if="fields[field.attrs.name].type == 'float'"> <t t-if="fields[field.attrs.name].type == 'float'">
<label for=""> <label t-att-for="field.attrs.name">
<t t-if="!(field.attrs.string)" t-esc="fields[field.attrs.name].string"></t> <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>: <t t-if="field.attrs.string" t-esc="field.attrs.string"></t>:
</label> </label>
@ -277,14 +295,18 @@
<select id="" data-native-menu="false" t-att-for="fields[field.attrs.name].relation"> <select id="" data-native-menu="false" t-att-for="fields[field.attrs.name].relation">
<t t-if="fields[field.attrs.name].selection"> <t t-if="fields[field.attrs.name].selection">
<t t-foreach="fields[field.attrs.name].selection" t-as="opt"> <t t-foreach="fields[field.attrs.name].selection" t-as="opt">
<t t-if="values[field.attrs.name]==opt[0]">
<t t-if="values[field.attrs.name] and values[field.attrs.name]==opt[0]">
<option t-att-value="opt[0]" selected="true" ><t t-esc="opt[1]"/></option> <option t-att-value="opt[0]" selected="true" ><t t-esc="opt[1]"/></option>
</t> </t>
<t t-if="values[field.attrs.name]!=opt[0]"> <t t-if="values[field.attrs.name] and values[field.attrs.name]!=opt[0]">
<option t-att-value="opt[0]" ><t t-esc="opt[1]"/></option> <option t-att-value="opt[0]" ><t t-esc="opt[1]"/></option>
</t> </t>
</t> </t>
</t> </t>
<t t-if="values[field.attrs.name] and !fields[field.attrs.name].selection">
<option t-att-value="values[field.attrs.name][0]" ><t t-esc="values[field.attrs.name][1]"/></option>
</t>
</select> </select>
<t t-if="fields[field.attrs.name].selection"> <t t-if="fields[field.attrs.name].selection">
<a id="formbutton" href="#" title="Form View"><img src="/web/static/src/img/icons/gtk-index.png" /></a> <a id="formbutton" href="#" title="Form View"><img src="/web/static/src/img/icons/gtk-index.png" /></a>
@ -292,11 +314,11 @@
</t> </t>
<t t-if="fields[field.attrs.name].type == 'one2many'"> <t t-if="fields[field.attrs.name].type == 'one2many'">
<ul data-role="listview" data-inset="true" data-theme="d"> <ul data-role="listview" data-inset="true" data-theme="d">
<li data-theme="c" t-att-for="field.attrs.name"> <li data-theme="c" t-att-for="field.attrs.name" >
<a href=""> <a href="">
<t t-esc="til"/> <t t-esc="fields[field.attrs.name].string"/>
</a> </a>
</li> </li>
</ul> </ul>
</t> </t>
</div> </div>
@ -325,4 +347,4 @@
<t t-call="Footer" /> <t t-call="Footer" />
</t> </t>
</t> </t>
</templates> </templates>