diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js
index bec4a35637a..af30b6a640a 100644
--- a/addons/website/static/src/js/website.js
+++ b/addons/website/static/src/js/website.js
@@ -159,157 +159,16 @@ instance.website.EditorBar = instance.web.Widget.extend({
},
});
-instance.website.Action = instance.web.Widget.extend({
- tagName: 'button',
- attributes: {
- type: 'button',
- },
- events: { click: 'perform' },
- init: function (parent, name) {
- this._super(parent);
- this.name = name;
- },
- start: function () {
- this.$el.text(this.name);
- return this._super();
- },
- /**
- * Executes action
- */
- perform: null,
- toggle: function (to) {
- this.$el.prop('disabled', !to);
- },
-});
-var Style = instance.website.Style = instance.website.Action.extend({
- init: function (parent, name, style) {
- this._super(parent, name);
- this.style = style;
- },
- perform: function () {
- this.getParent().with_editor(function (editor) {
- editor.applyStyle(new CKEDITOR.style(this.style))
- }.bind(this));
- },
-});
-var Command = instance.website.Command = instance.website.Action.extend({
- init: function (parent, name, command) {
- this._super(parent, name);
- this.command = command;
- },
- perform: function () {
- this.getParent().with_editor(function (editor) {
- switch (typeof this.command) {
- case 'string': editor.execCommand(this.command); break;
- case 'function': this.command(editor); break;
- }
- }.bind(this));
- },
-});
-var Group = instance.website.ActionGroup = instance.website.Action.extend({
- template: 'Website.ActionGroup',
- events: { 'click > button': 'perform' },
- instances: [],
- init: function (parent, name, actions) {
- this._super(parent, name);
- this.actions = _(actions).map(this.getParent().proxy('init_command'));
- },
- start: function () {
- this.instances.push(this);
- var $ul = this.$('ul');
- return $.when.apply(null, _(this.actions).map(function (action) {
- var $li = $('
').appendTo($ul);
- return action.appendTo($li);
- }));
- },
- destroy: function () {
- this.instances = _(this.instances).without(this);
- return this._super();
- },
- perform: function () {
- this.getParent().with_editor(function () {
- _(this.instances).chain()
- .without(this)
- .pluck('$el')
- .invoke('removeClass', 'open');
- // JS part of bootstrap dropdown does really weird stuff which
- // interacts quite badly with the RTE thing, so bypass it
- this.$el.toggleClass('open');
- }.bind(this), false);
- return false;
- },
- toggle: function (to) {
- this.$('> button').prop('disabled', !to);
- },
-});
-
instance.website.RTE = instance.web.Widget.extend({
tagName: 'li',
+ id: 'oe_rte_toolbar',
className: 'oe_right oe_rte_toolbar',
- commands: [
- [Command, "\uf032", 'bold'],
- [Command, "\uf033", 'italic'],
- [Command, "\uf0cd", 'underline'],
- [Command, "\uf0cc", 'strike'],
- [Command, "\uf12b", 'superscript'],
- [Command, "\uf12c", 'subscript'],
- [Command, "\uf0c1", 'link'],
- [Command, "\uf127", 'unlink'],
- [Command, "\uf10d", 'blockquote'],
- // 'image' uses either filebrowserImageUploadUrl or
- // filebrowserUploadUrl, and provides a `link` tab. imagebutton only
- // uses filebrowserImageUploadUrl and does not provide a `link` tab to
- // hotlink an image from the internets.
- [Command, "\uf03e", 'image'],
- // [Command, "\uf030", 'imagebutton'],
- [Group, "\uf0ca", [
- [Command, "\uf0ca", 'bulletedlist'],
- [Command, "\uf0cb", 'numberedlist'],
- [Command, "\uf03b", 'outdent'],
- [Command, "\uf03c", 'indent']
- ]],
- [Group, _lt("Heading"), [
- [Style, _lt('H1'), { element: 'h1' }],
- [Style, _lt('H2'), { element: 'h2', }],
- [Style, _lt('H3'), { element: 'h3', }],
- [Style, _lt('H4'), { element: 'h4', }],
- [Style, _lt('H5'), { element: 'h5', }],
- [Style, _lt('H6'), { element: 'h6', }]
- ]],
- [Group, "\uf039", [
- [Command, "\uf039", 'justifyblock'],
- [Command, "\uf036", 'justifyleft'],
- [Command, "\uf038", 'justifyright'],
- [Command, "\uf037", 'justifycenter']
- ]]
- ],
// editor.ui.items -> possible commands &al
// editor.applyStyle(new CKEDITOR.style({element: "span",styles: {color: "#(color)"},overrides: [{element: "font",attributes: {color: null}}]}, {color: '#ff0000'}));
- start: function () {
- this.$el.hide();
- return $.when.apply(
- null, _(this.commands).map(this.proxy('start_command')));
- },
- init_command: function (command) {
- var type = command[0], args = command.slice(1);
- args.unshift(this);
- var F = function (args) {
- return type.apply(this, args);
- };
- F.prototype = type.prototype;
-
- return new F(args);
- },
- start_command: function (command) {
- return this.init_command(command).appendTo(this.$el);
- },
start_edition: function ($elements) {
var self = this;
- this.$el.show();
- this.disable();
this.snippet_carousel();
- CKEDITOR.on('currentInstance', this.proxy('_change_focused_editor'));
$elements
.not('span, [data-oe-type]')
.each(function () {
@@ -321,40 +180,11 @@ instance.website.RTE = instance.web.Widget.extend({
});
},
- /**
- * @param {Function} fn
- * @param {Boolean} [snapshot=true]
- * @returns {$.Deferred}
- */
- with_editor: function (fn, snapshot) {
- var editor = this._current_editor();
- if (snapshot !== false) { editor.fire('saveSnapshot'); }
- return $.when(fn(editor)).then(function () {
- if (snapshot !== false) { editor.fire('saveSnapshot'); }
- editor.focus();
- });
- },
-
-
- toggle: function (to) {
- _(this.getChildren()).chain()
- .filter(function (child) { return child instanceof instance.website.Action })
- .invoke('toggle', to);
- },
- disable: function () {
- this.toggle(false);
- },
-
_current_editor: function () {
return CKEDITOR.currentInstance;
},
- _change_focused_editor: function () {
- this.toggle(!!CKEDITOR.currentInstance);
- },
_config: function () {
var removed_plugins = [
- // remove toolbar entirely
- 'toolbar,elementspath,resize',
// remove custom context menu
'contextmenu,tabletools,liststyle',
// magicline captures mousein/mouseout => draggable does not work
@@ -372,6 +202,21 @@ instance.website.RTE = instance.web.Widget.extend({
// Don't insert paragraphs around content in e.g.
autoParagraph: false,
filebrowserImageUploadUrl: "/website/attach",
+ // Support for sharedSpaces in 4.x
+ extraPlugins: 'sharedspace',
+ // Place toolbar in controlled location
+ sharedSpaces: { top: 'oe_rte_toolbar' },
+ toolbar: [
+ {name: 'items', items: [
+ "Bold", "Italic", "Underline", "Strike", "Subscript",
+ "Superscript", "TextColor", "BGColor", "RemoveFormat",
+ "Link", "Unlink", "Blockquote", "BulletedList",
+ "NumberedList", "Image", "Indent", "Outdent",
+ "JustifyLeft", "JustifyCenter", "JustifyRight",
+ "JustifyBlock", "Table", "Font", "FontSize", "Format",
+ "Styles"
+ ]}
+ ]
};
},
// TODO clean
diff --git a/addons/website/views/views.xml b/addons/website/views/views.xml
index f6c259771ed..80802bd673f 100644
--- a/addons/website/views/views.xml
+++ b/addons/website/views/views.xml
@@ -55,6 +55,7 @@
+