summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorniv-openerp <nicolas.vanhoren@openerp.com>2012-10-04 18:42:35 +0200
committerniv-openerp <nicolas.vanhoren@openerp.com>2012-10-04 18:42:35 +0200
commitc8c4086fd655b09f5fc0a4bde4d43d95745520f1 (patch)
tree191d34e023a74728f4f1774f318c0845684b9750 /addons/web/static/src/js
parent83a16a237479e45177f9a2d0b638fb52b1b6a128 (diff)
parent78e47437f645c5557a7d5d38fd26ba52e1bee8c2 (diff)
[MERGE] refactoring in form view to be able to use fields outside of form views
bzr revid: nicolas.vanhoren@openerp.com-20121004164235-zzkwb3dc4c20m4xk
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/view_form.js180
1 files changed, 117 insertions, 63 deletions
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 68e79d60cea..4d69e07489a 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -30,7 +30,7 @@ instance.web.form.FieldManagerMixin = {
/**
* Must return the asked field as in fields_get.
*/
- get_field: function(field_name) {},
+ get_field_desc: function(field_name) {},
/**
* Returns the current value of a field present in the view. See the get_value() method
* method in FieldInterface for further information.
@@ -44,6 +44,21 @@ instance.web.form.FieldManagerMixin = {
@return (Deferred) Is resolved after all the values are setted.
*/
set_values: function(values) {},
+ /**
+ Computes an OpenERP domain.
+
+ @param (list) expression An OpenERP domain.
+ @return (boolean) The computed value of the domain.
+ */
+ compute_domain: function(expression) {},
+ /**
+ Builds an evaluation context for the resolution of the fields' contexts. Please note
+ the field are only supposed to use this context to evualuate their own, they should not
+ extend it.
+
+ @return (CompoundContext) An OpenERP context.
+ */
+ build_eval_context: function() {},
};
instance.web.views.add('form', 'instance.web.FormView');
@@ -1085,7 +1100,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
field.on('focused', null, this.proxy('widgetFocused'))
.on('blurred', null, this.proxy('widgetBlurred'));
- if (this.get_field(name).translate) {
+ if (this.get_field_desc(name).translate) {
this.translatable_fields.push(field);
}
field.on('changed_value', this, function() {
@@ -1103,12 +1118,34 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}
});
},
- get_field: function(field_name) {
+ get_field_desc: function(field_name) {
return this.fields_view.fields[field_name];
},
get_field_value: function(field_name) {
return this.fields[field_name].get_value();
},
+ compute_domain: function(expression) {
+ return instance.web.form.compute_domain(expression, this.fields);
+ },
+ _build_view_fields_values: function(blacklist) {
+ var a_dataset = this.dataset;
+ var fields_values = this.get_fields_values(blacklist);
+ var active_id = a_dataset.ids[a_dataset.index];
+ _.extend(fields_values, {
+ active_id: active_id || false,
+ active_ids: active_id ? [active_id] : [],
+ active_model: a_dataset.model,
+ parent: {}
+ });
+ if (a_dataset.parent_view) {
+ fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
+ }
+ return fields_values;
+ },
+ build_eval_context: function(blacklist) {
+ var a_dataset = this.dataset;
+ return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist));
+ },
});
/**
@@ -1528,6 +1565,48 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
},
});
+/**
+ Welcome.
+
+ If you read this documentation, it probably means that you were asked to use a form view widget outside of
+ a form view. Before going further, you must understand that those fields were never really created for
+ that usage. Don't think that this class will hold the answer to all your problems, at best it will allow
+ you to hack the system with more style.
+*/
+instance.web.form.DefaultFieldManager = instance.web.Widget.extend({
+ init: function(parent, eval_context) {
+ this._super(parent);
+ this.field_descs = {};
+ this.eval_context = eval_context || {};
+ },
+ get_field_desc: function(field_name) {
+ if (this.field_descs[field_name] === undefined) {
+ this.field_descs[field_name] = {
+ string: field_name,
+ };
+ }
+ return this.field_descs[field_name];
+ },
+ extend_field_desc: function(fields) {
+ var self = this;
+ _.each(fields, function(v, k) {
+ _.extend(self.get_field_desc(k), v);
+ });
+ },
+ get_field_value: function(field_name) {
+ return false;
+ },
+ set_values: function(values) {
+ // nothing
+ },
+ compute_domain: function(expression) {
+ return instance.web.form.compute_domain(expression, {});
+ },
+ build_eval_context: function() {
+ return new instance.web.CompoundContext(this.eval_context);
+ },
+});
+
instance.web.form.FormDialog = instance.web.Dialog.extend({
init: function(parent, options, view_id, dataset) {
this._super(parent, options);
@@ -1641,9 +1720,7 @@ instance.web.form.InvisibilityChangerMixin = {
this._ic_invisible_modifier = invisible_domain;
this._ic_field_manager.on("view_content_has_changed", this, function() {
var result = self._ic_invisible_modifier === undefined ? false :
- instance.web.form.compute_domain(
- self._ic_invisible_modifier,
- self._ic_field_manager.fields);
+ self._ic_field_manager.compute_domain(self._ic_invisible_modifier);
self.set({"invisible": result});
});
this.set({invisible: this._ic_invisible_modifier === true, force_invisible: false});
@@ -1738,12 +1815,11 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
});
},
process_modifiers: function() {
- var compute_domain = instance.web.form.compute_domain;
var to_set = {};
for (var a in this.modifiers) {
if (!this.modifiers.hasOwnProperty(a)) { continue; }
if (!_.include(["invisible"], a)) {
- var val = compute_domain(this.modifiers[a], this.view.fields);
+ var val = this.field_manager.compute_domain(this.modifiers[a]);
to_set[a] = val;
}
}
@@ -1772,25 +1848,6 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
}, options || {});
$(trigger).tipsy(options);
},
- _build_view_fields_values: function(blacklist) {
- var a_dataset = this.view.dataset;
- var fields_values = this.view.get_fields_values(blacklist);
- var active_id = a_dataset.ids[a_dataset.index];
- _.extend(fields_values, {
- active_id: active_id || false,
- active_ids: active_id ? [active_id] : [],
- active_model: a_dataset.model,
- parent: {}
- });
- if (a_dataset.parent_view) {
- fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
- }
- return fields_values;
- },
- _build_eval_context: function(blacklist) {
- var a_dataset = this.view.dataset;
- return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist));
- },
/**
* Builds a new context usable for operations related to fields by merging
* the fields'context with the action's context.
@@ -1803,7 +1860,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
}
if (v_context.__ref || true) { //TODO: remove true
- var fields_values = this._build_eval_context(blacklist);
+ var fields_values = this.field_manager.build_eval_context(blacklist);
v_context = new instance.web.CompoundContext(v_context).set_eval_context(fields_values);
}
return v_context;
@@ -1814,7 +1871,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
// if there is a domain on the node, overrides the model's domain
var final_domain = n_domain !== null ? n_domain : f_domain;
if (!(final_domain instanceof Array) || true) { //TODO: remove true
- var fields_values = this._build_eval_context();
+ var fields_values = this.field_manager.build_eval_context();
final_domain = new instance.web.CompoundDomain(final_domain).set_eval_context(fields_values);
}
return final_domain;
@@ -2002,7 +2059,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
var self = this
this._super(field_manager, node);
this.name = this.node.attrs.name;
- this.field = this.field_manager.get_field(this.name);
+ this.field = this.field_manager.get_field_desc(this.name);
this.widget = this.node.attrs.widget;
this.string = this.node.attrs.string || this.field.string || this.name;
this.options = JSON.parse(this.node.attrs.options || '{}');
@@ -2885,7 +2942,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
self.focus();
return;
}
- var pop = new instance.web.form.FormOpenPopup(self.view);
+ var pop = new instance.web.form.FormOpenPopup(self);
pop.show_element(
self.field.relation,
self.get("value"),
@@ -3480,7 +3537,7 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({
}
var self = this;
var id = self.o2m.dataset.index !== null ? self.o2m.dataset.ids[self.o2m.dataset.index] : null;
- var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
+ var pop = new instance.web.form.FormOpenPopup(this);
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.o2m.string,
create_function: function(data) {
@@ -3596,7 +3653,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
},
do_activate_record: function(index, id) {
var self = this;
- var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
+ var pop = new instance.web.form.FormOpenPopup(self);
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.o2m.string,
write_function: function(id, data) {
@@ -3624,7 +3681,10 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
var parent_form = this.o2m.view;
var self = this;
this.ensure_saved().pipe(function () {
- return parent_form.do_save();
+ if (parent_form)
+ return parent_form.do_save();
+ else
+ return $.when();
}).then(function () {
self.handle_button(name, id, callback);
});
@@ -4150,7 +4210,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
});
} else {
var id = self.dataset.ids[self.dataset.index];
- var pop = new instance.web.form.FormOpenPopup(self.view);
+ var pop = new instance.web.form.FormOpenPopup(this);
pop.show_element(self.field.relation, id, self.build_context(), {
title: _t("Open: ") + self.string,
write_function: function(id, data, options) {
@@ -4552,11 +4612,21 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
},
initialize_content: function() {
var self = this;
- this.selection = new instance.web.form.FieldSelection(this, { attrs: {
+ var fm = new instance.web.form.DefaultFieldManager(this);
+ fm.extend_field_desc({
+ "selection": {
+ selection: this.field_manager.get_field_desc(this.name).selection,
+ type: "selection",
+ },
+ "m2o": {
+ relation: null,
+ type: "many2one",
+ },
+ });
+ this.selection = new instance.web.form.FieldSelection(fm, { attrs: {
name: 'selection',
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
}});
- this.selection.view = this.view;
this.selection.on("change:value", this, this.on_selection_changed);
this.selection.setElement(this.$(".oe_form_view_reference_selection"));
this.selection.renderElement();
@@ -4565,11 +4635,10 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
.on('focused', null, function () {self.trigger('focused')})
.on('blurred', null, function () {self.trigger('blurred')});
- this.m2o = new instance.web.form.FieldMany2One(this, { attrs: {
+ this.m2o = new instance.web.form.FieldMany2One(fm, { attrs: {
name: 'm2o',
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
}});
- this.m2o.view = this.view;
this.m2o.on("change:value", this, this.data_changed);
this.m2o.setElement(this.$(".oe_form_view_reference_m2o"));
this.m2o.renderElement();
@@ -4609,20 +4678,6 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
this.set({'value': false});
}
},
- get_field: function(name) {
- if (name === "selection") {
- return {
- selection: this.view.fields_view.fields[this.name].selection,
- type: "selection",
- };
- } else if (name === "m2o") {
- return {
- relation: null,
- type: "many2one",
- };
- }
- throw Exception("Should not happen");
- },
});
instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
@@ -4710,9 +4765,10 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
},
set_filename: function(value) {
var filename = this.node.attrs.filename;
- if (this.view.fields[filename]) {
- this.view.fields[filename].set_value(value);
- this.view.fields[filename].on_ui_change();
+ if (filename) {
+ var tmp = {};
+ tmp[filename] = value;
+ this.field_manager.set_values(tmp);
}
},
on_clear: function() {
@@ -4754,7 +4810,9 @@ instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({
} else {
this.$el.find('a').show(!!this.get('value'));
if (this.get('value')) {
- var show_value = _t("Download") + " " + (this.view.datarecord[this.node.attrs.filename] || '');
+ var show_value = _t("Download")
+ if (this.view)
+ show_value += " " + (this.view.datarecord[this.node.attrs.filename] || '');
this.$el.find('a').text(show_value);
}
}
@@ -4766,12 +4824,6 @@ instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({
this.$el.find('input').eq(0).val(show_value);
this.set_filename(name);
},
- set_filename: function(value_) {
- var filename = this.node.attrs.filename;
- if (this.view.fields[filename]) {
- this.view.fields[filename].set({value: value_});
- }
- },
on_clear: function() {
this._super.apply(this, arguments);
this.$el.find('input').eq(0).val('');
@@ -4820,10 +4872,12 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
this.set({'value': file_base64});
this.binary_value = true;
this.render_value();
+ this.set_filename(name);
},
on_clear: function() {
this._super.apply(this, arguments);
this.render_value();
+ this.set_filename('');
}
});