[IMP] Improved FieldChar widget

bzr revid: fme@openerp.com-20110322171801-e5jmov41xg3pnzfz
This commit is contained in:
Fabien Meghazi 2011-03-22 18:18:01 +01:00
parent 2a068e2152
commit 8284359b83
4 changed files with 141 additions and 70 deletions

View File

@ -416,6 +416,9 @@ body.openerp {
border-bottom-width: 1px; border-bottom-width: 1px;
margin: 6px 4px 6px 1px; margin: 6px 4px 6px 1px;
} }
.openerp input[required=required], .openerp select[required=required] {
background-color: #D2D2FF;
}
/* jQuery UI override */ /* jQuery UI override */
.openerp .ui-widget { .openerp .ui-widget {

View File

@ -162,28 +162,28 @@
<td t-att-colspan="td.colspan gt 1 ? td.colspan : undefined" <td t-att-colspan="td.colspan gt 1 ? td.colspan : undefined"
t-att-width="td.width ? td.width : undefined" t-att-width="td.width ? td.width : undefined"
t-att-nowrap="td.is_field_label ? 'true' : undefined" t-att-nowrap="td.is_field_label ? 'true' : undefined"
t-att-valign="td.table ? 'top' : undefined"> t-att-valign="td.table ? 'top' : undefined"
<t t-raw="td.render()"/> t-att-id="td.element_id"
>
<t t-raw="td.render()"/>
</td> </td>
</t> </t>
</tr> </tr>
</table> </table>
</t> </t>
<t t-name="WidgetNotebook"> <t t-name="WidgetNotebook">
<div t-att-id="widget.element_id"> <ul>
<ul> <li t-foreach="widget.pages" t-as="page">
<li t-foreach="widget.pages" t-as="page"> <a t-att-href="'#' + widget.element_id + '-' + page_index">
<a t-att-href="'#' + widget.element_id + '-' + page_index"> <t t-esc="page.string"/>
<t t-esc="page.string"/> </a>
</a> </li>
</li> </ul>
</ul> <t t-foreach="widget.pages" t-as="page">
<t t-foreach="widget.pages" t-as="page"> <div t-att-id="widget.element_id + '-' + page_index">
<div t-att-id="widget.element_id + '-' + page_index"> <t t-raw="page.render()"/>
<t t-raw="page.render()"/> </div>
</div> </t>
</t>
</div>
</t> </t>
<t t-name="WidgetSeparator"> <t t-name="WidgetSeparator">
<div t-att-class="'separator ' + (widget.node.attrs.orientation || 'horizontal')"> <div t-att-class="'separator ' + (widget.node.attrs.orientation || 'horizontal')">
@ -191,23 +191,39 @@
</div> </div>
</t> </t>
<t t-name="WidgetLabel"> <t t-name="WidgetLabel">
<label t-att-for="widget.for.element_id" t-att-title="widget.for.help" style="display: block; text-align: right;" t-att-ondblclick="'console.log(openerp.screen.oe_main.formview.widgets[\'' + widget.for.element_id + '\'])'"> <label t-att-for="widget.for.element_id" t-att-title="widget.for.help" style="display: block; text-align: right;" t-att-ondblclick="'console.log(\'' + widget.for.element_id + '\', openerp.screen.' + widget.for.element_id + ')'">
<t t-esc="widget.for.string"/> <t t-esc="widget.for.string"/>
<span t-if="widget.for.help">?</span> <span t-if="widget.for.help">?</span>
: :
</label> </label>
</t> </t>
<t t-name="FieldChar"> <t t-name="FieldChar">
<input type="text" t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%"/> <input type="text"
t-att-name="widget.name"
t-att-required="widget.node.attrs.required ? 'required' : undefined"
t-att-class="'field_' + widget.type" style="width: 100%"
/>
</t> </t>
<t t-name="FieldText"> <t t-name="FieldText">
<textarea rows="6" t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%;"></textarea> <textarea rows="6" style="width: 100%;"
t-att-name="widget.name"
t-att-required="widget.node.attrs.required ? 'required' : undefined"
t-att-class="'field_' + widget.type"
></textarea>
</t> </t>
<t t-name="FieldDate"> <t t-name="FieldDate">
<input type="text" t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%" placeholder="Widget Date"/> <input type="text" style="width: 100%"
t-att-name="widget.name"
t-att-required="widget.node.attrs.required ? 'required' : undefined"
t-att-class="'field_' + widget.type"
/>
</t> </t>
<t t-name="FieldDatetime"> <t t-name="FieldDatetime">
<input type="text" t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%" placeholder="Widget Datetime"/> <input type="text" style="width: 100%"
t-att-name="widget.name"
t-att-required="widget.node.attrs.required ? 'required' : undefined"
t-att-class="'field_' + widget.type"
/>
</t> </t>
<t t-name="FieldSelection"> <t t-name="FieldSelection">
<select t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%"> <select t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%">
@ -226,6 +242,11 @@
One2Many widget One2Many widget
</div> </div>
</t> </t>
<t t-name="FieldMany2Many">
<div style="background: #ccc; padding: 20px">
Many2Many widget
</div>
</t>
<t t-name="FieldReference"> <t t-name="FieldReference">
<input type="text" t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%" placeholder="Widget Reference"/> <input type="text" t-att-name="widget.name" t-att-id="widget.element_id" t-att-class="'field_' + widget.type" style="width: 100%" placeholder="Widget Reference"/>
</t> </t>

View File

@ -273,7 +273,7 @@ openerp.base.FormView = openerp.base.Controller.extend({
}, },
on_record_loaded: function() { on_record_loaded: function() {
for (var f in this.fields) { for (var f in this.fields) {
this.fields[f].set_value(); this.fields[f].set_value(this.datarecord.values[f]);
} }
} }
}); });
@ -487,9 +487,17 @@ openerp.base.WidgetSeparator = openerp.base.Widget.extend({
} }
}); });
openerp.base.WidgetButton = openerp.base.Widget.extend({
init: function(view, node) {
this._super(view, node);
this.template = "WidgetButton";
}
});
openerp.base.WidgetLabel = openerp.base.Widget.extend({ openerp.base.WidgetLabel = openerp.base.Widget.extend({
init: function(view, node) { init: function(view, node) {
this.is_field_label = true; this.is_field_label = true;
this.element_name = 'label_' + node.attrs.name;
this._super(view, node); this._super(view, node);
@ -498,19 +506,13 @@ openerp.base.WidgetLabel = openerp.base.Widget.extend({
} }
}); });
openerp.base.WidgetButton = openerp.base.Widget.extend({
init: function(view, node) {
this._super(view, node);
this.template = "WidgetButton";
}
});
openerp.base.Field = openerp.base.Widget.extend({ openerp.base.Field = openerp.base.Widget.extend({
init: function(view, node) { init: function(view, node) {
this.name = node.attrs.name; this.name = node.attrs.name;
view.fields[this.name] = this; view.fields[this.name] = this;
this.type = node.attrs.widget || view.fields_view.fields[node.attrs.name].type; this.type = node.attrs.widget || view.fields_view.fields[node.attrs.name].type;
this.element_name = "field_" + this.name + "_" + this.type; this.element_name = "field_" + this.name + "_" + this.type;
this.original_value;
this._super(view, node); this._super(view, node);
@ -523,7 +525,8 @@ openerp.base.Field = openerp.base.Widget.extend({
this.help = node.attrs.help || this.field.help; this.help = node.attrs.help || this.field.help;
this.nolabel = (node.attrs.nolabel == '1'); this.nolabel = (node.attrs.nolabel == '1');
}, },
set_value: function() { set_value: function(value) {
this.original_value = value;
} }
}); });
@ -536,53 +539,35 @@ openerp.base.FieldChar = openerp.base.Field.extend({
this._super.apply(this, arguments); this._super.apply(this, arguments);
// this.$element.bind('change',) ... blur, focus, ... // this.$element.bind('change',) ... blur, focus, ...
}, },
set_value: function() { set_value: function(value) {
this.$element.val(this.view.datarecord.values[this.name]); this._super.apply(this, arguments);
if (value != null && value !== false) {
this.$element.find('input').val(this.to_string(value));
}
},
get_value: function() {
return this.from_string(this.$element.find('input').val());
},
to_string: function(value) {
return value.toString();
},
from_string: function(value) {
return value.toString();
}, },
on_change: function() { on_change: function() {
//this.view.update_field(this.name,value); //this.view.update_field(this.name,value);
} }
}); });
openerp.base.FieldEmail = openerp.base.Field.extend({ openerp.base.FieldEmail = openerp.base.FieldChar.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldEmail";
}
}); });
openerp.base.FieldUrl = openerp.base.Field.extend({ openerp.base.FieldUrl = openerp.base.FieldChar.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldChar";
}
}); });
openerp.base.FieldFloat = openerp.base.Field.extend({ openerp.base.FieldFloat = openerp.base.FieldChar.extend({
init: function(view, node) { to_string: function(value) {
this._super(view, node); return value.toFixed(2);
this.template = "FieldChar";
}
});
openerp.base.FieldBoolean = openerp.base.Field.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldBoolean";
}
});
openerp.base.FieldDate = openerp.base.Field.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldDate";
}
});
openerp.base.FieldDatetime = openerp.base.Field.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldDatetime";
} }
}); });
@ -590,6 +575,43 @@ openerp.base.FieldText = openerp.base.Field.extend({
init: function(view, node) { init: function(view, node) {
this._super(view, node); this._super(view, node);
this.template = "FieldText"; this.template = "FieldText";
},
set_value: function(value) {
this._super.apply(this, arguments);
if (value != null && value !== false) {
this.$element.find('textarea').val(value);
}
},
get_value: function() {
return this.$element.find('textarea').val();
}
});
openerp.base.FieldBoolean = openerp.base.Field.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldBoolean";
},
set_value: function(value) {
this._super.apply(this, arguments);
this.$element.find('input')[0].checked = value;
},
get_value: function() {
this.$element.find('input')[0].checked;
}
});
openerp.base.FieldDate = openerp.base.FieldChar.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldDate";
}
});
openerp.base.FieldDatetime = openerp.base.FieldChar.extend({
init: function(view, node) {
this._super(view, node);
this.template = "FieldDatetime";
} }
}); });
@ -601,6 +623,15 @@ openerp.base.FieldSelection = openerp.base.Field.extend({
init: function(view, node) { init: function(view, node) {
this._super(view, node); this._super(view, node);
this.template = "FieldSelection"; this.template = "FieldSelection";
},
set_value: function(value) {
this._super.apply(this, arguments);
if (value != null && value !== false) {
this.$element.find('select').val(value);
}
},
get_value: function() {
return this.$element.find('select').val();
} }
}); });
@ -638,14 +669,16 @@ openerp.base.widgets = {
'separator' : openerp.base.WidgetSeparator, 'separator' : openerp.base.WidgetSeparator,
'label' : openerp.base.WidgetLabel, 'label' : openerp.base.WidgetLabel,
'char' : openerp.base.FieldChar, 'char' : openerp.base.FieldChar,
'url' : openerp.base.FieldUrl,
'email' : openerp.base.FieldEmail, 'email' : openerp.base.FieldEmail,
'url' : openerp.base.FieldUrl,
'text' : openerp.base.FieldText,
'date' : openerp.base.FieldDate, 'date' : openerp.base.FieldDate,
'datetime' : openerp.base.FieldDatetime, 'datetime' : openerp.base.FieldDatetime,
'text' : openerp.base.FieldText,
'selection' : openerp.base.FieldSelection, 'selection' : openerp.base.FieldSelection,
'many2one' : openerp.base.FieldMany2One, 'many2one' : openerp.base.FieldMany2One,
'many2many' : openerp.base.FieldMany2Many,
'one2many' : openerp.base.FieldOne2Many, 'one2many' : openerp.base.FieldOne2Many,
'one2many_list' : openerp.base.FieldOne2Many,
'reference' : openerp.base.FieldReference, 'reference' : openerp.base.FieldReference,
'boolean' : openerp.base.FieldBoolean, 'boolean' : openerp.base.FieldBoolean,
'float' : openerp.base.FieldFloat, 'float' : openerp.base.FieldFloat,

View File

@ -86,6 +86,21 @@ replace ``addons`` by the directory in which your own addon lives.
and run ``nosetests addons`` instead of the ``unit2`` command, and run ``nosetests addons`` instead of the ``unit2`` command,
the result should be exactly the same. the result should be exactly the same.
APIs
----
Javascript
++++++++++
.. js:class:: openerp.base.Widget(view, node)
:param openerp.base.Controller view: The view to which the widget belongs
:param Object node: the ``fields_view_get`` descriptor for the widget
.. js:attribute:: openerp.base.Widget.$element
The widget's root element as jQuery object
* Addons lifecycle (loading, execution, events, ...) * Addons lifecycle (loading, execution, events, ...)
* Python-side * Python-side
@ -97,7 +112,6 @@ replace ``addons`` by the directory in which your own addon lives.
* Extending templates * Extending templates
.. how do you handle deploying static files via e.g. a separate lighttpd? .. how do you handle deploying static files via e.g. a separate lighttpd?
* Python public APIs * Python public APIs
* Javascript public APIs
* QWeb templates description? * QWeb templates description?
* OpenERP Web modules (from OpenERP modules) * OpenERP Web modules (from OpenERP modules)