diff --git a/addons/mass_mailing/static/src/js/mass_mailing_widget.js b/addons/mass_mailing/static/src/js/mass_mailing_widget.js
index 12eec137545..cf97d3fd9a0 100644
--- a/addons/mass_mailing/static/src/js/mass_mailing_widget.js
+++ b/addons/mass_mailing/static/src/js/mass_mailing_widget.js
@@ -12,6 +12,9 @@ var _t = core._t;
var MassMailingFieldHtml = FieldHtml.extend({
xmlDependencies: (FieldHtml.prototype.xmlDependencies || []).concat(["/mass_mailing/static/src/xml/mass_mailing.xml"]),
+ jsLibs: [
+ '/mass_mailing/static/src/js/mass_mailing_snippets.js',
+ ],
custom_events: _.extend({}, FieldHtml.prototype.custom_events, {
snippets_loaded: '_onSnippetsLoaded',
@@ -305,7 +308,7 @@ var MassMailingFieldHtml = FieldHtml.extend({
this.$content.focusIn();
}
}
- this.wysiwyg.snippets.trigger('reload_snippet_dropzones');
+ this.wysiwyg.trigger('reload_snippet_dropzones');
},
//--------------------------------------------------------------------------
@@ -442,7 +445,7 @@ var MassMailingFieldHtml = FieldHtml.extend({
selectedTheme = themeParams;
// Notify form view
- self.wysiwyg._onChange();
+ self.wysiwyg.getEditable().trigger('change');
$dropdown.find('.dropdown-menu').removeClass('show');
$dropdown.find('.dropdown-item.selected').removeClass('selected');
$dropdown.find('.dropdown-item:eq(' + themesParams.indexOf(selectedTheme) + ')').addClass('selected');
diff --git a/addons/mass_mailing/static/tests/mass_mailing_html_tests.js b/addons/mass_mailing/static/tests/mass_mailing_html_tests.js
index 36bea2db624..0657278ec16 100644
--- a/addons/mass_mailing/static/tests/mass_mailing_html_tests.js
+++ b/addons/mass_mailing/static/tests/mass_mailing_html_tests.js
@@ -46,7 +46,7 @@ QUnit.module('field html', {
}
if (xmlId === 'template.assets_all_style') {
return $.when({
- cssLibs: $('head link[href]:not([type="image/x-icon"])').map(function () {
+ cssLibs: $('link[href]:not([type="image/x-icon"])').map(function () {
return $(this).attr('href');
}).get(),
cssContents: ['.field_body {background-color: red;}']
diff --git a/addons/mass_mailing/views/editor_field_html.xml b/addons/mass_mailing/views/editor_field_html.xml
index 25f2be6fe23..620ccc78c44 100644
--- a/addons/mass_mailing/views/editor_field_html.xml
+++ b/addons/mass_mailing/views/editor_field_html.xml
@@ -7,15 +7,17 @@
-
-
-
+
+
+
+
+
@@ -26,6 +28,14 @@
+
+
diff --git a/addons/mass_mailing/views/mass_mailing_template.xml b/addons/mass_mailing/views/mass_mailing_template.xml
index 359391e95c5..64bfb918d8a 100644
--- a/addons/mass_mailing/views/mass_mailing_template.xml
+++ b/addons/mass_mailing/views/mass_mailing_template.xml
@@ -7,7 +7,6 @@
-
diff --git a/addons/web/static/src/js/core/widget.js b/addons/web/static/src/js/core/widget.js
index b25cd99587b..d3b9cc1033c 100644
--- a/addons/web/static/src/js/core/widget.js
+++ b/addons/web/static/src/js/core/widget.js
@@ -84,6 +84,32 @@ var Widget = core.Class.extend(mixins.PropertiesMixin, ServicesMixin, {
* @type {null|string[]}
*/
xmlDependencies: null,
+ /**
+ * List of paths to css files that need to be loaded before the widget can
+ * be rendered. This will not induce loading anything that has already been
+ * loaded.
+ *
+ * @type {null|string[]}
+ */
+ cssLibs: null,
+ /**
+ * List of paths to js files that need to be loaded before the widget can
+ * be rendered. This will not induce loading anything that has already been
+ * loaded.
+ *
+ * @type {null|string[]}
+ */
+ jsLibs: null,
+ /**
+ * List of xmlID that need to be loaded before the widget can be rendered.
+ * The content css (link file or style tag) and js (file or inline) of the
+ * assets are loaded.
+ * This will not induce loading anything that has already been
+ * loaded.
+ *
+ * @type {null|string[]}
+ */
+ assetLibs: null,
/**
* Constructs the widget and sets its parent if a parent is given.
@@ -115,13 +141,16 @@ var Widget = core.Class.extend(mixins.PropertiesMixin, ServicesMixin, {
* @returns {Deferred}
*/
willStart: function () {
+ var defs = [];
if (this.xmlDependencies) {
- var defs = _.map(this.xmlDependencies, function (xmlPath) {
+ defs.push.apply(defs, _.map(this.xmlDependencies, function (xmlPath) {
return ajax.loadXML(xmlPath, core.qweb);
- });
- return $.when.apply($, defs);
+ }));
}
- return $.when();
+ if (this.jsLibs || this.cssLibs || this.assetLibs) {
+ defs.push(ajax.loadLibs(this));
+ }
+ return $.when.apply($, defs);
},
/**
* Method called after rendering. Mostly used to bind actions, perform
diff --git a/addons/web/static/src/js/fields/abstract_field.js b/addons/web/static/src/js/fields/abstract_field.js
index 37d2f22ef55..edc7c03ac02 100644
--- a/addons/web/static/src/js/fields/abstract_field.js
+++ b/addons/web/static/src/js/fields/abstract_field.js
@@ -35,8 +35,6 @@ var field_utils = require('web.field_utils');
var Widget = require('web.Widget');
var AbstractField = Widget.extend({
- cssLibs: [],
- jsLibs: [],
events: {
'keydown': '_onKeydown',
},
@@ -182,14 +180,6 @@ var AbstractField = Widget.extend({
this.resetOnAnyFieldChange = true;
}
},
- /**
- * Loads the libraries listed in this.jsLibs and this.cssLibs
- *
- * @override
- */
- willStart: function () {
- return $.when(ajax.loadLibs(this), this._super.apply(this, arguments));
- },
/**
* When a field widget is appended to the DOM, its start method is called,
* and will automatically call render. Most widgets should not override this.
diff --git a/addons/web_editor/static/src/js/backend/convert_inline.js b/addons/web_editor/static/src/js/backend/convert_inline.js
index 3b09bef5f31..b6b36a388ef 100644
--- a/addons/web_editor/static/src/js/backend/convert_inline.js
+++ b/addons/web_editor/static/src/js/backend/convert_inline.js
@@ -1,7 +1,6 @@
odoo.define('web_editor.convertInline', function (require) {
'use strict';
-var fonts = require('wysiwyg.fonts');
var FieldHtml = require('web_editor.field.html');
/**
@@ -189,6 +188,8 @@ function getMatchedCSSRules(a) {
* converted to images
*/
function fontToImg($editable) {
+ var fonts = odoo.__DEBUG__.services["wysiwyg.fonts"];
+
$editable.find('.fa').each(function () {
var $font = $(this);
var icon, content;
diff --git a/addons/web_editor/static/src/js/backend/field_html.js b/addons/web_editor/static/src/js/backend/field_html.js
index 69e32fb815e..b78fcc1d35f 100644
--- a/addons/web_editor/static/src/js/backend/field_html.js
+++ b/addons/web_editor/static/src/js/backend/field_html.js
@@ -4,12 +4,12 @@ odoo.define('web_editor.field.html', function (require) {
var ajax = require('web.ajax');
var basic_fields = require('web.basic_fields');
var core = require('web.core');
-var Wysiwyg = require('web_editor.wysiwyg');
+var Wysiwyg = require('web_editor.wysiwyg.root');
var field_registry = require('web.field_registry');
var TranslatableFieldMixin = basic_fields.TranslatableFieldMixin;
-
var QWeb = core.qweb;
+var assetsLoaded = false;
/**
* FieldHtml Widget
@@ -40,8 +40,23 @@ var FieldHtml = basic_fields.DebouncedField.extend(TranslatableFieldMixin, {
*/
willStart: function () {
this._onUpdateIframeId = 'onLoad_' + _.uniqueId('FieldHtml');
- var defAsset = this.nodeOptions.cssReadonly && ajax.loadAsset(this.nodeOptions.cssReadonly);
- return $.when(this._super().then(Wysiwyg.prepare.bind(Wysiwyg, this)), defAsset);
+ var defAsset = null;
+ if (this.nodeOptions.cssReadonly) {
+ defAsset = ajax.loadAsset(this.nodeOptions.cssReadonly);
+ }
+
+ if (!assetsLoaded) { // avoid flickering when begin to edit
+ assetsLoaded = $.Deferred();
+ var wysiwyg = new Wysiwyg(this, {});
+ wysiwyg.attachTo($('