summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/view_form.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/view_form.js')
-rw-r--r--addons/web/static/src/js/view_form.js652
1 files changed, 441 insertions, 211 deletions
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 67c5fa0292e..55f5b580015 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -114,13 +114,14 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
});
this.is_initialized = $.Deferred();
this.mutating_mutex = new $.Mutex();
- this.on_change_mutex = new $.Mutex();
+ this.on_change_list = [];
+ this.save_list = [];
this.reload_mutex = new $.Mutex();
this.__clicked_inside = false;
this.__blur_timeout = null;
this.rendering_engine = new instance.web.form.FormRenderingEngine(this);
self.set({actual_mode: self.options.initial_mode});
- this.has_been_loaded.then(function() {
+ this.has_been_loaded.done(function() {
self.on("change:actual_mode", self, self.check_actual_mode);
self.check_actual_mode();
self.on("change:actual_mode", self, self.init_pager);
@@ -274,7 +275,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var shown = this.has_been_loaded;
if (options.reload !== false) {
- shown = shown.pipe(function() {
+ shown = shown.then(function() {
if (self.dataset.index === null) {
// null index means we should start a new record
return self.on_button_new();
@@ -283,12 +284,12 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
fields.push('display_name');
return self.dataset.read_index(fields, {
context: { 'bin_size': true, 'future_display_name' : true }
- }).pipe(function(r) {
+ }).then(function(r) {
self.trigger('load_record', r);
});
});
}
- return shown.pipe(function() {
+ return shown.then(function() {
self._actualize_mode(options.mode || self.options.initial_mode);
self.$el.css({
opacity: '1',
@@ -326,7 +327,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
field._inhibit_on_change_flag = false;
set_values.push(result);
});
- return $.when.apply(null, set_values).pipe(function() {
+ return $.when.apply(null, set_values).then(function() {
if (!record.id) {
// New record: Second pass in order to trigger the onchanges
// respecting the fields order defined in the view
@@ -364,7 +365,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var self = this;
var keys = _.keys(this.fields_view.fields);
if (keys.length) {
- return this.dataset.default_get(keys).pipe(function(r) {
+ return this.dataset.default_get(keys).then(function(r) {
self.trigger('load_record', r);
});
}
@@ -427,7 +428,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var onchange = _.str.trim(on_change);
var call = onchange.match(/^\s?(.*?)\((.*?)\)\s?$/);
if (!call) {
- return null;
+ throw new Error("Wrong on change format: " + onchange);
}
var method = call[1];
@@ -466,7 +467,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var splitted = field.split('.');
if (splitted.length > 1 && _.str.trim(splitted[0]) === "parent" && self.dataset.parent_view) {
if (parent_fields === null) {
- parent_fields = self.dataset.parent_view.get_fields_values([self.dataset.child_name]);
+ parent_fields = self.dataset.parent_view.get_fields_values();
}
var p_val = parent_fields[_.str.trim(splitted[1])];
if (p_val !== undefined) {
@@ -492,38 +493,33 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
},
do_onchange: function(widget, processed) {
var self = this;
- return this.on_change_mutex.exec(function() {
- try {
- var response = {}, can_process_onchange = $.Deferred();
- processed = processed || [];
- processed.push(widget.name);
- var on_change = widget.node.attrs.on_change;
- if (on_change) {
- var change_spec = self.parse_on_change(on_change, widget);
- if (change_spec) {
- var ajax = {
- url: '/web/dataset/onchange',
- async: false
- };
- can_process_onchange = self.rpc(ajax, {
- model: self.dataset.model,
- method: change_spec.method,
- args: [(self.datarecord.id == null ? [] : [self.datarecord.id])].concat(change_spec.args),
- context_id: change_spec.context_index == undefined ? null : change_spec.context_index + 1
- }).then(function(r) {
- _.extend(response, r);
- });
- } else {
- console.warn("Wrong on_change format", on_change);
- }
- }
- // fail if onchange failed
- if (can_process_onchange.isRejected()) {
- return can_process_onchange;
- }
-
+ this.on_change_list = [{widget: widget, processed: processed}].concat(this.on_change_list);
+ return this._process_operations();
+ },
+ _process_onchange: function(on_change_obj) {
+ var self = this;
+ var widget = on_change_obj.widget;
+ var processed = on_change_obj.processed;
+ try {
+ var def;
+ processed = processed || [];
+ processed.push(widget.name);
+ var on_change = widget.node.attrs.on_change;
+ if (on_change) {
+ var change_spec = self.parse_on_change(on_change, widget);
+ def = self.rpc('/web/dataset/onchange', {
+ model: self.dataset.model,
+ method: change_spec.method,
+ args: [(self.datarecord.id == null ? [] : [self.datarecord.id])].concat(change_spec.args),
+ context_id: change_spec.context_index == undefined ? null : change_spec.context_index + 1
+ });
+ } else {
+ def = $.when({});
+ }
+ return def.then(function(response) {
if (widget.field['change_default']) {
- var fieldname = widget.name, value_;
+ var fieldname = widget.name
+ var value_;
if (response.value && (fieldname in response.value)) {
// Use value from onchange if onchange executed
value_ = response.value[fieldname];
@@ -534,15 +530,14 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var condition = fieldname + '=' + value_;
if (value_) {
- can_process_onchange = self.rpc({
- url: '/web/dataset/call',
- async: false
- }, {
+ return self.rpc('/web/dataset/call', {
model: 'ir.values',
method: 'get_defaults',
args: [self.model, condition]
}).then(function (results) {
- if (!results.length) { return; }
+ if (!results.length) {
+ return response;
+ }
if (!response.value) {
response.value = {};
}
@@ -551,20 +546,19 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var triplet = results[i];
response.value[triplet[1]] = triplet[2];
}
+ return response;
});
}
}
- if (can_process_onchange.isRejected()) {
- return can_process_onchange;
- }
-
+ return response;
+ }).then(function(response) {
return self.on_processed_onchange(response, processed);
- } catch(e) {
- console.error(e);
- instance.webclient.crashmanager.show_message(e);
- return $.Deferred().reject();
- }
- });
+ });
+ } catch(e) {
+ console.error(e);
+ instance.webclient.crashmanager.show_message(e);
+ return $.Deferred().reject();
+ }
},
on_processed_onchange: function(result, processed) {
try {
@@ -600,6 +594,38 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
return $.Deferred().reject();
}
},
+ _process_operations: function() {
+ var self = this;
+ return this.mutating_mutex.exec(function() {
+ function iterate() {
+ var on_change_obj = self.on_change_list.shift();
+ if (on_change_obj) {
+ return self._process_onchange(on_change_obj).then(function() {
+ return iterate();
+ });
+ }
+ var defs = [];
+ _.each(self.fields, function(field) {
+ defs.push(field.commit_value());
+ });
+ var args = _.toArray(arguments);
+ return $.when.apply($, defs).then(function() {
+ if (self.on_change_list.length !== 0) {
+ return iterate();
+ }
+ var save_obj = self.save_list.pop();
+ if (save_obj) {
+ return self._process_save(save_obj).then(function() {
+ save_obj.ret = _.toArray(arguments);
+ return iterate();
+ });
+ }
+ return $.when();
+ });
+ };
+ return iterate();
+ });
+ },
_internal_set_values: function(values, exclude) {
exclude = exclude || [];
for (var f in values) {
@@ -623,7 +649,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
},
set_values: function(values) {
var self = this;
- return this.on_change_mutex.exec(function() {
+ return this.mutating_mutex.exec(function() {
self._internal_set_values(values);
});
},
@@ -693,7 +719,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
},
on_button_save: function() {
var self = this;
- return this.save().then(function(result) {
+ return this.save().done(function(result) {
self.trigger("save", result);
self.to_view_mode();
});
@@ -713,7 +739,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
on_button_new: function() {
var self = this;
this.to_edit_mode();
- return $.when(this.has_been_loaded).pipe(function() {
+ return $.when(this.has_been_loaded).then(function() {
if (self.can_be_discarded()) {
return self.load_defaults();
}
@@ -728,29 +754,24 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
},
on_button_duplicate: function() {
var self = this;
- var def = $.Deferred();
- $.when(this.has_been_loaded).then(function() {
- self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) {
- return self.record_created(new_id);
- }).then(function() {
- return self.to_edit_mode();
- }).then(function() {
- def.resolve();
+ return this.has_been_loaded.then(function() {
+ return self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) {
+ self.record_created(new_id);
+ self.to_edit_mode();
});
});
- return def.promise();
},
on_button_delete: function() {
var self = this;
var def = $.Deferred();
- $.when(this.has_been_loaded).then(function() {
+ this.has_been_loaded.done(function() {
if (self.datarecord.id && confirm(_t("Do you really want to delete this record?"))) {
- self.dataset.unlink([self.datarecord.id]).then(function() {
+ self.dataset.unlink([self.datarecord.id]).done(function() {
self.execute_pager_action('next');
def.resolve();
});
} else {
- $.async_when().then(function () {
+ $.async_when().done(function () {
def.reject();
})
}
@@ -777,8 +798,16 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
*/
save: function(prepend_on_create) {
var self = this;
- return this.mutating_mutex.exec(function() { return self.is_initialized.pipe(function() {
- try {
+ var save_obj = {prepend_on_create: prepend_on_create, ret: null};
+ this.save_list.push(save_obj);
+ return this._process_operations().then(function() {
+ return $.when.apply($, save_obj.ret);
+ });
+ },
+ _process_save: function(save_obj) {
+ var self = this;
+ var prepend_on_create = save_obj.prepend_on_create;
+ try {
var form_invalid = false,
values = {},
first_invalid_field = null;
@@ -807,7 +836,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var save_deferral;
if (!self.datarecord.id) {
// Creation save
- save_deferral = self.dataset.create(values).pipe(function(r) {
+ save_deferral = self.dataset.create(values).then(function(r) {
return self.record_created(r, prepend_on_create);
}, null);
} else if (_.isEmpty(values) && ! self.force_dirty) {
@@ -816,17 +845,16 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
} else {
self.force_dirty = false;
// Write save
- save_deferral = self.dataset.write(self.datarecord.id, values, {}).pipe(function(r) {
+ save_deferral = self.dataset.write(self.datarecord.id, values, {}).then(function(r) {
return self.record_saved(r);
}, null);
}
return save_deferral;
}
- } catch (e) {
- console.error(e);
- return $.Deferred().reject();
- }
- });});
+ } catch (e) {
+ console.error(e);
+ return $.Deferred().reject();
+ }
},
on_invalid: function() {
var warnings = _(this.fields).chain()
@@ -851,7 +879,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
this.trigger('record_saved', r);
return $.Deferred().reject();
} else {
- return $.when(this.reload()).pipe(function () {
+ return $.when(this.reload()).then(function () {
self.trigger('record_saved', r);
return r;
});
@@ -890,7 +918,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
this.sidebar.do_attachement_update(this.dataset, this.datarecord.id);
}
//openerp.log("The record has been created with id #" + this.datarecord.id);
- return $.when(this.reload()).pipe(function () {
+ return $.when(this.reload()).then(function () {
self.trigger('record_created', r);
return _.extend(r, {created: true});
});
@@ -917,7 +945,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
'bin_size': true,
'future_display_name': true
}
- }).pipe(function(r) {
+ }).then(function(r) {
self.trigger('load_record', r);
});
}
@@ -928,15 +956,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
return obj instanceof instance.web.form.FormWidget;
});
},
- get_fields_values: function(blacklist) {
- blacklist = blacklist || [];
+ get_fields_values: function() {
var values = {};
var ids = this.get_selected_ids();
values["id"] = ids.length > 0 ? ids[0] : false;
_.each(this.fields, function(value_, key) {
- if (_.include(blacklist, key)) {
- return;
- }
values[key] = value_.get_value();
});
return values;
@@ -947,7 +971,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
},
recursive_save: function() {
var self = this;
- return $.when(this.save()).pipe(function(res) {
+ return $.when(this.save()).then(function(res) {
if (self.dataset.parent_view)
return self.dataset.parent_view.recursive_save();
});
@@ -957,7 +981,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
var pre = $.when();
if (self.dataset.parent_view)
pre = self.dataset.parent_view.recursive_reload();
- return pre.pipe(function() {
+ return pre.then(function() {
return self.reload();
});
},
@@ -978,7 +1002,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
return true;
},
sidebar_context: function () {
- return this.save().pipe(_.bind(function() {return this.get_fields_values();}, this));
+ return this.save().then(_.bind(function() {return this.get_fields_values();}, this));
},
open_defaults_dialog: function () {
var self = this;
@@ -1054,7 +1078,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
all_users,
true,
condition || false
- ]).then(function () { d.close(); });
+ ]).done(function () { d.close(); });
}}
]
});
@@ -1097,9 +1121,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
compute_domain: function(expression) {
return instance.web.form.compute_domain(expression, this.fields);
},
- _build_view_fields_values: function(blacklist) {
+ _build_view_fields_values: function() {
var a_dataset = this.dataset;
- var fields_values = this.get_fields_values(blacklist);
+ var fields_values = this.get_fields_values();
var active_id = a_dataset.ids[a_dataset.index];
_.extend(fields_values, {
active_id: active_id || false,
@@ -1108,13 +1132,13 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
parent: {}
});
if (a_dataset.parent_view) {
- fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
+ fields_values.parent = a_dataset.parent_view.get_fields_values();
}
return fields_values;
},
- build_eval_context: function(blacklist) {
+ build_eval_context: function() {
var a_dataset = this.dataset;
- return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist));
+ return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values());
},
});
@@ -1810,7 +1834,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
* Builds a new context usable for operations related to fields by merging
* the fields'context with the action's context.
*/
- build_context: function(blacklist) {
+ build_context: function() {
// only use the model's context if there is not context on the node
var v_context = this.node.attrs.context;
if (! v_context) {
@@ -1818,7 +1842,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.field_manager.build_eval_context(blacklist);
+ var fields_values = this.field_manager.build_eval_context();
v_context = new instance.web.CompoundContext(v_context).set_eval_context(fields_values);
}
return v_context;
@@ -1883,7 +1907,7 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({
}
},
{text: _t("Ok"), click: function() {
- self.on_confirmed().then(function() {
+ self.on_confirmed().done(function() {
def.resolve();
});
$(this).dialog("close");
@@ -1898,7 +1922,7 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({
};
if (!this.node.attrs.special) {
this.view.force_dirty = true;
- return this.view.recursive_save().pipe(exec_action);
+ return this.view.recursive_save().then(exec_action);
} else {
return exec_action();
}
@@ -1991,6 +2015,11 @@ instance.web.form.FieldInterface = {
* Called when the translate button is clicked.
*/
on_translate: function() {},
+ /**
+ This method is called by the form view before reading on_change values and before saving. It tells
+ the field to save its value before reading it using get_value(). Must return a promise.
+ */
+ commit_value: function() {},
};
/**
@@ -2117,7 +2146,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
on_translate: function() {
var self = this;
var trans = new instance.web.DataSet(this, 'ir.translation');
- return trans.call_button('translate_fields', [this.view.dataset.model, this.view.datarecord.id, this.name, this.view.dataset.get_context()]).then(function(r) {
+ return trans.call_button('translate_fields', [this.view.dataset.model, this.view.datarecord.id, this.name, this.view.dataset.get_context()]).done(function(r) {
self.do_action(r);
});
},
@@ -2134,7 +2163,10 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
}
this.$el.attr('style', style);
this.$el.css('minHeight', height);
- }
+ },
+ commit_value: function() {
+ return $.when();
+ },
});
/**
@@ -2228,6 +2260,13 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
},
focus: function() {
this.$('input:first').focus();
+ },
+ set_dimensions: function (height, width) {
+ this._super(height, width);
+ this.$('input').css({
+ height: height,
+ width: width
+ });
}
});
@@ -2454,6 +2493,10 @@ instance.web.form.FieldDatetime = instance.web.form.AbstractField.extend(instanc
if (this.datewidget && this.datewidget.$input) {
this.datewidget.$input.focus();
}
+ },
+ set_dimensions: function (height, width) {
+ this._super(height, width);
+ this.datewidget.$input.css('height', height);
}
});
@@ -2514,7 +2557,7 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we
this.$textarea.focus();
},
set_dimensions: function (height, width) {
- this._super();
+ this._super(height, width);
this.$textarea.css({
width: width,
minHeight: height
@@ -2539,7 +2582,7 @@ instance.web.form.FieldTextHtml = instance.web.form.AbstractField.extend(instanc
if (! this.get("effective_readonly")) {
self._updating_editor = false;
this.$textarea = this.$el.find('textarea');
- var width = ((this.node.attrs || {}).editor_width || 468);
+ var width = ((this.node.attrs || {}).editor_width || '100%');
var height = ((this.node.attrs || {}).editor_height || 250);
this.$textarea.cleditor({
width: width, // width not including margins, borders or padding
@@ -2676,6 +2719,13 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan
},
focus: function() {
this.$el.find('select:first').focus();
+ },
+ set_dimensions: function (height, width) {
+ this._super(height, width);
+ this.$('select').css({
+ height: height,
+ width: width
+ });
}
});
@@ -2732,7 +2782,7 @@ instance.web.form.CompletionFieldMixin = {
return this.orderer.add(dataset.name_search(
search_val, new instance.web.CompoundDomain(self.build_domain(), [["id", "not in", blacklist]]),
- 'ilike', this.limit + 1, self.build_context())).pipe(function(data) {
+ 'ilike', this.limit + 1, self.build_context())).then(function(data) {
self.last_search = data;
// possible selections for the m2o
var values = _.map(data, function(x) {
@@ -2751,7 +2801,7 @@ instance.web.form.CompletionFieldMixin = {
values.push({
label: _t("Search More..."),
action: function() {
- dataset.name_search(search_val, self.build_domain(), 'ilike', false).then(function(data) {
+ dataset.name_search(search_val, self.build_domain(), 'ilike', false).done(function(data) {
self._search_create_popup("search", data);
});
},
@@ -2792,7 +2842,7 @@ instance.web.form.CompletionFieldMixin = {
};
if (self.options.quick_create === undefined || self.options.quick_create) {
new instance.web.DataSet(this, this.field.relation, self.build_context())
- .name_create(name).then(function(data) {
+ .name_create(name).done(function(data) {
self.add_id(data[0]);
}).fail(function(error, event) {
event.preventDefault();
@@ -2967,7 +3017,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
self.uned_def = $.Deferred();
var ed_delay = 200;
var ed_duration = 15000;
- var anyoneLoosesFocus = function() {
+ var anyoneLoosesFocus = function (e) {
var used = false;
if (self.floating) {
if (self.last_search.length > 0) {
@@ -2989,14 +3039,17 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
self.ed_def.reject();
self.uned_def.reject();
self.ed_def = $.Deferred();
- self.ed_def.then(function() {
+ self.ed_def.done(function() {
self.show_error_displayer();
+ ignore_blur = false;
+ self.trigger('focused');
});
+ ignore_blur = true;
setTimeout(function() {
self.ed_def.resolve();
self.uned_def.reject();
self.uned_def = $.Deferred();
- self.uned_def.then(function() {
+ self.uned_def.done(function() {
self.hide_error_displayer();
});
setTimeout(function() {self.uned_def.resolve();}, ed_duration);
@@ -3026,7 +3079,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
// autocomplete
this.$input.autocomplete({
source: function(req, resp) {
- self.get_search_result(req.term).then(function(result) {
+ self.get_search_result(req.term).done(function(result) {
resp(result);
});
},
@@ -3077,7 +3130,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
}
if (! no_recurse) {
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context());
- dataset.name_get([self.get("value")]).then(function(data) {
+ dataset.name_get([self.get("value")]).done(function(data) {
self.display_value["" + self.get("value")] = data[0][1];
self.render_value(true);
});
@@ -3110,7 +3163,6 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
type: 'ir.actions.act_window',
res_model: self.field.relation,
res_id: self.get("value"),
- context: self.build_context(),
views: [[false, 'form']],
target: 'current'
});
@@ -3156,6 +3208,62 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
this.ed_def.reject();
return instance.web.form.CompletionFieldMixin._search_create_popup.apply(this, arguments);
},
+ set_dimensions: function (height, width) {
+ this._super(height, width);
+ this.$input.css('height', height);
+ }
+});
+
+instance.web.form.Many2OneButton = instance.web.form.AbstractField.extend({
+ template: 'Many2OneButton',
+ init: function(field_manager, node) {
+ this._super.apply(this, arguments);
+ },
+ start: function() {
+ this._super.apply(this, arguments);
+ this.set_button();
+ },
+ set_button: function() {
+ var self = this;
+ if (this.$button) {
+ this.$button.remove();
+ }
+ var options = {};
+ try {
+ options = py.eval(this.node.attrs.options);
+ } catch (e) {}
+ if (options.label) {
+ this.string = this.get('value') ? _t(options.label.edit) : _t(options.label.create);
+ } else {
+ this.string = '';
+ }
+ this.node.attrs.icon = this.get('value') ? '/web/static/src/img/icons/gtk-yes.png' : '/web/static/src/img/icons/gtk-no.png';
+ this.$button = $(QWeb.render('WidgetButton', {'widget': this}));
+ this.$el.append(this.$button);
+ this.$button.on('click', self.on_click);
+ },
+ on_click: function(ev) {
+ var self = this;
+ this.popup = new instance.web.form.FormOpenPopup(this);
+ this.popup.show_element(
+ this.field.relation,
+ this.get('value'),
+ this.build_context(),
+ {title: this.string}
+ );
+ this.popup.on('create_completed write_completed', self, function(r) {
+ self.set_value(r);
+ });
+ },
+ set_value: function(value_) {
+ var self = this;
+ if (value_ instanceof Array) {
+ value_ = value_[0];
+ }
+ value_ = value_ || false;
+ this.set('value', value_);
+ this.set_button();
+ },
});
/*
@@ -3231,11 +3339,11 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
var self = this;
self.load_views();
- this.is_loaded.then(function() {
+ this.is_loaded.done(function() {
self.on("change:effective_readonly", self, function() {
- self.is_loaded = self.is_loaded.pipe(function() {
+ self.is_loaded = self.is_loaded.then(function() {
self.viewmanager.destroy();
- return $.when(self.load_views()).then(function() {
+ return $.when(self.load_views()).done(function() {
self.reload_current_view();
});
});
@@ -3245,10 +3353,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
this.reload_current_view();
},
trigger_on_change: function() {
- var tmp = this.doing_on_change;
- this.doing_on_change = true;
this.trigger('changed_value');
- this.doing_on_change = tmp;
},
load_views: function() {
var self = this;
@@ -3308,10 +3413,10 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
this.viewmanager = new instance.web.form.One2ManyViewManager(this, this.dataset, views, {});
this.viewmanager.o2m = self;
- var once = $.Deferred().then(function() {
+ var once = $.Deferred().done(function() {
self.init_form_last_update.resolve();
});
- var def = $.Deferred().then(function() {
+ var def = $.Deferred().done(function() {
self.initial_is_loaded.resolve();
});
this.viewmanager.on("controller_inited", self, function(view_type, controller) {
@@ -3322,7 +3427,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
e.cancel = true;
});
_(controller.columns).find(function (column) {
- if (!column instanceof instance.web.list.Handle) {
+ if (!(column instanceof instance.web.list.Handle)) {
return false;
}
column.modifiers.invisible = true;
@@ -3343,22 +3448,22 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
def.resolve();
});
this.viewmanager.on("switch_mode", self, function(n_mode, b, c, d, e) {
- $.when(self.save_any_view()).then(function() {
+ $.when(self.save_any_view()).done(function() {
if (n_mode === "list") {
- $.async_when().then(function() {
+ $.async_when().done(function() {
self.reload_current_view();
});
}
});
});
- $.async_when().then(function () {
+ $.async_when().done(function () {
self.viewmanager.appendTo(self.$el);
});
return def;
},
reload_current_view: function() {
var self = this;
- return self.is_loaded = self.is_loaded.pipe(function() {
+ return self.is_loaded = self.is_loaded.then(function() {
var active_view = self.viewmanager.active_view;
var view = self.viewmanager.views[active_view].controller;
if(active_view === "list") {
@@ -3370,7 +3475,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
var act = function() {
return view.do_show();
};
- self.form_last_update = self.form_last_update.pipe(act, act);
+ self.form_last_update = self.form_last_update.then(act, act);
return self.form_last_update;
} else if (view.do_search) {
return view.do_search(self.build_domain(), self.dataset.get_context(), []);
@@ -3443,7 +3548,6 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
var self = this;
if (!this.dataset)
return [];
- this.save_any_view();
var val = this.dataset.delete_all ? [commands.delete_all()] : [];
val = val.concat(_.map(this.dataset.ids, function(id) {
var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;});
@@ -3460,33 +3564,24 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
this.dataset.to_delete, function(x) {
return commands['delete'](x.id);}));
},
+ commit_value: function() {
+ return this.save_any_view();
+ },
save_any_view: function() {
- if (this.doing_on_change)
- return false;
- return this.session.synchronized_mode(_.bind(function() {
- if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view &&
- this.viewmanager.views[this.viewmanager.active_view] &&
- this.viewmanager.views[this.viewmanager.active_view].controller) {
- var view = this.viewmanager.views[this.viewmanager.active_view].controller;
- if (this.viewmanager.active_view === "form") {
- if (!view.is_initialized.isResolved()) {
- return false;
- }
- var res = $.when(view.save());
- if (!res.isResolved() && !res.isRejected()) {
- console.warn("Asynchronous get_value() is not supported in form view.");
- }
- return res;
- } else if (this.viewmanager.active_view === "list") {
- var res = $.when(view.ensure_saved());
- if (!res.isResolved() && !res.isRejected()) {
- console.warn("Asynchronous get_value() is not supported in list view.");
- }
- return res;
+ if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view &&
+ this.viewmanager.views[this.viewmanager.active_view] &&
+ this.viewmanager.views[this.viewmanager.active_view].controller) {
+ var view = this.viewmanager.views[this.viewmanager.active_view].controller;
+ if (this.viewmanager.active_view === "form") {
+ if (!view.is_initialized.state() === 'resolved') {
+ return $.when(false);
}
+ return $.when(view.save());
+ } else if (this.viewmanager.active_view === "list") {
+ return $.when(view.ensure_saved());
}
- return false;
- }, this));
+ }
+ return $.when(false);
},
is_syntax_valid: function() {
if (! this.viewmanager || ! this.viewmanager.views[this.viewmanager.active_view])
@@ -3527,13 +3622,13 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.o2m.string,
create_function: function(data) {
- return self.o2m.dataset.create(data).then(function(r) {
+ return self.o2m.dataset.create(data).done(function(r) {
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r]));
self.o2m.dataset.trigger("dataset_changed", r);
});
},
write_function: function(id, data, options) {
- return self.o2m.dataset.write(id, data, {}).then(function() {
+ return self.o2m.dataset.write(id, data, {}).done(function() {
self.o2m.reload_current_view();
});
},
@@ -3554,7 +3649,7 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({
instance.web.form.One2ManyDataSet = instance.web.BufferedDataSet.extend({
get_context: function() {
- this.context = this.o2m.build_context([this.o2m.name]);
+ this.context = this.o2m.build_context();
return this.context;
}
});
@@ -3618,10 +3713,10 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
initial_view: "form",
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
create_function: function(data, callback, error_callback) {
- return self.o2m.dataset.create(data).then(function(r) {
+ return self.o2m.dataset.create(data).done(function(r) {
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r]));
self.o2m.dataset.trigger("dataset_changed", r);
- }).then(callback, error_callback);
+ }).done(callback).fail(error_callback);
},
read_function: function() {
return self.o2m.dataset.read_ids.apply(self.o2m.dataset, arguments);
@@ -3644,7 +3739,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
title: _t("Open: ") + self.o2m.string,
write_function: function(id, data) {
- return self.o2m.dataset.write(id, data, {}).then(function() {
+ return self.o2m.dataset.write(id, data, {}).done(function() {
self.o2m.reload_current_view();
});
},
@@ -3667,12 +3762,12 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
}
var parent_form = this.o2m.view;
var self = this;
- this.ensure_saved().pipe(function () {
+ this.ensure_saved().then(function () {
if (parent_form)
return parent_form.save();
else
return $.when();
- }).then(function () {
+ }).done(function () {
self.handle_button(name, id, callback);
});
},
@@ -3709,7 +3804,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
}
// FIXME: why isn't there an API for this?
if (this.editor.form.$el.hasClass('oe_form_dirty')) {
- this.save_edition();
+ this.ensure_saved();
return;
}
this.cancel_edition();
@@ -3732,7 +3827,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
ids.splice(false_id_index, 1);
next = this.cancel_edition(true);
}
- return next.pipe(function () {
+ return next.then(function () {
// wheeee
var confirm = window.confirm;
window.confirm = function () { return true; };
@@ -3794,7 +3889,7 @@ instance.web.form.One2ManyList = instance.web.ListView.List.extend({
clearTimeout(self.view.editor.form.__blur_timeout);
self.view.editor.form.__blur_timeout = false;
}
- self.view.ensure_saved().then(function () {
+ self.view.ensure_saved().done(function () {
self.view.do_add_record();
});
}));
@@ -3815,7 +3910,7 @@ instance.web.form.One2ManyFormView = instance.web.FormView.extend({
this._super(data);
var self = this;
this.$buttons.find('button.oe_form_button_create').click(function() {
- self.save().then(self.on_button_new);
+ self.save().done(self.on_button_new);
});
},
do_notify_change: function() {
@@ -3828,11 +3923,11 @@ instance.web.form.One2ManyFormView = instance.web.FormView.extend({
});
var lazy_build_o2m_kanban_view = function() {
-if (! instance.web_kanban || instance.web.form.One2ManyKanbanView)
- return;
-instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({
-});
-}
+ if (! instance.web_kanban || instance.web.form.One2ManyKanbanView)
+ return;
+ instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({
+ });
+};
instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(instance.web.form.CompletionFieldMixin, instance.web.form.ReinitializeFieldMixin, {
template: "FieldMany2ManyTags",
@@ -3847,7 +3942,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
if (this.get("effective_readonly"))
return;
var self = this;
- self.$text = $("textarea", this.$el);
+ self.$text = this.$("textarea");
self.$text.textext({
plugins : 'tags arrow autocomplete',
autocomplete: {
@@ -3871,9 +3966,8 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
},
tags: {
isTagAllowed: function(tag) {
- if (! tag.name)
- return false;
- return true;
+ return !!tag.name;
+
},
removeTag: function(tag) {
var id = tag.data("id");
@@ -3893,7 +3987,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
}).bind('getSuggestions', function(e, data) {
var _this = this;
var str = !!data ? data.query || '' : '';
- self.get_search_result(str).then(function(result) {
+ self.get_search_result(str).done(function(result) {
self.search_result = result;
$(_this).trigger('setSuggestions', {result : _.map(result, function(el, i) {
return _.extend(el, {index:i});
@@ -3905,7 +3999,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
self._drop_shown = true;
});
self.tags = self.$text.textext()[0].tags();
- $("textarea", this.$el).focusout(function() {
+ self.$text.focusout(function() {
self.$text.trigger("setInputData", "");
}).keydown(function(e) {
if (e.which === $.ui.keyCode.TAB && self._drop_shown) {
@@ -3930,8 +4024,10 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
render_value: function() {
var self = this;
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context());
- var values = self.get("value")
+ var values = self.get("value");
var handle_names = function(data) {
+ if (self.isDestroyed())
+ return;
var indexed = {};
_.each(data, function(el) {
indexed[el[0]] = el;
@@ -3939,14 +4035,14 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
data = _.map(values, function(el) { return indexed[el]; });
if (! self.get("effective_readonly")) {
self.tags.containerElement().children().remove();
- $("textarea", self.$el).css("padding-left", "3px");
+ self.$('textarea').css("padding-left", "3px");
self.tags.addTags(_.map(data, function(el) {return {name: el[1], id:el[0]};}));
} else {
self.$el.html(QWeb.render("FieldMany2ManyTag", {elements: data}));
}
};
if (! values || values.length > 0) {
- this._display_orderer.add(dataset.name_get(values)).then(handle_names);
+ this._display_orderer.add(dataset.name_get(values)).done(handle_names);
} else {
handle_names([]);
}
@@ -3983,11 +4079,11 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({
var self = this;
self.load_view();
- this.is_loaded.then(function() {
+ this.is_loaded.done(function() {
self.on("change:effective_readonly", self, function() {
- self.is_loaded = self.is_loaded.pipe(function() {
+ self.is_loaded = self.is_loaded.then(function() {
self.list_view.destroy();
- return $.when(self.load_view()).then(function() {
+ return $.when(self.load_view()).done(function() {
self.render_value();
});
});
@@ -4028,7 +4124,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({
self.initial_is_loaded.resolve();
loaded.resolve();
});
- $.async_when().then(function () {
+ $.async_when().done(function () {
self.list_view.appendTo(self.$el);
});
return loaded;
@@ -4036,7 +4132,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({
render_value: function() {
var self = this;
this.dataset.set_ids(this.get("value"));
- this.is_loaded = this.is_loaded.pipe(function() {
+ this.is_loaded = this.is_loaded.then(function() {
return self.list_view.reload_content();
});
},
@@ -4097,7 +4193,7 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in
if (! this.m2m_field.options.reload_on_button) {
return _sup(name, id, callback);
} else {
- return this.m2m_field.view.save().pipe(function() {
+ return this.m2m_field.view.save().then(function() {
return _sup(name, id, function() {
self.m2m_field.view.reload();
});
@@ -4128,11 +4224,11 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
var self = this;
self.load_view();
- this.is_loaded.then(function() {
+ this.is_loaded.done(function() {
self.on("change:effective_readonly", self, function() {
- self.is_loaded = self.is_loaded.pipe(function() {
+ self.is_loaded = self.is_loaded.then(function() {
self.kanban_view.destroy();
- return $.when(self.load_view()).then(function() {
+ return $.when(self.load_view()).done(function() {
self.render_value();
});
});
@@ -4169,7 +4265,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
loaded.resolve();
});
this.kanban_view.on('switch_mode', this, this.open_popup);
- $.async_when().then(function () {
+ $.async_when().done(function () {
self.kanban_view.appendTo(self.$el);
});
return loaded;
@@ -4177,7 +4273,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
render_value: function() {
var self = this;
this.dataset.set_ids(this.get("value"));
- this.is_loaded = this.is_loaded.pipe(function() {
+ this.is_loaded = this.is_loaded.then(function() {
return self.kanban_view.do_search(self.build_domain(), self.dataset.get_context(), []);
});
},
@@ -4213,7 +4309,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
pop.show_element(self.field.relation, id, self.build_context(), {
title: _t("Open: ") + self.string,
write_function: function(id, data, options) {
- return self.dataset.write(id, data, {}).then(function() {
+ return self.dataset.write(id, data, {}).done(function() {
self.render_value();
});
},
@@ -4286,7 +4382,7 @@ instance.web.form.Many2ManyQuickCreate = instance.web.Widget.extend({
}).bind('getSuggestions', function(e, data) {
var _this = this;
var str = !!data ? data.query || '' : '';
- self.m2m.get_search_result(str).then(function(result) {
+ self.m2m.get_search_result(str).done(function(result) {
self.search_result = result;
$(_this).trigger('setSuggestions', {result : _.map(result, function(el, i) {
return _.extend(el, {index:i});
@@ -4341,14 +4437,15 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
this.dataset.read_function = this.options.read_function;
this.dataset.create_function = function(data, sup) {
var fct = self.options.create_function || sup;
- return fct.call(this, data).then(function(r) {
+ return fct.call(this, data).done(function(r) {
+ self.trigger('create_completed saved', r);
self.created_elements.push(r);
});
};
this.dataset.write_function = function(id, data, options, sup) {
var fct = self.options.write_function || sup;
- return fct.call(this, id, data, options).then(function() {
- self.trigger('write_completed');
+ return fct.call(this, id, data, options).done(function() {
+ self.trigger('write_completed saved');
});
};
this.dataset.parent_view = this.options.parent_view;
@@ -4396,7 +4493,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
}));
var $snbutton = self.$buttonpane.find(".oe_abstractformpopup-form-save-new");
$snbutton.click(function() {
- $.when(self.view_form.save()).then(function() {
+ $.when(self.view_form.save()).done(function() {
self.view_form.reload_mutex.exec(function() {
self.view_form.on_button_new();
});
@@ -4404,7 +4501,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
});
var $sbutton = self.$buttonpane.find(".oe_abstractformpopup-form-save");
$sbutton.click(function() {
- $.when(self.view_form.save()).then(function() {
+ $.when(self.view_form.save()).done(function() {
self.view_form.reload_mutex.exec(function() {
self.check_exit();
});
@@ -4425,10 +4522,14 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
this.select_elements(this.created_elements);
this.created_elements = [];
}
+ this.trigger('closed');
this.destroy();
},
destroy: function () {
- this.$el.dialog('close');
+ this.trigger('closed');
+ if (this.$el.is(":data(dialog)")) {
+ this.$el.dialog('close');
+ }
this._super();
},
});
@@ -4478,7 +4579,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
self.rpc('/web/session/eval_domain_and_context', {
domains: [],
contexts: [this.context]
- }).then(function (results) {
+ }).done(function (results) {
var search_defaults = {};
_.each(results.context, function (value_, key) {
var match = /^search_default_(.*)$/.exec(key);
@@ -4520,9 +4621,9 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
e.cancel = true;
});
self.view_list.popup = self;
- self.view_list.appendTo($(".oe_popup_list", self.$el)).pipe(function() {
+ self.view_list.appendTo($(".oe_popup_list", self.$el)).then(function() {
self.view_list.do_show();
- }).pipe(function() {
+ }).then(function() {
self.searchview.do_search();
});
self.view_list.on("list_view_loaded", self, function() {
@@ -4550,7 +4651,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
domains: domains || [],
contexts: contexts || [],
group_by_seq: groupbys || []
- }).then(function (results) {
+ }).done(function (results) {
self.view_list.do_search(results.domain, results.context, results.group_by);
});
},
@@ -4831,6 +4932,7 @@ instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({
instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
template: 'FieldBinaryImage',
+ placeholder: "/web/static/src/img/placeholder.png",
render_value: function() {
var self = this;
var url;
@@ -4844,7 +4946,7 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
url = '/web/binary/image?session_id=' + this.session.session_id + '&model=' +
this.view.dataset.model +'&id=' + id + '&field=' + field + '&t=' + (new Date().getTime());
} else {
- url = "/web/static/src/img/placeholder.png";
+ url = this.placeholder;
}
var $img = $(QWeb.render("FieldBinaryImage-img", { widget: this, url: url }));
this.$el.find('> img').remove();
@@ -4857,10 +4959,10 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
$img.css("margin-left", "" + (self.options.size[0] - $img.width()) / 2 + "px");
$img.css("margin-top", "" + (self.options.size[1] - $img.height()) / 2 + "px");
});
- },
- on_file_change: function() {
- this.render_value();
- this._super.apply(this, arguments);
+ $img.on('error', function() {
+ $img.attr('src', self.placeholder);
+ instance.webclient.notification.warn(_t("Image"), _t("Could not display the selected image."));
+ });
},
on_file_uploaded_and_valid: function(size, name, content_type, file_base64) {
this.internal_set_value(file_base64);
@@ -4875,6 +4977,132 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
}
});
+/**
+ * Widget for (one2many field) to upload one or more file in same time and display in list.
+ * The user can delete his files.
+ * Options on attribute ; "blockui" {Boolean} block the UI or not
+ * during the file is uploading
+ */
+instance.web.form.FieldOne2ManyBinaryMultiFiles = instance.web.form.AbstractField.extend({
+ template: "FieldBinaryFileUploader",
+ init: function(field_manager, node) {
+ this._super(field_manager, node);
+ this.field_manager = field_manager;
+ this.node = node;
+ if(this.field.type != "one2many" || this.field.relation != 'ir.attachment') {
+ throw "The type of the field '"+this.field.string+"' must be a one2many field with a relation to 'ir.attachment' model.";
+ }
+ this.ds_file = new instance.web.DataSetSearch(this, 'ir.attachment');
+ this.fileupload_id = _.uniqueId('oe_fileupload_temp');
+ $(window).on(this.fileupload_id, _.bind(this.on_file_loaded, this));
+ },
+ start: function() {
+ this._super(this);
+ this.$el.on('change', 'input.oe_form_binary_file', this.on_file_change );
+ },
+ get_value: function() {
+ return _.map(this.get('value'), function (value) { return commands.link_to( value.id ); });
+ },
+ get_file_url: function (attachment) {
+ return instance.origin + '/web/binary/saveas?session_id=' + this.session.session_id + '&model=ir.attachment&field=datas&filename_field=datas_fname&id=' + attachment['id'];
+ },
+ render_value: function () {
+ var render = $(instance.web.qweb.render('FieldBinaryFileUploader.files', {'widget': this}));
+ render.on('click', '.oe_delete', _.bind(this.on_file_delete, this));
+ this.$('.oe_placeholder_files, .oe_attachments').replaceWith( render );
+
+ // reinit input type file
+ var $input = this.$('input.oe_form_binary_file');
+ $input.after($input.clone(true)).remove();
+ this.$(".oe_fileupload").show();
+ },
+ on_file_change: function (event) {
+ event.stopPropagation();
+ var self = this;
+ var $target = $(event.target);
+ if ($target.val() !== '') {
+
+ var filename = $target.val().replace(/.*[\\\/]/,'');
+
+ // if the files is currently uploded, don't send again
+ if( !isNaN(_.find(this.get('value'), function (file) { return (file.filename || file.name) == filename && file.upload; } )) ) {
+ return false;
+ }
+
+ // block UI or not
+ if(this.node.attrs.blockui) {
+ instance.web.blockUI();
+ }
+
+ // if the files exits for this answer, delete the file before upload
+ var files = _.filter(this.get('value'), function (file) {
+ if((file.filename || file.name) == filename) {
+ self.ds_file.unlink([file.id]);
+ return false;
+ } else {
+ return true;
+ }
+ });
+
+ // TODO : unactivate send on wizard and form
+
+ // submit file
+ this.$('form.oe_form_binary_form').submit();
+ this.$(".oe_fileupload").hide();
+
+ // add file on result
+ files.push({
+ 'id': 0,
+ 'name': filename,
+ 'filename': filename,
+ 'url': '',
+ 'upload': true
+ });
+
+ this.set({'value': files});
+ }
+ },
+ on_file_loaded: function (event, result) {
+ // unblock UI
+ if(this.node.attrs.blockui) {
+ instance.web.unblockUI();
+ }
+
+ // TODO : activate send on wizard and form
+
+ var files = this.get('value');
+ for(var i in files){
+ if(files[i].filename == result.filename && files[i].upload) {
+ files[i] = {
+ 'id': result.id,
+ 'name': result.name,
+ 'filename': result.filename,
+ 'url': this.get_file_url(result)
+ };
+ }
+ }
+
+ this.set({'value': files});
+ this.render_value()
+ },
+ on_file_delete: function (event) {
+ event.stopPropagation();
+ var file_id=$(event.target).data("id");
+ if (file_id) {
+ var files=[];
+ for(var i in this.get('value')){
+ if(file_id != this.get('value')[i].id){
+ files.push(this.get('value')[i]);
+ }
+ else {
+ this.ds_file.unlink([file_id]);
+ }
+ }
+ this.set({'value': files});
+ }
+ },
+});
+
instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
template: "FieldStatus",
init: function(field_manager, node) {
@@ -4900,7 +5128,7 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
},
render_value: function() {
var self = this;
- self.get_selection().then(function() {
+ self.get_selection().done(function() {
var content = QWeb.render("FieldStatus.content", {widget: self});
self.$el.html(content);
var colors = JSON.parse((self.node.attrs || {}).statusbar_colors || "{}");
@@ -4924,7 +5152,7 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.get('value')]]);
}
var ds = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain);
- return ds.read_slice(['name'], {}).pipe(function (records) {
+ return ds.read_slice(['name'], {}).then(function (records) {
for(var i = 0; i < records.length; i++) {
self.selection.push([records[i].id, records[i].name]);
}
@@ -4948,10 +5176,10 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
var $li = $(ev.currentTarget);
var val = parseInt($li.data("id"));
if (val != self.get('value')) {
- this.view.recursive_save().then(function() {
+ this.view.recursive_save().done(function() {
var change = {};
change[self.name] = val;
- self.view.dataset.write(self.view.datarecord.id, change).then(function() {
+ self.view.dataset.write(self.view.datarecord.id, change).done(function() {
self.view.reload();
});
});
@@ -4985,7 +5213,7 @@ instance.web.form.FieldMonetary = instance.web.form.FieldFloat.extend({
return;
}
return this.ci_dm.add(new instance.web.Model("res.currency").query(["symbol", "position"])
- .filter([["id", "=", self.get("currency")]]).first()).pipe(function(res) {
+ .filter([["id", "=", self.get("currency")]]).first()).then(function(res) {
self.set({"currency_info": res});
});
},
@@ -5014,6 +5242,7 @@ instance.web.form.widgets = new instance.web.Registry({
'datetime' : 'instance.web.form.FieldDatetime',
'selection' : 'instance.web.form.FieldSelection',
'many2one' : 'instance.web.form.FieldMany2One',
+ 'many2onebutton' : 'instance.web.form.Many2OneButton',
'many2many' : 'instance.web.form.FieldMany2Many',
'many2many_tags' : 'instance.web.form.FieldMany2ManyTags',
'many2many_kanban' : 'instance.web.form.FieldMany2ManyKanban',
@@ -5027,6 +5256,7 @@ instance.web.form.widgets = new instance.web.Registry({
'progressbar': 'instance.web.form.FieldProgressBar',
'image': 'instance.web.form.FieldBinaryImage',
'binary': 'instance.web.form.FieldBinaryFile',
+ 'one2many_binary': 'instance.web.form.FieldOne2ManyBinaryMultiFiles',
'statusbar': 'instance.web.form.FieldStatus',
'monetary': 'instance.web.form.FieldMonetary',
});