diff --git a/web_ckeditor4/README.rst b/web_ckeditor4/README.rst index fc851aa4..3ed01db4 100644 --- a/web_ckeditor4/README.rst +++ b/web_ckeditor4/README.rst @@ -1,44 +1,56 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License: AGPL-3 +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 +=================== CKEditor web widget =================== -This addon provides a widget for editing html fields via CKEditor 4.6.6 +This module introduces the text_ckeditor4 widget that when used allows the user +to use specific features of ckeditor. + +Usage +===== -Configuration -============= +To use this module, you need to: -In your view definition, use widget="text_html" if you need just html display. -In the unlikely case you need specific features of ckeditor, -use widget="text_ckeditor4". +#. Go to ... + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/162/10.0 Known issues / Roadmap ====================== * This version of CKEditor contains a patch that prevents the referencing of -the editor's iframe if it has already been cleaned up by Odoo. In 8.0, this is -the case if the editor was created in an x2many popup. The patch was proposed -as https://github.com/ckeditor/ckeditor-dev/pull/200 + the editor's iframe if it has already been cleaned up by Odoo. In 8.0, this is + the case if the editor was created in an x2many popup. The patch was proposed + as https://github.com/ckeditor/ckeditor-dev/pull/200 Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smash it by providing detailed and welcomed feedback. Credits ======= -CKEditor 4.4.6 Copyright (C) 2003-2015 CKSource - Frederico Knabben +Images +------ + +* Odoo Community Association: `Icon `_. Contributors ------------ +* Holger Brunn +* Stefan Rijnhart +* George Daramouskas -* Holger Brunn -* Stefan Rijnhart +Do not contact contributors directly about support or help with technical issues. Maintainer ---------- @@ -53,4 +65,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit http://odoo-community.org. +To contribute to this module, please visit https://odoo-community.org. diff --git a/web_ckeditor4/__manifest__.py b/web_ckeditor4/__manifest__.py index f9324ff0..28825be1 100644 --- a/web_ckeditor4/__manifest__.py +++ b/web_ckeditor4/__manifest__.py @@ -1,28 +1,9 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# This module copyright (C) 2013-2015 Therp BV () -# 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 . -# -############################################################################## - +# -*- coding: utf-8 -*- +# Copyright 2018 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': 'CKEditor 4.x widget', - 'version': '8.0.1.0.0', + 'version': '10.0.1.0.0', 'author': "Therp BV,Odoo Community Association (OCA)", 'website': 'https://github.com/OCA/web', 'summary': 'Provides a widget for editing HTML fields using CKEditor 4.x', @@ -37,7 +18,6 @@ 'css': [ 'static/src/css/web_ckeditor4.css', ], - 'installable': False, + 'installable': True, 'auto_install': False, - 'certificate': '', } diff --git a/web_ckeditor4/models/ckeditor_monkeypatch.py b/web_ckeditor4/models/ckeditor_monkeypatch.py index 89de275a..c9b2f9b9 100644 --- a/web_ckeditor4/models/ckeditor_monkeypatch.py +++ b/web_ckeditor4/models/ckeditor_monkeypatch.py @@ -27,7 +27,7 @@ class CkeditorMonkeypatch(models.AbstractModel): _name = 'ckeditor.monkeypatch' _description = 'Monkeypatches for CKEditor' - def _register_hook(self, cr): + def _register_hook(self): marker = self._name.replace('.', '_') if not hasattr(clean, marker): # monkey patch lxml's html cleaner to allow image data urls @@ -41,4 +41,4 @@ class CkeditorMonkeypatch(models.AbstractModel): # TODO: do something else for 2.3.1 <= version <= 3.2, before data # urls were not cleaned at all setattr(clean, marker, True) - return super(CkeditorMonkeypatch, self)._register_hook(cr) + return super(CkeditorMonkeypatch, self)._register_hook() diff --git a/web_ckeditor4/static/src/css/web_ckeditor4.css b/web_ckeditor4/static/src/css/web_ckeditor4.css index 6bfad78b..2e65611a 100644 --- a/web_ckeditor4/static/src/css/web_ckeditor4.css +++ b/web_ckeditor4/static/src/css/web_ckeditor4.css @@ -1,5 +1,5 @@ -.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 +.odoo .oe_form_field_text_ckeditor4.disabled, .odoo td.oe_form_field_text_ckeditor4, .odoo .oe_form_field_text_ckeditor4_raw.disabled.odoo, .odoo td.oe_form_field_text_ckeditor4_raw { + /* here we need to reset odoo's styles to * have the HTML display as (probably) intended */ white-space: normal; diff --git a/web_ckeditor4/static/src/js/web_ckeditor4.js b/web_ckeditor4/static/src/js/web_ckeditor4.js index 4935ac9c..db327286 100644 --- a/web_ckeditor4/static/src/js/web_ckeditor4.js +++ b/web_ckeditor4/static/src/js/web_ckeditor4.js @@ -20,8 +20,12 @@ # ############################################################################*/ -openerp.web_ckeditor4 = function(instance) -{ +odoo.define('web_ckeditor4', function(require){ + "use strict"; + var core = require('web.core'); + var session = require('web.session'); + var formats = require('web.formats'); + 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 @@ -33,17 +37,17 @@ openerp.web_ckeditor4 = function(instance) { var scope_reference = scope; return ckeditor_addFunction_org(function() - { - var self = this, - self_arguments=arguments; - setTimeout(function() + { + var self = this, + self_arguments=arguments; + setTimeout(function() { if(self.editor) { fn.apply(self, self_arguments); } }, 0); - }, scope); + }, scope); } return ckeditor_addFunction_org(fn, scope); }; @@ -51,51 +55,41 @@ openerp.web_ckeditor4 = function(instance) CKEDITOR.on('dialogDefinition', function(e) { _.each(e.data.definition.contents, function(element) - { - if(!element || element.filebrowser!='uploadButton') { - return - } - _.each(element.elements, function(element) - { - if(!element.onClick || element.type!='fileButton') + if(!element || element.filebrowser!='uploadButton') { 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) + _.each(element.elements, function(element) + { + if(!element.onClick || element.type!='fileButton') { - var reader = new FileReader(); - reader.onload = function(load_event) - { - CKEDITOR.tools.callFunction( - e.editor._.filebrowserFn, - load_event.target.result, - ''); - } - reader.readAsDataURL(file); - }); - return false; - } + 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; + } + }); }); - }); }); - - instance.web.form.widgets.add('text_ckeditor4', - 'instance.web_ckeditor4.FieldCKEditor4'); - instance.web.form.widgets.add('text_ckeditor4_raw', - 'instance.web_ckeditor4.FieldCKEditor4Raw'); - instance.web.form.widgets.add('text_html', - 'instance.web_ckeditor4.FieldCKEditor4'); - instance.web.form.widgets.add('html', - 'instance.web_ckeditor4.FieldCKEditor4'); - function filter_html(value, ckeditor_filter, ckeditor_writer) { var fragment = CKEDITOR.htmlParser.fragment.fromHtml(value); @@ -105,59 +99,70 @@ openerp.web_ckeditor4 = function(instance) return ckeditor_writer.getHtml(); }; - default_ckeditor_filter = new CKEDITOR.filter( + var 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(); - - instance.web_ckeditor4.FieldCKEditor4 = instance.web.form.FieldText.extend({ - ckeditor_config: { - removePlugins: 'iframe,flash,forms,smiley,pagebreak,stylescombo', - filebrowserImageUploadUrl: 'dummy', - extraPlugins: 'filebrowser', - // this is '#39' per default which screws up single quoted text in ${} - entities_additional: '', + 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, + }); + var default_ckeditor_writer = new CKEDITOR.htmlParser.basicWriter(); + var FieldCKEditor4 = core.form_widget_registry.get('text').extend({ + ckeditor_config: function () { + return { + removePlugins: this._getRemovePlugins(), + removeButtons: this._getRemoveButtons(), + filebrowserImageUploadUrl: 'dummy', + extraPlugins: 'filebrowser', + // this is '#39' per default which screws up single quoted text in ${} + entities_additional: '' + }; }, ckeditor_filter: default_ckeditor_filter, ckeditor_writer: default_ckeditor_writer, + _getRemovePlugins: function () { + return 'iframe,flash,forms,smiley,pagebreak,stylescombo'; + }, + _getRemoveButtons: function () { + return ''; + }, start: function() { this._super.apply(this, arguments); - - CKEDITOR.lang.load(instance.session.user_context.lang.split('_')[0], 'en', function() {}); + CKEDITOR.lang.load(session.user_context.lang.split('_')[0], 'en', function() {}); }, initialize_content: function() { var self = this; this._super.apply(this, arguments); - if(!this.$textarea) + if(!this.$el) { return; - } - this.editor = CKEDITOR.replace(this.$textarea.get(0), - _.extend( - { - language: instance.session.user_context.lang.split('_')[0], - on: + } else if (!this.get('effective_readonly')) { + + this.editor = CKEDITOR.replace(this.$el.get(0), + _.extend( { - 'change': function() + language: session.user_context.lang.split('_')[0], + on: { - self.store_dom_value(); + 'change': function() + { + self.store_dom_value(); + }, }, }, - }, - this.ckeditor_config)); + self.ckeditor_config() + ) + ); + } }, store_dom_value: function() { - this.internal_set_value(this.editor ? this.editor.getData() : instance.web.parse_value(this.get('value'), this)); + this.internal_set_value(this.editor ? this.editor.getData() : formats.parse_value(this.get('value'), this)); }, filter_html: function(value) { @@ -197,28 +202,37 @@ openerp.web_ckeditor4 = function(instance) }, _cleanup_editor: function() { - if(this.editor) + if(this.editor && this.editor.status != 'unloaded') { + var id = this.editor.id this.editor.removeAllListeners(); this.editor.destroy(); this.editor = null; + $('.' + id).remove(); } }, destroy: function() { - this.destroy_content(); - this._super(); + this._cleanup_editor(); + this._super(); }, destroy_content: function() { this._cleanup_editor(); } }); - instance.web_ckeditor4.FieldCKEditor4Raw = instance.web_ckeditor4.FieldCKEditor4.extend({ + var FieldCKEditor4Raw = FieldCKEditor4.extend({ filter_html: function(value) { return value; } }); -} - + core.form_widget_registry.add('text_ckeditor4', FieldCKEditor4); + core.form_widget_registry.add('text_ckeditor4_raw', FieldCKEditor4Raw); + core.form_widget_registry.add('text_html', FieldCKEditor4); + core.form_widget_registry.add('html', FieldCKEditor4); + return { + 'FieldCKEditor4': FieldCKEditor4, + 'FieldCKEditor4Raw': FieldCKEditor4Raw + } +}); diff --git a/web_ckeditor4/static/src/js/web_ckeditor4_formview.js b/web_ckeditor4/static/src/js/web_ckeditor4_formview.js new file mode 100644 index 00000000..b695fd9b --- /dev/null +++ b/web_ckeditor4/static/src/js/web_ckeditor4_formview.js @@ -0,0 +1,25 @@ +odoo.define('web_ckeditor4.FormView', function(require) { + "use strict"; + + var core = require('web.core'); + var FormView = core.view_registry.get('form'); + + FormView.include({ + + can_be_discarded: function(message) { + var self = this; + var res = this._super().done(function() { + // if form can be discarded + // we want to destroy all ck4 editor instances + for(name in CKEDITOR.instances){ + if (self.fields.hasOwnProperty(name)){ + self.fields[name].destroy_content(); + } + } + }); + return res; + } + + }); + +}); diff --git a/web_ckeditor4/views/qweb.xml b/web_ckeditor4/views/qweb.xml index 48097136..3bcffd44 100644 --- a/web_ckeditor4/views/qweb.xml +++ b/web_ckeditor4/views/qweb.xml @@ -10,6 +10,8 @@ src="/web_ckeditor4/static/lib/ckeditor/ckeditor.js"> +