[MERGE] forward port branch saas-11 up to f1583504ce

This commit is contained in:
Christophe Simonis
2017-01-10 13:46:17 +01:00
4 changed files with 63 additions and 20 deletions
@@ -28,6 +28,8 @@ var FormViewBarcodeHandler = common.AbstractField.extend(BarcodeHandlerMixin, {
this.__quantity_listener = _.bind(this._set_quantity_listener, this);
BarcodeHandlerMixin.init.apply(this, arguments);
this.process_barcode_mutex = new utils.Mutex();
return this._super.apply(this, arguments);
},
@@ -153,25 +155,35 @@ var FormViewBarcodeHandler = common.AbstractField.extend(BarcodeHandlerMixin, {
else if (this.form_view.get('actual_mode') === 'view')
this._display_no_edit_mode_warning();
else {
// Call hook method possibly implemented by subclass
this.pre_onchange_hook(barcode).then(function(proceed) {
if (proceed === true) {
// Wait for hypothetical ongoing onchange to finish
self.form_view.onchanges_mutex.exec(function() {
// A real onchange is triggered when a value actually changes (which can correspond
// to a widget's blur event per example). Commit the value of fields before
// programmatically triggering an onchange to be consistent with this.
var mutex_commit_value = new utils.Mutex();
_.each(self.form_view.fields, function(field) {
mutex_commit_value.exec(_.bind(field.commit_value, field));
});
return mutex_commit_value.def.then(function(){
// Trigger the barcode onchange
self.set_value(barcode);
});
});
var process_barcode = function () {
// this function can be passed to `Mutex.exec` in order to make sure
// that every ongoing onchanges in the form view are done
var form_onchanges_mutex = function () {
return self.form_view.onchanges_mutex.def;
}
});
// before setting the barcode field with the received barcode, we commit
// every fields of the form view and we wait for their hypothetical ongoing
// onchanges to finish
var commit_mutex = new utils.Mutex();
_.each(self.form_view.fields, function (field) {
commit_mutex.exec(function () {
return field.commit_value();
});
commit_mutex.exec(form_onchanges_mutex);
});
return commit_mutex.def.then(function () {
return self.pre_onchange_hook(barcode).then(function (proceed) {
if (proceed) {
self.set_value(barcode); // set the barcode field with the received one
return form_onchanges_mutex(); // wait for its onchange to finish
}
});
});
};
this.process_barcode_mutex.exec(process_barcode);
}
},
@@ -641,7 +641,8 @@ ListView.include(/** @lends instance.web.ListView# */{
if (saveInfo.created) {
return self.start_edition();
}
var record = self.records[next_record](saveInfo.record);
var options = { wraparound: !self.is_action_enabled('create') };
var record = self.records[next_record](saveInfo.record, options);
if (record === undefined) {
return self.start_edition();
}
@@ -161,6 +161,11 @@ var FieldTextHtmlSimple = widget.extend({
return !this.get('value') || this.get('value') === "<p><br/></p>" || !this.get('value').match(/\S/);
},
commit_value: function () {
/* Switch to WYSIWYG mode if currently in code view */
if (session.debug) {
var layoutInfo = this.$textarea.data('layoutInfo');
$.summernote.pluginEvents.codeview(undefined, undefined, layoutInfo, false);
}
if (this.options['style-inline']) {
transcoder.class_to_style(this.$content);
transcoder.font_to_img(this.$content);
@@ -377,6 +382,11 @@ var FieldTextHtml = widget.extend({
this._dirty_flag = false;
return this.editor.save();
} else if (this._dirty_flag && this.editor && this.editor.buildingBlock) {
/* Switch to WYSIWYG mode if currently in code view */
if (session.debug) {
var layoutInfo = this.editor.rte.editable().data('layoutInfo');
$.summernote.pluginEvents.codeview(undefined, undefined, layoutInfo, false);
}
this.editor.buildingBlock.clean_for_save();
this.internal_set_value( this.$content.html() );
}
@@ -511,12 +511,32 @@ function prettify_html(html) {
}
return result;
}
$.summernote.pluginEvents.codeview = function (event, editor, layoutInfo) {
/*
* This override when clicking on the 'Code View' button has two aims:
*
* - have our own code view implementation for FieldTextHtml
* - add an 'enable' paramater to call the function directly and allow us to
* disable (false) or enable (true) the code view mode.
*/
$.summernote.pluginEvents.codeview = function (event, editor, layoutInfo, enable) {
if (layoutInfo === undefined) {
return;
}
if (layoutInfo.toolbar) {
// if editor inline (FieldTextHtmlSimple)
var is_activated = $.summernote.eventHandler.modules.codeview.isActivated(layoutInfo);
if (is_activated === enable) {
return;
}
return eventHandler.modules.codeview.toggle(layoutInfo);
} else {
// if editor iframe (FieldTextHtml)
var $editor = layoutInfo.editor();
var $textarea = $editor.prev('textarea');
if ($textarea.is('textarea') === enable) {
return;
}
if (!$textarea.length) {
// init and create texarea