Valentin Lab has proposed merging
lp:~vaab/openerp-web/mobile-client-imp-use-main-formview into
lp:~openerp-dev/openerp-web/mobile-client.
Requested reviews:
OpenERP R&D Team (openerp-dev)
For more details, see:
https://code.launchpad.net/~vaab/openerp-web/mobile-client-imp-use-main-formview/+merge/77886
This is big rewrite of the mobile FormView widget to rely heavily on the legacy
web's FormView. This was necessary to get access to the "save" feature in the
mobile version. While this feature is not implemented in this branch, it's only
matter of linking a button to the "do_save()" method now.
This is a big rewrite and as such it needs a thorough review, and I'm open to
all comments.
Main points are:
- the template and the widget for the form is not anymore mono-block, it calls
subwidget's template and classes
- it's using the same registry system to get widget's class
- Some huge part of the code (templates and javascript) is inherited from
FormView.
- the resulting code is slightly smaller than precedent
- rendered HTML is very close to the rendered HTML of previous implementation
- More field's type are supported to be rendered.
- widget's can now give their values and are ready for the do_save() method...
Parts that should be extensively reviewed:
- Support of "new" widgets
- is it at least at iso-functionality with previous implementation
- rendered HTML has small differences, does this fits needs ?
Please take a look.
WARNING: this branch needs the 4 commits on openerp-web/addons/web/* I've
proposed in lp:~vaab/openerp-web/imp-allow-mobile-subclassing (especially, the
notebook one and the "id" selector bug-fix.)
--
https://code.launchpad.net/~vaab/openerp-web/mobile-client-imp-use-main-formview/+merge/77886
Your team OpenERP R&D Team is requested to review the proposed merge of
lp:~vaab/openerp-web/mobile-client-imp-use-main-formview into
lp:~openerp-dev/openerp-web/mobile-client.
=== modified file 'addons/web_mobile/static/src/js/chrome_mobile.js'
--- addons/web_mobile/static/src/js/chrome_mobile.js 2011-09-29 09:48:06 +0000
+++ addons/web_mobile/static/src/js/chrome_mobile.js 2011-10-03 10:00:32 +0000
@@ -20,6 +20,8 @@
if(document.URL.length>59){
window.location.replace('/mobile');
}
+ // XXXvlab: isn't an "t-include" statement exists in t-... ?
+ openerp.web.qweb.add_template("/web/static/src/xml/base.xml");
openerp.web.qweb.add_template("xml/web_mobile.xml");
var params = {};
this.$element.html(this.render());
=== modified file 'addons/web_mobile/static/src/js/form_mobile.js'
--- addons/web_mobile/static/src/js/form_mobile.js 2011-09-29 09:48:06 +0000
+++ addons/web_mobile/static/src/js/form_mobile.js 2011-10-03 10:00:32 +0000
@@ -4,248 +4,71 @@
openerp.web_mobile.form_mobile = function (openerp) {
-openerp.web_mobile.FormView = openerp.web.Widget.extend({
-
- template: 'FormView',
+openerp.web_mobile.FormView = openerp.web.FormView.extend({
init: function(session, element_id, list_id, action, head_title, resmodel, viewid) {
- this._super(session, element_id);
+ this._super(session, /* dataset */ {}, viewid, /* options */ {});
+
this.list_id = list_id;
this.action = action;
this.head_title = head_title;
this.resmodel = resmodel;
this.viewid = viewid;
- },
- start: function() {
- var self = this;
- var id = this.list_id;
- var model = this.action.res_model || this.resmodel;
+
+ this.model = this.action.res_model || this.resmodel;
+
if(this.action){
- var view_id = this.action.views[1][0];
+ this.view_id = this.action.views[1][0];
}else{
- var view_id = this.viewid;
+ this.view_id = this.viewid;
}
- this.dataset = new openerp.web.DataSetSearch(this, model, null, null);
- var context = new openerp.web.CompoundContext(this.dataset.get_context());
+
+ this.registry = openerp.web_mobile.form.widgets;
+
+ // XXXvlab: to remove somehow (comes from Widget.init obsoleted code)
+ this.element_id = element_id;
+ this.element_id = this.element_id || _.uniqueId(this.identifier_prefix);
+ var tmp = document.getElementById(this.element_id);
+ this.$element = tmp ? $(tmp) : undefined;
+
+
+ },
+ start: function() {
+ var self = this;
+
+ // mobile specific
+ $.when(this.has_been_loaded).then(function() {
+ self.do_show().then(function() {
+ $.mobile.changePage("#"+self.element_id, "slide", false, true);
+ })
+ });
+
+ this.dataset = new openerp.web.DataSetSearch(this, this.model, null, null);
this.dataset.read_slice([],{}, function (result) {
for (var i = 0; i < result.length; i++) {
- if (result[i].id == id) {
- self.datarecord = result[i];
- }
- }
- self.rpc("/web/view/load", {"model": model, "view_id": view_id, "view_type": "form", context: context}, self.on_loaded)
- });
- },
- on_loaded: function(result) {
- var self = this;
- var fields = result.fields;
- var view_fields = result.arch.children;
- var get_fields = this.get_fields(view_fields);
- for (var j = 0; j < view_fields.length; j++) {
- if (view_fields[j].tag == 'notebook') {
- var notebooks = view_fields[j];
- }
- }
- self.$element.html(self.render({'get_fields': get_fields, 'notebooks': notebooks || false, 'fields' : fields, 'values' : self.datarecord ,'temp_flag':'1'}));
- for(var i=0;i<get_fields.length;i++) {
- if (get_fields[i].attrs.widget=="progressbar") {
- $("#progress").progressbar({value:self.datarecord[get_fields[i].attrs.name]})
- }
- }
- self.$element.find("[data-role=header]").find('h1').html(self.head_title);
- 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('#formbutton').click(function(){
- var head = $(this).prev().find('select').find("option:selected").text();
- var selected_id = $(this).prev().find('select').val();
- var select_model = $(this).prev().find('select').attr('for');
- if(selected_id!="false"){
- if(!$('[id^="oe_form_'+selected_id+select_model+'"]').html()){
- $('<div id="oe_form_'+selected_id+select_model+'" data-role="page" data-url="oe_form_'+selected_id+select_model+'"> </div>').appendTo('#moe');
- this.formview = new openerp.web_mobile.FormView(self, "oe_form_"+selected_id+select_model, selected_id, '', head, select_model, false);
- this.formview.start();
- }else{
- $.mobile.changePage('#oe_form_'+selected_id+select_model, "slide", false, true);
- }
- }
- });
- self.$element.find('[data-role=collapsible-set]').find('[data-role=collapsible]').each(function(i){
- for (var k = 0; k < notebooks.children.length; k++) {
- if (notebooks.children[k].attrs.string == $(this).attr('id')) {
- get_fields = self.get_fields(notebooks.children[k].children);
- for (var i = 0; i < get_fields.length; i++) {
- if (fields[get_fields[i].attrs.name].type == 'one2many'){
- self.relational_fields = get_fields[i].attrs.name;
- if(fields[get_fields[i].attrs.name].views.form){
- 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){
- $(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').find('#formbutton').click(function(){
- var head = $(this).prev().find('select').find("option:selected").text();
- var selected_id = $(this).prev().find('select').val();
- var select_model = $(this).prev().find('select').attr('for');
- if(selected_id!="false"){
- if(!$('[id^="oe_form_'+selected_id+select_model+'"]').html()){
- $('<div id="oe_form_'+selected_id+select_model+'" data-role="page" data-url="oe_form_'+selected_id+select_model+'"> </div>').appendTo('#moe');
- this.formview = new openerp.web_mobile.FormView(self, "oe_form_"+selected_id+select_model, selected_id, '', head, select_model, false);
- this.formview.start();
- }else{
- $.mobile.changePage('#oe_form_'+selected_id+select_model, "slide", false, true);
- }
- }
- });
- }
- });
- self.$element.find('[data-role=collapsible-set]').find('[data-role=collapsible]').find('div#page_content').find('[data-role=content]').find('ul').find('li').click(function(ev){
- ev.preventDefault();
- ev.stopPropagation();
- var latid,lastid;
- $(this).parents().each(function(){
- latid = $(this).attr('id');
- self.$element.find('[data-role=collapsible-set]').find('[data-role=collapsible]').each(function(){
- if(latid==$(this).attr('id')){
- lastid = $(this).attr('id');
- }
- });
- });
- var relational = $(this).attr('for');
- if(result.fields[relational]){
- var head = $.trim($(this).text());
- var dataset = new openerp.web.DataSetStatic(self, result.fields[relational].relation, result.fields[relational].context);
- dataset.domain=[['id', 'in', self.datarecord[relational]]];
- dataset.name_search('', dataset.domain, 'in',false ,function(res){
- for(var i=0;i<res.length;i++){
- var splited_data = res[i][1].split(',');
- res[i][1] = splited_data[0];
- }
- 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');
- $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').html(openerp.web.qweb.render("ListView", {'records' : res}));
- $('[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(){
- $.mobile.changePage("#oe_menu", "slide", false, true);
- });
- $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').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);
- }
- });
- $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').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);
- }
- });
- $('[id^="oe_list_'+relational+'_'+self.element_id+'"]').find("a#list-id").click(function(ev){
- ev.preventDefault();
- ev.stopPropagation();
- var head_title = $(this).text();
- var listid = $(ev.currentTarget).data('id');
- dataset = new openerp.web.DataSetSearch(self, dataset.model, null, null);
- dataset.read_slice([],{}, function (result_relational) {
- for (var i = 0; i < result_relational.length; i++) {
- if (result_relational[i].id == listid) {
- var data_relational = result_relational[i];
- }
- }
- 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');
- for (var k = 0; k < notebooks.children.length; k++) {
- if (notebooks.children[k].attrs.string == lastid) {
- get_fields = self.get_fields(notebooks.children[k].children);
- for (var i = 0; i < get_fields.length; i++) {
- if (fields[get_fields[i].attrs.name].type == 'one2many'){
- self.relational_fields = get_fields[i].attrs.name;
- if(fields[get_fields[i].attrs.name].views.form){
- 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;
- }
- }
- }
- }
- }
- $('[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' }));
- $('[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(){
- $.mobile.changePage("#oe_menu", "slide", false, true);
- });
- $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').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);
- }
- });
- $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').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);
- }
- });
- $('[id^="oe_form_'+listid+result.fields[relational].relation+'"]').find('#formbutton').click(function(){
- var head = $(this).prev().find('select').find("option:selected").text();
- var selected_id = $(this).prev().find('select').val();
- var select_model = $(this).prev().find('select').attr('for');
- if(selected_id!="false"){
- if(!$('[id^="oe_form_'+selected_id+select_model+'"]').html()){
- $('<div id="oe_form_'+selected_id+select_model+'" data-role="page" data-url="oe_form_'+selected_id+select_model+'"> </div>').appendTo('#moe');
- this.formview = new openerp.web_mobile.FormView(self, "oe_form_"+selected_id+select_model, selected_id, '', head, select_model, false);
- this.formview.start();
- }else{
- $.mobile.changePage('#oe_form_'+selected_id+select_model, "slide", false, true);
- }
- }
- });
- $.mobile.changePage('#oe_form_'+listid+result.fields[relational].relation, "slide", false, true);
- }else{
- $.mobile.changePage('#oe_form_'+listid+result.fields[relational].relation, "slide", false, true);
- }
- });
- });
- $.mobile.changePage("#oe_list_"+relational+"_"+self.element_id, "slide", false, true);
- }else{
- $.mobile.changePage("#oe_list_"+relational+"_"+self.element_id, "slide", false, true);
- }
- });
- }
- });
- $.mobile.changePage("#"+self.element_id, "slide", false, true);
- },
+ if (result[i].id == self.list_id) {
+ // this is done by views in openerp-web classic
+ self.dataset.index = i;
+ }
+ }
+ self.init_view();
+ });
+ },
+
+ // XXXvlab: this method does not "show" ! it loads data into fields.
+ // it differs from super method in the way that it doesn't call show() method
+ // on "this.$element".
+ do_show: function () {
+ var promise;
+ if (this.dataset.index === null) {
+ // null index means we should start a new record
+ promise = this.on_button_new();
+ } else {
+ promise = this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded);
+ }
+ return promise;
+ },
+
get_fields: function(view_fields, fields) {
this.fields = fields || [];
for (var i=0; i < view_fields.length; i++){
@@ -260,4 +83,151 @@
}
});
+/** @namespace */
+openerp.web_mobile.form = {};
+
+openerp.web_mobile.form.FieldBoolean = openerp.web.form.Field.extend({
+
+ template: "FieldBoolean",
+
+ // XXXvlab: could try to keep the reference of
+ // this.$element.find('option[value="on"]') in the object to go faster...
+
+ get_value_from_ui: function () {
+ return this.$element.find('option[value="on"]').is(":selected");
+ },
+
+ start: function() {
+ var self = this;
+ this._super.apply(this, arguments);
+ this.$element.find('select').change(function() {
+ if (self.get_value_from_ui() != self.value) {
+ self.on_ui_change();
+ }
+ });
+ },
+ set_value: function(value) {
+ this._super.apply(this, arguments);
+ this.$element.find('option[value="on"]')[0].selected = value;
+ this.$element.find('option[value="off"]')[0].selected = !value;
+ },
+ set_value_from_ui: function() {
+ this.value = this.get_value_from_ui();
+ this._super();
+ },
+ update_dom: function() {
+ this._super.apply(this, arguments);
+ this.$element.find('select').attr('disabled', this.readonly);
+ },
+ validate: function() {
+ this.invalid = this.required && !this.get_value_from_ui();
+ },
+ focus: function() {
+ this.$element.find('select').focus();
+ }
+});
+
+
+openerp.web_mobile.form.WidgetFrame = openerp.web.form.Widget.extend({
+
+ template: "WidgetFrame",
+
+ init: function(view, node) {
+ this._super(view, node);
+
+ this.widgets = [];
+ for (var i = 0; i < node.children.length; i++) {
+ var n = node.children[i];
+ if (n.tag == "newline") {
+ // XXXvlab: Not implemented
+ //this.add_separator();
+ } else {
+ this.handle_node(n);
+ }
+ }
+ },
+ handle_node: function(node) {
+ try {
+ var type = {};
+ if (node.tag == 'field') {
+ type = (this.view.fields_view.fields[node.attrs.name] || {}).type;
+ }
+ var Class = this.view.registry.get_any([node.attrs.widget, type, node.tag]);
+ var widget = new Class(this.view, node);
+ if (node.tag == 'field') {
+
+ if (!this.view.default_focus_field || node.attrs.default_focus == '1') {
+ this.view.default_focus_field = widget;
+ }
+
+ if (node.attrs.nolabel != '1') {
+ // We will add a dummy label Widget
+ var label = new (this.view.registry.get_object('label')) (this.view, node);
+ label["for"] = widget;
+ widget.label_widget = label;
+ }
+ // XXXvlab: no better way to get the info in templates that this is a 'field' ?
+ widget.tag = 'field';
+ }
+ this.widgets.push(widget);
+ } catch(e) {
+ console.log(e);
+ }
+ },
+});
+
+openerp.web_mobile.form.WidgetNotebookPage = openerp.web_mobile.form.WidgetFrame.extend({});
+
+openerp.web_mobile.form.WidgetButton = openerp.web.form.WidgetButton.extend({
+ jquery_mobile_icon_map: {
+ 'stage_previous': 'arrow-l',
+ 'stage_next': 'arrow-r',
+ // 'case_cancel': 'delete',
+ // 'case_open': 'forward',
+ // 'case_mark_lost': 'delete',
+ // 'case_pending': 'alert',
+ },
+ init: function(view, node) {
+ this._super(view, node);
+ this.jqm_icon = this.jquery_mobile_icon_map[this.node.attrs.name];
+ },
+});
+
+
+/**
+ * Registry of form widgets, called by :js:`openerp.web.FormView`
+ */
+openerp.web_mobile.form.widgets = new openerp.web.Registry({
+ 'boolean' : 'openerp.web_mobile.form.FieldBoolean',
+ 'frame' : 'openerp.web_mobile.form.WidgetFrame',
+ 'group' : 'openerp.web_mobile.form.WidgetFrame',
+ 'notebookpage' : 'openerp.web_mobile.form.WidgetNotebookPage',
+ 'button' : 'openerp.web_mobile.form.WidgetButton',
+
+ 'char' : 'openerp.web.form.FieldChar',
+ 'label' : 'openerp.web.form.WidgetLabel',
+ 'notebook' : 'openerp.web.form.WidgetNotebook',
+ 'separator' : 'openerp.web.form.WidgetSeparator',
+ 'email' : 'openerp.web.form.FieldEmail',
+ 'url' : 'openerp.web.form.FieldUrl',
+ 'text' : 'openerp.web.form.FieldText',
+ 'text_wiki' : 'openerp.web.form.FieldText',
+ // 'date' : 'openerp.web.form.FieldDate',
+ // 'datetime' : 'openerp.web.form.FieldDatetime',
+ 'selection' : 'openerp.web.form.FieldSelection',
+ // 'many2one' : 'openerp.web.form.FieldMany2One',
+ // 'many2many' : 'openerp.web.form.FieldMany2Many',
+ // 'one2many' : 'openerp.web.form.FieldOne2Many',
+ 'one2many_list' : 'openerp.web.form.FieldOne2Many',
+ 'reference' : 'openerp.web.form.FieldReference',
+ 'float' : 'openerp.web.form.FieldFloat',
+ 'integer': 'openerp.web.form.FieldFloat',
+ 'float_time': 'openerp.web.form.FieldFloat',
+ 'progressbar': 'openerp.web.form.FieldProgressBar',
+ 'image': 'openerp.web.form.FieldBinaryImage',
+ 'binary': 'openerp.web.form.FieldBinaryFile',
+ 'statusbar': 'openerp.web.form.FieldStatus'
+});
+
+
};
=== modified file 'addons/web_mobile/static/src/js/web_mobile.js'
--- addons/web_mobile/static/src/js/web_mobile.js 2011-08-18 13:24:18 +0000
+++ addons/web_mobile/static/src/js/web_mobile.js 2011-10-03 10:00:32 +0000
@@ -5,5 +5,11 @@
openerp.web_mobile = function(instance) {
openerp.web_mobile.chrome_mobile(instance);
openerp.web_mobile.list_mobile(instance);
+
+ // from web javascript
+ openerp.web.views(instance);
+ openerp.web.list(instance);
+ openerp.web.form(instance);
+
openerp.web_mobile.form_mobile(instance);
};
=== modified file 'addons/web_mobile/static/src/web_mobile.html'
--- addons/web_mobile/static/src/web_mobile.html 2011-09-23 09:05:38 +0000
+++ addons/web_mobile/static/src/web_mobile.html 2011-10-03 10:00:32 +0000
@@ -21,6 +21,9 @@
<script type="text/javascript" src="/web/static/src/js/chrome.js"></script>
<script type="text/javascript" src="/web/static/src/js/data.js"></script>
<script type="text/javascript" src="/web/static/src/js/formats.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/view_list.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/view_form.js"></script>
<script type="text/javascript" src="/web_mobile/static/src/js/web_mobile.js"></script>
<script type="text/javascript" src="/web_mobile/static/src/js/chrome_mobile.js"></script>
=== modified file 'addons/web_mobile/static/src/xml/web_mobile.xml'
--- addons/web_mobile/static/src/xml/web_mobile.xml 2011-09-28 06:58:42 +0000
+++ addons/web_mobile/static/src/xml/web_mobile.xml 2011-10-03 10:00:32 +0000
@@ -144,160 +144,171 @@
</t>
<t t-name="FormView">
- <t t-if="temp_flag">
- <t t-call="Header" />
- </t>
- <div data-role="content">
- <form>
- <t t-foreach="get_fields" t-as="field">
- <div data-role="fieldcontain">
- <t t-if="fields[field.attrs.name].type == 'char'">
- <label for="">
- <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>:
- </label>
- <t t-if="values[field.attrs.name]">
- <input type="text" id="" t-att-value="values[field.attrs.name]"/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input type="text" value="" id=""/>
- </t>
- <t t-if="(field.attrs.name == 'email' or field.attrs.name == 'email_from') and values[field.attrs.name]">
- <a t-att-href="'mailto:'+values[field.attrs.name]"><img src="/web/static/src/img/icons/terp-mail-message-new.png" /></a>
- </t>
- <t t-if="field.attrs.name == 'website' and values[field.attrs.name]">
- <a t-att-href="values[field.attrs.name]"><img src="/web/static/src/img/icons/gtk-ok.png" title="Open this resource"/></a>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'text'">
- <label for="">
- <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>:
- </label>
- <textarea name="" id=""></textarea>
- </t>
- <t t-if="fields[field.attrs.name].type == 'float'">
- <label for="">
- <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>:
- </label>
- <t t-if="values[field.attrs.name] and field.attrs.name=='progress_rate'">
- <div id="progress" value="" title="Percent of tasks closed according to total of tasks to do..."></div>
- </t>
- <t t-if="!(values[field.attrs.name]) and field.attrs.name=='progress_rate'">
- <div id="progress" value="" title="Percent of tasks closed according to total of tasks to do..."></div>
- </t>
- <t t-if="values[field.attrs.name] and field.attrs.name!='progress_rate'">
- <input id="" type="text" t-att-value="values[field.attrs.name]"/>
- </t>
- <t t-if="!values[field.attrs.name] and field.attrs.name!='progress_rate'">
- <input id="" type="text" value=""/>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'date'">
- <label for="">
- <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>:
- </label>
- <t t-if="values[field.attrs.name]">
- <input id="" type="text" t-att-value="values[field.attrs.name]"/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input id="" type="text" value=""/>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'datetime'">
- <label for="">
- <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>:
- </label>
- <t t-if="values[field.attrs.name]">
- <input id="" type="text" t-att-value="values[field.attrs.name]"/>
- </t>
- <t t-if="!(values[field.attrs.name])">
- <input id="" type="text" value=""/>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'boolean'">
- <div data-role="fieldcontain">
- <label for="slider"><t t-esc="fields[field.attrs.name].string" /> :</label>
- <select name="slider" id="slider" data-role="slider">
- <t t-if="values[field.attrs.name]">
- <option value="on" selected="true">On</option>
- <option value="off">Off</option>
- </t>
- <t t-if="!values[field.attrs.name]">
- <option value="on">On</option>
- <option value="off" selected="true">Off</option>
- </t>
- </select>
- </div>
- </t>
- <t t-if="fields[field.attrs.name].type == 'selection'">
- <label for="" class="select">
- <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>:
- </label>
- <select id="" data-native-menu="false">
- <t t-foreach="fields[field.attrs.name].selection" t-as="opt">
- <option t-att-value="opt[0]"><t t-esc="opt[1]"/></option>
- </t>
- </select>
- </t>
- <t t-if="fields[field.attrs.name].type == 'many2one'">
- <label for="" class="select">
- <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>:
- </label>
- <select id="" data-native-menu="false" t-att-for="fields[field.attrs.name].relation">
- <t t-if="fields[field.attrs.name].selection">
- <t t-foreach="fields[field.attrs.name].selection" t-as="opt">
- <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>
- <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>
- </t>
- </t>
- <t t-if="fields[field.attrs.name].type == 'one2many'">
- <ul data-role="listview" data-inset="true" data-theme="d">
- <li data-theme="c" t-att-for="field.attrs.name">
- <a href="">
- <t t-esc="til"/>
- </a>
- </li>
- </ul>
- </t>
- </div>
- </t>
- <t t-if="notebooks">
- <div data-role="collapsible-set">
- <t t-foreach="notebooks.children" t-as="page">
- <t t-if="page.attrs.invisible">
- <div style="display:none;" data-collapsed="true" data-role="collapsible" t-att-id="page.attrs.string">
- <h3><t t-esc="page.attrs.string"></t></h3>
- <div id="page_content" />
- </div>
- </t>
- <t t-if="!page.attrs.invisible">
- <div data-collapsed="true" data-role="collapsible" t-att-id="page.attrs.string">
- <h3><t t-esc="page.attrs.string"></t></h3>
- <div id="page_content" />
- </div>
- </t>
- </t>
- </div>
- </t>
- </form>
- </div>
- <t t-if="temp_flag">
- <t t-call="Footer" />
- </t>
-</t>
+ <t t-call="Header" />
+ <div id="content" data-role="content">
+ <form>
+ <t t-raw="frame.render()"/>
+ </form>
+ </div>
+ <t t-call="Footer" />
+</t>
+
+<t t-name="FieldBoolean">
+ <select name="widget.name" data-role="slider">
+ <option value="on">On</option>
+ <option value="off">Off</option>
+ </select>
+</t>
+
+<t t-name="FieldChar">
+ <t t-if="widget.value">
+ <input type="text" id="" t-att-value="widget.value"/>
+ </t>
+ <t t-if="!(widget.value)">
+ <input type="text" value="" id=""/>
+ </t>
+ <t t-if="(widget.name == 'email' or widget.name == 'email_from') and widget.value">
+ <a t-att-href="'mailto:'+widget.value"><img src="/web/static/src/img/icons/terp-mail-message-new.png" /></a>
+ </t>
+ <t t-if="widget.name == 'website' and widget.value">
+ <a t-att-href="widget.value"><img src="/web/static/src/img/icons/gtk-ok.png" title="Open this resource"/></a>
+ </t>
+</t>
+
+<t t-name="FieldText">
+ <textarea name="" id=""></textarea>
+</t>
+
+<t t-name="FieldFloat">
+ <t t-if="widget.value and widget.name=='progress_rate'">
+ <div id="progress" value=""
+ title="Percent of tasks closed according to total of tasks to do..."></div>
+ </t>
+ <t t-if="!(widget.value) and widget.name=='progress_rate'">
+ <div id="progress" value=""
+ title="Percent of tasks closed according to total of tasks to do..."></div>
+ </t>
+ <t t-if="widget.value and widget.name!='progress_rate'">
+ <input id="" type="text" t-att-value="widget.value"/>
+ </t>
+ <t t-if="!widget.value and widget.name!='progress_rate'">
+ <input id="" type="text" value=""/>
+ </t>
+</t>
+
+<t t-name="FieldDate">
+ <t t-if="widget.value">
+ <input id="" type="text" t-att-value="widget.value"/>
+ </t>
+ <t t-if="!(widget.value)">
+ <input id="" type="text" value=""/>
+ </t>
+</t>
+
+<t t-name="FieldDateTime">
+ <t t-if="widget.value">
+ <input id="" type="text" t-att-value="widget.value"/>
+ </t>
+ <t t-if="!(widget.value)">
+ <input id="" type="text" value=""/>
+ </t>
+</t>
+
+<t t-name="FieldSelection">
+ <select id="" data-native-menu="false">
+ <t t-foreach="widget.values" t-as="option">
+ <option t-att-value="option[0]"><t t-esc="option[1]"/></option>
+ </t>
+ </select>
+</t>
+
+
+<t t-name="FieldMany2One">
+ <select id="" data-native-menu="false" t-att-for="widget.relation">
+ <t t-if="widget.selection">
+ <t t-foreach="widget.selection" t-as="opt">
+ <t t-if="widget.value==opt[0]">
+ <option t-att-value="opt[0]" selected="true" ><t t-esc="opt[1]"/></option>
+ </t>
+ <t t-if="widget.value!=opt[0]">
+ <option t-att-value="opt[0]" ><t t-esc="opt[1]"/></option>
+ </t>
+ </t>
+ </t>
+ </select>
+ <t t-if="widget.selection">
+ <a id="formbutton" href="#" title="Form View"><img src="/web/static/src/img/icons/gtk-index.png" /></a>
+ </t>
+</t>
+
+<t t-name="FieldOne2Many">
+ <ul data-role="listview" data-inset="true" data-theme="d">
+ <li data-theme="c" t-att-for="widget.name">
+ <a href="">
+ <t t-esc="til"/>
+ </a>
+ </li>
+ </ul>
+</t>
+
+<t t-name="WidgetFrame">
+ <t t-foreach="widget.widgets" t-as="w">
+ <div t-if="w.tag == 'field'" t-att-id="w.element_id" data-role="fieldcontain">
+ <t t-if="w.label_widget" t-raw="w.label_widget.render()" />
+ <t t-raw="w.render()" />
+ </div>
+ <t t-if="w.tag != 'field'" t-raw="w.render()" />
+ </t>
+</t>
+
+<t t-name="WidgetLabel">
+ <label t-att-title="widget.help" for="">
+ <t t-esc="widget.string"/>
+ <span t-if="widget.help">?</span>
+ <t t-if="widget.string and widget.node.tag != 'label'">:</t>
+ </label>
+</t>
+
+<t t-name="WidgetNotebook">
+ <div data-role="collapsible-set">
+ <t t-foreach="widget.pages" t-as="page">
+ <t t-if="page.invisible">
+ <div style="display:none;" data-collapsed="true" data-role="collapsible" t-att-id="page.string">
+ <h3><t t-esc="page.string"></t></h3>
+ <t t-raw="page.render()"/>
+ </div>
+ </t>
+ <t t-if="!page.invisible">
+ <div data-collapsed="true" data-role="collapsible" t-att-id="page.string">
+ <h3><t t-esc="page.string"></t></h3>
+ <t t-raw="page.render()"/>
+ </div>
+ </t>
+ </t>
+ </div>
+</t>
+
+<t t-name="WidgetButton">
+ <button type="button"
+ t-att-id="widget.element_id + '_button'"
+ t-att-title="widget.help"
+ t-att-data-icon="widget.jqm_icon"
+ style="width: 100%"
+ class="button">
+ <img t-if="widget.node.attrs.icon" t-att-src="'/web/static/src/img/icons/' + widget.node.attrs.icon + '.png'" width="16" height="16"/>
+ <span t-if="widget.string"><t t-esc="widget.string"/></span>
+ </button>
+</t>
+
+<t t-name="WidgetSeparator">
+ <div t-if="widget.orientation !== 'vertical'" t-att-class="'separator ' + widget.orientation">
+ <h4 t-if="widget.string" ><t t-esc="widget.string" /></h4>
+ </div>
+</t>
+
+<t t-name="Widget">
+ Unhandled widget
+ <t t-raw="widget.node.tag" />
+</t>
+
</templates>
_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help : https://help.launchpad.net/ListHelp