diff options
| author | vta vta@openerp.com <> | 2012-11-08 14:20:49 +0100 |
|---|---|---|
| committer | vta vta@openerp.com <> | 2012-11-08 14:20:49 +0100 |
| commit | 2576cd9d5cdf34c3233a0cdae7d8439bce85de1c (patch) | |
| tree | 08b44ce4e44d01018a32097acb902ee1eb2bb2fa /addons/web/static/src/js/view_form.js | |
| parent | 6a229f4385db0a2961116fcf599502288089cb38 (diff) | |
| parent | d0400362d636cbe2677c29a9196d63f419b72bff (diff) | |
[MERGE] Latest trunk.
bzr revid: vta@openerp.com-20121108132049-7ape10oz1gvz4vi8
Diffstat (limited to 'addons/web/static/src/js/view_form.js')
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 652 |
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', }); |
