← Back to team overview

openerp-community-reviewer team mailing list archive

[Merge] lp:~therp-nl/web-addons/7.0_web_ckeditor into lp:web-addons

 

Holger Brunn (Therp) has proposed merging lp:~therp-nl/web-addons/7.0_web_ckeditor into lp:web-addons with lp:~therp-nl/web-addons/7.0_web_ckeditor_ckeditor as a prerequisite.

Commit message:
[ADD] web_ckeditor4

Requested reviews:
  Web-Addons Core Editors (webaddons-core-editors)

For more details, see:
https://code.launchpad.net/~therp-nl/web-addons/7.0_web_ckeditor/+merge/200564

This adds the 7.0 version of the ckeditor4 widget.

Why do we want that? OpenERP's standard HTML editor (cleditor) has problems with complex layouts, doesn't support a simple way to 'upload' images into a data URL and possibly some users are simply more comfortable with ckeditor.

Note: I put the branch containing the lib/ckeditor directory into its own branch (added as prerequisite). This is to avoid noise in the diff. It's ckeditor 4.3.1 as you can download it today.
-- 
https://code.launchpad.net/~therp-nl/web-addons/7.0_web_ckeditor/+merge/200564
Your team Web-Addons Core Editors is requested to review the proposed merge of lp:~therp-nl/web-addons/7.0_web_ckeditor into lp:web-addons.
=== added file 'web_ckeditor4/__init__.py'
--- web_ckeditor4/__init__.py	1970-01-01 00:00:00 +0000
+++ web_ckeditor4/__init__.py	2014-01-06 18:03:28 +0000
@@ -0,0 +1,22 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    This module copyright (C) 2013 Therp BV (<http://therp.nl>)
+#    All Rights Reserved
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+

=== added file 'web_ckeditor4/__openerp__.py'
--- web_ckeditor4/__openerp__.py	1970-01-01 00:00:00 +0000
+++ web_ckeditor4/__openerp__.py	2014-01-06 18:03:28 +0000
@@ -0,0 +1,114 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    This module copyright (C) 2013 Therp BV (<http://therp.nl>)
+#    All Rights Reserved
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+{
+    'name': 'CKEditor 4.x widget',
+    'version': '1.0',
+    'description': """
+    This addon provides a widget for editing html fields via CKEditor 4.x
+
+    Use widget="text_html" if you need just html display. In the unlikely case
+    you need specific features of ckeditor, use widget="text_ckeditor4".
+    """,
+    'author': 'Therp BV',
+    'website': 'http://www.therp.nl',
+    "category": "Tools",
+    "depends": [
+        'web',
+        ],
+    'css': [
+        'static/src/css/web_ckeditor4.css',
+        ],
+    'data': [
+        ],
+    'js': [
+        'static/src/js/ckeditor_basepath.js',
+        'static/lib/ckeditor/ckeditor.js',
+        'static/lib/ckeditor/config.js',
+        #to debug ckeditor, comment the lines above,
+        #do a
+        #cd static/lib
+        #git clone https://github.com/ckeditor/ckeditor-dev.git trunk
+        #cd trunk
+        #git checkout remotes/origin/release/4.1.x
+        #and uncomment the lines below
+#        'static/lib/trunk/ckeditor.js',
+#        'static/lib/trunk/core/event.js',
+#        'static/lib/trunk/core/editor_basic.js',
+#        'static/lib/trunk/core/env.js',
+#        'static/lib/trunk/core/ckeditor_basic.js',
+#        'static/lib/trunk/core/dom.js',
+#        'static/lib/trunk/core/tools.js',
+#        'static/lib/trunk/core/dtd.js',
+#        'static/lib/trunk/core/dom/event.js',
+#        'static/lib/trunk/core/dom/domobject.js',
+#        'static/lib/trunk/core/dom/node.js',
+#        'static/lib/trunk/core/dom/window.js',
+#        'static/lib/trunk/core/dom/document.js',
+#        'static/lib/trunk/core/dom/nodelist.js',
+#        'static/lib/trunk/core/dom/element.js',
+#        'static/lib/trunk/core/dom/documentfragment.js',
+#        'static/lib/trunk/core/dom/walker.js',
+#        'static/lib/trunk/core/dom/range.js',
+#        'static/lib/trunk/core/dom/iterator.js',
+#        'static/lib/trunk/core/command.js',
+#        'static/lib/trunk/core/ckeditor_base.js',
+#        'static/lib/trunk/core/config.js',
+#        'static/lib/trunk/core/filter.js',
+#        'static/lib/trunk/core/focusmanager.js',
+#        'static/lib/trunk/core/keystrokehandler.js',
+#        'static/lib/trunk/core/lang.js',
+#        'static/lib/trunk/core/scriptloader.js',
+#        'static/lib/trunk/core/resourcemanager.js',
+#        'static/lib/trunk/core/plugins.js',
+#        'static/lib/trunk/core/ui.js',
+#        'static/lib/trunk/core/editor.js',
+#        'static/lib/trunk/core/htmlparser.js',
+#        'static/lib/trunk/core/htmlparser/basicwriter.js',
+#        'static/lib/trunk/core/htmlparser/node.js',
+#        'static/lib/trunk/core/htmlparser/comment.js',
+#        'static/lib/trunk/core/htmlparser/text.js',
+#        'static/lib/trunk/core/htmlparser/cdata.js',
+#        'static/lib/trunk/core/htmlparser/fragment.js',
+#        'static/lib/trunk/core/htmlparser/filter.js',
+#        'static/lib/trunk/core/htmldataprocessor.js',
+#        'static/lib/trunk/core/htmlparser/element.js',
+#        'static/lib/trunk/core/template.js',
+#        'static/lib/trunk/core/ckeditor.js',
+#        'static/lib/trunk/core/creators/inline.js',
+#        'static/lib/trunk/core/creators/themedui.js',
+#        'static/lib/trunk/core/editable.js',
+#        'static/lib/trunk/core/selection.js',
+#        'static/lib/trunk/core/style.js',
+#        'static/lib/trunk/core/dom/comment.js',
+#        'static/lib/trunk/core/dom/elementpath.js',
+#        'static/lib/trunk/core/dom/text.js',
+#        'static/lib/trunk/core/dom/rangelist.js',
+#        'static/lib/trunk/core/skin.js',
+#        'static/lib/trunk/core/_bootstrap.js', 
+        #end of ckeditor debug
+        'static/src/js/web_ckeditor4.js',
+        ],
+    'installable': True,
+    'auto_install': False,
+    'certificate': '',
+}

=== added directory 'web_ckeditor4/static/src'
=== added directory 'web_ckeditor4/static/src/css'
=== added file 'web_ckeditor4/static/src/css/web_ckeditor4.css'
--- web_ckeditor4/static/src/css/web_ckeditor4.css	1970-01-01 00:00:00 +0000
+++ web_ckeditor4/static/src/css/web_ckeditor4.css	2014-01-06 18:03:28 +0000
@@ -0,0 +1,6 @@
+.openerp .oe_form_field_text_ckeditor4.disabled, .openerp td.oe_form_field_text_ckeditor4, .openerp .oe_form_field_text_ckeditor4_raw.disabled.openerp, .openerp td.oe_form_field_text_ckeditor4_raw {
+    /* here we need to reset openerp's styles to
+     * have the HTML display as (probably) intended
+     */
+    white-space: normal;
+}

=== added directory 'web_ckeditor4/static/src/img'
=== added file 'web_ckeditor4/static/src/img/icon.png'
Binary files web_ckeditor4/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and web_ckeditor4/static/src/img/icon.png	2014-01-06 18:03:28 +0000 differ
=== added directory 'web_ckeditor4/static/src/js'
=== added file 'web_ckeditor4/static/src/js/ckeditor_basepath.js'
--- web_ckeditor4/static/src/js/ckeditor_basepath.js	1970-01-01 00:00:00 +0000
+++ web_ckeditor4/static/src/js/ckeditor_basepath.js	2014-01-06 18:03:28 +0000
@@ -0,0 +1,1 @@
+CKEDITOR_BASEPATH='/web_ckeditor4/static/lib/ckeditor/'

=== added file 'web_ckeditor4/static/src/js/web_ckeditor4.js'
--- web_ckeditor4/static/src/js/web_ckeditor4.js	1970-01-01 00:00:00 +0000
+++ web_ckeditor4/static/src/js/web_ckeditor4.js	2014-01-06 18:03:28 +0000
@@ -0,0 +1,217 @@
+/* -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    This module copyright (C) 2013 Therp BV (<http://therp.nl>)
+#    All Rights Reserved
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+############################################################################*/
+
+openerp.web_ckeditor4 = function(openerp)
+{
+    var ckeditor_addFunction_org = CKEDITOR.tools.addFunction;
+    //this is a quite complicated way to kind of monkey patch the private
+    //method onDomReady of ckeditor's plugin wysiwigarea, which causes problems
+    //when the editor is about to be destroyed but because of OpenERP's
+    //architecture updated one last time with its current value
+    CKEDITOR.tools.addFunction = function(fn, scope)
+    {
+        if(scope && scope._ && scope._.attrChanges && scope._.detach)
+        {
+            var scope_reference = scope;
+            return ckeditor_addFunction_org(function()
+                    {
+                        var self = this,
+                            self_arguments=arguments;
+                        setTimeout(function()
+                        {
+                            if(CKEDITOR.instances[self.editor.name])
+                            {
+                                fn.apply(self, self_arguments);
+                            }
+                        }, 0);
+                    }, scope);
+        }
+        return ckeditor_addFunction_org(fn, scope);
+    };
+
+    CKEDITOR.on('dialogDefinition', function(e)
+        {
+            _.each(e.data.definition.contents, function(element)
+            {
+                if(element.filebrowser!='uploadButton')
+                {
+                    return
+                }
+                _.each(element.elements, function(element)
+                {
+                    if(!element.onClick || element.type!='fileButton')
+                    {
+                        return
+                    }
+                    var onClick_org = element.onClick;
+                    element.onClick = function(e1)
+                    {
+                        onClick_org.apply(this, arguments);
+                        _.each(jQuery('#'+this.domId).closest('table')
+                            .find('iframe').contents().find(':file')
+                            .get(0).files,
+                            function(file)
+                            {
+                                var reader = new FileReader();
+                                reader.onload = function(load_event)
+                                {
+                                    CKEDITOR.tools.callFunction(
+                                        e.editor._.filebrowserFn,
+                                        load_event.target.result,
+                                        '');
+                                }
+                                reader.readAsDataURL(file);
+                            });
+                        return false;
+                    }
+                });
+            });
+        });
+
+    openerp.web.form.widgets.add('text_ckeditor4',
+            'openerp.web_ckeditor4.FieldCKEditor4');
+    openerp.web.form.widgets.add('text_ckeditor4_raw',
+            'openerp.web_ckeditor4.FieldCKEditor4Raw');
+    openerp.web.form.widgets.add('text_html',
+            'openerp.web_ckeditor4.FieldCKEditor4');
+    openerp.web.form.widgets.add('html',
+            'openerp.web_ckeditor4.FieldCKEditor4');
+
+    function filter_html(value, ckeditor_filter, ckeditor_writer)
+    {
+        var fragment = CKEDITOR.htmlParser.fragment.fromHtml(value);
+        ckeditor_filter.applyTo(fragment);
+        ckeditor_writer.reset();
+        fragment.writeHtml(ckeditor_writer);
+        return ckeditor_writer.getHtml();
+    };
+
+    default_ckeditor_filter = new CKEDITOR.filter(
+            {
+                '*':
+                {
+                    attributes: 'href,src,style,alt,width,height,dir',
+                    styles: '*',
+                    classes: '*',
+                },
+                'html head title meta style body p div span a h1 h2 h3 h4 h5 img br hr table tr th td ul ol li dd dt strong pre b i': true,
+            });
+    default_ckeditor_writer = new CKEDITOR.htmlParser.basicWriter();
+
+    openerp.web_ckeditor4.FieldCKEditor4 = openerp.web.form.FieldText.extend({
+        ckeditor_config: {
+            removePlugins: 'iframe,flash,forms,smiley,pagebreak,stylescombo',
+            filebrowserImageUploadUrl: 'dummy',
+            extraPlugins: 'filebrowser',
+        },
+        ckeditor_filter: default_ckeditor_filter,
+        ckeditor_writer: default_ckeditor_writer,
+        start: function()
+        {
+            this._super.apply(this, arguments);
+    
+            CKEDITOR.lang.load(openerp.session.user_context.lang.split('_')[0], 'en', function() {});
+        },
+        initialize_content: function()
+        {
+            var self = this;
+            this._super.apply(this, arguments);
+            if(!this.$textarea)
+            {
+                return;
+            }
+            this.editor = CKEDITOR.replace(this.$textarea.get(0),
+                _.extend(
+                    {
+                        language: openerp.session.user_context.lang.split('_')[0],
+                        on:
+                        {
+                            'change': function()
+                            {
+                                self.store_dom_value();
+                            },
+                        },
+                    }, 
+                    this.ckeditor_config));
+        },
+        store_dom_value: function()
+        {
+            this.internal_set_value(this.editor ? this.editor.getData() : openerp.web.parse_value(this.get('value'), this));
+        },
+        filter_html: function(value)
+        {
+            return filter_html(value, this.ckeditor_filter, this.ckeditor_writer);
+        },
+        render_value: function()
+        {
+            if(this.get("effective_readonly"))
+            {
+                this.$el.html(this.filter_html(this.get('value')));
+            }
+            else
+            {
+                if(this.editor)
+                {
+                    var self = this;
+                    if(this.editor.status != 'ready')
+                    {
+                        var instanceReady = function()
+                        {
+                            self.editor.setData(self.get('value') || '');
+                            self.editor.removeListener('instanceReady', instanceReady);
+                        };
+                        this.editor.on('instanceReady', instanceReady);
+                    }
+                    else
+                    {
+                        self.editor.setData(self.get('value') || '');
+                    }
+                }
+            }
+        },
+        undelegateEvents: function()
+        {
+            this._cleanup_editor();
+            return this._super.apply(this, arguments);
+        },
+        _cleanup_editor: function()
+        {
+            if(this.editor)
+            {
+                CKEDITOR.remove(this.editor);
+                this.editor.removeAllListeners();
+                this.editor = null;
+            }
+        },
+        destroy_content: function()
+        {
+            this._cleanup_editor();
+        }
+    });
+    openerp.web_ckeditor4.FieldCKEditor4Raw = openerp.web_ckeditor4.FieldCKEditor4.extend({
+        filter_html: function(value)
+        {
+            return value;
+        }
+    });
+}
+


Follow ups